From ea18a88ea8dc63fbe86bca0e2b21c7216305a91a Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 4 Aug 2024 07:16:55 +0000 Subject: [PATCH 01/64] fix: upgrade zone.js from 0.13.3 to 0.14.7 Snyk has created this PR to upgrade zone.js from 0.13.3 to 0.14.7. See this package in npm: zone.js See this project in Snyk: https://app.snyk.io/org/nfgallimore/project/6c78ccee-e00e-45e2-830c-949ac8e8b57f?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 13 ++++++------- package.json | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed1f8d0..fc50d02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "graphql-tag": "^2.12.6", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "^0.14.7" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.14", @@ -4061,6 +4061,7 @@ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -14833,12 +14834,10 @@ } }, "node_modules/zone.js": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", - "dependencies": { - "tslib": "^2.3.0" - } + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 3d5aaf3..e7837a0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "graphql-tag": "^2.12.6", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.7" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.14", From b76ab87843f89595ab67959687bfa2668ded3b9c Mon Sep 17 00:00:00 2001 From: Nicholas Gallimore Date: Thu, 8 Aug 2024 06:12:40 -0400 Subject: [PATCH 02/64] NFG-423 Update testing docs --- README.md | 2 +- docs/BUG_CATEGORIES.md | 91 ++ ...erging-strategy.md => MERGING_STRATEGY.md} | 0 docs/TESTING_SETUP.md | 762 ++++++++++ docs/filetree.txt | 1286 ++++++++--------- 5 files changed, 1494 insertions(+), 647 deletions(-) create mode 100644 docs/BUG_CATEGORIES.md rename docs/{merging-strategy.md => MERGING_STRATEGY.md} (100%) create mode 100644 docs/TESTING_SETUP.md diff --git a/README.md b/README.md index 42181cb..481dfda 100644 --- a/README.md +++ b/README.md @@ -238,4 +238,4 @@ Use tags for marking significant releases or milestones. For example, `v1.0.0`. By maintaining these five environments, Gallimore Software ensures a robust, reliable, and efficient development and deployment process for the Nufacturing app. This approach leads to higher quality software and improved user satisfaction, aligning with our goals of delivering innovative and customer-centric solutions. -[def]: ./docs/workflow.png +[def]: ./docs/WORKFLOW.png diff --git a/docs/BUG_CATEGORIES.md b/docs/BUG_CATEGORIES.md new file mode 100644 index 0000000..c7ff31a --- /dev/null +++ b/docs/BUG_CATEGORIES.md @@ -0,0 +1,91 @@ +Categorizing bugs can help in effectively managing and prioritizing them. Here are some common bug categories that can be useful: + +### Functional Bugs + +1. **UI/UX Bugs**: Issues related to user interface and user experience, such as misalignment, broken buttons, or confusing navigation. +2. **Logic Errors**: Bugs caused by incorrect implementation of business logic or application flow. +3. **Input Validation**: Bugs related to improper validation of user inputs, such as missing required fields or incorrect data types. +4. **Data Processing**: Issues with data calculations, data storage, or data retrieval. +5. **Integration Bugs**: Problems occurring due to incorrect integration between different modules or external systems. + +### Non-Functional Bugs + +1. **Performance Issues**: Problems that affect the speed, responsiveness, or stability of the application. +2. **Security Vulnerabilities**: Bugs that expose the application to security risks, such as SQL injection, cross-site scripting (XSS), or improper authentication. +3. **Compatibility Issues**: Bugs related to incompatibility with different browsers, operating systems, or devices. +4. **Accessibility Bugs**: Issues that affect the accessibility of the application for users with disabilities. + +### Environmental Bugs + +1. **Environment Configuration**: Issues arising from incorrect environment setup, such as missing configurations or incorrect dependencies. +2. **Deployment Bugs**: Problems that occur during or after deployment, such as deployment scripts failing or services not starting correctly. + +### Regression Bugs + +1. **Regression Bugs**: Issues that were previously fixed but have reappeared after new changes or updates. +2. **Broken Fixes**: Bugs introduced by a recent fix or patch, causing new issues in the application. + +### Data-Related Bugs + +1. **Data Corruption**: Issues where data is incorrectly stored, retrieved, or displayed. +2. **Data Integrity**: Bugs affecting the consistency and accuracy of data within the application. + +### Workflow and Process Bugs + +1. **Workflow Interruptions**: Bugs that disrupt the normal workflow or process within the application. +2. **Process Logic**: Issues related to incorrect or incomplete implementation of workflows or processes. + +### Documentation Bugs + +1. **Missing Documentation**: Absence of necessary documentation for features, APIs, or components. +2. **Incorrect Documentation**: Documentation that is outdated, incorrect, or misleading. + +### Edge Case Bugs + +1. **Boundary Conditions**: Issues that occur when inputs or actions are at the extreme ends of expected ranges. +2. **Rare Scenarios**: Bugs that appear only under rare or unusual circumstances. + +### Miscellaneous Bugs + +1. **Third-Party Issues**: Bugs caused by third-party libraries or services. +2. **User Errors**: Issues arising from user mistakes or misunderstandings, often due to unclear instructions or feedback. + +### Example Bug Categories in Jira + +**Category**: Functional Bugs + +- **Subcategories**: UI/UX, Logic Errors, Input Validation, Data Processing, Integration + +**Category**: Non-Functional Bugs + +- **Subcategories**: Performance, Security, Compatibility, Accessibility + +**Category**: Environmental Bugs + +- **Subcategories**: Environment Configuration, Deployment + +**Category**: Regression Bugs + +- **Subcategories**: Regression, Broken Fixes + +**Category**: Data-Related Bugs + +- **Subcategories**: Data Corruption, Data Integrity + +**Category**: Workflow and Process Bugs + +- **Subcategories**: Workflow Interruptions, Process Logic + +**Category**: Documentation Bugs + +- **Subcategories**: Missing Documentation, Incorrect Documentation + +**Category**: Edge Case Bugs + +- **Subcategories**: Boundary Conditions, Rare Scenarios + +**Category**: Miscellaneous Bugs + +- **Subcategories**: Third-Party Issues, User Errors + +By categorizing bugs in this manner, it becomes easier to prioritize, manage, and address them efficiently. diff --git a/docs/merging-strategy.md b/docs/MERGING_STRATEGY.md similarity index 100% rename from docs/merging-strategy.md rename to docs/MERGING_STRATEGY.md diff --git a/docs/TESTING_SETUP.md b/docs/TESTING_SETUP.md new file mode 100644 index 0000000..bf536fc --- /dev/null +++ b/docs/TESTING_SETUP.md @@ -0,0 +1,762 @@ +Here's a consolidated and improved setup for your GitHub workflows, `husky` hooks, and necessary configuration files for both your Node.js API and Angular app, considering the context and tasks you provided. I've refined the structure and provided clear steps for setting up each component. + +### Node.js API + +#### GitHub Workflows + +1. **ci.yml** + +```yaml +name: CI + +on: + push: + branches: + - development + - staging + - production + pull_request: + branches: + - development + - staging + - production + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: "16" + + - name: Install dependencies + run: npm install + + - name: Run tests + run: npm test + + deploy: + runs-on: ubuntu-latest + needs: build + if: github.ref == 'refs/heads/production' + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Deploy to Production + run: | + # Add your deployment script here +``` + +2. **enforce_branch-naming.yml** + +```yaml +name: Enforce Branch Naming + +on: + push: + branches: + - "*" + +jobs: + check-branch-name: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Enforce branch naming convention + run: | + BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) + PATTERN="^(feature|bugfix|hotfix|improvement)/NFG-[0-9]+-.+" + if [[ ! $BRANCH_NAME =~ $PATTERN ]]; then + echo "Error: Branch name '$BRANCH_NAME' does not follow the naming convention." + exit 1 + fi +``` + +3. **node-test-coverage.yml** + +```yaml +name: Node.js CI with Test Coverage + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: "14" + + - name: Install dependencies + run: npm install + + - name: Run tests with coverage + run: npm run coverage + + - name: Upload coverage report + uses: actions/upload-artifact@v2 + with: + name: coverage-report + path: coverage/ +``` + +4. **test.yml** + +```yaml +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14, 16] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm install + + - name: Run unit tests + run: npm test + + - name: Run integration tests + run: npm run integration-test + + - name: Run Cypress tests + run: npm run cypress:run + + - name: Generate coverage report + run: npm run coverage +``` + +#### Husky Hooks + +1. **commit-msg** + +```sh +#!/bin/sh + +# Commit message file passed by Git +commit_msg_file="$1" + +# Read the commit message +commit_msg=$(cat "$commit_msg_file") + +# Define a regex pattern for the issue ID (adjust this pattern to match your issue IDs) +issue_id_pattern="NFG-[0-9]+" + +# Check if the commit message matches the issue ID pattern +if ! echo "$commit_msg" | grep -qE "$issue_id_pattern"; then + echo "Error: Commit message must contain a valid issue ID (e.g., NFG-123)." + exit 1 +fi +``` + +2. **pre-commit** + +```sh +#!/bin/sh +# This hook checks that branches are named according to the convention. + +current_branch=$(git rev-parse --abbrev-ref HEAD) +branch_regex="^(feature|bugfix|hotfix|release)/NFG-[0-9]+-.+$" + +if ! echo "$current_branch" | grep -Eq "$branch_regex"; then + echo "Error: Branch name '$current_branch' does not follow the naming convention." + echo "Please rename your branch to follow the convention: (feature|bugfix|hotfix|release)/NFG-123-description." + exit 1 +fi + +# Lint staged files +prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown +git update-index --again +``` + +3. **pre-push** + +```sh +#!/bin/sh + +# Do not allow push to protected branches +protected_branches='development|testing|staging|production' + +current_branch=$(git rev-parse --abbrev-ref HEAD) + +if echo "$current_branch" | grep -Eq "$protected_branches"; then + echo "Error: Direct push to $current_branch is not allowed." + echo "Please use pull requests for changes to this branch." + exit 1 +fi + +# Do not allow push if missing Jira issue ID in commit message. +while read local_ref local_sha remote_ref remote_sha; do + if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then + # Branch is being deleted, ignore + continue + fi + + COMMITS=$(git rev-list $remote_sha..$local_sha) + for COMMIT in $COMMITS; do + MESSAGE=$(git log --format=%B -n 1 $COMMIT) + if [[ ! $MESSAGE =~ NFG-[0-9]+ ]]; then + echo "Error: Commit message '$MESSAGE' does not contain a Jira issue ID (NFG-)." + exit 1 + fi + done +done +``` + +#### `package.json` Scripts + +```json +{ + "name": "node_nufacturing", + "version": "1.0.0", + "scripts": { + "prepare": "husky install", + "start": "cross-env NODE_ENV=local nodemon index.js", + "start:dev": "cross-env NODE_ENV=development nodemon index.js", + "start:staging": "cross-env NODE_ENV=staging nodemon index.js", + "start:prod": "cross-env NODE_ENV=production node index.js", + "docs": "node swagger.js", + "openapi:generate": "openapi-generator-cli generate", + "openapi:install": "openapi-generator-cli version-manager set 5.3.1", + "test": "jest --config jest.config.js --coverage", + "test:coverage": "nyc npm test", + "cypress:open": "cypress open", + "cypress:run": "cypress run" + }, + "dependencies": { + "bcrypt": "^5.1.1", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "express-async-errors": "^3.1.1", + "helmet": "^7.1.0", + "joi": "^17.13.3", + "jsonwebtoken": "^9.0.2", + "mongodb": "^6.8.0", + "mongoose": "^8.5.1", + "node-cron": "^3.0.3", + "nodemailer": "^6.9.14", + "nodemon": "^3.1.4", + "swagger-autogen": "^2.23.7", + "swagger-ui-express": "^5.0.1", + "winston": "^3.13.1", + "winston-mongodb": "^5.1.1" + }, + "devDependencies": { + "@openapitools/openapi-generator-cli": "^2.13.4", + "@pact-foundation/pact": "^13.1.1", + "@pact-foundation/pact-node": "^10.18.0", + "cross-env": "^7.0.3", + "cypress": "^13.13.2", + "husky": "^9.1.4", + "jest": "^26.6.3", + "nyc": "^15.1.0", + "supertest": "^7.0.0", + "prettier": "^3.3.3" + } +} +``` + +### Angular App + +#### GitHub Workflows + +1. **azure-static-web-apps-deploy.yml** + +```yaml +name: Azure Static Web Apps CI/CD + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') + runs-on: ubuntu-latest + name + +: Build and Deploy Job + steps: + - uses: actions/checkout@v3 + with: + submodules: true + lfs: false + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ORANGE_PLANT_0F4CEF90F }} + repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) + action: "upload" + app_location: "/" # App source code path + api_location: "" # Api source code path - optional + output_location: "dist/nufacturing" # Built app content directory - optional + + close_pull_request_job: + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + name: Close Pull Request Job + steps: + - name: Close Pull Request + id: closepullrequest + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ORANGE_PLANT_0F4CEF90F }} + action: "close" +``` + +2. **angular-test-coverage.yml** + +```yaml +name: Angular CI with Test Coverage + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: "14" + + - name: Install dependencies + run: npm install + + - name: Run tests with coverage + run: npm test + + - name: Upload coverage report + uses: actions/upload-artifact@v2 + with: + name: coverage-report + path: coverage/ +``` + +3. **ci.yml** + +```yaml +name: CI + +on: + push: + branches: + - development + - staging + - production + pull_request: + branches: + - development + - staging + - production + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: "16" + + - name: Install dependencies + run: npm install + + - name: Run tests + run: npm test + + deploy: + runs-on: ubuntu-latest + needs: build + if: github.ref == 'refs/heads/production' + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Deploy to Production + run: | + # Add your deployment script here +``` + +4. **enforce-branch-naming.yml** + +```yaml +name: Enforce Branch Naming + +on: + push: + branches: + - "*" + +jobs: + check-branch-name: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Enforce branch naming convention + run: | + BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) + PATTERN="^(feature|bugfix|hotfix|improvement)/NFG-[0-9]+-.+" + if [[ ! $BRANCH_NAME =~ $PATTERN ]]; then + echo "Error: Branch name '$BRANCH_NAME' does not follow the naming convention." + exit 1 + fi +``` + +5. **test.yml** + +```yaml +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14, 16] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm install + + - name: Run unit tests + run: npm test + + - name: Run integration tests + run: npm run integration-test + + - name: Run Cypress tests + run: npm run cypress:run + + - name: Generate coverage report + run: npm run coverage +``` + +#### Husky Hooks + +1. **commit-msg** + +```sh +#!/bin/sh + +# Commit message file passed by Git +commit_msg_file="$1" + +# Read the commit message +commit_msg=$(cat "$commit_msg_file") + +# Define a regex pattern for the issue ID (adjust this pattern to match your issue IDs) +issue_id_pattern="NFG-[0-9]+" + +# Check if the commit message matches the issue ID pattern +if ! echo "$commit_msg" | grep -qE "$issue_id_pattern"; then + echo "Error: Commit message must contain a valid issue ID (e.g., NFG-123)." + exit 1 +fi +``` + +2. **pre-commit** + +```sh +#!/bin/sh +# This hook checks that branches are named according to the convention. + +current_branch=$(git rev-parse --abbrev-ref HEAD) +branch_regex="^(feature|bugfix|hotfix|release)/NFG-[0-9]+-.+$" + +if ! echo "$current_branch" | grep -Eq "$branch_regex"; then + echo "Error: Branch name '$current_branch' does not follow the naming convention." + echo "Please rename your branch to follow the convention: (feature|bugfix|hotfix|release)/NFG-123-description." + exit 1 +fi +``` + +3. **pre-push** + +```sh +#!/bin/sh + +# Do not allow push to protected branches +protected_branches='development|testing|staging|production' + +current_branch=$(git rev-parse --abbrev-ref HEAD) + +if echo "$current_branch" | grep -Eq "$protected_branches"; then + echo "Error: Direct push to $current_branch is not allowed." + echo "Please use pull requests for changes to this branch." + exit 1 +fi + +# Do not allow push if missing Jira issue ID in commit message. +while read local_ref local_sha remote_ref remote_sha; do + if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then + # Branch is being deleted, ignore + continue + fi + + COMMITS=$(git rev-list $remote_sha..$local_sha) + for COMMIT in $COMMITS; do + MESSAGE=$(git log --format=%B -n 1 $COMMIT) + if [[ ! $MESSAGE =~ NFG-[0-9]+ ]]; then + echo "Error: Commit message '$MESSAGE' does not contain a Jira issue ID (NFG-)." + exit 1 + fi + done +done +``` + +#### `package.json` Scripts + +```json +{ + "name": "nufacturing", + "version": "1.0.0", + "scripts": { + "ng": "ng", + "prepare": "husky install", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "jest --config jest.config.js --coverage", + "test:coverage": "jest --config jest.config.js --coverage", + "cypress:open": "cypress open", + "cypress:run": "cypress run" + }, + "private": true, + "dependencies": { + "@angular/animations": "^16.2.0", + "@angular/cdk": "^16.2.14", + "@angular/common": "^16.2.0", + "@angular/compiler": "^16.2.0", + "@angular/core": "^16.2.0", + "@angular/flex-layout": "^15.0.0-beta.42", + "@angular/forms": "^16.2.0", + "@angular/material": "^16.2.14", + "@angular/platform-browser": "^16.2.0", + "@angular/platform-browser-dynamic": "^16.2.0", + "@angular/router": "^16.2.0", + "@apollo/client": "^3.0.0", + "@testing-library/angular": "^14.5.1", + "apollo-angular": "^5.0.2", + "chart.js": "^4.4.3", + "graphql": "^16.9.0", + "graphql-tag": "^2.12.6", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.13.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.2.14", + "@angular/cli": "^16.2.14", + "@angular/compiler-cli": "^16.2.0", + "@types/jasmine": "~4.3.0", + "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.7", + "cypress": "^13.13.2", + "husky": "^9.1.4", + "jasmine-core": "~4.6.0", + "jasmine-spec-reporter": "^7.0.0", + "jest": "^29.7.0", + "jest-preset-angular": "^14.2.2", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "nyc": "^17.0.0", + "prettier": "^3.3.3", + "protractor": "^7.0.0", + "typescript": "~5.1.3" + }, + "engines": { + "node": "20.x" + } +} +``` + +### Additional Configuration for Testing + +#### `jest.config.js` for Node.js + +```js +module.exports = { + testEnvironment: "node", + collectCoverage: true, + coverageDirectory: "coverage", + testPathIgnorePatterns: ["/node_modules/"], +}; +``` + +#### `jest.config.js` for Angular + +```js +module.exports = { + preset: "jest-preset-angular", + setupFilesAfterEnv: ["/src/setup-jest.ts"], + collectCoverage: true, + coverageDirectory: "coverage", + testPathIgnorePatterns: ["/node_modules/", "/dist/", "/e2e/"], +}; +``` + +#### `karma.conf.js` for Angular + +```js +module.exports = function (config) { + config.set({ + basePath: "", + frameworks: ["jasmine", "@angular-devkit/build-angular"], + plugins: [ + require("karma-jasmine"), + require("karma-chrome-launcher"), + require("karma-jasmine-html-reporter"), + require("karma-coverage"), + require("@angular-devkit/build-angular/plugins/karma"), + ], + client: { + jasmine: {}, + clearContext: false, + }, + jasmineHtmlReporter: { + suppressAll: true, + }, + coverageReporter: { + dir: require("path").join(__dirname, "./coverage/nufacturing"), + subdir: ".", + reporters: [{ type: "html" }, { type: "text-summary" }], + }, + reporters: ["progress", "kjhtml"], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ["Chrome"], + singleRun: false, + restartOnFileChange: true, + }); +}; +``` + +#### Example Tests + +1. **Unit Test (Angular)** + +```ts +import { TestBed } from "@angular/core/testing"; +import { AppComponent } from "./app.component"; + +describe("AppComponent", () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AppComponent], + }).compileComponents(); + }); + + it("should create the app", () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'nufacturing'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual("nufacturing"); + }); + + it("should render title", () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement; + expect(compiled.querySelector(".content span").textContent).toContain( + "nufacturing app is running!", + ); + }); +}); +``` + +2. **Integration Test (Node.js)** + +```js +const request = require("supertest"); +const app = require("../index"); // Your Express app + +describe("GET /api/inventory", () => { + it("should return all inventory items", async () => { + const res = await request(app).get("/api/inventory"); + expect(res.statusCode).toEqual(200); + expect(res.body).toHaveProperty("items"); + }); +}); +``` + +3. **E2E Test (Cypress)** + +```js +describe("Inventory Page", () => { + it("should display inventory items", () => { + cy.visit("/inventory"); + cy.get(".inventory-item").should("have.length.greaterThan", 0); + }); +}); +``` + +This setup ensures comprehensive testing and CI/CD workflows for both your Node.js API and Angular app, enhancing code quality and deployment efficiency. diff --git a/docs/filetree.txt b/docs/filetree.txt index af8891c..c04cb12 100644 --- a/docs/filetree.txt +++ b/docs/filetree.txt @@ -1,653 +1,647 @@ -┣ πŸ“‚.githooks -┃ β”— πŸ“œcommit-msg +┣ πŸ“‚.angular +┃ β”— πŸ“‚cache +┃ β”— πŸ“‚16.2.14 +┃ ┣ πŸ“‚angular-webpack +┃ β”— πŸ“‚babel-webpack ┣ πŸ“‚.github -┃ β”— πŸ“‚workflows -┃ β”— πŸ“œcreate-pr.yml +┃ ┣ πŸ“‚workflows +┃ ┃ ┣ πŸ“œangular-test-coverage.yml +┃ ┃ ┣ πŸ“œazure-static-web-apps-deploy.yml +┃ ┃ ┣ πŸ“œci.yaml +┃ ┃ ┣ πŸ“œenforce-branch-naming.yml +┃ ┃ β”— πŸ“œtest.yml +┃ β”— πŸ“œdependabot.yml +┣ πŸ“‚.husky +┃ ┣ πŸ“‚_ +┃ ┃ ┣ πŸ“œ.gitignore +┃ ┃ ┣ πŸ“œapplypatch-msg +┃ ┃ ┣ πŸ“œcommit-msg +┃ ┃ ┣ πŸ“œh +┃ ┃ ┣ πŸ“œhusky.sh +┃ ┃ ┣ πŸ“œpost-applypatch +┃ ┃ ┣ πŸ“œpost-checkout +┃ ┃ ┣ πŸ“œpost-commit +┃ ┃ ┣ πŸ“œpost-merge +┃ ┃ ┣ πŸ“œpost-rewrite +┃ ┃ ┣ πŸ“œpre-applypatch +┃ ┃ ┣ πŸ“œpre-auto-gc +┃ ┃ ┣ πŸ“œpre-commit +┃ ┃ ┣ πŸ“œpre-push +┃ ┃ ┣ πŸ“œpre-rebase +┃ ┃ β”— πŸ“œprepare-commit-msg +┃ ┣ πŸ“œcommit-msg +┃ ┣ πŸ“œpre-commit +┃ β”— πŸ“œpre-push ┣ πŸ“‚.vscode -┃ β”— πŸ“œsettings.json -┣ πŸ“‚clients -┃ β”— πŸ“‚nufacturing -┃ ┣ πŸ“‚.github -┃ ┃ β”— πŸ“‚workflows -┃ ┃ β”— πŸ“œazure-static-web-apps-orange-plant-0f4cef90f.yml -┃ ┣ πŸ“‚.vscode -┃ ┃ ┣ πŸ“œextensions.json -┃ ┃ ┣ πŸ“œlaunch.json -┃ ┃ β”— πŸ“œtasks.json -┃ ┣ πŸ“‚environment -┃ ┃ ┣ πŸ“œenvironment.prod.ts -┃ ┃ β”— πŸ“œenvironment.ts -┃ ┣ πŸ“‚src -┃ ┃ ┣ πŸ“‚app -┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┣ πŸ“‚auth -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œauth.guard.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œauth.service.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhasura.interceptor.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œrole.guard.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚carousel -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œcarousel.component.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚container -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œcontainer.component.ts -┃ ┃ ┃ ┃ β”— πŸ“‚sidenav -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.html -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.scss -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.spec.ts -┃ ┃ ┃ ┃ β”— πŸ“œsidenav.component.ts -┃ ┃ ┃ ┣ πŸ“‚pages -┃ ┃ ┃ ┃ ┣ πŸ“‚dashboard -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚dashboard-page -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œdashboard-page.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-mock.service.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.module.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œdashboard.service.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚human-resources -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚training -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtraining.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚users -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œusers.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œhuman-resources.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚inventory -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚inventory-item-detail -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-item-detail.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚inventory-items-table -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-items-table.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚logout -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚logout-dialog -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogout-dialog.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogout.component.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚product-development -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚create-formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcreate-formulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-list -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚list-formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlist-formulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œformulas.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-skus -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-skus.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-types -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-types.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚research-and-development -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œresearch-and-development.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-development.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚production -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚assets -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-details -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-details.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-files -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-files.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-training -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-training.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚preventative-maintenance -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpreventative-maintenance.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œassets.routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚batch-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbatch-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚depositor-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œdepositor-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-manufacturing-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manifacturing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-manufacturing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚packaging-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackaging-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚production-planning -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-bottling-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-bottling-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚co-pack-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œco-pack-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚powder-bottling-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpowder-bottling-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚stick-pack-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œstick-pack-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚weighing-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduction-planning.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚reporting -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œreporting.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚shifting-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œshifting-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing-records -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduction.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚quality -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚fda-audits -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œfda-audits.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚quality-audits -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquality-audits.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œquality.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚receiving -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œreceiving.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚sales -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customers -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-form.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚customer-list -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-list.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer.service.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomers.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders-navigation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders-navigation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom-form.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-profit -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-profit.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-quote-pricing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-quote-pricing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-with-moq -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-with-moq.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-without-moq -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-without-moq.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-calculation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-calculation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚package-breakdown -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackage-breakdown.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚sales-analysis -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-analysis.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚account-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œaccount-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottle-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottle-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚closure-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œclosure-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚label-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlabel-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-carton-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-carton-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-costs -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-costs.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚other-components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œother-components.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚testing-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtesting-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinfo.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-details -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-details.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-only -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-only.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes-navigation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes-navigation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚sales-dashboard -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-dashboard.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.module.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales.service.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚users -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚login -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogin.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“‚signup -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œregister.component.ts -┃ ┃ ┃ ┃ β”— πŸ“‚vendors -┃ ┃ ┃ ┃ ┣ πŸ“œvendors-routing.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.html -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.scss -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.spec.ts -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.ts -┃ ┃ ┃ ┃ β”— πŸ“œvendors.module.ts -┃ ┃ ┃ ┣ πŸ“‚services -┃ ┃ ┃ ┃ β”— πŸ“œglobal-service.service.ts -┃ ┃ ┃ ┣ πŸ“œapp-routing.module.ts -┃ ┃ ┃ ┣ πŸ“œapp.component.html -┃ ┃ ┃ ┣ πŸ“œapp.component.scss -┃ ┃ ┃ ┣ πŸ“œapp.component.spec.ts -┃ ┃ ┃ ┣ πŸ“œapp.component.ts -┃ ┃ ┃ ┣ πŸ“œapp.module.ts -┃ ┃ ┃ β”— πŸ“œgraphql.module.ts -┃ ┃ ┣ πŸ“‚assets -┃ ┃ ┃ ┣ πŸ“œ.gitkeep -┃ ┃ ┃ ┣ πŸ“œArtboard 1_0_25x.webp -┃ ┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1) (1).webp -┃ ┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1).webp -┃ ┃ ┃ ┣ πŸ“œdaily-nouri-D37STEwmyqY-unsplash (1).webp -┃ ┃ ┃ ┣ πŸ“œImage by Diana Polekhina.webp -┃ ┃ ┃ ┣ πŸ“œImage by Elsa Olofsson.webp -┃ ┃ ┃ ┣ πŸ“œLiquid Sachet Layout 5.webp -┃ ┃ ┃ ┣ πŸ“œNufacturing - White Logo Stacked.webp -┃ ┃ ┃ β”— πŸ“œStick Pack Layout (vertical).webp -┃ ┃ ┣ πŸ“œ.npmrc -┃ ┃ ┣ πŸ“œfavicon.ico -┃ ┃ ┣ πŸ“œindex.html -┃ ┃ ┣ πŸ“œmain.ts -┃ ┃ β”— πŸ“œstyles.scss -┃ ┣ πŸ“œ.editorconfig -┃ ┣ πŸ“œ.gitignore -┃ ┣ πŸ“œangular.json -┃ ┣ πŸ“œpackage.json -┃ ┣ πŸ“œREADME.md -┃ ┣ πŸ“œstaticwebapp.config -┃ ┣ πŸ“œtsconfig.app.json -┃ ┣ πŸ“œtsconfig.json -┃ β”— πŸ“œtsconfig.spec.json +┃ ┣ πŸ“œextensions.json +┃ ┣ πŸ“œlaunch.json +┃ β”— πŸ“œtasks.json +┣ πŸ“‚coverage +┃ ┣ πŸ“‚lcov-report +┃ ┃ ┣ πŸ“œbase.css +┃ ┃ ┣ πŸ“œblock-navigation.js +┃ ┃ ┣ πŸ“œfavicon.png +┃ ┃ ┣ πŸ“œindex.html +┃ ┃ ┣ πŸ“œprettify.css +┃ ┃ ┣ πŸ“œprettify.js +┃ ┃ ┣ πŸ“œsort-arrow-sprite.png +┃ ┃ β”— πŸ“œsorter.js +┃ ┣ πŸ“œclover.xml +┃ ┣ πŸ“œcoverage-final.json +┃ β”— πŸ“œlcov.info ┣ πŸ“‚docs -┣ πŸ“‚logs -┃ β”— πŸ“œapp.log +┃ ┣ πŸ“œfiletree.txt +┃ ┣ πŸ“œmerging-strategy.md +┃ ┣ πŸ“œschema.md +┃ ┣ πŸ“œtesting.md +┃ β”— WORKFLOW.png +┣ πŸ“‚environment +┃ ┣ πŸ“œenvironment.prod.ts +┃ β”— πŸ“œenvironment.ts ┣ πŸ“‚src -┃ ┣ πŸ“‚config -┃ ┃ ┣ πŸ“œdb.js -┃ ┃ β”— πŸ“œlogger.js -┃ ┣ πŸ“‚controllers -┃ ┃ ┣ πŸ“‚product-development-controller -┃ ┃ ┃ ┣ πŸ“œformulaController.js -┃ ┃ ┃ ┣ πŸ“œproductSkuController.js -┃ ┃ ┃ β”— πŸ“œproductTypeController.js -┃ ┃ ┣ πŸ“‚sales-controller -┃ ┃ ┃ ┣ πŸ“œcustomerController.js -┃ ┃ ┃ ┣ πŸ“œorderController.js -┃ ┃ ┃ β”— πŸ“œquoteController.js -┃ ┃ ┣ πŸ“œauthController.js -┃ ┃ ┣ πŸ“œinventoryController.js -┃ ┃ β”— πŸ“œuserController.js -┃ ┣ πŸ“‚middleware -┃ ┃ ┣ πŸ“œauthMiddleware.js -┃ ┃ β”— πŸ“œroleMiddlewaree.js -┃ ┣ πŸ“‚models -┃ ┃ ┣ πŸ“‚product-development-model -┃ ┃ ┃ ┣ πŸ“œformulasModel.js -┃ ┃ ┃ ┣ πŸ“œproductSkuModel.js -┃ ┃ ┃ β”— πŸ“œproductTypeModel.js -┃ ┃ ┣ πŸ“‚sales-model -┃ ┃ ┃ ┣ πŸ“œcustomerModel.js -┃ ┃ ┃ ┣ πŸ“œorderModel.js -┃ ┃ ┃ β”— πŸ“œquoteModel.js -┃ ┃ ┣ πŸ“œinventoryModel.js -┃ ┃ β”— πŸ“œuserModel.js -┃ ┣ πŸ“‚routes -┃ ┃ ┣ πŸ“‚product-development-routes -┃ ┃ ┃ ┣ πŸ“œformulaRoutes.js -┃ ┃ ┃ ┣ πŸ“œproductSkusRoutes.js -┃ ┃ ┃ β”— πŸ“œproductTypeRoutes.js -┃ ┃ ┣ πŸ“‚sales-routes -┃ ┃ ┃ ┣ πŸ“œcustomerRoutes.js -┃ ┃ ┃ ┣ πŸ“œorderRoutes.js -┃ ┃ ┃ β”— πŸ“œquoteRoutes.js -┃ ┃ ┣ πŸ“œinventoryRoutes.js -┃ ┃ β”— πŸ“œuserRoutes.js -┃ β”— πŸ“‚utils -┃ ┣ πŸ“œscheduledTasks.js -┃ β”— πŸ“œsendEmail.js -┣ πŸ“œ.env.development -┣ πŸ“œ.env.local -┣ πŸ“œ.env.production -┣ πŸ“œ.env.staging +┃ ┣ πŸ“‚app +┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┣ πŸ“‚auth +┃ ┃ ┃ ┃ ┣ πŸ“œauth.guard.ts +┃ ┃ ┃ ┃ ┣ πŸ“œauth.service.ts +┃ ┃ ┃ ┃ ┣ πŸ“œhasura.interceptor.ts +┃ ┃ ┃ ┃ β”— πŸ“œrole.guard.ts +┃ ┃ ┃ ┣ πŸ“‚carousel +┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.spec.ts +┃ ┃ ┃ ┃ β”— πŸ“œcarousel.component.ts +┃ ┃ ┃ ┣ πŸ“‚container +┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.spec.ts +┃ ┃ ┃ ┃ β”— πŸ“œcontainer.component.ts +┃ ┃ ┃ β”— πŸ“‚sidenav +┃ ┃ ┃ ┣ πŸ“œsidenav.component.html +┃ ┃ ┃ ┣ πŸ“œsidenav.component.scss +┃ ┃ ┃ ┣ πŸ“œsidenav.component.spec.ts +┃ ┃ ┃ β”— πŸ“œsidenav.component.ts +┃ ┃ ┣ πŸ“‚pages +┃ ┃ ┃ ┣ πŸ“‚dashboard +┃ ┃ ┃ ┃ ┣ πŸ“‚dashboard-page +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œdashboard-page.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-mock.service.ts +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.module.ts +┃ ┃ ┃ ┃ β”— πŸ“œdashboard.service.ts +┃ ┃ ┃ ┣ πŸ“‚human-resources +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚training +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtraining.module.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚users +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œusers.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œhuman-resources.module.ts +┃ ┃ ┃ ┣ πŸ“‚inventory +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚inventory-item-detail +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-item-detail.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚inventory-items-table +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-items-table.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“‚view-inventory +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œview-inventory.component.contract.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œview-inventory.component.integration.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œview-inventory.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œview-inventory.e2e-spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œinventory-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œinventory.module.ts +┃ ┃ ┃ ┣ πŸ“‚logout +┃ ┃ ┃ ┃ ┣ πŸ“‚logout-dialog +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogout-dialog.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.spec.ts +┃ ┃ ┃ ┃ β”— πŸ“œlogout.component.ts +┃ ┃ ┃ ┣ πŸ“‚product-development +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formulas +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚create-formulas +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcreate-formulas.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-form +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-list +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚list-formulas +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlist-formulas.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œformulas.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-skus +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-skus.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-types +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-types.module.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚research-and-development +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œresearch-and-development.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œproduct-development.module.ts +┃ ┃ ┃ ┣ πŸ“‚production +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚assets +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-details +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-details.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-files +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-files.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-training +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-training.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚preventative-maintenance +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpreventative-maintenance.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.module.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œassets.routing.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚batch-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbatch-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚depositor-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œdepositor-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-manufacturing-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manifacturing-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-manufacturing-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚packaging-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackaging-records.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚production-planning +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-bottling-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-bottling-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚co-pack-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œco-pack-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚powder-bottling-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpowder-bottling-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚stick-pack-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œstick-pack-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚weighing-calendar +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-calendar.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduction-planning.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚reporting +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œreporting.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚shifting-records +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œshifting-records.module.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing-records +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-records.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduction-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œproduction.module.ts +┃ ┃ ┃ ┣ πŸ“‚quality +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚fda-audits +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œfda-audits.module.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚quality-audits +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œquality-audits.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œquality-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œquality.module.ts +┃ ┃ ┃ ┣ πŸ“‚receiving +┃ ┃ ┃ ┃ ┣ πŸ“œreceiving-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.ts +┃ ┃ ┃ ┃ β”— πŸ“œreceiving.module.ts +┃ ┃ ┃ ┣ πŸ“‚sales +┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customers +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-form +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-form.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚customer-list +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-list.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer.service.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomers.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders-navigation +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders-navigation.component.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom-form +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom-form.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-profit +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-profit.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-quote-pricing +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-quote-pricing.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-with-moq +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-with-moq.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-without-moq +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-without-moq.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-calculation +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-calculation.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚package-breakdown +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackage-breakdown.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚sales-analysis +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-analysis.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚account-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œaccount-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottle-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottle-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚closure-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œclosure-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚label-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlabel-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-carton-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-carton-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-costs +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-costs.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚other-components +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œother-components.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚testing-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtesting-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinfo.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients-info +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients-info.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-details +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-details.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-only +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-only.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.ts +┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-routing.module.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes.module.ts +┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes-navigation +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.html +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.scss +┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.spec.ts +┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes-navigation.component.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“‚sales-dashboard +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-dashboard.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“œsales-routing.module.ts +┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.spec.ts +┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.ts +┃ ┃ ┃ ┃ ┣ πŸ“œsales.module.ts +┃ ┃ ┃ ┃ β”— πŸ“œsales.service.ts +┃ ┃ ┃ ┣ πŸ“‚users +┃ ┃ ┃ ┃ ┣ πŸ“‚login +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.html +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.scss +┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.spec.ts +┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogin.component.ts +┃ ┃ ┃ ┃ β”— πŸ“‚signup +┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.html +┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.scss +┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.spec.ts +┃ ┃ ┃ ┃ β”— πŸ“œregister.component.ts +┃ ┃ ┃ β”— πŸ“‚vendors +┃ ┃ ┃ ┣ πŸ“œvendors-routing.module.ts +┃ ┃ ┃ ┣ πŸ“œvendors.component.html +┃ ┃ ┃ ┣ πŸ“œvendors.component.scss +┃ ┃ ┃ ┣ πŸ“œvendors.component.spec.ts +┃ ┃ ┃ ┣ πŸ“œvendors.component.ts +┃ ┃ ┃ β”— πŸ“œvendors.module.ts +┃ ┃ ┣ πŸ“‚services +┃ ┃ ┃ β”— πŸ“œglobal-service.service.ts +┃ ┃ ┣ πŸ“œapp-routing.module.ts +┃ ┃ ┣ πŸ“œapp.component.html +┃ ┃ ┣ πŸ“œapp.component.scss +┃ ┃ ┣ πŸ“œapp.component.spec.ts +┃ ┃ ┣ πŸ“œapp.component.ts +┃ ┃ ┣ πŸ“œapp.module.ts +┃ ┃ β”— πŸ“œgraphql.module.ts +┃ ┣ πŸ“‚assets +┃ ┃ ┣ πŸ“œ.gitkeep +┃ ┃ ┣ πŸ“œArtboard 1_0_25x.webp +┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1) (1).webp +┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1).webp +┃ ┃ ┣ πŸ“œdaily-nouri-D37STEwmyqY-unsplash (1).webp +┃ ┃ ┣ πŸ“œImage by Diana Polekhina.webp +┃ ┃ ┣ πŸ“œImage by Elsa Olofsson.webp +┃ ┃ ┣ πŸ“œLiquid Sachet Layout 5.webp +┃ ┃ ┣ πŸ“œNufacturing - White Logo Stacked.webp +┃ ┃ β”— πŸ“œStick Pack Layout (vertical).webp +┃ ┣ πŸ“‚e2e +┃ ┃ β”— πŸ“œinventory.cypress.ts +┃ ┣ πŸ“‚integration-tests +┃ ┣ πŸ“œ.npmrc +┃ ┣ πŸ“œfavicon.ico +┃ ┣ πŸ“œindex.html +┃ ┣ πŸ“œmain.ts +┃ ┣ πŸ“œsetup-jest.ts +┃ β”— πŸ“œstyles.scss +┣ πŸ“œ.editorconfig ┣ πŸ“œ.gitignore -┣ πŸ“œ.gitmodules -┣ πŸ“œapp.js -┣ πŸ“œindex.js +┣ πŸ“œangular.json +┣ πŸ“œjest.config.js +┣ πŸ“œkarma.conf.js ┣ πŸ“œpackage.json ┣ πŸ“œREADME.md -┣ πŸ“œswagger_output.json -β”— πŸ“œswagger.js +┣ πŸ“œSECURITY.md +┣ πŸ“œstaticwebapp.config +┣ πŸ“œtsconfig.app.json +┣ πŸ“œtsconfig.json +β”— πŸ“œtsconfig.spec.json From ff8820b0ab2c7beb3381279a493fbaa8382a8880 Mon Sep 17 00:00:00 2001 From: Nicholas Gallimore Date: Thu, 8 Aug 2024 08:06:31 -0400 Subject: [PATCH 03/64] NFG-423 Add jest-dom, jest-fetch-mock for unit test mocking --- package-lock.json | 654 +++++++++++----------------------------------- package.json | 3 + 2 files changed, 154 insertions(+), 503 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2af9388..da9a955 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,10 @@ "chart.js": "^4.4.3", "graphql": "^16.9.0", "graphql-tag": "^2.12.6", + "jest-extended": "^4.0.2", + "jest-fetch-mock": "^3.0.3", "rxjs": "~7.8.0", + "ts-jest": "^29.2.4", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, @@ -60,7 +63,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -707,7 +709,6 @@ "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -716,7 +717,6 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -746,7 +746,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -755,7 +754,6 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -795,7 +793,6 @@ "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", @@ -811,7 +808,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -994,7 +990,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -1007,7 +1002,6 @@ "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", @@ -1037,7 +1031,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1092,7 +1085,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -1130,7 +1122,6 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1147,7 +1138,6 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1185,7 +1175,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dev": true, "dependencies": { "@babel/template": "^7.25.0", "@babel/types": "^7.25.0" @@ -1198,7 +1187,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.25.0", @@ -1226,7 +1214,6 @@ "version": "7.25.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dev": true, "dependencies": { "@babel/types": "^7.25.2" }, @@ -1321,7 +1308,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1333,7 +1319,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1345,7 +1330,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1426,7 +1410,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1438,7 +1421,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1450,7 +1432,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1465,7 +1446,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1477,7 +1457,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1489,7 +1468,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1501,7 +1479,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1513,7 +1490,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1525,7 +1501,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1552,7 +1527,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1567,7 +1541,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -2584,7 +2557,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", @@ -2598,7 +2570,6 @@ "version": "7.25.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", @@ -2616,7 +2587,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, "dependencies": { "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -2631,7 +2601,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.25.0", @@ -2645,7 +2614,6 @@ "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -2658,8 +2626,7 @@ "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@colors/colors": { "version": "1.5.0", @@ -3222,7 +3189,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3238,7 +3204,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, "engines": { "node": ">=8" } @@ -3247,7 +3212,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3264,7 +3228,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3279,7 +3242,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3295,7 +3257,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3306,14 +3267,12 @@ "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3322,7 +3281,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -3331,7 +3289,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3343,7 +3300,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -3390,7 +3346,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3405,7 +3360,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3421,7 +3375,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3432,14 +3385,12 @@ "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3448,7 +3399,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -3457,7 +3407,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3469,7 +3418,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -3484,7 +3432,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -3497,7 +3444,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -3509,7 +3455,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -3526,7 +3471,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -3541,7 +3485,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -3584,7 +3527,6 @@ "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -3614,7 +3556,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -3623,7 +3564,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, "dependencies": { "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -3638,7 +3578,6 @@ "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.25.0", @@ -3652,7 +3591,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3667,7 +3605,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3683,7 +3620,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3694,20 +3630,17 @@ "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/@jest/reporters/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3716,7 +3649,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -3732,7 +3664,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -3747,7 +3678,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3762,7 +3692,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -3771,7 +3700,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3783,7 +3711,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -3795,7 +3722,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -3809,7 +3735,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -3824,7 +3749,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -3839,7 +3763,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -3848,7 +3771,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -3874,7 +3796,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3889,7 +3810,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3905,7 +3825,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3916,20 +3835,17 @@ "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3938,7 +3854,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -3947,7 +3862,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3959,7 +3873,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -3976,7 +3889,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3991,7 +3903,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4007,7 +3918,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4018,14 +3928,12 @@ "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -4034,7 +3942,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4046,7 +3953,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -4060,7 +3966,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -4069,7 +3974,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -4087,14 +3991,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5239,14 +5141,12 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, "dependencies": { "type-detect": "4.0.8" } @@ -5255,7 +5155,6 @@ "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -5456,7 +5355,6 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -5469,7 +5367,6 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -5478,7 +5375,6 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -5488,7 +5384,6 @@ "version": "7.20.6", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -5600,7 +5495,6 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -5623,14 +5517,12 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -5639,7 +5531,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -5693,7 +5584,6 @@ "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -5791,8 +5681,7 @@ "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", @@ -5813,7 +5702,6 @@ "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -5821,8 +5709,7 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@types/yauzl": { "version": "2.10.3", @@ -6356,7 +6243,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -6402,7 +6288,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6490,7 +6375,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -6584,8 +6468,7 @@ "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -6668,7 +6551,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -6689,7 +6571,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6704,7 +6585,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6720,7 +6600,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -6731,14 +6610,12 @@ "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6747,7 +6624,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6756,7 +6632,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6785,7 +6660,6 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -6801,7 +6675,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -6896,7 +6769,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -6919,7 +6791,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -6934,8 +6805,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -7099,7 +6969,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7109,7 +6978,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -7127,7 +6995,6 @@ "version": "4.23.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -7202,7 +7069,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -7214,7 +7080,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -7255,8 +7120,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.1.2", @@ -7437,7 +7301,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -7446,7 +7309,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -7455,7 +7317,6 @@ "version": "1.0.30001638", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -7494,7 +7355,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, "engines": { "node": ">=10" } @@ -7574,7 +7434,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, "funding": [ { "type": "github", @@ -7588,8 +7447,7 @@ "node_modules/cjs-module-lexer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/clean-stack": { "version": "2.2.0", @@ -7668,7 +7526,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -7705,7 +7562,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -7714,8 +7570,7 @@ "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "node_modules/color-convert": { "version": "1.9.3", @@ -7856,8 +7711,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect": { "version": "3.7.0", @@ -7928,8 +7782,7 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.4.2", @@ -8074,7 +7927,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -8095,7 +7947,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8110,7 +7961,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8126,7 +7976,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8137,14 +7986,12 @@ "node_modules/create-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -8153,7 +8000,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8246,11 +8092,18 @@ "node": ">=8" } }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8264,7 +8117,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8659,7 +8511,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -8691,7 +8542,6 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -8741,7 +8591,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8921,7 +8770,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, "engines": { "node": ">=8" } @@ -8942,7 +8790,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9097,7 +8944,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, "dependencies": { "jake": "^10.8.5" }, @@ -9111,14 +8957,12 @@ "node_modules/electron-to-chromium": { "version": "1.4.812", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", - "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==", - "dev": true + "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -9129,8 +8973,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -9154,7 +8997,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -9164,7 +9006,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -9315,7 +9156,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -9443,7 +9283,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, "engines": { "node": ">=6" } @@ -9519,7 +9358,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -9598,7 +9436,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -9642,7 +9479,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -9651,7 +9487,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -9851,8 +9686,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fastq": { "version": "1.17.1", @@ -9879,7 +9713,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, "dependencies": { "bser": "2.1.1" } @@ -9912,7 +9745,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, "dependencies": { "minimatch": "^5.0.1" } @@ -9921,7 +9753,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -9930,7 +9761,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9942,7 +9772,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -10015,7 +9844,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -10204,14 +10032,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -10261,7 +10087,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -10270,7 +10095,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -10297,7 +10121,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, "engines": { "node": ">=8.0.0" } @@ -10306,7 +10129,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -10337,7 +10159,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10399,7 +10220,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -10437,8 +10257,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphql": { "version": "16.9.0", @@ -10775,8 +10594,7 @@ "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -10923,7 +10741,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -11095,7 +10912,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -11114,7 +10930,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -11126,7 +10941,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -11151,7 +10965,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11160,8 +10973,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "4.1.1", @@ -11342,8 +11154,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -11410,7 +11221,6 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -11463,7 +11273,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -11472,7 +11281,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, "engines": { "node": ">=6" } @@ -11535,7 +11343,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -11670,7 +11477,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -11798,8 +11604,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -11820,7 +11625,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, "engines": { "node": ">=8" } @@ -11841,7 +11645,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11857,7 +11660,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -11895,7 +11697,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -11909,7 +11710,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -11918,7 +11718,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11930,7 +11729,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -11944,7 +11742,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11953,7 +11750,6 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -11984,7 +11780,6 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -12002,7 +11797,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12017,7 +11811,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12033,7 +11826,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12044,14 +11836,12 @@ "node_modules/jake/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12060,7 +11850,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12116,7 +11905,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -12142,7 +11930,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -12156,7 +11943,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -12171,7 +11957,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -12183,7 +11968,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -12214,7 +11998,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12229,7 +12012,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12245,7 +12027,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12256,14 +12037,12 @@ "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12272,7 +12051,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -12287,7 +12065,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -12296,7 +12073,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12308,7 +12084,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -12320,7 +12095,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -12353,7 +12127,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12368,7 +12141,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12384,7 +12156,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12395,14 +12166,12 @@ "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12411,7 +12180,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12423,7 +12191,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -12468,7 +12235,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12483,7 +12249,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12499,7 +12264,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12510,14 +12274,12 @@ "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12526,7 +12288,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -12535,7 +12296,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12547,7 +12307,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -12562,7 +12321,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12577,7 +12335,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12593,7 +12350,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12604,14 +12360,12 @@ "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12620,7 +12374,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12632,7 +12385,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -12644,7 +12396,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -12660,7 +12411,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12675,7 +12425,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12691,7 +12440,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12702,14 +12450,12 @@ "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -12718,7 +12464,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13036,7 +12781,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -13049,11 +12793,39 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-extended": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jest-extended/-/jest-extended-4.0.2.tgz", + "integrity": "sha512-FH7aaPgtGYHc9mRjriS0ZEHYM5/W69tLrFTIdzm+yJgeoCmmrSB/luSfMSqWP9O29QWHPEmJ4qmU6EwsZideog==", + "dependencies": { + "jest-diff": "^29.0.0", + "jest-get-type": "^29.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": ">=27.2.5" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + } + } + }, + "node_modules/jest-fetch-mock": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", + "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", + "dependencies": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -13062,7 +12834,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -13087,7 +12858,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13096,7 +12866,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -13111,7 +12880,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13126,7 +12894,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -13139,7 +12906,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -13154,7 +12920,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13169,7 +12934,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13185,7 +12949,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13196,14 +12959,12 @@ "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13212,7 +12973,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13224,7 +12984,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -13244,7 +13003,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13259,7 +13017,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13275,7 +13032,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13286,14 +13042,12 @@ "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13302,7 +13056,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -13311,7 +13064,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13323,7 +13075,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -13337,7 +13088,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, "engines": { "node": ">=6" }, @@ -13382,7 +13132,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -13391,7 +13140,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -13411,7 +13159,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -13424,7 +13171,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13439,7 +13185,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13455,7 +13200,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13466,14 +13210,12 @@ "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13482,7 +13224,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -13491,7 +13232,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13503,7 +13243,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -13535,7 +13274,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13550,7 +13288,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13566,7 +13303,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13577,14 +13313,12 @@ "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13593,7 +13327,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -13608,7 +13341,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13623,7 +13355,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -13638,7 +13369,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13647,7 +13377,6 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13657,7 +13386,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13669,7 +13397,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -13681,7 +13408,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -13714,7 +13440,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13729,7 +13454,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13745,7 +13469,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13756,14 +13479,12 @@ "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13772,7 +13493,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -13781,7 +13501,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13793,7 +13512,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -13824,7 +13542,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13839,7 +13556,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13855,7 +13571,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13866,14 +13581,12 @@ "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13882,7 +13595,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13894,7 +13606,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -13911,7 +13622,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13926,7 +13636,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13942,7 +13651,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13953,14 +13661,12 @@ "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -13969,7 +13675,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13981,7 +13686,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -13998,7 +13702,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14013,7 +13716,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -14025,7 +13727,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14041,7 +13742,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14052,14 +13752,12 @@ "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -14068,7 +13766,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14080,7 +13777,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -14099,7 +13795,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14114,7 +13809,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14130,7 +13824,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14141,14 +13834,12 @@ "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -14157,7 +13848,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14221,7 +13911,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -14292,7 +13981,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -14303,8 +13991,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -14328,7 +14015,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -14585,7 +14271,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, "engines": { "node": ">=6" } @@ -14715,7 +14400,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, "engines": { "node": ">=6" } @@ -14749,8 +14433,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { "version": "3.14.0", @@ -14801,7 +14484,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -14830,8 +14512,7 @@ "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -15038,7 +14719,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -15067,7 +14747,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -15081,8 +14760,7 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/make-fetch-happen": { "version": "10.2.1", @@ -15308,7 +14986,6 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, "dependencies": { "tmpl": "1.0.5" } @@ -15343,8 +15020,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -15368,7 +15044,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -15414,7 +15089,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -15448,7 +15122,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15712,8 +15385,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -15755,8 +15427,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/needle": { "version": "3.3.1", @@ -15825,6 +15496,44 @@ "dev": true, "optional": true }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -15889,8 +15598,7 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-preload": { "version": "0.2.1", @@ -15907,8 +15615,7 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nopt": { "version": "6.0.0", @@ -15944,7 +15651,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16139,7 +15845,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -16597,7 +16302,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -16606,7 +16310,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -16768,7 +16471,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -16783,7 +16485,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -16832,7 +16533,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -16912,7 +16612,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -16986,7 +16685,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -16995,7 +16693,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17010,7 +16707,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -17018,8 +16714,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -17082,7 +16777,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -17125,7 +16819,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -17396,7 +17089,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -17410,7 +17102,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -17460,6 +17151,11 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "node_modules/promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==" + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -17477,7 +17173,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -17807,7 +17502,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, "funding": [ { "type": "individual", @@ -17916,8 +17610,7 @@ "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/read-package-json": { "version": "6.0.4", @@ -18306,7 +17999,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18336,7 +18028,6 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -18353,7 +18044,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -18365,7 +18055,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, "engines": { "node": ">=8" } @@ -18413,7 +18102,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, "engines": { "node": ">=10" } @@ -18560,7 +18248,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/safevalues": { "version": "0.3.4", @@ -18767,7 +18455,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -18782,7 +18469,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -18793,8 +18479,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { "version": "0.18.0", @@ -19019,7 +18704,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -19031,7 +18715,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -19065,8 +18748,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { "version": "1.9.0", @@ -19174,8 +18856,7 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "4.0.0", @@ -19551,8 +19232,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/sshpk": { "version": "1.18.0", @@ -19610,7 +19290,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -19622,7 +19301,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, "engines": { "node": ">=8" } @@ -19674,7 +19352,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -19687,7 +19364,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -19716,7 +19392,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -19741,7 +19416,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, "engines": { "node": ">=8" } @@ -19750,7 +19424,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -19759,7 +19432,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -19782,7 +19454,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -19995,7 +19666,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -20047,14 +19717,12 @@ "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -20063,7 +19731,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -20158,7 +19825,6 @@ "version": "29.2.4", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", - "dev": true, "dependencies": { "bs-logger": "0.x", "ejs": "^3.1.10", @@ -20327,7 +19993,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, "engines": { "node": ">=4" } @@ -20336,7 +20001,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -20376,7 +20040,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -20411,8 +20074,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -20509,7 +20171,6 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -20591,7 +20252,6 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -20604,8 +20264,7 @@ "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -20745,7 +20404,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, "dependencies": { "makeerror": "1.0.12" } @@ -21320,7 +20978,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21388,7 +21045,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -21403,7 +21059,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -21414,20 +21069,17 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -21495,7 +21147,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -21503,14 +21154,12 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -21528,7 +21177,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } diff --git a/package.json b/package.json index 7e68d21..c04c7bd 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,10 @@ "chart.js": "^4.4.3", "graphql": "^16.9.0", "graphql-tag": "^2.12.6", + "jest-extended": "^4.0.2", + "jest-fetch-mock": "^3.0.3", "rxjs": "~7.8.0", + "ts-jest": "^29.2.4", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, From 2fb2697df4ecbfe1810f2e7f1c1210bbae183815 Mon Sep 17 00:00:00 2001 From: Nicholas Gallimore Date: Fri, 9 Aug 2024 03:03:09 -0400 Subject: [PATCH 04/64] NFG-83 Setup jest config --- cypress.json | 0 docs/TESTING_SETUP.md | 12 ++----- jest.config.js | 24 ++++++++++++- prettier.json | 7 ++++ .../carousel/carousel.component.spec.ts | 36 ++++++++++++++++--- tsconfig.spec.json | 4 +-- 6 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 cypress.json create mode 100644 prettier.json diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..e69de29 diff --git a/docs/TESTING_SETUP.md b/docs/TESTING_SETUP.md index bf536fc..a4110d8 100644 --- a/docs/TESTING_SETUP.md +++ b/docs/TESTING_SETUP.md @@ -664,13 +664,7 @@ module.exports = function (config) { config.set({ basePath: "", frameworks: ["jasmine", "@angular-devkit/build-angular"], - plugins: [ - require("karma-jasmine"), - require("karma-chrome-launcher"), - require("karma-jasmine-html-reporter"), - require("karma-coverage"), - require("@angular-devkit/build-angular/plugins/karma"), - ], + plugins: [require("karma-jasmine"), require("karma-chrome-launcher"), require("karma-jasmine-html-reporter"), require("karma-coverage"), require("@angular-devkit/build-angular/plugins/karma")], client: { jasmine: {}, clearContext: false, @@ -726,9 +720,7 @@ describe("AppComponent", () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement; - expect(compiled.querySelector(".content span").textContent).toContain( - "nufacturing app is running!", - ); + expect(compiled.querySelector(".content span").textContent).toContain("nufacturing app is running!"); }); }); ``` diff --git a/jest.config.js b/jest.config.js index 2dfd657..107b977 100644 --- a/jest.config.js +++ b/jest.config.js @@ -8,8 +8,30 @@ module.exports = { }, }, preset: "jest-preset-angular", - setupFilesAfterEnv: ["/src/setup-jest.ts"], collectCoverage: true, coverageDirectory: "coverage", testPathIgnorePatterns: ["/node_modules/", "/dist/", "/e2e/"], + setupFilesAfterEnv: ['/setup-jest.ts'], + testEnvironment: 'jsdom', + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.spec.json', + stringifyContentPathRegex: '\\.html$', + astTransformers: { + before: [ + 'jest-preset-angular/build/InlineFilesTransformer', + 'jest-preset-angular/build/StripStylesTransformer', + ], + }, + }, + }, + moduleFileExtensions: ['ts', 'html', 'js', 'json'], + transform: { + '^.+\\.(ts|html)$': 'ts-jest', + }, + transformIgnorePatterns: ['node_modules/(?!@ngrx)'], + moduleNameMapper: { + '^src/(.*)$': '/src/$1', + }, + }; diff --git a/prettier.json b/prettier.json new file mode 100644 index 0000000..b504597 --- /dev/null +++ b/prettier.json @@ -0,0 +1,7 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "printWidth": 80, + "tabWidth": 2, + "semi": true +} diff --git a/src/app/components/carousel/carousel.component.spec.ts b/src/app/components/carousel/carousel.component.spec.ts index baec97b..2e044e0 100644 --- a/src/app/components/carousel/carousel.component.spec.ts +++ b/src/app/components/carousel/carousel.component.spec.ts @@ -1,15 +1,17 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { TestBed, ComponentFixture } from '@angular/core/testing'; import { CarouselComponent } from './carousel.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; describe('CarouselComponent', () => { let component: CarouselComponent; let fixture: ComponentFixture; - beforeEach(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ declarations: [CarouselComponent], - }); + imports: [BrowserAnimationsModule], + }).compileComponents(); + fixture = TestBed.createComponent(CarouselComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -18,4 +20,28 @@ describe('CarouselComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should start autoplay on init', () => { + jest.spyOn(component, 'startAutoplay'); + component.ngOnInit(); + expect(component.startAutoplay).toHaveBeenCalled(); + }); + + it('should stop autoplay on destroy', () => { + jest.spyOn(component, 'stopAutoplay'); + component.ngOnDestroy(); + expect(component.stopAutoplay).toHaveBeenCalled(); + }); + + it('should move to the next slide', () => { + component.currentSlide = 0; + component.nextSlide(); + expect(component.currentSlide).toBe(1); + }); + + it('should move to the previous slide', () => { + component.currentSlide = 1; + component.previousSlide(); + expect(component.currentSlide).toBe(0); + }); }); diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 47e3dd7..65951fc 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -1,9 +1,9 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", - "types": ["jasmine"] + "types": ["jest", "node"] }, + "files": ["src/test.ts"], "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] } From 535704a7e6f58ed0fceddda2c2b52c3a8755214a Mon Sep 17 00:00:00 2001 From: Nicholas Gallimore Date: Fri, 30 Aug 2024 20:03:27 -0400 Subject: [PATCH 05/64] NFG-83 Remove unused doc folder. Documents live now in Teams. There is test driven development process, and other work flow processes in Microsoft Dev Team folders. --- docs/filetree.txt | 653 --------------------------------------- docs/merging-strategy.md | 85 ----- docs/schema.md | 89 ------ docs/testing.md | 208 ------------- docs/workflow.png | Bin 236271 -> 0 bytes test.md | 279 ----------------- 6 files changed, 1314 deletions(-) delete mode 100644 docs/filetree.txt delete mode 100644 docs/merging-strategy.md delete mode 100644 docs/schema.md delete mode 100644 docs/testing.md delete mode 100644 docs/workflow.png delete mode 100644 test.md diff --git a/docs/filetree.txt b/docs/filetree.txt deleted file mode 100644 index af8891c..0000000 --- a/docs/filetree.txt +++ /dev/null @@ -1,653 +0,0 @@ -┣ πŸ“‚.githooks -┃ β”— πŸ“œcommit-msg -┣ πŸ“‚.github -┃ β”— πŸ“‚workflows -┃ β”— πŸ“œcreate-pr.yml -┣ πŸ“‚.vscode -┃ β”— πŸ“œsettings.json -┣ πŸ“‚clients -┃ β”— πŸ“‚nufacturing -┃ ┣ πŸ“‚.github -┃ ┃ β”— πŸ“‚workflows -┃ ┃ β”— πŸ“œazure-static-web-apps-orange-plant-0f4cef90f.yml -┃ ┣ πŸ“‚.vscode -┃ ┃ ┣ πŸ“œextensions.json -┃ ┃ ┣ πŸ“œlaunch.json -┃ ┃ β”— πŸ“œtasks.json -┃ ┣ πŸ“‚environment -┃ ┃ ┣ πŸ“œenvironment.prod.ts -┃ ┃ β”— πŸ“œenvironment.ts -┃ ┣ πŸ“‚src -┃ ┃ ┣ πŸ“‚app -┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┣ πŸ“‚auth -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œauth.guard.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œauth.service.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhasura.interceptor.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œrole.guard.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚carousel -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcarousel.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œcarousel.component.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚container -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcontainer.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œcontainer.component.ts -┃ ┃ ┃ ┃ β”— πŸ“‚sidenav -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.html -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.scss -┃ ┃ ┃ ┃ ┣ πŸ“œsidenav.component.spec.ts -┃ ┃ ┃ ┃ β”— πŸ“œsidenav.component.ts -┃ ┃ ┃ ┣ πŸ“‚pages -┃ ┃ ┃ ┃ ┣ πŸ“‚dashboard -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚dashboard-page -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-page.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œdashboard-page.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-mock.service.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdashboard.module.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œdashboard.service.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚human-resources -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚training -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtraining.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtraining.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚users -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œusers.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œusers.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œhuman-resources.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œhuman-resources.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚inventory -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚inventory-item-detail -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-item-detail.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-item-detail.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚inventory-items-table -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-items-table.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory-items-table.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinventory.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œinventory.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚logout -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚logout-dialog -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout-dialog.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogout-dialog.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogout.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogout.component.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚product-development -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚create-formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcreate-formulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcreate-formulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚formula-list -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚list-formulas -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlist-formulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlist-formulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œformulas.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œformulas.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-skus -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-skus.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-skus.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚product-types -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-types.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-types.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚research-and-development -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œresearch-and-development.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œresearch-and-development.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduct-development.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduct-development.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚production -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚assets -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-details -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-details.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-details.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-files -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-files.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-files.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚asset-training -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œasset-training.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œasset-training.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚preventative-maintenance -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpreventative-maintenance.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpreventative-maintenance.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œassets.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œassets.routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚batch-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbatch-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbatch-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottling-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottling-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottling-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚depositor-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œdepositor-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œdepositor-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-manufacturing-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manifacturing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-manufacturing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-manufacturing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚packaging-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackaging-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackaging-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚production-planning -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-bottling-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-bottling-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-bottling-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚co-pack-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œco-pack-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œco-pack-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚encapsulation-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œencapsulation-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œencapsulation-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚mixing-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmixing-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmixing-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚powder-bottling-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpowder-bottling-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpowder-bottling-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚stick-pack-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œstick-pack-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œstick-pack-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚weighing-calendar -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-calendar.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-calendar.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-planning.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduction-planning.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚reporting -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreporting.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œreporting.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚shifting-records -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œshifting-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œshifting-records.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚weighing-records -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œweighing-records.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œweighing-records.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œproduction.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œproduction.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚quality -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚fda-audits -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œfda-audits.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œfda-audits.module.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚quality-audits -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-audits.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquality-audits.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquality.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œquality.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚receiving -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œreceiving.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œreceiving.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚sales -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customers -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-form.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-form.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚customer-list -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-list.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-list.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer.service.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomers.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomers.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚orders-navigation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorders-navigation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorders-navigation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bom-form -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-form.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom-form.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-profit -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-profit.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-profit.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚calculate-quote-pricing -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcalculate-quote-pricing.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcalculate-quote-pricing.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-with-moq -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-with-moq.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-with-moq.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-breakdown-without-moq -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-breakdown-without-moq.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-breakdown-without-moq.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredient-calculation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredient-calculation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredient-calculation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚package-breakdown -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œpackage-breakdown.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œpackage-breakdown.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚sales-analysis -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-analysis.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-analysis.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbom.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbom.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚account-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œaccount-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œaccount-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚bottle-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œbottle-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œbottle-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚capsule-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcapsule-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcapsule-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚closure-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œclosure-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œclosure-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚customer-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œcustomer-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œcustomer-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚label-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlabel-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlabel-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚master-carton-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œmaster-carton-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œmaster-carton-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-costs -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-costs.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-costs.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚order-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œorder-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œorder-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚other-components -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œother-components.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œother-components.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚testing-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œtesting-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œtesting-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œinfo.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œinfo.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚ingredients-info -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-info.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients-info.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-details -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-details.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-details.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚supplement-facts-only -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsupplement-facts-only.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsupplement-facts-only.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œingredients.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œingredients.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes.component.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes.module.ts -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚quotes-navigation -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œquotes-navigation.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œquotes-navigation.component.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚sales-dashboard -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-dashboard.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales-dashboard.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales-routing.module.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.component.ts -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œsales.module.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œsales.service.ts -┃ ┃ ┃ ┃ ┣ πŸ“‚users -┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚login -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.html -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.scss -┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œlogin.component.spec.ts -┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œlogin.component.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“‚signup -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.html -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.scss -┃ ┃ ┃ ┃ ┃ ┣ πŸ“œregister.component.spec.ts -┃ ┃ ┃ ┃ ┃ β”— πŸ“œregister.component.ts -┃ ┃ ┃ ┃ β”— πŸ“‚vendors -┃ ┃ ┃ ┃ ┣ πŸ“œvendors-routing.module.ts -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.html -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.scss -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.spec.ts -┃ ┃ ┃ ┃ ┣ πŸ“œvendors.component.ts -┃ ┃ ┃ ┃ β”— πŸ“œvendors.module.ts -┃ ┃ ┃ ┣ πŸ“‚services -┃ ┃ ┃ ┃ β”— πŸ“œglobal-service.service.ts -┃ ┃ ┃ ┣ πŸ“œapp-routing.module.ts -┃ ┃ ┃ ┣ πŸ“œapp.component.html -┃ ┃ ┃ ┣ πŸ“œapp.component.scss -┃ ┃ ┃ ┣ πŸ“œapp.component.spec.ts -┃ ┃ ┃ ┣ πŸ“œapp.component.ts -┃ ┃ ┃ ┣ πŸ“œapp.module.ts -┃ ┃ ┃ β”— πŸ“œgraphql.module.ts -┃ ┃ ┣ πŸ“‚assets -┃ ┃ ┃ ┣ πŸ“œ.gitkeep -┃ ┃ ┃ ┣ πŸ“œArtboard 1_0_25x.webp -┃ ┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1) (1).webp -┃ ┃ ┃ ┣ πŸ“œbatch-by-wisconsin-hemp-scientific-MoosTiMVbug-unsplash (1).webp -┃ ┃ ┃ ┣ πŸ“œdaily-nouri-D37STEwmyqY-unsplash (1).webp -┃ ┃ ┃ ┣ πŸ“œImage by Diana Polekhina.webp -┃ ┃ ┃ ┣ πŸ“œImage by Elsa Olofsson.webp -┃ ┃ ┃ ┣ πŸ“œLiquid Sachet Layout 5.webp -┃ ┃ ┃ ┣ πŸ“œNufacturing - White Logo Stacked.webp -┃ ┃ ┃ β”— πŸ“œStick Pack Layout (vertical).webp -┃ ┃ ┣ πŸ“œ.npmrc -┃ ┃ ┣ πŸ“œfavicon.ico -┃ ┃ ┣ πŸ“œindex.html -┃ ┃ ┣ πŸ“œmain.ts -┃ ┃ β”— πŸ“œstyles.scss -┃ ┣ πŸ“œ.editorconfig -┃ ┣ πŸ“œ.gitignore -┃ ┣ πŸ“œangular.json -┃ ┣ πŸ“œpackage.json -┃ ┣ πŸ“œREADME.md -┃ ┣ πŸ“œstaticwebapp.config -┃ ┣ πŸ“œtsconfig.app.json -┃ ┣ πŸ“œtsconfig.json -┃ β”— πŸ“œtsconfig.spec.json -┣ πŸ“‚docs -┣ πŸ“‚logs -┃ β”— πŸ“œapp.log -┣ πŸ“‚src -┃ ┣ πŸ“‚config -┃ ┃ ┣ πŸ“œdb.js -┃ ┃ β”— πŸ“œlogger.js -┃ ┣ πŸ“‚controllers -┃ ┃ ┣ πŸ“‚product-development-controller -┃ ┃ ┃ ┣ πŸ“œformulaController.js -┃ ┃ ┃ ┣ πŸ“œproductSkuController.js -┃ ┃ ┃ β”— πŸ“œproductTypeController.js -┃ ┃ ┣ πŸ“‚sales-controller -┃ ┃ ┃ ┣ πŸ“œcustomerController.js -┃ ┃ ┃ ┣ πŸ“œorderController.js -┃ ┃ ┃ β”— πŸ“œquoteController.js -┃ ┃ ┣ πŸ“œauthController.js -┃ ┃ ┣ πŸ“œinventoryController.js -┃ ┃ β”— πŸ“œuserController.js -┃ ┣ πŸ“‚middleware -┃ ┃ ┣ πŸ“œauthMiddleware.js -┃ ┃ β”— πŸ“œroleMiddlewaree.js -┃ ┣ πŸ“‚models -┃ ┃ ┣ πŸ“‚product-development-model -┃ ┃ ┃ ┣ πŸ“œformulasModel.js -┃ ┃ ┃ ┣ πŸ“œproductSkuModel.js -┃ ┃ ┃ β”— πŸ“œproductTypeModel.js -┃ ┃ ┣ πŸ“‚sales-model -┃ ┃ ┃ ┣ πŸ“œcustomerModel.js -┃ ┃ ┃ ┣ πŸ“œorderModel.js -┃ ┃ ┃ β”— πŸ“œquoteModel.js -┃ ┃ ┣ πŸ“œinventoryModel.js -┃ ┃ β”— πŸ“œuserModel.js -┃ ┣ πŸ“‚routes -┃ ┃ ┣ πŸ“‚product-development-routes -┃ ┃ ┃ ┣ πŸ“œformulaRoutes.js -┃ ┃ ┃ ┣ πŸ“œproductSkusRoutes.js -┃ ┃ ┃ β”— πŸ“œproductTypeRoutes.js -┃ ┃ ┣ πŸ“‚sales-routes -┃ ┃ ┃ ┣ πŸ“œcustomerRoutes.js -┃ ┃ ┃ ┣ πŸ“œorderRoutes.js -┃ ┃ ┃ β”— πŸ“œquoteRoutes.js -┃ ┃ ┣ πŸ“œinventoryRoutes.js -┃ ┃ β”— πŸ“œuserRoutes.js -┃ β”— πŸ“‚utils -┃ ┣ πŸ“œscheduledTasks.js -┃ β”— πŸ“œsendEmail.js -┣ πŸ“œ.env.development -┣ πŸ“œ.env.local -┣ πŸ“œ.env.production -┣ πŸ“œ.env.staging -┣ πŸ“œ.gitignore -┣ πŸ“œ.gitmodules -┣ πŸ“œapp.js -┣ πŸ“œindex.js -┣ πŸ“œpackage.json -┣ πŸ“œREADME.md -┣ πŸ“œswagger_output.json -β”— πŸ“œswagger.js diff --git a/docs/merging-strategy.md b/docs/merging-strategy.md deleted file mode 100644 index 8f46a59..0000000 --- a/docs/merging-strategy.md +++ /dev/null @@ -1,85 +0,0 @@ -## Environment Setup and Workflow for Nufacturing App - -### Merging Strategy - -When managing multiple environments (e.g., Development, Testing, Staging, Production) in a software development workflow, the approach to merging can depend on several factors, including the size of the team, the complexity of the project, and the need for stability and control over what changes are promoted. Here are the advantages and considerations for both approaches: - -### Merging Entire Environment Branches - -#### Advantages: - -1. **Consistency**: Ensures that all changes that have been tested together in one environment are promoted together, reducing the risk of integration issues. -2. **Simplicity**: Fewer merge operations and less manual intervention are required, simplifying the process. -3. **Efficiency**: Can be more efficient for large teams or projects with many small changes, as it reduces the overhead of managing multiple merges. - -#### Considerations: - -1. **Stability**: All changes, including potentially unstable ones, are promoted together. This can be mitigated by thorough testing before merging. -2. **Debugging**: If an issue arises in the next environment, it may be harder to isolate which change caused the problem. - -### Merging Each Feature Individually - -#### Advantages: - -1. **Control**: Provides more granular control over which features are promoted, allowing for selective promotion of stable and high-priority features. -2. **Stability**: Reduces the risk of promoting unstable or incomplete features, as each feature can be thoroughly tested before promotion. -3. **Debugging**: Easier to isolate and resolve issues, as each feature is promoted individually. - -#### Considerations: - -1. **Complexity**: More complex and time-consuming to manage, as each feature requires individual attention and merge operations. -2. **Integration Issues**: Higher risk of integration issues if not managed carefully, as features developed in isolation may have unforeseen interactions. - -### Recommendations - -Given the considerations, a hybrid approach is often beneficial: - -1. **Development to Testing**: Regularly merge the entire development branch into the testing branch to ensure that all new changes are integrated and tested together. This helps identify integration issues early. -2. **Testing to Staging**: Merge features individually from testing to staging. This allows for selective promotion of stable and high-priority features while providing control over what is being prepared for production. -3. **Staging to Production**: Merge the entire staging branch into production. Since staging should closely mimic the production environment and only contain thoroughly tested features, this ensures a smooth and consistent deployment. - -### Practical Steps - -1. **Feature Branches**: Develop each feature in its own branch. -2. **Development Environment**: Regularly merge feature branches into the development branch for integration testing. -3. **Testing Environment**: Periodically merge the entire development branch into the testing branch. -4. **Selective Promotion to Staging**: After thorough testing, merge individual stable features from the testing branch into the staging branch. -5. **Production Deployment**: Once all features in staging are verified and stable, merge the entire staging branch into the production branch. - -### Example Workflow - -1. **Feature Development**: - - ```sh - git checkout -b NFG-123-your-feature - # Develop feature - git commit -m "NFG-833 Add new feature" - git push origin feature/your-feature - ``` - -2. **Merge into Development**: - ```sh - git checkout development - git merge NFG-123-your-feature - git push origin development - ``` -3. **Merge Development into Testing**: - ```sh - git checkout testing - git merge development - git push origin testing - ``` -4. **Promote Feature to Staging**: - ```sh - git checkout staging - git cherry-pick - git push origin staging - ``` -5. **Merge Staging into Production**: - ```sh - git checkout production - git merge staging - git push origin production - ``` - -This approach balances the need for integration and stability with control over the deployment process, helping ensure a smooth and reliable workflow. diff --git a/docs/schema.md b/docs/schema.md deleted file mode 100644 index 9b6c9ca..0000000 --- a/docs/schema.md +++ /dev/null @@ -1,89 +0,0 @@ -## Schema Definitions for Each Model - -### Task Description: Define Schema for Each Collection - -Create schemas for the following models to ensure a structured and efficient database schema for the Nufacturing system: - -1. **Customer**: - - - Stores customer information, contact details, addresses, qualification forms, and associated brands. - -2. **CustomerBrand**: - - - Manages information about customer brands, including brand code, photo, and website. - -3. **CustomerQualificationForm**: - - - Contains details about the customer qualification process. - -4. **Vendor**: - - - Holds information about vendors, including contact details and vendor-specific inventory. - -5. **InventoryItem**: - - - General inventory items, including raw materials, packaging, labels, and finished products. - - Fields: Ingredient name, price per KG, and stock quantity. - -6. **Ingredient**: - - - Specific details about ingredients, including their scientific name and associated inventory item data. - -7. **ProductType**: - - - Types of products with attributes and associated processes. - -8. **ProductSKU**: - - - Details about product SKUs, including formula, customer, status, and additional optional fields like packaging information, production details, and pricing. - -9. **Formula**: - - - Details about product formulas, including ingredients, quantities, and manufacturing instructions. - -10. **Order**: - - - Information about customer orders, status tracking, and production steps. - -11. **Quote**: - - - Details about quotes provided to customers, including quote status and related products. - -12. **Process**: - - - Different processes involved in production, such as R&D testing, raw pick list, sifting, mixing, and packaging. - -13. **User**: - - - User details, permissions, and roles within the system. - -14. **BatchRecord**: - - - Information about production batches, including creation and listing of batch records. - -15. **MasterManufacturingRecord (MMR)**: - - - Details about master manufacturing records, including creation and listing of MMRs. - -16. **AuditReport**: - - - Reports from audits, including FDA, UL, and ASI reports. - -17. **Asset**: - - - Information about assets and machinery, including costing, manuals, maintenance logs, and how-to videos. - -18. **Training**: - - - Details about employee training sessions and materials. - -19. **Notification**: - - Alerts and notifications for users, including key metrics and updates. - -### Objectives - -- Ensure each schema is well-defined and includes necessary fields and relationships. -- Implement data validation and appropriate indexing for efficient queries. -- Facilitate integration with backend services for data manipulation and retrieval. - -This task will involve creating Mongoose models and ensuring they align with the overall application requirements and structure. diff --git a/docs/testing.md b/docs/testing.md deleted file mode 100644 index 657d3e7..0000000 --- a/docs/testing.md +++ /dev/null @@ -1,208 +0,0 @@ -If you were to adopt a strict TDD (Test-Driven Development) approach and require all types of tests (unit, integration, and end-to-end), the order of development would involve writing tests first and then writing the code to pass those tests. Here’s an outline of the development order and process: - -### Order of Development in TDD with All Test Types - -1. **Define Requirements and Acceptance Criteria** -2. **Write Failing Unit Tests** -3. **Implement Code to Pass Unit Tests** -4. **Write Failing Integration Tests** -5. **Implement Code to Pass Integration Tests** -6. **Write Failing End-to-End Tests** -7. **Implement Code to Pass End-to-End Tests** -8. **Refactor Code** -9. **Repeat** - -### Detailed Process - -#### 1. Define Requirements and Acceptance Criteria - -- **User Story Creation**: Define the user stories, acceptance criteria, and detailed requirements. -- **Break Down User Stories**: Break down user stories into smaller, manageable tasks that can be developed and tested incrementally. - -#### 2. Write Failing Unit Tests - -- **Identify Units of Work**: Determine the smallest units of functionality to be tested (e.g., functions, classes, methods). -- **Write Unit Tests**: Write unit tests for these small units of functionality. These tests should initially fail because the corresponding code has not been implemented yet. - -#### 3. Implement Code to Pass Unit Tests - -- **Write Code**: Write the minimal amount of code necessary to make the unit tests pass. -- **Run Tests**: Continuously run the unit tests to ensure they pass as you write the code. - -#### 4. Write Failing Integration Tests - -- **Identify Integration Points**: Determine the integration points between different units or modules that need to be tested together. -- **Write Integration Tests**: Write integration tests that validate the interactions between these units. These tests should initially fail because the integration logic has not been fully implemented yet. - -#### 5. Implement Code to Pass Integration Tests - -- **Write Code**: Implement the code to handle the integration points between the different units or modules. -- **Run Tests**: Continuously run the integration tests to ensure they pass as you write the code. - -#### 6. Write Failing End-to-End Tests - -- **Identify End-to-End Scenarios**: Determine the key end-to-end scenarios that need to be tested from a user's perspective. -- **Write End-to-End Tests**: Write end-to-end tests that simulate user interactions and validate the overall functionality of the application. These tests should initially fail because the full functionality has not been implemented yet. - -#### 7. Implement Code to Pass End-to-End Tests - -- **Write Code**: Implement the code to ensure the application works as expected from an end-to-end perspective. -- **Run Tests**: Continuously run the end-to-end tests to ensure they pass as you write the code. - -#### 8. Refactor Code - -- **Refactor**: Once all tests are passing, refactor the code to improve its structure, readability, and maintainability without changing its behavior. -- **Run All Tests**: Ensure all tests (unit, integration, and end-to-end) still pass after refactoring. - -#### 9. Repeat - -- **Iterate**: Continue this process for each new piece of functionality, user story, or bug fix. - -### Example Workflow - -1. **User Story Creation**: - - - **Story**: As a user, I want to log in to the application so that I can access my dashboard. - - **Acceptance Criteria**: The user should be able to log in with valid credentials and be redirected to the dashboard. - -2. **Write Failing Unit Tests**: - - - Write unit tests for the login function, checking for valid and invalid inputs. - -3. **Implement Code to Pass Unit Tests**: - - - Implement the login function to pass the unit tests. - -4. **Write Failing Integration Tests**: - - - Write integration tests to check the interaction between the login function and the user authentication service. - -5. **Implement Code to Pass Integration Tests**: - - - Implement the necessary code to pass the integration tests. - -6. **Write Failing End-to-End Tests**: - - - Write end-to-end tests to simulate the user logging in through the UI and being redirected to the dashboard. - -7. **Implement Code to Pass End-to-End Tests**: - - - Implement the UI and necessary backend logic to pass the end-to-end tests. - -8. **Refactor Code**: - - - Refactor the login function, authentication service, and UI components to improve code quality. - - Ensure all tests still pass after refactoring. - -9. **Repeat**: - - Move on to the next user story or task and repeat the process. - -### Branching Strategy with TDD - -Given the strict TDD approach, your branching strategy should reflect the stages of development and testing: - -- **Feature Branches**: Create branches for each feature or user story. - - - `feature/NFG--` - -- **Development Branch**: Merges into this branch must have passing unit, integration, and end-to-end tests. - - - `development` - -- **Testing Branch**: Optional, to test integration of multiple features before merging into development. - - - `testing` - -- **Staging Branch**: For pre-production testing. - - - `staging` - -- **Production Branch**: For deployment-ready code. - - `production` - -### Git Hooks and GitHub Actions - -#### Git Hooks - -Use pre-push and pre-commit hooks to ensure tests are written and passing: - -**Pre-Commit Hook**: - -```bash -#!/bin/sh -# Get the current branch name -branch_name=$(git symbolic-ref --short HEAD) - -# Define the branch naming pattern -pattern="^(feature|hotfix)/NFG-[0-9]+-[a-z0-9-]+$" - -if ! [[ $branch_name =~ $pattern ]]; then - echo "Branch name '$branch_name' does not follow the naming convention." - echo "Please use the following convention: 'feature/NFG--' or 'hotfix/NFG--'" - exit 1 -fi -``` - -**Pre-Push Hook**: - -```bash -#!/bin/sh -# Navigate to the project root directory -cd "$(git rev-parse --show-toplevel)" - -# Run tests -npm run test - -# Check test results -if [ $? -ne 0 ]; then - echo "Tests failed. Please fix the tests before pushing." - exit 1 -fi -``` - -#### GitHub Actions - -Create workflows to enforce tests before merging into development: - -**GitHub Actions Workflow**: - -```yaml -name: CI Pipeline - -on: - pull_request: - branches: - - development - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: "16" - - - name: Install dependencies - run: npm install - - - name: Run unit tests - run: npm run test:unit - - - name: Run integration tests - run: npm run test:integration - - - name: Run e2e tests - run: npm run test:e2e - - - name: Verify test coverage - run: npm run test:coverage -``` - -### Summary - -This approach ensures that all necessary tests are written and passing before code is merged into the development branch, while providing a flexible workflow that can accommodate different testing strategies. By enforcing these practices through Git hooks and GitHub Actions, you maintain high code quality and comprehensive test coverage. diff --git a/docs/workflow.png b/docs/workflow.png deleted file mode 100644 index e98e82301e9d5bcd0d05acef5226f72848b4955d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236271 zcmeFZXINADw>BKdQO2<_ihxpQKtMVuy~R-xX`&Pn2t&8jNN)-P(ha>P zh=fQNR62^ld5?}z-a z+696@0#bYb_8D8A`3CHC@vy!XWaaDOZ|)Lw=kA@LJHS2=C{hCE?csmj&%-w;P(sHc zQX))3M@2y*9QcV;`19L&^>gR`=N+o*+UNd0=&w`$+~J6P{p2kg1mdb0U;f=X%xQV| zFv8I-{MQI@VtKQIT}mZg|60~B?k1NKJ=$MvetywAbL2N|bDZDpmr1Yq#xMM|e?6=6 z(ksZ*ep=QKJU_jbQiSTLd?baQlewS%imz~?X8jj?CE4pA@QtJNU1{iD6^_ z|K6egzdOEHi1q*K<9l_0{#PIW>o4CK#Q*E&Q2S?;RT^)Ts=yR$3)IvaUb2KTC-p6VYI%%&MMQYnl)oXQE+Du@$z6H#d9bs;%I50W z>4|#ZXu+IF=^W%D0WbFb=?&k`w7-)oEG(4vZP`|*2Wk>UQp+J$>p9sJ!VdWg9rB=rLOSm+H6Vtcjn>mHhXA@By z=J?^q8~HLgVKjRzxAWu2>x28hzdY4KLZtT&j&0#2j$0phh%JwWO$-ZCN>MvTgON4O z^ZUL#_#VT`VRC<9Z{_69lh~XeQ_Ji^!`VB2Es_}y_ObsGK?@9sa4cd&8LJUBoys-F z1k=lJ)k<@qe%m8>f$uH}$`X(ES0O;cH+m>3BV136dY}@HToSg+UF&rIm*)DjFKeY; zn(NCI=Q2dOG-t25DSw6++07~Z5@xUN_^*w61z6E9t$5 zSHk?W-3ye_JuvqSZ<>nls~ofTwn0A@jU@|0Sr)O1{~WXTsTH}W%!UPVZopuPfo7|# zRc|g7>ixZ1+Qt%o;t9L}gITpKQn_%94RVO?7)mk!kA;c?3*~7cCyyBU_ylv8*yq8a zmj-|M?q2t*C66DQyH^V3oHs0uD0jsDHa@N!^Dk-AboMS%M)J2AEb(2^^j5I{?tG9+ zFd%D+112E&^Oq4phc7;}i?xRTQet6+>&A}!(^w6a!;Y*#&5mp?xg0-S?88#_LxVY` zWGE9F;WgQ~6ifd$H{{x71E;b$=8(v5U_5Pi8hRJKtx2Coh1h()8yUgb`% znpPpX6J)UXL~7$)KN=6_ZudKTIGK^% z%&iZt+;dKtlE(F@A{8|?5fpO;Cs+5q7H@lc#zx*w@$}U}u8qBMqZIe?#B3Jp2|IA) zoIm;PW{#dj9d~d_yQNY^ZQINX-pt4-iYWX30xBke0R}MU`jqX9F!NvF4COB!R=lWR zqiFTCXk1j3^8<&~?c5Fuef$;*Po5t=Mc+D~30qG<9Y?WoL_RJH?e~nk!W*SNe6rOI z#<7m)|NiQofU#9icD+h6Tv{JyR}T=3IA39KHxqwWk4#?Cd}Yl_I_?99t4v0tSi8Vu zEZepPN3Tex`&Y)Hc2Vri(VFcZI+RmaIO+PSI4jKMp^#1q$WU&R2V^S z`48&EJtW10Su2rbX4M3j^Q{`Qkm?sd>^$;}iaLQN*ueWb`-e93@ED2aNOpSPjr5;K zb{JeWje-(5cXlk#Z82WNz`EvpQExAL-mJt`og*Abb5U}r)reXmv9DolrZ}q;C{gZ4 z0$Bb(o~iYthjzXr@u}pQXg>VS;E6`0*T0>w7)S_#ZLtGjhnf-~0%{2U502*@wId#L zb7Pz{l%j>0zy0sHVG+H9oYSc_| zKy&N=BV^|6g-i~404Ff@lotpH)0y0j!BeN^mH(xjugk`OWUskfn5{}Es~U)`ySq#* zABwyCpR)Px$;Ma*v(Jig{h-QquKk;-PR}cMp-`oNUvYBpiu09R@≪JEsg}6kyIVP+xSV-ueX*gP^znk%{&~ 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 P8#gwvxLg10Z;$^EPMwJO diff --git a/test.md b/test.md deleted file mode 100644 index eaf1a94..0000000 --- a/test.md +++ /dev/null @@ -1,279 +0,0 @@ -### Business Value Assessment for the Advanced Quoting System for Sales - -#### **Strategic Alignment:** - -- **Alignment with Product Strategy:** - - This epic aligns with the overall product strategy by focusing on automation, efficiency, and integration. It supports the company’s goals of enhancing operational efficiency and improving the user experience. - - It contributes to long-term growth by enabling faster and more accurate quoting processes, which can lead to increased sales and customer satisfaction. - - The system fosters innovation by leveraging real-time data and automated workflows, positioning the company as a leader in digital transformation within the nutraceutical manufacturing sector. - -#### **Customer Impact:** - -- **Enhanced User Experience:** - - The epic will significantly improve the experience for sales representatives by reducing manual data entry and automating complex calculations, thus meeting their needs and solving existing pain points. - - Customers will benefit from more accurate and timely quotes, leading to increased trust and satisfaction. - -#### **Market Differentiation:** - -- **Competitive Advantages:** - - The advanced quoting system will make the product stand out in the market by offering unique features such as real-time inventory integration, automated pricing mechanisms, and a user-friendly interface. - - These capabilities provide a significant competitive edge by ensuring precision and speed in the quoting process. - -#### **Return on Investment (ROI):** - -- **Revenue Growth and Cost Savings:** - - The implementation of this epic is expected to lead to revenue growth by enabling quicker quote turnaround times and reducing the chances of lost sales due to delays. - - Cost savings will be achieved through reduced manual effort and fewer pricing errors, leading to more efficient use of resources. - -#### **Time-to-Market Advantage:** - -- **Accelerated Delivery:** - - This epic will accelerate the delivery of valuable features to the market, allowing the product to seize opportunities and respond to trends more quickly. - - The streamlined quoting process will enable the company to react faster to customer inquiries and market demands. - -#### **Risk Mitigation:** - -- **Addressing Risks:** - - By automating the quoting process and integrating with real-time data, the system addresses risks related to pricing errors and inventory discrepancies. - - It enhances reliability and compliance by maintaining accurate records and providing a clear audit trail. - -#### **Customer Satisfaction:** - -- **Impact on Satisfaction and Retention:** - - Improved accuracy and efficiency in the quoting process will lead to higher customer satisfaction and retention. - - Customers are likely to provide positive feedback and remain loyal due to the enhanced service quality. - -#### **Innovation and Future Readiness:** - -- **Foundation for Future Enhancements:** - - This epic lays the groundwork for future innovations by creating a scalable and flexible quoting system. - - It supports strategic initiatives for further automation and integration with other business systems. - -#### **Stakeholder Benefits:** - -- **Key Beneficiaries:** - - **Sales Representatives:** Experience a more efficient and error-free quoting process. - - **Sales Managers:** Benefit from improved oversight and reduced risk of pricing errors. - - **Customers:** Receive accurate and timely quotes, enhancing their overall experience. - -#### **Alignment with Roadmap:** - -- **Contribution to Product Roadmap:** - - This epic fits into the product roadmap by contributing to critical milestones focused on automation and efficiency. - - It supports the delivery of features that are essential for achieving the company’s strategic goals. - -### **Conclusion:** - -The Advanced Quoting System for Sales brings substantial business value by enhancing operational efficiency, improving user and customer experiences, and supporting strategic objectives of automation and digital transformation. Its implementation will lead to increased revenue, cost savings, and a strong competitive position in the market, making it a pivotal component of the product strategy. - -### Business Value and ROI Calculation for the Advanced Quoting System for Sales - -#### Assumptions and Inputs - -To calculate the business value and ROI of the Advanced Quoting System for Sales, we need to establish some key assumptions and inputs: - -1. **Current Metrics:** - - - **Average time to generate a quote manually:** 2 hours - - **Number of quotes generated per month:** 100 - - **Hourly cost of a sales representative:** $50 - - **Current error rate in quotes:** 10% - - **Cost per error (including lost sales, customer dissatisfaction, and rework):** $500 - -2. **Projected Improvements:** - - - **Reduction in time to generate a quote:** 50% - - **Reduction in error rate:** 70% - - **Increase in number of quotes due to efficiency:** 20% - -3. **Implementation Costs:** - - **Initial development and implementation cost:** $50,000 - - **Ongoing maintenance cost per year:** $10,000 - -### Business Value Assessment for the Advanced Quoting System for Sales - -#### **Strategic Alignment:** - -- **Alignment with Product Strategy:** - - This epic aligns with the overall product strategy by focusing on automation, efficiency, and integration. It supports the company’s goals of enhancing operational efficiency and improving the user experience. - - It contributes to long-term growth by enabling faster and more accurate quoting processes, which can lead to increased sales and customer satisfaction. - - The system fosters innovation by leveraging real-time data and automated workflows, positioning the company as a leader in digital transformation within the nutraceutical manufacturing sector. - -#### **Customer Impact:** - -- **Enhanced User Experience:** - - The epic will significantly improve the experience for sales representatives by reducing manual data entry and automating complex calculations, thus meeting their needs and solving existing pain points. - - Customers will benefit from more accurate and timely quotes, leading to increased trust and satisfaction. - -#### **Market Differentiation:** - -- **Competitive Advantages:** - - The advanced quoting system will make the product stand out in the market by offering unique features such as real-time inventory integration, automated pricing mechanisms, and a user-friendly interface. - - These capabilities provide a significant competitive edge by ensuring precision and speed in the quoting process. - -#### **Return on Investment (ROI):** - -- **Revenue Growth and Cost Savings:** - - The implementation of this epic is expected to lead to revenue growth by enabling quicker quote turnaround times and reducing the chances of lost sales due to delays. - - Cost savings will be achieved through reduced manual effort and fewer pricing errors, leading to more efficient use of resources. - -#### **Time-to-Market Advantage:** - -- **Accelerated Delivery:** - - This epic will accelerate the delivery of valuable features to the market, allowing the product to seize opportunities and respond to trends more quickly. - - The streamlined quoting process will enable the company to react faster to customer inquiries and market demands. - -#### **Risk Mitigation:** - -- **Addressing Risks:** - - By automating the quoting process and integrating with real-time data, the system addresses risks related to pricing errors and inventory discrepancies. - - It enhances reliability and compliance by maintaining accurate records and providing a clear audit trail. - -#### **Customer Satisfaction:** - -- **Impact on Satisfaction and Retention:** - - Improved accuracy and efficiency in the quoting process will lead to higher customer satisfaction and retention. - - Customers are likely to provide positive feedback and remain loyal due to the enhanced service quality. - -#### **Innovation and Future Readiness:** - -- **Foundation for Future Enhancements:** - - This epic lays the groundwork for future innovations by creating a scalable and flexible quoting system. - - It supports strategic initiatives for further automation and integration with other business systems. - -#### **Stakeholder Benefits:** - -- **Key Beneficiaries:** - - **Sales Representatives:** Experience a more efficient and error-free quoting process. - - **Sales Managers:** Benefit from improved oversight and reduced risk of pricing errors. - - **Customers:** Receive accurate and timely quotes, enhancing their overall experience. - -#### **Alignment with Roadmap:** - -- **Contribution to Product Roadmap:** - - This epic fits into the product roadmap by contributing to critical milestones focused on automation and efficiency. - - It supports the delivery of features that are essential for achieving the company’s strategic goals. - -### **Conclusion:** - -The Advanced Quoting System for Sales brings substantial business value by enhancing operational efficiency, improving user and customer experiences, and supporting strategic objectives of automation and digital transformation. Its implementation will lead to increased revenue, cost savings, and a strong competitive position in the market, making it a pivotal component of the product strategy. - -### Business Value and ROI Calculation for the Advanced Quoting System for Sales - -#### Assumptions and Inputs - -To calculate the business value and ROI of the Advanced Quoting System for Sales, we need to establish some key assumptions and inputs: - -1. **Current Metrics:** - - - **Average time to generate a quote manually:** 2 hours - - **Number of quotes generated per month:** 100 - - **Hourly cost of a sales representative:** $50 - - **Current error rate in quotes:** 10% - - **Cost per error (including lost sales, customer dissatisfaction, and rework):** $500 - -2. **Projected Improvements:** - - - **Reduction in time to generate a quote:** 50% - - **Reduction in error rate:** 70% - - **Increase in number of quotes due to efficiency:** 20% - -3. **Implementation Costs:** - - **Initial development and implementation cost:** $50,000 - - **Ongoing maintenance cost per year:** $10,000 - -#### Calculations - -1. **Current Annual Costs:** - - - **Time Cost for Quotes:** - \[ - \text{Time Cost} = \text{Time per Quote} \times \text{Number of Quotes per Year} \times \text{Hourly Cost} - \] - \[ - = 2 \text{ hours} \times 100 \text{ quotes/month} \times 12 \text{ months} \times \$50/\text{hour} - = \$120,000 - \] - - - **Error Cost:** - \[ - \text{Error Cost} = \text{Number of Quotes per Year} \times \text{Error Rate} \times \text{Cost per Error} - \] - \[ - = 100 \text{ quotes/month} \times 12 \text{ months} \times 10\% \times \$500 - = \$60,000 - \] - - - **Total Current Cost:** - \[ - \text{Total Current Cost} = \text{Time Cost} + \text{Error Cost} - \] - \[ - = \$120,000 + \$60,000 - = \$180,000 - \] - -2. **Projected Annual Costs After Implementation:** - - - **Reduced Time Cost:** - \[ - \text{Reduced Time Cost} = (\text{Time per Quote} \times \text{Reduction in Time}) \times \text{Number of Quotes per Year} \times \text{Hourly Cost} - \] - \[ - = (2 \text{ hours} \times 50\%) \times 120 \text{ quotes/month} \times 12 \text{ months} \times \$50/\text{hour} - = 1 \text{ hour} \times 120 \times 12 \times \$50 - = \$72,000 - \] - - - **Reduced Error Cost:** - \[ - \text{Reduced Error Cost} = \text{Number of Quotes per Year} \times \text{Reduced Error Rate} \times \text{Cost per Error} - \] - \[ - = 120 \text{ quotes/month} \times 12 \text{ months} \times 3\% \times \$500 - = \$21,600 - \] - - - **Total Projected Cost:** - \[ - \text{Total Projected Cost} = \text{Reduced Time Cost} + \text{Reduced Error Cost} + \text{Ongoing Maintenance Cost} - \] - \[ - = \$72,000 + \$21,600 + \$10,000 - = \$103,600 - \] - -3. **ROI Calculation:** - - - **Savings:** - \[ - \text{Savings} = \text{Total Current Cost} - \text{Total Projected Cost} - \] - \[ - = \$180,000 - \$103,600 - = \$76,400 - \] - - - **ROI:** - \[ - \text{ROI} = \left( \frac{\text{Savings} - \text{Initial Cost}}{\text{Initial Cost}} \right) \times 100\% - \] - \[ - = \left( \frac{\$76,400 - \$50,000}{\$50,000} \right) \times 100\% - = \left( \frac{\$26,400}{\$50,000} \right) \times 100\% - = 52.8\% - \] - -### Summary - -- **Total Savings in the First Year:** \$76,400 -- **ROI:** 52.8% - -This analysis shows that implementing the Advanced Quoting System for Sales will provide substantial savings and a significant return on investment within the first year, aligning well with the company's strategic objectives of increasing efficiency, reducing errors, and enhancing user satisfaction. - -### Summary - -- **Total Savings in the First Year:** \$76,400 -- **ROI:** 52.8% - -This analysis shows that implementing the Advanced Quoting System for Sales will provide substantial savings and a significant return on investment within the first year, aligning well with the company's strategic objectives of increasing efficiency, reducing errors, and enhancing user satisfaction. From 6b1b74465b8a3e33912583868c1e2ebdb00ea7eb Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 2 Sep 2024 07:35:11 +0000 Subject: [PATCH 06/64] fix: upgrade zone.js from 0.13.3 to 0.14.10 Snyk has created this PR to upgrade zone.js from 0.13.3 to 0.14.10. See this package in npm: zone.js See this project in Snyk: https://app.snyk.io/org/nfgallimore/project/6c78ccee-e00e-45e2-830c-949ac8e8b57f?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 13 ++++++------- package.json | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd74166..98616df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "graphql-tag": "^2.12.6", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "^0.14.10" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.14", @@ -5251,6 +5251,7 @@ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -22149,12 +22150,10 @@ } }, "node_modules/zone.js": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", - "dependencies": { - "tslib": "^2.3.0" - } + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 6fadc10..1a9f2cb 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "graphql-tag": "^2.12.6", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.10" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.14", From 1bb98fccf247dbaab58b252068d09eec3433d8cd Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 2 Sep 2024 07:35:16 +0000 Subject: [PATCH 07/64] fix: upgrade @apollo/client from 3.11.1 to 3.11.4 Snyk has created this PR to upgrade @apollo/client from 3.11.1 to 3.11.4. See this package in npm: @apollo/client See this project in Snyk: https://app.snyk.io/org/nfgallimore/project/6c78ccee-e00e-45e2-830c-949ac8e8b57f?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd74166..80b6699 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@angular/platform-browser": "^16.2.0", "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", - "@apollo/client": "^3.0.0", + "@apollo/client": "^3.11.4", "@auth0/angular-jwt": "^5.2.0", "@testing-library/angular": "^14.5.1", "apollo-angular": "^5.0.2", @@ -1170,9 +1170,10 @@ } }, "node_modules/@apollo/client": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.1.tgz", - "integrity": "sha512-fVuAi7ufRt2apIEYV18upvykw5JD+CwHAThxZkclby4phWCXtO4LD39Z0sk0+4i+j7oZ+jOofEkO1XGDDomZvQ==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.4.tgz", + "integrity": "sha512-bmgYKkULpym8wt8aXlAZ1heaYo0skLJ5ru0qJ+JCRoo03Pe+yIDbBCnqlDw6Mjj76hFkDw3HwFMgZC2Hxp30Mg==", + "license": "MIT", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", diff --git a/package.json b/package.json index 6fadc10..7a8e8b9 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@angular/platform-browser": "^16.2.0", "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", - "@apollo/client": "^3.0.0", + "@apollo/client": "^3.11.4", "@auth0/angular-jwt": "^5.2.0", "@testing-library/angular": "^14.5.1", "apollo-angular": "^5.0.2", From 341f7f061eb1bff9c5e2e7216dfeae94e69374e7 Mon Sep 17 00:00:00 2001 From: Osman Alhassan Date: Wed, 4 Sep 2024 11:31:19 +0000 Subject: [PATCH 08/64] NFG-83 Made login page mobile responsive --- .../pages/users/login/login.component.scss | 25 +++++++++++++++++++ src/styles.scss | 7 ++++++ 2 files changed, 32 insertions(+) diff --git a/src/app/pages/users/login/login.component.scss b/src/app/pages/users/login/login.component.scss index badf743..ee5bad3 100644 --- a/src/app/pages/users/login/login.component.scss +++ b/src/app/pages/users/login/login.component.scss @@ -57,3 +57,28 @@ } } } + +@media only screen and (max-width: 768px) { + .login-page { + height: 100vh; + display: flex; + flex-direction: column; + + .carousel-container { + width: 100%; + background-size: cover; + background-position: center; + } + + .form-container { + width: 100%; + display: flex; + justify-content: center; + align-self: center; + align-items: center; + position: fixed; + margin-top: 10vh; + } + + } +} diff --git a/src/styles.scss b/src/styles.scss index a1dd8a0..eb40323 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -48,3 +48,10 @@ mat-sidenav { mat-button { cursor: pointer; } + + +@media only screen and (max-width: 768px) { + body { + margin: 0; + } +} \ No newline at end of file From af4cf8c54c0caf4d48f1d33cd94d585edcb04bd3 Mon Sep 17 00:00:00 2001 From: Osman Alhassan Date: Wed, 4 Sep 2024 11:44:16 +0000 Subject: [PATCH 09/64] NFG-83 Made register page mobile responsive --- .../pages/users/login/login.component.scss | 5 ++--- .../users/signup/register.component.scss | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/app/pages/users/login/login.component.scss b/src/app/pages/users/login/login.component.scss index ee5bad3..621e46f 100644 --- a/src/app/pages/users/login/login.component.scss +++ b/src/app/pages/users/login/login.component.scss @@ -63,13 +63,13 @@ height: 100vh; display: flex; flex-direction: column; - + .carousel-container { width: 100%; background-size: cover; background-position: center; } - + .form-container { width: 100%; display: flex; @@ -79,6 +79,5 @@ position: fixed; margin-top: 10vh; } - } } diff --git a/src/app/pages/users/signup/register.component.scss b/src/app/pages/users/signup/register.component.scss index 09adae0..37851c6 100644 --- a/src/app/pages/users/signup/register.component.scss +++ b/src/app/pages/users/signup/register.component.scss @@ -59,3 +59,23 @@ line-height: 64px; } } + +@media only screen and (max-width: 768px) { + .login-page { + height: 100vh; + display: flex; + flex-direction: column; + + .logo-container { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + margin: 20px 0 0 0; + } + + .form-container { + width: 100%; + } + } +} From 378f2464c2f8787f8bea5ccec36c2e78d60c98ba Mon Sep 17 00:00:00 2001 From: Osman Alhassan Date: Wed, 4 Sep 2024 15:15:22 +0000 Subject: [PATCH 10/64] NFG-83 remove inline styles for sidenav component --- .../container/container.component.html | 2 +- .../container/container.component.scss | 14 +++++++++- .../components/sidenav/sidenav.component.html | 19 ++----------- .../components/sidenav/sidenav.component.scss | 27 +++++++++++++++++++ 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/app/components/container/container.component.html b/src/app/components/container/container.component.html index 0cc1a36..2815722 100644 --- a/src/app/components/container/container.component.html +++ b/src/app/components/container/container.component.html @@ -1,4 +1,4 @@ - + +
@@ -23,13 +14,7 @@ " >
diff --git a/src/app/pages/dashboard/dashboard.component.spec.ts b/src/app/pages/dashboard/dashboard.component.spec.ts index 4c64dfc..1c6ba4d 100644 --- a/src/app/pages/dashboard/dashboard.component.spec.ts +++ b/src/app/pages/dashboard/dashboard.component.spec.ts @@ -71,10 +71,10 @@ describe('DashboardComponent', () => { expect(component.recentActivity.length).toBe(2); expect(component.recentActivity[0].details).toBe( - 'Order #1234 - Status: In Process', + 'Order #1234 - Status: In Process' ); expect(component.recentActivity[1].details).toBe( - 'Quote #5678 - Status: Active', + 'Quote #5678 - Status: Active' ); }); @@ -85,7 +85,7 @@ describe('DashboardComponent', () => { expect(component.alerts.length).toBe(2); expect(component.alerts[0].message).toBe('Payment overdue for Order #1234'); expect(component.alerts[1].message).toBe( - 'New Quote #5678 awaiting approval', + 'New Quote #5678 awaiting approval' ); }); }); diff --git a/src/app/pages/dashboard/dashboard.component.ts b/src/app/pages/dashboard/dashboard.component.ts index 2305c57..216f82c 100644 --- a/src/app/pages/dashboard/dashboard.component.ts +++ b/src/app/pages/dashboard/dashboard.component.ts @@ -5,4 +5,4 @@ import { Component } from '@angular/core'; templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'], }) -export class DashboardComponent {} \ No newline at end of file +export class DashboardComponent {} diff --git a/src/app/pages/human-resources/human-resources-routing.module.ts b/src/app/pages/human-resources/human-resources-routing.module.ts index 0c73dee..3345123 100644 --- a/src/app/pages/human-resources/human-resources-routing.module.ts +++ b/src/app/pages/human-resources/human-resources-routing.module.ts @@ -8,7 +8,7 @@ const routes: Routes = [ path: 'training', loadChildren: () => import('./components/training/training.module').then( - (m) => m.TrainingModule, + (m) => m.TrainingModule ), }, { diff --git a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.html b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.html index 46476fb..dc34911 100644 --- a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.html +++ b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.html @@ -46,7 +46,14 @@

