diff --git a/.codeql-config.yml b/.codeql-config.yml new file mode 100644 index 0000000..6a247ac --- /dev/null +++ b/.codeql-config.yml @@ -0,0 +1,5 @@ +excludes: + - automation-testing/** + - node_modules/** + - **/dist/** + - **/build/** diff --git a/.github/TESTING_ACTIONS_LOCALLY.md b/.github/TESTING_ACTIONS_LOCALLY.md new file mode 100644 index 0000000..db65601 --- /dev/null +++ b/.github/TESTING_ACTIONS_LOCALLY.md @@ -0,0 +1,264 @@ +# Testing GitHub Actions Locally + +This guide explains how to test GitHub Actions workflows locally using `act`, focusing on our Bruno lint workflow. + +## Quick Reference + +```powershell +# Test Bruno lint workflow +cd certification-testing +act pull_request --artifact-server-path ./local-artifacts + +# Direct linter test (fastest) +cd bruno; npm run lint:bru + +# Check workflow syntax +act --list +``` + +## Table of Contents + +- [Prerequisites](#prerequisites) +- [Installing Act](#installing-act) +- [Basic Usage](#basic-usage) +- [Testing Our Bruno Lint Workflow](#testing-our-bruno-lint-workflow) +- [Understanding Artifacts](#understanding-artifacts) +- [Common Issues & Solutions](#common-issues--solutions) +- [Alternative Testing Methods](#alternative-testing-methods) + +## Prerequisites + +- Docker Desktop installed and running +- PowerShell or Command Prompt +- Access to this repository + +## Installing Act + +### Option 1: Using Scoop (Recommended for Windows) + +```powershell +scoop install act +``` + +### Option 2: Using Chocolatey + +```powershell +choco install act-cli +``` + +### Option 3: Manual Installation + +1. Download the latest release from [nektos/act releases](https://github.com/nektos/act/releases) +2. Extract to a directory in your PATH +3. Verify installation: `act --version` + +## Basic Usage + +### Test All Workflows + +```powershell +act +``` + +### Test Specific Events + +```powershell +act pull_request # Simulate PR events +act push # Simulate push events +``` + +### Test Specific Workflows + +```powershell +act pull_request -W .github/workflows/on-pullrequest-lint-bruno.yml +``` + +## Testing Our Bruno Lint Workflow + +### Method 1: Full Workflow Test (Recommended) + +```powershell +# Navigate to repository root +cd "C:\path\to\certification-testing" + +# Run the Bruno lint workflow with artifact support +act pull_request --artifact-server-path ./local-artifacts +``` + +**What happens:** + +- ✅ Checkout repository files +- ✅ Set up Node.js 20 +- ✅ Install npm dependencies +- ✅ Run Bruno linter with JSON output +- ✅ Upload lint report to local artifact server +- ❌ PR comment step fails (expected - needs GitHub token) + +### Method 2: Core Steps Only (Faster) + +```powershell +# Skip GitHub-specific steps that require authentication +act pull_request --artifact-server-path ./local-artifacts --skip-job comment +``` + +### Method 3: Manual Validation (Simplest) + +```powershell +# Navigate to bruno directory +cd bruno + +# Run the exact same steps as the workflow +npm ci --no-audit --no-fund +node scripts/lint-bruno.cjs --json > lint-report.json + +# Check results +$errors = (Get-Content lint-report.json | ConvertFrom-Json).summary.errors +if ($errors -eq 0) { + Write-Host "✅ Workflow would PASS (no errors)" +} else { + Write-Host "❌ Workflow would FAIL ($errors errors)" +} +``` + +## Understanding Artifacts + +### What is `--artifact-server-path`? + +GitHub Actions workflows often upload artifacts (files) for later use or download. When testing locally, `act` needs somewhere to store these files. + +**Without this flag:** + +```markdown +❌ Error: Unable to get the ACTIONS_RUNTIME_TOKEN env variable +``` + +**With this flag:** + +```markdown +✅ Artifact bruno-lint-report has been successfully uploaded! +``` + +### Artifact Server Options + +```powershell +# Store artifacts in temporary directory +act pull_request --artifact-server-path /tmp/artifacts + +# Store artifacts in project directory +act pull_request --artifact-server-path ./local-artifacts + +# Skip artifact steps entirely +act pull_request --skip-job upload-lint-report +``` + +## Common Issues & Solutions + +### 1. Docker Not Running + +**Error:** `Cannot connect to the Docker daemon` +**Solution:** Start Docker Desktop + +### 2. GitHub Token Required + +**Error:** `Input required and not supplied: github-token` +**Solution:** This is expected for PR comment steps. Use `--skip-job` or ignore the error. + +### 3. Path Issues in Container + +**Error:** Linter shows 0 files scanned +**Solution:** The workflow is working correctly; Docker context may differ from local paths. + +### 4. Permission Errors + +**Error:** `Permission denied` on artifact paths +**Solution:** Use relative paths like `./local-artifacts` instead of `/tmp/artifacts` + +### 5. Workflow Not Found + +**Error:** `unable to find workflows` +**Solution:** Ensure you're in the repository root directory + +## Alternative Testing Methods + +### 1. Direct Linter Execution + +```powershell +cd bruno +npm install +npm run lint:bru # Human-readable output +npm run lint:bru:json # JSON output (same as workflow) +``` + +### 2. Pre-commit Hook Testing + +The linter runs automatically on git commits via `simple-git-hooks`: + +```powershell +git add . +git commit -m "Test commit" # Linter runs automatically +``` + +### 3. VS Code Extension + +Install the GitHub Actions extension for VS Code to validate workflow syntax. + +## Workflow Success Criteria + +### Bruno Lint Workflow Passes When + +- ✅ All `.bru` files have valid syntax +- ✅ No ERROR-level issues found +- ✅ Warnings are allowed (non-blocking) + +### Common Validation Rules + +1. **Meta blocks** required for request files with HTTP verbs +2. **Query parameters** recommended when URL contains `?` +3. **Descriptor URIs** should not be hardcoded in validation files +4. **Array/object assertions** should be consistent +5. **Variable tokens** required when using `validateDependency` +6. **Mutating verbs** forbidden in read-only "Check" files +7. **pickSingle usage** should match array assertions +8. **encodeUrl setting** required (either `true` or `false`) + +## Troubleshooting Tips + +### Check Workflow Status + +```powershell +# View workflow file +Get-Content .github/workflows/lint-bruno.yml + +# Check for syntax issues +act --list +``` + +### Debug Output + +```powershell +# Verbose output +act pull_request --verbose + +# Dry run (don't execute) +act pull_request --dry-run +``` + +### Manual Step Recreation + +If `act` fails, recreate workflow steps manually: + +1. **Setup:** Install Node.js 20 +2. **Dependencies:** `npm ci --no-audit --no-fund` +3. **Lint:** `node scripts/lint-bruno.cjs --json` +4. **Validate:** Check for `errors: 0` in output + +## Additional Resources + +- [Act Documentation](https://github.com/nektos/act) +- [GitHub Actions Documentation](https://docs.github.com/en/actions) +- [Bruno Documentation](https://docs.usebruno.com/) +- [Repository Bruno README](../bruno/README.md) + +--- +**Last Updated:** October 27, 2025 +**Applies to:** Bruno Lint Workflow (`on-pullrequest-lint-bruno.yml`) diff --git a/.github/workflows/bidi-config.json b/.github/workflows/bidi-config.json new file mode 100644 index 0000000..3c4ef47 --- /dev/null +++ b/.github/workflows/bidi-config.json @@ -0,0 +1,6 @@ +{ + "exclude": [ + ".git/**", + ".bruno/node_modules/**" + ] +} diff --git a/.github/workflows/on-pullrequest-bidi-scan.yml b/.github/workflows/on-pullrequest-bidi-scan.yml new file mode 100644 index 0000000..90b12c8 --- /dev/null +++ b/.github/workflows/on-pullrequest-bidi-scan.yml @@ -0,0 +1,16 @@ +name: CodeQL Analysis on Pull Request + +on: + pull_request: + paths: + - '.github/**/*.yml' + - '.github/workflows/on-pullrequest-bidi-scan.yml' + +permissions: read-all + +jobs: + scan-actions-bidi: + name: Scan Actions, scan all files for BIDI Trojan Attacks + uses: ed-fi-alliance-oss/ed-fi-actions/.github/workflows/repository-scanner.yml@main + with: + config-file-path: ./.github/workflows/bidi-config.json diff --git a/.github/workflows/on-pullrequest-codeql-analysis.yml b/.github/workflows/on-pullrequest-codeql-analysis.yml new file mode 100644 index 0000000..55a3b8c --- /dev/null +++ b/.github/workflows/on-pullrequest-codeql-analysis.yml @@ -0,0 +1,29 @@ +name: CodeQL Analysis on Pull Request + +on: + pull_request: + paths: + - 'scripts/**' + - 'bruno/**' + - '.github/workflows/on-pullrequest-codeql-analysis.yml' + push: + branches: [ main ] + +jobs: + analyze: + name: CodeQL Analysis + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + + - name: Initialize CodeQL + uses: github/codeql-action/init@fdbfb4d2750291e159f0156def62b853c2798ca2 # V4.31.5 + with: + languages: javascript + + - name: Autobuild + uses: github/codeql-action/autobuild@fdbfb4d2750291e159f0156def62b853c2798ca2 # V4.31.5 + + - name: Run CodeQL + uses: github/codeql-action/analyze@fdbfb4d2750291e159f0156def62b853c2798ca2 # V4.31.5 diff --git a/bruno/.github/workflows/lint-bruno.yml b/.github/workflows/on-pullrequest-lint-bruno.yml similarity index 75% rename from bruno/.github/workflows/lint-bruno.yml rename to .github/workflows/on-pullrequest-lint-bruno.yml index b13e091..71b4c4e 100644 --- a/bruno/.github/workflows/lint-bruno.yml +++ b/.github/workflows/on-pullrequest-lint-bruno.yml @@ -1,20 +1,20 @@ -name: Bruno Lint +name: Bruno Lint on Pull Request on: pull_request: paths: - - '**/*.bru' - - 'scripts/lint-bruno.cjs' - - 'package.json' - - '.github/workflows/lint-bruno.yml' + - 'bruno/**/*.bru' + - 'bruno/scripts/lint-bruno.cjs' + - 'bruno/package.json' + - '.github/workflows/on-pullrequest-lint-bruno.yml' push: branches: [ main, master ] paths: - - 'scripts/lint-bruno.cjs' + - 'bruno/scripts/lint-bruno.cjs' permissions: contents: read - pull-requests: read + pull-requests: write jobs: lint: @@ -24,10 +24,10 @@ jobs: working-directory: ./bruno steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Use Node.js 20 - uses: actions/setup-node@v4 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 #6.0.0 with: node-version: 20 cache: 'npm' @@ -49,7 +49,7 @@ jobs: fi - name: Upload lint report artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 #v5.0.0 with: name: bruno-lint-report path: bruno/lint-report.json @@ -57,8 +57,9 @@ jobs: - name: Comment summary on PR if: github.event_name == 'pull_request' - uses: actions/github-script@v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: + github-token: ${{ secrets.GITHUB_TOKEN }} script: | const fs = require('fs'); const report = JSON.parse(fs.readFileSync('bruno/lint-report.json','utf8')); diff --git a/.github/workflows/on-pullrequest-run-tests.yml b/.github/workflows/on-pullrequest-run-tests.yml new file mode 100644 index 0000000..7f42188 --- /dev/null +++ b/.github/workflows/on-pullrequest-run-tests.yml @@ -0,0 +1,134 @@ +name: QA Tests on Pull Request + +on: + pull_request: + paths: + - 'scripts/run-scenarios.cjs' + - 'bruno/Tests/**' + - 'bruno/SIS/**' + - '.github/workflows/on-pullrequest-run-tests.yml' + push: + branches: [ main ] + paths: + - 'scripts/run-scenarios.cjs' + - 'bruno/Tests/**' + - 'bruno/SIS/**' + workflow_dispatch: + inputs: + env: + description: 'Bruno environment name (default ci.ed-fi.org)' + required: false + default: 'ci.ed-fi.org' + includeSteps: + description: 'Include detailed steps in aggregate summary' + required: false + default: 'false' + +permissions: + contents: read + pull-requests: write + actions: read + +concurrency: + group: qa-scenarios-${{ github.ref }} + cancel-in-progress: true + +jobs: + qa: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + + - name: Use Node.js 20 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 #6.0.0 + with: + node-version: 20 + cache: 'npm' + cache-dependency-path: bruno/package-lock.json + + - name: Mask client secret (if present) + run: | + if [ -f bruno/Tests/environments/ci.ed-fi.org.bru ]; then + SECRET_LINE=$(grep -E 'edFiClientSecret:' bruno/Tests/environments/ci.ed-fi.org.bru || true) + if [ -n "$SECRET_LINE" ]; then + SECRET_VAL=$(echo "$SECRET_LINE" | sed -E 's/.*edFiClientSecret:\s*([^ ]+)/\1/') + echo "::add-mask::$SECRET_VAL" + fi + fi + + - name: Run QA Scenarios + id: runqa + env: + BRUNO_ENV: ${{ github.event.inputs.env || 'ci.ed-fi.org' }} + INCLUDE_STEPS: ${{ github.event.inputs.includeSteps || 'false' }} + run: | + set -e + INCLUDE_FLAG="" + if [ "$INCLUDE_STEPS" = "true" ]; then INCLUDE_FLAG="--include-steps"; fi + node scripts/run-scenarios.cjs --env "$BRUNO_ENV" $INCLUDE_FLAG || EXIT=$? + # Preserve non-zero exit for later; script already writes summary.json + if [ -n "$EXIT" ]; then echo "exit_code=$EXIT" >> $GITHUB_OUTPUT; else echo "exit_code=0" >> $GITHUB_OUTPUT; fi + + - name: Show aggregate summary + if: always() + run: | + if [ -f automation-testing/results/summary.json ]; then + cat automation-testing/results/summary.json | jq '.' || cat automation-testing/results/summary.json + else + echo "summary.json not found" + fi + + - name: Upload QA artifacts + if: always() + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 #v5.0.0 + with: + name: qa-scenarios-results + path: | + automation-testing/results/summary.json + automation-testing/results/*.json + automation-testing/results/last-output.txt + if-no-files-found: warn + + - name: Comment summary on PR + if: github.event_name == 'pull_request' + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const summaryPath = 'automation-testing/results/summary.json'; + if (!fs.existsSync(summaryPath)) { + github.rest.issues.createComment({ + issue_number: context.payload.pull_request.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: ':warning: QA Scenarios did not produce a summary.json file.' + }); + } else { + const data = JSON.parse(fs.readFileSync(summaryPath,'utf8')); + const lines = []; + lines.push('### QA Scenarios Summary'); + lines.push(`Status: **${data.exitStatus}**`); + lines.push(`Entities Processed: **${data.totals.entitiesProcessed}**`); + lines.push(`Assertions: Passed **${data.totals.assertionsPassed}**, Failed **${data.totals.assertionsFailed}**, Total **${data.totals.assertionsTotal}**`); + if (data.entities) { + lines.push(''); + lines.push('| Entity | Passed | Failed | Total |'); + lines.push('|--------|--------|--------|-------|'); + for (const e of data.entities) { + const a = e.assertions; lines.push(`| ${e.entity} | ${a.passed} | ${a.failed} | ${a.total} |`); + } + } + github.rest.issues.createComment({ + issue_number: context.payload.pull_request.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: lines.join('\n') + }); + } + + - name: Fail if scenarios failed + if: steps.runqa.outputs.exit_code != '0' + run: | + echo "Scenario script exited with code ${EXIT_CODE}"; exit 1 diff --git a/.gitignore b/.gitignore index 3be99a8..55407bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,11 @@ # Mac OS Files .DS_Store + +# Ignore node_modules directory +node_modules/ + +# Ignore automation testing generated copies +automation-testing/ + +# Ignore local artifacts +local-artifacts \ No newline at end of file diff --git a/bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru b/bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru index 93fc068..54823e3 100644 --- a/bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru +++ b/bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru @@ -5,14 +5,14 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/bellSchedules?schoolId=[ENTER SCHOOL ID]&bellScheduleName=[ENTER BELL SCHEDULE NAME] + url: {{resourceBaseUrl}}/ed-fi/bellSchedules?schoolId=[ENTER_SCHOOL_ID]&bellScheduleName=[ENTER_BELL_SCHEDULE_NAME] body: none auth: inherit } params:query { - schoolId: [ENTER SCHOOL ID] - bellScheduleName: [ENTER BELL SCHEDULE NAME] + schoolId: [ENTER_SCHOOL_ID] + bellScheduleName: [ENTER_BELL_SCHEDULE_NAME] } assert { diff --git a/bruno/SIS/v4/MasterSchedule/BellSchedules/folder.bru b/bruno/SIS/v4/MasterSchedule/BellSchedules/folder.bru index 8aa8945..0a745b9 100644 --- a/bruno/SIS/v4/MasterSchedule/BellSchedules/folder.bru +++ b/bruno/SIS/v4/MasterSchedule/BellSchedules/folder.bru @@ -30,18 +30,18 @@ docs { > Scenarios 2, 3, and 4 are deprecated and will be removed in a future release. They are included here for traceability. Except for the expected values, these scenarios have the exact same functionality and are no longer needed. ## Scenarios example data: - | Resource | Property Name | Is Collection | Data Type | Required / Optional | Scenario 1: POST | Scenario 2: POST | Scenario 3: POST | Scenario 4: POST | - | -------------------- | -------------------- | ------------- | -------------------- | ------------------- | ------------------ | ------------------ | ------------------ | ------------------ | - | BellSchedule | bellScheduleName | FALSE | string | REQUIRED | Normal Schedule A | Normal Schedule B | Early Release A | Early Release B | - | BellSchedule | schoolReference | FALSE | schoolReference | REQUIRED | | | | | - | schoolReference | schoolId | FALSE | integer | REQUIRED | 255901107 | 255901107 | 255901107 | 255901107 | - | BellSchedule | classPeriodReference | TRUE | classPeriodReference | REQUIRED | | | | | - | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 1 | Class Period 4 | Class Period 1 | Class Period 4 | - | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 2 | Class Period 5 | Class Period 2 | Class Period 5 | - | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 3 | Class Period 6 | | | - | BellSchedule | dates | FALSE | string | OPTIONAL | | | | | - | BellSchedule | alternateDayName | FALSE | boolean | REQUIRED | A | B | A | B | - | BellSchedule | totalInstructionalTime| FALSE | number | OPTIONAL | | | | | + | Resource | Property Name | Is Collection | Data Type | Required / Optional | Scenario 1: POST | Scenario 2: POST | Scenario 3: POST | Scenario 4: POST | + | -------------------- | ---------------------- | ------------- | -------------------- | ------------------- | ------------------ | ------------------ | ------------------ | ------------------ | + | BellSchedule | bellScheduleName | FALSE | string | REQUIRED | Normal Schedule A | Normal Schedule B | Early Release A | Early Release B | + | BellSchedule | schoolReference | FALSE | schoolReference | REQUIRED | | | | | + | schoolReference | schoolId | FALSE | integer | REQUIRED | 255901107 | 255901107 | 255901107 | 255901107 | + | BellSchedule | classPeriodReference | TRUE | classPeriodReference | REQUIRED | | | | | + | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 1 | Class Period 4 | Class Period 1 | Class Period 4 | + | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 2 | Class Period 5 | Class Period 2 | Class Period 5 | + | classPeriodReference | classPeriodName | FALSE | string | REQUIRED | Class Period 3 | Class Period 6 | | | + | BellSchedule | dates | FALSE | string | OPTIONAL | | | | | + | BellSchedule | alternateDayName | FALSE | boolean | REQUIRED | A | B | A | B | + | BellSchedule | totalInstructionalTime | FALSE | number | OPTIONAL | | | | | ## API response format ```json diff --git a/bruno/SIS/v4/StaffAssociation/StaffEdOrgAssociations/01 - Check first StaffEdOrgAssociation is valid.bru b/bruno/SIS/v4/StaffAssociation/StaffEdOrgAssociations/01 - Check first StaffEdOrgAssociation is valid.bru index 9acbd4d..6955711 100644 --- a/bruno/SIS/v4/StaffAssociation/StaffEdOrgAssociations/01 - Check first StaffEdOrgAssociation is valid.bru +++ b/bruno/SIS/v4/StaffAssociation/StaffEdOrgAssociations/01 - Check first StaffEdOrgAssociation is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/staffEducationOrganizationAssignmentAssociations?educationOrganizationId=255901107&staffClassificationDescriptorId={{firstStaffClassificationDescriptorIdEncoded}}&beginDate=1992-12-30&staffUniqueId=207230&staffClassificationDescriptorId_KEEP_IT_AT_THE_END=[ENTER_STAFF_CLASSIFICATION_DESCRIPTOR] + url: {{resourceBaseUrl}}/ed-fi/staffEducationOrganizationAssignmentAssociations?educationOrganizationId=[ENTER_EDUCATION_ORGANIZATION_ID]&staffClassificationDescriptorId={{firstStaffClassificationDescriptorIdEncoded}}&beginDate=[ENTER_BEGIN_DATE]&staffUniqueId=[ENTER_STAFF_UNIQUE_ID]&staffClassificationDescriptorId_KEEP_IT_AT_THE_END=[ENTER_STAFF_CLASSIFICATION_DESCRIPTOR] body: none auth: inherit } diff --git a/bruno/SIS/v4/StaffAssociation/StaffSchoolAssociations/01 - Check first StaffSchoolAssociation is valid.bru b/bruno/SIS/v4/StaffAssociation/StaffSchoolAssociations/01 - Check first StaffSchoolAssociation is valid.bru index 7d81f51..b91bdf2 100644 --- a/bruno/SIS/v4/StaffAssociation/StaffSchoolAssociations/01 - Check first StaffSchoolAssociation is valid.bru +++ b/bruno/SIS/v4/StaffAssociation/StaffSchoolAssociations/01 - Check first StaffSchoolAssociation is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/staffSchoolAssociations?schoolId=255901001&programAssignmentDescriptorId={{firstProgramAssignmentDescriptorIdEncoded}}&staffUniqueId=207269&programAssignmentDescriptorId_KEEP_IT_AT_THE_END=[ENTER_PROGRAM_ASSIGNMENT_DESCRIPTOR] + url: {{resourceBaseUrl}}/ed-fi/staffSchoolAssociations?schoolId=[ENTER_SCHOOL_ID]&programAssignmentDescriptorId={{firstProgramAssignmentDescriptorIdEncoded}}&staffUniqueId=[ENTER_STAFF_UNIQUE_ID]&programAssignmentDescriptorId_KEEP_IT_AT_THE_END=[ENTER_PROGRAM_ASSIGNMENT_DESCRIPTOR] body: none auth: inherit } diff --git a/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/01 - Check first StaffSectionAssociation is valid.bru b/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/01 - Check first StaffSectionAssociation is valid.bru index a364db0..d43dc7c 100644 --- a/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/01 - Check first StaffSectionAssociation is valid.bru +++ b/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/01 - Check first StaffSectionAssociation is valid.bru @@ -5,18 +5,18 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/staffSectionAssociations?schoolId=255901001&schoolYear=2022&localCourseCode=ALG-1&sessionName=2021-2022 Fall Semester&staffUniqueId=207270§ionIdentifier=25590100102Trad220ALG112011 + url: {{resourceBaseUrl}}/ed-fi/staffSectionAssociations?schoolId=[ENTER_SCHOOL_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&localCourseCode=[ENTER_LOCAL_COURSE_CODE]&sessionName=[ENTER_SESSION_NAME]&staffUniqueId=[ENTER_STAFF_UNIQUE_ID]§ionIdentifier=[ENTER_SECTION_IDENTIFIER] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: 2022 - localCourseCode: ALG-1 - sessionName: 2021-2022 Fall Semester - staffUniqueId: 207270 - sectionIdentifier: 25590100102Trad220ALG112011 + schoolId: [ENTER_SCHOOL_ID] + schoolYear: [ENTER_SCHOOL_YEAR] + localCourseCode: [ENTER_LOCAL_COURSE_CODE] + sessionName: [ENTER_SESSION_NAME] + staffUniqueId: [ENTER_STAFF_UNIQUE_ID] + sectionIdentifier: [ENTER_SECTION_IDENTIFIER] } assert { diff --git a/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/02 - Check second StaffSectionAssociation is valid.bru b/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/02 - Check second StaffSectionAssociation is valid.bru index 7237aff..e3106f3 100644 --- a/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/02 - Check second StaffSectionAssociation is valid.bru +++ b/bruno/SIS/v4/StaffAssociation/StaffSectionAssociations/02 - Check second StaffSectionAssociation is valid.bru @@ -5,18 +5,18 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/staffSectionAssociations?schoolId=255901001&schoolYear=2022&localCourseCode=ALG-1&sessionName=2021-2022 Fall Semester&staffUniqueId=207270§ionIdentifier=25590100102Trad220ALG112011 + url: {{resourceBaseUrl}}/ed-fi/staffSectionAssociations?schoolId=[ENTER_SCHOOL_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&localCourseCode=[ENTER_LOCAL_COURSE_CODE]&sessionName=[ENTER_SESSION_NAME]&staffUniqueId=[ENTER_STAFF_UNIQUE_ID]§ionIdentifier=[ENTER_SECTION_IDENTIFIER] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: 2022 - localCourseCode: ALG-1 - sessionName: 2021-2022 Fall Semester - staffUniqueId: 207270 - sectionIdentifier: 25590100102Trad220ALG112011 + schoolId: [ENTER_SCHOOL_ID] + schoolYear: [ENTER_SCHOOL_YEAR] + localCourseCode: [ENTER_LOCAL_COURSE_CODE] + sessionName: [ENTER_SESSION_NAME] + staffUniqueId: [ENTER_STAFF_UNIQUE_ID] + sectionIdentifier: [ENTER_SECTION_IDENTIFIER] } assert { diff --git a/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/01 - Check first StudentSchoolAttendanceEvent is valid.bru b/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/01 - Check first StudentSchoolAttendanceEvent is valid.bru index 385cd08..ef94732 100644 --- a/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/01 - Check first StudentSchoolAttendanceEvent is valid.bru +++ b/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/01 - Check first StudentSchoolAttendanceEvent is valid.bru @@ -5,18 +5,19 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentSchoolAttendanceEvents?schoolId=255901107&schoolYear=[Current School Year]&sessionName=2016-2017 Fall Semester&studentUniqueId=111111&eventDate=9/16/[Current School Year]&attendanceEventCategoryDescriptor=uri://ed-fi.org/AttendanceEventCategoryDescriptor#Tardy + url: {{resourceBaseUrl}}/ed-fi/studentSchoolAttendanceEvents?schoolId=[ENTER SCHOOL ID]&schoolYear=[ENTER CURRENT SCHOOL YEAR]&sessionName=[ENTER SESSION NAME]&studentUniqueId=[ENTER STUDENT ID]&eventDate=[ENTER EVENT DATE]&attendanceEventCategoryDescriptor={{firstAttendanceEventCategoryDescriptorEncoded}}&&attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END=[ENTER FIRST ATTENDANCE EVENT CATEGORY DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901107 - schoolYear: [Current School Year] - sessionName: 2016-2017 Fall Semester - studentUniqueId: 111111 - eventDate: 9/16/[Current School Year] - attendanceEventCategoryDescriptor: uri://ed-fi.org/AttendanceEventCategoryDescriptor#Tardy + schoolId: [ENTER SCHOOL ID] + schoolYear: [ENTER CURRENT SCHOOL YEAR] + sessionName: [ENTER SESSION NAME] + studentUniqueId: [ENTER STUDENT ID] + eventDate: [ENTER EVENT DATE] + attendanceEventCategoryDescriptor: {{firstAttendanceEventCategoryDescriptorEncoded}} + attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END: [ENTER FIRST ATTENDANCE EVENT CATEGORY DESCRIPTOR] } assert { @@ -46,6 +47,13 @@ assert { res.body[0].attendanceEventReason: isNotEmpty } +script:pre-request { + const { encodeDescriptorParameter, setVar } = require('./utils'); + const attendanceEventCategoryDescriptorEncoded = encodeDescriptorParameter(req.url, 'attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END'); + + setVar(bru, 'firstAttendanceEventCategoryDescriptorEncoded', attendanceEventCategoryDescriptorEncoded); +} + script:post-response { const { pickSingle, setVars, wipeVars } = require('./utils'); const { logScenario, logSpecStudentSchoolAttendanceEvent } = require('./logging'); diff --git a/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/02 - Check second StudentSchoolAttendanceEvent is valid.bru b/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/02 - Check second StudentSchoolAttendanceEvent is valid.bru index 886bc46..685a98d 100644 --- a/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/02 - Check second StudentSchoolAttendanceEvent is valid.bru +++ b/bruno/SIS/v4/StudentAttendance/StudentSchoolAttendanceEvents/02 - Check second StudentSchoolAttendanceEvent is valid.bru @@ -5,18 +5,19 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentSchoolAttendanceEvents?schoolId=255901001&schoolYear=[Current School Year]&sessionName=2016-2017 Fall Semester&studentUniqueId=222222&eventDate=10/5/[Current School Year]&attendanceEventCategoryDescriptor=uri://ed-fi.org/AttendanceEventCategoryDescriptor#Unexcused Absence + url: {{resourceBaseUrl}}/ed-fi/studentSchoolAttendanceEvents?schoolId=[ENTER SCHOOL ID]&schoolYear=[ENTER CURRENT SCHOOL YEAR]&sessionName=[ENTER SESSION NAME]&studentUniqueId=[ENTER STUDENT ID]&eventDate=[ENTER EVENT DATE]&attendanceEventCategoryDescriptor={{secondAttendanceEventCategoryDescriptorEncoded}}&&attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END=[ENTER SECOND ATTENDANCE EVENT CATEGORY DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: [Current School Year] - sessionName: 2016-2017 Fall Semester - studentUniqueId: 222222 - eventDate: 10/5/[Current School Year] - attendanceEventCategoryDescriptor: uri://ed-fi.org/AttendanceEventCategoryDescriptor#Unexcused Absence + schoolId: [ENTER SCHOOL ID] + schoolYear: [ENTER CURRENT SCHOOL YEAR] + sessionName: [ENTER SESSION NAME] + studentUniqueId: [ENTER STUDENT ID] + eventDate: [ENTER EVENT DATE] + attendanceEventCategoryDescriptor: {{secondAttendanceEventCategoryDescriptorEncoded}} + attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END: [ENTER SECOND ATTENDANCE EVENT CATEGORY DESCRIPTOR] } assert { @@ -46,6 +47,13 @@ assert { res.body[0].attendanceEventReason: isNotEmpty } +script:pre-request { + const { encodeDescriptorParameter, setVar } = require('./utils'); + const attendanceEventCategoryDescriptorEncoded = encodeDescriptorParameter(req.url, 'attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END'); + + setVar(bru, 'secondAttendanceEventCategoryDescriptorEncoded', attendanceEventCategoryDescriptorEncoded); +} + script:post-response { const { pickSingle, setVars, wipeVars } = require('./utils'); const { logScenario, logSpecStudentSchoolAttendanceEvent } = require('./logging'); diff --git a/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/01 - Check first StudentSectionAttendanceEvent is valid.bru b/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/01 - Check first StudentSectionAttendanceEvent is valid.bru index cb0fe20..117b2af 100644 --- a/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/01 - Check first StudentSectionAttendanceEvent is valid.bru +++ b/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/01 - Check first StudentSectionAttendanceEvent is valid.bru @@ -5,20 +5,21 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentSectionAttendanceEvents?schoolId=255901107&schoolYear=2017§ionIdentifier=["ELA012017RM555" if possible | system value]&sessionName=2016-2017 Fall Semester&localCourseCode=["ELA-01" if possible | system value]&studentUniqueId=111111&eventDate=9/16/[Current School Year]&attendanceEventCategoryDescriptor=uri://ed-fi.org/AttendanceEventCategoryDescriptor#Tardy + url: {{resourceBaseUrl}}/ed-fi/studentSectionAttendanceEvents?schoolId=[ENTER SCHOOL ID]&schoolYear=[ENTER CURRENT SCHOOL YEAR]§ionIdentifier=[ENTER SECTION IDENTIFIER]&sessionName=[ENTER SESSION NAME]&localCourseCode=[ENTER LOCAL COURSE CODE]&studentUniqueId=[ENTER STUDENT ID]&eventDate=[ENTER EVENT DATE]&attendanceEventCategoryDescriptor={{firstAttendanceEventCategoryDescriptorEncoded}}&&attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END=[ENTER FIRST ATTENDANCE EVENT CATEGORY DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901107 - schoolYear: 2017 - sectionIdentifier: ["ELA012017RM555" if possible | system value] - sessionName: 2016-2017 Fall Semester - localCourseCode: ["ELA-01" if possible | system value] - studentUniqueId: 111111 - eventDate: 9/16/[Current School Year] - attendanceEventCategoryDescriptor: uri://ed-fi.org/AttendanceEventCategoryDescriptor#Tardy + schoolId: [ENTER SCHOOL ID] + schoolYear: [ENTER CURRENT SCHOOL YEAR] + sectionIdentifier: [ENTER SECTION IDENTIFIER] + sessionName: [ENTER SESSION NAME] + localCourseCode: [ENTER LOCAL COURSE CODE] + studentUniqueId: [ENTER STUDENT ID] + eventDate: [ENTER EVENT DATE] + attendanceEventCategoryDescriptor: {{firstAttendanceEventCategoryDescriptorEncoded}} + attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END: [ENTER FIRST ATTENDANCE EVENT CATEGORY DESCRIPTOR] } assert { @@ -49,6 +50,13 @@ assert { res.body[0].attendanceEventReason: isNotEmpty } +script:pre-request { + const { encodeDescriptorParameter, setVar } = require('./utils'); + const attendanceEventCategoryDescriptorEncoded = encodeDescriptorParameter(req.url, 'attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END'); + + setVar(bru, 'firstAttendanceEventCategoryDescriptorEncoded', attendanceEventCategoryDescriptorEncoded); +} + script:post-response { const { pickSingle, setVars, wipeVars } = require('./utils'); const { logScenario, logSpecStudentSectionAttendanceEvent } = require('./logging'); diff --git a/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/02 - Check second StudentSectionAttendanceEvent is valid.bru b/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/02 - Check second StudentSectionAttendanceEvent is valid.bru index b427559..4cdd504 100644 --- a/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/02 - Check second StudentSectionAttendanceEvent is valid.bru +++ b/bruno/SIS/v4/StudentAttendance/StudentSectionAttendanceEvents/02 - Check second StudentSectionAttendanceEvent is valid.bru @@ -5,20 +5,21 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentSectionAttendanceEvents?schoolId=255901001&schoolYear=2017§ionIdentifier=["ALG12017RM901" if possible | system value]&sessionName=2016-2017 Fall Semester&localCourseCode=["ALG-2" if possible | system value]&studentUniqueId=222222&eventDate=10/5/[Current School Year]&attendanceEventCategoryDescriptor=uri://ed-fi.org/AttendanceEventCategoryDescriptor#Unexcused Absence + url: {{resourceBaseUrl}}/ed-fi/studentSectionAttendanceEvents?schoolId=[ENTER SCHOOL ID]&schoolYear=[ENTER CURRENT SCHOOL YEAR]§ionIdentifier=[ENTER SECTION IDENTIFIER]&sessionName=[ENTER SESSION NAME]&localCourseCode=[ENTER LOCAL COURSE CODE]&studentUniqueId=[ENTER STUDENT ID]&eventDate=[ENTER EVENT DATE]&attendanceEventCategoryDescriptor={{secondAttendanceEventCategoryDescriptorEncoded}}&attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END=[ENTER SECOND ATTENDANCE EVENT CATEGORY DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: 2017 - sectionIdentifier: ["ALG12017RM901" if possible | system value] - sessionName: 2016-2017 Fall Semester - localCourseCode: ["ALG-2" if possible | system value] - studentUniqueId: 222222 - eventDate: 10/5/[Current School Year] - attendanceEventCategoryDescriptor: uri://ed-fi.org/AttendanceEventCategoryDescriptor#Unexcused Absence + schoolId: [ENTER SCHOOL ID] + schoolYear: [ENTER CURRENT SCHOOL YEAR] + sectionIdentifier: [ENTER SECTION IDENTIFIER] + sessionName: [ENTER SESSION NAME] + localCourseCode: [ENTER LOCAL COURSE CODE] + studentUniqueId: [ENTER STUDENT ID] + eventDate: [ENTER EVENT DATE] + attendanceEventCategoryDescriptor: {{secondAttendanceEventCategoryDescriptorEncoded}} + attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END: [ENTER SECOND ATTENDANCE EVENT CATEGORY DESCRIPTOR] } assert { @@ -49,6 +50,13 @@ assert { res.body[0].attendanceEventReason: isNotEmpty } +script:pre-request { + const { encodeDescriptorParameter, setVar } = require('./utils'); + const attendanceEventCategoryDescriptorEncoded = encodeDescriptorParameter(req.url, 'attendanceEventCategoryDescriptor_KEEP_IT_AT_THE_END'); + + setVar(bru, 'secondAttendanceEventCategoryDescriptorEncoded', attendanceEventCategoryDescriptorEncoded); +} + script:post-response { const { pickSingle, setVars, wipeVars } = require('./utils'); const { logScenario, logSpecStudentSectionAttendanceEvent } = require('./logging'); diff --git a/bruno/SIS/v4/StudentGrade/Grades/01 - Check first Grade is valid.bru b/bruno/SIS/v4/StudentGrade/Grades/01 - Check first Grade is valid.bru index 80ff5d6..3d97f2a 100644 --- a/bruno/SIS/v4/StudentGrade/Grades/01 - Check first Grade is valid.bru +++ b/bruno/SIS/v4/StudentGrade/Grades/01 - Check first Grade is valid.bru @@ -5,24 +5,24 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/grades?schoolId=255901001&schoolYear=2022&localCourseCode=ALG-1&sessionName=2021-2022 Fall Semester§ionIdentifier=25590100102Trad220ALG112011&studentUniqueId=604822&beginDate=2021-08-23&gradingPeriodSchoolYear=2022&gradingPeriodSchoolId=255901001&gradingPeriodSequence=1 + url: {{resourceBaseUrl}}/ed-fi/grades?schoolId=[ENTER_SCHOOL_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&localCourseCode=[ENTER_LOCAL_COURSE_CODE]&sessionName=[ENTER_SESSION_NAME]§ionIdentifier=[ENTER_SECTION_IDENTIFIER]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&beginDate=[ENTER_BEGIN_DATE]&gradingPeriodSchoolYear=[ENTER_GRADING_PERIOD_SCHOOL_YEAR]&gradingPeriodSchoolId=[ENTER_GRADING_PERIOD_SCHOOL_ID]&gradingPeriodSequence=[ENTER_GRADING_PERIOD_SEQUENCE]&gradingPeriodDescriptor=[ENTER_GRADING_PERIOD_DESCRIPTOR]&gradeTypeDescriptor=[ENTER_GRADING_PERIOD_TYPE_DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: 2022 - localCourseCode: ALG-1 - sessionName: 2021-2022 Fall Semester - sectionIdentifier: 25590100102Trad220ALG112011 - studentUniqueId: 604822 - beginDate: 2021-08-23 - gradingPeriodSchoolYear: 2022 - gradingPeriodSchoolId: 255901001 - gradingPeriodSequence: 1 - ~gradingPeriodDescriptor: uri://ed-fi.org/GradingPeriodDescriptor#First Six Weeks - ~gradeTypeDescriptor: uri://ed-fi.org/GradeTypeDescriptor#Grading Period + schoolId: [ENTER_SCHOOL_ID] + schoolYear: [ENTER_SCHOOL_YEAR] + localCourseCode: [ENTER_LOCAL_COURSE_CODE] + sessionName: [ENTER_SESSION_NAME] + sectionIdentifier: [ENTER_SECTION_IDENTIFIER] + studentUniqueId: [ENTER_STUDENT_UNIQUE_ID] + beginDate: [ENTER_BEGIN_DATE] + gradingPeriodSchoolYear: [ENTER_GRADING_PERIOD_SCHOOL_YEAR] + gradingPeriodSchoolId: [ENTER_GRADING_PERIOD_SCHOOL_ID] + gradingPeriodSequence: [ENTER_GRADING_PERIOD_SEQUENCE] + gradingPeriodDescriptor: [ENTER_GRADING_PERIOD_DESCRIPTOR] + gradeTypeDescriptor: [ENTER_GRADING_PERIOD_TYPE_DESCRIPTOR] } assert { diff --git a/bruno/SIS/v4/StudentGrade/Grades/02 - Check second Grade is valid.bru b/bruno/SIS/v4/StudentGrade/Grades/02 - Check second Grade is valid.bru index e1e8aa1..a9ce07c 100644 --- a/bruno/SIS/v4/StudentGrade/Grades/02 - Check second Grade is valid.bru +++ b/bruno/SIS/v4/StudentGrade/Grades/02 - Check second Grade is valid.bru @@ -5,24 +5,24 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/grades?schoolId=255901001&schoolYear=2022&localCourseCode=ALG-1&sessionName=2021-2022 Fall Semester§ionIdentifier=25590100102Trad220ALG112011&studentUniqueId=604822&beginDate=2021-08-23&gradingPeriodSchoolYear=2022&gradingPeriodSchoolId=255901001&gradingPeriodSequence=1 + url: {{resourceBaseUrl}}/ed-fi/grades?schoolId=[ENTER_SCHOOL_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&localCourseCode=[ENTER_LOCAL_COURSE_CODE]&sessionName=[ENTER_SESSION_NAME]§ionIdentifier=[ENTER_SECTION_IDENTIFIER]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&beginDate=[ENTER_BEGIN_DATE]&gradingPeriodSchoolYear=[ENTER_GRADING_PERIOD_SCHOOL_YEAR]&gradingPeriodSchoolId=[ENTER_GRADING_PERIOD_SCHOOL_ID]&gradingPeriodSequence=[ENTER_GRADING_PERIOD_SEQUENCE]&gradingPeriodDescriptor=[ENTER_GRADING_PERIOD_DESCRIPTOR]&gradeTypeDescriptor=[ENTER_GRADING_PERIOD_TYPE_DESCRIPTOR] body: none auth: inherit } params:query { - schoolId: 255901001 - schoolYear: 2022 - localCourseCode: ALG-1 - sessionName: 2021-2022 Fall Semester - sectionIdentifier: 25590100102Trad220ALG112011 - studentUniqueId: 604822 - beginDate: 2021-08-23 - gradingPeriodSchoolYear: 2022 - gradingPeriodSchoolId: 255901001 - gradingPeriodSequence: 1 - ~gradingPeriodDescriptor: uri://ed-fi.org/GradingPeriodDescriptor#First Six Weeks - ~gradeTypeDescriptor: uri://ed-fi.org/GradeTypeDescriptor#Grading Period + schoolId: [ENTER_SCHOOL_ID] + schoolYear: [ENTER_SCHOOL_YEAR] + localCourseCode: [ENTER_LOCAL_COURSE_CODE] + sessionName: [ENTER_SESSION_NAME] + sectionIdentifier: [ENTER_SECTION_IDENTIFIER] + studentUniqueId: [ENTER_STUDENT_UNIQUE_ID] + beginDate: [ENTER_BEGIN_DATE] + gradingPeriodSchoolYear: [ENTER_GRADING_PERIOD_SCHOOL_YEAR] + gradingPeriodSchoolId: [ENTER_GRADING_PERIOD_SCHOOL_ID] + gradingPeriodSequence: [ENTER_GRADING_PERIOD_SEQUENCE] + gradingPeriodDescriptor: [ENTER_GRADING_PERIOD_DESCRIPTOR] + gradeTypeDescriptor: [ENTER_GRADING_PERIOD_TYPE_DESCRIPTOR] } assert { @@ -66,7 +66,7 @@ script:post-response { const entityName = 'Grade'; const scenarioName = this.req.name; const entity = pickSingle(res.getBody()); - + if (!entity) { wipeVars(bru, [ 'secondGradeUniqueId', @@ -74,13 +74,13 @@ script:post-response { 'secondGradeNumericGradeEarned' ], entityName, true); } - + setVars(bru, { secondGradeUniqueId: entity.id, secondGradeLetterGradeEarned: entity.letterGradeEarned, secondGradeNumericGradeEarned: entity.numericGradeEarned }); - + // Baseline logs full spec projection logScenario(entityName, scenarioName, entity, logSpecGrade); } diff --git a/bruno/SIS/v4/StudentProgram/StudNeglectedOrDelinquentProgAssocs/01 - Check first StudNeglectedOrDelinquentProgAssocs is valid.bru b/bruno/SIS/v4/StudentProgram/StudNeglectedOrDelinquentProgAssocs/01 - Check first StudNeglectedOrDelinquentProgAssocs is valid.bru index 8d46542..86234bc 100644 --- a/bruno/SIS/v4/StudentProgram/StudNeglectedOrDelinquentProgAssocs/01 - Check first StudNeglectedOrDelinquentProgAssocs is valid.bru +++ b/bruno/SIS/v4/StudentProgram/StudNeglectedOrDelinquentProgAssocs/01 - Check first StudNeglectedOrDelinquentProgAssocs is valid.bru @@ -55,11 +55,7 @@ assert { script:pre-request { const { encodeDescriptorParameter, setVar } = require('./utils'); - const programTypeDescriptorEncoded = encodeDescriptorParameter( - req.url, - 'programTypeDescriptor_KEEP_IT_AT_THE_END', - 'uri://ed-fi.org/ProgramTypeDescriptor#Neglected and Delinquent Program' - ); + const programTypeDescriptorEncoded = encodeDescriptorParameter(req.url, 'programTypeDescriptor_KEEP_IT_AT_THE_END'); setVar(bru, 'firstProgramTypeDescriptorEncoded', programTypeDescriptorEncoded); } diff --git a/bruno/SIS/v4/StudentTranscript/CourseTranscript/01 - Check first CourseTranscript is valid.bru b/bruno/SIS/v4/StudentTranscript/CourseTranscript/01 - Check first CourseTranscript is valid.bru index 5b51795..bf369f9 100644 --- a/bruno/SIS/v4/StudentTranscript/CourseTranscript/01 - Check first CourseTranscript is valid.bru +++ b/bruno/SIS/v4/StudentTranscript/CourseTranscript/01 - Check first CourseTranscript is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/courseTranscripts?educationOrganizationId=255901001&schoolYear=2022&studentUniqueId=604822&courseCode=03100500&termDescriptor={{termDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR] + url: {{resourceBaseUrl}}/ed-fi/courseTranscripts?educationOrganizationId=[ENTER_EDUCATION_ORGANIZATION_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&courseCode=[ENTER_COURSE_CODE]&termDescriptor={{secondTermDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR]&educationOrganizationId=12312 body: none auth: inherit } @@ -17,6 +17,7 @@ params:query { courseCode: [ENTER_COURSE_CODE] termDescriptor: {{secondTermDescriptorEncoded}} termDescriptor_KEEP_IT_AT_THE_END: [ENTER_TERM_DESCRIPTOR] + educationOrganizationId: 12312 } assert { diff --git a/bruno/SIS/v4/StudentTranscript/CourseTranscript/03 - Check second CourseTranscript is valid.bru b/bruno/SIS/v4/StudentTranscript/CourseTranscript/03 - Check second CourseTranscript is valid.bru index da02d1e..aca120a 100644 --- a/bruno/SIS/v4/StudentTranscript/CourseTranscript/03 - Check second CourseTranscript is valid.bru +++ b/bruno/SIS/v4/StudentTranscript/CourseTranscript/03 - Check second CourseTranscript is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/courseTranscripts?educationOrganizationId=255901001&schoolYear=2017&studentUniqueId=222222&termDescriptor={{termDescriptorEncodedSecond}}&rawDescriptorSecond=uri://ed-fi.org/TermDescriptor#Spring Semester&courseCode=ALG-01 + url: {{resourceBaseUrl}}/ed-fi/courseTranscripts?educationOrganizationId=[ENTER_EDUCATION_ORGANIZATION_ID]&schoolYear=[ENTER_SCHOOL_YEAR]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&courseCode=[ENTER_COURSE_CODE]&termDescriptor={{secondTermDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR] body: none auth: inherit } diff --git a/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/01 - Check first StudentAcademicRecord is valid.bru b/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/01 - Check first StudentAcademicRecord is valid.bru index 065a14b..054e3b3 100644 --- a/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/01 - Check first StudentAcademicRecord is valid.bru +++ b/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/01 - Check first StudentAcademicRecord is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentAcademicRecords?educationOrganizationId=255901001&schoolYear=2022&studentUniqueId=604822&termDescriptor={{termDescriptorEncoded}}&termDescriptor_ENTER_VALUE_HERE=uri://ed-fi.org/TermDescriptor#Fall Semester + url: {{resourceBaseUrl}}/ed-fi/studentAcademicRecords?educationOrganizationId=[ENTER_EDUCATION_ORGANIZATION_ID]&schoolYear=[ENTER_SCHOOL_YEAR_FIVE_YEARS_AGO]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&termDescriptor={{termDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR] body: none auth: inherit } @@ -40,9 +40,9 @@ assert { } script:pre-request { - const { encodeDescriptorParameter, setVar } = require('./utils'); - const termDescriptorEncoded = encodeDescriptorParameter(req.url, parameterName = 'termDescriptor_KEEP_IT_AT_THE_END'); - setVar(bru, 'termDescriptorEncoded', termDescriptorEncoded); + const { encodeDescriptorParameter, setVar } = require('./utils'); + const termDescriptorEncoded = encodeDescriptorParameter(req.url, parameterName = 'termDescriptor_KEEP_IT_AT_THE_END'); + setVar(bru, 'termDescriptorEncoded', termDescriptorEncoded); } script:post-response { diff --git a/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/02 - Check second StudentAcademicRecord is valid.bru b/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/02 - Check second StudentAcademicRecord is valid.bru index fb88a37..89b2b0b 100644 --- a/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/02 - Check second StudentAcademicRecord is valid.bru +++ b/bruno/SIS/v4/StudentTranscript/StudentAcademicRecords/02 - Check second StudentAcademicRecord is valid.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{resourceBaseUrl}}/ed-fi/studentAcademicRecords?educationOrganizationId=255901001&schoolYear=2022&studentUniqueId=604822&termDescriptor={{termDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR] + url: {{resourceBaseUrl}}/ed-fi/studentAcademicRecords?educationOrganizationId=[ENTER_EDUCATION_ORGANIZATION_ID]&schoolYear=[ENTER_SCHOOL_YEAR_FIVE_YEARS_AGO]&studentUniqueId=[ENTER_STUDENT_UNIQUE_ID]&termDescriptor={{termDescriptorEncoded}}&termDescriptor_KEEP_IT_AT_THE_END=[ENTER_TERM_DESCRIPTOR] body: none auth: inherit } @@ -48,9 +48,9 @@ assert { } script:pre-request { - const { encodeDescriptorParameter, setVar } = require('./utils'); - const termDescriptorEncoded = encodeDescriptorParameter(req.url, parameterName = 'termDescriptor_KEEP_IT_AT_THE_END'); - setVar(bru, 'termDescriptorEncoded', termDescriptorEncoded); + const { encodeDescriptorParameter, setVar } = require('./utils'); + const termDescriptorEncoded = encodeDescriptorParameter(req.url, parameterName = 'termDescriptor_KEEP_IT_AT_THE_END'); + setVar(bru, 'termDescriptorEncoded', termDescriptorEncoded); } script:post-response { diff --git a/bruno/Tests/.env.example b/bruno/Tests/.env.example new file mode 100644 index 0000000..964de2b --- /dev/null +++ b/bruno/Tests/.env.example @@ -0,0 +1,3 @@ +EDFI_CLIENT_NAME=PUBLIC_CLIENT +EDFI_CLIENT_ID=RvcohKz9zHI4 +EDFI_CLIENT_SECRET=E1iEFusaNf81xzCxwHfbolkC \ No newline at end of file diff --git a/bruno/Tests/.npmrc b/bruno/Tests/.npmrc new file mode 100644 index 0000000..5962e53 --- /dev/null +++ b/bruno/Tests/.npmrc @@ -0,0 +1,3 @@ +package-lock=true +fund=false +audit=false diff --git a/bruno/Tests/collection.bru b/bruno/Tests/collection.bru new file mode 100644 index 0000000..8d29dae --- /dev/null +++ b/bruno/Tests/collection.bru @@ -0,0 +1,53 @@ +script:pre-request { + const edFiClientName = bru.getGlobalEnvVar('edFiClientName') || bru.getEnvVar('edFiClientName'); + let generateToken = true; + + if (bru.getEnvVar('edFiCertToken') && bru.getEnvVar('edFiCertTokenExpiration')) { + const currentSeconds = new Date().getTime() / 1000; + if (currentSeconds < bru.getEnvVar('edFiCertTokenExpiration')) { + generateToken = false; // Token is still valid, no need to fetch a new one + } + } + + if (generateToken) { + console.log(`Fetching new token for "${edFiClientName}"...`); + + // Get Credentials from Collection or Global environment variables + const edFiClientId = bru.getGlobalEnvVar('edFiClientId') || bru.getEnvVar('edFiClientId'); + const edFiClientSecret = bru.getGlobalEnvVar('edFiClientSecret') || bru.getEnvVar('edFiClientSecret'); + + if (!edFiClientId || !edFiClientSecret) { + const errorMsg = 'The credentials for edFiClientId or edFiClientSecret were not set yet. Please configure them in your collection or global environment variables.'; + console.error(errorMsg); + throw new Error(errorMsg); + } + + await bru.sendRequest({ + url: `${bru.getEnvVar('oauthUrl')}`, + method: 'POST', + headers: { + "Content-Type": "application/x-www-form-urlencoded" + }, + data: { + "grant_type": 'client_credentials', + "client_id": edFiClientId, + "client_secret": edFiClientSecret + } + }, async function(err, res) { + if (err) { + console.error('Error when generating the token:', err); + throw new Error('Error when generating a new token. Please check your credentials in the "Global Environments" or ".env" file, and verify you are using the right "Collection Environment".'); + } else { + const { + data + } = res; + const currentSeconds = Date.now() / 1000; + + bru.setEnvVar('edFiCertToken', data.access_token); + bru.setEnvVar('edFiCertTokenExpiration', currentSeconds + data.expires_in); + + console.log('Token generated successfully!'); + } + }); + } +} diff --git a/bruno/Tests/environments/api.ed-fi.org.bru b/bruno/Tests/environments/api.ed-fi.org.bru new file mode 100644 index 0000000..461d7f1 --- /dev/null +++ b/bruno/Tests/environments/api.ed-fi.org.bru @@ -0,0 +1,10 @@ +vars { + apiVersion: v7.1 + baseUrl: https://api.ed-fi.org + resourceBaseUrl: {{baseUrl}}/{{apiVersion}}/api/data/v3 + oauthUrl: {{baseUrl}}/{{apiVersion}}/api/oauth/token + edFiClientName: {{process.env.EDFI_CLIENT_NAME}} + edFiClientId: {{process.env.EDFI_CLIENT_ID}} + edFiClientSecret: {{process.env.EDFI_CLIENT_SECRET}} +} + diff --git a/bruno/Tests/environments/certification.ed-fi.org.bru b/bruno/Tests/environments/certification.ed-fi.org.bru new file mode 100644 index 0000000..f019751 --- /dev/null +++ b/bruno/Tests/environments/certification.ed-fi.org.bru @@ -0,0 +1,10 @@ +vars { + apiVersion: v6.2 + baseUrl: https://certification.ed-fi.org + resourceBaseUrl: {{baseUrl}}/{{apiVersion}}/api/data/v3 + oauthUrl: {{baseUrl}}/{{apiVersion}}/api/oauth/token + edFiClientName: {{process.env.EDFI_CLIENT_NAME}} + edFiClientId: {{process.env.EDFI_CLIENT_ID}} + edFiClientSecret: {{process.env.EDFI_CLIENT_SECRET}} +} + diff --git a/bruno/Tests/environments/ci.ed-fi.org.bru b/bruno/Tests/environments/ci.ed-fi.org.bru new file mode 100644 index 0000000..7856028 --- /dev/null +++ b/bruno/Tests/environments/ci.ed-fi.org.bru @@ -0,0 +1,9 @@ +vars { + apiVersion: v6.2 + baseUrl: https://certification.ed-fi.org + resourceBaseUrl: {{baseUrl}}/{{apiVersion}}/api/data/v3 + oauthUrl: {{baseUrl}}/{{apiVersion}}/api/oauth/token + edFiClientName: CI Client Credentials + edFiClientId: dbHD7dnJt2yc + edFiClientSecret: 2rA6X3CxQ88PywCZ518Z3Hla +} \ No newline at end of file diff --git a/bruno/Tests/package-lock.json b/bruno/Tests/package-lock.json new file mode 100644 index 0000000..4b8b19a --- /dev/null +++ b/bruno/Tests/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "tests-collection", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tests-collection", + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "dayjs": "^1.11.18" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + } + } +} diff --git a/bruno/Tests/package.json b/bruno/Tests/package.json new file mode 100644 index 0000000..b7be909 --- /dev/null +++ b/bruno/Tests/package.json @@ -0,0 +1,14 @@ +{ + "name": "tests-collection", + "private": true, + "version": "1.0.0", + "description": "Local dependencies for Tests Bruno collection (sandbox-safe).", + "license": "UNLICENSED", + "main": "utils.js", + "dependencies": { + "dayjs": "^1.11.18" + }, + "scripts": { + "lint:bru": "node ../scripts/lint-bruno.cjs" + } +} diff --git a/bruno/Tests/utils.js b/bruno/Tests/utils.js new file mode 100644 index 0000000..0ce43fb --- /dev/null +++ b/bruno/Tests/utils.js @@ -0,0 +1,144 @@ +/** + * IMPORTANT: + * Duplicate of SIS/utils.js (see that file for notes). Keep in sync. + */ + +/** + * validateDependency + * Ensures a required environment variable is present before executing a request. + * If missing, it throws a descriptive error instructing the user which prior step to run. + * + * @param {object} bru - Bruno runtime object (provides getEnvVar, etc.). + * @param {string} variableName - Name of the environment variable to validate. + * @param {string} dependencyName - Human-friendly name of the prerequisite request / step. + * @param {object} [opts] - Optional settings. + * @param {boolean} [opts.throwOnMissing=true] - Whether to throw (default) or just log a warning. + * @param {string} [opts.actionHint] - Optional extra hint appended to the message. + * + * @returns {boolean} true if variable exists; false otherwise (only when throwOnMissing = false) + */ +function validateDependency(bru, variableName, dependencyName, opts = {}) { + const { throwOnMissing = true, actionHint } = opts; + const value = getVar(bru, variableName); + if (value !== undefined && value !== null && value !== '') { + return true; + } + + const baseMsg = `Run "${dependencyName}" first to populate it. Missing required variable "${variableName}". `; + const fullMsg = actionHint ? `${baseMsg} \n\n > ${actionHint}` : baseMsg; + + if (throwOnMissing) { + console.error(fullMsg); + throw new Error(fullMsg); + } else { + console.warn(fullMsg); + return false; + } +} + +// Descriptor helpers ------------------------------------------------- +function extractDescriptor(value) { + // keeps pop logic centralized and token standarized + return typeof value === 'string' ? value.split('#').pop() : value; +} + +function mapDescriptors(items, accessorFn) { + // keeps map logic centralized + if (!Array.isArray(items)) return []; + return items.map(it => extractDescriptor(accessorFn(it))); +} + +function joinDescriptors(items) { + // keeps join logic centralized and token standarized + if (!Array.isArray(items)) return ''; + return items.join(', '); +} + +// just wrappers around bru methods for consistency and centralization +function getVar(bru, key) { + return bru.getVar(key); +} + +function setVar(bru, key, value) { + bru.setVar(key, value); +} + +function wipeVar(bru, key) { + bru.deleteVar(key); +} + +// Variable helpers ----------------------------------------------------- +function getVars(bru, keys = []) { + if (!Array.isArray(keys) || keys.length === 0) return {}; + return Object.fromEntries(keys.map(k => [k, getVar(bru, k)])); +} + +function setVars(bru, kv, entityName = null) { + Object.entries(kv).forEach(([k, v]) => setVar(bru, k, v)); + if (entityName) setVarsMessage(entityName); +} + +function setVarsMessage(entityName) { + console.log(`${entityName} data was cached correctly.`); +} + +function wipeVars(bru, keys, entityName = null, throwError = false) { + keys.forEach(k => wipeVar(bru, k)); + if (entityName) wipeVarsWarning(entityName); + if (throwError) throwNotFoundOrSpecificError(entityName); +} + +function wipeVarsWarning(entityName) { + console.warn(`${entityName} cached data was wiped because no record was found or multiple records were returned. Please check the input "Params".`); +} + +function throwNotFoundOrSpecificError(entityName) { + throw new Error(`No ${entityName} found, or multiple records were returned. Check your parameters and try again.`); +} + +// Single item picker -------------------------------------------------- +function pickSingle(arr) { + return Array.isArray(arr) && arr.length === 1 ? arr[0] : null; +} + +// ID generators ----------------------------------------------------- +function generateId() { + const base = 1000010000; + const maxIncrement = 899999999; + return (base + Math.floor(Math.random() * maxIncrement)).toString(); +} + + +// Change expectation helper ------------------------------------------ +function expectChanged(previous, current, label) { + test(`${label} changed`, () => { + expect(current).not.equals(previous); + }); +} + +// Positive (equality) expectation helper -------------------------------- +function expectUnchanged(previous, current, label) { + test(`${label} unchanged`, () => { + expect(current).equals(previous); + }); +} + +module.exports = { + validateDependency, + extractDescriptor, + mapDescriptors, + joinDescriptors, + getVar, + getVars, + setVar, + setVars, + setVarsMessage, + wipeVar, + wipeVars, + wipeVarsWarning, + pickSingle, + generateId, + expectChanged, + expectUnchanged, + throwNotFoundOrSpecificError +}; \ No newline at end of file diff --git a/bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru b/bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru new file mode 100644 index 0000000..d6aeb81 --- /dev/null +++ b/bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru @@ -0,0 +1,65 @@ +meta { + name: 01 - CREATE a BellSchedule + type: http + seq: 1 +} + +post { + url: {{resourceBaseUrl}}/ed-fi/bellSchedules + body: json + auth: bearer +} + +auth:bearer { + token: {{edFiCertToken}} +} + +body:json { + { + "bellScheduleName": "[ENTER_BELL_SCHEDULE_NAME]", + "startTime": "[START_TIME]", + "endTime": "[END_TIME]", + "alternateDayName": "[ALTERNATE_DAY_NAME]", + "schoolReference": { + "schoolId": "[ENTER_SCHOOL_ID]" + }, + "classPeriods": [ + { + "classPeriodReference": { + "schoolId": "[ENTER_SCHOOL_ID]", + "classPeriodName": "CLASS_PERIOD_NAME_1" + } + }, + { + "classPeriodReference": { + "schoolId": "[ENTER_SCHOOL_ID]", + "classPeriodName": "CLASS_PERIOD_NAME_2" + } + }, + { + "classPeriodReference": { + "schoolId": "[ENTER_SCHOOL_ID]", + "classPeriodName": "CLASS_PERIOD_NAME_3" + } + } + ] + } + +} + +assert { + res.status: eq 201 +} + +script:post-response { + const locationHeader = res.headers.Location || res.headers.location; + if (locationHeader) { + const bellScheduleId = locationHeader.split('/').pop(); + bru.setEnvVar('tempBellScheduleUniqueId', bellScheduleId); + } +} + +settings { + encodeUrl: true + timeout: 0 +} diff --git a/bruno/Tests/v4/MasterSchedule/BellSchedules/02 - DELETE a BellSchedule.bru b/bruno/Tests/v4/MasterSchedule/BellSchedules/02 - DELETE a BellSchedule.bru new file mode 100644 index 0000000..989add8 --- /dev/null +++ b/bruno/Tests/v4/MasterSchedule/BellSchedules/02 - DELETE a BellSchedule.bru @@ -0,0 +1,24 @@ +meta { + name: 00 - DELETE a BellSchedule + type: http + seq: 2 +} + +delete { + url: {{resourceBaseUrl}}/ed-fi/BellSchedules/{{tempBellScheduleUniqueId}} + body: json + auth: bearer +} + +auth:bearer { + token: {{edFiCertToken}} +} + +assert { + res.status: eq 204 +} + +settings { + encodeUrl: true + timeout: 0 +} diff --git a/bruno/Tests/v4/MasterSchedule/BellSchedules/folder.bru b/bruno/Tests/v4/MasterSchedule/BellSchedules/folder.bru new file mode 100644 index 0000000..b908fe8 --- /dev/null +++ b/bruno/Tests/v4/MasterSchedule/BellSchedules/folder.bru @@ -0,0 +1,8 @@ +meta { + name: BellSchedules + seq: 1 +} + +auth { + mode: inherit +} diff --git a/bruno/Tests/v4/MasterSchedule/BellSchedules/test-config.json b/bruno/Tests/v4/MasterSchedule/BellSchedules/test-config.json new file mode 100644 index 0000000..e4e7eb6 --- /dev/null +++ b/bruno/Tests/v4/MasterSchedule/BellSchedules/test-config.json @@ -0,0 +1,18 @@ +{ + "name": "BellSchedules", + "data": { + "ENTER_SCHOOL_ID": 1549697793, + "ENTER_BELL_SCHEDULE_NAME": "Normal Schedule A", + "START_TIME": "07:00:00", + "END_TIME": "10:00:00", + "ALTERNATE_DAY_NAME": "A", + "CLASS_PERIOD_NAME_1": "Class Period 1", + "CLASS_PERIOD_NAME_2": "Class Period 2", + "CLASS_PERIOD_NAME_3": "Class Period 3" + }, + "order": [ + "bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru", + "bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru", + "bruno/Tests/v4/MasterSchedule/BellSchedules/02 - DELETE a BellSchedule.bru" + ] +} \ No newline at end of file diff --git a/bruno/Tests/v4/MasterSchedule/folder.bru b/bruno/Tests/v4/MasterSchedule/folder.bru new file mode 100644 index 0000000..5038876 --- /dev/null +++ b/bruno/Tests/v4/MasterSchedule/folder.bru @@ -0,0 +1,8 @@ +meta { + name: MasterSchedule + seq: 1 +} + +auth { + mode: inherit +} diff --git a/bruno/lint-report.json b/bruno/lint-report.json new file mode 100644 index 0000000..0336ad4 Binary files /dev/null and b/bruno/lint-report.json differ diff --git a/bruno/package-lock.json b/bruno/package-lock.json index b99a98d..be06992 100644 --- a/bruno/package-lock.json +++ b/bruno/package-lock.json @@ -12,15 +12,3897 @@ "dayjs": "^1.11.18" }, "devDependencies": { + "@usebruno/cli": "^1.40.0", "simple-git-hooks": "^2.11.1" } }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.750.0.tgz", + "integrity": "sha512-ia5+l7U1ludU/YqQAnEMj5DIp1kfMTu14lUOMG3uTIwTcj8OjkCvAe6BuM0OY6zd8enrJYWLqIqxuKPOWw4I7Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.750.0.tgz", + "integrity": "sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.918.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.918.0.tgz", + "integrity": "sha512-d3/yhRtPpRqsSjmisuy/80xASxUZNj8BqIZFiVM7yYSdRNEScRQvfWRVDcPIDQZzLZXAA9u3TND5wpGrTkGKsA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.916.0", + "@aws-sdk/credential-provider-node": "3.918.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.916.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.916.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.916.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.1", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.5", + "@smithy/middleware-retry": "^4.4.5", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.4", + "@smithy/util-defaults-mode-node": "^4.2.6", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/client-sso": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.916.0.tgz", + "integrity": "sha512-Eu4PtEUL1MyRvboQnoq5YKg0Z9vAni3ccebykJy615xokVZUdA3di2YxHM/hykDQX7lcUC62q9fVIvh0+UNk/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.916.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.916.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.916.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.916.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.1", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.5", + "@smithy/middleware-retry": "^4.4.5", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.4", + "@smithy/util-defaults-mode-node": "^4.2.6", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/core": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.916.0.tgz", + "integrity": "sha512-1JHE5s6MD5PKGovmx/F1e01hUbds/1y3X8rD+Gvi/gWVfdg5noO7ZCerpRsWgfzgvCMZC9VicopBqNHCKLykZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@aws-sdk/xml-builder": "3.914.0", + "@smithy/core": "^3.17.1", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/signature-v4": "^5.3.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.916.0.tgz", + "integrity": "sha512-3gDeqOXcBRXGHScc6xb7358Lyf64NRG2P08g6Bu5mv1Vbg9PKDyCAZvhKLkG7hkdfAM8Yc6UJNhbFxr1ud/tCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.916.0.tgz", + "integrity": "sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/node-http-handler": "^4.4.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/util-stream": "^4.5.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.918.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.918.0.tgz", + "integrity": "sha512-oDViX9z4o8jShY0unX9T7MJqyt+/ojhRB2zoLQVr0Mln7GbXwJ0aUtxgb4PFROG27pJpR11oAaZHzI3LI0jm/A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/credential-provider-env": "3.916.0", + "@aws-sdk/credential-provider-http": "3.916.0", + "@aws-sdk/credential-provider-process": "3.916.0", + "@aws-sdk/credential-provider-sso": "3.916.0", + "@aws-sdk/credential-provider-web-identity": "3.918.0", + "@aws-sdk/nested-clients": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/credential-provider-imds": "^4.2.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.918.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.918.0.tgz", + "integrity": "sha512-gl9ECsPB1i8UBPrAJV0HcTn+sgYuD3jYy8ps6KK4c8LznFizwgpah1jd3eF4qq3kPGzrdAE3MKua9OlCCNWAKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.916.0", + "@aws-sdk/credential-provider-http": "3.916.0", + "@aws-sdk/credential-provider-ini": "3.918.0", + "@aws-sdk/credential-provider-process": "3.916.0", + "@aws-sdk/credential-provider-sso": "3.916.0", + "@aws-sdk/credential-provider-web-identity": "3.918.0", + "@aws-sdk/types": "3.914.0", + "@smithy/credential-provider-imds": "^4.2.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.916.0.tgz", + "integrity": "sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.916.0.tgz", + "integrity": "sha512-gu9D+c+U/Dp1AKBcVxYHNNoZF9uD4wjAKYCjgSN37j4tDsazwMEylbbZLuRNuxfbXtizbo4/TiaxBXDbWM7AkQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.916.0", + "@aws-sdk/core": "3.916.0", + "@aws-sdk/token-providers": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.918.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.918.0.tgz", + "integrity": "sha512-qQx5qOhSovVF1EEKTc809WsiKzMqEJrlMSOUycDkE+JMgLPIy2pB2LR1crrIeBGgxFUgFsXHvNHbFjRy+AFBdA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/nested-clients": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.914.0.tgz", + "integrity": "sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-logger": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.914.0.tgz", + "integrity": "sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.914.0.tgz", + "integrity": "sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.916.0.tgz", + "integrity": "sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.916.0", + "@smithy/core": "^3.17.1", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/nested-clients": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.916.0.tgz", + "integrity": "sha512-tgg8e8AnVAer0rcgeWucFJ/uNN67TbTiDHfD+zIOPKep0Z61mrHEoeT/X8WxGIOkEn4W6nMpmS4ii8P42rNtnA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.916.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.916.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.916.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.916.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.1", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.5", + "@smithy/middleware-retry": "^4.4.5", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.4", + "@smithy/util-defaults-mode-node": "^4.2.6", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.914.0.tgz", + "integrity": "sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/token-providers": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.916.0.tgz", + "integrity": "sha512-13GGOEgq5etbXulFCmYqhWtpcEQ6WI6U53dvXbheW0guut8fDFJZmEv7tKMTJgiybxh7JHd0rWcL9JQND8DwoQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.916.0", + "@aws-sdk/nested-clients": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.914.0.tgz", + "integrity": "sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.916.0.tgz", + "integrity": "sha512-bAgUQwvixdsiGNcuZSDAOWbyHlnPtg8G8TyHD6DTfTmKTHUW6tAn+af/ZYJPXEzXhhpwgJqi58vWnsiDhmr7NQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-endpoints": "^3.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.914.0.tgz", + "integrity": "sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.916.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.916.0.tgz", + "integrity": "sha512-CwfWV2ch6UdjuSV75ZU99N03seEUb31FIUrXBnwa6oONqj/xqXwrxtlUMLx6WH3OJEE4zI3zt5PjlTdGcVwf4g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.916.0", + "@aws-sdk/types": "3.914.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.750.0.tgz", + "integrity": "sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.4", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.750.0.tgz", + "integrity": "sha512-TwBzrxgIWcQk846XFn0A9DHBHbfg4sHR3M2GL4E7NcffEkh7r642ILiLa58VvQjO2nB1tcOOFtRqbZvVOKexUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.750.0.tgz", + "integrity": "sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.750.0.tgz", + "integrity": "sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.750.0.tgz", + "integrity": "sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.750.0.tgz", + "integrity": "sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-ini": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.750.0.tgz", + "integrity": "sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.750.0.tgz", + "integrity": "sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.750.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/token-providers": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.750.0.tgz", + "integrity": "sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.750.0.tgz", + "integrity": "sha512-HpJyLHAjcn/IcvsL4WhEIgbzEWfTnn29u8QFNa5Ii9pVtxdeP/DkSthP3SNxLK2jVNcqWL9xago02SiasNOKfw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.750.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-cognito-identity": "3.750.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-ini": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.4", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.750.0.tgz", + "integrity": "sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@smithy/core": "^3.1.4", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.750.0.tgz", + "integrity": "sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.750.0.tgz", + "integrity": "sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.743.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", + "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.750.0.tgz", + "integrity": "sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.914.0.tgz", + "integrity": "sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/xml-builder/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", + "integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jitl/quickjs-ffi-types": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.29.2.tgz", + "integrity": "sha512-069uQTiEla2PphXg6UpyyJ4QXHkTj3S9TeXgaMCd8NDYz3ODBw5U/rkg6fhuU8SMpoDrWjEzybmV5Mi2Pafb5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jitl/quickjs-wasmfile-debug-asyncify": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-asyncify/-/quickjs-wasmfile-debug-asyncify-0.29.2.tgz", + "integrity": "sha512-YdRw2414pFkxzyyoJGv81Grbo9THp/5athDMKipaSBNNQvFE9FGRrgE9tt2DT2mhNnBx1kamtOGj0dX84Yy9bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-debug-sync": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-sync/-/quickjs-wasmfile-debug-sync-0.29.2.tgz", + "integrity": "sha512-VgisubjyPMWEr44g+OU0QWGyIxu7VkApkLHMxdORX351cw22aLTJ+Z79DJ8IVrTWc7jh4CBPsaK71RBQDuVB7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-asyncify": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-asyncify/-/quickjs-wasmfile-release-asyncify-0.29.2.tgz", + "integrity": "sha512-sf3luCPr8wBVmGV6UV8Set+ie8wcO6mz5wMvDVO0b90UVCKfgnx65A1JfeA+zaSGoaFyTZ3sEpXSGJU+6qJmLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-sync": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-sync/-/quickjs-wasmfile-release-sync-0.29.2.tgz", + "integrity": "sha512-UFIcbY3LxBRUjEqCHq3Oa6bgX5znt51V5NQck8L2US4u989ErasiMLUjmhq6UPC837Sjqu37letEK/ZpqlJ7aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@postman/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@postman/tunnel-agent": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.4.tgz", + "integrity": "sha512-CJJlq8V7rNKhAw4sBfjixKpJW00SHqebqNUQKxMoepgeWZIbdPcD+rguRcivGhS4N12PymDcKgUgSD4rVC+RjQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.3.tgz", + "integrity": "sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.0.tgz", + "integrity": "sha512-Kkmz3Mup2PGp/HNJxhCWkLNdlajJORLSjwkcfrj0E7nu6STAEdcMR1ir5P9/xOmncx8xXfru0fbUYLlZog/cFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.17.1.tgz", + "integrity": "sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-stream": "^4.5.4", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.3.tgz", + "integrity": "sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.4.tgz", + "integrity": "sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.3", + "@smithy/querystring-builder": "^4.2.3", + "@smithy/types": "^4.8.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.3.tgz", + "integrity": "sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.3.tgz", + "integrity": "sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.3.tgz", + "integrity": "sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.5.tgz", + "integrity": "sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.17.1", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-middleware": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.5.tgz", + "integrity": "sha512-DCaXbQqcZ4tONMvvdz+zccDE21sLcbwWoNqzPLFlZaxt1lDtOE2tlVpRSwcTOJrjJSUThdgEYn7HrX5oLGlK9A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/service-error-classification": "^4.2.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.3.tgz", + "integrity": "sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.3.tgz", + "integrity": "sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.3.tgz", + "integrity": "sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.3.tgz", + "integrity": "sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/querystring-builder": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.3.tgz", + "integrity": "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz", + "integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.3.tgz", + "integrity": "sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.3.tgz", + "integrity": "sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.3.tgz", + "integrity": "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.3.tgz", + "integrity": "sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.3.tgz", + "integrity": "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.1.tgz", + "integrity": "sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.17.1", + "@smithy/middleware-endpoint": "^4.3.5", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "@smithy/util-stream": "^4.5.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz", + "integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.3.tgz", + "integrity": "sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.4.tgz", + "integrity": "sha512-qI5PJSW52rnutos8Bln8nwQZRpyoSRN6k2ajyoUHNMUzmWqHnOJCnDELJuV6m5PML0VkHI+XcXzdB+6awiqYUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.6.tgz", + "integrity": "sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.0", + "@smithy/credential-provider-imds": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/smithy-client": "^4.9.1", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.3.tgz", + "integrity": "sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.3.tgz", + "integrity": "sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.3.tgz", + "integrity": "sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.4.tgz", + "integrity": "sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/node-http-handler": "^4.4.3", + "@smithy/types": "^4.8.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@usebruno/cli": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@usebruno/cli/-/cli-1.40.0.tgz", + "integrity": "sha512-/ckS/4VlsF/T565+EcbyvnhSlprEUk4g/x+2av79OWdDhh6ocIsiy/vWgeLgaObYlWWp1RYPPfmWlV9bQyc9xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aws-sdk/credential-providers": "3.750.0", + "@usebruno/common": "0.3.0", + "@usebruno/js": "0.26.0", + "@usebruno/lang": "0.20.0", + "@usebruno/vm2": "^3.9.13", + "aws4-axios": "^3.3.0", + "axios": "^1.8.3", + "axios-ntlm": "^1.4.2", + "chai": "^4.3.7", + "chalk": "^3.0.0", + "csv-parse": "^5.5.6", + "debug": "^4.3.5", + "decomment": "^0.9.5", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "iconv-lite": "^0.6.3", + "lodash": "^4.17.21", + "qs": "^6.11.0", + "socks-proxy-agent": "^8.0.2", + "tough-cookie": "^4.1.3", + "xmlbuilder": "^15.1.1", + "yargs": "^17.6.2" + }, + "bin": { + "bru": "bin/bru.js" + } + }, + "node_modules/@usebruno/common": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@usebruno/common/-/common-0.3.0.tgz", + "integrity": "sha512-2XFZcQ7k5/KfORSkquIZn6nmLcI6/JkiOdDxInEOrNk4IQakjOPxfoQzhx/3SsANnjlcdLJJYRG3Wrfrh98Whg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@usebruno/crypto-js": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@usebruno/crypto-js/-/crypto-js-3.1.9.tgz", + "integrity": "sha512-khvEnRF6/UVDw4df06j+6lFWGNDYWlcWnxfmEgU2o/CdsGY291NC1Cexz99ud7sbGBQP2d8JUXZe4zXPkGNJpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@usebruno/js": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@usebruno/js/-/js-0.26.0.tgz", + "integrity": "sha512-q5YM4k9lGfAEL9EybnSpjiw3fthmrvpS+RRKD1yR3seGpuPjG9hoLGzE/FoluCwHqIt8tXt9oXs2bW/vRtIDdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@usebruno/common": "0.3.0", + "@usebruno/crypto-js": "^3.1.9", + "@usebruno/query": "0.1.0", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "atob": "^2.1.2", + "axios": "^1.8.3", + "btoa": "^1.2.1", + "chai": "^4.3.7", + "chai-string": "^1.5.0", + "cheerio": "^1.0.0", + "crypto-js": "^4.1.1", + "json-query": "^2.2.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "nanoid": "3.3.8", + "node-fetch": "2.7.0", + "node-vault": "^0.10.2", + "path": "^0.12.7", + "quickjs-emscripten": "^0.29.2", + "uuid": "^9.0.0", + "xml2js": "^0.6.2" + }, + "peerDependencies": { + "@usebruno/vm2": "^3.9.13" + } + }, + "node_modules/@usebruno/lang": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@usebruno/lang/-/lang-0.20.0.tgz", + "integrity": "sha512-AFRPiPA88yUGqebLRZ3WAQMXIo6bkhqAHbgD6WYl3uEsmXH29mAbZLXGZJELTQ2f1VnaTv7G5uvtVm+s1z+jLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "arcsecond": "^5.0.0", + "dotenv": "^16.3.1", + "lodash": "^4.17.21", + "ohm-js": "^16.6.0" + } + }, + "node_modules/@usebruno/query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@usebruno/query/-/query-0.1.0.tgz", + "integrity": "sha512-+upwS01y6mMHS91pgh1Iu2nclish7N4otviIs7dJmNLI4AO3UyC3hEFzykls5A6p7mlbVSP2DCCFOPGThhPVCg==", + "dev": true + }, + "node_modules/@usebruno/vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/@usebruno/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-WIrR9ODN2xkwUEoJb3awhCZO2dTgq8NWoObofAGuzFQOQ27rw96d2GJU/T8OKcygjfJiNei9nuqidyMh81kiug==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arcsecond": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/arcsecond/-/arcsecond-5.0.0.tgz", + "integrity": "sha512-J/fHdyadnsIencRsM6oUSsraCKG+Ni9Udcgr/eusxjTzX3SEQtCUQSpP0YtImFPfIK6DdT1nqwN0ng4FqNmwgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/aws4-axios": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/aws4-axios/-/aws4-axios-3.4.0.tgz", + "integrity": "sha512-BlpjvRWiOi52k8bCeoSCTe5jKQQdSqAN18x07WR8sZghzGW6tvtuepz+72pPvImI2vCn2F5HiyLvOVAVjoha+g==", + "dev": true, + "license": "MIT", + "workspaces": [ + "infra" + ], + "dependencies": { + "@aws-sdk/client-sts": "^3.4.1", + "aws4": "^1.12.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "axios": ">=1.6.0" + } + }, + "node_modules/axios": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-ntlm": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.4.6.tgz", + "integrity": "sha512-4nR5cbVEBfPMTFkd77FEDpDuaR205JKibmrkaQyNwGcCx0szWNpRZaL0jZyMx4+mVY2PXHjRHuJafv9Oipl0Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.12.2", + "des.js": "^1.1.0", + "dev-null": "^0.1.1", + "js-md4": "^0.3.2" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.6.0.tgz", + "integrity": "sha512-sXV7whDmpax+8H++YaZelgin7aur1LGf9ZhjZa3ojETFJ0uPVuS4XEXuIagpZ/c8uVOtsSh4MwOjy5CBLjJSXA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "chai": "^4.1.2" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cliui": { + "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, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csv-parse": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", + "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dayjs": { "version": "1.11.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", "license": "MIT" }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decomment": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.5.tgz", + "integrity": "sha512-h0TZ8t6Dp49duwyDHo3iw67mnh9/UpFiSSiOb5gDK1sqoXzrfX/SQxIUQd2R2QEiSnqib0KF2fnKnGfAhAs6lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "4.0.1" + }, + "engines": { + "node": ">=6.4", + "npm": ">=2.15" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/dev-null": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "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, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "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, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "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, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-fullwidth-code-point": { + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-query": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json-query/-/json-query-2.2.2.tgz", + "integrity": "sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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-vault": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/node-vault/-/node-vault-0.10.9.tgz", + "integrity": "sha512-WBZmNt1AuWY0+Yr2A1urZyP94+qciQEEnI4GlhLdO+1kX+4E+w4n0N6CeMh56T5bJ1MIuUpshxtow0h66EaO2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "mustache": "^4.2.0", + "postman-request": "^2.88.1-postman.42", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohm-js": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-16.6.0.tgz", + "integrity": "sha512-X9P4koSGa7swgVQ0gt71UCYtkAQGOjciJPJAz74kDxWt8nXbH5HrDOQG6qBDH7SR40ktNv4x61BwpTDE9q4lRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/postman-request": { + "version": "2.88.1-postman.45", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.45.tgz", + "integrity": "sha512-Fn4Lh1sgA1IUQz4W64dXEaU/kLmB5LbTLOycR567i9BStpn5/0j5PJTwURAfQ0XPpEKAPDfrz5PzBud1TJ1XGg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", + "@postman/tunnel-agent": "^0.6.4", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "socks-proxy-agent": "^8.0.5", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/postman-request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/postman-request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/quickjs-emscripten": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.29.2.tgz", + "integrity": "sha512-SlvkvyZgarReu2nr4rkf+xz1vN0YDUz7sx4WHz8LFtK6RNg4/vzAGcFjE7nfHYBEbKrzfIWvKnMnxZkctQ898w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-wasmfile-debug-asyncify": "0.29.2", + "@jitl/quickjs-wasmfile-debug-sync": "0.29.2", + "@jitl/quickjs-wasmfile-release-asyncify": "0.29.2", + "@jitl/quickjs-wasmfile-release-sync": "0.29.2", + "quickjs-emscripten-core": "0.29.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quickjs-emscripten-core": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/quickjs-emscripten-core/-/quickjs-emscripten-core-0.29.2.tgz", + "integrity": "sha512-jEAiURW4jGqwO/fW01VwlWqa2G0AJxnN5FBy1xnVu8VIVhVhiaxUfCe+bHqS6zWzfjFm86HoO40lzpteusvyJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/require-directory": { + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/simple-git-hooks": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz", @@ -31,6 +3913,422 @@ "bin": { "simple-git-hooks": "cli.js" } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "bluebird": "^2.6.2" + } + }, + "node_modules/string-width": { + "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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/supports-color": { + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "dev": true, + "license": [ + { + "type": "Public Domain", + "url": "http://geraintluff.github.io/tv4/LICENSE.txt" + }, + { + "type": "MIT", + "url": "http://jsonary.com/LICENSE.txt" + } + ], + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "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, + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/bruno/package.json b/bruno/package.json index 968a471..b62e702 100644 --- a/bruno/package.json +++ b/bruno/package.json @@ -3,6 +3,7 @@ "dayjs": "^1.11.18" }, "devDependencies": { + "@usebruno/cli": "^1.40.0", "simple-git-hooks": "^2.11.1" }, "name": "sis", @@ -11,7 +12,8 @@ "test": "echo \"Error: no test specified\" && exit 1", "lint:bru": "node scripts/lint-bruno.cjs", "lint:bru:json": "node scripts/lint-bruno.cjs --json", - "prepare": "npx simple-git-hooks" + "prepare": "npx simple-git-hooks", + "scenarios:run": "node scripts/run-scenarios.cjs" }, "simple-git-hooks": { "pre-commit": "npm run lint:bru" diff --git a/bruno/scripts/lint-bruno.cjs b/bruno/scripts/lint-bruno.cjs index cb2ad78..55f1eb4 100644 --- a/bruno/scripts/lint-bruno.cjs +++ b/bruno/scripts/lint-bruno.cjs @@ -110,7 +110,7 @@ function lintFile(file) { // 3 Hardcoded descriptor URIs if (isCheck) { if (/uri:\/\/ed-fi\.org\//.test(txt)) { - report(file, 'Hardcoded descriptor URI found in a validation file (should rely on dynamic values)', 'WARN'); + report(file, 'Hardcoded descriptor URI found in a validation file (should rely on dynamic values)', 'ERROR'); } } @@ -145,14 +145,14 @@ function lintFile(file) { } } - // 8 settings encodeUrl - if (!/settings\s*{[\s\S]*?encodeUrl:\s*true/i.test(txt)) { - report(file, 'Missing settings encodeUrl: true', 'WARN'); + // 8 settings encodeUrl (accept both true and false) + if (!/settings\s*{[\s\S]*?encodeUrl:\s*(true|false)/i.test(txt)) { + report(file, 'Missing settings encodeUrl (should be true or false)', 'WARN'); if (FIX_MODE) { // If a settings block exists, patch it; else append new block if (/settings\s*{[\s\S]*?}/i.test(txt)) { txt = txt.replace(/settings\s*{([\s\S]*?)}(?![^{]*settings)/i, (m, inner) => { - if (/encodeUrl:\s*true/.test(inner)) return m; // race guard + if (/encodeUrl:\s*(true|false)/.test(inner)) return m; // race guard return m.replace(inner, `${inner.trim()}\n encodeUrl: true\n`); }); } else { @@ -170,9 +170,11 @@ function lintFile(file) { } // Run -const bruFiles = walk(ROOT).filter(f => - /(^|\\)(SIS|Sample Data|Assessment)(\\|\/)/.test(f) -); +const bruFiles = walk(ROOT).filter(f => { + // Normalize path separators for cross-platform compatibility + const normalizedPath = f.replace(/\\/g, '/'); + return /(^|\/)(SIS|Sample Data|Assessment)(\/|$)/.test(normalizedPath); +}); bruFiles.forEach(lintFile); SUMMARY.problems = problems.length; diff --git a/scripts/run-scenarios.README.md b/scripts/run-scenarios.README.md new file mode 100644 index 0000000..93c58d3 --- /dev/null +++ b/scripts/run-scenarios.README.md @@ -0,0 +1,179 @@ +# run-scenarios Script Usage + +## Overview + +`run-scenarios.cjs` automates execution of ordered Bruno API test scenarios for Ed-Fi certification testing. It creates an isolated mirror of the `bruno/Tests` and `bruno/SIS` collections, applies placeholder substitutions from each entity's `test-config.json`, rewrites `meta.seq` in the ordered request files, executes Bruno once per folder, and produces structured JSON results plus an aggregate summary. + +Use this to validate incremental entities as you add properly structured `test-config.json` configurations. + +## Prerequisites + +- Node.js 16+ (LTS recommended) +- Bruno CLI available via PATH (optional). If not present, script falls back to `npx -p @usebruno/cli bru`. +- A working Ed-Fi API environment defined in Bruno environment files. Default env name is `ci.ed-fi.org` (single env file stored under `bruno/Tests/environments/`). Override with `--env `. + +## File Locations + +- Script: `scripts/run-scenarios.cjs` +- Source Collections: `bruno/Tests` and `bruno/SIS` +- Mirrored Workspace: `automation-testing/` + - Per-entity result JSON: `automation-testing/results/.json` + - Aggregate summary: `automation-testing/results/summary.json` + - Latest raw Bruno output: `automation-testing/results/last-output.txt` + +## test-config.json Schema + +Each entity folder under `bruno/Tests/v4///` must include a `test-config.json` file: + +```jsonc +{ + "name": "BellSchedules", // Required: display name; if missing => config error failure + "data": { // Optional: key/value pairs used for placeholder replacement + "SCHOOL_ID": 255901001, + "BELL_SCHEDULE_NAME": "2025 Fall Schedule" + }, + "order": [ // Required: ordered list of .bru request file paths + "bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru", + "bruno/SIS/v4/MasterSchedule/BellSchedules/01 - Check BellSchedule is valid.bru", + "bruno/Tests/v4/MasterSchedule/BellSchedules/02 - DELETE a BellSchedule.bru" + ] +} +``` + +### Behavior on Missing Fields + +- Missing `name`: Adds a `CONFIG_ERROR: missing name` failure step; entity considered failed. +- Missing or empty `order`: Adds a `CONFIG_ERROR: missing order` failure step; entity considered failed. +- Both missing: Two failure steps recorded. + +## Placeholder Replacement + +All occurrences of each `data` key or bracketed form `[KEY]` inside entity-level `.bru` and `.json` files are replaced by its stringified value. Example: + +- Before: `"educationOrganizationId": [SCHOOL_ID]` +- After: `"educationOrganizationId": 255901001` + +## Execution Model + +1. Delete & recreate `automation-testing/`. +2. Copy entire `bruno/Tests` & `bruno/SIS` trees into automation root. +3. For each entity config that passes filtering: + + - Apply placeholder replacements. + - Rewrite `meta.seq` values per declared order list. + - Group ordered files by folder (`v4//`) and run Bruno once per folder. + - Parse Bruno output (HTTP status & assertion counts per request). + +4. Persist per-entity JSON with detailed `steps`. +5. Write aggregate `summary.json` (optionally with per-step detail). +6. Write/overwrite `last-output.txt` for each folder execution (contains raw combined stdout/stderr of the most recent run). + +## CLI Flags + +- `--entities BellSchedules,StudentSchoolAttendanceEvents` Filter execution to listed folder entity names (directory names under `v4/`). Matches folder name only, not the `name` property. +- `--include-steps` Include per-step detail for each entity in aggregate `summary.json`. Without this flag, aggregate only contains per-entity totals. +- `--env ` Override environment used for Bruno runs (defaults to `ci.ed-fi.org`). Warns if no matching `.bru` file is found in `bruno/Tests/environments`. + +## Exit Codes + +- `0`: All processed entities have zero failed assertions and no config errors. +- `1`: At least one entity has failed assertions OR config error steps. + +## Output Artifacts + +### Per-Entity JSON Structure + +```jsonc +{ + "entity": "BellSchedules", + "totalPass": 2, + "totalFail": 17, + "steps": [ + { + "file": "bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru", + "folder": "v4/MasterSchedule/BellSchedules", + "status": "FAIL", + "httpStatus": 400, + "assertionsPassed": 0, + "assertionsFailed": 1 + } + // ... more steps + ] +} +``` + +### Aggregate Summary (without steps) + +```jsonc +{ + "generatedAt": "2025-10-29T02:19:35.626Z", + "entities": [ + { + "entity": "BellSchedules", + "assertions": { "passed": 2, "failed": 17, "total": 19 } + } + ], + "totals": { + "entitiesProcessed": 1, + "assertionsPassed": 2, + "assertionsFailed": 17, + "assertionsTotal": 19 + }, + "exitStatus": "FAIL" +} +``` + +### Aggregate Summary (with --include-steps) + +Adds a `steps` array per entity mirroring a subset of per-entity JSON. + +## Usage Examples + +Run all configured entities (named configs only): + +```powershell +node scripts/run-scenarios.cjs +``` + +Just BellSchedules (slim aggregate): + +```powershell +node scripts/run-scenarios.cjs --entities BellSchedules +``` + +Run specific entities (folder names) including step details in the aggregate: + +```powershell +node scripts/run-scenarios.cjs --entities BellSchedules,StudentAssessments --include-steps +``` + +Custom environment and include steps: + +```powershell +node scripts/run-scenarios.cjs --env staging.ed-fi.org --include-steps +``` + +## Troubleshooting + +- Raw output: Inspect `automation-testing/results/last-output.txt` for parsing anomalies. +- Config failures: Check each entity's `test-config.json` for `name` and `order` presence. +- Missing requests: Ensure paths in `order` are accurate and point to existing `.bru` files. +- Bruno CLI not found: Script automatically falls back to `npx`; ensure internet access for first run. + +## Extending + +Potential enhancements: + +- Capture assertion messages (currently only counts). +- Add timing metrics aggregate. +- Support pattern filters (wildcards) for `--entities`. +- Archive historical outputs (timestamped directories). + +## Maintenance Notes + +- Keep placeholder keys unique to avoid unintended replacements. +- Avoid very large `order` lists from multiple folders—script consolidates per folder but excessive breadth may lengthen runs. + +## License + +Refer to repository LICENSE for usage terms. diff --git a/scripts/run-scenarios.cjs b/scripts/run-scenarios.cjs new file mode 100644 index 0000000..0b2350d --- /dev/null +++ b/scripts/run-scenarios.cjs @@ -0,0 +1,576 @@ +#!/usr/bin/env node +/** + * run-scenarios.cjs + * + * Purpose: + * Orchestrates automated QA runs for Bruno collections. It creates a clean + * mirror under automation-testing/, applies data placeholders from each + * entity's test-config.json, rewrites meta.seq to match declared order, and + * executes Bruno once per unique folder referenced in the order list. + * + * Key behaviors: + * - Discovers entity folders by locating test-config.json under bruno/Tests. + * - Requires both `name` and `order` in test-config.json; each missing item + * is recorded as a config error step (FAIL). + * - Performs exact placeholder replacement for keys or [KEY] across .bru/.json files. + * - Executes Bruno folder(s) with stderr merged into stdout for chronological output. + * - Parses per-request HTTP status and assertion pass/fail counts. + * - Generates per-entity JSON result files and a slim aggregate summary.json. + * - Optional flag `--include-steps` adds per-step details to the aggregate summary. + * - Always writes last-output.txt for debugging the most recent Bruno execution. + * + * Flags: + * --entities A,B,C Limit processing to specified folder entity names. + * --include-steps Include detailed per-step data in aggregate summary.json. + * + * Exit code: + * 0 if all processed entities have zero failed assertions and no config errors. + * 1 otherwise. + */ + +const fs = require('fs'); +const path = require('path'); +const { spawnSync } = require('child_process'); + +const ROOT = path.resolve(__dirname, '..'); +const TESTS_ROOT = path.join(ROOT, 'bruno', 'Tests'); +const SIS_ROOT = path.join(ROOT, 'bruno', 'SIS'); +const AUTOMATION_ROOT = path.join(ROOT, 'automation-testing'); + +function log(msg) { console.log(msg); } +function error(msg) { console.error(msg); } + +/** + * Parse CLI arguments. + * Supported options: + * --entities Filter by entity folder names (matches directory name, not cfg.name) + * --include-steps Include per-step details inside aggregate summary.json + */ +function parseArgs() { + const args = process.argv.slice(2); + const entities = []; + let includeSteps = false; + let envName = 'ci.ed-fi.org'; + for (let i=0; is.trim()).filter(Boolean).forEach(e=>entities.push(e)); + } else if (args[i] === '--include-steps') { + includeSteps = true; + } else if (args[i] === '--env' || args[i] === '-env') { + const val = args[i+1]; + i++; + if (val) envName = val.trim(); + } + } + return { entitiesFilter: entities, includeSteps, envName }; +} + +/** + * Recursively find all test-config.json files under the Tests root. + * Returns absolute file paths. + */ +function findEntityConfigs() { + const results = []; + const walk = (dir) => { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const e of entries) { + const full = path.join(dir, e.name); + if (e.isDirectory()) { + walk(full); + } else if (e.isFile() && e.name === 'test-config.json') { + // entity folder is parent + results.push(full); + } + } + }; + walk(TESTS_ROOT); + return results; +} + +/** + * Load and parse JSON test-config file. Throws with contextual error on invalid JSON. + */ +function loadTestConfig(configPath) { + const raw = fs.readFileSync(configPath, 'utf8'); + try { return JSON.parse(raw); } catch (e) { throw new Error(`Invalid JSON in ${configPath}: ${e.message}`); } +} + +/** + * Derive group and entity folder names from a test-config path. + * Expected structure: .../Tests/v4///test-config.json + */ +function deriveEntityInfo(configPath) { + // Expect pattern .../Tests/v4///test-config.json + const parts = configPath.split(path.sep); + const idx = parts.lastIndexOf('v4'); + if (idx === -1) throw new Error(`Cannot derive v4 segment from ${configPath}`); + const group = parts[idx+1]; + const entity = parts[idx+2]; + return { group, entity }; +} + +/** + * Delete and recreate automation-testing root. Retries transient Windows lock errors. + */ +function resetAutomationRoot() { + if (fs.existsSync(AUTOMATION_ROOT)) { + let attempts = 0; + while (attempts < 5) { + try { + fs.rmSync(AUTOMATION_ROOT, { recursive: true, force: true }); + break; + } catch (e) { + if (e.code === 'EBUSY' || e.code === 'EPERM') { + attempts++; + Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 200); // small delay + continue; + } else { + throw e; + } + } + } + } + fs.mkdirSync(AUTOMATION_ROOT, { recursive: true }); +} + +/** + * Copy entire Tests and SIS collections into automation root for isolated mutation. + */ +function copyEntireCollections() { + copyDirRecursive(TESTS_ROOT, AUTOMATION_ROOT); + copyDirRecursive(SIS_ROOT, AUTOMATION_ROOT); +} + +function copyDirRecursive(src, dest) { + if (!fs.existsSync(src)) return; + fs.mkdirSync(dest, { recursive: true }); + const entries = fs.readdirSync(src, { withFileTypes: true }); + for (const e of entries) { + const s = path.join(src, e.name); + const d = path.join(dest, e.name); + if (e.isDirectory()) { + copyDirRecursive(s, d); + } else if (e.isFile()) { + fs.copyFileSync(s, d); + } + } +} + +/** + * Apply placeholder replacements for a single entity's mirrored folder. + * Only processes .bru and .json files at the entity root level. + */ +function mirrorEntity(group, entity, dataMap) { + // After full copy, just apply replacements in the mirrored entity folders + const mirrorSISDir = path.join(AUTOMATION_ROOT, 'v4', group, entity); + [mirrorSISDir].forEach(dir => { + if (!fs.existsSync(dir)) return; + const files = fs.readdirSync(dir); + for (const f of files) { + const fp = path.join(dir, f); + if (fs.statSync(fp).isFile() && (f.endsWith('.bru') || f.endsWith('.json'))) { + let content = fs.readFileSync(fp, 'utf8'); + content = replacePlaceholders(content, dataMap); + fs.writeFileSync(fp, content, 'utf8'); + } + } + }); +} + +/** + * Replace raw or bracketed occurrences of each key with its mapped value. + * Example: KEY or [KEY] -> value + */ +function replacePlaceholders(content, dataMap) { + for (const [key, value] of Object.entries(dataMap)) { + const val = typeof value === 'string' ? value : String(value); + // Replace raw occurrences optionally wrapped in [] already + // If value currently appears as [KEY] or KEY inside brackets keep only value + content = content.replace(new RegExp(`\\[?${escapeRegExp(key)}\\]?`, 'g'), val); + } + return content; +} + +/** + * Execute ordered .bru requests grouping by folder to minimize Bruno invocations. + * Returns per-step result objects with assertion counts and HTTP status. + */ + function executeOrder(orderList, envName) { + // Group ordered items by folder so each folder is executed only once. + const byFolder = new Map(); + for (const item of orderList) { + const folderRel = deriveMergedFolderRelative(item); + if (!byFolder.has(folderRel)) byFolder.set(folderRel, []); + byFolder.get(folderRel).push(item); + } + + const folderExecutions = new Map(); // folderRel -> { raw, requestsParsed } + for (const [folderRel, items] of byFolder.entries()) { + const folderAbs = path.join(AUTOMATION_ROOT, folderRel); + if (!fs.existsSync(folderAbs)) { + error(`Missing folder for ordered items: ${folderRel}`); + folderExecutions.set(folderRel, { error: 'FOLDER_NOT_FOUND', requestsParsed: [] }); + continue; + } + const exec = runBrunoFolder(folderRel, envName); + const parsedRequests = parseRequests(exec.raw); + folderExecutions.set(folderRel, { ...exec, requestsParsed: parsedRequests }); + } + + // Map each order item to its parsed request + const results = []; + for (const item of orderList) { + const folderRel = deriveMergedFolderRelative(item); + const exec = folderExecutions.get(folderRel); + if (!exec || exec.error) { + results.push({ file: item, folder: folderRel, status: 'FOLDER_NOT_FOUND', assertionsPassed: 0, assertionsFailed: 1 }); + continue; + } + const requestName = path.basename(item).replace(/\.bru$/,''); + const req = exec.requestsParsed.find(r => r.name === requestName); + if (!req) { + results.push({ file: item, folder: folderRel, status: 'NOT_EXECUTED', assertionsPassed: 0, assertionsFailed: 1 }); + continue; + } + // Determine pass/fail: HTTP 2xx AND assertionsFailed=0 + const passHttp = req.statusCode && req.statusCode >=200 && req.statusCode <300; + const status = (passHttp && req.assertionsFailed === 0) ? 'PASS' : 'FAIL'; + results.push({ + file: item, + folder: folderRel, + status, + httpStatus: req.statusCode, + assertionsPassed: req.assertionsPassed, + assertionsFailed: req.assertionsFailed + }); + } + return results; + } + +/** + * Given an original .bru path, derive relative folder path (e.g., v4/Group/Entity). + */ + function deriveMergedFolderRelative(originalPath) { + // Original examples: bruno/Tests/v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule.bru + // We need: v4/MasterSchedule/BellSchedules + const norm = originalPath.replace(/\\/g,'/'); + const parts = norm.split('/'); + const v4Index = parts.indexOf('v4'); + if (v4Index === -1) return norm; // fallback + // folder path components up to entity (exclude file name) + const relParts = parts.slice(v4Index, parts.length - 1); + return relParts.join('/'); + } + +/** + * Invoke Bruno CLI for a folder, attempt PATH first then fallback to npx install. + * Merges stderr into stdout to preserve chronological ordering. + * Writes last-output.txt for each execution (overwrites each time). + */ + function runBrunoFolder(relativeFolder, envName) { + // Run Bruno with stderr redirected to stdout to preserve chronological ordering. + // Previous approach concatenated stdout + stderr which caused out-of-order lines. + const baseCmd = `bru run "${relativeFolder}" --env ${envName} 2>&1`; + let proc = spawnSync(baseCmd, { + encoding: 'utf8', cwd: AUTOMATION_ROOT, env: { ...process.env, FORCE_COLOR: '0' }, shell: true + }); + let combined = proc.stdout || ''; + let exitCode = proc.status; + // Fallback to npx package invocation if summary line not detected (CLI not on PATH) + if (!/Assertions:\s+\d+\s+passed/i.test(combined)) { + const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + const fallbackCmd = `${npxCmd} -p @usebruno/cli bru run "${relativeFolder}" --env ${envName} 2>&1`; + proc = spawnSync(fallbackCmd, { + encoding: 'utf8', cwd: AUTOMATION_ROOT, env: { ...process.env, FORCE_COLOR: '0' }, shell: true + }); + combined = proc.stdout || ''; + exitCode = proc.status; + } + if (!runBrunoFolder._printedSample) { + const head = combined.split(/\r?\n/).slice(0,40).join('\n'); + const tail = combined.split(/\r?\n/).slice(-15).join('\n'); + log('[DEBUG] Bruno output (head):\n' + head); + log('[DEBUG] Bruno output (tail):\n' + tail); + log('[DEBUG] Exit code: ' + exitCode); + runBrunoFolder._printedSample = true; + } + const summary = parseBrunoSummary(combined); + // Always write last-output.txt for debugging (overwrites each folder execution) + try { + const resultsDir = path.join(AUTOMATION_ROOT, 'results'); + fs.mkdirSync(resultsDir, { recursive: true }); + fs.writeFileSync(path.join(resultsDir, 'last-output.txt'), combined, 'utf8'); + } catch {} + const status = summary.assertionsFailed === 0 && exitCode === 0 ? 'PASS' : 'FAIL'; + return { + status, + assertionsPassed: summary.assertionsPassed, + assertionsFailed: summary.assertionsFailed, + raw: combined + }; + } + +/** + * Parse the final Assertions summary line from Bruno output. + * Uses the last occurrence if multiple appear. + */ + function parseBrunoSummary(output) { + // Expected lines similar to: + // Requests: 3 passed, 3 total + // Tests: 0 passed, 0 total + // Assertions: 17 passed, 17 total + let assertionsPassed = 0; + let assertionsTotal = 0; + const lines = output.split(/\r?\n/); + // Some executions print summary twice; take the last occurrence + for (let i = lines.length - 1; i >= 0; i--) { + const l = lines[i]; + const m = l.match(/Assertions:\s+(\d+)\s+passed,\s+(\d+)\s+total/i); + if (m) { + assertionsPassed = parseInt(m[1],10); + assertionsTotal = parseInt(m[2],10); + break; + } + } + return { assertionsPassed, assertionsFailed: assertionsTotal - assertionsPassed }; + } + +// Helper (currently unused externally) to map original source to mirrored path if needed later. +function getMirroredPath(original) { + // Map bruno/Tests/... to automation-testing/Tests/... similarly for SIS + const rel = path.relative(ROOT, original); + if (rel.startsWith(path.join('bruno', 'Tests'))) { + return path.join(AUTOMATION_ROOT, rel.substring(path.join('bruno', 'Tests').length + 1)); + } + if (rel.startsWith(path.join('bruno', 'SIS'))) { + return path.join(AUTOMATION_ROOT, rel.substring(path.join('bruno', 'SIS').length + 1)); + } + return null; +} + +/** + * Parse per-request sections from Bruno output: request header + assertions block. + * Collects status code, timing, and raw assertion pass/fail counts. + */ +function parseRequests(output) { + const lines = output.split(/\r?\n/); + // Match lines like: + // v4/MasterSchedule/BellSchedules/01 - CREATE a BellSchedule (201 Created) - 907 ms + // or with backslashes on some platforms. Capture groups: (1) filename, (2) statusCode, (3) timeMs + const requestHeaderRegex = /^v4[\/\\].*?\/([^\/]+) \((\d{3})(?: [^)]+)?\) - (\d+) ms$/; + const requestHeaderRegexAlt = /^v4[\/\\].*?\/([^\/]+) \((\d{3})\) - (\d+) ms$/; // fallback variant + const requests = []; + let current = null; + let inAssertions = false; + for (let i=0;ia+r.assertionsPassed,0); + const totalFail = results.reduce((a,r)=>a+r.assertionsFailed,0); + const summary = { entity, totalPass, totalFail, steps: results }; + const resultsDir = path.join(AUTOMATION_ROOT, 'results'); + fs.mkdirSync(resultsDir, { recursive: true }); + const jsonPath = path.join(resultsDir, `${entity}.json`); + // For console visibility still print a concise summary + const lines = [`Entity: ${entity}`, `Assertions Passed: ${totalPass}`, `Assertions Failed: ${totalFail}`]; + for (const r of results) lines.push(`${r.status} - ${r.file} (pass:${r.assertionsPassed} fail:${r.assertionsFailed})`); + fs.writeFileSync(jsonPath, JSON.stringify(summary, null, 2), 'utf8'); + log(lines.join('\n')); + return summary; +} + +// Removed dynamic ordering helpers; execution order must come explicitly from test-config.json + +/** + * Rewrite meta.seq inside each ordered .bru file to reflect declared order. + */ +function rewriteMetaSeq(group, entity, orderedPaths) { + // After placeholders: update meta seq values inside mirrored automation directory + const targetDir = path.join(AUTOMATION_ROOT, 'v4', group, entity); + if (!fs.existsSync(targetDir)) return; + let seq = 1; + for (const originalPath of orderedPaths) { + const fileName = path.basename(originalPath); + const mirroredFile = path.join(targetDir, fileName); + if (!fs.existsSync(mirroredFile)) continue; + let content = fs.readFileSync(mirroredFile, 'utf8'); + // Replace existing meta seq line or insert if missing + if (/meta\s*{[\s\S]*?seq:\s*\d+/m.test(content)) { + content = content.replace(/(meta\s*{[\s\S]*?seq:)\s*\d+/m, `$1 ${seq}`); + } else { + // Insert seq after 'type: http' if present + content = content.replace(/(meta\s*{[\s\S]*?type:\s*http)/m, `$1\n seq: ${seq}`); + } + fs.writeFileSync(mirroredFile, content, 'utf8'); + seq++; + } +} + +/** + * Main orchestration: parse args, mirror collections, process each entity config, + * execute ordered tests, write aggregate summary, set exit code. + */ +function main() { + const { entitiesFilter, includeSteps, envName } = parseArgs(); + // Ensure results directory exists early so last-output.txt can be written by first folder execution + try { fs.mkdirSync(path.join(AUTOMATION_ROOT, 'results'), { recursive: true }); } catch {} + verifyEnvironmentExists(envName); + resetAutomationRoot(); + copyEntireCollections(); + + const configs = findEntityConfigs(); + if (configs.length === 0) { + log('No test-config.json files found. Exiting.'); + return; + } + + const summaries = []; + + // No master entity list; process all found configs unless --entities filters provided. + + for (const cfgPath of configs) { + const { group, entity } = deriveEntityInfo(cfgPath); + // Load config early to check optional name override + const cfg = loadTestConfig(cfgPath); + const cfgName = typeof cfg.name === 'string' && cfg.name.trim().length ? cfg.name.trim() : entity; + // Filter precedence: if entitiesFilter provided, match against folder entity identifier only + if (entitiesFilter.length && !entitiesFilter.includes(entity)) { + continue; + } + const dataMap = cfg.data || {}; + const order = Array.isArray(cfg.order) ? cfg.order : []; + + // Handle missing name and order as config failures. If both missing, report missing name first. + const configErrors = []; + if (!cfg.name || !cfg.name.trim().length) { + configErrors.push('missing name'); + } + if (!order.length) { + configErrors.push('missing order'); + } + if (configErrors.length) { + for (const ce of configErrors) { + error(`Entity folder '${entity}' has config error: ${ce}. Marking as failure.`); + } + const pseudo = configErrors.map(err => ({ + file: `CONFIG_ERROR: ${err}`, + folder: '', + status: 'FAIL', + httpStatus: undefined, + assertionsPassed: 0, + assertionsFailed: 1 + })); + const summary = summarizeEntity(cfgName, pseudo); + summaries.push(summary); + continue; // move to next entity + } + + log(`Processing entity ${entitiesFilter.length ? entity : cfgName} (${group}) with ${order.length} steps.`); + // Use folder entity name for directory operations; cfgName only for reporting label + mirrorEntity(group, entity, dataMap); + try { rewriteMetaSeq(group, entity, order); } catch (e) { error(`Failed to rewrite meta.seq for ${cfgName}: ${e.message}`); } + const resultSteps = executeOrder(order, envName); + const summary = summarizeEntity(cfgName, resultSteps); + summaries.push(summary); + } + + // Overall exit code: fail if any entity had failures + const overallFail = summaries.some(s => s.totalFail > 0); + + // Write aggregate summary.json + try { + const aggregate = { + generatedAt: new Date().toISOString(), + entities: summaries.map(s => { + const base = { + entity: s.entity, + assertions: { + passed: s.totalPass, + failed: s.totalFail, + total: s.totalPass + s.totalFail + } + }; + if (includeSteps) { + base.steps = s.steps.map(step => ({ + file: step.file, + status: step.status, + httpStatus: step.httpStatus, + assertionsPassed: step.assertionsPassed, + assertionsFailed: step.assertionsFailed + })); + } + return base; + }), + totals: { + entitiesProcessed: summaries.length, + assertionsPassed: summaries.reduce((a,s)=>a+s.totalPass,0), + assertionsFailed: summaries.reduce((a,s)=>a+s.totalFail,0), + assertionsTotal: summaries.reduce((a,s)=>a+s.totalPass+s.totalFail,0) + }, + exitStatus: overallFail ? 'FAIL' : 'PASS' + }; + const resultsDir = path.join(AUTOMATION_ROOT, 'results'); + fs.mkdirSync(resultsDir, { recursive: true }); + fs.writeFileSync(path.join(resultsDir, 'summary.json'), JSON.stringify(aggregate, null, 2), 'utf8'); + log(`Wrote aggregate summary.json with status ${aggregate.exitStatus}${includeSteps ? ' (steps included)' : ' (steps omitted; use --include-steps to add)'}`); + } catch (e) { + error('Failed to write aggregate summary.json: ' + e.message); + } + + process.exit(overallFail ? 1 : 0); +} + +main(); + +function verifyEnvironmentExists(envName) { + const testsEnv = path.join(TESTS_ROOT, 'environments', `${envName}.bru`); + if (!fs.existsSync(testsEnv)) { + log(`[WARN] Environment '${envName}' not found in Tests environments (expected at ${testsEnv}). Proceeding, but Bruno may error if the env name is invalid.`); + } +}