Components

- {{ item.name }} + + {{ item.name }} + {{ item.componentId }} {{ item.name }} {{ item.supplier }} @@ -70,4 +77,4 @@

Components

- \ No newline at end of file + diff --git a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.scss b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.scss index e1d5010..7a78be6 100644 --- a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.scss +++ b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.scss @@ -1,14 +1,15 @@ -table { - width: 100%; - border-collapse: collapse; -} - -th, td { - padding: 10px; - text-align: left; - border: 1px solid #ccc; -} - -img { - border-radius: 4px; -} +table { + width: 100%; + border-collapse: collapse; +} + +th, +td { + padding: 10px; + text-align: left; + border: 1px solid #ccc; +} + +img { + border-radius: 4px; +} diff --git a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.spec.ts b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.spec.ts index 4b9540e..4849995 100644 --- a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.spec.ts +++ b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.spec.ts @@ -8,7 +8,7 @@ describe('InventoryDashboardComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [InventoryDashboardComponent] + declarations: [InventoryDashboardComponent], }); fixture = TestBed.createComponent(InventoryDashboardComponent); component = fixture.componentInstance; diff --git a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.ts b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.ts index 70ce3dd..adac651 100644 --- a/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.ts +++ b/src/app/pages/inventory/components/inventory-dashboard/inventory-dashboard.component.ts @@ -3,14 +3,12 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-inventory-dashboard', templateUrl: './inventory-dashboard.component.html', - styleUrls: ['./inventory-dashboard.component.scss'] + styleUrls: ['./inventory-dashboard.component.scss'], }) export class InventoryDashboardComponent { - - components = [ { - picture: 'assets/bottleCap.png', // Path to image + picture: 'assets/bottleCap.png', // Path to image componentId: 'CMP001', name: 'Plastic Bottle Cap', supplier: 'CapIt Industries', @@ -28,10 +26,10 @@ export class InventoryDashboardComponent { batchIds: 'BATCHCAP101, BATCHCAP102', lotIds: 'LOTCAP789, LOTCAP790', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { - picture: 'assets/labels.png', // Path to image + picture: 'assets/labels.png', // Path to image componentId: 'CMP002', name: 'Pill Bottle Labels', supplier: 'LabelPro Supplies', @@ -49,16 +47,16 @@ export class InventoryDashboardComponent { batchIds: 'BATCHLBL103', lotIds: 'LOTLBL791', backorderedQty: 500, - status: 'Backordered' + status: 'Backordered', }, { - picture: 'assets/silicaGel.png', // Path to image + picture: 'assets/silicaGel.png', // Path to image componentId: 'CMP003', name: 'Silica Gel Packets', supplier: 'DryGuard Corp', qtyAvail: 2000, unit: 'pcs', - costPerUnit: 0.10, + costPerUnit: 0.1, location: 'Shelf C3', reorderLevel: 500, leadTime: 4, @@ -70,10 +68,10 @@ export class InventoryDashboardComponent { batchIds: 'BATCHSIL104, BATCHSIL105', lotIds: 'LOTSIL792, LOTSIL793', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { - picture: 'assets/cottonBalls.png', // Path to image + picture: 'assets/cottonBalls.png', // Path to image componentId: 'CMP004', name: 'Cotton Balls', supplier: 'PureSoft Materials', @@ -91,16 +89,16 @@ export class InventoryDashboardComponent { batchIds: 'BATCHCTN106', lotIds: 'LOTCTN794', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { - picture: 'assets/bottles.png', // Path to image + picture: 'assets/bottles.png', // Path to image componentId: 'CMP005', name: 'Plastic Pill Bottles', supplier: 'PharmaContainer Ltd.', qtyAvail: 500, unit: 'pcs', - costPerUnit: 0.50, + costPerUnit: 0.5, location: 'Shelf E5', reorderLevel: 100, leadTime: 8, @@ -112,7 +110,7 @@ export class InventoryDashboardComponent { batchIds: 'BATCHBOT107', lotIds: 'LOTBOT795', backorderedQty: 50, - status: 'Backordered' - } + status: 'Backordered', + }, ]; } diff --git a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.html b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.html index c10ee3d..7bf0246 100644 --- a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.html +++ b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.html @@ -42,7 +42,14 @@

Raw Materials

- {{ item.name }} + + {{ item.name }} + {{ item.materialId }} {{ item.name }} {{ item.supplier }} @@ -97,7 +104,14 @@

Components

- {{ item.name }} + + {{ item.name }} + {{ item.componentId }} {{ item.name }} {{ item.supplier }} @@ -150,7 +164,14 @@

Works in Progress (WIP)

- {{ item.productName }} + + {{ item.productName }} + {{ item.wipId }} {{ item.productName }} {{ item.sku }} @@ -202,7 +223,14 @@

Finished Goods

- {{ item.productName }} + + {{ item.productName }} + {{ item.productName }} {{ item.sku }} {{ item.batchIds }} @@ -224,4 +252,4 @@

Finished Goods

- \ No newline at end of file + diff --git a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.scss b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.scss index e5fdb6a..71987bc 100644 --- a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.scss +++ b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.scss @@ -3,7 +3,8 @@ table { border-collapse: collapse; } -th, td { +th, +td { padding: 10px; text-align: left; border: 1px solid #ccc; @@ -13,7 +14,6 @@ img { border-radius: 4px; } - .inventory-table { display: flex; flex-direction: column; diff --git a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.ts b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.ts index 35da03b..97b5ac8 100644 --- a/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.ts +++ b/src/app/pages/inventory/components/inventory-items-table/inventory-items-table.component.ts @@ -43,7 +43,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { backorderedQty: 0, approvalStatus: 'Approved', receivedDate: new Date('2024-02-01'), - priceLastUpdated: new Date('2024-01-25') + priceLastUpdated: new Date('2024-01-25'), }, { picture: 'assets/manganeseSulfate.png', @@ -66,7 +66,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { backorderedQty: 10, approvalStatus: 'Pending', receivedDate: new Date('2024-01-10'), - priceLastUpdated: new Date('2024-01-05') + priceLastUpdated: new Date('2024-01-05'), }, { picture: 'assets/riboflavin.png', @@ -89,7 +89,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { backorderedQty: 5, approvalStatus: 'Approved', receivedDate: new Date('2024-02-15'), - priceLastUpdated: new Date('2024-02-01') + priceLastUpdated: new Date('2024-02-01'), }, { picture: 'assets/calciferol.png', @@ -112,8 +112,8 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { backorderedQty: 0, approvalStatus: 'Rejected', receivedDate: new Date('2024-03-05'), - priceLastUpdated: new Date('2024-03-01') - } + priceLastUpdated: new Date('2024-03-01'), + }, ]; components = [ { @@ -135,7 +135,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { batchIds: 'BATCHCAP101, BATCHCAP102', lotIds: 'LOTCAP789, LOTCAP790', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { picture: 'assets/labels.png', @@ -156,7 +156,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { batchIds: 'BATCHLBL103', lotIds: 'LOTLBL791', backorderedQty: 500, - status: 'Backordered' + status: 'Backordered', }, { picture: 'assets/silicaGel.png', @@ -165,7 +165,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { supplier: 'DryGuard Corp', qtyAvail: 2000, unit: 'pcs', - costPerUnit: 0.10, + costPerUnit: 0.1, location: 'Shelf C3', reorderLevel: 500, leadTime: 4, @@ -177,7 +177,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { batchIds: 'BATCHSIL104, BATCHSIL105', lotIds: 'LOTSIL792, LOTSIL793', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { picture: 'assets/cottonBalls.png', @@ -198,7 +198,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { batchIds: 'BATCHCTN106', lotIds: 'LOTCTN794', backorderedQty: 0, - status: 'In Stock' + status: 'In Stock', }, { picture: 'assets/bottles.png', @@ -207,7 +207,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { supplier: 'PharmaContainer Ltd.', qtyAvail: 500, unit: 'pcs', - costPerUnit: 0.50, + costPerUnit: 0.5, location: 'Shelf E5', reorderLevel: 100, leadTime: 8, @@ -219,13 +219,13 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { batchIds: 'BATCHBOT107', lotIds: 'LOTBOT795', backorderedQty: 50, - status: 'Backordered' - } + status: 'Backordered', + }, ]; - + wips = [ { - picture: 'assets/probioticCapsules.png', // Path to image + picture: 'assets/probioticCapsules.png', // Path to image wipId: 'WIP001', productName: 'Probiotic Capsules', sku: 'PROB-CAP-001', @@ -246,7 +246,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { status: 'In Progress', }, { - picture: 'assets/vitaminDPowder.png', // Path to image + picture: 'assets/vitaminDPowder.png', // Path to image wipId: 'WIP002', productName: 'Vitamin D Powder', sku: 'VITD-PWD-001', @@ -267,7 +267,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { status: 'Delayed', }, { - picture: 'assets/fishOilLiquid.png', // Path to image + picture: 'assets/fishOilLiquid.png', // Path to image wipId: 'WIP003', productName: 'Omega-3 Fish Oil', sku: 'FISH-OIL-001', @@ -286,18 +286,18 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { matsAllocated: 'Fish Oil Concentrate, Gelatin', assignee: 'Chris Lee', status: 'In Progress', - } + }, ]; finishedGoods = [ { - picture: 'assets/probioticCapsules.png', // Path to image + picture: 'assets/probioticCapsules.png', // Path to image productName: 'Probiotic Capsules', sku: 'PROB-CAP-001', batchIds: 'BATCHC123, BATCHC124', lotIds: 'LOT1011, LOT1012', qtyAvail: 5000, unit: 'capsules', - costPerUnit: 0.10, + costPerUnit: 0.1, sellingPrice: 0.25, location: 'Warehouse A1', expirationDate: new Date('2025-12-01'), @@ -306,10 +306,10 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { reservedForOrderIds: 'ORD789, ORD123', supplier: 'HealthPro Labs', orderAllocationDetails: 'Allocated for ORD789, partially fulfilled', - status: 'In Stock' + status: 'In Stock', }, { - picture: 'assets/vitaminDPowder.png', // Path to image + picture: 'assets/vitaminDPowder.png', // Path to image productName: 'Vitamin D Powder', sku: 'VITD-PWD-001', batchIds: 'BATCHD456', @@ -325,10 +325,10 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { reservedForOrderIds: 'ORD456', supplier: 'Sunshine Extracts', orderAllocationDetails: 'Reserved for ORD456', - status: 'Backordered' + status: 'Backordered', }, { - picture: 'assets/fishOilLiquid.png', // Path to image + picture: 'assets/fishOilLiquid.png', // Path to image productName: 'Omega-3 Fish Oil', sku: 'FISH-OIL-001', batchIds: 'BATCHF789', @@ -344,10 +344,10 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { reservedForOrderIds: 'ORD654, ORD987', supplier: 'OmegaLife Solutions', orderAllocationDetails: 'Allocated for ORD654, ORD987', - status: 'In Stock' - } + status: 'In Stock', + }, ]; - + @Input() dataSource: MatTableDataSource = new MatTableDataSource(); @Input() displayedColumns: string[] = []; @@ -368,7 +368,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { constructor( private inventoryService: InventoryService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { @@ -452,7 +452,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { private updateInventoryItem(parentId: string, item: InventoryItem) { this.inventoryService.updateInventoryItem(parentId, item).subscribe( () => this.refreshInventory(), - (error) => console.error('Error updating inventory item:', error), + (error) => console.error('Error updating inventory item:', error) ); } @@ -468,7 +468,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { // Call the delete method on the parent item's _id this.inventoryService.deleteInventoryItem(parentItem._id).subscribe( () => this.refreshInventory(), - (error) => console.error('Error deleting inventory item:', error), + (error) => console.error('Error deleting inventory item:', error) ); } else { console.error('Parent item not found for item ID:', item._id); @@ -489,7 +489,7 @@ export class InventoryItemsTableComponent implements OnInit, AfterViewInit { category.items.map((item: any) => ({ ...item, category: category.category, - })), + })) ); } } diff --git a/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.html b/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.html index 13d55c4..e9fcb16 100644 --- a/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.html +++ b/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.html @@ -1,5 +1,5 @@

- {{ data.inventoryItem ? "Edit Inventory Item" : "Create New Inventory Item" }} + {{ data.inventoryItem ? 'Edit Inventory Item' : 'Create New Inventory Item' }}

diff --git a/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.ts b/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.ts index 9e8ad39..8cb93c4 100644 --- a/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.ts +++ b/src/app/pages/inventory/components/new-inventory-dialog/new-inventory-dialog.component.ts @@ -22,7 +22,7 @@ export class NewInventoryDialogComponent implements OnInit { private vendorService: VendorsService, private inventoryService: InventoryService, - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: any ) { this.inventoryForm = this.fb.group({ vendor: ['', Validators.required], @@ -71,19 +71,19 @@ export class NewInventoryDialogComponent implements OnInit { response.filter((vendor) => vendor.displayName .toLowerCase() - .includes(searchTerm.toLowerCase()), - ), + .includes(searchTerm.toLowerCase()) + ) ); } else { console.log('No Vendor Data: ' + JSON.stringify(response)); } return of([]); - }), + }) ); } else { return of([]); } - }), + }) ) .subscribe((filteredVendors: Vendor[]) => { this.filteredVendors = filteredVendors; @@ -96,7 +96,7 @@ export class NewInventoryDialogComponent implements OnInit { debounceTime(300), switchMap((skuValue) => { if (skuValue) { - return this.inventoryService.checkSkuExists(skuValue); + return this.inventoryService.checkSkuExists(skuValue); } else { return of(null); } @@ -110,7 +110,7 @@ export class NewInventoryDialogComponent implements OnInit { } else { this.inventoryForm.get('sku')?.setErrors(null); } - }); + }); } onSubmit(event: Event): void { @@ -134,7 +134,7 @@ export class NewInventoryDialogComponent implements OnInit { }, (error) => { console.error('Error creating inventory item:', error); - }, + } ); } else { console.log('Error while saving'); diff --git a/src/app/pages/inventory/inventory.component.ts b/src/app/pages/inventory/inventory.component.ts index edfb2f9..ff687cc 100644 --- a/src/app/pages/inventory/inventory.component.ts +++ b/src/app/pages/inventory/inventory.component.ts @@ -30,7 +30,7 @@ export class InventoryComponent implements OnInit { constructor( private inventoryService: InventoryService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { @@ -59,13 +59,13 @@ export class InventoryComponent implements OnInit { } else { console.error( 'Expected an array in response.data, but got:', - response.data, + response.data ); } }, (error) => { console.error('Failed to fetch inventory:', error); // Error handling - }, + } ); } diff --git a/src/app/pages/inventory/inventory.service.ts b/src/app/pages/inventory/inventory.service.ts index 83ac329..96ac1e3 100644 --- a/src/app/pages/inventory/inventory.service.ts +++ b/src/app/pages/inventory/inventory.service.ts @@ -29,7 +29,7 @@ export class InventoryService { // Create a new inventory item addInventoryItem( - item: InventoryItem, + item: InventoryItem ): Observable> { return this.http.post>(this.apiUrl, item); } @@ -37,11 +37,11 @@ export class InventoryService { // Update an existing inventory item by ID updateInventoryItem( id: string, - item: InventoryItem, + item: InventoryItem ): Observable> { return this.http.put>( `${this.apiUrl}/${id}`, - item, + item ); } diff --git a/src/app/pages/logout/logout.component.ts b/src/app/pages/logout/logout.component.ts index 0e0391c..238811f 100644 --- a/src/app/pages/logout/logout.component.ts +++ b/src/app/pages/logout/logout.component.ts @@ -11,7 +11,7 @@ import { LogoutDialogComponent } from './logout-dialog/logout-dialog.component'; export class LogoutComponent implements OnInit { constructor( public dialog: MatDialog, - private router: Router, + private router: Router ) {} ngOnInit(): void { diff --git a/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.spec.ts b/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.spec.ts index adb20d7..0d4d038 100644 --- a/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.spec.ts +++ b/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.spec.ts @@ -59,7 +59,7 @@ describe('CreateFormulasComponent', () => { name: new FormControl(''), scientificName: new FormControl(''), perUnit: new FormControl(0), - }), + }) ); (component.formulaForm.get('inactiveIngredients') as FormArray).push( @@ -67,7 +67,7 @@ describe('CreateFormulasComponent', () => { name: new FormControl(''), scientificName: new FormControl(''), perUnit: new FormControl(0), - }), + }) ); }); @@ -93,14 +93,14 @@ describe('CreateFormulasComponent', () => { name: 'Melatonin', scientificName: 'N-Acetyl-5-Methoxytryptamine', perUnit: 5, - }), + }) ); activeIngredientsArray.push( formBuilder.group({ name: 'Valerian Root', scientificName: 'Valeriana Officinalis', perUnit: 50, - }), + }) ); const inactiveIngredientsArray = component.formulaForm.controls[ @@ -112,21 +112,21 @@ describe('CreateFormulasComponent', () => { name: 'Gelatin', scientificName: 'Gelatin', perUnit: 500, - }), + }) ); inactiveIngredientsArray.push( formBuilder.group({ name: 'Natural Flavors', scientificName: 'Natural Flavors', perUnit: 20, - }), + }) ); inactiveIngredientsArray.push( formBuilder.group({ name: 'Citric Acid', scientificName: 'Citric Acid', perUnit: 10, - }), + }) ); expect(component.formulaForm.valid).toBeTruthy(); // The form should be valid @@ -161,7 +161,7 @@ describe('CreateFormulasComponent', () => { }, { name: 'Citric Acid', scientificName: 'Citric Acid', perUnit: 10 }, ], - }), + }) ); }); }); diff --git a/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.ts b/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.ts index 3941044..ad6d689 100644 --- a/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.ts +++ b/src/app/pages/product-development/components/formulas/create-formulas/create-formulas.component.ts @@ -31,7 +31,7 @@ export class CreateFormulasComponent { constructor( private fb: FormBuilder, private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: any ) { this.formulaForm = this.fb.group({ code: [data?.code || ''], @@ -47,11 +47,11 @@ export class CreateFormulasComponent { // Populate the active and inactive ingredients FormArrays this.populateIngredients( 'activeIngredients', - data?.activeIngredients || [], + data?.activeIngredients || [] ); this.populateIngredients( 'inactiveIngredients', - data?.inactiveIngredients || [], + data?.inactiveIngredients || [] ); // Update unit options whenever the product type changes @@ -82,7 +82,7 @@ export class CreateFormulasComponent { ingredient.perUnit, [Validators.required, Validators.min(0)], ], - }), + }) ); }); } @@ -93,7 +93,7 @@ export class CreateFormulasComponent { name: ['', Validators.required], scientificName: ['', Validators.required], perUnit: [0, [Validators.required, Validators.min(0)]], - }), + }) ); } @@ -107,7 +107,7 @@ export class CreateFormulasComponent { name: ['', Validators.required], scientificName: ['', Validators.required], perUnit: [0, [Validators.required, Validators.min(0)]], - }), + }) ); } diff --git a/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.html b/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.html index 0ea840e..8334403 100644 --- a/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.html +++ b/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.html @@ -74,7 +74,7 @@

Formulas Summary

Created At - {{ element.createdAt | date: "short" }} + {{ element.createdAt | date: 'short' }} diff --git a/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.ts b/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.ts index c77be6c..de5e935 100644 --- a/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.ts +++ b/src/app/pages/product-development/components/formulas/list-formulas/list-formulas.component.ts @@ -52,7 +52,7 @@ export class ListFormulaComponent implements OnInit, AfterViewInit { constructor( private formulaService: ListFormulasService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { diff --git a/src/app/pages/product-development/components/product-skus/create-product-skus/create-product-skus.component.ts b/src/app/pages/product-development/components/product-skus/create-product-skus/create-product-skus.component.ts index da710b3..19a6e77 100644 --- a/src/app/pages/product-development/components/product-skus/create-product-skus/create-product-skus.component.ts +++ b/src/app/pages/product-development/components/product-skus/create-product-skus/create-product-skus.component.ts @@ -25,7 +25,7 @@ export class CreateProductSkusComponent implements OnInit { private productSkusService: ProductSkusService, private formulasService: ListFormulasService, private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: any ) { console.log('data:', data); this.productSkuForm = this.fb.group({ @@ -52,7 +52,7 @@ export class CreateProductSkusComponent implements OnInit { fetchFormulas(searchTerm: string = ''): void { this.formulasService.getFormulas().subscribe((formulas: any[]) => { this.filteredFormulas = formulas.filter((formula) => - formula.name.toLowerCase().includes(searchTerm.toLowerCase()), + formula.name.toLowerCase().includes(searchTerm.toLowerCase()) ); }); } @@ -64,7 +64,7 @@ export class CreateProductSkusComponent implements OnInit { onFormulaSelected(event: any): void { const selectedFormula = this.filteredFormulas.find( - (formula) => formula.name === event.option.value, + (formula) => formula.name === event.option.value ); this.productSkuForm.patchValue({ formula: selectedFormula._id }); } diff --git a/src/app/pages/product-development/components/product-skus/list-product-skus/list-product-skus.component.ts b/src/app/pages/product-development/components/product-skus/list-product-skus/list-product-skus.component.ts index ac7311c..0b56282 100644 --- a/src/app/pages/product-development/components/product-skus/list-product-skus/list-product-skus.component.ts +++ b/src/app/pages/product-development/components/product-skus/list-product-skus/list-product-skus.component.ts @@ -42,7 +42,7 @@ export class ListProductSkusComponent implements OnInit, AfterViewInit { constructor( private productSkusService: ProductSkusService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { diff --git a/src/app/pages/product-development/product-development-routing.module.ts b/src/app/pages/product-development/product-development-routing.module.ts index 40648a6..9816cb1 100644 --- a/src/app/pages/product-development/product-development-routing.module.ts +++ b/src/app/pages/product-development/product-development-routing.module.ts @@ -15,14 +15,14 @@ const routes: Routes = [ path: 'formulas', loadChildren: () => import('./components/formulas/formulas.module').then( - (m) => m.FormulasModule, + (m) => m.FormulasModule ), }, { path: 'product-skus', loadChildren: () => import('./components/product-skus/product-skus.module').then( - (m) => m.ProductSkusModule, + (m) => m.ProductSkusModule ), }, { diff --git a/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.html b/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.html index bd97c62..ea0c36a 100644 --- a/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.html +++ b/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.html @@ -1,5 +1,5 @@

- Batch Details: {{ batchForm.get("batchNumber")?.value }} + Batch Details: {{ batchForm.get('batchNumber')?.value }}

diff --git a/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.ts b/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.ts index b2c00c0..2122d76 100644 --- a/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.ts +++ b/src/app/pages/production/components/batch-records/batch-detail-dialog/batch-detail-dialog.component.ts @@ -29,7 +29,7 @@ export class BatchDetailDialogComponent implements OnInit { private usersService: UsersService, private authService: AuthService, private fb: FormBuilder, - private dialog: MatDialog, // Inject MatDialog + private dialog: MatDialog // Inject MatDialog ) { this.batchForm = this.fb.group({ batchNumber: [data.batch.batchNumber], diff --git a/src/app/pages/production/components/batch-records/create-batch-records/create-batch-records.component.ts b/src/app/pages/production/components/batch-records/create-batch-records/create-batch-records.component.ts index 0ef1ceb..de3699b 100644 --- a/src/app/pages/production/components/batch-records/create-batch-records/create-batch-records.component.ts +++ b/src/app/pages/production/components/batch-records/create-batch-records/create-batch-records.component.ts @@ -25,7 +25,7 @@ export class CreateBatchRecordsComponent implements OnInit { private productskuService: ProductSkusService, private formulasService: FormulasService, private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: any ) {} ngOnInit(): void { diff --git a/src/app/pages/production/components/batch-records/list-batch-records/list-batch-records.component.ts b/src/app/pages/production/components/batch-records/list-batch-records/list-batch-records.component.ts index c32bc66..f779d7e 100644 --- a/src/app/pages/production/components/batch-records/list-batch-records/list-batch-records.component.ts +++ b/src/app/pages/production/components/batch-records/list-batch-records/list-batch-records.component.ts @@ -40,7 +40,7 @@ export class ListBatchRecordsComponent implements OnInit { constructor( private batchRecordsService: BatchRecordsService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { @@ -68,7 +68,7 @@ export class ListBatchRecordsComponent implements OnInit { this.filteredBatchRecords = this.batchRecords.filter( (batch) => batch.batchNumber.toLowerCase().includes(filterValue) || - batch.productSKU.toLowerCase().includes(filterValue), + batch.productSKU.toLowerCase().includes(filterValue) ); } diff --git a/src/app/pages/production/production-routing.module.ts b/src/app/pages/production/production-routing.module.ts index 6194239..7bb6481 100644 --- a/src/app/pages/production/production-routing.module.ts +++ b/src/app/pages/production/production-routing.module.ts @@ -8,49 +8,49 @@ const routes: Routes = [ path: 'batch-records', loadChildren: () => import('./components/batch-records/batch-records.module').then( - (m) => m.BatchRecordsModule, + (m) => m.BatchRecordsModule ), }, { path: 'shifting-records', loadChildren: () => import('./components/shifting-records/shifting-records.module').then( - (m) => m.ShiftingRecordsModule, + (m) => m.ShiftingRecordsModule ), }, { path: 'depositor-records', loadChildren: () => import('./components/depositor-records/depositor-records.module').then( - (m) => m.DepositorRecordsModule, + (m) => m.DepositorRecordsModule ), }, { path: 'packaging-records', loadChildren: () => import('./components/packaging-records/packaging-records.module').then( - (m) => m.PackagingRecordsModule, + (m) => m.PackagingRecordsModule ), }, { path: 'mixing-records', loadChildren: () => import('./components/mixing-records/mixing-records.module').then( - (m) => m.MixingRecordsModule, + (m) => m.MixingRecordsModule ), }, { path: 'weighing-records', loadChildren: () => import('./components/weighing-records/weighing-records.module').then( - (m) => m.WeighingRecordsModule, + (m) => m.WeighingRecordsModule ), }, { path: 'bottling-records', loadChildren: () => import('./components/bottling-records/bottling-records.module').then( - (m) => m.BottlingRecordsModule, + (m) => m.BottlingRecordsModule ), }, { @@ -83,7 +83,7 @@ const routes: Routes = [ path: 'reporting', loadChildren: () => import('./components/reporting/reporting.module').then( - (m) => m.ReportingModule, + (m) => m.ReportingModule ), }, ]; diff --git a/src/app/pages/quality/quality-routing.module.ts b/src/app/pages/quality/quality-routing.module.ts index e98c6e6..b16fb0f 100644 --- a/src/app/pages/quality/quality-routing.module.ts +++ b/src/app/pages/quality/quality-routing.module.ts @@ -8,14 +8,14 @@ const routes: Routes = [ path: 'fda-audits', loadChildren: () => import('./components/fda-audits/fda-audits.module').then( - (m) => m.FdaAuditsModule, + (m) => m.FdaAuditsModule ), }, { path: 'quality-audits', loadChildren: () => import('./components/quality-audits/quality-audits.module').then( - (m) => m.QualityAuditsModule, + (m) => m.QualityAuditsModule ), }, ]; diff --git a/src/app/pages/sales/components/customers/components/customer-details-dialog/customer-details-dialog.component.ts b/src/app/pages/sales/components/customers/components/customer-details-dialog/customer-details-dialog.component.ts index a1184b6..794eb98 100644 --- a/src/app/pages/sales/components/customers/components/customer-details-dialog/customer-details-dialog.component.ts +++ b/src/app/pages/sales/components/customers/components/customer-details-dialog/customer-details-dialog.component.ts @@ -22,7 +22,7 @@ interface CustomerDetails { export class CustomerDetailsDialogComponent { constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: CustomerDetails, + @Inject(MAT_DIALOG_DATA) public data: CustomerDetails ) {} closeDialog(): void { diff --git a/src/app/pages/sales/components/customers/components/customer-form/customer-form.component.ts b/src/app/pages/sales/components/customers/components/customer-form/customer-form.component.ts index 4f001e8..2e5d295 100644 --- a/src/app/pages/sales/components/customers/components/customer-form/customer-form.component.ts +++ b/src/app/pages/sales/components/customers/components/customer-form/customer-form.component.ts @@ -64,7 +64,7 @@ export class CustomerFormComponent implements OnInit { brandCode: ['', [Validators.required, Validators.maxLength(3)]], brandPhoto: ['', Validators.required], brandWebsite: ['', Validators.required], - }), + }) ); } diff --git a/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.html b/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.html index 90b5d33..7d93817 100644 --- a/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.html +++ b/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.html @@ -237,67 +237,67 @@

Review Your Information

Company Name: - {{ customerForm.get("companyName")?.value }} + {{ customerForm.get('companyName')?.value }}

Display Name: - {{ customerForm.get("displayName")?.value }} + {{ customerForm.get('displayName')?.value }}

Primary Contact: - {{ customerForm.get("primaryContact.firstName")?.value }} - {{ customerForm.get("primaryContact.lastName")?.value }} + {{ customerForm.get('primaryContact.firstName')?.value }} + {{ customerForm.get('primaryContact.lastName')?.value }}

Email: - {{ customerForm.get("primaryContact.email")?.value }} + {{ customerForm.get('primaryContact.email')?.value }}

Phone: - {{ customerForm.get("primaryContact.phone")?.value }} + {{ customerForm.get('primaryContact.phone')?.value }}

Compliance Contact: - {{ customerForm.get("complianceContact.firstName")?.value }} - {{ customerForm.get("complianceContact.lastName")?.value }} + {{ customerForm.get('complianceContact.firstName')?.value }} + {{ customerForm.get('complianceContact.lastName')?.value }}

Email: - {{ customerForm.get("complianceContact.email")?.value }} + {{ customerForm.get('complianceContact.email')?.value }}

Phone: - {{ customerForm.get("complianceContact.phone")?.value }} + {{ customerForm.get('complianceContact.phone')?.value }}

Accounting Contact: - {{ customerForm.get("accountingContact.firstName")?.value }} - {{ customerForm.get("accountingContact.lastName")?.value }} + {{ customerForm.get('accountingContact.firstName')?.value }} + {{ customerForm.get('accountingContact.lastName')?.value }}

Email: - {{ customerForm.get("accountingContact.email")?.value }} + {{ customerForm.get('accountingContact.email')?.value }}

Phone: - {{ customerForm.get("accountingContact.phone")?.value }} + {{ customerForm.get('accountingContact.phone')?.value }}

- Website: {{ customerForm.get("website")?.value }} + Website: {{ customerForm.get('website')?.value }}

Business Address: - {{ customerForm.get("businessAddress.line1")?.value }}, - {{ customerForm.get("businessAddress.city")?.value }}, - {{ customerForm.get("businessAddress.state")?.value }}, - {{ customerForm.get("businessAddress.zip")?.value }} + {{ customerForm.get('businessAddress.line1')?.value }}, + {{ customerForm.get('businessAddress.city')?.value }}, + {{ customerForm.get('businessAddress.state')?.value }}, + {{ customerForm.get('businessAddress.zip')?.value }}

Fulfillment Address: - {{ customerForm.get("fulfillmentAddress.line1")?.value }}, - {{ customerForm.get("fulfillmentAddress.city")?.value }}, - {{ customerForm.get("fulfillmentAddress.state")?.value }}, - {{ customerForm.get("fulfillmentAddress.zip")?.value }} + {{ customerForm.get('fulfillmentAddress.line1')?.value }}, + {{ customerForm.get('fulfillmentAddress.city')?.value }}, + {{ customerForm.get('fulfillmentAddress.state')?.value }}, + {{ customerForm.get('fulfillmentAddress.zip')?.value }}

diff --git a/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.ts b/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.ts index 8c5655d..3113e76 100644 --- a/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.ts +++ b/src/app/pages/sales/components/customers/components/new-customer-dialog/new-customer-dialog.component.ts @@ -14,7 +14,7 @@ export class NewCustomerDialogComponent implements OnInit { constructor( private fb: FormBuilder, public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: any ) { this.customerForm = this.fb.group({ companyName: [data?.companyName || '', Validators.required], diff --git a/src/app/pages/sales/components/customers/customers.component.ts b/src/app/pages/sales/components/customers/customers.component.ts index 79daa65..19bfe47 100644 --- a/src/app/pages/sales/components/customers/customers.component.ts +++ b/src/app/pages/sales/components/customers/customers.component.ts @@ -46,7 +46,7 @@ export class CustomersComponent implements OnInit, AfterViewInit { constructor( private customerService: CustomerService, private authService: AuthService, - private dialog: MatDialog, + private dialog: MatDialog ) {} ngOnInit(): void { @@ -103,7 +103,7 @@ export class CustomersComponent implements OnInit, AfterViewInit { deleteCustomer(customer: Customer) { this.customerService.deleteCustomer(customer._id).subscribe( () => this.refreshCustomerData(), - (error) => console.error('Error deleting customer:', error), + (error) => console.error('Error deleting customer:', error) ); } diff --git a/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.html b/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.html index 28d4c75..d4c90ed 100644 --- a/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.html +++ b/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.html @@ -64,28 +64,28 @@

Product Name: - {{ quoteForm.get("productName")?.value }} + {{ quoteForm.get('productName')?.value }}

Bottles per Master Case: - {{ quoteForm.get("bottlesPerMasterCase")?.value }} + {{ quoteForm.get('bottlesPerMasterCase')?.value }}

Capsules per Bottle: - {{ quoteForm.get("capsulesPerBottle")?.value }} + {{ quoteForm.get('capsulesPerBottle')?.value }}

-

Bottles: {{ quoteForm.get("bottles")?.value }}

+

Bottles: {{ quoteForm.get('bottles')?.value }}

Capsules Needed For Order: - {{ quoteForm.get("capsulesNeededForOrder")?.value }} + {{ quoteForm.get('capsulesNeededForOrder')?.value }}

Setup Capsules: - {{ quoteForm.get("setupCapsules")?.value }} + {{ quoteForm.get('setupCapsules')?.value }}

Total Capsules Needed: - {{ quoteForm.get("totalCapsulesNeeded")?.value }} + {{ quoteForm.get('totalCapsulesNeeded')?.value }}

diff --git a/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.ts b/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.ts index 8422687..67d5e13 100644 --- a/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.ts +++ b/src/app/pages/sales/components/quotes/bom/bom-form/bom-form.component.ts @@ -12,7 +12,7 @@ export class BomFormComponent implements OnInit { constructor( private fb: FormBuilder, - private globalService: GlobalServiceService, + private globalService: GlobalServiceService ) { this.quoteForm = this.fb.group({ productName: ['Hangover Dog 50ct'], @@ -57,7 +57,7 @@ export class BomFormComponent implements OnInit { updateTotalCapsulesNeeded() { const setupCapsules = this.quoteForm.get('setupCapsules')?.value; const capsulesNeededForOrder = this.quoteForm.get( - 'capsulesNeededForOrder', + 'capsulesNeededForOrder' )?.value; const totalCapsulesNeeded = setupCapsules + capsulesNeededForOrder; diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.html b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.html index a72a41b..08e33d9 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.html +++ b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.html @@ -120,8 +120,8 @@

Ingredient Breakdown With MOQ

Summary -

Total Cost Per Bottle: {{ totalCostPerBottle | number: "1.4-4" }}

-

Total Cost: {{ totalCost | number: "1.4-4" }}

+

Total Cost Per Bottle: {{ totalCostPerBottle | number: '1.4-4' }}

+

Total Cost: {{ totalCost | number: '1.4-4' }}

diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.ts b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.ts index d1461be..6c6fec7 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.ts +++ b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-with-moq/ingredient-breakdown-with-moq.component.ts @@ -28,7 +28,7 @@ export class IngredientBreakdownWithMoqComponent implements OnInit { constructor( private fb: FormBuilder, - private globalService: GlobalServiceService, + private globalService: GlobalServiceService ) { this.breakdownForm = this.fb.group({ search: [''], diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.html b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.html index 7817e03..e4f9e2c 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.html +++ b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.html @@ -115,7 +115,7 @@

Ingredient Breakdown Without MOQ

Summary -

Total Cost Per Bottle: {{ totalCostPerBottle | number: "1.4-4" }}

+

Total Cost Per Bottle: {{ totalCostPerBottle | number: '1.4-4' }}

diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.ts b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.ts index a24bed9..70b32b4 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.ts +++ b/src/app/pages/sales/components/quotes/bom/ingredient-breakdown-without-moq/ingredient-breakdown-without-moq.component.ts @@ -26,7 +26,7 @@ export class IngredientBreakdownWithoutMoqComponent implements OnInit { constructor( private fb: FormBuilder, - private globalService: GlobalServiceService, + private globalService: GlobalServiceService ) { this.breakdownForm = this.fb.group({ search: [''], diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.html b/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.html index ddd4682..33ede67 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.html +++ b/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.html @@ -34,7 +34,7 @@ Ingredient - {{ ingredient.get("name").value }} + {{ ingredient.get('name').value }} @@ -43,7 +43,7 @@ Per Capsule (mg) - {{ ingredient.get("perCapsule").value }} + {{ ingredient.get('perCapsule').value }} @@ -52,21 +52,21 @@ NFG Target Capsule (mg) - {{ ingredient.get("nfgTargetCapsule").value }} + {{ ingredient.get('nfgTargetCapsule').value }} Per Bottle - {{ ingredient.get("perBottle").value }} + {{ ingredient.get('perBottle').value }} mg/bottle - {{ ingredient.get("mgPerBottle").value }} + {{ ingredient.get('mgPerBottle').value }} @@ -75,7 +75,7 @@ Total mg needed - {{ ingredient.get("totalMgNeeded").value }} + {{ ingredient.get('totalMgNeeded').value }} @@ -84,14 +84,14 @@ Conversion to kg - {{ ingredient.get("conversionToKg").value }} + {{ ingredient.get('conversionToKg').value }} % of total KG - {{ ingredient.get("percentOfTotalKg").value }} + {{ ingredient.get('percentOfTotalKg').value }} @@ -100,14 +100,14 @@ Extra Kg of Waste (8kg) - {{ ingredient.get("extraKgOfWaste").value }} + {{ ingredient.get('extraKgOfWaste').value }} Total KG - {{ ingredient.get("totalKg").value }} + {{ ingredient.get('totalKg').value }} @@ -116,7 +116,7 @@ Extra Kg of Waste (8kg) in Mg - {{ ingredient.get("extraKgOfWasteMg").value }} + {{ ingredient.get('extraKgOfWasteMg').value }} @@ -125,7 +125,7 @@ Extra Mg to Bottle - {{ ingredient.get("extraMgToBottle").value }} + {{ ingredient.get('extraMgToBottle').value }} @@ -134,7 +134,7 @@ Intentional Overages (%) - {{ ingredient.get("intentionalOverages").value }} + {{ ingredient.get('intentionalOverages').value }} diff --git a/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.ts b/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.ts index ac44cc0..098e578 100644 --- a/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.ts +++ b/src/app/pages/sales/components/quotes/bom/ingredient-calculation/ingredient-calculation.component.ts @@ -35,7 +35,7 @@ export class IngredientCalculationComponent implements OnInit { constructor( private fb: FormBuilder, - private globalService: GlobalServiceService, + private globalService: GlobalServiceService ) { this.ingredientForm = this.fb.group({ ingredients: this.fb.array([]), @@ -76,7 +76,7 @@ export class IngredientCalculationComponent implements OnInit { extraKgOfWasteMg: [{ value: 0, disabled: true }], extraMgToBottle: [{ value: 0, disabled: true }], intentionalOverages: [{ value: 0, disabled: true }], - }), + }) ); }); this.calculateSummary(); @@ -106,7 +106,7 @@ export class IngredientCalculationComponent implements OnInit { totalMgNeeded: this.toFixed(totalMgNeeded, 4), conversionToKg: this.toFixed(conversionToKg, 4), }, - { emitEvent: false }, + { emitEvent: false } ); totalKgBeforeWaste += conversionToKg; @@ -139,7 +139,7 @@ export class IngredientCalculationComponent implements OnInit { extraMgToBottle: this.toFixed(extraMgToBottle, 4), intentionalOverages: this.toFixed(intentionalOverages, 4), }, - { emitEvent: false }, + { emitEvent: false } ); totalKg += totalKgValue; diff --git a/src/app/pages/sales/components/quotes/bom/package-breakdown/package-breakdown.component.ts b/src/app/pages/sales/components/quotes/bom/package-breakdown/package-breakdown.component.ts index 4c346bb..09bd77f 100644 --- a/src/app/pages/sales/components/quotes/bom/package-breakdown/package-breakdown.component.ts +++ b/src/app/pages/sales/components/quotes/bom/package-breakdown/package-breakdown.component.ts @@ -150,7 +150,7 @@ export class PackageBreakdownComponent implements OnInit { .trim() .toLowerCase(); this.filteredDataSource = this.dataSource.filter((item) => - item.item.toLowerCase().includes(filterValue), + item.item.toLowerCase().includes(filterValue) ); this.calculateSummary(); } @@ -158,11 +158,11 @@ export class PackageBreakdownComponent implements OnInit { calculateSummary(): void { this.totalCostPerBottle = this.filteredDataSource.reduce( (acc, curr) => acc + curr.costPerBottle, - 0, + 0 ); this.totalCostPerOrder = this.filteredDataSource.reduce( (acc, curr) => acc + curr.costPerOrder, - 0, + 0 ); } @@ -175,7 +175,7 @@ export class PackageBreakdownComponent implements OnInit { // Implement delete logic here this.dataSource = this.dataSource.filter((item) => item !== element); this.filteredDataSource = this.filteredDataSource.filter( - (item) => item !== element, + (item) => item !== element ); this.calculateSummary(); console.log('Delete item:', element); diff --git a/src/app/pages/sales/components/quotes/bom/sales-analysis/sales-analysis.component.ts b/src/app/pages/sales/components/quotes/bom/sales-analysis/sales-analysis.component.ts index a35b45b..9f55f64 100644 --- a/src/app/pages/sales/components/quotes/bom/sales-analysis/sales-analysis.component.ts +++ b/src/app/pages/sales/components/quotes/bom/sales-analysis/sales-analysis.component.ts @@ -73,7 +73,7 @@ export class SalesAnalysisComponent implements OnInit { price: [0, Validators.required], salesVolume: [0, Validators.required], revenue: [{ value: 0, disabled: true }], - }), + }) ); } @@ -126,7 +126,7 @@ export class SalesAnalysisComponent implements OnInit { (item) => item.price.toString().includes(filterValue) || item.salesVolume.toString().includes(filterValue) || - item.revenue.toString().includes(filterValue), + item.revenue.toString().includes(filterValue) ); } diff --git a/src/app/pages/sales/components/quotes/info/bottle-info/bottle-info.component.ts b/src/app/pages/sales/components/quotes/info/bottle-info/bottle-info.component.ts index d751d32..3eab7de 100644 --- a/src/app/pages/sales/components/quotes/info/bottle-info/bottle-info.component.ts +++ b/src/app/pages/sales/components/quotes/info/bottle-info/bottle-info.component.ts @@ -231,7 +231,7 @@ export class BottleInfoComponent implements OnInit { updateForm(part: string): void { this.selectedBottle = this.bottleParts.find( - (bottle) => bottle.value === part, + (bottle) => bottle.value === part ); if (this.selectedBottle) { this.bottleInfoForm.patchValue({ diff --git a/src/app/pages/sales/components/quotes/info/closure-info/closure-info.component.ts b/src/app/pages/sales/components/quotes/info/closure-info/closure-info.component.ts index 8724c67..6993922 100644 --- a/src/app/pages/sales/components/quotes/info/closure-info/closure-info.component.ts +++ b/src/app/pages/sales/components/quotes/info/closure-info/closure-info.component.ts @@ -177,7 +177,7 @@ export class ClosureInfoComponent implements OnInit { updateForm(part: string): void { this.selectedClosure = this.closureParts.find( - (closure) => closure.value === part, + (closure) => closure.value === part ); if (this.selectedClosure) { this.closureInfoForm.patchValue({ diff --git a/src/app/pages/sales/components/quotes/info/order-costs/order-costs.component.html b/src/app/pages/sales/components/quotes/info/order-costs/order-costs.component.html index 1ab296a..a1f5445 100644 --- a/src/app/pages/sales/components/quotes/info/order-costs/order-costs.component.html +++ b/src/app/pages/sales/components/quotes/info/order-costs/order-costs.component.html @@ -26,12 +26,12 @@
NGF COST (per bottle): - {{ orderCostForm.get("ngfCostPerBottle")?.value }} + {{ orderCostForm.get('ngfCostPerBottle')?.value }}
Customer Sale Price (per bottle): {{ - orderCostForm.get("customerSalePricePerBottle")?.value + orderCostForm.get('customerSalePricePerBottle')?.value }}
diff --git a/src/app/pages/sales/components/quotes/info/other-components/other-components.component.ts b/src/app/pages/sales/components/quotes/info/other-components/other-components.component.ts index 86684bb..92bc092 100644 --- a/src/app/pages/sales/components/quotes/info/other-components/other-components.component.ts +++ b/src/app/pages/sales/components/quotes/info/other-components/other-components.component.ts @@ -100,7 +100,7 @@ export class OtherComponentsComponent implements OnInit { silicaCost: (this.silicaDetails[value.silica] || {}).cost, cottonCost: (this.cottonDetails[value.cotton] || {}).cost, }, - { emitEvent: false }, + { emitEvent: false } ); } diff --git a/src/app/pages/sales/components/quotes/ingredients/ingredients-info/ingredients-info.component.ts b/src/app/pages/sales/components/quotes/ingredients/ingredients-info/ingredients-info.component.ts index c44e606..8160e42 100644 --- a/src/app/pages/sales/components/quotes/ingredients/ingredients-info/ingredients-info.component.ts +++ b/src/app/pages/sales/components/quotes/ingredients/ingredients-info/ingredients-info.component.ts @@ -24,10 +24,10 @@ export class IngredientsInfoComponent implements OnInit { constructor( private fb: FormBuilder, - private globalService: GlobalServiceService, + private globalService: GlobalServiceService ) { this.dataSource = new MatTableDataSource( - this.globalService.getIngredients(), + this.globalService.getIngredients() ); this.ingredientForm = this.fb.group({ @@ -70,7 +70,7 @@ export class IngredientsInfoComponent implements OnInit { const formValue = this.ingredientForm.value; const ingredients = this.globalService.getIngredients(); const existingIngredientIndex = ingredients.findIndex( - (ing) => ing.name === formValue.name, + (ing) => ing.name === formValue.name ); if (existingIngredientIndex >= 0) { ingredients[existingIngredientIndex] = formValue; diff --git a/src/app/pages/sales/components/quotes/ingredients/supplement-facts-details/supplement-facts-details.component.html b/src/app/pages/sales/components/quotes/ingredients/supplement-facts-details/supplement-facts-details.component.html index 6612885..cd84e70 100644 --- a/src/app/pages/sales/components/quotes/ingredients/supplement-facts-details/supplement-facts-details.component.html +++ b/src/app/pages/sales/components/quotes/ingredients/supplement-facts-details/supplement-facts-details.component.html @@ -106,30 +106,30 @@

Supplement Facts Details

Suggested Use / Directions: - {{ detailsForm.get("directions")?.value }} + {{ detailsForm.get('directions')?.value }}

- Allergens: {{ detailsForm.get("allergens")?.value }} + Allergens: {{ detailsForm.get('allergens')?.value }}

- Gluten Free: {{ detailsForm.get("glutenFree")?.value }} + Gluten Free: {{ detailsForm.get('glutenFree')?.value }}

Vegan Friendly: - {{ detailsForm.get("veganFriendly")?.value }} + {{ detailsForm.get('veganFriendly')?.value }}

-

Warnings: {{ detailsForm.get("warnings")?.value }}

+

Warnings: {{ detailsForm.get('warnings')?.value }}

Warning Instructions: - {{ detailsForm.get("warningInstructions")?.value }} + {{ detailsForm.get('warningInstructions')?.value }}

Storage Requirements: - {{ detailsForm.get("storageRequirements")?.value }} + {{ detailsForm.get('storageRequirements')?.value }}

Storage Instructions: - {{ detailsForm.get("storageInstructions")?.value }} + {{ detailsForm.get('storageInstructions')?.value }}

diff --git a/src/app/pages/sales/components/quotes/ingredients/supplement-facts-only/supplement-facts-only.component.ts b/src/app/pages/sales/components/quotes/ingredients/supplement-facts-only/supplement-facts-only.component.ts index 37cab11..daa8b1d 100644 --- a/src/app/pages/sales/components/quotes/ingredients/supplement-facts-only/supplement-facts-only.component.ts +++ b/src/app/pages/sales/components/quotes/ingredients/supplement-facts-only/supplement-facts-only.component.ts @@ -134,7 +134,7 @@ export class supplementFactsOnlyComponent implements OnInit { onSubmit() { const formValue = this.factForm.value; const existingFactIndex = this.facts.findIndex( - (f) => f.ingredient === formValue.ingredient, + (f) => f.ingredient === formValue.ingredient ); if (existingFactIndex >= 0) { this.facts[existingFactIndex] = formValue; diff --git a/src/app/pages/sales/components/quotes/quotes-routing.module.ts b/src/app/pages/sales/components/quotes/quotes-routing.module.ts index a2d6dd8..f0e2267 100644 --- a/src/app/pages/sales/components/quotes/quotes-routing.module.ts +++ b/src/app/pages/sales/components/quotes/quotes-routing.module.ts @@ -17,7 +17,7 @@ const routes: Routes = [ path: 'ingredients', loadChildren: () => import('./ingredients/ingredients.module').then( - (m) => m.IngredientsModule, + (m) => m.IngredientsModule ), }, { diff --git a/src/app/pages/sales/sales-routing.module.ts b/src/app/pages/sales/sales-routing.module.ts index 550486e..3de7da9 100644 --- a/src/app/pages/sales/sales-routing.module.ts +++ b/src/app/pages/sales/sales-routing.module.ts @@ -13,7 +13,7 @@ const routes: Routes = [ path: 'customers', loadChildren: () => import('./components/customers/customers.module').then( - (m) => m.CustomersModule, + (m) => m.CustomersModule ), }, { diff --git a/src/app/pages/users/login/login.component.html b/src/app/pages/users/login/login.component.html index f4fe7fd..63a189a 100644 --- a/src/app/pages/users/login/login.component.html +++ b/src/app/pages/users/login/login.component.html @@ -30,6 +30,7 @@ Password is required + Password must be at least 6 characters diff --git a/src/app/pages/users/login/login.component.ts b/src/app/pages/users/login/login.component.ts index 3f9b5a6..96c1f4e 100644 --- a/src/app/pages/users/login/login.component.ts +++ b/src/app/pages/users/login/login.component.ts @@ -25,7 +25,7 @@ export class LoginComponent { constructor( private authService: AuthService, - private router: Router, + private router: Router ) {} onSubmit() { diff --git a/src/app/pages/users/signup/register.component.html b/src/app/pages/users/signup/register.component.html index fc7a0ed..615251e 100644 --- a/src/app/pages/users/signup/register.component.html +++ b/src/app/pages/users/signup/register.component.html @@ -45,19 +45,67 @@ + + Username + + + Username is required + + + First Name + + First name is required + Last Name + + Last name is required + + + + + Role + + + Role is required + + + + + Department + + + Department is required + Phone Number - + + + Phone Number is required + + + + + Status +