From 4106bf318ebc1b00f209f619e3c5951b1abc0771 Mon Sep 17 00:00:00 2001 From: BatchData Date: Wed, 28 Oct 2026 17:07:22 -0700 Subject: [PATCH] v0.2.0: broad catalog (V1-V3), triggers, batch actions, API request, logo --- .github/workflows/ci.yml | 16 + LICENSE | 2 +- README.md | 100 +- authentication.js | 57 + index.js | 20 + lib/builders.js | 238 + lib/catalog-modules.js | 276 + lib/catalog.json | 3084 ++++ lib/catalog.sha256 | 1 + lib/common.js | 110 + lib/constants.js | 73 + lib/engine.js | 274 + lib/execute.js | 52 + lib/fields.js | 45 + lib/modules.js | 68 + lib/operations.js | 243 + lib/outputFields.js | 47 + logo.png | Bin 0 -> 21652 bytes logo.svg | 1 + middleware.js | 57 + package-lock.json | 12066 ++++++++++++++++ package.json | 30 + samples/check_dnc.json | 8 + samples/check_tcpa.json | 8 + samples/lookup_property.json | 38 + samples/search_properties.json | 33 + samples/skip_trace.json | 61 + samples/verify_address.json | 18 + samples/verify_phone.json | 15 + scripts/make-samples.js | 74 + test/builders.test.js | 109 + test/catalog.test.js | 230 + test/fixtures/address-verify.json | 61 + test/fixtures/phone-dnc.json | 49 + test/fixtures/phone-tcpa.json | 41 + test/fixtures/phone-verification.json | 40 + .../property-lookup-all-attributes.json | 562 + test/fixtures/property-search.json | 593 + test/fixtures/property-skip-trace.json | 122 + test/fixtures/v3-property-skip-trace.json | 193 + test/helpers.js | 34 + test/modules.test.js | 129 + test/structure.test.js | 88 + test/zapier-app.test.js | 50 + 44 files changed, 19395 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 authentication.js create mode 100644 index.js create mode 100644 lib/builders.js create mode 100644 lib/catalog-modules.js create mode 100644 lib/catalog.json create mode 100644 lib/catalog.sha256 create mode 100644 lib/common.js create mode 100644 lib/constants.js create mode 100644 lib/engine.js create mode 100644 lib/execute.js create mode 100644 lib/fields.js create mode 100644 lib/modules.js create mode 100644 lib/operations.js create mode 100644 lib/outputFields.js create mode 100644 logo.png create mode 100644 logo.svg create mode 100644 middleware.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 samples/check_dnc.json create mode 100644 samples/check_tcpa.json create mode 100644 samples/lookup_property.json create mode 100644 samples/search_properties.json create mode 100644 samples/skip_trace.json create mode 100644 samples/verify_address.json create mode 100644 samples/verify_phone.json create mode 100644 scripts/make-samples.js create mode 100644 test/builders.test.js create mode 100644 test/catalog.test.js create mode 100644 test/fixtures/address-verify.json create mode 100644 test/fixtures/phone-dnc.json create mode 100644 test/fixtures/phone-tcpa.json create mode 100644 test/fixtures/phone-verification.json create mode 100644 test/fixtures/property-lookup-all-attributes.json create mode 100644 test/fixtures/property-search.json create mode 100644 test/fixtures/property-skip-trace.json create mode 100644 test/fixtures/v3-property-skip-trace.json create mode 100644 test/helpers.js create mode 100644 test/modules.test.js create mode 100644 test/structure.test.js create mode 100644 test/zapier-app.test.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b3e31a5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,16 @@ +name: CI +on: + pull_request: + push: + branches: [main, dev] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - run: npm install + - run: npm test + - run: npx zapier validate diff --git a/LICENSE b/LICENSE index c44fb1d..421d751 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 BatchData +Copyright (c) 2026 BatchData (batchdata.io) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 4902cf6..0966d52 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # BatchData for Zapier -Zapier integration for the [BatchData](https://batchdata.io) API: search properties, look up a property record, skip trace owners, verify addresses, and check phone numbers for reachability, Do Not Call (DNC) and TCPA litigator status. +Zapier integration for the [BatchData](https://batchdata.io) API. It covers property search and lookup, skip tracing (V1 and V3), reverse skip trace, address tools, phone checks (reachability, DNC, TCPA), permits, investor buy box, search sessions and property monitors, with polling and instant (REST hook) triggers and a generic API request action. Support: support@batchservice.com -> **Status: v0.1, not yet published.** The code passes its local tests with mocked HTTP. It has not been pushed to Zapier or run against the live BatchData API. See [Publishing](#publishing) and [What was and was not verified](#what-was-and-was-not-verified). +> **Status: v0.2.0, not yet pushed to Zapier.** It passes `zapier-platform validate` and its local tests. Most operations were smoke-tested live; monitors and the instant trigger were not (see [What was and was not verified](#what-was-and-was-not-verified)). + +![BatchData](logo.png) ## Authentication @@ -40,21 +42,58 @@ Searches return one record per person. The Action returns one object with `perso Phone results are a point-in-time answer. Re-check before each campaign. You are responsible for meeting TCPA, DNC and other calling rules in your jurisdiction. -## Not included in v0.1 +## Added in v0.2 + +Searches (return records to later steps) and actions (change something or send a batch): + +| Zapier module | Type | Endpoint | Billing | +| --- | --- | --- | --- | +| Reverse Skip Trace (Phone or Email) | Search, Action | `POST /api/v3/property/reverse-skip-trace` | Per matched result. Flagged-phone setting always sent explicitly (default off). | +| Get Property Permits | Search | `POST /api/v2/property/get-property-permits` | Per the plan; see the module description. | +| Batch Skip Trace Properties (V3) | Action | `POST /api/v3/property/skip-trace` | Per matched result, up to 100 rows. | +| Batch Look Up Properties | Action | `POST /api/v1/property/lookup/all-attributes` | Per returned record, up to 100 rows. | +| Batch Verify Addresses | Action | `POST /api/v1/address/verify` | Per submitted address, up to 100 rows. | +| Autocomplete, Geocode, Reverse Geocode | Search | `POST /api/v1/address/...` | This call does not bill property records. | +| Find Investors (Buy Box), Get Investor Properties | Search | `POST /api/v2/investor/...` | See the module description. | +| List / Create or Advance / Delete Search Session | Search, Action | `/api/v2/property/search-sessions`, `POST /api/v1/property/search` | Creating or advancing a session bills each record delivered. Sessions are capped per team and need the search-sessions token ability. | +| Get / Create / Delete Property Monitor | Search, Action | `/api/v2/property-subscription` | Billed according to your plan (support@batchservice.com). | +| API Request (Advanced) | Action | any `/api/...` path | Depends on the endpoint called. | + +Triggers: + +| Trigger | Type | Notes | +| --- | --- | --- | +| New Search Session | Polling | Lists sessions. Free. | +| New Property Monitor | Polling | Lists monitors. | +| New Property in Search Session (Billed) | Polling | Advances a cursor-paginated session and returns the new records. Each record is billed. | +| New Property Monitor Event | Instant (REST hook) | See below. | + +### Instant trigger: property monitor events + +Turning the Zap on creates a V2 property subscription (monitor) whose delivery is `{type: "webhook", url: }`; turning it off deletes that subscription (`DELETE /api/v2/property-subscription/{id}`). The user cannot enter a callback URL anywhere. Each event is `{eventId, propertyId, parcelHash, addressHash, addedToSubscriptionIds, removedFromSubscriptionIds, propertyChangedAt, sentAt}`; `eventId` is the dedupe key. The event carries IDs only. Turn on **Include Property Record (Billed)** (off by default) to add the full record through a Property Lookup, which bills per matched property. + +Monitor limits (also in every monitor module description): up to 5 monitors per team, monitors cannot be edited after creation, a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event). Because of the 5-monitor limit, avoid many Zaps that each create a monitor. + +**Create Property Monitor** is limited to stream delivery (Kinesis or Azure Event Hubs). The webhook delivery option is used only by the trigger above. + +### API Request (Advanced) + +Sends any `/api/...` request with the connected token. It refuses, before any call is made: paths containing `wallet` (account balance and billing), asynchronous (`async`) endpoints, creating a monitor (use the dedicated module), non-`/api/` paths, traversal and encoded variants. `webhookUrl` and `errorWebhookUrl` keys are removed from the body at any depth. -- **Triggers.** BatchData's event delivery today is search sessions (billed per record while they drain a frozen result set, capped per team, and with no way to clean up when a Zap is turned off) and the V2 property-subscription webhook (payload not yet documented). Neither is safe to turn into a REST hook yet. A trigger is planned once there is a documented, cleanly cancellable event source. -- **Callback URLs** (`webhookUrl`, `errorWebhookUrl`). These apply only to BatchData's asynchronous requests, not the synchronous endpoints used here. They are never exposed and are removed from the Additional Search Criteria JSON. -- **Wallet and account-balance endpoints.** Never exposed. -- **Custom API call.** Zapier has no generic request module for a custom app. Use Zapier's own Webhooks or API Request step with a BatchData token for other endpoints. -- Reverse skip trace, permits, investor and monitor endpoints, and the asynchronous endpoints are follow-ups. +## Not exposed + +- **Callback URLs** (`webhookUrl`, `errorWebhookUrl`) on asynchronous requests. Never exposed and stripped from JSON inputs. +- **Wallet and billing endpoints.** Never exposed. +- **Asynchronous endpoints.** Not exposed. +- A **custom monitor webhook URL.** Only the trigger's own hook URL is ever used. ## Development ```bash +# Node 22 or newer is required by the Zapier CLI npm install -npm test # node:test unit tests, plus the Zapier harness tests once packages are installed -npx zapier validate # schema and publishing checks -npx zapier test # the same tests through the Zapier CLI +npm test # node:test unit tests with mocked HTTP +npx zapier-platform validate # schema and publishing checks ``` Layout: @@ -65,7 +104,10 @@ authentication.js API key auth and connection test middleware.js Bearer header and error mapping (401 reconnect, 429 throttle, 4xx/5xx messages) lib/operations.js the 7 operations: fields, request builders, response extraction lib/builders.js pure request body builders -lib/modules.js turns operations into searches and actions +lib/modules.js turns operations into searches and actions, merges the catalog modules +lib/catalog.json shared declarative catalog (v0.2 modules), identical in the n8n and Make repos +lib/catalog-modules.js turns catalog entries into searches, creates and triggers +lib/engine.js catalog request builder and response extractor (copy of shared/engine.cjs) samples/ trimmed sample records (regenerate with `npm run samples`) test/ mocked-HTTP tests; fixtures are derived from the BatchData OpenAPI schemas ``` @@ -74,14 +116,32 @@ test/ mocked-HTTP tests; fixtures are derived from the BatchData O ## Publishing -1. Create a Zapier developer account with the BatchData company email. -2. Authenticate the Zapier CLI with that account (`npx zapier login`). -3. `npx zapier register "BatchData"`, then `npx zapier push`. Commit the generated `.zapierapprc`. -4. Add a logo (256x256 PNG) and the app description in the Zapier platform UI, add a test account, and submit for review (`npx zapier promote 0.1.0`). -5. Zapier's review needs a working test account, so BatchData must provide an API token for it. +Exact steps (the CLI needs Node 22 or newer). Use the Zapier developer account that will own the app. A deploy key is enough; no GitHub repository is needed. + +```bash +cd batchdata-zapier +npm install +npx zapier-platform login # interactive; or export ZAPIER_DEPLOY_KEY= for non-interactive use +npx zapier-platform register "BatchData" # first time only; creates .zapierapprc (commit it) +npx zapier-platform validate +npm test +npx zapier-platform push # uploads the version in package.json (0.2.0) +npx zapier-platform invite you@example.com # optional: test with a few users first +npx zapier-platform promote 0.2.0 # starts review for public listing +``` + +Before promoting: add a test account (a sandbox API token from app.batchdata.com, which returns mock data at no cost), and review the listing text in the Zapier editor. The icon is `logo.png` (256x256, from the official BatchData logo). The first push must use a version that is not already live. ## What was and was not verified -- Unit tests with mocked HTTP: request bodies, endpoints, response mapping, error mapping, and sample/outputFields consistency. These pass. -- `zapier validate` and `zapier test` have not been run, because the Zapier packages could not be installed in the build environment. The harness tests in `test/zapier-app.test.js` run only once the packages are installed. Run both before pushing. -- Nothing has been called against the live BatchData API. The mocked tests prove request shape and output mapping from the OpenAPI schemas, not live behavior. +Verified live against the production API with the real token (1 record per call): property search, lookup, skip trace V1 and V3, reverse skip trace (no match), address verify, DNC, permits, investor buy box and properties, geocode, reverse geocode, autocomplete, and the search-session create, list and delete lifecycle. + +Not verified live (mocked only): property monitors and the instant trigger. The production token used gets 403 on the subscription endpoints. A sandbox token or a token with that ability is needed to verify create, list, delete and event delivery. The webhook delivery shape follows the BatchData product documentation. + +Tests: unit tests with mocked HTTP cover request shape, response mapping, guards and hooks. `zapier-platform validate` passes with no errors (warnings only). + +**Connection test.** `POST /api/v1/address/verify` with an empty `requests` array returns HTTP 400 ("The requests field is required.") for a valid token. Whether a rejected request is billed could not be proven; there is no zero-cost check for production tokens. + +## License + +The code in this repository is released under the MIT License (see `LICENSE`). The BatchData API and the data it returns are proprietary to BatchData (batchdata.io) and are subject to BatchData's terms of service; the MIT License does not cover them. Support: support@batchservice.com diff --git a/authentication.js b/authentication.js new file mode 100644 index 0000000..9977451 --- /dev/null +++ b/authentication.js @@ -0,0 +1,57 @@ +'use strict'; + +const { API_HOST, SUPPORT_EMAIL } = require('./lib/constants'); + +// The connection test posts an EMPTY address batch. A valid token gets HTTP 400 +// (empty batch rejected before any lookup). An invalid token gets 401 or 403. +// The claim that a rejected empty batch is not billed is assumed, not confirmed. +const test = async (z) => { + const response = await z.request({ + url: `${API_HOST}/api/v1/address/verify`, + method: 'POST', + headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, + body: { requests: [] }, + skipThrowForStatus: true, + }); + const status = response.status; + if (status === 400 || (status >= 200 && status < 300)) { + return { ok: true }; + } + if (status === 401) { + throw new z.errors.Error( + 'The API token was not accepted. Check the token in your BatchData account settings.', + 'AuthenticationError', + 401, + ); + } + if (status === 403) { + throw new z.errors.Error( + `This token is not allowed to use the BatchData API. Contact ${SUPPORT_EMAIL} if you think this is a mistake.`, + 'AuthenticationError', + 403, + ); + } + if (status === 429) { + throw new z.errors.ThrottledError('BatchData rate limit reached. Try again shortly.'); + } + throw new z.errors.Error( + `BatchData returned an unexpected status (${status}) while testing the connection.`, + 'UnexpectedStatus', + status, + ); +}; + +module.exports = { + type: 'custom', + fields: [ + { + key: 'api_key', + label: 'API Token', + type: 'password', + required: true, + helpText: + 'Create an API token in your BatchData account (BatchData dashboard > API). Use a token with access to the endpoints you plan to use. Each request is billed to your account.', + }, + ], + test, +}; diff --git a/index.js b/index.js new file mode 100644 index 0000000..9131eb4 --- /dev/null +++ b/index.js @@ -0,0 +1,20 @@ +'use strict'; + +const { version } = require('./package.json'); +const { version: platformVersion } = require('zapier-platform-core'); + +const authentication = require('./authentication'); +const { addBearerToken, handleErrors } = require('./middleware'); +const { searches, creates, triggers } = require('./lib/modules'); + +module.exports = { + version, + platformVersion, + flags: { cleanInputData: false }, + authentication, + beforeRequest: [addBearerToken], + afterResponse: [handleErrors], + triggers, + searches, + creates, +}; diff --git a/lib/builders.js b/lib/builders.js new file mode 100644 index 0000000..97d4ebe --- /dev/null +++ b/lib/builders.js @@ -0,0 +1,238 @@ +'use strict'; + +const { + InputError, + asList, + deepMerge, + isBlank, + isPlainObject, + parseJsonObject, + removeEmpty, + splitPhoneNumbers, + stripForbiddenKeys, + toDateOnly, +} = require('./common'); +const { LOOKUP_DATASETS } = require('./constants'); + +const range = (min, max) => { + const out = {}; + if (!isBlank(min)) out.min = Number(min); + if (!isBlank(max)) out.max = Number(max); + return Object.keys(out).length > 0 ? out : undefined; +}; + +const dateRange = (from, to) => { + const out = {}; + const minDate = toDateOnly(from); + const maxDate = toDateOnly(to); + if (minDate) out.minDate = minDate; + if (maxDate) out.maxDate = maxDate; + return Object.keys(out).length > 0 ? out : undefined; +}; + +const setIf = (target, key, value) => { + if (value !== undefined) target[key] = value; +}; + +const toBoolean = (value) => { + if (value === true || value === 'true' || value === 'yes') return true; + if (value === false || value === 'false' || value === 'no') return false; + return undefined; +}; + +const buildSearchBody = (input) => { + const building = {}; + setIf(building, 'bedroomCount', range(input.bedrooms_min, input.bedrooms_max)); + setIf(building, 'bathroomCount', range(input.bathrooms_min, input.bathrooms_max)); + setIf(building, 'yearBuilt', range(input.year_built_min, input.year_built_max)); + setIf(building, 'livingAreaSquareFeet', range(input.living_area_min, input.living_area_max)); + + const general = {}; + if (!isBlank(input.property_type_category)) { + general.propertyTypeCategory = { equals: String(input.property_type_category) }; + } + if (!isBlank(input.property_type_detail)) { + general.propertyTypeDetail = { equals: String(input.property_type_detail) }; + } + + const lot = {}; + setIf(lot, 'lotSizeAcres', range(input.lot_size_acres_min, input.lot_size_acres_max)); + + const valuation = {}; + setIf(valuation, 'estimatedValue', range(input.estimated_value_min, input.estimated_value_max)); + setIf(valuation, 'equityPercent', range(input.equity_percent_min, input.equity_percent_max)); + + const sale = {}; + setIf(sale, 'lastSaleDate', dateRange(input.last_sale_date_from, input.last_sale_date_to)); + + const owner = {}; + const ownerOccupied = toBoolean(input.owner_occupied); + if (ownerOccupied !== undefined) owner.ownerOccupied = { equals: ownerOccupied }; + + const quickLists = [ + ...asList(input.quick_lists), + ...asList(input.excluded_quick_lists).map((entry) => `not-${entry}`), + ]; + const orQuickLists = asList(input.or_quick_lists); + + const structured = {}; + if (!isBlank(input.query)) structured.query = String(input.query); + if (quickLists.length > 0) structured.quickLists = quickLists; + if (orQuickLists.length > 0) structured.orQuickLists = orQuickLists; + if (Object.keys(building).length > 0) structured.building = building; + if (Object.keys(general).length > 0) structured.general = general; + if (Object.keys(lot).length > 0) structured.lot = lot; + if (Object.keys(valuation).length > 0) structured.valuation = valuation; + if (Object.keys(sale).length > 0) structured.sale = sale; + if (Object.keys(owner).length > 0) structured.owner = owner; + + const extra = parseJsonObject(input.additional_criteria, 'Additional search criteria'); + const searchCriteria = deepMerge(extra, structured); + + const take = isBlank(input.take) ? 25 : Number(input.take); + if (!Number.isInteger(take) || take < 0 || take > 100) { + throw new InputError('Max results must be a whole number from 0 to 100'); + } + const options = { take }; + if (!isBlank(input.skip) && Number(input.skip) > 0) options.skip = Number(input.skip); + + return stripForbiddenKeys({ searchCriteria, options }); +}; + +const buildLookupBody = (input) => { + const identifyBy = input.identify_by || 'address'; + const request = {}; + switch (identifyBy) { + case 'address': + request.address = removeEmpty({ + street: input.street, + city: input.city, + state: input.state, + zip: input.zip, + }); + break; + case 'propertyId': + request.propertyId = input.property_id; + break; + case 'hash': + request.hash = input.address_hash; + break; + case 'apn': + request.apn = input.apn; + request.countyFipsCode = input.county_fips_code; + break; + default: + throw new InputError(`Unknown identifier type "${identifyBy}"`); + } + if (!isBlank(input.request_id)) request.requestId = String(input.request_id); + + const datasets = asList(input.datasets); + const unknown = datasets.filter((entry) => !LOOKUP_DATASETS.includes(entry)); + if (unknown.length > 0) throw new InputError(`Unknown dataset: ${unknown.join(', ')}`); + if (datasets.includes('basic') && datasets.includes('core')) { + throw new InputError('The "basic" and "core" datasets cannot be combined'); + } + const options = {}; + if (toBoolean(input.include_skip_trace) === true) options.skipTrace = true; + if (datasets.length > 0) options.datasets = datasets; + + const body = { requests: [removeEmpty(request)] }; + if (Object.keys(options).length > 0) body.options = options; + return body; +}; + +const skipTracePath = (version) => + version === 'v3' ? '/api/v3/property/skip-trace' : '/api/v1/property/skip-trace'; + +const buildSkipTraceBody = (input) => { + const request = {}; + if ((input.find_by || 'address') === 'address') { + request.propertyAddress = removeEmpty({ + street: input.street, + city: input.city, + state: input.state, + zip: input.zip, + }); + } else { + request.apn = input.apn; + if (!isBlank(input.county_fips_code)) request.countyFipsCode = input.county_fips_code; + if (!isBlank(input.county)) request.county = input.county; + if (!isBlank(input.apn_state)) request.state = input.apn_state; + } + if (!isBlank(input.owner_first_name) || !isBlank(input.owner_last_name)) { + request.name = removeEmpty({ first: input.owner_first_name, last: input.owner_last_name }); + } + const mailing = removeEmpty({ + street: input.mailing_street, + city: input.mailing_city, + state: input.mailing_state, + zip: input.mailing_zip, + }); + if (Object.keys(mailing).length > 0) request.mailingAddress = mailing; + if (!isBlank(input.request_id)) request.requestId = String(input.request_id); + + // Always explicit: the raw API default differs between V1 (exclude) and V3 (include). + const options = { + includeTCPABlacklistedPhones: toBoolean(input.include_tcpa_flagged) === true, + }; + const prioritize = toBoolean(input.prioritize_mobile_phones); + if (prioritize !== undefined) options.prioritizeMobilePhones = prioritize; + return { requests: [removeEmpty(request)], options }; +}; + +const extractSkipTraceRecords = (version, response) => { + if (version === 'v3') { + const data = + isPlainObject(response.result) && Array.isArray(response.result.data) + ? response.result.data + : []; + const records = []; + for (const entry of data) { + const persons = Array.isArray(entry.persons) ? entry.persons : []; + for (const person of persons) { + records.push({ + apiVersion: 'v3', + input: entry.input || null, + property: entry.property || null, + person, + }); + } + } + return records; + } + const persons = + isPlainObject(response.results) && Array.isArray(response.results.persons) + ? response.results.persons + : []; + // The live V1 API returns an empty placeholder entry (meta.matched:false) for a property with no match. + return persons + .filter((person) => !(person.meta && person.meta.matched === false)) + .map((person) => ({ + apiVersion: 'v1', + propertyAddress: person.propertyAddress || null, + person, + })); +}; + +const buildAddressVerifyBody = (input) => ({ + requests: [ + removeEmpty({ street: input.street, city: input.city, state: input.state, zip: input.zip }), + ], +}); + +const buildPhoneBody = (input) => { + const numbers = splitPhoneNumbers(input.phone_numbers); + if (numbers.length === 0) throw new InputError('Enter at least one phone number'); + return { requests: numbers }; +}; + +module.exports = { + buildSearchBody, + buildLookupBody, + buildSkipTraceBody, + skipTracePath, + extractSkipTraceRecords, + buildAddressVerifyBody, + buildPhoneBody, + toBoolean, +}; diff --git a/lib/catalog-modules.js b/lib/catalog-modules.js new file mode 100644 index 0000000..c80aabd --- /dev/null +++ b/lib/catalog-modules.js @@ -0,0 +1,276 @@ +'use strict'; +// Builds the Zapier searches, creates and triggers for the shared catalog (see lib/catalog.json). + +const crypto = require('crypto'); +const catalog = require('./catalog.json'); +const engine = require('./engine'); +const { API_HOST } = require('./constants'); +const { outputFieldsFromSample } = require('./outputFields'); + +const { InputError, buildRequest, extractResult, checkApiRequest } = engine; + +// Zapier requires {value, sample, label} for labelled choices. +const normalizeChoices = (choices) => + choices.map((choice) => + typeof choice === 'string' ? choice : { value: choice.value, sample: choice.value, label: choice.label || choice.value }, + ); + +const toInputField = (field, op) => { + const out = { key: field.key, label: field.label }; + switch (field.type) { + case 'rows': + out.children = field.rowFields.map((child) => toInputField(child, op)); + break; + case 'integer': + out.type = 'integer'; + break; + case 'number': + out.type = 'number'; + break; + case 'boolean': + out.type = 'boolean'; + break; + case 'password': + out.type = 'password'; + break; + case 'json': + case 'text': + out.type = 'text'; + break; + case 'list': + out.type = 'string'; + out.list = true; + break; + default: + out.type = 'string'; + } + if (field.required) out.required = true; + if (field.default !== undefined) out.default = String(field.default); + if (field.choices) out.choices = normalizeChoices(field.choices); + const extra = []; + if (field.help) extra.push(field.help); + if (field.type === 'date') extra.push('Format: YYYY-MM-DD.'); + if (field.type === 'json') extra.push('Enter a JSON object.'); + if (field.type === 'list' && !field.choices) extra.push('Enter one value per line or separate values with commas.'); + if (field.type === 'rows') out.label = `${field.label} (one row each, up to ${field.max})`; + else if (extra.length > 0) out.helpText = extra.join(' '); + if (field.dynamic) out.dynamic = field.dynamic; + if (field.type === 'rows') { + out.required = Boolean(field.required); + } + return out; +}; + +const inputFieldsFor = (op) => + op.fields.map((field) => { + const converted = toInputField(field, op); + if (op.dynamic && field.in === 'path') converted.dynamic = `${op.dynamic}.id.id`; + return converted; + }); + +const wrap = (z, error) => { + if (error instanceof InputError) return new z.errors.Error(error.message, 'InvalidInput', 400); + return error; +}; + +// One API call for a catalog op. Returns the extracted records. +const callCatalogOp = async (z, bundle, op) => { + const input = bundle.inputData || {}; + let request; + try { + request = buildRequest(op, input); + } catch (error) { + throw wrap(z, error); + } + const options = { + url: `${API_HOST}${request.path}`, + method: request.method, + headers: { Accept: 'application/json' }, + params: request.qs, + }; + if (request.body !== undefined) { + options.headers['Content-Type'] = 'application/json'; + options.body = request.body; + } + const response = await z.request(options); + const data = response.data && typeof response.data === 'object' ? response.data : {}; + return extractResult(op, data, input); +}; + +const outputFieldsOf = (op) => outputFieldsFromSample(op.sample); + +const searchFor = (op) => ({ + key: op.key, + noun: op.noun, + display: { label: op.label, description: op.description }, + operation: { + inputFields: inputFieldsFor(op), + perform: (z, bundle) => callCatalogOp(z, bundle, op), + sample: op.sample, + outputFields: outputFieldsOf(op), + }, +}); + +const createFor = (op) => ({ + key: op.key === 'reverse_skip_trace' ? `${op.key}_action` : op.key, + noun: op.noun, + display: { label: op.label, description: op.description }, + operation: { + inputFields: inputFieldsFor(op), + perform: async (z, bundle) => { + const records = await callCatalogOp(z, bundle, op); + return records.length > 0 ? records[0] : { matched: false }; + }, + sample: op.sample, + outputFields: outputFieldsOf(op), + }, +}); + +// ------------------------------------------------------------------ polling triggers +const sortNewestFirst = (records, key) => + key ? [...records].sort((a, b) => String(b[key] || '').localeCompare(String(a[key] || ''))) : records; + +const pollingTrigger = (op) => ({ + key: op.key, + noun: op.noun, + display: { label: op.label, description: op.description }, + operation: { + type: 'polling', + inputFields: inputFieldsFor(op), + perform: async (z, bundle) => { + const records = await callCatalogOp(z, bundle, op); + return sortNewestFirst(records, op.sortDesc).map((record) => ({ + ...record, + id: record.id !== undefined ? record.id : record._id, + })); + }, + sample: op.sample, + outputFields: outputFieldsOf(op), + }, +}); + +// ------------------------------------------------------------------ REST hook trigger +const eventId = (body) => { + if (body && typeof body === 'object') { + for (const key of ['id', 'eventId', 'event_id']) { + if (body[key] !== undefined && body[key] !== null && body[key] !== '') return String(body[key]); + } + } + return crypto.createHash('sha1').update(JSON.stringify(body || {})).digest('hex'); +}; + +const hookTrigger = (op) => ({ + key: op.key, + noun: op.noun, + display: { label: op.label, description: op.description }, + operation: { + type: 'hook', + inputFields: inputFieldsFor(op), + performSubscribe: async (z, bundle) => { + const subscribeOp = { + ...op, + fields: op.fields, + http: { method: 'POST', path: op.http.path }, + fixed: [ + { path: 'deliveryConfig.type', value: 'webhook' }, + { path: 'deliveryConfig.url', value: bundle.targetUrl }, + ], + result: { compose: { subscriptionId: op.http.idPath } }, + }; + const [created] = await callCatalogOp(z, { inputData: bundle.inputData }, subscribeOp).catch((error) => { + throw error; + }); + return { subscriptionId: created.subscriptionId }; + }, + performUnsubscribe: async (z, bundle) => { + const id = bundle.subscribeData && bundle.subscribeData.subscriptionId; + if (!id) return {}; + const response = await z.request({ + url: `${API_HOST}${op.http.deletePath.replace('{id}', encodeURIComponent(String(id)))}`, + method: 'DELETE', + headers: { Accept: 'application/json' }, + skipThrowForStatus: true, + }); + return { removed: response.status < 300 || response.status === 404 }; + }, + perform: async (z, bundle) => { + const body = bundle.cleanedRequest || bundle.rawRequest || {}; + const data = typeof body === 'object' && body !== null ? body : {}; + const record = { ...data, id: eventId(data) }; + const wanted = engine.toBoolean((bundle.inputData || {}).include_property) === true; + if (wanted && op.hydrate && data[op.hydrate.idField]) { + try { + const response = await z.request({ + url: `${API_HOST}${op.hydrate.path}`, + method: 'POST', + headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, + body: { requests: [{ propertyId: String(data[op.hydrate.idField]) }] }, + }); + const found = engine.getPath(response.data || {}, op.hydrate.listPath); + if (Array.isArray(found) && found.length > 0) record[op.hydrate.into] = found[0]; + } catch (error) { + record.propertyLookupError = String(error && error.message ? error.message : error).slice(0, 300); + } + } + return [record]; + }, + performList: () => [{ ...op.sample }], + sample: op.sample, + outputFields: outputFieldsOf(op), + }, +}); + +// ------------------------------------------------------------------ generic API request +const apiRequestCreate = () => { + const spec = catalog.apiRequest; + return { + key: spec.key, + noun: spec.noun, + display: { label: spec.label, description: spec.description }, + operation: { + inputFields: [ + { key: 'method', label: 'Method', type: 'string', required: true, default: 'GET', choices: normalizeChoices(spec.methods.map((value) => ({ value, label: value }))) }, + { key: 'path', label: 'Path', type: 'string', required: true, helpText: 'Starts with /api/, for example /api/v2/property/search-sessions.' }, + { key: 'query', label: 'Query Parameters (JSON)', type: 'text', helpText: 'Optional JSON object, for example {"take": 5}.' }, + { key: 'body', label: 'Request Body (JSON)', type: 'text', helpText: 'Optional JSON object. Callback URL keys are removed.' }, + ], + perform: async (z, bundle) => { + const input = bundle.inputData || {}; + let path; + let qs; + let body; + try { + path = checkApiRequest(spec.guard, input.method, input.path); + qs = engine.parseJsonObject(input.query, 'Query Parameters'); + body = engine.parseJsonObject(input.body, 'Request Body'); + } catch (error) { + throw wrap(z, error); + } + const method = String(input.method || 'GET').toUpperCase(); + const options = { url: `${API_HOST}${path}`, method, headers: { Accept: 'application/json' }, params: engine.strip(qs || {}) }; + if (body && method !== 'GET' && method !== 'DELETE') { + options.headers['Content-Type'] = 'application/json'; + options.body = engine.strip(body); + } + const response = await z.request(options); + return { statusCode: response.status, body: response.data }; + }, + sample: spec.sample, + outputFields: [{ key: 'statusCode', label: 'Status Code', type: 'integer' }], + }, + }; +}; + +const toMap = (list) => list.reduce((acc, item) => ({ ...acc, [item.key]: item }), {}); + +const searches = toMap(catalog.ops.filter((op) => op.kind === 'search' && !op.noZapier).map(searchFor)); +const creates = toMap([ + ...catalog.ops.filter((op) => op.kind === 'action').map(createFor), + ...catalog.ops.filter((op) => op.kind === 'search' && op.action).map(createFor), + apiRequestCreate(), +]); +const triggers = toMap( + catalog.triggers.map((trigger) => (trigger.mode === 'hook' ? hookTrigger(trigger) : pollingTrigger(trigger))), +); + +module.exports = { searches, creates, triggers, callCatalogOp, eventId, catalog }; diff --git a/lib/catalog.json b/lib/catalog.json new file mode 100644 index 0000000..c1b240a --- /dev/null +++ b/lib/catalog.json @@ -0,0 +1,3084 @@ +{ + "meta": { + "version": "0.2.0", + "supportEmail": "support@batchservice.com", + "quickLists": [ + "absentee-owner", + "active-auction", + "active-listing", + "canceled-listing", + "cash-buyer", + "corporate-owned", + "expired-listing", + "failed-listing", + "fix-and-flip", + "free-and-clear", + "for-sale-by-owner", + "has-hoa", + "has-hoa-fees", + "high-equity", + "inherited", + "involuntary-lien", + "in-state-absentee-owner", + "listed-below-market-price", + "low-equity", + "mailing-address-vacant", + "notice-of-default", + "notice-of-lis-pendens", + "notice-of-sale", + "on-market", + "out-of-state-absentee-owner", + "out-of-state-owner", + "owner-occupied", + "pending-listing", + "preforeclosure", + "recently-sold", + "same-property-and-mailing-address", + "senior-owner", + "tax-default", + "tired-landlord", + "trust-owned", + "unknown-equity", + "vacant", + "vacant-lot" + ] + }, + "ops": [ + { + "key": "reverse_skip_trace", + "resource": "property", + "kind": "search", + "action": true, + "noun": "Reverse Skip Trace Result", + "label": "Reverse Skip Trace (Phone or Email)", + "description": "Finds the person (and associated property addresses) behind a phone number or an email address using the V3 reverse skip trace. Returns up to 3 persons. Billed per matched person; requests with no match are not billed. Results are data only. You are responsible for TCPA and Do Not Call compliance.", + "skipTraceLike": true, + "http": { + "method": "POST", + "path": "/api/v3/property/reverse-skip-trace" + }, + "fields": [ + { + "key": "phone", + "label": "Phone Number", + "type": "string", + "path": "requests.0.phone", + "help": "A US phone number. Fill in a phone number or an email address." + }, + { + "key": "email", + "label": "Email Address", + "type": "string", + "path": "requests.0.email" + }, + { + "key": "request_id", + "label": "Your Reference ID", + "type": "string", + "path": "requests.0.requestId", + "help": "Optional. Echoed back in the result." + }, + { + "key": "include_tcpa_flagged", + "label": "Include TCPA-Flagged Phones", + "type": "boolean", + "path": "options.includeTCPABlacklistedPhones", + "emit": "always", + "default": false, + "help": "Off by default: phone numbers flagged as TCPA litigators are left out. Turn on only with a documented compliance basis. Flagged numbers carry \"tcpa\": true in the result." + } + ], + "requireOneOf": [ + "phone", + "email" + ], + "result": { + "list": "result.data", + "filter": { + "path": "meta.matched", + "equals": true + } + }, + "sample": { + "input": { + "phone": "6025550142", + "requestId": "ref-1" + }, + "persons": [ + { + "name": { + "first": "Dana", + "last": "Reyes", + "full": "Dana Reyes" + }, + "phoneNumbers": [ + { + "number": "6025550142", + "type": "Mobile", + "tcpa": false, + "dnc": false + } + ], + "emails": [ + "dana@example.com" + ] + } + ], + "meta": { + "matched": true, + "error": false + } + } + }, + { + "key": "get_permits", + "resource": "property", + "kind": "search", + "noun": "Permit", + "label": "Get Property Permits", + "description": "Returns building permits for one property, one result per permit. Identify the property by address, BatchData property ID, or APN with county FIPS code. Billed per property requested, however many permits come back.", + "http": { + "method": "POST", + "path": "/api/v2/property/get-property-permits" + }, + "fields": [ + { + "key": "street", + "label": "Street", + "type": "string", + "path": "request.address.street", + "help": "Street address with house number, for example 2800 N 24th St." + }, + { + "key": "city", + "label": "City", + "type": "string", + "path": "request.address.city" + }, + { + "key": "state", + "label": "State", + "type": "string", + "path": "request.address.state", + "help": "Two-letter state code, for example AZ." + }, + { + "key": "zip", + "label": "ZIP Code", + "type": "string", + "path": "request.address.zip" + }, + { + "key": "property_id", + "label": "BatchData Property ID", + "type": "string", + "path": "request.propertyId" + }, + { + "key": "apn", + "label": "APN", + "type": "string", + "path": "request.apn" + }, + { + "key": "county_fips_code", + "label": "County FIPS Code", + "type": "string", + "path": "request.countyFipsCode", + "help": "Use with APN." + }, + { + "key": "permit_status", + "label": "Permit Status", + "type": "choice", + "path": "request.status.equals", + "choices": [ + { + "value": "active", + "label": "active" + }, + { + "value": "final", + "label": "final" + }, + { + "value": "in_review", + "label": "in_review" + }, + { + "value": "inactive", + "label": "inactive" + } + ] + }, + { + "key": "permit_type", + "label": "Permit Type Contains", + "type": "string", + "path": "request.type.contains" + }, + { + "key": "description_contains", + "label": "Description Contains", + "type": "string", + "path": "request.description.contains" + }, + { + "key": "tags", + "label": "Permit Tags (Match Any)", + "type": "list", + "path": "request.allTags.inList", + "choices": [ + { + "value": "addition", + "label": "addition" + }, + { + "value": "adu", + "label": "adu" + }, + { + "value": "bathroom", + "label": "bathroom" + }, + { + "value": "battery", + "label": "battery" + }, + { + "value": "demolition", + "label": "demolition" + }, + { + "value": "electrical", + "label": "electrical" + }, + { + "value": "electricMeter", + "label": "electricMeter" + }, + { + "value": "evCharger", + "label": "evCharger" + }, + { + "value": "fireSprinkler", + "label": "fireSprinkler" + }, + { + "value": "gas", + "label": "gas" + }, + { + "value": "generator", + "label": "generator" + }, + { + "value": "grading", + "label": "grading" + }, + { + "value": "heatPump", + "label": "heatPump" + }, + { + "value": "hvac", + "label": "hvac" + }, + { + "value": "inspectionPassed", + "label": "inspectionPassed" + }, + { + "value": "kitchen", + "label": "kitchen" + }, + { + "value": "newConstruction", + "label": "newConstruction" + }, + { + "value": "plumbing", + "label": "plumbing" + }, + { + "value": "poolAndHotTub", + "label": "poolAndHotTub" + }, + { + "value": "remodel", + "label": "remodel" + }, + { + "value": "roofing", + "label": "roofing" + }, + { + "value": "solar", + "label": "solar" + }, + { + "value": "waterHeater", + "label": "waterHeater" + }, + { + "value": "windowDoor", + "label": "windowDoor" + } + ] + }, + { + "key": "issued_from", + "label": "Issued From (YYYY-MM-DD)", + "type": "date", + "path": "request.issueDate.minDate" + }, + { + "key": "issued_to", + "label": "Issued To (YYYY-MM-DD)", + "type": "date", + "path": "request.issueDate.maxDate" + }, + { + "key": "job_value_min", + "label": "Job Value (Min)", + "type": "number", + "path": "request.jobValue.min" + }, + { + "key": "job_value_max", + "label": "Job Value (Max)", + "type": "number", + "path": "request.jobValue.max" + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 25, + "min": 1, + "max": 100, + "help": "Whole number from 1 to 100. Default 25." + } + ], + "requireOneOf": [ + "street", + "property_id", + "apn" + ], + "result": { + "list": "result.permits", + "attach": { + "property": "result.property", + "searchMeta": "result.meta.results" + } + }, + "sample": { + "permitNumber": "BP-2026-004211", + "type": "Building", + "subtype": "Residential", + "status": "final", + "description": "Re-roof, composition shingle", + "issueDate": "2026-02-03", + "finalDate": "2026-02-20", + "jobValue": 14500, + "jurisdiction": "Phoenix", + "allTags": [ + "roofing" + ], + "property": { + "address": { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008" + } + }, + "searchMeta": { + "resultCount": 1, + "resultsFound": 1 + } + } + }, + { + "key": "batch_skip_trace", + "resource": "property", + "kind": "action", + "noun": "Batch Skip Trace", + "label": "Batch Skip Trace Properties (V3)", + "description": "Skip traces up to 100 properties in one call with the V3 skip trace. Returns one result per submitted property, each with a list of persons. Billed per property matched. Results are data only. You are responsible for TCPA and Do Not Call compliance.", + "skipTraceLike": true, + "http": { + "method": "POST", + "path": "/api/v3/property/skip-trace" + }, + "fields": [ + { + "key": "properties", + "label": "Properties", + "type": "rows", + "required": true, + "path": "requests", + "max": 100, + "help": "One row per property, up to 100. Billed per matched property.", + "rowFields": [ + { + "key": "street", + "label": "Street", + "type": "string", + "path": "propertyAddress.street" + }, + { + "key": "city", + "label": "City", + "type": "string", + "path": "propertyAddress.city" + }, + { + "key": "state", + "label": "State", + "type": "string", + "path": "propertyAddress.state" + }, + { + "key": "zip", + "label": "ZIP Code", + "type": "string", + "path": "propertyAddress.zip" + }, + { + "key": "owner_first_name", + "label": "Owner First Name", + "type": "string", + "path": "name.first" + }, + { + "key": "owner_last_name", + "label": "Owner Last Name", + "type": "string", + "path": "name.last" + }, + { + "key": "request_id", + "label": "Your Reference ID", + "type": "string", + "path": "requestId" + } + ] + }, + { + "key": "include_tcpa_flagged", + "label": "Include TCPA-Flagged Phones", + "type": "boolean", + "path": "options.includeTCPABlacklistedPhones", + "emit": "always", + "default": false, + "help": "Off by default: phone numbers flagged as TCPA litigators are left out. Turn on only with a documented compliance basis. Flagged numbers carry \"tcpa\": true in the result." + } + ], + "result": { + "compose": { + "results": "result.data", + "matchCount": "result.meta.results.matchCount", + "requestCount": "result.meta.results.requestCount" + } + }, + "sample": { + "results": [ + { + "input": { + "requestId": "row-1" + }, + "persons": [ + { + "name": { + "first": "Dana", + "last": "Reyes" + }, + "phoneNumbers": [ + { + "number": "6025550142", + "type": "Mobile", + "tcpa": false + } + ] + } + ], + "meta": { + "matched": true + } + } + ], + "matchCount": 1, + "requestCount": 1 + } + }, + { + "key": "batch_lookup_property", + "resource": "property", + "kind": "action", + "noun": "Batch Property Lookup", + "label": "Batch Look Up Properties", + "description": "Returns full property records for up to 100 addresses in one call. Billed per property matched.", + "http": { + "method": "POST", + "path": "/api/v1/property/lookup/all-attributes" + }, + "fields": [ + { + "key": "addresses", + "label": "Addresses", + "type": "rows", + "required": true, + "path": "requests", + "max": 100, + "help": "One row per property address, up to 100.", + "rowFields": [ + { + "key": "street", + "label": "Street", + "type": "string", + "path": "address.street" + }, + { + "key": "city", + "label": "City", + "type": "string", + "path": "address.city" + }, + { + "key": "state", + "label": "State", + "type": "string", + "path": "address.state" + }, + { + "key": "zip", + "label": "ZIP Code", + "type": "string", + "path": "address.zip" + }, + { + "key": "request_id", + "label": "Your Reference ID", + "type": "string", + "path": "requestId" + } + ] + }, + { + "key": "datasets", + "label": "Datasets", + "type": "list", + "path": "options.datasets", + "choices": [ + { + "value": "basic", + "label": "basic" + }, + { + "value": "comps", + "label": "comps" + }, + { + "value": "batchrank", + "label": "batchrank" + }, + { + "value": "contact", + "label": "contact" + }, + { + "value": "core", + "label": "core" + }, + { + "value": "deed", + "label": "deed" + }, + { + "value": "demographic", + "label": "demographic" + }, + { + "value": "foreclosure", + "label": "foreclosure" + }, + { + "value": "listing", + "label": "listing" + }, + { + "value": "mortgage-liens", + "label": "mortgage-liens" + }, + { + "value": "owner", + "label": "owner" + }, + { + "value": "permit", + "label": "permit" + }, + { + "value": "quicklist", + "label": "quicklist" + }, + { + "value": "valuation", + "label": "valuation" + } + ], + "help": "Optional. Limits the response to these datasets. \"basic\" and \"core\" cannot be combined." + } + ], + "result": { + "compose": { + "properties": "results.properties", + "matchCount": "results.meta.results.matchCount", + "noMatchCount": "results.meta.results.noMatchCount" + } + }, + "sample": { + "properties": [ + { + "_id": "09201d3bd3134f9380704014781fb4c0", + "address": { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa" + }, + "general": { + "propertyTypeCategory": "Single Family" + }, + "quickLists": { + "vacant": false + } + } + ], + "matchCount": 1, + "noMatchCount": 0 + } + }, + { + "key": "autocomplete_address", + "resource": "address", + "kind": "search", + "noun": "Address Suggestion", + "label": "Autocomplete Address", + "description": "Suggests addresses for partial text, one result per suggestion. Billed per call.", + "http": { + "method": "POST", + "path": "/api/v1/address/autocomplete" + }, + "fields": [ + { + "key": "query", + "label": "Partial Address", + "type": "string", + "required": true, + "path": "searchCriteria.query", + "help": "For example \"2800 N 24th\"." + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 5, + "min": 1, + "max": 20, + "help": "Whole number from 1 to 20. Default 5." + }, + { + "key": "usps_verified_only", + "label": "USPS-Verified Addresses Only", + "type": "boolean", + "path": "options.uspsVerifiedAddresses" + } + ], + "result": { + "list": "result.suggestions" + }, + "sample": { + "propertyId": "09201d3bd3134f9380704014781fb4c0", + "name": "2800 N 24th St, Phoenix, AZ 85008", + "type": "address", + "address": "2800 n 24th st", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "latitude": 33.478332, + "longitude": -112.030474, + "propertyCount": 1, + "uspsVerified": true + } + }, + { + "key": "geocode_address", + "resource": "address", + "kind": "search", + "noun": "Geocoded Address", + "label": "Geocode Address", + "description": "Returns latitude, longitude and the standardized form of one address. Billed per address submitted.", + "http": { + "method": "POST", + "path": "/api/v1/address/geocode" + }, + "fields": [ + { + "key": "address", + "label": "Address", + "type": "string", + "required": true, + "path": "requests.0.address", + "help": "One full address, for example 2800 N 24th St, Phoenix, AZ 85008." + }, + { + "key": "request_id", + "label": "Your Reference ID", + "type": "string", + "path": "requests.0.requestId" + } + ], + "result": { + "list": "result.addresses" + }, + "sample": { + "street": "2800 N 24th St", + "city": "Phoenix", + "county": "Maricopa", + "state": "AZ", + "zip": "85008", + "fullAddress": "2800 N 24th St, Phoenix, Maricopa, AZ, 85008", + "latitude": 33.478332, + "longitude": -112.030474, + "geoStatus": "Rooftop", + "meta": { + "error": false, + "geocoded": true + } + } + }, + { + "key": "reverse_geocode", + "resource": "address", + "kind": "search", + "noun": "Nearby Address", + "label": "Reverse Geocode (Find Nearby Addresses)", + "description": "Returns the nearest addresses to a latitude and longitude, one result per address. Billed per geo-location submitted.", + "http": { + "method": "POST", + "path": "/api/v1/address/reverse-geocode" + }, + "fields": [ + { + "key": "latitude", + "label": "Latitude", + "type": "number", + "required": true, + "path": "request.latitude" + }, + { + "key": "longitude", + "label": "Longitude", + "type": "number", + "required": true, + "path": "request.longitude" + }, + { + "key": "property_only", + "label": "Property Addresses Only", + "type": "boolean", + "path": "options.showPropertyOnly" + } + ], + "result": { + "list": "result.addresses" + }, + "sample": { + "street": "2806 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa", + "latitude": 33.4787348, + "longitude": -112.0306996, + "types": [ + "Street" + ], + "geoStatus": "Rooftop", + "meta": { + "error": false + } + } + }, + { + "key": "batch_verify_address", + "resource": "address", + "kind": "action", + "noun": "Batch Address Verification", + "label": "Batch Verify Addresses", + "description": "Standardizes and validates up to 100 US addresses in one call. Billed per address submitted.", + "http": { + "method": "POST", + "path": "/api/v1/address/verify" + }, + "fields": [ + { + "key": "addresses", + "label": "Addresses", + "type": "rows", + "required": true, + "path": "requests", + "max": 100, + "help": "One row per address, up to 100.", + "rowFields": [ + { + "key": "street", + "label": "Street", + "type": "string", + "path": "street" + }, + { + "key": "city", + "label": "City", + "type": "string", + "path": "city" + }, + { + "key": "state", + "label": "State", + "type": "string", + "path": "state" + }, + { + "key": "zip", + "label": "ZIP Code", + "type": "string", + "path": "zip" + } + ] + } + ], + "result": { + "compose": { + "addresses": "results.addresses", + "requestCount": "results.meta.results.requestCount", + "normalizedCount": "results.meta.results.normalizedCount" + } + }, + "sample": { + "addresses": [ + { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa", + "meta": { + "verified": true + } + } + ], + "requestCount": 1, + "normalizedCount": 1 + } + }, + { + "key": "investor_buybox", + "resource": "investor", + "kind": "search", + "noun": "Investor", + "label": "Find Investors (Buy Box)", + "description": "Finds likely real estate investors for a subject property from nearby comparable sales, one result per investor with holdings, acquisitions and contacts. Billed according to your BatchData plan; contact support@batchservice.com for pricing. Results are data only. You are responsible for TCPA and Do Not Call compliance.", + "http": { + "method": "POST", + "path": "/api/v2/investor/buybox" + }, + "fields": [ + { + "key": "street", + "label": "Subject Property Street", + "type": "string", + "path": "searchCriteria.compAddress.street", + "help": "Street address with house number, for example 2800 N 24th St.", + "required": true + }, + { + "key": "city", + "label": "Subject Property City", + "type": "string", + "path": "searchCriteria.compAddress.city", + "required": false + }, + { + "key": "state", + "label": "Subject Property State", + "type": "string", + "path": "searchCriteria.compAddress.state", + "help": "Two-letter state code, for example AZ.", + "required": false + }, + { + "key": "zip", + "label": "Subject Property ZIP Code", + "type": "string", + "path": "searchCriteria.compAddress.zip", + "required": false + }, + { + "key": "classification", + "label": "Investor Types", + "type": "list", + "path": "searchCriteria.investor.classification.inList", + "help": "For example FLIPPER, LANDLORD, CASH BUYER. Replaces the default (FLIPPER and LANDLORD)." + }, + { + "key": "ownership", + "label": "Ownership", + "type": "choice", + "path": "searchCriteria.investor.ownership", + "choices": [ + { + "value": "current", + "label": "current" + }, + { + "value": "previous", + "label": "previous" + }, + { + "value": "any", + "label": "any" + } + ], + "help": "Which owners of a comparable property qualify. Default any." + }, + { + "key": "sold_within_months", + "label": "Comparable Sales Within (Months)", + "type": "integer", + "path": "searchCriteria.intel.lastSoldDate.withinLastMonths", + "min": 1, + "max": 60, + "help": "From 1 to 60. Default 12." + }, + { + "key": "additional_criteria", + "label": "Additional Criteria (JSON)", + "type": "json", + "path": "searchCriteria", + "merge": true, + "first": true, + "help": "Optional JSON object merged into the search criteria. The fields above win on conflict. Callback URL keys are ignored." + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 25, + "min": 1, + "max": 100, + "help": "Whole number from 1 to 100. Default 25." + } + ], + "result": { + "list": "result.investors", + "attach": { + "searchMeta": "result.meta.results", + "warnings": "result.warnings" + } + }, + "sample": { + "id": "inv_a1b2c3d4", + "name": "Evergreen Holdings LLC", + "type": "Company Owned", + "classification": [ + "LANDLORD" + ], + "currentHoldings": { + "totalPropertyCount": 48 + }, + "acquisitions": { + "totalAcquisitionCount": 12 + }, + "mailingAddresses": [ + { + "street": "1200 W Camelback Rd", + "city": "Phoenix", + "state": "AZ", + "zip": "85013", + "propertyCount": 48 + } + ], + "matchedAsCurrentOwner": true, + "searchMeta": { + "resultCount": 25, + "resultsFound": 137 + } + } + }, + { + "key": "investor_properties", + "resource": "investor", + "kind": "search", + "noun": "Investor Property", + "label": "Get Investor Properties", + "description": "Returns the properties of one investor, one result per property. Get the investor ID from Find Investors (Buy Box). Use the \"nextPageCursor\" value of the last result as Page Cursor to read the next page. Billed per property row returned (take sets the maximum cost of a call).", + "http": { + "method": "POST", + "path": "/api/v2/investor/properties" + }, + "fields": [ + { + "key": "investor_id", + "label": "Investor ID", + "type": "string", + "required": true, + "path": "searchCriteria.investorId" + }, + { + "key": "ownership", + "label": "Ownership", + "type": "choice", + "path": "searchCriteria.ownership", + "choices": [ + { + "value": "current", + "label": "current" + }, + { + "value": "previous", + "label": "previous" + }, + { + "value": "any", + "label": "any" + } + ], + "help": "Default current. \"any\" can return many more rows." + }, + { + "key": "include_child_entities", + "label": "Include Child Entities", + "type": "boolean", + "path": "searchCriteria.includeChildEntities" + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 25, + "min": 1, + "max": 100, + "help": "Whole number from 1 to 100. Default 25." + }, + { + "key": "page_cursor", + "label": "Page Cursor", + "type": "string", + "path": "options.pageCursor", + "help": "Optional. The nextPageCursor from the previous page, used with the same criteria." + } + ], + "result": { + "list": "result.properties", + "attach": { + "resultsFound": "result.resultsFound", + "nextPageCursor": "result.nextPageCursor" + } + }, + "sample": { + "propertyId": "P-85053-0a1b2c", + "address": { + "street": "3802 W Evans Dr", + "city": "Phoenix", + "state": "AZ", + "zip": "85053", + "latitude": 33.6203, + "longitude": -112.1394 + }, + "fips": "04013", + "apn": "207-14-118", + "ownership": { + "isCurrentOwner": true, + "isPreviousOwner": false + }, + "resultsFound": 48 + } + }, + { + "key": "list_search_sessions", + "resource": "search_session", + "kind": "search", + "noun": "Search Session", + "label": "List Search Sessions", + "description": "Lists your team's search sessions, oldest first. Needs a token with the property search sessions permission. This call does not bill property records.", + "http": { + "method": "GET", + "path": "/api/v2/property/search-sessions" + }, + "fields": [ + { + "key": "take", + "label": "Max Results", + "type": "integer", + "in": "query", + "qs": "take", + "default": 50, + "min": 1, + "max": 100 + }, + { + "key": "skip", + "label": "Skip (Offset)", + "type": "integer", + "in": "query", + "qs": "skip", + "min": 0 + } + ], + "result": { + "list": "results.sessions" + }, + "sample": { + "id": "monthly-leads-az-85020", + "totalDelivered": 25, + "lastRequestAt": "2026-10-28T23:17:54.592Z", + "createdAt": "2026-10-01T16:02:11.120Z" + } + }, + { + "key": "create_search_session", + "resource": "search_session", + "kind": "action", + "noun": "Search Session", + "label": "Create or Advance Search Session", + "description": "Runs a property search inside a persistent session and returns the next properties that session has not delivered yet. The first call creates the session; calling again with the same Session ID continues it. Billed per property record delivered; a session never delivers (or bills) the same property twice. Each call bills up to Max Results records.", + "billed": true, + "http": { + "method": "POST", + "path": "/api/v1/property/search" + }, + "fixed": [ + { + "path": "options.useCursorPagination", + "value": true + } + ], + "fields": [ + { + "key": "session_id", + "label": "Session ID", + "type": "string", + "required": true, + "path": "options.searchSession.id", + "pattern": "^[A-Za-z0-9_-]{1,128}$", + "help": "Your own name for the session: letters, numbers, dash or underscore, up to 128 characters. Reusing the same ID continues the session, so you are never billed twice for the same property. A team can hold 100 sessions." + }, + { + "key": "query", + "label": "Location Query", + "type": "string", + "path": "searchCriteria.query", + "help": "City, county, ZIP code or address text, for example \"Phoenix, AZ\"." + }, + { + "key": "quick_lists", + "label": "Quick Lists (Include)", + "type": "list", + "path": "searchCriteria.quickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match ALL selected lists." + }, + { + "key": "or_quick_lists", + "label": "Quick Lists (Match Any)", + "type": "list", + "path": "searchCriteria.orQuickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match AT LEAST ONE selected list." + }, + { + "key": "additional_criteria", + "label": "Additional Criteria (JSON)", + "type": "json", + "path": "searchCriteria", + "merge": true, + "first": true, + "help": "Optional JSON object merged into the search criteria. The fields above win on conflict. Callback URL keys are ignored." + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 1, + "min": 1, + "max": 100, + "help": "Whole number from 1 to 100. Default 1. You are billed per record delivered." + } + ], + "result": { + "compose": { + "properties": "results.properties", + "session": "results.searchSessionMeta", + "searchMeta": "results.meta.results" + } + }, + "sample": { + "properties": [ + { + "_id": "09201d3bd3134f9380704014781fb4c0", + "address": { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa" + }, + "general": { + "propertyTypeCategory": "Single Family" + }, + "quickLists": { + "vacant": false + } + } + ], + "session": { + "totalDelivered": 1, + "isNewSession": true + }, + "searchMeta": { + "resultCount": 1, + "resultsFound": 1 + } + } + }, + { + "key": "delete_search_session", + "resource": "search_session", + "kind": "action", + "noun": "Search Session", + "label": "Delete Search Session", + "description": "Deletes a search session to free one of your 100 session slots. Deleting a session starts delivery over if you use the same ID again. This call does not bill property records.", + "destructive": true, + "http": { + "method": "DELETE", + "path": "/api/v2/property/search-sessions/{id}" + }, + "fields": [ + { + "key": "id", + "label": "Session ID", + "type": "string", + "required": true, + "in": "path", + "help": "The ID of the session to delete." + } + ], + "dynamic": "new_search_session", + "result": { + "compose": { + "deleted": "results.deleted", + "id": "results.id" + } + }, + "sample": { + "deleted": true, + "id": "monthly-leads-az-85020" + } + }, + { + "key": "list_monitors", + "resource": "monitor", + "kind": "search", + "noun": "Property Monitor", + "label": "List Property Monitors", + "description": "Lists your property monitors. Needs a token with the property subscription permission. Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event).", + "mockedOnly": true, + "noZapier": true, + "http": { + "method": "GET", + "path": "/api/v2/property-subscription" + }, + "fields": [], + "result": { + "list": "results.subscriptions" + }, + "sample": { + "id": "cjui0E2T1LKxWOD", + "searchCriteria": { + "query": "Phoenix, AZ", + "orQuickLists": [ + "on-market" + ] + }, + "deliveryConfig": { + "type": "kinesis", + "streamName": "my-stream", + "region": "us-west-2" + } + } + }, + { + "key": "get_monitor", + "resource": "monitor", + "kind": "search", + "noun": "Property Monitor", + "label": "Get Property Monitor", + "description": "Returns one property monitor with its search criteria and delivery settings (secrets are masked). Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event).", + "mockedOnly": true, + "http": { + "method": "GET", + "path": "/api/v2/property-subscription/{id}" + }, + "fields": [ + { + "key": "id", + "label": "Monitor ID", + "type": "string", + "required": true, + "in": "path", + "help": "The ID of the monitor." + } + ], + "dynamic": "new_monitor", + "result": { + "item": "result" + }, + "sample": { + "id": "cjui0E2T1LKxWOD", + "searchCriteria": { + "query": "Phoenix, AZ", + "orQuickLists": [ + "on-market" + ] + }, + "deliveryConfig": { + "type": "kinesis", + "streamName": "my-stream", + "region": "us-west-2" + } + } + }, + { + "key": "create_monitor", + "resource": "monitor", + "kind": "action", + "noun": "Property Monitor", + "label": "Create Property Monitor (Stream Delivery)", + "description": "Creates a property monitor that streams changes for matching properties to your own AWS Kinesis stream or Azure Event Hub. For webhook delivery use the \"New Property Monitor Event\" trigger, which sets up and removes its own monitor. Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event).", + "mockedOnly": true, + "http": { + "method": "POST", + "path": "/api/v2/property-subscription" + }, + "fields": [ + { + "key": "query", + "label": "Location Query", + "type": "string", + "path": "searchCriteria.query", + "help": "City, county, ZIP code or address text, for example \"Phoenix, AZ\"." + }, + { + "key": "quick_lists", + "label": "Quick Lists (Include)", + "type": "list", + "path": "searchCriteria.quickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match ALL selected lists." + }, + { + "key": "or_quick_lists", + "label": "Quick Lists (Match Any)", + "type": "list", + "path": "searchCriteria.orQuickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match AT LEAST ONE selected list." + }, + { + "key": "additional_criteria", + "label": "Additional Criteria (JSON)", + "type": "json", + "path": "searchCriteria", + "merge": true, + "first": true, + "help": "Optional JSON object merged into the search criteria. The fields above win on conflict. Callback URL keys are ignored." + }, + { + "key": "delivery_type", + "label": "Delivery Type", + "type": "choice", + "required": true, + "path": "deliveryConfig.type", + "choices": [ + { + "value": "kinesis", + "label": "AWS Kinesis" + }, + { + "value": "event-hub", + "label": "Azure Event Hub" + } + ], + "default": "kinesis" + }, + { + "key": "kinesis_stream_name", + "label": "Kinesis Stream Name", + "type": "string", + "path": "deliveryConfig.streamName", + "when": { + "field": "delivery_type", + "equals": "kinesis" + } + }, + { + "key": "kinesis_region", + "label": "Kinesis AWS Region", + "type": "string", + "path": "deliveryConfig.region", + "when": { + "field": "delivery_type", + "equals": "kinesis" + }, + "help": "For example us-west-2." + }, + { + "key": "kinesis_access_key_id", + "label": "Kinesis IAM Access Key ID", + "type": "string", + "path": "deliveryConfig.iamAccessKeyId", + "when": { + "field": "delivery_type", + "equals": "kinesis" + } + }, + { + "key": "kinesis_secret_access_key", + "label": "Kinesis IAM Secret Access Key", + "type": "password", + "path": "deliveryConfig.iamSecretAccessKey", + "when": { + "field": "delivery_type", + "equals": "kinesis" + } + }, + { + "key": "event_hub_name", + "label": "Event Hub Name", + "type": "string", + "path": "deliveryConfig.eventHub.eventHubName", + "when": { + "field": "delivery_type", + "equals": "event-hub" + } + }, + { + "key": "event_hub_connection_string", + "label": "Event Hub Connection String", + "type": "password", + "path": "deliveryConfig.eventHub.connectionString", + "when": { + "field": "delivery_type", + "equals": "event-hub" + }, + "help": "Use this, or the namespace and service principal fields below." + }, + { + "key": "event_hub_namespace", + "label": "Event Hub Fully Qualified Namespace", + "type": "string", + "path": "deliveryConfig.eventHub.fullyQualifiedNamespace", + "when": { + "field": "delivery_type", + "equals": "event-hub" + } + }, + { + "key": "event_hub_client_id", + "label": "Event Hub Client ID", + "type": "string", + "path": "deliveryConfig.eventHub.clientId", + "when": { + "field": "delivery_type", + "equals": "event-hub" + } + }, + { + "key": "event_hub_tenant_id", + "label": "Event Hub Tenant ID", + "type": "string", + "path": "deliveryConfig.eventHub.tenantId", + "when": { + "field": "delivery_type", + "equals": "event-hub" + } + }, + { + "key": "event_hub_client_secret", + "label": "Event Hub Client Secret", + "type": "password", + "path": "deliveryConfig.eventHub.clientSecret", + "when": { + "field": "delivery_type", + "equals": "event-hub" + } + } + ], + "result": { + "compose": { + "subscriptionId": "result.subscriptionId" + } + }, + "sample": { + "subscriptionId": "FXeLSlemePGGhvt" + } + }, + { + "key": "delete_monitor", + "resource": "monitor", + "kind": "action", + "noun": "Property Monitor", + "label": "Delete Property Monitor", + "description": "Deletes a property monitor so it stops delivering events. Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event).", + "destructive": true, + "mockedOnly": true, + "http": { + "method": "DELETE", + "path": "/api/v2/property-subscription/{id}" + }, + "fields": [ + { + "key": "id", + "label": "Monitor ID", + "type": "string", + "required": true, + "in": "path", + "help": "The ID of the monitor to delete." + } + ], + "dynamic": "new_monitor", + "result": { + "static": { + "deleted": true + }, + "echo": { + "id": "id" + } + }, + "sample": { + "deleted": true, + "id": "FXeLSlemePGGhvt" + } + } + ], + "triggers": [ + { + "key": "new_search_session", + "mode": "poll", + "noun": "Search Session", + "label": "New Search Session", + "description": "Triggers when a new search session appears on your team. Needs a token with the property search sessions permission. This call does not bill property records.", + "http": { + "method": "GET", + "path": "/api/v2/property/search-sessions" + }, + "fixedQuery": { + "take": 100 + }, + "fields": [], + "result": { + "list": "results.sessions" + }, + "dedupe": "id", + "sortDesc": "createdAt", + "sample": { + "id": "monthly-leads-az-85020", + "totalDelivered": 25, + "lastRequestAt": "2026-10-28T23:17:54.592Z", + "createdAt": "2026-10-01T16:02:11.120Z" + } + }, + { + "key": "new_monitor", + "mode": "poll", + "noun": "Property Monitor", + "label": "New Property Monitor", + "description": "Triggers when a new property monitor is created on your team. Needs a token with the property subscription permission. Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event).", + "mockedOnly": true, + "http": { + "method": "GET", + "path": "/api/v2/property-subscription" + }, + "fields": [], + "result": { + "list": "results.subscriptions" + }, + "dedupe": "id", + "sample": { + "id": "cjui0E2T1LKxWOD", + "searchCriteria": { + "query": "Phoenix, AZ", + "orQuickLists": [ + "on-market" + ] + }, + "deliveryConfig": { + "type": "kinesis", + "streamName": "my-stream", + "region": "us-west-2" + } + } + }, + { + "key": "new_session_property", + "mode": "poll", + "billed": true, + "noun": "Session Property", + "label": "New Property in Search Session (Billed)", + "description": "Triggers when a search session delivers a property that it has not delivered before. Every check runs the search and bills each property delivered, up to Max Results per check, and a property is never billed twice within the same Session ID. Billed per property record delivered; a session never delivers (or bills) the same property twice. Use a low Max Results while you test.", + "http": { + "method": "POST", + "path": "/api/v1/property/search" + }, + "fixed": [ + { + "path": "options.useCursorPagination", + "value": true + } + ], + "fields": [ + { + "key": "session_id", + "label": "Session ID", + "type": "string", + "required": true, + "path": "options.searchSession.id", + "pattern": "^[A-Za-z0-9_-]{1,128}$", + "help": "Your own name for the session: letters, numbers, dash or underscore, up to 128 characters. Reusing the same ID continues the session, so you are never billed twice for the same property. A team can hold 100 sessions." + }, + { + "key": "query", + "label": "Location Query", + "type": "string", + "path": "searchCriteria.query", + "help": "City, county, ZIP code or address text, for example \"Phoenix, AZ\"." + }, + { + "key": "quick_lists", + "label": "Quick Lists (Include)", + "type": "list", + "path": "searchCriteria.quickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match ALL selected lists." + }, + { + "key": "or_quick_lists", + "label": "Quick Lists (Match Any)", + "type": "list", + "path": "searchCriteria.orQuickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match AT LEAST ONE selected list." + }, + { + "key": "additional_criteria", + "label": "Additional Criteria (JSON)", + "type": "json", + "path": "searchCriteria", + "merge": true, + "first": true, + "help": "Optional JSON object merged into the search criteria. The fields above win on conflict. Callback URL keys are ignored." + }, + { + "key": "take", + "label": "Max Results", + "type": "integer", + "path": "options.take", + "default": 25, + "min": 1, + "max": 100, + "help": "Whole number from 1 to 100. Default 25. You are billed per property delivered on each check." + } + ], + "result": { + "list": "results.properties", + "idFrom": { + "id": "_id" + }, + "attach": { + "searchMeta": "results.meta.results" + } + }, + "dedupe": "id", + "sample": { + "id": "09201d3bd3134f9380704014781fb4c0", + "_id": "09201d3bd3134f9380704014781fb4c0", + "address": { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa" + }, + "general": { + "propertyTypeCategory": "Single Family" + }, + "quickLists": { + "vacant": false + } + } + }, + { + "key": "monitor_event", + "mode": "hook", + "noun": "Property Monitor Event", + "label": "New Property Monitor Event", + "description": "Triggers when BatchData reports that a property matching your criteria was added to or removed from a monitor, or changed (instant). Turning the Zap or scenario on creates a monitor that delivers to this trigger's own hook URL; turning it off deletes that monitor. Each event carries the property ID and change details; turn on \"Include Property Record\" to also look up the full property record. Monitors and the events they deliver are billed according to your BatchData plan; contact support@batchservice.com for pricing. Limits: up to 5 monitors per team, a monitor cannot be edited after it is created (delete and recreate it), a new monitor can take up to 7 days to start delivering, and delivery is best effort (4 attempts per event). The optional property lookup is billed per event, per matched property.", + "mockedOnly": true, + "http": { + "method": "POST", + "path": "/api/v2/property-subscription", + "deletePath": "/api/v2/property-subscription/{id}", + "idPath": "result.subscriptionId" + }, + "deliveryType": "webhook", + "hydrate": { + "path": "/api/v1/property/lookup/all-attributes", + "idField": "propertyId", + "listPath": "results.properties", + "into": "property" + }, + "fields": [ + { + "key": "query", + "label": "Location Query", + "type": "string", + "path": "searchCriteria.query", + "help": "City, county, ZIP code or address text, for example \"Phoenix, AZ\"." + }, + { + "key": "quick_lists", + "label": "Quick Lists (Include)", + "type": "list", + "path": "searchCriteria.quickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match ALL selected lists." + }, + { + "key": "or_quick_lists", + "label": "Quick Lists (Match Any)", + "type": "list", + "path": "searchCriteria.orQuickLists", + "choices": [ + { + "value": "absentee-owner", + "label": "absentee-owner" + }, + { + "value": "active-auction", + "label": "active-auction" + }, + { + "value": "active-listing", + "label": "active-listing" + }, + { + "value": "canceled-listing", + "label": "canceled-listing" + }, + { + "value": "cash-buyer", + "label": "cash-buyer" + }, + { + "value": "corporate-owned", + "label": "corporate-owned" + }, + { + "value": "expired-listing", + "label": "expired-listing" + }, + { + "value": "failed-listing", + "label": "failed-listing" + }, + { + "value": "fix-and-flip", + "label": "fix-and-flip" + }, + { + "value": "free-and-clear", + "label": "free-and-clear" + }, + { + "value": "for-sale-by-owner", + "label": "for-sale-by-owner" + }, + { + "value": "has-hoa", + "label": "has-hoa" + }, + { + "value": "has-hoa-fees", + "label": "has-hoa-fees" + }, + { + "value": "high-equity", + "label": "high-equity" + }, + { + "value": "inherited", + "label": "inherited" + }, + { + "value": "involuntary-lien", + "label": "involuntary-lien" + }, + { + "value": "in-state-absentee-owner", + "label": "in-state-absentee-owner" + }, + { + "value": "listed-below-market-price", + "label": "listed-below-market-price" + }, + { + "value": "low-equity", + "label": "low-equity" + }, + { + "value": "mailing-address-vacant", + "label": "mailing-address-vacant" + }, + { + "value": "notice-of-default", + "label": "notice-of-default" + }, + { + "value": "notice-of-lis-pendens", + "label": "notice-of-lis-pendens" + }, + { + "value": "notice-of-sale", + "label": "notice-of-sale" + }, + { + "value": "on-market", + "label": "on-market" + }, + { + "value": "out-of-state-absentee-owner", + "label": "out-of-state-absentee-owner" + }, + { + "value": "out-of-state-owner", + "label": "out-of-state-owner" + }, + { + "value": "owner-occupied", + "label": "owner-occupied" + }, + { + "value": "pending-listing", + "label": "pending-listing" + }, + { + "value": "preforeclosure", + "label": "preforeclosure" + }, + { + "value": "recently-sold", + "label": "recently-sold" + }, + { + "value": "same-property-and-mailing-address", + "label": "same-property-and-mailing-address" + }, + { + "value": "senior-owner", + "label": "senior-owner" + }, + { + "value": "tax-default", + "label": "tax-default" + }, + { + "value": "tired-landlord", + "label": "tired-landlord" + }, + { + "value": "trust-owned", + "label": "trust-owned" + }, + { + "value": "unknown-equity", + "label": "unknown-equity" + }, + { + "value": "vacant", + "label": "vacant" + }, + { + "value": "vacant-lot", + "label": "vacant-lot" + } + ], + "help": "Properties must match AT LEAST ONE selected list." + }, + { + "key": "additional_criteria", + "label": "Additional Criteria (JSON)", + "type": "json", + "path": "searchCriteria", + "merge": true, + "first": true, + "help": "Optional JSON object merged into the search criteria. The fields above win on conflict. Callback URL keys are ignored." + }, + { + "key": "include_property", + "label": "Include Property Record (Billed)", + "type": "boolean", + "local": true, + "default": false, + "help": "Off by default. When on, each event also runs a property lookup and adds the full record as \"property\". The lookup is billed per matched property." + } + ], + "dedupe": "id", + "sample": { + "id": "evt_9c1f2a", + "eventId": "evt_9c1f2a", + "propertyId": "09201d3bd3134f9380704014781fb4c0", + "parcelHash": "a1b2c3d4e5f60718293a4b5c6d7e8f90", + "addressHash": "90a01b18e3834e349a8d1d07d7e086ba", + "addedToSubscriptionIds": [ + "FXeLSlemePGGhvt" + ], + "removedFromSubscriptionIds": [], + "propertyChangedAt": "2026-10-28T22:10:41.000Z", + "sentAt": "2026-10-28T22:10:45.000Z" + } + } + ], + "apiRequest": { + "key": "api_request", + "resource": "custom", + "noun": "API Response", + "label": "API Request (Advanced)", + "description": "Calls any BatchData API path with your token. Billing follows the endpoint you call. Account balance and billing endpoints, asynchronous (callback) endpoints and monitor creation are not available here.", + "methods": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE" + ], + "guard": { + "mustStartWith": "/api/", + "blockedPathContains": [ + "wallet" + ], + "blockedPathSegments": [ + "async" + ], + "blockedWrites": [ + { + "pathContains": "property-subscription", + "methods": [ + "POST", + "PUT", + "PATCH" + ] + } + ] + }, + "sample": { + "statusCode": 200, + "body": { + "status": { + "code": 200, + "text": "OK" + } + } + } + } +} diff --git a/lib/catalog.sha256 b/lib/catalog.sha256 new file mode 100644 index 0000000..3648287 --- /dev/null +++ b/lib/catalog.sha256 @@ -0,0 +1 @@ +0fa2900e91bdbe71e5f6ba42802bea92efa56f93cfa488038d4be03314f3635f diff --git a/lib/common.js b/lib/common.js new file mode 100644 index 0000000..f6cd78c --- /dev/null +++ b/lib/common.js @@ -0,0 +1,110 @@ +'use strict'; + +const { FORBIDDEN_BODY_KEYS } = require('./constants'); + +class InputError extends Error { + constructor(message) { + super(message); + this.name = 'InputError'; + } +} + +const isPlainObject = (value) => + typeof value === 'object' && value !== null && !Array.isArray(value); + +const isBlank = (value) => value === undefined || value === null || value === ''; + +// Deep merge where `override` wins on conflict. Arrays are replaced. +const deepMerge = (base, override) => { + const result = { ...base }; + for (const [key, value] of Object.entries(override)) { + if (isPlainObject(result[key]) && isPlainObject(value)) { + result[key] = deepMerge(result[key], value); + } else { + result[key] = value; + } + } + return result; +}; + +// Remove webhookUrl / errorWebhookUrl at any depth. +const stripForbiddenKeys = (value) => { + if (Array.isArray(value)) return value.map(stripForbiddenKeys); + if (isPlainObject(value)) { + const out = {}; + for (const [key, entry] of Object.entries(value)) { + if (FORBIDDEN_BODY_KEYS.includes(key)) continue; + out[key] = stripForbiddenKeys(entry); + } + return out; + } + return value; +}; + +const removeEmpty = (value) => { + const out = {}; + for (const [key, entry] of Object.entries(value)) { + if (isBlank(entry)) continue; + if (isPlainObject(entry)) { + const nested = removeEmpty(entry); + if (Object.keys(nested).length === 0) continue; + out[key] = nested; + continue; + } + out[key] = entry; + } + return out; +}; + +const parseJsonObject = (raw, label) => { + if (isBlank(raw)) return {}; + if (isPlainObject(raw)) return raw; + let parsed; + if (typeof raw === 'string') { + try { + parsed = JSON.parse(raw); + } catch (error) { + throw new InputError(`${label} is not valid JSON`); + } + } + if (!isPlainObject(parsed)) { + throw new InputError(`${label} must be a JSON object`); + } + return parsed; +}; + +const splitPhoneNumbers = (raw) => + (Array.isArray(raw) ? raw.join(',') : String(raw === undefined || raw === null ? '' : raw)) + .split(/[\s,;]+/) + .map((entry) => entry.trim()) + .filter((entry) => entry.length > 0); + +const toDateOnly = (value) => { + if (isBlank(value)) return undefined; + const text = String(value); + const match = /^(\d{4}-\d{2}-\d{2})/.exec(text); + if (!match) throw new InputError(`"${text}" is not a valid date. Use YYYY-MM-DD.`); + return match[1]; +}; + +const asList = (value) => { + if (isBlank(value)) return []; + if (Array.isArray(value)) return value.filter((entry) => !isBlank(entry)); + return String(value) + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean); +}; + +module.exports = { + InputError, + isPlainObject, + isBlank, + deepMerge, + stripForbiddenKeys, + removeEmpty, + parseJsonObject, + splitPhoneNumbers, + toDateOnly, + asList, +}; diff --git a/lib/constants.js b/lib/constants.js new file mode 100644 index 0000000..3a8f39d --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,73 @@ +'use strict'; + +const API_HOST = 'https://api.batchdata.com'; +const SUPPORT_EMAIL = 'support@batchservice.com'; + +const QUICKLISTS = [ + 'absentee-owner', + 'active-auction', + 'active-listing', + 'canceled-listing', + 'cash-buyer', + 'corporate-owned', + 'expired-listing', + 'failed-listing', + 'fix-and-flip', + 'free-and-clear', + 'for-sale-by-owner', + 'has-hoa', + 'has-hoa-fees', + 'high-equity', + 'inherited', + 'involuntary-lien', + 'in-state-absentee-owner', + 'listed-below-market-price', + 'low-equity', + 'mailing-address-vacant', + 'notice-of-default', + 'notice-of-lis-pendens', + 'notice-of-sale', + 'on-market', + 'out-of-state-absentee-owner', + 'out-of-state-owner', + 'owner-occupied', + 'pending-listing', + 'preforeclosure', + 'recently-sold', + 'same-property-and-mailing-address', + 'senior-owner', + 'tax-default', + 'tired-landlord', + 'trust-owned', + 'unknown-equity', + 'vacant', + 'vacant-lot', +]; + +const LOOKUP_DATASETS = [ + 'basic', + 'comps', + 'batchrank', + 'contact', + 'core', + 'deed', + 'demographic', + 'foreclosure', + 'listing', + 'mortgage-liens', + 'owner', + 'parcel-boundary', + 'permit', + 'quicklist', + 'valuation', +]; + +const FORBIDDEN_BODY_KEYS = ['webhookUrl', 'errorWebhookUrl']; + +module.exports = { + API_HOST, + SUPPORT_EMAIL, + QUICKLISTS, + LOOKUP_DATASETS, + FORBIDDEN_BODY_KEYS, +}; diff --git a/lib/engine.js b/lib/engine.js new file mode 100644 index 0000000..0934f6a --- /dev/null +++ b/lib/engine.js @@ -0,0 +1,274 @@ +'use strict'; +// Catalog engine shared (copied) by the Zapier app and the Make test-suite. The n8n node has a typed port +// of the same logic in nodes/BatchData/catalogEngine.ts. Pure functions, no I/O. + +const FORBIDDEN_KEYS = ['webhookUrl', 'errorWebhookUrl']; + +class InputError extends Error { + constructor(message) { + super(message); + this.name = 'InputError'; + } +} + +const isPlain = (v) => typeof v === 'object' && v !== null && !Array.isArray(v); +const isBlank = (v) => v === undefined || v === null || v === '' || (Array.isArray(v) && v.length === 0); + +const deepMerge = (base, override) => { + const out = { ...base }; + for (const [k, v] of Object.entries(override)) { + out[k] = isPlain(out[k]) && isPlain(v) ? deepMerge(out[k], v) : v; + } + return out; +}; + +const strip = (v) => { + if (Array.isArray(v)) return v.map(strip); + if (isPlain(v)) { + const out = {}; + for (const [k, e] of Object.entries(v)) { + if (FORBIDDEN_KEYS.some((f) => f.toLowerCase() === k.toLowerCase())) continue; + out[k] = strip(e); + } + return out; + } + return v; +}; + +const removeEmpty = (obj) => { + const out = {}; + for (const [k, v] of Object.entries(obj)) { + if (v === undefined || v === null || v === '') continue; + if (isPlain(v)) { + const n = removeEmpty(v); + if (Object.keys(n).length === 0) continue; + out[k] = n; + } else out[k] = v; + } + return out; +}; + +const getPath = (obj, path) => { + let cur = obj; + for (const seg of path.split('.')) { + if (cur === undefined || cur === null) return undefined; + cur = cur[seg]; + } + return cur; +}; + +const setPath = (obj, path, value) => { + const segs = path.split('.'); + let cur = obj; + segs.forEach((seg, i) => { + const last = i === segs.length - 1; + if (last) { + cur[seg] = value; + return; + } + if (!isPlain(cur[seg]) && !Array.isArray(cur[seg])) cur[seg] = /^\d+$/.test(segs[i + 1]) ? [] : {}; + cur = cur[seg]; + }); +}; + +const toBoolean = (v) => { + if (v === true || v === 'true' || v === 'yes' || v === 'Yes' || v === 1 || v === '1') return true; + if (v === false || v === 'false' || v === 'no' || v === 'No' || v === 0 || v === '0') return false; + return undefined; +}; + +const asList = (v) => { + if (Array.isArray(v)) return v.map((e) => String(e).trim()).filter(Boolean); + if (isBlank(v)) return []; + return String(v).split(/[\n,]+/).map((e) => e.trim()).filter(Boolean); +}; + +const parseJsonObject = (v, label) => { + if (isBlank(v)) return undefined; + if (isPlain(v)) return v; + let parsed; + try { + parsed = JSON.parse(String(v)); + } catch (e) { + throw new InputError(`${label} is not valid JSON`); + } + if (!isPlain(parsed)) throw new InputError(`${label} must be a JSON object`); + return parsed; +}; + +const coerce = (field, raw) => { + if (isBlank(raw) && raw !== false) return undefined; + switch (field.type) { + case 'string': + case 'text': + case 'password': + return String(raw).trim(); + case 'integer': + case 'number': { + const n = Number(raw); + if (!Number.isFinite(n) || (field.type === 'integer' && !Number.isInteger(n))) { + throw new InputError(`${field.label} must be a ${field.type === 'integer' ? 'whole ' : ''}number`); + } + if (field.min !== undefined && n < field.min) throw new InputError(`${field.label} must be at least ${field.min}`); + if (field.max !== undefined && n > field.max) throw new InputError(`${field.label} must be at most ${field.max}`); + return n; + } + case 'boolean': { + const b = toBoolean(raw); + if (b === undefined) throw new InputError(`${field.label} must be yes or no`); + return b; + } + case 'choice': { + const v = String(raw).trim(); + if (field.choices && !field.choices.some((c) => c.value === v)) throw new InputError(`${field.label}: "${v}" is not an allowed value`); + return v; + } + case 'list': { + const l = asList(raw); + return l.length ? l : undefined; + } + case 'date': { + const s = String(raw).trim().slice(0, 10); + if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) throw new InputError(`${field.label} must look like 2026-01-31`); + return s; + } + case 'json': + return parseJsonObject(raw, field.label); + default: + return raw; + } +}; + +const resolveInput = (field, input) => { + const raw = input[field.key]; + if (isBlank(raw) && raw !== false && field.default !== undefined) return field.default; + return raw; +}; + +const buildRows = (field, rows) => { + let list = rows; + if (typeof list === 'string') { + try { list = JSON.parse(list); } catch (e) { throw new InputError(`${field.label} must be a list of rows`); } + } + if (isPlain(list)) list = [list]; + if (!Array.isArray(list)) list = []; + const out = []; + for (const row of list) { + if (!isPlain(row)) continue; + const item = {}; + for (const rf of field.rowFields) { + const v = coerce(rf, row[rf.key]); + if (v !== undefined) setPath(item, rf.path, v); + } + const cleaned = removeEmpty(item); + if (Object.keys(cleaned).length > 0) out.push(cleaned); + } + if (out.length === 0 && field.required) throw new InputError(`${field.label}: add at least one row`); + if (field.max && out.length > field.max) throw new InputError(`${field.label}: at most ${field.max} rows per call (got ${out.length})`); + return out; +}; + +// Build the HTTP request for a catalog op or trigger. +const buildRequest = (op, input = {}) => { + const fields = op.fields || []; + const body = {}; + const qs = Object.assign({}, op.fixedQuery || {}); + let path = op.http.path; + const resolved = {}; + for (const f of fields) resolved[f.key] = resolveInput(f, input); + const wire = fields.filter((f) => !f.local); + + if (op.requireOneOf && !op.requireOneOf.some((k) => !isBlank(resolved[k]))) { + const labels = op.requireOneOf.map((k) => (fields.find((f) => f.key === k) || { label: k }).label); + throw new InputError(`Fill in at least one of: ${labels.join(', ')}`); + } + + const ordered = [...wire.filter((f) => f.first), ...wire.filter((f) => !f.first)]; + for (const f of ordered) { + if (f.when && String(resolved[f.when.field]) !== String(f.when.equals)) continue; + if (f.type === 'rows') { + body && setPath(body, f.path, buildRows(f, resolved[f.key])); + continue; + } + const v = coerce(f, resolved[f.key]); + if (v === undefined) { + if (f.required) throw new InputError(`${f.label} is required`); + continue; + } + if (f.pattern && !new RegExp(f.pattern).test(String(v))) throw new InputError(`${f.label} has an invalid format`); + if (f.in === 'path') { + path = path.replace(/\{[^}]+\}/, encodeURIComponent(String(v))); + } else if (f.in === 'query') { + qs[f.qs || f.key] = v; + } else if (f.type === 'json') { + const existing = getPath(body, f.path); + setPath(body, f.path, deepMerge(v, isPlain(existing) ? existing : {})); + } else { + setPath(body, f.path, v); + } + } + for (const fx of op.fixed || []) setPath(body, fx.path, fx.value); + const method = op.http.method; + const hasBody = method !== 'GET' && method !== 'DELETE'; + return { method, path, qs, body: hasBody ? strip(body) : undefined }; +}; + +// Turn an API response into a list of result records. +const extractResult = (op, response, input = {}) => { + const r = op.result || {}; + const resp = isPlain(response) ? response : {}; + const attach = (item) => { + for (const [k, p] of Object.entries(r.attach || {})) { + const v = getPath(resp, p); + if (v !== undefined) item[k] = v; + } + for (const [k, from] of Object.entries(r.idFrom || {})) { + if (item[from] !== undefined) item[k] = item[from]; + } + return item; + }; + if (r.compose) { + const out = {}; + for (const [k, p] of Object.entries(r.compose)) { + const v = getPath(resp, p); + out[k] = v === undefined ? null : v; + } + return [out]; + } + if (r.static) { + const out = { ...r.static }; + for (const [k, from] of Object.entries(r.echo || {})) out[k] = input[from]; + return [out]; + } + if (r.item) { + const v = getPath(resp, r.item); + return isPlain(v) ? [attach({ ...v })] : []; + } + let arr = getPath(resp, r.list); + if (!Array.isArray(arr)) arr = []; + if (r.filter) arr = arr.filter((e) => getPath(e, r.filter.path) === r.filter.equals); + return arr.map((e) => attach(isPlain(e) ? { ...e } : { value: e })); +}; + +// Guard for the generic API request action. +const checkApiRequest = (guard, method, rawPath) => { + const path = String(rawPath || '').trim(); + const bad = (why) => new InputError(`That path is not allowed here (${why}).`); + if (!path.startsWith(guard.mustStartWith)) throw bad(`it must start with ${guard.mustStartWith}`); + if (/[?#\\%]/.test(path) || path.includes('..') || path.includes('//')) throw bad('no query string, encoding or relative segments'); + const lower = path.toLowerCase(); + for (const word of guard.blockedPathContains) if (lower.includes(word)) throw bad('account balance and billing endpoints are blocked'); + const segs = lower.split('/'); + for (const seg of guard.blockedPathSegments) if (segs.includes(seg)) throw bad('asynchronous callback endpoints are blocked'); + for (const w of guard.blockedWrites) { + if (lower.includes(w.pathContains) && w.methods.includes(String(method).toUpperCase())) { + throw bad('create monitors with the dedicated Create Property Monitor action or the New Property Monitor Event trigger'); + } + } + return path; +}; + +module.exports = { + FORBIDDEN_KEYS, InputError, isPlain, isBlank, deepMerge, strip, removeEmpty, getPath, setPath, toBoolean, asList, + parseJsonObject, coerce, buildRequest, extractResult, checkApiRequest, +}; diff --git a/lib/execute.js b/lib/execute.js new file mode 100644 index 0000000..aa48473 --- /dev/null +++ b/lib/execute.js @@ -0,0 +1,52 @@ +'use strict'; + +const { InputError } = require('./common'); +const { API_HOST } = require('./constants'); + +// Runs one operation: builds the request, calls BatchData once, extracts records. +const runOperation = async (z, bundle, op) => { + let request; + try { + request = op.buildRequest(bundle.inputData || {}); + } catch (error) { + if (error instanceof InputError) { + throw new z.errors.Error(error.message, 'InvalidInput', 400); + } + throw error; + } + const response = await z.request({ + url: `${API_HOST}${request.path}`, + method: 'POST', + headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, + body: request.body, + }); + const data = response.data && typeof response.data === 'object' ? response.data : {}; + return op.extract(data, request); +}; + +// Shape returned by an action (create). Skip trace wraps its persons; the others return one record. +const toActionResult = (op, records) => { + if (op.single === 'persons') { + return { + apiVersion: records.length > 0 ? records[0].apiVersion : null, + matched: records.length > 0, + personCount: records.length, + persons: records.map((record) => record.person), + }; + } + return records.length > 0 ? records[0] : { matched: false }; +}; + +const actionSample = (op) => { + if (op.single === 'persons') { + return { + apiVersion: op.sample.apiVersion, + matched: true, + personCount: 1, + persons: [op.sample.person], + }; + } + return op.sample; +}; + +module.exports = { runOperation, toActionResult, actionSample }; diff --git a/lib/fields.js b/lib/fields.js new file mode 100644 index 0000000..8467c70 --- /dev/null +++ b/lib/fields.js @@ -0,0 +1,45 @@ +'use strict'; + +const { QUICKLISTS, LOOKUP_DATASETS } = require('./constants'); + +const addressFields = (prefix = '', labelPrefix = '') => [ + { key: `${prefix}street`, label: `${labelPrefix}Street`, type: 'string', helpText: 'Street address including house number, for example 2800 N 24th St.' }, + { key: `${prefix}city`, label: `${labelPrefix}City`, type: 'string' }, + { key: `${prefix}state`, label: `${labelPrefix}State`, type: 'string', helpText: 'Two-letter state code, for example AZ.' }, + { key: `${prefix}zip`, label: `${labelPrefix}ZIP Code`, type: 'string' }, +]; + +const requestIdField = { + key: 'request_id', + label: 'Your Reference ID', + type: 'string', + helpText: 'Optional. Echoed back in the result so you can match it to your own record.', +}; + +const quickListChoices = QUICKLISTS; +const datasetChoices = LOOKUP_DATASETS.filter((entry) => entry !== 'parcel-boundary'); + +const yesNoAny = (key, label, helpText) => ({ + key, + label, + type: 'string', + choices: [ + { value: 'yes', label: 'Yes' }, + { value: 'no', label: 'No' }, + ], + helpText: helpText || 'Leave empty to not filter on this.', +}); + +const rangeFields = (base, label, type = 'number') => [ + { key: `${base}_min`, label: `${label} (Min)`, type }, + { key: `${base}_max`, label: `${label} (Max)`, type }, +]; + +module.exports = { + addressFields, + requestIdField, + quickListChoices, + datasetChoices, + yesNoAny, + rangeFields, +}; diff --git a/lib/modules.js b/lib/modules.js new file mode 100644 index 0000000..1c14142 --- /dev/null +++ b/lib/modules.js @@ -0,0 +1,68 @@ +'use strict'; + +const { operations } = require('./operations'); +const { runOperation, toActionResult, actionSample } = require('./execute'); +const { outputFieldsFromSample } = require('./outputFields'); + +const searchFor = (op) => ({ + key: op.key, + noun: op.noun, + display: { label: op.label, description: op.description }, + operation: { + inputFields: op.inputFields, + perform: (z, bundle) => runOperation(z, bundle, op), + sample: op.sample, + outputFields: op.outputFields, + }, +}); + +const actionKey = (op) => `${op.key}_action`; + +const createFor = (op) => { + const sample = actionSample(op); + return { + key: actionKey(op), + noun: op.noun, + display: { label: op.createLabel, description: op.description }, + operation: { + inputFields: op.inputFields, + perform: async (z, bundle) => toActionResult(op, await runOperation(z, bundle, op)), + sample, + outputFields: outputFieldsFromSample(sample), + }, + }; +}; + +const toMap = (list, keyOf) => + list.reduce((acc, module) => { + acc[keyOf(module)] = module; + return acc; + }, {}); + +const searches = toMap(operations.map(searchFor), (m) => m.key); +const creates = toMap( + operations.filter((op) => op.createLabel).map(createFor), + (m) => m.key, +); + +const catalogModules = require('./catalog-modules'); +const normalizeAll = (map) => { + for (const module of Object.values(map)) { + const walk = (fields) => (fields || []).forEach((field) => { + if (Array.isArray(field.choices)) { + field.choices = field.choices.map((choice) => + typeof choice === 'string' ? choice : { value: choice.value, sample: choice.sample || choice.value, label: choice.label || choice.value }); + } + if (field.children) walk(field.children); + }); + walk(module.operation.inputFields); + } + return map; +}; + +module.exports = { + searches: normalizeAll({ ...searches, ...catalogModules.searches }), + creates: normalizeAll({ ...creates, ...catalogModules.creates }), + triggers: normalizeAll(catalogModules.triggers), + actionKey, +}; diff --git a/lib/operations.js b/lib/operations.js new file mode 100644 index 0000000..b0231ce --- /dev/null +++ b/lib/operations.js @@ -0,0 +1,243 @@ +'use strict'; + +const { API_HOST, SUPPORT_EMAIL } = require('./constants'); +const { + buildAddressVerifyBody, + buildLookupBody, + buildPhoneBody, + buildSearchBody, + buildSkipTraceBody, + extractSkipTraceRecords, + skipTracePath, +} = require('./builders'); +const { + addressFields, + datasetChoices, + quickListChoices, + rangeFields, + requestIdField, + yesNoAny, +} = require('./fields'); +const { isPlainObject } = require('./common'); +const { outputFieldsFromSample } = require('./outputFields'); + +const sample = (name) => require(`../samples/${name}.json`); + +const phoneField = { + key: 'phone_numbers', + label: 'Phone Number(s)', + type: 'string', + required: true, + list: true, + helpText: + 'One or more US phone numbers. A single field value can also hold several numbers separated by commas. You are billed for each phone number you submit.', +}; + +const phoneComplianceNote = + ' This is a point-in-time answer from BatchData. You are responsible for meeting TCPA, DNC and other calling rules in your jurisdiction.'; + +const listOf = (response, ...path) => { + let node = response; + for (const segment of path) { + if (!isPlainObject(node)) return []; + node = node[segment]; + } + return Array.isArray(node) ? node : []; +}; + +const phoneOp = ({ key, noun, label, description, endpoint, sampleName }) => ({ + key, + noun, + label, + description: `${description} Billed per phone number submitted.${phoneComplianceNote}`, + single: true, + createLabel: label, + inputFields: [phoneField], + buildRequest: (input) => ({ path: endpoint, body: buildPhoneBody(input) }), + extract: (response) => listOf(response, 'results', 'phoneNumbers'), + sample: sample(sampleName), +}); + +const operations = [ + { + key: 'search_properties', + noun: 'Property', + label: 'Find Properties', + description: + 'Searches BatchData property records with filters. Billed per property record returned; a count-only request (Max Results = 0) is billed as one record. Each result includes the total number found in the "Search Meta" fields.', + single: false, + createLabel: null, + inputFields: [ + { key: 'query', label: 'Location Query', type: 'string', helpText: 'City, county, ZIP code or address text, for example "Phoenix, AZ".' }, + { key: 'quick_lists', label: 'Quick Lists (Include)', type: 'string', list: true, choices: quickListChoices, helpText: 'Properties must match ALL selected lists.' }, + { key: 'or_quick_lists', label: 'Quick Lists (Match Any)', type: 'string', list: true, choices: quickListChoices, helpText: 'Properties must match AT LEAST ONE selected list.' }, + { key: 'excluded_quick_lists', label: 'Quick Lists (Exclude)', type: 'string', list: true, choices: quickListChoices, helpText: 'Properties on any selected list are left out.' }, + { key: 'property_type_category', label: 'Property Type Category', type: 'string', helpText: 'For example "Single Family" or "Multi-Family".' }, + { key: 'property_type_detail', label: 'Property Type Detail', type: 'string' }, + ...rangeFields('bedrooms', 'Bedrooms', 'integer'), + ...rangeFields('bathrooms', 'Bathrooms'), + ...rangeFields('year_built', 'Year Built', 'integer'), + ...rangeFields('living_area', 'Living Area (sq ft)'), + ...rangeFields('lot_size_acres', 'Lot Size (acres)'), + ...rangeFields('estimated_value', 'Estimated Value (USD)'), + ...rangeFields('equity_percent', 'Equity Percent'), + { key: 'last_sale_date_from', label: 'Last Sale Date (From)', type: 'datetime' }, + { key: 'last_sale_date_to', label: 'Last Sale Date (To)', type: 'datetime' }, + yesNoAny('owner_occupied', 'Owner Occupied'), + { key: 'take', label: 'Max Results', type: 'integer', default: '25', helpText: 'From 0 to 100. Default 25. You are billed per record returned.' }, + { key: 'skip', label: 'Skip (Offset)', type: 'integer', helpText: 'Number of results to skip, for paging.' }, + { key: 'additional_criteria', label: 'Additional Search Criteria (JSON)', type: 'text', helpText: 'Optional JSON object merged into searchCriteria. Fields above win on conflict. webhookUrl and errorWebhookUrl are ignored.' }, + ], + buildRequest: (input) => ({ path: '/api/v1/property/search', body: buildSearchBody(input) }), + extract: (response) => { + const results = isPlainObject(response.results) ? response.results : {}; + const meta = isPlainObject(results.meta) && isPlainObject(results.meta.results) ? results.meta.results : {}; + const searchMeta = { + resultCount: meta.resultCount === undefined ? null : meta.resultCount, + resultsFound: meta.resultsFound === undefined ? null : meta.resultsFound, + }; + const properties = Array.isArray(results.properties) ? results.properties : []; + if (properties.length === 0 && meta.resultsFound !== undefined && meta.resultsFound !== null) { + return [{ searchMeta }]; + } + return properties.map((property) => ({ ...property, searchMeta })); + }, + sample: sample('search_properties'), + }, + { + key: 'lookup_property', + noun: 'Property', + label: 'Look Up Property', + description: + 'Returns the full record for one property, identified by address, BatchData property ID, address hash, or APN plus county FIPS code. Billed per property record returned; adding contact info adds enrichment cost.', + single: true, + createLabel: 'Look Up Property', + inputFields: [ + { + key: 'identify_by', + label: 'Identify Property By', + type: 'string', + required: true, + default: 'address', + choices: [ + { value: 'address', label: 'Address' }, + { value: 'propertyId', label: 'BatchData Property ID' }, + { value: 'hash', label: 'Address Hash' }, + { value: 'apn', label: 'APN + County FIPS Code' }, + ], + helpText: 'Fill in only the fields for the option you choose here. Exactly one identifier is sent.', + }, + ...addressFields(), + { key: 'property_id', label: 'BatchData Property ID', type: 'string' }, + { key: 'address_hash', label: 'Address Hash', type: 'string' }, + { key: 'apn', label: 'APN', type: 'string' }, + { key: 'county_fips_code', label: 'County FIPS Code', type: 'string', helpText: 'Required with APN.' }, + { key: 'datasets', label: 'Datasets', type: 'string', list: true, choices: datasetChoices, helpText: 'Optional. Limits the response to these datasets. "basic" and "core" cannot be combined.' }, + yesNoAny('include_skip_trace', 'Include Contact Info (Skip Trace)', 'Leave empty or No to skip. Yes adds contact-enrichment cost.'), + requestIdField, + ], + buildRequest: (input) => ({ path: '/api/v1/property/lookup/all-attributes', body: buildLookupBody(input) }), + extract: (response) => listOf(response, 'results', 'properties'), + sample: sample('lookup_property'), + }, + { + key: 'skip_trace', + noun: 'Skip Trace Result', + label: 'Skip Trace Property Owner', + description: + 'Finds owner contact details (phones and emails) for a property. Billed per matched result. TCPA-flagged phone numbers are left out unless you turn on "Include TCPA-Flagged Phones". Each result is one person.', + single: 'persons', + createLabel: 'Skip Trace Property Owner', + inputFields: [ + { + key: 'api_version', + label: 'API Version', + type: 'string', + default: 'v1', + choices: [ + { value: 'v1', label: 'V1 (persons list)' }, + { value: 'v3', label: 'V3 (up to 3 persons per property, more detail)' }, + ], + helpText: 'Both versions behave the same for the TCPA setting below because it is always sent explicitly.', + }, + { + key: 'find_by', + label: 'Find Property By', + type: 'string', + default: 'address', + choices: [ + { value: 'address', label: 'Property Address' }, + { value: 'apn', label: 'APN + County' }, + ], + }, + ...addressFields(), + { key: 'apn', label: 'APN', type: 'string' }, + { key: 'county_fips_code', label: 'County FIPS Code', type: 'string' }, + { key: 'county', label: 'County', type: 'string' }, + { key: 'apn_state', label: 'State (for APN)', type: 'string' }, + { key: 'owner_first_name', label: 'Owner First Name', type: 'string', helpText: 'Optional. Helps match the right person.' }, + { key: 'owner_last_name', label: 'Owner Last Name', type: 'string' }, + ...addressFields('mailing_', 'Mailing '), + { + key: 'include_tcpa_flagged', + label: 'Include TCPA-Flagged Phones', + type: 'boolean', + helpText: + 'Off by default: phone numbers flagged as TCPA litigators are left out. Turn on only if you have a documented compliance basis. Flagged numbers carry "tcpa": true in the result.', + }, + yesNoAny('prioritize_mobile_phones', 'Prioritize Mobile Phones'), + requestIdField, + ], + buildRequest: (input) => { + const version = input.api_version === 'v3' ? 'v3' : 'v1'; + return { path: skipTracePath(version), body: buildSkipTraceBody(input), version }; + }, + extract: (response, request) => extractSkipTraceRecords(request.version, response), + sample: sample('skip_trace'), + }, + { + key: 'verify_address', + noun: 'Address', + label: 'Verify Address', + description: + 'Standardizes and validates a US address, returning the corrected address, county, coordinates and delivery details. Billed per address submitted.', + single: true, + createLabel: 'Verify Address', + inputFields: addressFields().map((field) => ({ ...field, required: field.key === 'street' })), + buildRequest: (input) => ({ path: '/api/v1/address/verify', body: buildAddressVerifyBody(input) }), + extract: (response) => listOf(response, 'results', 'addresses'), + sample: sample('verify_address'), + }, + phoneOp({ + key: 'verify_phone', + noun: 'Phone Verification', + label: 'Verify Phone Number', + description: 'Checks whether a phone number is reachable and returns its carrier, line type, DNC and TCPA flags.', + endpoint: '/api/v1/phone/verification', + sampleName: 'verify_phone', + }), + phoneOp({ + key: 'check_dnc', + noun: 'DNC Status', + label: 'Check Do Not Call (DNC) Status', + description: 'Checks phone numbers against the Do Not Call registry.', + endpoint: '/api/v1/phone/dnc', + sampleName: 'check_dnc', + }), + phoneOp({ + key: 'check_tcpa', + noun: 'TCPA Status', + label: 'Check TCPA Litigator Status', + description: 'Checks phone numbers against TCPA (Telephone Consumer Protection Act) litigator lists.', + endpoint: '/api/v1/phone/tcpa', + sampleName: 'check_tcpa', + }), +]; + +for (const op of operations) { + op.outputFields = outputFieldsFromSample(op.sample); + op.supportEmail = SUPPORT_EMAIL; + op.host = API_HOST; +} + +module.exports = { operations }; diff --git a/lib/outputFields.js b/lib/outputFields.js new file mode 100644 index 0000000..23abe8c --- /dev/null +++ b/lib/outputFields.js @@ -0,0 +1,47 @@ +'use strict'; + +const { isPlainObject } = require('./common'); + +const labelFor = (key) => + key + .replace(/\[\]/g, '__') + .split('__') + .filter(Boolean) + .map((part) => part.replace(/^_/, '').replace(/([a-z0-9])([A-Z])/g, '$1 $2')) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(' ') + .replace(/\s+/g, ' ') + .trim(); + +const typeOf = (value) => { + if (typeof value === 'boolean') return 'boolean'; + if (typeof value === 'number') return Number.isInteger(value) ? 'integer' : 'number'; + return 'string'; +}; + +// Flatten a sample record into Zapier outputFields (nested keys use "__", arrays use "[]"). +const outputFieldsFromSample = (sample) => { + const fields = []; + const walk = (value, prefix) => { + if (isPlainObject(value)) { + for (const [key, entry] of Object.entries(value)) { + walk(entry, prefix ? `${prefix}__${key}` : key); + } + } else if (Array.isArray(value)) { + const first = value[0]; + if (isPlainObject(first)) { + for (const [key, entry] of Object.entries(first)) { + if (!isPlainObject(entry) && !Array.isArray(entry)) { + fields.push({ key: `${prefix}[]${key}`, label: labelFor(`${prefix}[]${key}`), type: typeOf(entry) }); + } + } + } + } else if (value !== null && value !== undefined) { + fields.push({ key: prefix, label: labelFor(prefix), type: typeOf(value) }); + } + }; + walk(sample, ''); + return fields; +}; + +module.exports = { outputFieldsFromSample, labelFor }; diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7176d5d91a0ebfa460f9f76492de0f0a68fec421 GIT binary patch literal 21652 zcmYhCWmHsg*Y?j0GcXJ-DLH_2hX_av9n#&6pdcwFHFS3hNK1*7l;i-?NJt7ur!+_- zyx#Y7e|SHgTI;N{&iU_su50h#j?z$5z=Ko50RX^LQk2yK0MNf(5CFscw=r=mdkFwK z#!9kMI^H=4?Y=cnf9ld*7&{zEB-~zgIMY%p#XgZ&|0YY2n2-8KVaa$#IA_6NQf0wj zJ6yu66YXaCsMJJhwXm#N+N7%PL#pdFUE~MI*GCI==)O$FC?B{IA}%!1+dee3`0@9V z%jU~mg-bJz!2PA|Kf6nq>vZNM&c33G#FWMHG&DJveB0{rl3E6 z=$uRo9Aq#kuB;q8FtM3?w$YPRK{#4CtH*?*PPqd`Qj^sG;6@O_p%PN#U|F5#pz_yJ zyhkC0<3p|VG8NsGqnin0q2|=f*Ny?VF$t%~AA9=z+m6zXvYC%M6<8=~N)-}lXR+GB zI}_`aMf!mFI}__a@O*^?2i(>@syPgeI;LG=5q3m)v zET%&GZv!^+7Z$86{W86yy*(%x(LklkXT%|AV_~9H?$~@yUF+UseP= zmOn>Nlmo;LW=+CC>YUXR%aS56Nf6LiXA;han%tde_9xj=oLB$RLqgDkUv_|AK!AzH>d}MEPe+2!WTjAl`iHfkk&h>S zViq6DZ4ARD3xbpQvjp?IgEu*JEW4gU^EK!V$l5gVvMnA}BD)}Bm{V**NO1xMZn^XD3+ zU%m*Ew)^g-A~Tbb)vtC?@Mh86)hJQC{zm-nbBZy~*N=e9?OBulsOuh6)1T+ZG_}6V z_RrZY6bsa_baHv&VNvm8 z-&QG0-Y`prTDC!h?w!Aha5^h=g*!9LTb|b9-(fB%IG7^SA`M(oN08|eEM0zHL~yqa zaeP0L5HvcnU!5&N&N0amY?bJ`wSV_EHqbejXA277I`Q5VyUgVg3>1EF40p_!L%m%Z z)QWA$>M~LXrkMjR)^G@ z-|>Y}P(=K?_&(JTvQpY6X8*H8hjNniwn?lkxnmRvsH{1%^agY>+F1?I70zg&alYedN6X^Z0nPD=&eM|QRG74~=!PZVkUaFcUS9>grp7H+6J&F{ zgMsiq3JfA6vmnL<3}is|Pp0d^m@bjcgjk2$Wo@G$IZ$9|F3({;a&d4kXPt+{TsUjE z0<6JmoAXus*<(=_8QnpMk=^sD^7$&-*FT;BKyX2NzdmYV9&~JkIn$ULDc$1dM|1zQ zG`R8hte<5bn@~~j>cPAN5|$jI2^QZr6BbK*rDyM?s85OpTUum7F?WHK>*lQ?oFCEp5b5F(4ukX4F zM-HVdd9Yk9AGSI0Cb4mj4B0DNjPUie9(F9KJ!Prtgwxq7z-vFRmXI9Lz{A3NspPB4 zaTX{B{ad??`<&U64{VNax*U3+{9y??`LWL@c<4W&CM?wdLv*MSg2RsTbxY9Ji$tFE zUz6u2-76r3h5h_)l(<(Y8O4J%^3hnObd9^75v3)aJ<#a-kNI3d{17IWdQ$|&4odxwIz3>VA1$6vA*qFj4=qmABF_@70hj2Ln7ml@$1^dXN zA45-jcPO<1hoFVqnq=8+6s4GW1!LNrz`G+tsUJznEJN+zwO|*{R-^N3--(G~ZT1rSU_P|F1o-U&fAfogM_# znZFX$4%QcDe7k%MQ8<>EH^L}d@hZNVTA)S#f}5*B_uI&rh3M;z(v~q%=B<*V?Gi@s z+v`iZa=YSzvA^}zF&_3ajci%V+={(*r6uO%xD|hme|02<)x?8gPK7PRgS9C6eUlUCVI-fLO)8=v}{$Ei}+nFl%s~ey0m}LKt5fP0?}AmXzUlaSblOlvKWcuOh8@$PDIRzgh!JjQ z;T@M-N2+sXUlE^E5hFTa(I7515+)3ai2MSSI8veQ?xs6sr?q{m-ZvswOj@!z*whx4 zLSpbq7Gzm6cc}$F6qaee!R@9#)62>Ma9?RGS;mGl8o(0_TA#r>B0;vsG#1= zex?^1l4h2XNv@b7-lCEr=x?8u6aA#M>e}&iawVZqi=Xn=pfZwGq6B3oeR7w4R1Xnd zS3xAMd8jnB-%p1f|)W zoaYMUe8JjcJ^uQWe1%d?Lo!(1BRcT-PO?|0bR{d%MI>14=`9Vr;8G9?ocsh$3{#^C ze~EGyxtXLuIK)~7DFpOSJhN2n>C<__TA=Wq@grgH^Ia5woEJhe*aw;t5HwQK@C*GG z7h_isvxmvM`&dwI?ZB*>9ga7c&c{@q$yhqoN<`{6As%6n1BCERK3;M^jmg~glfz~w z!HgAgyIV+kK)uiI(MVA~hc71FdkhkBt_e?dSF(yMb5l&fB=3&Rdosf(qy`Ardw*JI zV?O$x^iB$mi++I75oqWF!L~W*F~W&<#N>HOrMn#lz$jP_>-qs!+zxdHv`&+5?6*dI zTNPajOEU+G`QVtuZY5`R7;@E#xP_qWfcKi=mO3ET@YL1Jc)nuJAD}ku>zc3Aq~Dv) z%l-5@EvZ^cl+qU#jH5wsrFB*mmfv+rRj*)CSSbEnJ3{3HQx8Ep(go6dlhl0I@Q@yH zkpcti2&6_0hk#N&9{`}9l*V6%Rq1DT4V&wNAUO1-C7ozdc)r9~nRDlpDwad@`kES> zA~=v=$7ugUWlv3?TsXN540AWo9$nKP+w-}}-1U}h9vwth{Q(t|Ann~Z2{k)Q?7bp8 zl~~dFvYfpbUyF0ruFcX*q?=+_=*n(^igYB$VFa{nY?CK6Vv&T6$4P&oMbW3Qd}1bG z-=kNqmX(jLOO#WZd_Jd{4YPc{18Xi4y0Z?v`_tSvcU!k&T69~Ys8DNqlyqB>zh~?; zAJM`&?%!|50f5uaDz~s~cpV3q8{eY>xO3eKUr!Cw2*1WK`&Ku*{u4@1Dr75t(ac&e zXL)s0LwQ{NQ31WJ)y$t)pwtVdk1rmC@>sL}IJ+H}fGs2sa85HBI4>M zD=MSOg5$EKw)sjaLl}Od6<*-1jR=afvRW=y6g?hq2~jvnDF{mtU_3tdh~E8C_^nD% zIO(t-K|vAwYG<9EK@icil1N}N&CJhE>K>&Z3*R=tCsbw0mkH7qiKzpEFy9)XSh-%3 zk1I5v8WWKG7W2`kM)v^sLMZFvSLmZ&kypr|73)cLL9xvs8OcfP`$P8!!qRu?$KTjH zcmtU!Bf+e=xVaP^47iX>uUl7Fe^N9l=lYXIjk?WKD~Wg4#^rDv}j}Xee&9$%td$ut8d;OnXa#CMExmV>E}kpT zUDa8Gqf0;a$v=F=CJzqEmO@B8I!f%Pm|!gcIQupj&$V_cA}6f{-eUJB{;*C6>!PQV zmx+3etEYWI-~_o1{~M$DfJ+Ed+vF?&{9xV%RmDl!{&&F|4M2LS`6PJmD?z>kzH`@S zxu^4621{6pg|5Ni6G=WO5Xz?9hEPcOD_>Tcs09?vNDZlz+~{Z1A+E}PFMxFJ^j*!n zC9beMtAG|l3AN~$UnHh<&HW*9s_T%JaZ-hvqvmcUr`y$Z^8Zc%3f2qhT>a=CkF{G zMwabngpqhUy+vK7Ds`k-#&{dn%IH3BdEKHo@cQvu6l!FCCiZd_fdPwxq9+W;i`EY< z27!4JElkED+-Fy?_b;D9SHc=JB0#pRLy5UtKigBj(nfBCB;H*Jya!@ocsl}II9x+I zn|+fZNC(o-KOuYHKzEms8O->uzytJ=D*&a=Wy^g9nSjLq)nUGx;JKqv^Qb$`H}m$F zxZ3{pW!%m5u!X4i_3^PC9hQ?7@n0`d~T${f($7N>!9Jwihj~^k}mmqnu zyqZYB@RWxHH-@K{$Em1b8@PWwzYg4wmbd~`QV2rR@7o!t(B~e)(@KM9)q49U45e|e zxi~aHI8RAYS0*l=xLHP>ih{)XpNuGvgPy!8{CtqI$dM2q7KMnqEUKuPu@K_1s1$^l z=+f&U*3zW@iqRMNPd=8HKXAAex1xQ$$Gg%nUh-8d2Dq_PE7; zsqlSGHNCdpCnIsPkEA)##IWt9i|n6YiEB8vZ@}Cu3IWrkI2IF&K2dvbKyT@7>C0bV z$Mkl7I@oKwJz(7YRXQ*x+CN=;#ECwqUHX@@x8_=)HQF>yzR-mt45RBej>{oO3Jrmu z7Mfn=^e+tx)#yT3h@G1GhT(DQis!XapDx-kmkrH#E8-F%F>^G4@1_5HTK>vh< zRv_d(l{QotD$tYO8RvPm?)6x)82O%wft5i5i1;%fzL#}na$T;*(VUv}#`+T+S&%sd zk^5X`y>iVWTHeunBvu7ZUzsyV{uUoasS4MblR&$W&oov zcMG%BNK*!J`?AWwH8U%Y{2Z^)%&G(7ywvl0lr=?L_woore0vDf8=KTeFcG+ot?1Qj zU8@IkJ#K|l?`1L=vnZ5fS}XnUk8-{2;XZT0#zFub=QjJRM_uAlTR16&HEwO?*zw*Z zM}aAfC`SL6FITLAeOkAUWD9vI`si*9>8hMBUm3rRmFubgW}V14Rgpb1*)MPm5pzgF zf;L{hs|f#RA%$5e68QZdF578}CV){T#+}Ib$EW>tzgX1}W@Jmwt*_!w7!&T!%V3XS z+8=^*nN;5XFlg)5_80jV1AhmeV$C+Qhpo}7oe<>Svhc=GgnV3H=E-u4r1RZZIH~#C zkXRnmcfkdGuqsRm2g68xt%w3v=PW=JpP|WRb~iep_b{8_NHC%d9N*O5a&|87mTNZJ zENkVObwGyF2ka?v_BZ374(7k$n1|lR< zBu!5lZrq1P4?!B|WisNwpZfzI(3KadVk;5=;$X0iglC)9JE{74i-Z&hPEFeL7GXzY z5!1f2OV|Gv^Bf&PQ^U3xFDADcI4%U6c=&Igb;u|DD)HS)IcPE{^P~ug{SVad&Nz3t^`piTrzS@cknjed0h=<$ zmZ&)=rB*2jWM18^3s2EY;2L`Ot(0F%-mvEfGocP?|CW7`-JBvw#U}XS?65Pqrm|9o z(ygFWv`c$3!J1urZvJK;PRDfh?U>Y-3pK5uzmZ5PbGJLziP1=bEKBAt2dMhq^7lua zZzoOS7H+fHAYq~Q*teJ?|Ofwer*(TjSR6|OnQE0a*uoXTigbl@-F3zq+?}(3PP9^*C*2J*X=BY^%SS- zD1RmL8Ga(e+@lKx zP+_Y!3q3qtl;M1-IdB8_hQDQRstt54GS{Di1|l$;(zNISpVh3CQ2qb_p;F>b(pv%D zAw^*X(QD1bmi1CyDR$pP@sL5f@!X4Cqb%lesB!r!g=R}&5|xFq;jdT$VG4thMMuqN z`A(-)Q9NFrl5^fy{5EYvX0@YjU|ueV%K|^8VMJ6*5Q!fUK*U_`fUGBhf8`B*J5$eN zL2##GESDX%Y(+gazQ%$8&(_N-{^C{P?L$*wMpaGWYn*DM#?N1y)~r{MM;OrkA>+;X z3T9KFy{rJ-XMz_^1^PB;wepA%^366$71No-yL9Oq%x3LVYOTsvb zR+!vWrsohLIdYsDwyMUz^F;~?dM0lOW}x{TN4~RyQ;ien-h1^GF%C%z^mUR8ntGlZk*VA_Sa8Hvikzk8qCR-v~3T7>a-T2BS7&mUL*p~!*tjKBzOKA!}P!)g-Uu6#le?VN_n`+P=tV^KEXaqiBD65ho zK}DEq)Im}ob7pwd(--908qP5;CD1eY2~vKQg&bkST$OEzrih2zUx7*j8&SVoqNQ)go3kG%u_bccp=Gbb{9`kr9;L-@0%}UPley1JJ;J-k6%12 zYY)UQ+&G;ruFgsvD{c6Iv}4Ffh+^es?&h&1qfYE$<*bj`UwxB$d2()kxk-`m<3*%% zbmKd4zh7+UyFK5eXJk+|@{S~dy8!{oaBUG&&3`QvV#ZnOhuQYL7*XOd5*eF6d9(rN zaSG>Kj@(YRrT{}-q4bw)Lx-dNdLT!Xfi>zke3C(St6c)3`+yy>@2k^o% za7uJvsMMGc4TuD}ZwfkYE(ZA40KehrD5vI%@ht?QykM{@D?mT%6aTf3(Ud81V{ITR zQM-v!xj?q?$2C|e0i#Su@Hs(+d$Dd7L6Wp`2CgYt5i0|fjUrU~ZtaOasVN+N3#=Vz z-2htfe8M9-1MD+-CaJP539irI{E3dwX$Pi?)i27)wRrOFKr^!Y0y-fY zRUGrV{=Gru4hz3OoEu>2dtdw~9Jn2SffYaUT_pL5x1CQ3u4*pOIxk}p2fDu<>>hOh zKZ<=+OKJ3BmyhbHqv+9Sb$jDbFN7@LNWWct$~D47EkVzoogOvBJCmMhS_(0hf%=u5<`+5C}j>3eRV0SlPh%!mz_;+*&N z_cB)K@8NUT0cn&2{0?{U(YW=y^b_yMN?trDT6RDnWR({~;5v1G$U~N-r_RJ%6DIqK z6OhV5yJQtKQxkGN9utx?0A7&EQ0C|R)V~%2NCr}b08l0gv2S!i_KVt_(NFA;4H7-K zDjL~Qmttp5d+n?mB*$keTugJsn}aiEmw&iWq*wt9jk1I;~;da@wxUaBsIi zqPX^`*F0M1H1-T40eKSOX>cr8s$$6xhy$Ob0!GZlcp>liznR!YmYz&16K7V!u{@mz z%aLmZ*%3;&ss-ME9q1HHL+q8t)a=~F?vo?eMl&w&pHmJF;jU{}K!(V5a7cLCOhT4FwtbW&J@n4V z7N`pEmkcMtsj2c)yf${HtKu^Br$+v3q*DA}Bh@-i7yux)g;@juB@0TgHrChdyc=#6 z!+g0@3!mWEN06!4U@>(G^=jd>b5aOCA}7S^xn0kxYFY25GqtnV1?+?|7_GG^bSZQ= zF);-dH08m)O0+0tGK+CmhkZj-eZ-#@^jET{WfF5tBfE_gzgoAV7rUPj4|xz9jn?f> ziBnOO*)ZWX-(br6_nH6to)%5Js8DPOXyd;>Fb}ATr+3uje}EA(>E(ZMEb~7t_Yz9} znCE@8Kp}ZMdN<2LM~P1>;hprH%}h!yM}Da+Q8vYrG&+{EWBuwtc&(>*4KXcFQ6dF0 zV-aTYeuxOD)^tEl_fwF_1)2MFjzw&z7e2{G46m8WPU~;_f9EiVQ+@R`Sh{uSycxE5 zqb=McKus5CT=Y}R6@t>|UcQJk-;D{HQtOh<+=d1ml1qmAm{ppDz+BY)V=-^@5iD@$ zZ&ls%-#PYj$sZfGt?!H>S2T1B3ry~#a@WK!13=nuO1=@d?fW}kMCl7sl7fGX#B=4f zyNG@p>zEWfS!%LXmpC8AWEwXmg2ji0uI>d*Nyz9c>(>C`yaNt!i?d)_0#Oo!jW7MA zs2&?p8HwdwFl%%@xTen{m)zx%KH#KT+w>~#pXxCuhe!+6)ciX|Z^fIAf0xgTwFIsy zQwMSKo8y(q$h(n-v+FiwH&LZVg`qU}P8`00Qk&$b?%=FN)W(UYpj1$vX-4Pij&eBP zh|7q@QapG?R-`CD)XL!!H0<*04Z{>fQSRhG#_(8`-oDD2$mS&t9qMx8bC%F0aqiNK zmE85Nqc!o1$N#s;dPXJvt1Y>jQy#AtjS((+-xD7_?C*7<-8`u0qX)A^x80QLr>M=T zI=`00p24}8dG+#Nrc_f%;ZX!_mT_G-Eli2gF#h)*l`-)JgSNeKN?W1jW>gWJF zY}f^q+{-ahoHtz%8HfWOWdEEl~?g1U@@=D@25b3B3mDW^|cfP4=N*KdG%pCmgstuZp zeNeGx#8VtqbFcfUs!tN342M$Gi$We#`1N*CSx~*8yOkq|zk((FRB#<$wAYcxyEV0A zLNHwYRrd!?{`9l0$K9=&d=+$g*Nx@xYm@p*hys%Rv#wd;?-FTILGNVVH3MddBa?ev z)C#=ITMT^}FqZdiViiVNaEcPdA)1d*AV@yo_q?j8_QuOe>HDe+vWE2pL5X_y;}6w? zyRIJHuJsL6*~X4U%6kv*;QcEEMTN;x2i)!#%}fu)V~htQ!*+tG24@Ym7imrkK2E+w zghJh|BlU^&2!lk7GgQVBU9OlyA{Rb zwSQewgKO{#gEPR2KRnXyVgb8YIb1|LqTqGW1|fjv&r<3i(&(%}u`)a}==}MP(|s;L z^F^q+?c3@0XDWj}7fg#Zm2nB<(gAS7!_UfcSniAU`Zzx+y08dih++6D7J*@%R0k5M zhBb&m7!p6WjQl5iRxVT6l78L2gu@&b%?owEmgX(b>bz5;x3xfqb^=cy_>Y0K95%p) ztQ{EGdk#99C{n2YPn~_V##U~OS**WCj~Z!wa7L?7$9HyHr*cY2Fz%vdo>bLTOMo1# zCPFnMjTGipVC>rug*A(=NkRl4!w$Az>Qm?9B{Jh^a96Y(@S%AzN_J&+*)fu6kMZqW z4N&-z-N`{r!EyqnIO($YU-~p5kC;kT7&j=A1$85&EhA6TC$f19SC!?7gI1<2zZKPO z1twq-M;Au&Sbna^91Btpyf8Fy(9c21N~B%yxa?#cdd?gCWkHZe8Hnq{`zYE@NfR1r z;v6Hc@3XCt7;Uz9@+!9TCgebD`RH-iZbZ^2Arf#D7>f6P(HJ47sTC3_+NhkAYQf$f z{^M!rBm;ha6#&!u0?@kXE;2@2fRNT?=!*lF9_rEphN<5nkqC24)qlv0{-`di&tn#8 z6A)qx<2a>a32WS%>&eEE7GYHAXF;(mWyB_ifq92wd8+M?lFCcY|L-@rextXs?@Dja zVRwO;+Gxes&{R&tGW#sw4Ct-_^O9Ca7<1h97p-YHIomb-vOl9x)K3k7?QhSqd>uno z{efbQn&^sTc|#!12&7Yjnr~z$fpGez)^XDP-utUH@D?7SQ26v+YNXtk+s^lioFhJ# z8BS6a$EDpFP`a07LIQYDLM_+lI10{@pB!xn2ZqVNx;3nb;#jn-gK%SmxyrLL`)X8f zZf@jtnZOVg!}s#dk9?2_*1JO7YN|HM2tObKysAy?Czp@gkqOcxI3hx#Eq2VED``;` zYgaqK`|nNZc=liZcv&)w-HfXeKKpyuL5l_gFN`}Vdo&vXB-;1>fHFY3d3}gTs3<0{{ zT-N@jM&zxm&Zk$6)}Y{TpL32(BpWGjJHkuiUf3jUt2HqKJ%u9S4zQ4dUfwUCawI|Q z(VWJ8L4WR1w^#*6uAiy^N5ja{b!xb=(b)un1yRg7sq|x^xqi?-cH<_7y#Tv(j(_UQ zS!Jn|cjM~iz})$ApmzPBUWQ*yVcatsZvLC$^KO`U>Jg$wj3Q<2kuRH7#N+xf znd=~za_E=k&czm1)U>!owLk%9a|7l~mXSDsG#J)dTvC~Xq$YkwxW8fj>8r)cWC)Oo z5sA-L52{s^Bcyrmcxc4JttF&2KdDyPV)5_xREt+Wz3QtD#1Kpu8b*n(a5=vteH%mM z5hAq+!{xXYd%IU=l2+!EARDScE2^yRw~;|{=0}0TMpe{Q&+R0;&zo=ND!|Q= zCO{bX+Nl25Q+_hjJBF-n%K;J+E)yjkvevdxgNqyY-uXtQ(k3%1pkB+jv;QOGx4T*G z>zVY=@j0|q>W?5gGwv%I2c=7mk6|OY*034E;%*y?i}$a4Mx-(E7d6d9F`2s&U*ckg z+0Tx!Fkn4GFn67@*$1@mw)j@{V{L{V9gP|KwL#+&k-07(eJm|>=DKd4-L(1pJJ2UB~y9~CkbLw4V3zLsJVzEB2`F+-Z~~j zih%Xh6lHliDeyV{UR|BBp*S5*=K?l}ZQlR9fhCRhW3@r+f9)L!kf6%+A#6|$S+dWd zAvWBIzqA|IFWT(-IS;>0RC1-D+P%Qx*LEs|?F7h`oSaGQo#*3621g1!+d&$Cp z7U^~2HHadMWs6pw_-(I)ex)E4{-!84L@|{8ZO0`(Wk9>JqN6_W^#w`44l(k-xLq+K!jR1`-qLcrkbauMlh- zDxnGqYfw3|S?2@e(4K-gb|q#DGuYDQi5(wDy(<9(2`uJb2?yWU$_5qK`d#Xa#~0X6 zt;dl_#IHmt;3s!!t%@3l2~8W%{gBg20&nPVD_I?J0h2_lv(o{Zb2AZS|6npgxkH;$ zc)m-P9uOS9;)vl&yU6HuPa{W)0;eo8k)q0OG~6c2z|Huyb^l)CEQl}5S1Qo?eX`@` z#Ph0lf*Du0cY61jdyJl+Ow^pUEHQnLy^Z^yj=PG#`=eO!Kh#zmC5{~G!FQCT5e_4i zp#2eCbaIh)F(uL%mx{goNW3jrXXxBRDagt6o(dhH@~4WuUPVm05QCU(x3bj@Y$UT1 zn#eOxjEm=dy+l4JjUCM+{BXzfbRK(Sa_GH=db;+Nm-%^+SmaIqr>tTo>AJ1A@53JN z<)!)mz#(2oV`=gdAGvyRffK$_p8x!xo0_~gM6qc7g2{2D`LMyGOF%4 zS4{oW!E+ zcmFJ`vu>s_EYD-8H>JLu8)xNuDs8azOcM8vTa?byKvYgJGR_0kE%7hFGO*N!n zn)i6)h0~M&T>rNe)RSNowy~1ewh7%)m4C!^dD`sUBl51kF8A8#q2-t8Kv#DMN=3X9 zAXbPl1?An!zuTOk-?2A(K8%FUw(Yn$bV-A|#M@_0JjzYTS7g)eOv<{__GGgUhGKRPq333$@=D-dxA$TAuiDdvN~2z2p&pf^bT!+Z%C z!P)G=0%n11>*?noGa6qCG)yGoO25SBq}B!ApRF#2!3f#jsQpVIoZXW+ZH0snRN4UZ z-56P%30q)ANEzKNw9YJn5J-OXGG^m|L-rLHQT%ttCZfmQq(nmr)1(0LP$7%$^%oj8 zRAaIc8y#|G^RwYaNG8I0Ua~?0)dEgbrtqlXc?VU{{6`8jzO6*t{yE%eufD#x6RtYR za@sLOwIlt*4gdPCew1HOaq`_!)K#nlGJ4HSAUKKh0W=1vCHbTOj}O;I(HcVweyJ>b z@m`xV2^ylXRzac`NwFBm95G)0%;k4e`n(6O=M!Y1jL~{LH*$Xx!(8+lp{tb-eO2Vc zBqocU`Nj5ZqhJ&8)9mEWHSIXE>_Ec=>a;&fMzKlmR-_g?vSX8%W4WcOrF5opal0w zZ(Qt9&Ax5?5|7`TpQ&8oL$%99sA5UR{`mUsYK>M4ee>q$JzwV@OhxET{n(Hfo3LcX4nXHOG z;3imFmx^FeyFOsAzYfqm_^C?Qci{kU9Mo&|^C|tv`P;MKtFf4s()e*Ml;pLke3Or)pfIWjk~>?$Re%2yrBYKX;&dj;yOZOD5GW8ppC`tm?>3)^P9Y|M?v{!9|Y@r-%Ff8Z6Rjg2P(U< zqO33AX#d_~@PtD*VDGj!w0klVQW~6afAY)zA3+}-QqXlI=^Gsq6cn?$PrN>C<`+7$ zw5;-cKsgAU$9fM4JPV^YW&@-x2$@AWb_b2V5{EqsL8oGzlBAZRvNGA6bsJuRkWt8Z z67JOd$Ys_QjeL~p>Jw~mDSo=i=A7A8HT&9oZ;52VV*Yh0+>cy)kEf)Lr?cQEM8Q?D zUIuaUsd%Zz!fNDX$aa3hj1b39VV@z7gqhe#D#qWf3ZVPeQd5x{%uKuWR#xt*Q*9sn zpN3S$_cfGYS-qne>m>+N*7FAzj!_?$u~t^Cb24GlwYH1z$o@-Mn}PoPlWr3n|Ds7o z60{g-@X@}O_n&yhiPH7j_Xnuxg%qmZ)qIL#y%n-!zWT9%$AY*%2>V@^WB3arkCkc0 znl$?c0Jv-)lf-P-M)rb$Z@KF5+eJ?JYgkP>Zyj#g zPbE!_{13y-z15ED*Z1F+(`VH+ zK$bGv^b&sWOTMY@e}IQsgiN!ILBH^q+V^mEw0q&WME6{WG>q)6BWH(kSp0A2m=&KN z1ZtAFIIV8(K|NwyjDC9)dENB*hey}d*tkSX$935go1HzkG!*jmbtR3R-nd3&9Ts5P zz#U%YZ8nk_-leOnID6H5lxiv}dM&|B*rBcSwK&S|NcG<@X$Ir?5@v7n>f-h7Zlwt3 zBfnlt-QMlP97~f=ScIv=X#S3UCWV2~Yd`n*>oO?`E4evOY)4+TIkOTESTWm3D5_jW zS`cXi>`9urNKV$&7EYkL0FZUA+F4`sV?h3%Z)+0dH7O>HtHQ1JDjZ5G>Yjs1L9OVkI1XyFj98!ZWVrjc&@weP1;wocZ3zh^|Dpa&xZj<3KKw7_ zg@kxmGi0=m-%S=TwJgvYxr^}Z-fX{Wh6fE8~X<8Tv z3JF2WaiTtnDHxL*4#Qg2Zgs!m`QO* zpneN(^^=yaN;-oZ>I>G`D`I9&ABEQ(OwevFaurN)?p z9MKp@{t`QFVJ(dDUA^_JvfJ!(nL2KWy+p4|Del(TC3ub-Ow|7yYHO`yVR)bj9VZzey;+ zo)Qp6YR^E!M_IGaD%gpVIWBgiyy`TKezWMZ-U?Bw+FR7u}&+9&EDtDsBnH#nI)Z<)yC3wU`m ze^Y-I!W!+Bc)by~&LWxi_)GUR2clRE)pI83`DMAJ^GM<&yKIsox{BPwBK19Wd2_{} zx~y`Ho7HYa&K@=E)A zBmroCY#~4uSz^~N{E-0U1YYJ}f=rwttE*YqG$cS$!uEFZcC|4eC0Mv6#5LA1w({?A zsQd2~Fyx18G!gXM;a!#2Us~}Cid$|pf$0B?tC2QJHUHlT#)W@GNr}bug+pxPwz=#s z)5R;}`m?$pQC@MGe#JH~sqFOuEYxV2Sgl6F0CW9IY!GtyJFWzZcMO}~_Ap{^k!Yl_ z@XejIV@u0H2)=_>IcqMoCOlaUS!gR{If8}QZ(Zc}xt{{^la>v9sbCNcZl>Zx$cB8d z_TBy6o%!2d>>cw2b`R1GCtUzb7}=#mSdXeEY_aC?Md{a;_CdX?oaUynta~^tykV|8NEV|o%R3l7yl20Q6}^X znM$%xhNTp&uTi`7m^wB5ZwpqHCv|!CxdsBuK_zjpe_%(f3(V`bF}%2@xXc**Qp|;H zW*STc0XQ@*C)8@2*ilC`f3HpWZy+SkrV7d)RbVupnz;I2-49}!f9QE^q>1dvmny)2 zIQ;V+W7@=+S2^I{2<*CDz#;xH$Q>=iy{8uTPMi z!tALMHnJePH1E006Sd9xmA8~Usx&tTXLh^70LbOiF*nsx*Wysnu+*ap+CwX6F>f(8sT}Mn<9W?!; zLB=9IBlTzK==WQ32L)y*-56;cVJ^y~;OKD&PXQua_nKFSyo09Jwz+8QyipUwy1jP{ zjV_oqIzZ_chNmbgkcwNzeK)1bZYoX3FRfQ**r}7~tkcuRjR-fB=#>ZZ69IBk0>;`Bntz7+6A<`Buq5}#8w#K4wRM(8s0?(Sm^P<}uF!9kHZdsy9i zNORzfp9GK{d2)DNSRfrFGvfX?!uNjyv-X6+34-{t zXt0z6P-x!xh4t!Kzi_KG>n|O8HpW>@!GQ5av!_yC4<^EN+HqTT z9%4+2HcnV(470h++5a4Rv0-yX?&Mc0>dE1OB`tA=>wXvW{HRamC2#$PNC;-m zi}*md?a~y7Jh~I2fVEwG3yT`Lx0nsoL?Mvr^&rEqynq^og70 zW53>fSNPYIOA3we3K+}J*!v@p zx!b?Q?H!k0pM zjPBu!D4Kaafr3eJjbqA0Jf?g^YFCn}rWX7h+=(eJH2oMidS|#c>%cD+Mg~lCq6o28 zw61q%A-fc#Sk{!|WG_{K@N~ZV939~NHFDY==m=DQOQ{P~G3w_5|9}yCyj2ZtAVwHc z1k|Ta_8!o4f5CIy#~`$SYl+e6X?RJ^G!pik$L^QN58M1tDJFJwfJ;N3_{jNQEpFGd z@vw@7PfPu?@0XM}S@b*{wD%)I&vz!QS^g(SsnkJQFHq)FKUP{}lYhIO6J_^k&#C>I zY#SHYQ$xr6{<46dwk(E^q{$f?qJk07rc1<=iyPd)@2olLN^a0GZT4|u$GW+G7tIv) zVeA;1SWXroa4*Mv@jG3R-q9z1`#Qkn!n9i0s=M_M2E+-s!JV}}m1oulBu#xD{twY4 zMDZmcIEg5~rIOe1vQqBG!}C~m&`-^f2DgjlJ*FZc;vODVB!}-K*t72^VfNj$`oxRL zjT+3I*5)I&ES zF%3&aTxAI7g93hsTlxUJ0;wwifM8*I;qQ@zR{y6F#^!&WdUHRf z09brAB1LR*6L0nU{%LCp0Og3Uwcg!y;&m0xt;$eL&Nhve*;oOjZeZIiK+g>HxCksf z{`GA@W3`|9K0v&GF2nFHjs*z+UvJwKeH=iK9@iLKuL#sz=sk9c6o3C9gl}KQ{cTwR z=%QXgn9BsLn=4SALsfkMVe7W@1+@0tXp5u?_qaSH&1@x*>atpIBbD2y^mdhdtLCJv zIsupK_oae#)-ln84=pAeKHq=4oolNKfIt}02n7|1Y^VYZZa5N`kykz|5L$mhz7R={ z0u!A8P)OuOg>0%#=1QUNyNwhDB>AW@UFqyY&BLlb2IM17`TX8iA} z6Hp-_SOZLS3a8Xi5DdmdC&;xxp#|!RIic^S6ht`3m_{&(RN)bgE@YnHhOH=oaML&V z7=Pp8zg7l9ED;JKoXP}$>x(~*Gnqscgh24ir@sLqLEYuy;{+`5ERaz=)$)MH_`!$% zGH#h0>3RYYl33w8*1#IP`DM2-%LRs-x>yu=?8Y!!Q=rGiU|`c09ux5RLx)kGUsaJA z##g@lAy|&DWz7UU{^+=IyaF&vxT`1lUvB>tPW3F>KXWbcOK0!HT#Lr)zJUz9!8am{ zns@;};4%Kj!#{vS9!Cn|02T%}_;_*5HgG8xKrCI@!a_(_%&7XYAs|9DMK!`};e>TT zx?aj<3<~cBwoGtLNd=G@&jiO0Ai7R0H7+!jKO$lkhLg)%y2{j_<|l*eE;(K z{7tSt*P>zpL?}86p}?yupgMgW(+Fc~Dga>pCBiqsRuzE4o9Y@-0KqTNg*Fo^yhIz# zwGMR#H-CoS2e3PIEk2sEzI?vELPX1QGjRnFD_OSq-U}Z+j?vTElcCA6kMxdT>i_!2_OagH3Mt8oB<2Fx|b3+^^@EfPf)35Pf=x7T91 z6)04^m$~GWV+vqAu)Py-i^w`?z){B0m77J$(|;roYQ~W$07t+J@I>3#$r1FTjP}jjbvGON^HcUW{1I zZV=KRedLFti-K5KoXHvfr|14rl!pbpmj9Kr_eV8wILBx5&%w}YzBSQ1ZP^0oPT4)6vFGd?3cvuYAY!mK%PIqakRaDQsQ?6m6Fr5|$gvRQl*1v1 zQxlC<&EmftlNj-rFA#3a^W83e(jU`%bi48v8pxRHpZP)1I0DAPe#@M+9(1mL1?>5j^ z9J<=*8r?TVJI}xW*tr5|6Fwg&;ERLCW=(A-T4)Ihq>ivX%mGsgOR-$=)%|+xE4&ZL zckx)FjfGtZYTFbvt|&a&7fa$<^8BkcF{{{@0cPh4z?SO=G(Dug80aA#0E|X97T~G8 zdpL>K0`LON<*EZNa;&e{ekNxSa*cBYCSsyf43J)>*ix)y^b-5B!0CgEu7t5%i|BTO zuS$I?r%@V@L73{SbU`KRMgaax0E6?~xj#uveEo$AE%52tXA&RK7i9R!=l@qsbQ1OA z77+a5?CB(p0{{cgBG)E32!=Gkw;g^HhLknx2?!KJ%JA(+-;5z;5e4G8=9gxVwbF<^ z(kM{ibHy_&YeEDt2s6#`o_oK5na&$Lz5)C8(|?bd&da*}&7L-wJbLXgfIKn$(#Ej_ zPca_Q7=QEOzh3hEveLtXfWKn+GFY<7KEB}qF$3_A0Zg#!&r|rp{S?68Bcj_urt2rz zdCzQn0Tvbqd{7Es^Eg&2^{dy@RRm%6EO1N#coXh4(gA`3D9BeFl5&(-RRH0qfJCMc z^*ZuB&WG@Zo4v&I^b?(x3ZQO5dIfMQXRQjr_rGS&YS`C+B6a(Nf;TwigMv_Z=`R!RXBl}zuHqX+2bfty51zjZy@#qtk86x|Er8g3VlRfru1LbPe)i}Z6}o7gbbEW0S^X(uSAH(kGgQ|jc6hL17uCC$j|2Dv4 z^@7y1o_m@>@Lt$@Jpq4GhJnQ~A0bn_Qm`Rt=UfYnXo!Mbqo6}Lf35}MBZc2K*ExVD zA02{>?&%5U7$oBeUXa_-Ovdmu10JmWUA;PiV9BCM-Yj8S;}B@$oO0{7mhU&l!wUo_a)KhFz!{7gW|(Q7qycly7h7T=5Jo(V_6sS$-!UCU^7(ya$%sY^ zN3p@`H}v;#AvQu=AcSBkpVf{KK3bgPtf2M&RCNsCn*a>4ssOwa1P%fGJpc!2Du`hB z9pl_ez^^Q%+FTjcw<_++z4GI%jsOJ0M5p*ycYn^W-%hJk4udh18QyjG-(XhD2M_Q9 zSpT%EkC%~+wg(09mhl^rA!{fAfx?o(TgGoHgPiKe3k)n?H+(gWHtQLLXL!lrMahwl zKscnMb8BD$aH=OsQ(7SS{QTKOu#TtcJ~8|KGTpmwq50AEgVPU}RdbqCxLk95aPpC4 zK0cre1rxhIfU=lJ{N9H-?%JBB=5c?JT(sl%8?_;WYD4PzQLlvq&EH~Bc(H;JfB z^*y&55CFH)WRq%C3 z%;VJi0idhIf>nrXy3cKd$%Upxz6d=U1$9xFDGN-+b1;{qk@u_PA-U%41r4X(i?vW$& z=kV;CPtlhDjkYIFAy5cux`&p%H&p!Hk@?T?vXx>10tMCPBWT4sy`v~^q)r1mc<U>Ic#H6u^C#c$E6M2U7n>53&uKAQq%F_Y$K82+B> z3>Hl)%YR|UshmY?A%thRCnv26KoZWYb)Zn3%4w?tIF-{@7GSE=Mxso$Jp^*4Sb(k} z&L~Ux7SVR%sHfLKFw_i2SPj)fya-UA4y>Xj!|wakB_hb!DdGyilx;bHqOv{w%a!e| z7fC`@2|njPwx7V)0r(~W8CJhRpbawse*$qW7SK${zd)SH1gpl&5>6a_B>(u0LR_Qv ztYM=QH#PtF-GB4ixfF(Jb%`1xXpX}C_T(e45^+9WDFP*K?KOtlh9D{<73230)T0xd z*mUITGUMab9Q=_0l{97Q{uQo;#smOTiSM8wCga|G_{KlT*gCCoouWbmvhKT%zWtM9 z8aW3?tA_)YjlMB^{awQ*@(})>4|v>qe;0sRWLuTT|9|1>yn0#U(EdwUQuQ&+V|4%m z*0lg)2w(LS?FwLub_LMAM)(G3{eTR5SZ~doxW;`MHhLkJu3wObVs4LB=q(Q$q_ILuSu_}CuJ zu=#7+1hGJpsscDE|E(*4YAjCO`d;qTBK*MmK7h8iFc*m_fMEW&&BS-cL=;j`E(MD= zJBNs>gOGSpr}{|e&BSi`*i-=alzLhlTXzJOWgkUrvwcw#C^<;$H!h@L%XXIvAlCnb z0th~U@ONFt!oO?H_haZ;fIUa=Nx$}p@%+`cjnKyd^yqPoaTyjs7iYQaAuct`RzMX5 zQ9!76pS}@9P=RV{g-Wz+Uk}%P4v=z!sDemE38K{WFX>_$>OD2-Z@hC$HFoWo>}w<87=qcL!2*zyI0NDgnN1P>==5<)+L5sE zFFwfN^a8&M_%*)UPtZ)23=qypF(759bsqqMG}PrJLhKt8Y2ed$`Ick-Kg{_9_gIhh z2Uc@*F7)E}1BIt36stWwH~|&QRK=76ICn|$jlm#sAO~rBh<)~l0q_CCp3~++|V*vpF z#&UT13M@dZeIv9gfO2hswu=<-JY}02|BoH_urm|a!XhuuqFQuxe4zO~rGc?_IyohW zNJ{8IhRJ8oh8RUoFa`JsR)DWlV5o)4s;H6@!9wM$ps?Uox`q_028M;66ork)Bq|Z< zdoxI?rAnE28w-)V(pG5SEXTgVVYS6ZNq^ zIsc|Aij|l>2aqKuU{+xMt8#)O^^W!NZ02)bYqxhc!(ld3_eP?q7e$g|8_r6bF_Ra4cKJubx z?h$xKMphRVP^b{BfG1#BstJ*jC;%%$IWbftb73Vgl!W3Vs1gx@NC}zS7X!JF&5%ANQ z@Yt%;j2TWV!xRye2$rCJ?TMNltg1@N22fH3QB+Wsya31S>#}`Q151^>KO}w)f>P|} z%I{84G73?mRTI3tF(o1^yl~q2HiC+%Ap;rl)7fjj<~1@M&e*)@nT7)RR7Ck)C7gF; zUl&_f0NZ|mUE|58-r4AY^T9p3Iml%)8jBya;!Hw8CtVK6^#ypOBizqXA&4xmSmYm8n2^yqPo(JO!+J+3i& f1<<3%HOBuBx*c79Hr2Bv00000NkvXXu0mjfL!2pK literal 0 HcmV?d00001 diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..606c663 --- /dev/null +++ b/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/middleware.js b/middleware.js new file mode 100644 index 0000000..2cf5a2e --- /dev/null +++ b/middleware.js @@ -0,0 +1,57 @@ +'use strict'; + +const { SUPPORT_EMAIL } = require('./lib/constants'); + +const addBearerToken = (request, z, bundle) => { + const token = bundle.authData && bundle.authData.api_key; + if (token) { + request.headers = request.headers || {}; + request.headers.Authorization = `Bearer ${token}`; + } + return request; +}; + +const messageFrom = (response) => { + const data = response.data; + const status = data && typeof data === 'object' ? data.status : undefined; + if (status && typeof status === 'object' && status.message) return String(status.message); + if (status && typeof status === 'object' && status.text) return String(status.text); + return undefined; +}; + +const handleErrors = (response, z) => { + if (response.request && response.request.skipThrowForStatus) return response; + const code = response.status; + if (code < 400) return response; + + const detail = messageFrom(response); + if (code === 401) { + throw new z.errors.ExpiredAuthError( + 'The BatchData API token was rejected. Reconnect BatchData with a valid token.', + ); + } + if (code === 403) { + throw new z.errors.Error( + `${detail || 'Access denied.'} This token may not have access to this endpoint. Contact ${SUPPORT_EMAIL} for help.`, + 'Forbidden', + 403, + ); + } + if (code === 429) { + throw new z.errors.ThrottledError('BatchData rate limit reached. The task will be retried.'); + } + if (code === 400 || code === 422) { + throw new z.errors.Error(detail || 'BatchData rejected the request. Check the input fields.', 'InvalidInput', code); + } + if (code >= 500) { + // Let Zapier surface a retryable server error without exposing internals. + throw new z.errors.Error( + `BatchData had a temporary problem (HTTP ${code}). Try again, or contact ${SUPPORT_EMAIL} if it continues.`, + 'ServerError', + code, + ); + } + throw new z.errors.Error(detail || `BatchData returned HTTP ${code}.`, 'ApiError', code); +}; + +module.exports = { addBearerToken, handleErrors }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..26a7031 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12066 @@ +{ + "name": "batchdata", + "version": "0.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "batchdata", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "zapier-platform-core": "19.2.1" + }, + "devDependencies": { + "nock": "^13.5.0", + "zapier-platform-cli": "19.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.11" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.29.7.tgz", + "integrity": "sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.29.7.tgz", + "integrity": "sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-flow": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.9.tgz", + "integrity": "sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.29.7.tgz", + "integrity": "sha512-KYIRV0BuaN68CDdsqFkAD7MU7yipUqQNuNElwATdxaIdpTjhvtY82QvkBJs7zV3Evxj2jFAAZ1iO8nyy0nhjqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-flow-strip-types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.29.7.tgz", + "integrity": "sha512-AMGJoWuES861riy6pcB0fphE1YXybtQnBYQMuIyPv6mKLiosfa79BKTnAOyx215c/3RJPJpdQwoHZ3earVH7AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.11", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/arborist": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", + "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.6", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", + "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", + "dev": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", + "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", + "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@oclif/core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.2.tgz", + "integrity": "sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.14", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.34", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.34.tgz", + "integrity": "sha512-KhbPcNjitAU7jUojMXJ3l7duWVub0L0pEr3r3bLrpJBNuIJhoIJ7p56Ropcb7OMH2xcaz5B8HGq56cTOe1FHEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.1", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.2.32", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.32.tgz", + "integrity": "sha512-LrmMdo9EMJciOvF8UurdoTcTMymv5npKtxMAyonZvhSvGR8YwCKnuHIh00+SO2mNtGOYam7f4xHnUmj2qmanyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.62", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.62.tgz", + "integrity": "sha512-hwUdpeExF4ZhIf0mTeegnznpfSICOr4tnk8VZ6POmEcvNEhK8OtU/zbfCQbiGNa0Zjp1oMncD1Oxh585GHUSog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.7.1", + "@oclif/core": "^4.5.2", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-version": { + "version": "2.2.32", + "resolved": "https://registry.npmjs.org/@oclif/plugin-version/-/plugin-version-2.2.32.tgz", + "integrity": "sha512-KwsEKjb202nthRIwigyvRNQ5vK8mUr/FnPzBjkLX7SbgPMLM7iqoaWDPZqBvq5/A/226Ey4vCf64y3zJh4eaWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.17.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.4.tgz", + "integrity": "sha512-EtMX6XjRWSastG2SdkmSQByPtJ9dx/NIjnHbpQPCYt62j4RmSx5rgLTGpw0YCjF5h191gZOmBfheOT23cRSFdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", + "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.3" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/inquirer": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.10.tgz", + "integrity": "sha512-vFW2WbXwO9eZpRT5GJGFJ/shgyMNnYozmnjakt9jCQSS1lvqX8pZEQMjJ9RdDPct/YxwciQ8+V8OYn9euIrZDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.27", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.27.tgz", + "integrity": "sha512-VenMRv/eKNrspX9v3H4dbmjsrnCOYdYBG3kxXKk3dG6X+urBGcj2Prww3xw1U5K4FV/mE4h5GbWd0szEKf+9ew==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.6.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.6.tgz", + "integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@yeoman/adapter": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@yeoman/adapter/-/adapter-1.6.0.tgz", + "integrity": "sha512-oJw/i6zUDdfsT5VOPuANDDEWs5NhlMq5+rmyZIVdgBTXalbCw6nUfJQOblO2Fnq+Ov6CxlyzDBTWQvL5cEjA+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/inquirer": "^9.0.3", + "chalk": "^5.2.0", + "inquirer": "^9.2.2", + "log-symbols": "^7.0.0", + "ora": "^8.1.0", + "p-queue": "^8.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@yeoman/adapter/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@yeoman/adapter/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@yeoman/adapter/node_modules/inquirer": { + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/external-editor": "^1.0.2", + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@yeoman/adapter/node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@yeoman/adapter/node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@yeoman/adapter/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/ora/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@yeoman/adapter/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yeoman/adapter/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@yeoman/adapter/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/@yeoman/adapter/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@yeoman/conflicter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@yeoman/conflicter/-/conflicter-2.4.0.tgz", + "integrity": "sha512-5qzY5+i16TSrcJsYshW3eKzflfYMMmVgC8gRtLCe4UxLO4u/dxpb8sN9HqQkpNVjuZV5ouIeOohSq9PSJDXC1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yeoman/transform": "^1.2.0", + "binary-extensions": "^2.3.0", + "cli-table": "^0.3.11", + "dateformat": "^5.0.3", + "diff": "^7.0.0", + "isbinaryfile": "^5.0.2", + "mem-fs-editor": "^11.1.2", + "minimatch": "^9.0.5", + "p-transform": "^4.1.6", + "pretty-bytes": "^6.1.1", + "slash": "^5.1.0", + "textextensions": "^6.11.0" + }, + "acceptDependencies": { + "@yeoman/transform": "^2.0.0", + "minimatch": "^10.0.1", + "p-transform": "^5.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=18.12.0", + "@yeoman/types": "^1.0.0", + "mem-fs": "^4.0.0" + } + }, + "node_modules/@yeoman/namespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@yeoman/namespace/-/namespace-1.0.1.tgz", + "integrity": "sha512-XGdYL0HCoPvrzW7T8bxD6RbCY/B8uvR2jpOzJc/yEwTueKHwoVhjSLjVXkokQAO0LNl8nQFLVZ1aKfr2eFWZeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.13.0 || >=18.12.0" + } + }, + "node_modules/@yeoman/transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@yeoman/transform/-/transform-1.2.0.tgz", + "integrity": "sha512-evb/+2XMEBoHr4BxBeFkjeVTgTS4Qe7VH8DmzZ9kgJK7C7ACPAhW/qBdsKKP1sb5MoeITSaJSVFnc8S1fjZmcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^16.18.28", + "minimatch": "^9.0.0", + "readable-stream": "^4.3.0" + }, + "engines": { + "node": "^16.13.0 || >=18.12.0" + } + }, + "node_modules/@yeoman/transform/node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@yeoman/types": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.13.1.tgz", + "integrity": "sha512-HNwITXGjzxct9j3cvyHvCKUA/isuvtLHHGtEH5Com1vFOqYMTZZ16Skk+UM7GJDKqhTEJaIhF/xY7O2/ByQ/sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1 || ^6.0.0" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + } + } + }, + "node_modules/@zapier/secret-scrubber": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@zapier/secret-scrubber/-/secret-scrubber-1.1.6.tgz", + "integrity": "sha512-ETblIxh6lnkVHjVqQ8XVB2Ymeo7RudR7kIiZylXtYXAfpmGLXIzbk1h9fjF/SuO21k7jdxaMBaBdqUCBHv8+og==", + "license": "ISC", + "dependencies": { + "create-hash": "1.2.0", + "lodash.isplainobject": "4.0.6" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.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/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz", + "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atomically": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.1.tgz", + "integrity": "sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-fs": "^2.0.0", + "when-exit": "^2.1.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz", + "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.4.tgz", + "integrity": "sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.28.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-path": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz", + "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bare-stream": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.5.tgz", + "integrity": "sha512-iM9qJCruvpt2rPaLsrumVDru9pogI7PHziHIa9kTNRFt8C8HuSa+kI9kFezK+NvHEFnnz71rKGZ1EAilq/3V/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/baseline-browser-mapping": { + "version": "2.11.34", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.34.tgz", + "integrity": "sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bin-links": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", + "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.29.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.5.tgz", + "integrity": "sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.33", + "caniuse-lite": "^1.0.30001819", + "electron-to-chromium": "^1.5.464", + "node-releases": "^2.0.60", + "update-browserslist-db": "^1.3.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrono-node": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/chrono-node/-/chrono-node-2.8.3.tgz", + "integrity": "sha512-YukiXak31pshonVWaeJ9cZ4xxWIlbsyn5qYUkG5pQ+usZ6l22ASXDIk0kHUQkIBNOCLRevFkHJjnGKXwZNtyZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dayjs": "^1.10.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true, + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/configstore": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", + "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "atomically": "^2.0.3", + "dot-prop": "^9.0.0", + "graceful-fs": "^4.2.11", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "deprecated": "Active development of CryptoJS has been discontinued. This library is no longer maintained.", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dateformat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.5.tgz", + "integrity": "sha512-Co60BtcjsM5XBBbzKHdjH86rz9JCGOib8K1Vw22JQxuPhlWXI6vczIuHJo0SZEAJx27oXnd7lZR64KqyQs0GNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "dev": true, + "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/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", + "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==", + "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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.467.tgz", + "integrity": "sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==", + "dev": true, + "license": "ISC" + }, + "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/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.14.tgz", + "integrity": "sha512-pqH+jIxIhwX5U4w+Tnu3jjowTo5QTACbqef2C5Cw2RhApr7COQqgnai53u8VbtqjWRcSoAcTf7uZ62dO5kC8Iw==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "0.7.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "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==", + "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/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "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/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fernet": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/fernet/-/fernet-0.3.3.tgz", + "integrity": "sha512-DvvqouVhv3VCor83wkQbSycekYUKDRQ1IKqcInaF5n5BSKgWBVfYLbSf7RRxojwQO0DZySiz5MlM2vO4MG3SUg==", + "license": "MIT", + "dependencies": { + "crypto-js": "~4.2.0", + "urlsafe-base64": "1.0.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flow-estree": { + "version": "0.337.0", + "resolved": "https://registry.npmjs.org/flow-estree/-/flow-estree-0.337.0.tgz", + "integrity": "sha512-8u9x/Ur45zWAdlD8SKHq3MnMttR6MB0x2xna3mNlwfs8BSJ0rCH/1Cyrfvq7eSq61ppshRHZbmQhOp870WmAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/flow-parser": { + "version": "0.337.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.337.0.tgz", + "integrity": "sha512-jGsqT5qJ6J/7gD870pKgL7K8x8l6IzUvtBlRX+OdLP4EGrpDF+3sUqF8HpyR/YcAJs2mVMVhW2GZsxmtXc+aIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flow-estree": "0.337.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fly-import": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fly-import/-/fly-import-0.4.1.tgz", + "integrity": "sha512-9gqEx0nnQ6SF0pKKOEexVNYCTBiLb3g+a5JMLkiaBIqwM/pEZH0Le83owUA/tkRLxWNwIso+sB3E+epuOCPWlw==", + "dev": true, + "dependencies": { + "@npmcli/arborist": "^7.2.0", + "env-paths": "^3.0.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "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/form-data/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-username": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-9.0.0.tgz", + "integrity": "sha512-lY7+mymwQUEhRwWTLxieKkxcZkVNnUh8iAGnl30DMB1ZtYODHkMAckZk8Jx5dLQs1YKPYM2ibnzQu02aCLFcYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/rest": "^21.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "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/grouped-queue": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-2.1.0.tgz", + "integrity": "sha512-c5NDCWO0XiXuJAhOegMiNotkDmgORN+VNo3+YHMhWpoWG/u2+8im8byqsOe3/myI9YcC//plRdqGa2AE3Qsdjw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/gulp-filter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-7.0.0.tgz", + "integrity": "sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "multimatch": "^5.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0", + "to-absolute-glob": "^2.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-prettier/-/gulp-prettier-5.0.0.tgz", + "integrity": "sha512-2TbsdXnO/zMLYwD5In8w1CwMn0fw2HOfCnD55+D+0AUczqvP8vEgwS82tEIqj4EsWnOS9+kLPclsGYkkpxxtcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "plugin-error": "^2.0.0", + "prettier": "^3.0.0", + "through2": "^4.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/gulp-prettier/node_modules/plugin-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", + "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz", + "integrity": "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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/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/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "10.7.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz", + "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ci": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", + "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", + "dev": true, + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.1.tgz", + "integrity": "sha512-li88H4QGRoNMX27jEmY8nR515oJVspAgC/WFMlhHfFV8RJ4QyGpHhXnwAe9gH5RIgKmdYRUmrOhQobcgEjIdSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jscodeshift": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-17.4.0.tgz", + "integrity": "sha512-i3ESKiiTsGynxzTg5BhsZViD0ai72/6SsI1efDZxG6/5KCoElsmquxtyhXK5lpEgoO7MTNpYkjFEdEL97SkBNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/preset-flow": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@babel/register": "^7.24.6", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "neo-async": "^2.5.0", + "picocolors": "^1.0.1", + "picomatch": "^4.0.2", + "recast": "^0.23.11", + "tmp": "^0.2.3", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-metaschema": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-metaschema/-/json-metaschema-1.3.0.tgz", + "integrity": "sha512-FMDPEZQzqIVOQZ3OxzWryI28W6IZ9QKLcHObO9bS+SJrwnV3xQD0QtnhtgSpIZd8Xuy0xBqeRA74vfTnpK4eVg==", + "license": "Public Domain" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/latest-version": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.4.tgz", + "integrity": "sha512-zJZyBmQhArDRefuWTypZxwDpFDIYmrj8ypSBvwGD5P13Y95s6DjzKgu4DVdGbeQa5PDEsAOCAPNk4X+QOR006w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marked-terminal": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <16" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mem-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.5.tgz", + "integrity": "sha512-6aWRo1jLo82ngo44tPQXjzINN7gvSNWhMU96I+O5nsJWdPi5vbUJWMTDGZDb/AVpCJRpaLGcFgrIBIpyk0DuUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vinyl": "^3.0.1", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.12" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@types/vinyl": { + "optional": true + } + } + }, + "node_modules/mem-fs-editor": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-11.1.4.tgz", + "integrity": "sha512-Z4QX14Ev6eOVTuVSayS5rdiOua6C3gHcFw+n9Qc7WiaVTbC+H8b99c32MYGmbQN9UFHJeI/p3lf3LAxiIzwEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ejs": "^3.1.4", + "@types/node": ">=18", + "binaryextensions": "^6.11.0", + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.1.10", + "globby": "^14.0.2", + "isbinaryfile": "5.0.3", + "minimatch": "^9.0.3", + "multimatch": "^7.0.0", + "normalize-path": "^3.0.0", + "textextensions": "^6.11.0", + "vinyl": "^3.0.0" + }, + "acceptDependencies": { + "isbinaryfile": "^5.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "mem-fs": "^4.0.0" + } + }, + "node_modules/mem-fs-editor/node_modules/array-differ": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mem-fs-editor/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mem-fs-editor/node_modules/multimatch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nock": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", + "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "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-gyp": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", + "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", + "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-transform": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/p-transform/-/p-transform-4.1.6.tgz", + "integrity": "sha512-ub9xBaRuk5FhfyzJv9y4OF8i7/3wH0gRG4C3jUp2pFcoftzkopgr6H0BJNcvbJBGsr7KmHHNWN+DCRPfPBIlAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": ">=16.18.31", + "p-queue": "^7.3.0", + "readable-stream": "^4.3.0" + }, + "engines": { + "node": ">=16.13.0" + } + }, + "node_modules/p-transform/node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-transform/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ky": "^1.2.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parse-gitignore": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-0.5.1.tgz", + "integrity": "sha512-Ls8RQQrYC0HqaIugZ0lwKl+dcIeuaV+8iQwrsQFNHCEnodTXaEAM2+RxQFFv2xDaJ1gM4C05eY4u6KzIHvNayQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "is-glob": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.5.tgz", + "integrity": "sha512-TEHFzb5KRDKaOgJ4TYE+0jyJtFbjLvkdVOu0fZ2b6MTWzoqZd4Le+61aEppWkvTlYePgOX4ATL1wsAIPMLTw6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proggy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", + "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/read": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/read/-/read-4.1.0.tgz", + "integrity": "sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA==", + "dev": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^2.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/recast": { + "version": "0.23.21", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", + "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "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/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "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.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/simple-git": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", + "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "@simple-git/args-pathspec": "^1.0.3", + "@simple-git/argv-parser": "^1.1.0", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz", + "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.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/sort-keys": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.1.0.tgz", + "integrity": "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.24.tgz", + "integrity": "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^3.0.6" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/streamfilter/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/streamx": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/string-width-cjs": { + "name": "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/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/strip-ansi-cjs": { + "name": "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/strip-ansi-cjs/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/strip-ansi/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/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stubborn-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz", + "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-utils": "^1.0.1" + } + }, + "node_modules/stubborn-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz", + "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-hyperlinks/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/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.2.tgz", + "integrity": "sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.9.0", + "bare-fs": "^4.8.2", + "fast-fifo": "^1.3.2", + "streamx": "^2.28.1" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", + "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", + "dev": true, + "license": "MIT", + "dependencies": { + "gopd": "^1.2.0", + "typedarray.prototype.slice": "^1.0.5", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "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/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", + "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.6.tgz", + "integrity": "sha512-r+7YvGfM5TkTiDQ5EqWi/Z4L4KP3jUI+YCmTtWg1tmTHUw6xladLJqzR2heMaHBIM0TTFLZmn/EkIaEHYs/bIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "math-intrinsics": "^1.1.0", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-offset": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "dev": true, + "license": "ISC" + }, + "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/untildify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-5.0.0.tgz", + "integrity": "sha512-bOgQLUnd2G5rhzaTvh1VCI9Fo6bC5cLTpH17T5aFfamyXFYDbbdzN6IXdeoc3jBS7T9hNTmJtYUzJCJ2Xlc9gA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.3.1.tgz", + "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^8.0.1", + "chalk": "^5.3.0", + "configstore": "^7.0.0", + "is-in-ci": "^1.0.0", + "is-installed-globally": "^1.0.0", + "is-npm": "^6.0.0", + "latest-version": "^9.0.0", + "pupa": "^3.1.0", + "semver": "^7.6.3", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/urlsafe-base64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz", + "integrity": "sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "dev": true, + "license": "Artistic-2.0", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/vinyl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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==", + "license": "BSD-2-Clause" + }, + "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==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/when-exit": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz", + "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-package-manager": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/which-package-manager/-/which-package-manager-0.0.1.tgz", + "integrity": "sha512-a+bCExXd8OdYky5J59nimHxTCRPhxZSQtwKh3Ew6lpC4oY9f3KH77XDxcPrComVhSEPtvMjZigS2vZgZfgJuxA==", + "dev": true, + "dependencies": { + "execa": "^7.1.1", + "find-up": "^6.3.0", + "micromatch": "^4.0.5" + }, + "engines": { + "node": "^16.13.0 || >=18.12.0" + } + }, + "node_modules/which-package-manager/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/which-package-manager/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/which-package-manager/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which-package-manager/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/which-package-manager/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "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/wrap-ansi-cjs": { + "name": "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/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yauzl/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/yeoman-environment": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-4.4.3.tgz", + "integrity": "sha512-Irk6rymmb9vNZRhQlg8LUDeopnEot2VGlP4VayTNjayfQ3nFbiINTIjZqrtHrQdw29nTxYVOAsYy98jL1p27QQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@yeoman/adapter": "^1.4.0", + "@yeoman/conflicter": "^2.0.0-alpha.2", + "@yeoman/namespace": "^1.0.0", + "@yeoman/transform": "^1.2.0", + "@yeoman/types": "^1.1.1", + "arrify": "^3.0.0", + "chalk": "^5.3.0", + "commander": "^11.1.0", + "debug": "^4.3.4", + "execa": "^8.0.1", + "fly-import": "^0.4.0", + "globby": "^14.0.0", + "grouped-queue": "^2.0.0", + "locate-path": "^7.2.0", + "lodash-es": "^4.17.21", + "mem-fs": "^4.0.0", + "mem-fs-editor": "^11.0.0", + "semver": "^7.5.4", + "slash": "^5.1.0", + "untildify": "^5.0.0", + "which-package-manager": "^0.0.1" + }, + "acceptDependencies": { + "@yeoman/adapter": "^2.0.0", + "@yeoman/transform": "^2.1.0" + }, + "bin": { + "yoe": "bin/bin.cjs" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "peerDependencies": { + "@yeoman/types": "^1.1.1", + "mem-fs": "^4.0.0" + } + }, + "node_modules/yeoman-environment/node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-environment/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/yeoman-environment/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-environment/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-environment/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-generator": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-7.5.1.tgz", + "integrity": "sha512-MYncRvzSTd71BMwiUMAVhfX00sDD8DZDrmPzRxQkWuWQ0V1Qt4Rd0gS/Nee2QDTWvRjvCa+KBfiAVrtOySq+JA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/lodash-es": "^4.17.9", + "@yeoman/namespace": "^1.0.0", + "chalk": "^5.3.0", + "debug": "^4.1.1", + "execa": "^8.0.1", + "github-username": "^9.0.0", + "json-schema": "^0.4.0", + "latest-version": "^9.0.0", + "lodash-es": "^4.17.21", + "mem-fs-editor": "^11.0.1", + "minimist": "^1.2.8", + "read-package-up": "^11.0.0", + "semver": "^7.5.4", + "simple-git": "^3.20.0", + "sort-keys": "^5.0.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "peerDependencies": { + "@types/node": ">=18.18.5", + "@yeoman/types": "^1.1.1", + "mem-fs": "^4.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/yeoman-generator/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zapier-platform-cli": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/zapier-platform-cli/-/zapier-platform-cli-19.2.1.tgz", + "integrity": "sha512-CrMuOhgE6r2OPjwzQK6NWrLBmKcVr61pr150EypS2ygV8Jv1Ut5FRAGFAmP/A7wiKMPeTmlQe8vWY+DnMAA9bQ==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@oclif/core": "4.5.2", + "@oclif/plugin-autocomplete": "3.2.34", + "@oclif/plugin-help": "6.2.32", + "@oclif/plugin-not-found": "3.2.62", + "@oclif/plugin-version": "2.2.32", + "adm-zip": "0.5.16", + "archiver": "7.0.1", + "chrono-node": "2.8.3", + "cli-table3": "0.6.5", + "colors": "1.4.0", + "debug": "4.4.1", + "decompress-unzip": "4.0.1", + "dotenv": "17.2.1", + "esbuild": "0.25.8", + "fs-extra": "11.3.1", + "gulp-filter": "7.0.0", + "gulp-prettier": "5.0.0", + "ignore": "7.0.5", + "inquirer": "8.2.5", + "jscodeshift": "^17.3.0", + "lodash": "4.18.1", + "luxon": "3.7.1", + "marked": "15.0.12", + "marked-terminal": "7.3.0", + "open": "10.2.0", + "ora": "5.4.0", + "parse-gitignore": "0.5.1", + "prettier": "3.6.2", + "read": "4.1.0", + "semver": "7.7.2", + "string-length": "4.0.2", + "through2": "4.0.2", + "tmp": "0.2.5", + "traverse": "0.6.11", + "update-notifier": "7.3.1", + "yeoman-environment": "4.4.3", + "yeoman-generator": "7.5.1" + }, + "bin": { + "zapier-platform": "src/bin/run" + }, + "engines": { + "node": ">=18.20" + } + }, + "node_modules/zapier-platform-cli/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/zapier-platform-core": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/zapier-platform-core/-/zapier-platform-core-19.2.1.tgz", + "integrity": "sha512-VOjLRnk8sE42tVqhl61ojCCBFoq90lvgT28pwZWvFNz7vT79XDK7ubNP7fJbeF9xvSyTjTKw68C0it2JHhahNg==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@zapier/secret-scrubber": "^1.1.2", + "content-disposition": "0.5.4", + "dotenv": "17.2.1", + "fernet": "^0.3.3", + "form-data": "4.0.5", + "json-schema-to-ts": "3.1.1", + "lodash": "4.18.1", + "mime-types": "3.0.1", + "node-abort-controller": "3.1.1", + "node-fetch": "2.7.0", + "oauth-sign": "0.9.0", + "semver": "7.7.2", + "zapier-platform-schema": "19.2.1" + }, + "engines": { + "node": ">=16", + "npm": ">=5.6.0" + }, + "optionalDependencies": { + "@types/node": "^20.3.1" + }, + "peerDependencies": { + "zapier-platform-legacy-scripting-runner": ">=3" + }, + "peerDependenciesMeta": { + "zapier-platform-legacy-scripting-runner": { + "optional": true + } + } + }, + "node_modules/zapier-platform-core/node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/zapier-platform-core/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT", + "optional": true + }, + "node_modules/zapier-platform-schema": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/zapier-platform-schema/-/zapier-platform-schema-19.2.1.tgz", + "integrity": "sha512-RVfY6vbKW/j/1CZmz3B5PJRygxCCeFgGvW5pX/dEKKXDGizJOG63fAgkYFIA/gwPfpWMWvYeR4GNBaJLSGYTQQ==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "json-metaschema": "1.3.0", + "jsonschema": "1.5.0", + "lodash": "4.18.1" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f23c4b9 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "batchdata", + "version": "0.2.0", + "description": "BatchData property data, skip tracing, address verification and phone compliance checks for Zapier.", + "main": "index.js", + "license": "MIT", + "author": "BatchData ", + "homepage": "https://batchdata.io", + "repository": { + "type": "git", + "url": "git+https://github.com/batchdataco/batchdata-zapier.git" + }, + "scripts": { + "test": "node --test test/*.test.js", + "test:zapier": "zapier-platform test", + "validate": "zapier-platform validate", + "samples": "node scripts/make-samples.js ../fixtures" + }, + "engines": { + "node": ">=22" + }, + "dependencies": { + "zapier-platform-core": "19.2.1" + }, + "devDependencies": { + "zapier-platform-cli": "19.2.1", + "nock": "^13.5.0" + }, + "private": true +} diff --git a/samples/check_dnc.json b/samples/check_dnc.json new file mode 100644 index 0000000..85c8dfc --- /dev/null +++ b/samples/check_dnc.json @@ -0,0 +1,8 @@ +{ + "number": "6027828692", + "dnc": false, + "meta": { + "error": false, + "matched": true + } +} diff --git a/samples/check_tcpa.json b/samples/check_tcpa.json new file mode 100644 index 0000000..f2de565 --- /dev/null +++ b/samples/check_tcpa.json @@ -0,0 +1,8 @@ +{ + "number": "2024561111", + "tcpa": false, + "meta": { + "error": false, + "matched": false + } +} diff --git a/samples/lookup_property.json b/samples/lookup_property.json new file mode 100644 index 0000000..7839c23 --- /dev/null +++ b/samples/lookup_property.json @@ -0,0 +1,38 @@ +{ + "_id": "76ef71f2bc0c999e87592cd8302c5d32", + "address": { + "street": "26823 N 31st Dr", + "city": "Phoenix", + "state": "AZ", + "zip": "85083", + "county": "Maricopa", + "latitude": 33.728785, + "longitude": -112.126019, + "hash": "fae16e6adfaf0bb0f306ba89bf7b4c1e" + }, + "owner": { + "fullName": "Kyle Anderson; Rhonda K Anderson" + }, + "valuation": { + "estimatedValue": 449821, + "equityPercent": 100 + }, + "ids": { + "apn": "205-03-224" + }, + "building": { + "livingAreaSquareFeet": 1761, + "yearBuilt": 2001 + }, + "general": { + "propertyTypeCategory": "Residential", + "propertyTypeDetail": "Single Family" + }, + "lot": { + "lotSizeAcres": 0.14637281910009184 + }, + "tax": { + "taxAmount": 19, + "taxYear": 2023 + } +} diff --git a/samples/search_properties.json b/samples/search_properties.json new file mode 100644 index 0000000..b7463d0 --- /dev/null +++ b/samples/search_properties.json @@ -0,0 +1,33 @@ +{ + "_id": "5c2b4e5fdca9199c5e2a041c2e8166e1", + "address": { + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "state": "AZ", + "zip": "85086", + "county": "Maricopa", + "latitude": 33.867445, + "longitude": -112.157639, + "hash": "94d976d3a42b939e67c4015ee1a95f44" + }, + "owner": { + "fullName": "4522 W RAVINA LLC" + }, + "valuation": { + "estimatedValue": 567493, + "equityPercent": 100 + }, + "listing": { + "status": "Off Market", + "bedroomCount": 5, + "bathroomCount": 3, + "yearBuilt": 2005 + }, + "ids": { + "apn": "203-04-206" + }, + "searchMeta": { + "resultCount": 1, + "resultsFound": 1 + } +} diff --git a/samples/skip_trace.json b/samples/skip_trace.json new file mode 100644 index 0000000..ef586fa --- /dev/null +++ b/samples/skip_trace.json @@ -0,0 +1,61 @@ +{ + "apiVersion": "v1", + "propertyAddress": { + "street": "1011 Rosegold St", + "city": "Franklin Square", + "state": "NY", + "zip": "11010" + }, + "person": { + "name": { + "first": "john", + "last": "doe" + }, + "litigator": false, + "emails": [ + { + "email": "john.doe@example.com" + } + ], + "phoneNumbers": [ + { + "number": "1111111111", + "carrier": "OMNIPOINT COMMUNICATIONS- INC.", + "type": "Mobile", + "tested": true, + "reachable": true, + "score": 100 + }, + { + "number": "2222222222", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": false, + "reachable": false, + "score": 95 + }, + { + "number": "3333333333", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": true, + "reachable": true, + "score": 90 + }, + { + "number": "4444444444", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": true, + "reachable": true, + "score": 85 + } + ], + "propertyAddress": { + "street": "1011 Rosegold St", + "city": "Franklin Square", + "state": "NY", + "zip": "11010" + } + } +} diff --git a/samples/verify_address.json b/samples/verify_address.json new file mode 100644 index 0000000..f4ce5c1 --- /dev/null +++ b/samples/verify_address.json @@ -0,0 +1,18 @@ +{ + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "zipPlus4": "1049", + "county": "Maricopa", + "countyFipsCode": "04013", + "hash": "90a01b18e3834e349a8d1d07d7e086ba", + "latitude": 33.47865, + "longitude": -112.03029, + "vacant": "No", + "carrierRoute": "C009", + "meta": { + "error": false, + "normalized": true + } +} diff --git a/samples/verify_phone.json b/samples/verify_phone.json new file mode 100644 index 0000000..12476ec --- /dev/null +++ b/samples/verify_phone.json @@ -0,0 +1,15 @@ +{ + "carrier": "OMNIPOINT COMMUNICATIONS- INC.", + "dnc": false, + "notFound": false, + "number": "6462467560", + "reachable": true, + "state": "NY", + "tcpa": false, + "tested": true, + "type": "Mobile", + "meta": { + "error": false, + "matched": true + } +} diff --git a/scripts/make-samples.js b/scripts/make-samples.js new file mode 100644 index 0000000..075e42c --- /dev/null +++ b/scripts/make-samples.js @@ -0,0 +1,74 @@ +'use strict'; +// Builds the trimmed sample records shipped in samples/*.json from the OpenAPI-derived fixtures. +// Usage: node scripts/make-samples.js ../fixtures +const fs = require('fs'); +const path = require('path'); + +const dir = path.resolve(process.argv[2] || '../fixtures'); +const load = (name) => JSON.parse(fs.readFileSync(path.join(dir, `${name}.json`), 'utf8')); +const pick = (source, spec) => { + const out = {}; + for (const [key, sub] of Object.entries(spec)) { + if (source === undefined || source === null || !(key in source)) continue; + out[key] = sub === true ? source[key] : pick(source[key], sub); + } + return out; +}; +const write = (name, value) => + fs.writeFileSync(path.join(__dirname, '..', 'samples', `${name}.json`), `${JSON.stringify(value, null, 2)}\n`); + +const propertySpec = { + _id: true, + address: { street: true, city: true, state: true, zip: true, county: true, latitude: true, longitude: true, hash: true }, + owner: { fullName: true }, + valuation: { estimatedValue: true, equityPercent: true }, + listing: { status: true, bedroomCount: true, bathroomCount: true, yearBuilt: true }, + ids: { apn: true }, +}; +const search = load('property-search'); +const searchRecord = pick(search.results.properties[0], propertySpec); +searchRecord.searchMeta = { resultCount: 1, resultsFound: 1 }; +write('search_properties', searchRecord); + +const lookup = load('property-lookup-all-attributes'); +write( + 'lookup_property', + pick(lookup.results.properties[0], { + ...propertySpec, + building: { livingAreaSquareFeet: true, yearBuilt: true, bedroomCount: true }, + general: { propertyTypeCategory: true, propertyTypeDetail: true }, + lot: { lotSizeAcres: true }, + tax: { taxAmount: true, taxYear: true }, + }), +); + +const personPick = { + name: { first: true, last: true }, + litigator: true, + emails: true, + phoneNumbers: true, + propertyAddress: { street: true, city: true, state: true, zip: true }, +}; +const v1 = load('property-skip-trace'); +write('skip_trace', { + apiVersion: 'v1', + propertyAddress: v1.results.persons[0].propertyAddress + ? pick(v1.results.persons[0].propertyAddress, { street: true, city: true, state: true, zip: true }) + : null, + person: pick(v1.results.persons[0], personPick), +}); + +const addr = load('address-verify'); +write( + 'verify_address', + pick(addr.results.addresses[0], { + street: true, city: true, state: true, zip: true, zipPlus4: true, county: true, + countyFipsCode: true, hash: true, latitude: true, longitude: true, vacant: true, + carrierRoute: true, meta: { error: true, normalized: true }, + }), +); +const ph = load('phone-verification'); +write('verify_phone', ph.results.phoneNumbers[0]); +write('check_dnc', load('phone-dnc').results.phoneNumbers[0]); +write('check_tcpa', load('phone-tcpa').results.phoneNumbers[0]); +console.log('samples written'); diff --git a/test/builders.test.js b/test/builders.test.js new file mode 100644 index 0000000..179c4d1 --- /dev/null +++ b/test/builders.test.js @@ -0,0 +1,109 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { + buildSearchBody, + buildLookupBody, + buildSkipTraceBody, + buildPhoneBody, + buildAddressVerifyBody, + skipTracePath, + extractSkipTraceRecords, +} = require('../lib/builders'); +const { InputError } = require('../lib/common'); +const { fixture } = require('./helpers'); + +test('search: structured fields become searchCriteria and options', () => { + const body = buildSearchBody({ + query: 'Phoenix, AZ', + quick_lists: ['absentee-owner'], + excluded_quick_lists: ['vacant'], + or_quick_lists: ['tax-default', 'preforeclosure'], + bedrooms_min: '3', + estimated_value_max: '400000', + last_sale_date_from: '2020-01-05T00:00:00.000Z', + owner_occupied: 'no', + take: '10', + }); + assert.deepEqual(body, { + searchCriteria: { + query: 'Phoenix, AZ', + quickLists: ['absentee-owner', 'not-vacant'], + orQuickLists: ['tax-default', 'preforeclosure'], + building: { bedroomCount: { min: 3 } }, + valuation: { estimatedValue: { max: 400000 } }, + sale: { lastSaleDate: { minDate: '2020-01-05' } }, + owner: { ownerOccupied: { equals: false } }, + }, + options: { take: 10 }, + }); +}); + +test('search: dedicated field wins over JSON blob and callbacks are stripped', () => { + const body = buildSearchBody({ + query: 'Tempe, AZ', + additional_criteria: JSON.stringify({ query: 'ignored', building: { yearBuilt: { min: 1990 } }, webhookUrl: 'https://x.test' }), + }); + assert.equal(body.searchCriteria.query, 'Tempe, AZ'); + assert.deepEqual(body.searchCriteria.building, { yearBuilt: { min: 1990 } }); + assert.ok(!JSON.stringify(body).includes('webhookUrl')); + assert.equal(body.options.take, 25); +}); + +test('search: validates take and JSON', () => { + assert.throws(() => buildSearchBody({ take: '101' }), InputError); + assert.throws(() => buildSearchBody({ additional_criteria: '[1]' }), InputError); + assert.throws(() => buildSearchBody({ additional_criteria: '{oops' }), InputError); + assert.equal(buildSearchBody({ take: '0' }).options.take, 0); +}); + +test('lookup: sends exactly one identifier', () => { + const byAddress = buildLookupBody({ identify_by: 'address', street: '1 Main St', city: 'Phoenix', state: 'AZ', zip: '85001', property_id: 'ignored' }); + assert.deepEqual(byAddress, { requests: [{ address: { street: '1 Main St', city: 'Phoenix', state: 'AZ', zip: '85001' } }] }); + const byApn = buildLookupBody({ identify_by: 'apn', apn: '123', county_fips_code: '04013', datasets: ['owner'], include_skip_trace: 'yes' }); + assert.deepEqual(byApn, { requests: [{ apn: '123', countyFipsCode: '04013' }], options: { skipTrace: true, datasets: ['owner'] } }); +}); + +test('lookup: rejects basic+core and unknown datasets', () => { + assert.throws(() => buildLookupBody({ identify_by: 'hash', address_hash: 'h', datasets: ['basic', 'core'] }), InputError); + assert.throws(() => buildLookupBody({ identify_by: 'hash', address_hash: 'h', datasets: ['nope'] }), InputError); +}); + +test('skip trace: TCPA option is always explicit and defaults to excluded', () => { + for (const version of ['v1', 'v3']) { + const body = buildSkipTraceBody({ api_version: version, street: '1 Main St', city: 'Phoenix', state: 'AZ', zip: '85001' }); + assert.equal(body.options.includeTCPABlacklistedPhones, false); + } + const on = buildSkipTraceBody({ street: '1 Main St', include_tcpa_flagged: true }); + assert.equal(on.options.includeTCPABlacklistedPhones, true); + assert.equal(buildSkipTraceBody({ street: 'x', include_tcpa_flagged: 'false' }).options.includeTCPABlacklistedPhones, false); +}); + +test('skip trace: paths and name/mailing mapping', () => { + assert.equal(skipTracePath('v1'), '/api/v1/property/skip-trace'); + assert.equal(skipTracePath('v3'), '/api/v3/property/skip-trace'); + const body = buildSkipTraceBody({ street: '1 Main', owner_first_name: 'Ann', owner_last_name: 'Lee', mailing_street: 'PO Box 1', mailing_zip: '85001', request_id: 'r1' }); + assert.deepEqual(body.requests[0].name, { first: 'Ann', last: 'Lee' }); + assert.deepEqual(body.requests[0].mailingAddress, { street: 'PO Box 1', zip: '85001' }); + assert.equal(body.requests[0].requestId, 'r1'); +}); + +test('skip trace: V1 and V3 responses become one record per person', () => { + const v1 = extractSkipTraceRecords('v1', fixture('property-skip-trace')); + assert.ok(v1.length >= 1); + assert.equal(v1[0].apiVersion, 'v1'); + assert.ok(v1[0].person.name); + const v3 = extractSkipTraceRecords('v3', fixture('v3-property-skip-trace')); + assert.ok(v3.length >= 1); + assert.equal(v3[0].apiVersion, 'v3'); + assert.ok(v3[0].person.name); + assert.deepEqual(extractSkipTraceRecords('v3', {}), []); +}); + +test('phone and address bodies', () => { + assert.deepEqual(buildPhoneBody({ phone_numbers: ['6027828692', '4805551212'] }), { requests: ['6027828692', '4805551212'] }); + assert.deepEqual(buildPhoneBody({ phone_numbers: '6027828692, 4805551212;1' }), { requests: ['6027828692', '4805551212', '1'] }); + assert.throws(() => buildPhoneBody({ phone_numbers: '' }), InputError); + assert.deepEqual(buildAddressVerifyBody({ street: '1 Main', city: '', zip: '85001' }), { requests: [{ street: '1 Main', zip: '85001' }] }); +}); diff --git a/test/catalog.test.js b/test/catalog.test.js new file mode 100644 index 0000000..d2da390 --- /dev/null +++ b/test/catalog.test.js @@ -0,0 +1,230 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const crypto = require('crypto'); +const fs = require('fs'); +const path = require('path'); +const { makeZ, ZError } = require('./helpers'); +const { searches, creates, triggers } = require('../lib/modules'); +const catalog = require('../lib/catalog.json'); +const engine = require('../lib/engine'); + +const bundleFor = (inputData, extra = {}) => ({ authData: { api_key: 'test-token' }, inputData, ...extra }); +const run = async (module, input, response, extra) => { + const bundle = bundleFor(input, extra); + const { z, calls } = makeZ(bundle, async () => ({ data: response })); + const result = await module.operation.perform(z, bundle); + return { result, calls }; +}; + +test('vendored catalog matches its recorded hash (drift check against shared/catalog.json)', () => { + const raw = fs.readFileSync(path.join(__dirname, '..', 'lib', 'catalog.json'), 'utf8'); + const recorded = fs.readFileSync(path.join(__dirname, '..', 'lib', 'catalog.sha256'), 'utf8').trim(); + assert.equal(crypto.createHash('sha256').update(raw).digest('hex'), recorded); +}); + +test('copy lint: one contact, no other product names, no callback fields, billing everywhere', () => { + const all = [...Object.values(searches), ...Object.values(creates), ...Object.values(triggers)]; + const text = JSON.stringify(all.map((m) => [m.display, m.operation.inputFields])); + assert.ok(!new RegExp(['batch' + 'leads', 'batch\\s*' + 'dialer'].join('|'), 'i').test(text)); + for (const m of all) for (const f of m.operation.inputFields) assert.ok(!/webhookurl|errorwebhookurl|^url$/i.test(f.key), `${m.key}.${f.key}`); + for (const email of text.match(/[\w.+-]+@[\w-]+\.[\w.]+/g) || []) assert.equal(email, 'support@batchservice.com'); + for (const m of all) assert.match(m.display.description, /bill/i, m.key); +}); + +test('skip-trace-like operations always send includeTCPABlacklistedPhones, default false', async () => { + const batch = await run(creates.batch_skip_trace, { properties: [{ street: '1 A St', city: 'X', state: 'AZ', zip: '85001' }] }, { result: { data: [] } }); + assert.equal(batch.calls[0].body.options.includeTCPABlacklistedPhones, false); + assert.equal(batch.calls[0].url, 'https://api.batchdata.com/api/v3/property/skip-trace'); + const rev = await run(searches.reverse_skip_trace, { phone: '6025550142' }, { result: { data: [] } }); + assert.equal(rev.calls[0].body.options.includeTCPABlacklistedPhones, false); + const on = await run(searches.reverse_skip_trace, { email: 'a@example.com', include_tcpa_flagged: true }, { result: { data: [] } }); + assert.equal(on.calls[0].body.options.includeTCPABlacklistedPhones, true); +}); + +test('reverse skip trace: no match yields no record, a match yields one', async () => { + const none = await run(searches.reverse_skip_trace, { phone: '6025550142' }, { result: { data: [{ input: {}, persons: [], meta: { matched: false } }] } }); + assert.deepEqual(none.result, []); + const hit = await run(searches.reverse_skip_trace, { phone: '6025550142' }, { result: { data: [{ input: {}, persons: [{ name: { first: 'A' } }], meta: { matched: true } }] } }); + assert.equal(hit.result.length, 1); +}); + +test('reverse skip trace needs a phone or an email and sends nothing otherwise', async () => { + const bundle = bundleFor({}); + const { z, calls } = makeZ(bundle, async () => ({ data: {} })); + await assert.rejects(searches.reverse_skip_trace.operation.perform(z, bundle), (e) => e instanceof ZError && /at least one of/i.test(e.message)); + assert.equal(calls.length, 0); +}); + +test('batch operations cap at 100 rows and need at least one row', async () => { + const rows = Array.from({ length: 101 }, (_, i) => ({ street: `${i} Main St` })); + const bundle = bundleFor({ addresses: rows }); + const { z, calls } = makeZ(bundle, async () => ({ data: {} })); + await assert.rejects(creates.batch_verify_address.operation.perform(z, bundle), /at most 100/); + await assert.rejects(creates.batch_verify_address.operation.perform(z, bundleFor({ addresses: [] })), /at least one row/); + assert.equal(calls.length, 0); +}); + +test('permits: one record per permit with the property attached; address and filters map to the request', async () => { + const response = { result: { permits: [{ permitNumber: 'A1' }, { permitNumber: 'A2' }], property: { address: { street: '1 A St' } }, meta: { results: { resultCount: 2, resultsFound: 2 } } } }; + const { result, calls } = await run(searches.get_permits, { street: '1 A St', city: 'X', state: 'AZ', zip: '85001', permit_status: 'final', tags: ['solar', 'roofing'], issued_from: '2025-01-01T00:00:00Z' }, response); + assert.equal(result.length, 2); + assert.equal(result[0].property.address.street, '1 A St'); + assert.equal(calls[0].url, 'https://api.batchdata.com/api/v2/property/get-property-permits'); + assert.deepEqual(calls[0].body.request.allTags, { inList: ['solar', 'roofing'] }); + assert.equal(calls[0].body.request.issueDate.minDate, '2025-01-01'); + assert.equal(calls[0].body.options.take, 25); +}); + +test('investor buybox and properties map their envelopes', async () => { + const box = await run(searches.investor_buybox, { street: '1 A St', city: 'X', state: 'AZ', zip: '85001' }, { result: { investors: [{ id: 'i1' }], meta: { results: { resultCount: 1 } } } }); + assert.equal(box.result[0].id, 'i1'); + assert.equal(box.calls[0].body.searchCriteria.compAddress.street, '1 A St'); + const props = await run(searches.investor_properties, { investor_id: 'i1', take: '5' }, { result: { properties: [{ propertyId: 'p1' }], resultsFound: 9, nextPageCursor: 'c2' } }); + assert.equal(props.result[0].nextPageCursor, 'c2'); + assert.equal(props.calls[0].body.options.take, 5); +}); + +test('autocomplete, geocode and reverse geocode', async () => { + const ac = await run(searches.autocomplete_address, { query: '2800 N 24th' }, { result: { suggestions: [{ name: 'a' }, { name: 'b' }] } }); + assert.equal(ac.result.length, 2); + assert.equal(ac.calls[0].body.options.take, 5); + const geo = await run(searches.geocode_address, { address: '1 A St, X, AZ' }, { result: { addresses: [{ latitude: 1, longitude: 2 }] } }); + assert.equal(geo.calls[0].body.requests[0].address, '1 A St, X, AZ'); + const rev = await run(searches.reverse_geocode, { latitude: '33.4', longitude: '-112.0' }, { result: { addresses: [{ street: 's' }] } }); + assert.deepEqual(rev.calls[0].body.request, { latitude: 33.4, longitude: -112 }); +}); + +test('search sessions: list uses query params, create forces cursor pagination, delete uses the path', async () => { + const list = await run(searches.list_search_sessions, { take: 7 }, { results: { sessions: [{ id: 's1' }] } }); + assert.equal(list.calls[0].method, 'GET'); + assert.equal(list.calls[0].params.take, 7); + assert.equal(list.calls[0].body, undefined); + const created = await run(creates.create_search_session, { session_id: 'my-session_1', query: 'Phoenix, AZ' }, { results: { properties: [{ _id: 'p' }], searchSessionMeta: { totalDelivered: 1, isNewSession: true } } }); + assert.equal(created.calls[0].body.options.useCursorPagination, true); + assert.equal(created.calls[0].body.options.searchSession.id, 'my-session_1'); + assert.equal(created.calls[0].body.options.take, 1); + assert.equal(created.result.session.isNewSession, true); + const del = await run(creates.delete_search_session, { id: 'my session/1' }, { results: { deleted: true, id: 'my session/1' } }); + assert.equal(del.calls[0].method, 'DELETE'); + assert.equal(del.calls[0].url, 'https://api.batchdata.com/api/v2/property/search-sessions/my%20session%2F1'); + assert.deepEqual(del.result, { deleted: true, id: 'my session/1' }); +}); + +test('session ids are validated before any request', async () => { + const bundle = bundleFor({ session_id: 'bad id!', query: 'x' }); + const { z, calls } = makeZ(bundle, async () => ({ data: {} })); + await assert.rejects(creates.create_search_session.operation.perform(z, bundle), /invalid format/); + assert.equal(calls.length, 0); +}); + +test('create monitor: stream delivery only, never a user callback URL', async () => { + const input = { query: 'Phoenix, AZ', delivery_type: 'kinesis', kinesis_stream_name: 's', kinesis_region: 'us-west-2', kinesis_access_key_id: 'k', kinesis_secret_access_key: 'v', event_hub_name: 'ignored' }; + const { result, calls } = await run(creates.create_monitor, input, { result: { subscriptionId: 'sub1' } }); + assert.equal(calls[0].body.deliveryConfig.type, 'kinesis'); + assert.equal(calls[0].body.deliveryConfig.eventHub, undefined); + assert.deepEqual(result, { subscriptionId: 'sub1' }); + const fields = creates.create_monitor.operation.inputFields.map((f) => f.key); + assert.ok(!fields.some((k) => /url|webhook/i.test(k))); + const types = creates.create_monitor.operation.inputFields.find((f) => f.key === 'delivery_type').choices.map((c) => c.value); + assert.deepEqual(types.sort(), ['event-hub', 'kinesis']); +}); + +test('callback keys inside JSON criteria are stripped from the request', async () => { + const { calls } = await run(creates.create_search_session, { session_id: 's1', additional_criteria: '{"query":"x","options":{"webhookUrl":"https://evil.example"},"errorWebhookUrl":"https://evil.example"}' }, { results: { properties: [] } }); + assert.ok(!JSON.stringify(calls[0].body).toLowerCase().includes('webhook')); +}); + +test('delete monitor and get monitor use the path id', async () => { + const del = await run(creates.delete_monitor, { id: 'abc' }, {}); + assert.equal(del.calls[0].url, 'https://api.batchdata.com/api/v2/property-subscription/abc'); + const got = await run(searches.get_monitor, { id: 'abc' }, { result: { id: 'abc', searchCriteria: {} } }); + assert.equal(got.result[0].id, 'abc'); +}); + +test('polling triggers return records with an id, newest first', async () => { + const sessions = await run(triggers.new_search_session, {}, { results: { sessions: [{ id: 'a', createdAt: '2026-01-01' }, { id: 'b', createdAt: '2026-02-01' }] } }); + assert.deepEqual(sessions.result.map((r) => r.id), ['b', 'a']); + assert.equal(sessions.calls[0].params.take, 100); + const props = await run(triggers.new_session_property, { session_id: 's1', query: 'Phoenix' }, { results: { properties: [{ _id: 'p1' }, { _id: 'p2' }] } }); + assert.deepEqual(props.result.map((r) => r.id), ['p1', 'p2']); + assert.equal(props.calls[0].body.options.useCursorPagination, true); + assert.match(triggers.new_session_property.display.description, /billed|bills/i); + const monitors = await run(triggers.new_monitor, {}, { results: { subscriptions: [{ id: 'm1' }] } }); + assert.equal(monitors.result[0].id, 'm1'); +}); + +test('hook trigger: subscribe creates a webhook monitor to the platform hook URL, unsubscribe deletes it', async () => { + const op = triggers.monitor_event.operation; + const sub = bundleFor({ query: 'Phoenix, AZ', include_property: true }, { targetUrl: 'https://hooks.zapier.com/hooks/standard/1/abc/' }); + const s = makeZ(sub, async () => ({ data: { result: { subscriptionId: 'sub9' } } })); + const out = await op.performSubscribe(s.z, sub); + assert.deepEqual(out, { subscriptionId: 'sub9' }); + assert.equal(s.calls[0].method, 'POST'); + assert.deepEqual(s.calls[0].body.deliveryConfig, { type: 'webhook', url: 'https://hooks.zapier.com/hooks/standard/1/abc/' }); + assert.equal(s.calls[0].body.searchCriteria.query, 'Phoenix, AZ'); + assert.equal(JSON.stringify(s.calls[0].body).includes('include_property'), false); + + const un = bundleFor({}, { subscribeData: { subscriptionId: 'sub9' } }); + const u = makeZ(un, async () => ({ data: {} })); + assert.deepEqual(await op.performUnsubscribe(u.z, un), { removed: true }); + assert.equal(u.calls[0].method, 'DELETE'); + assert.equal(u.calls[0].url, 'https://api.batchdata.com/api/v2/property-subscription/sub9'); +}); + +test('hook trigger: event payload becomes a record keyed by eventId; hydration is opt-in and billed', async () => { + const op = triggers.monitor_event.operation; + const event = { eventId: 'e1', propertyId: 'p1', addedToSubscriptionIds: ['sub9'], removedFromSubscriptionIds: [], propertyChangedAt: '2026-10-28T00:00:00Z' }; + const plain = bundleFor({ query: 'x' }, { cleanedRequest: event }); + const a = makeZ(plain, async () => ({ data: {} })); + const records = await op.perform(a.z, plain); + assert.equal(records[0].id, 'e1'); + assert.equal(a.calls.length, 0); + + const hydrated = bundleFor({ query: 'x', include_property: true }, { cleanedRequest: event }); + const b = makeZ(hydrated, async () => ({ data: { results: { properties: [{ _id: 'p1', address: { street: '1 A St' } }] } } })); + const full = await op.perform(b.z, hydrated); + assert.equal(full[0].property.address.street, '1 A St'); + assert.deepEqual(b.calls[0].body, { requests: [{ propertyId: 'p1' }] }); + + const nokey = bundleFor({}, { cleanedRequest: { propertyId: 'p2' } }); + const c = makeZ(nokey, async () => ({ data: {} })); + const [r1] = await op.perform(c.z, nokey); + const [r2] = await op.perform(c.z, nokey); + assert.equal(r1.id, r2.id); + assert.equal((await op.performList()).length, 1); +}); + +test('generic API request: allows normal paths, blocks wallet, async, encoded and monitor creation', async () => { + const ok = await run(creates.api_request, { method: 'POST', path: '/api/v1/address/verify', body: '{"requests":[],"options":{"webhookUrl":"x"}}' }, { status: { code: 200 } }); + assert.equal(ok.calls[0].url, 'https://api.batchdata.com/api/v1/address/verify'); + assert.ok(!JSON.stringify(ok.calls[0].body).includes('webhook')); + assert.equal(ok.result.statusCode, 200); + for (const [method, p] of [ + ['GET', '/api/v1/wallet/balance'], ['GET', '/api/v1/Wallet/consumption-report'], ['POST', '/api/v1/property/search/async'], + ['POST', '/api/v2/property-subscription'], ['GET', '/api/v1/%77allet/balance'], ['GET', '/v1/address/verify'], + ['GET', '/api/v1/../v1/wallet'], ['GET', '/api/v1/x?y=1'], ['POST', '/api/v3/property/skip-trace/async'], + ]) { + const bundle = bundleFor({ method, path: p }); + const { z, calls } = makeZ(bundle, async () => ({ data: {} })); + await assert.rejects(creates.api_request.operation.perform(z, bundle), ZError, `${method} ${p}`); + assert.equal(calls.length, 0, `${method} ${p} must not call the API`); + } + const get = await run(creates.api_request, { method: 'GET', path: '/api/v2/property-subscription' }, { results: {} }); + assert.equal(get.calls[0].method, 'GET'); +}); + +test('engine: every catalog op builds a request from its sample-free required inputs', () => { + for (const op of catalog.ops) { + const input = {}; + for (const f of op.fields) { + if (!f.required || f.default !== undefined) continue; + input[f.key] = f.type === 'rows' ? [Object.fromEntries(f.rowFields.map((r) => [r.key, 'x']))] : f.key === 'session_id' ? 'abc' : f.type === 'number' || f.type === 'integer' ? 1 : 'x'; + } + if (op.requireOneOf) input[op.requireOneOf[0]] = 'x'; + const request = engine.buildRequest(op, input); + assert.ok(request.path.startsWith('/api/'), op.key); + assert.ok(!/wallet|async/.test(request.path), op.key); + } +}); diff --git a/test/fixtures/address-verify.json b/test/fixtures/address-verify.json new file mode 100644 index 0000000..363d36d --- /dev/null +++ b/test/fixtures/address-verify.json @@ -0,0 +1,61 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "addresses": [ + { + "street": "2800 N 24th St", + "city": "Phoenix", + "state": "AZ", + "zip": "85008", + "county": "Maricopa", + "hash": "90a01b18e3834e349a8d1d07d7e086ba", + "latitude": 33.47865, + "longitude": -112.03029, + "geoLocation": [ + 33.47865, + -112.03029 + ], + "requestId": 0, + "formattedStreet": "N 24th St", + "streetNoUnit": "2800 N 24th St", + "meta": { + "error": false, + "normalized": true, + "hashed": true + }, + "houseNumber": "2800", + "zipPlus4": "1049", + "vacant": "No", + "countyFipsCode": "04013", + "carrierRoute": "C009", + "congressionalDistrict": "07", + "timeZone": "Mountain", + "utcOffset": -7, + "daylightSavingsTime": false, + "dpvMatchCode": "D", + "dpvFootnotes": "AAN1", + "footnotes": "B#H#" + } + ], + "meta": { + "apiVersion": "2.0", + "results": { + "requestCount": 1, + "normalizedCount": 1, + "notNormalizedCount": 0, + "hashedCount": 1, + "notHashedCount": 0, + "errorCount": 0 + }, + "performance": { + "totalRequestTime": 278, + "startTime": "2021-10-06T20:28:23.617Z", + "endTime": "2021-10-06T20:28:23.895Z" + }, + "requestId": "M2CiaQam0XxT64K" + } + } +} \ No newline at end of file diff --git a/test/fixtures/phone-dnc.json b/test/fixtures/phone-dnc.json new file mode 100644 index 0000000..fabaf4b --- /dev/null +++ b/test/fixtures/phone-dnc.json @@ -0,0 +1,49 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "phoneNumbers": [ + { + "number": "6027828692", + "dnc": false, + "meta": { + "error": false, + "matched": true + } + }, + { + "number": "5633574823", + "dnc": true, + "meta": { + "error": false, + "matched": true + } + }, + { + "number": "4808602153", + "dnc": true, + "meta": { + "error": false, + "matched": true + } + } + ], + "meta": { + "apiVersion": "2.0", + "results": { + "requestCount": 3, + "matchCount": 3, + "noMatchCount": 0, + "errorCount": 0 + }, + "performance": { + "totalRequestTime": 433, + "startTime": "2021-10-05T21:18:50.576Z", + "endTime": "2021-10-05T21:18:51.009Z" + }, + "requestId": "qTmKWCL3mDLIpmX" + } + } +} \ No newline at end of file diff --git a/test/fixtures/phone-tcpa.json b/test/fixtures/phone-tcpa.json new file mode 100644 index 0000000..43de91a --- /dev/null +++ b/test/fixtures/phone-tcpa.json @@ -0,0 +1,41 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "phoneNumbers": [ + { + "number": "2024561111", + "tcpa": false, + "meta": { + "error": false, + "matched": false + } + }, + { + "number": "6027828692", + "tcpa": true, + "meta": { + "error": false, + "matched": true + } + } + ], + "meta": { + "apiVersion": "2.15.4", + "results": { + "requestCount": 2, + "matchCount": 1, + "noMatchCount": 1, + "errorCount": 0 + }, + "performance": { + "totalRequestTime": 7, + "startTime": "2022-07-13T09:38:02.738Z", + "endTime": "2022-07-13T09:38:02.745Z" + }, + "requestId": "z5JmWWXdNT18vMV" + } + } +} \ No newline at end of file diff --git a/test/fixtures/phone-verification.json b/test/fixtures/phone-verification.json new file mode 100644 index 0000000..ed9fba8 --- /dev/null +++ b/test/fixtures/phone-verification.json @@ -0,0 +1,40 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "phoneNumbers": [ + { + "carrier": "OMNIPOINT COMMUNICATIONS- INC.", + "dnc": false, + "notFound": false, + "number": "6462467560", + "reachable": true, + "state": "NY", + "tcpa": false, + "tested": true, + "type": "Mobile", + "meta": { + "error": false, + "matched": true + } + } + ], + "meta": { + "apiVersion": "2.0", + "results": { + "requestCount": 1, + "matchCount": 1, + "noMatchCount": 0, + "errorCount": 0 + }, + "performance": { + "totalRequestTime": 6, + "startTime": "2021-10-06T20:45:49.164Z", + "endTime": "2021-10-06T20:45:49.170Z" + }, + "requestId": "OATS6vACiiIxFlT" + } + } +} \ No newline at end of file diff --git a/test/fixtures/property-lookup-all-attributes.json b/test/fixtures/property-lookup-all-attributes.json new file mode 100644 index 0000000..68866c0 --- /dev/null +++ b/test/fixtures/property-lookup-all-attributes.json @@ -0,0 +1,562 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "properties": [ + { + "_id": "76ef71f2bc0c999e87592cd8302c5d32", + "address": { + "houseNumber": "26823", + "street": "26823 N 31st Dr", + "city": "Phoenix", + "cityAliases": [ + "phoenix" + ], + "county": "Maricopa", + "state": "AZ", + "zip": "85083", + "zipPlus4": "5837", + "formattedStreet": "N 31st Dr", + "streetNoUnit": "26823 N 31st Dr", + "localities": [ + "arizona hillcrest" + ], + "latitude": 33.728785, + "longitude": -112.126019, + "countyFipsCode": "04013", + "hash": "fae16e6adfaf0bb0f306ba89bf7b4c1e", + "normalized": true, + "geoStatus": "Rooftop", + "geoStatusCode": "A" + }, + "assessment": { + "assessedImprovementValue": 27730, + "assessedLandValue": 6930, + "totalAssessedValue": 43300, + "assessmentYear": 2024, + "improvementMarketValue": 346400, + "landMarketValue": 86600, + "totalMarketValue": 433000, + "marketValueYear": 2024 + }, + "building": { + "totalBuildingAreaSquareFeet": 1761, + "totalBuildingAreaCode": "B", + "totalBuildingAreaCodeDescription": "Living Area", + "livingAreaSquareFeet": 1761, + "grossBuildingAreaSquareFeet": 2480, + "adjustedBuildingAreaSquareFeet": 2100, + "yearBuilt": 2001, + "effectiveYearBuilt": 2001, + "buildingCount": 1, + "roomCount": 6, + "unitCount": 1, + "calculatedBathroomCount": 2, + "fullBathroomCount": 2, + "bathroomCount": 2, + "bathFixtureCount": 7, + "storyCount": 1, + "garageParkingSpaceCount": 2, + "residentialUnitCount": 1, + "features": [ + "Air Conditioning", + "Refrigeration Air Conditioning", + "Sauna/Steam Room", + "Koi Pond", + "Mobile Home Hookup", + "Patio", + "Garage", + "Pool", + "Elevator" + ], + "airConditioningSourceCode": "J", + "airConditioningSource": "Refrigeration", + "buildingConditionCode": "F", + "buildingCondition": "Average", + "buildingQualityCode": "D", + "buildingQuality": "B", + "constructionTypeCode": "C", + "constructionType": "Frame", + "exteriorWallsCode": "S", + "exteriorWalls": "Stucco", + "garageCode": "I", + "garage": "Garage", + "heatSourceCode": "X", + "heatSource": "Yes", + "patioCode": "A", + "patio": "Patio", + "poolCode": "H", + "pool": "Pool - Yes", + "roofCoverCode": "I", + "roofCover": "Concrete", + "fireplaceCount": 0 + }, + "deedHistory": [ + { + "buyers": [ + "KB HOME SALES PHOENIX INC" + ], + "sellers": [ + "KB HOME PHOENIX INC", + "KAUFMAN & BROAD OF ARIZONA INC" + ], + "recordingDate": "2001-07-30T00:00:00.000Z", + "saleDate": "2001-07-20T00:00:00.000Z", + "documentNumber": "2001-0688814", + "documentTypeCode": "Z", + "documentType": "Corporation Deed", + "salePrice": 0, + "salePriceCode": "Full Consideration", + "transferTax": 412, + "ownerRelationshipType": "Arm's Length", + "multipleOwners": false + }, + { + "buyers": [ + "CHENEY RHONDA" + ], + "sellers": [ + "NUNEZ JR ROBERTO" + ], + "recordingDate": "2002-08-30T00:00:00.000Z", + "saleDate": "2002-08-19T00:00:00.000Z", + "documentNumber": "2002-0890956", + "documentTypeCode": "BF", + "documentType": "Quit Claim Deed", + "salePrice": 0 + }, + { + "buyers": [ + "ANDERSON RHONDA K" + ], + "sellers": [ + "ANDERSON KYLE DOUGLAS" + ], + "recordingDate": "2005-01-20T00:00:00.000Z", + "saleDate": "2005-01-14T00:00:00.000Z", + "documentNumber": "2005-0080877", + "documentTypeCode": "AQ", + "documentType": "Intra-Family Transfer", + "salePrice": 0, + "interFamily": true + }, + { + "buyers": [ + "ANDERSON RHONDA K" + ], + "sellers": [ + "ANDERSON RHONDA K", + "CHENEY RHONDA" + ], + "recordingDate": "2005-01-20T00:00:00.000Z", + "saleDate": "2005-01-14T00:00:00.000Z", + "documentNumber": "2005-0080876", + "documentTypeCode": "AQ", + "documentType": "Intra-Family Transfer", + "salePrice": 0, + "interFamily": true + }, + { + "buyers": [ + "ANDERSON KYLE", + "ANDERSON RHONDA K" + ], + "sellers": [], + "recordingDate": "2006-12-29T00:00:00.000Z", + "saleDate": "2006-12-11T00:00:00.000Z", + "documentNumber": "2006-1700576", + "documentTypeCode": "DN", + "documentType": "Stand Alone Mortgage" + }, + { + "buyers": [ + "ANDRESON RHONDA K", + "ANDERSON KYLE" + ], + "sellers": [ + "ANDRESON RHONDA K", + "ANDRESON KYLE" + ], + "recordingDate": "2013-01-18T00:00:00.000Z", + "saleDate": "2012-11-13T00:00:00.000Z", + "documentNumber": "2013-0056003", + "documentTypeCode": "AQ", + "documentType": "Intra-Family Transfer", + "salePrice": 0, + "interFamily": true + } + ], + "demographics": { + "age": 52, + "emailDomain": "gmail.com", + "householdSize": 3, + "income": 95000, + "netWorth": 425000, + "discretionaryIncome": 38000, + "homeownerRenterCode": "O", + "homeownerRenter": "Home Owner", + "genderCode": "M", + "gender": "Male", + "maritalStatusCode": "M", + "maritalStatus": "Married", + "childCount": 2, + "hasChildren": true, + "investments": [ + "Real Estate", + "Personal" + ], + "individualEducationCode": "BA", + "individualEducation": "Bachelor's Degree", + "individualOccupationCode": "PRO", + "individualOccupation": "Professional", + "businessOwnerCode": "A", + "businessOwner": "Real Estate", + "petOwner": true, + "millionaire": false, + "recentlyDivorced": false, + "singleParent": false, + "smoker": false, + "religious": true, + "religiousAffiliationCode": "C", + "religiousAffiliation": "Catholic", + "recentlyMoved": false, + "estimatedAreaCreditRating": "B" + }, + "foreclosure": {}, + "permit": { + "permitCount": 3, + "earliestDate": "2015-04-10", + "latestDate": "2022-08-22", + "totalJobValue": 48500, + "allTags": [ + "roofing", + "solar", + "electrical" + ], + "tags": { + "addition": false, + "adu": false, + "bathroom": false, + "battery": false, + "demolition": false, + "electrical": true, + "electricMeter": false, + "evCharger": false, + "fireSprinkler": false, + "gas": false, + "generator": false, + "grading": false, + "heatPump": false, + "hvac": false, + "inspectionPassed": true, + "kitchen": false, + "newConstruction": false, + "plumbing": false, + "poolAndHotTub": false, + "remodel": false, + "roofing": true, + "solar": true, + "waterHeater": false, + "windowDoor": false + } + }, + "general": { + "carrierRoute": "R087", + "vacant": false, + "mailingAddressVacant": false, + "vacantDate": "2021-05-14", + "mobileHome": false, + "standardizedLandUseCode": "R2", + "propertyTypeCategory": "Residential", + "propertyTypeDetail": "Single Family", + "congressionalDistrict": "8", + "timeZone": "Mountain", + "utcOffset": -7, + "daylightSavingsTime": false, + "censusTract": "040136119.001008", + "primaryParcel": true, + "parcelCount": 1 + }, + "ids": { + "addressHash": "fae16e6adfaf0bb0f306ba89bf7b4c1e", + "apn": "205-03-224", + "oldApn": "205032242", + "fipsCode": "04013" + }, + "legal": { + "assessorsMapReference": "MB 51824", + "cityTownshipMunicipality": "Phoenix", + "legalDescription": "ARIZONA HILLCREST MCR 518-24", + "lotCode": "S", + "lotNumber": "199", + "sectionTownshipRangeMeridian": "SEC 35 TWN 5N RNG 2E", + "subdivisionName": "ARIZONA HILLCREST", + "tractNumber": "ARIZONA HILLCREST" + }, + "lot": { + "lotSizeAcres": 0.14637281910009184, + "lotSizeSquareFeet": 6376, + "zoningCode": "R-8" + }, + "mortgageHistory": [ + { + "borrowers": [ + "CHENEY RHONDA" + ], + "saleDate": "2002-08-19T00:00:00.000Z", + "recordingDate": "2002-08-30T00:00:00.000Z", + "dueDate": "2032-09-01T00:00:00.000Z", + "lenderName": "CAPITOL COMMERCE MTG CO", + "lenderType": "Mortgage Company", + "lenderTypeCode": "M", + "loanAmount": 160500, + "loanTermMonths": 360, + "interestRate": "6.43" + }, + { + "borrowers": [ + "ANDERSON RHONDA K" + ], + "saleDate": "2005-01-14T00:00:00.000Z", + "recordingDate": "2005-01-20T00:00:00.000Z", + "dueDate": "2035-02-01T00:00:00.000Z", + "lenderName": "JPMORGAN CHASE BANK NA", + "lenderType": "Bank", + "lenderTypeCode": "B", + "loanTypeCode": "AH", + "loanType": "Unknown (DEFAULT)", + "loanAmount": 156800, + "loanTermMonths": 360, + "interestRate": "5.67" + }, + { + "borrowers": [ + "ANDERSON RHONDA K" + ], + "saleDate": "2005-01-14T00:00:00.000Z", + "recordingDate": "2005-01-20T00:00:00.000Z", + "dueDate": "2035-01-28T00:00:00.000Z", + "lenderName": "JPMORGAN CHASE BANK NA", + "lenderType": "Bank", + "lenderTypeCode": "B", + "loanTypeCode": "K", + "loanType": "Credit Line (Revolving)", + "loanAmount": 19000, + "loanTermMonths": 360, + "interestRate": "5.67" + }, + { + "borrowers": [ + "ANDERSON KYLE", + "ANDERSON RHONDA K" + ], + "saleDate": "2006-12-11T00:00:00.000Z", + "recordingDate": "2006-12-29T00:00:00.000Z", + "dueDate": "2026-12-19T00:00:00.000Z", + "lenderName": "USAA FSB", + "lenderType": "Bank", + "lenderTypeCode": "B", + "loanTypeCode": "K", + "loanType": "Credit Line (Revolving)", + "loanAmount": 75299, + "loanTermMonths": 240, + "interestRate": "6.33" + }, + { + "borrowers": [ + "ANDRESON RHONDA K", + "ANDERSON KYLE" + ], + "saleDate": "2012-11-13T00:00:00.000Z", + "recordingDate": "2013-01-18T00:00:00.000Z", + "dueDate": "2027-12-01T00:00:00.000Z", + "lenderName": "USAA FSB", + "lenderType": "Bank", + "lenderTypeCode": "B", + "loanTypeCode": "U", + "loanType": "New Conventional", + "loanAmount": 112000, + "loanTermMonths": 180, + "interestRate": "3.31" + } + ], + "openLien": { + "allLoanTypes": [], + "juniorLoanTypes": [], + "totalOpenLienCount": 1, + "mortgages": [ + { + "lenderName": "CAPITOL COMMERCE MTG CO", + "lenderType": "Mortgage Company", + "loanAmount": 160500, + "loanTermMonths": 360, + "interestRate": 6.43, + "loanType": "New Conventional", + "subordinateLoanFlag": false, + "equityFlag": false, + "helocFlag": false, + "pudRider": false, + "condoRider": false, + "multiFamilyRider": false, + "assumable": false, + "privateLender": false, + "secondHomeRider": false, + "sellerCarryBack": false, + "balloonRider": false + } + ] + }, + "owner": { + "fullName": "Kyle Anderson; Rhonda K Anderson", + "mailingAddress": { + "houseNumber": "26823", + "street": "26823 N 31st Dr", + "city": "Phoenix", + "county": "Maricopa", + "state": "AZ", + "zip": "85083", + "zipPlus4": "5837", + "formattedStreet": "N 31st Dr", + "streetNoUnit": "26823 N 31st Dr", + "hash": "fae16e6adfaf0bb0f306ba89bf7b4c1e" + }, + "names": [ + { + "first": "Kyle", + "last": "Anderson", + "full": "Kyle Anderson" + }, + { + "first": "Rhonda", + "middle": "K", + "last": "Anderson", + "full": "Rhonda K Anderson" + } + ], + "ownerOccupied": true, + "mailingOptOut": false, + "hasLandline": true, + "ownerStatusTypeCode": "B", + "ownerStatusType": "Individual", + "ownershipRightsCode": "AT", + "ownershipRights": "Joint Tenants" + }, + "propertyOwnerProfile": { + "averageYearBuilt": 2001, + "propertiesCount": 1, + "propertiesTotalEquity": 449821, + "propertiesTotalEstimatedValue": 449821 + }, + "quickLists": { + "absenteeOwner": false, + "absenteeOwnerInState": false, + "absenteeOwnerOutOfState": false, + "activeListing": false, + "activeAuction": false, + "cashBuyer": false, + "corporateOwned": false, + "expiredListing": false, + "freeAndClear": true, + "highEquity": true, + "inherited": false, + "listedBelowMarketPrice": false, + "lowEquity": false, + "mailingAddressVacant": false, + "onMarket": false, + "outOfStateOwner": false, + "ownerOccupied": true, + "pendingListing": false, + "preforeclosure": false, + "recentlySold": false, + "samePropertyAndMailingAddress": true, + "taxDefault": false, + "tiredLandlord": false, + "unknownEquity": false, + "vacant": false, + "hasHoa": true, + "hasHoaFees": true, + "canceledListing": false, + "noticeOfSale": false, + "noticeOfDefault": false, + "noticeOfLisPendens": false + }, + "sale": { + "lastTransfer": { + "documentNumber": "2013-0056003", + "documentType": "Intra-Family Transfer", + "priceCodeDescription": "Transfer Tax on document indicated as EXEMPT.", + "priceCode": "Z", + "recordingDate": "2013-01-18T00:00:00.000Z", + "saleDate": "2012-11-13T00:00:00.000Z" + }, + "lastSale": { + "saleBuyers": [ + "Michael R Torres" + ], + "saleSellers": [ + "BlueSky Holdings LLC" + ], + "salePriceIsEstimated": false + }, + "flipLength": 0, + "flipLengthCategory": 0, + "flipProfit": 0, + "priorTransfer": { + "documentNumber": "2005-0080877", + "documentType": "Intra-Family Transfer", + "priceCodeDescription": "Non-arms length transaction.", + "priceCode": "N", + "salePriceIsEstimated": false + }, + "priorSale": { + "recordingDate": "2005-01-20T00:00:00.000Z", + "saleBuyers": [ + "BlueSky Holdings LLC" + ], + "saleSellers": [ + "Estate Of Dorothy J Miller" + ], + "salePriceIsEstimated": false + } + }, + "tax": { + "taxAmount": 19, + "taxYear": 2023, + "taxDelinquentYear": 2022, + "taxRateCodeArea": "971300" + }, + "valuation": { + "estimatedValue": 449821, + "priceRangeMin": 382348, + "priceRangeMax": 517294, + "standardDeviation": 12, + "confidenceScore": 88, + "asOfDate": "2024-02-28T00:00:00.000Z", + "equityCurrentEstimatedBalance": 449821, + "ltv": 0, + "equityPercent": 100 + }, + "meta": { + "propertyDateModified": "2024-04-11T09:54:59.574Z" + } + } + ], + "meta": { + "apiVersion": "6.0.0", + "performance": { + "totalRequestTime": 167, + "startTime": "2024-04-16T18:07:52.824Z", + "endTime": "2024-04-16T18:07:52.991Z" + }, + "results": { + "requestCount": 1, + "matchCount": 1, + "noMatchCount": 0, + "errorCount": 0 + }, + "requestId": "EBilj51hcf9RPC8" + } + } +} \ No newline at end of file diff --git a/test/fixtures/property-search.json b/test/fixtures/property-search.json new file mode 100644 index 0000000..4579b43 --- /dev/null +++ b/test/fixtures/property-search.json @@ -0,0 +1,593 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "properties": [ + { + "_id": "5c2b4e5fdca9199c5e2a041c2e8166e1", + "address": { + "addressValidity": "Valid", + "houseNumber": "4522", + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "county": "Maricopa", + "state": "AZ", + "zip": "85086", + "zipPlus4": "1431", + "latitude": 33.867445, + "longitude": -112.157639, + "countyFipsCode": "04013", + "hash": "94d976d3a42b939e67c4015ee1a95f44" + }, + "deedHistory": [ + { + "buyers": [ + "TOUSA HOMES INC", + "ENGLE HOMES" + ], + "sellers": [ + "ACACIA CREDIT FUND 8-A LLC" + ], + "recordingDate": "2005-03-10T00:00:00.000Z", + "saleDate": "2005-03-04T00:00:00.000Z", + "documentNumber": "2005.294894", + "documentTypeCode": "S", + "documentType": "Cash Sale Deed", + "salePrice": 252492, + "salePriceCode": "Full Consideration", + "transferTax": 412, + "ownerRelationshipType": "Arm's Length", + "multipleOwners": false, + "transactionType": "Arms-length residential transactions (purchase/resales)", + "transactionTypeCode": "B", + "mailingAddress": { + "street": "3150 S 48th St Ste 100", + "city": "Phoenix", + "state": "AZ", + "zip": "85040", + "hash": "9612f33c41b36a5e163072df7d8535c1" + } + }, + { + "buyers": [ + "BARNES DAVID", + "BARNES TRISHA N" + ], + "sellers": [ + "ENGLE/SUNBELT LLC" + ], + "recordingDate": "2005-11-17T00:00:00.000Z", + "saleDate": "2005-11-14T00:00:00.000Z", + "documentNumber": "2005-1744001", + "documentTypeCode": "BZ", + "documentType": "Warranty Deed", + "salePrice": 422475, + "newConstruction": true, + "transactionType": "New construction residential transactions", + "transactionTypeCode": "C", + "mailingAddress": { + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "state": "AZ", + "zip": "85086", + "hash": "94d976d3a42b939e67c4015ee1a95f44" + } + }, + { + "buyers": [ + "BARNES DAVID" + ], + "sellers": [ + "BARNES DAVID", + "BARNES TRISHA N" + ], + "recordingDate": "2006-02-21T00:00:00.000Z", + "saleDate": "2006-02-13T00:00:00.000Z", + "documentNumber": "2006-0236246", + "documentTypeCode": "AQ", + "documentType": "Intra-Family Transfer", + "salePrice": 0, + "interFamily": true, + "transactionType": "Non-arms length transactions with valid title company name (no accomodations)", + "transactionTypeCode": "A", + "mailingAddress": { + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "state": "AZ", + "zip": "85086", + "hash": "94d976d3a42b939e67c4015ee1a95f44" + } + }, + { + "buyers": [ + "ROMERO MARIA ESTELA", + "ROMERO OCTAVIO R" + ], + "sellers": [ + "BARNES DAVID" + ], + "recordingDate": "2010-10-27T00:00:00.000Z", + "saleDate": "2010-09-03T00:00:00.000Z", + "documentNumber": "2010-0941098", + "documentTypeCode": "BZ", + "documentType": "Warranty Deed", + "salePrice": 154000, + "transactionType": "Arms-length residential transactions (purchase/resales)", + "transactionTypeCode": "B", + "mailingAddress": { + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "state": "AZ", + "zip": "85086", + "hash": "94d976d3a42b939e67c4015ee1a95f44" + } + }, + { + "buyers": [ + "THE FIVE CLUB TRUST" + ], + "sellers": [ + "ROMERO OCTAVIO RIMOLDI", + "ROMERO MARIA ESTELA" + ], + "recordingDate": "2015-10-23T00:00:00.000Z", + "saleDate": "2015-09-09T00:00:00.000Z", + "documentNumber": "2015-0764207", + "documentTypeCode": "Q", + "documentType": "Beneficiary Deed (Buyer ID = BE)", + "salePrice": 0, + "transactionType": "Non-arms length transactions with valid title company name (no accomodations)", + "transactionTypeCode": "A" + }, + { + "buyers": [ + "MADISON NATHAN S", + "MADISON MARY L" + ], + "sellers": [ + "ROMERO OCTAVIO RIMOLDI", + "ROMERO MARIA ESTELA" + ], + "recordingDate": "2020-08-11T00:00:00.000Z", + "saleDate": "2020-08-06T00:00:00.000Z", + "documentNumber": "2020.732181", + "documentTypeCode": "BZ", + "documentType": "Warranty Deed", + "salePrice": 389900, + "transactionType": "Arms-length residential transactions (purchase/resales)", + "transactionTypeCode": "B", + "mailingAddress": { + "street": "4522 W Ravina Ln", + "city": "Phoenix", + "state": "AZ", + "zip": "85086", + "hash": "94d976d3a42b939e67c4015ee1a95f44" + } + }, + { + "buyers": [ + "YUET P AND I-JUNG K POON FAMILY TRUST" + ], + "sellers": [ + "MADISON NATHAN S", + "MADISON MARY L" + ], + "recordingDate": "2022-04-11T00:00:00.000Z", + "saleDate": "2022-03-31T00:00:00.000Z", + "documentNumber": "2022.316997", + "documentTypeCode": "BZ", + "documentType": "Warranty Deed", + "salePrice": 570000, + "transactionType": "Arms-length residential transactions (purchase/resales)", + "transactionTypeCode": "B", + "mailingAddress": { + "street": "19675 La Mar Dr", + "city": "Cupertino", + "state": "CA", + "zip": "95014", + "hash": "f3b3f6919555dd565a3a8eeee61b15b4" + } + }, + { + "buyers": [ + "4522 W RAVINA LLC" + ], + "sellers": [ + "YUET P AND I-JUNG K POON FAMILY TRUST" + ], + "recordingDate": "2023-02-09T00:00:00.000Z", + "saleDate": "2023-02-09T00:00:00.000Z", + "documentNumber": "2023.67061", + "documentTypeCode": "BZ", + "documentType": "Warranty Deed", + "salePrice": 0, + "transactionType": "Non-arms length transactions with valid title company name (no accomodations)", + "transactionTypeCode": "A", + "mailingAddress": { + "street": "3225 McLeod Dr # 777", + "city": "Las Vegas", + "state": "NV", + "zip": "89121", + "hash": "45ba83fc378f6c2ee5a655f19dd58860" + } + } + ], + "demographics": { + "age": 60, + "emailDomain": "gmail.com", + "householdSize": 1, + "income": 170000, + "netWorth": 437000, + "discretionaryIncome": 64750, + "homeownerRenterCode": "O", + "homeownerRenter": "Home Owner", + "genderCode": "F", + "gender": "Female", + "maritalStatusCode": "S", + "maritalStatus": "Single", + "religious": true, + "religiousAffiliationCode": "P", + "religiousAffiliation": "Protestant", + "individualEducationCode": "E", + "individualEducation": "Attended College", + "individualOccupation": "Professional / Technical", + "individualOccupationCode": "1", + "estimatedAreaCreditRating": "A" + }, + "foreclosure": { + "statusCode": "E", + "status": "Rescission Recording", + "recordingDate": "2010-11-12T00:00:00.000Z", + "filingDate": "2010-11-12T00:00:00.000Z", + "documentNumber": "2010-0991603", + "documentTypeCode": "L", + "documentType": "Notice of Rescission", + "releaseDate": "2010-11-12T00:00:00.000Z" + }, + "ids": { + "apn": "203-04-206" + }, + "intel": { + "salePropensity": 12.8, + "salePropensityStatus": "Available", + "salePropensityCategory": "Medium" + }, + "involuntaryLien": { + "liens": [ + { + "documentNumber": "225074972", + "documentType": "Financing Statement", + "documentTypeCode": "ED", + "lienType": "Economic Lien", + "lienTypeCode": "B", + "recordingDate": "2025-07-02T00:00:00.000Z" + } + ] + }, + "listing": { + "status": "Off Market", + "price": 2700, + "rental": false, + "originalListingDate": "2025-04-29T00:00:00.000Z", + "maxListPrice": 570000, + "maxListPriceDate": "2022-04-11T00:00:00.000Z", + "minListPrice": 2450, + "minListPriceDate": "2020-06-04T00:00:00.000Z", + "soldPrice": 570000, + "soldDate": "2022-04-11T00:00:00.000Z", + "failedListingDate": "2025-05-01T00:00:00.000Z", + "bedroomCount": 5, + "bathroomCount": 3, + "totalBuildingAreaSquareFeet": 2906, + "lotSizeSquareFeet": 6969, + "propertyType": "Single Family", + "yearBuilt": 2005, + "appliances": [ + "Dishwasher", + "Dryer", + "Garbage disposal", + "Microwave", + "Refrigerator", + "Washer" + ], + "roofTypes": [ + "Tile" + ], + "coolingTypes": [ + "Other" + ], + "heatingTypes": [ + "Forced air", + "Gas" + ], + "newConstruction": false, + "listingUrl": "https://www.zillow.com/homedetails/4522-W-Ravina-Ln-Anthem-AZ-85086/67774980_zpid/", + "livingArea": 2906, + "taxes": [ + { + "amount": 2263.56, + "year": 2024 + }, + { + "amount": 2732.26, + "year": 2023 + }, + { + "amount": 2684.5, + "year": 2022 + }, + { + "amount": 2708, + "year": 2021 + }, + { + "amount": 2629.9, + "year": 2020 + }, + { + "amount": 2547.14, + "year": 2019 + }, + { + "amount": 2547.14, + "year": 2018 + }, + { + "amount": 2464.6, + "year": 2017 + }, + { + "amount": 2095.58, + "year": 2016 + }, + { + "amount": 2095.58, + "year": 2015 + }, + { + "year": 2014 + }, + { + "year": 2013 + }, + { + "year": 2012 + }, + { + "year": 2008 + }, + { + "year": 2007 + }, + { + "year": 2006 + }, + { + "year": 2005 + } + ], + "salePriceIsEstimated": false + }, + "mortgageHistory": [ + { + "borrowers": [ + "BARNES DAVID" + ], + "saleDate": "2006-02-10T00:00:00.000Z", + "recordingDate": "2006-02-21T00:00:00.000Z", + "dueDate": "2021-02-15T00:00:00.000Z", + "lenderName": "GREENPOINT MORTGAGE FUNDING INC", + "lenderType": "Mortgage Company", + "lenderTypeCode": "M", + "loanTypeCode": "K", + "loanType": "Credit Line (Revolving)", + "loanAmount": 42000, + "loanTermMonths": 180, + "interestRate": "6.15", + "transactionType": "HELOCS - both purchase money and non-purchase money HELOCS", + "transactionTypeCode": "F", + "documentDate": "2006-02-10T00:00:00.000Z" + }, + { + "borrowers": [ + "MADISON NATHAN S", + "MADISON MARY L" + ], + "saleDate": "2021-10-04T00:00:00.000Z", + "recordingDate": "2021-10-08T00:00:00.000Z", + "dueDate": "2051-11-01T00:00:00.000Z", + "lenderName": "ON Q FINANCIAL INC", + "lenderType": "Mortgage Company", + "lenderTypeCode": "M", + "loanTypeCode": "U", + "loanType": "New Conventional", + "loanAmount": 345000, + "loanTermMonths": 360, + "interestRate": "2.8", + "transactionType": "Refi loans and 2nd trust deeds (purchase and non-purchase money trust deeds)", + "transactionTypeCode": "G", + "documentDate": "2021-10-04T00:00:00.000Z" + } + ], + "openLien": { + "totalOpenLienCount": 1, + "mortgages": [ + { + "lenderName": "CAPITOL COMMERCE MTG CO", + "lenderType": "Mortgage Company", + "loanAmount": 160500, + "loanTermMonths": 360, + "interestRate": 6.43, + "loanType": "New Conventional", + "subordinateLoanFlag": false, + "equityFlag": false, + "helocFlag": false, + "pudRider": false, + "condoRider": false, + "multiFamilyRider": false, + "assumable": false, + "privateLender": false, + "secondHomeRider": false, + "sellerCarryBack": false, + "balloonRider": false + } + ] + }, + "owner": { + "fullName": "4522 W RAVINA LLC", + "mailingAddress": { + "addressValidity": "Partially Valid", + "street": "3225 McLeod Dr # 777", + "city": "Las Vegas", + "county": "Clark", + "state": "NV", + "zip": "89121", + "zipPlus4": "2257", + "hash": "45ba83fc378f6c2ee5a655f19dd58860", + "deliveryPointCode": "256", + "dpvMatchCode": "S", + "dpvFootnotes": "AABBCC" + }, + "names": [ + { + "last": "4522 W RAVINA LLC", + "full": "4522 W RAVINA LLC" + } + ], + "mailingOptOut": false, + "hasLandline": true + }, + "permit": { + "permitCount": 2, + "earliestDate": "2018-06-14", + "latestDate": "2021-09-03", + "totalJobValue": 22750, + "allTags": [ + "hvac", + "electrical" + ], + "tags": { + "addition": false, + "adu": false, + "bathroom": false, + "battery": false, + "demolition": false, + "electrical": true, + "electricMeter": false, + "evCharger": false, + "fireSprinkler": false, + "gas": false, + "generator": false, + "grading": false, + "heatPump": false, + "hvac": true, + "inspectionPassed": true, + "kitchen": false, + "newConstruction": false, + "plumbing": false, + "poolAndHotTub": false, + "remodel": false, + "roofing": false, + "solar": false, + "waterHeater": false, + "windowDoor": false + } + }, + "propertyOwnerProfile": { + "averageYearBuilt": 1983, + "propertiesCount": 8614, + "mortgagesTotalBalance": 1647737268, + "mortgagesCount": 4325, + "mortgagesAverageBalance": 380980 + }, + "quickLists": { + "absenteeOwner": true, + "absenteeOwnerInState": false, + "absenteeOwnerOutOfState": true, + "activeListing": false, + "activeAuction": false, + "cashBuyer": true, + "corporateOwned": true, + "expiredListing": false, + "failedListing": true, + "freeAndClear": true, + "fixAndFlip": false, + "forSaleByOwner": false, + "highEquity": true, + "inherited": false, + "involuntaryLien": false, + "listedBelowMarketPrice": true, + "lowEquity": false, + "mailingAddressVacant": false, + "onMarket": false, + "outOfStateOwner": true, + "ownerOccupied": false, + "pendingListing": false, + "preforeclosure": false, + "recentlySold": false, + "samePropertyAndMailingAddress": false, + "seniorOwner": false, + "taxDefault": false, + "tiredLandlord": false, + "unknownEquity": false, + "vacant": false, + "vacantLot": false, + "hasHoa": true, + "hasHoaFees": true, + "canceledListing": false, + "noticeOfSale": false, + "noticeOfDefault": false, + "noticeOfLisPendens": false + }, + "sale": { + "priorSale": { + "mortgages": [ + { + "documentNumber": "20200732182", + "pageNumber": null, + "bookNumber": null, + "recordingDate": "2020-08-11T00:00:00.000Z", + "loanAmount": 311920, + "loanTypeCode": "U", + "loanType": "New Conventional", + "financingTypeCode": null, + "financingType": null, + "interestRate": 3.1, + "dueDate": "2050-09-01T00:00:00.000Z", + "lenderName": "ON Q FINANCIAL INC", + "lenderType": "Mortgage Company", + "lenderTypeCode": "M", + "loanTerm": "360" + } + ] + } + }, + "valuation": { + "estimatedValue": 567493, + "priceRangeMin": 482369, + "priceRangeMax": 652617, + "standardDeviation": 6, + "confidenceScore": 94, + "asOfDate": "2025-07-09T00:00:00.000Z", + "equityCurrentEstimatedBalance": 567493, + "ltv": 0, + "equityPercent": 100 + } + } + ], + "meta": { + "apiVersion": "6.65.1", + "performance": { + "totalRequestTime": 24, + "startTime": "2025-10-29T16:46:34.557Z", + "endTime": "2025-10-29T16:46:34.581Z" + }, + "results": { + "resultCount": 1, + "resultsFound": 435641 + } + } + } +} \ No newline at end of file diff --git a/test/fixtures/property-skip-trace.json b/test/fixtures/property-skip-trace.json new file mode 100644 index 0000000..de47cc4 --- /dev/null +++ b/test/fixtures/property-skip-trace.json @@ -0,0 +1,122 @@ +{ + "status": { + "code": 200, + "text": "OK" + }, + "results": { + "persons": [ + { + "bankruptcy": {}, + "dnc": {}, + "emails": [ + { + "email": "johndoe@gmail.net" + } + ], + "mailingAddress": {}, + "name": { + "first": "john", + "last": "doe" + }, + "phoneNumbers": [ + { + "number": "1111111111", + "carrier": "OMNIPOINT COMMUNICATIONS- INC.", + "type": "Mobile", + "tested": true, + "reachable": true, + "score": 100 + }, + { + "number": "2222222222", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": false, + "reachable": false, + "score": 95 + }, + { + "number": "3333333333", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": true, + "reachable": true, + "score": 90 + }, + { + "number": "4444444444", + "carrier": "VERIZON NEW YORK- INC.", + "type": "Land Line", + "tested": true, + "reachable": true, + "score": 85 + } + ], + "litigator": false, + "propertyAddress": { + "houseNumber": "1011", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "zipPlus4": "2507", + "formattedStreet": "Rosegold St", + "streetNoUnit": "1011 Rosegold St", + "hash": "b7bd4cea51b26af459febfbf822c99e2" + }, + "property": { + "address": { + "houseNumber": "1011", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "zipPlus4": "2507", + "hash": "b7bd4cea51b26af459febfbf822c99e2", + "formattedStreet": "Rosegold St", + "streetNoUnit": "1011 Rosegold St" + }, + "owner": { + "name": { + "first": "john", + "last": "doe" + }, + "mailingAddress": { + "houseNumber": "1011", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "formattedStreet": "Rosegold St", + "streetNoUnit": "1011 Rosegold St", + "hash": "b7bd4cea51b26af459febfbf822c99e2", + "zipPlus4": "2507" + } + } + }, + "meta": { + "matched": true, + "error": false + } + } + ], + "meta": { + "apiVersion": "2.28.0", + "performance": { + "totalRequestTime": 1460, + "startTime": "2022-12-30T11:58:24.469Z", + "endTime": "2022-12-30T11:58:25.930Z" + }, + "results": { + "requestCount": 1, + "matchCount": 1, + "noMatchCount": 0, + "errorCount": 0 + }, + "requestId": "NbL5WXZMuBOCW1s" + } + } +} \ No newline at end of file diff --git a/test/fixtures/v3-property-skip-trace.json b/test/fixtures/v3-property-skip-trace.json new file mode 100644 index 0000000..bdd55f9 --- /dev/null +++ b/test/fixtures/v3-property-skip-trace.json @@ -0,0 +1,193 @@ +{ + "status": { + "code": 200, + "text": "OK", + "message": "Success" + }, + "result": { + "data": [ + { + "input": { + "propertyAddress": { + "street": "1011 Rosegold St", + "city": "Franklin Square", + "state": "NY", + "zip": "11010" + } + }, + "property": { + "id": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", + "address": { + "hash": "b7bd4cea51b26af459febfbf822c99e2", + "addressValidity": "Valid", + "fullAddress": "1011 Rosegold St, Franklin Square, NY 11010-2507", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "zipPlus4": "2507" + }, + "mailingAddress": { + "hash": "b7bd4cea51b26af459febfbf822c99e2", + "addressValidity": "Valid", + "fullAddress": "1011 Rosegold St, Franklin Square, NY 11010-2507", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "zipPlus4": "2507" + }, + "owners": [ + { + "name": { + "first": "John", + "last": "Doe", + "full": "John Doe", + "akas": [ + { + "first": "John", + "middle": "Quinn", + "last": "Doe", + "full": "John Quinn Doe", + "rank": 2 + }, + { + "first": "Jhon", + "last": "Doe", + "full": "Jhon Doe", + "rank": 3 + } + ] + } + } + ] + }, + "persons": [ + { + "propertyOwner": true, + "name": { + "first": "John", + "last": "Doe", + "full": "John Doe", + "akas": [ + { + "first": "John", + "middle": "Quinn", + "last": "Doe", + "full": "John Quinn Doe", + "rank": 2 + }, + { + "first": "Jhon", + "last": "Doe", + "full": "Jhon Doe", + "rank": 3 + } + ] + }, + "addresses": [ + { + "hash": "b7bd4cea51b26af459febfbf822c99e2", + "addressValidity": "Valid", + "fullAddress": "1011 Rosegold St, Franklin Square, NY 11010-2507", + "street": "1011 Rosegold St", + "city": "Franklin Square", + "county": "Nassau", + "state": "NY", + "zip": "11010", + "zipPlus4": "2507", + "rank": 1, + "propertyMailingAddress": true + }, + { + "hash": "c8ce5dfa62c37bg560gfcgcg933da0f3", + "addressValidity": "Valid", + "fullAddress": "500 Maple Ave, Hempstead, NY 11550-3210", + "street": "500 Maple Ave", + "city": "Hempstead", + "county": "Nassau", + "state": "NY", + "zip": "11550", + "zipPlus4": "3210", + "rank": 2, + "propertyMailingAddress": false + } + ], + "phones": [ + { + "rank": 1, + "number": "1112223333", + "type": "Mobile", + "carrier": "OMNIPOINT COMMUNICATIONS- INC.", + "tested": true, + "reachable": true, + "dnc": false, + "tcpa": false + }, + { + "rank": 2, + "number": "4445556666", + "type": "Land Line", + "carrier": "VERIZON NEW YORK- INC.", + "tested": false, + "reachable": false, + "dnc": false, + "tcpa": false + }, + { + "rank": 3, + "number": "7778889999", + "type": "Land Line", + "carrier": "VERIZON NEW YORK- INC.", + "tested": true, + "reachable": true, + "dnc": true, + "tcpa": false + }, + { + "rank": 4, + "number": "1011121314", + "type": "Land Line", + "carrier": "VERIZON NEW YORK- INC.", + "tested": true, + "reachable": true, + "dnc": false, + "tcpa": true + } + ], + "emails": [ + { + "rank": 1, + "email": "johndoe@gmail.net", + "tested": true + } + ], + "litigator": false, + "deceased": false, + "dob": "1985-07-21T00:00:00.000Z" + } + ], + "meta": { + "matched": true, + "error": false + } + } + ], + "options": { + "includeTCPABlacklistedPhones": true, + "dateFormat": "iso-date-time" + }, + "meta": { + "apiVersion": "3.1.0", + "results": { + "requestCount": 1, + "matchCount": 1, + "noMatchCount": 0, + "errorCount": 0 + }, + "requestId": "01KESNCCY9751A25KYQYV54ASC" + } + } +} \ No newline at end of file diff --git a/test/helpers.js b/test/helpers.js new file mode 100644 index 0000000..859d2c2 --- /dev/null +++ b/test/helpers.js @@ -0,0 +1,34 @@ +'use strict'; + +const path = require('path'); +const { addBearerToken, handleErrors } = require('../middleware'); + +class ZError extends Error { + constructor(message, code, status) { + super(message); + this.name = 'Error'; + this.code = code; + this.status = status; + } +} +class ExpiredAuthError extends ZError {} +class ThrottledError extends ZError {} + +const fixture = (name) => require(path.join(__dirname, 'fixtures', `${name}.json`)); + +// A minimal stand-in for Zapier's `z` that runs the app's real middleware. +const makeZ = (bundle, respond) => { + const calls = []; + const z = { + errors: { Error: ZError, ExpiredAuthError, ThrottledError }, + request: async (options) => { + const request = addBearerToken({ ...options, headers: { ...(options.headers || {}) } }, z, bundle); + calls.push(request); + const { status = 200, data = {} } = await respond(request); + return handleErrors({ status, data, request }, z); + }, + }; + return { z, calls }; +}; + +module.exports = { makeZ, fixture, ZError, ExpiredAuthError, ThrottledError }; diff --git a/test/modules.test.js b/test/modules.test.js new file mode 100644 index 0000000..388246b --- /dev/null +++ b/test/modules.test.js @@ -0,0 +1,129 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { searches, creates, actionKey } = require('../lib/modules'); +const authentication = require('../authentication'); +const { makeZ, fixture, ZError, ExpiredAuthError, ThrottledError } = require('./helpers'); + +const bundleFor = (inputData) => ({ authData: { api_key: 'test-token' }, inputData }); + +const cases = [ + { key: 'search_properties', fixture: 'property-search', path: '/api/v1/property/search', input: { query: 'Phoenix, AZ', take: '2' } }, + { key: 'lookup_property', fixture: 'property-lookup-all-attributes', path: '/api/v1/property/lookup/all-attributes', input: { identify_by: 'address', street: '1 Main St', city: 'Phoenix', state: 'AZ', zip: '85001' } }, + { key: 'skip_trace', fixture: 'property-skip-trace', path: '/api/v1/property/skip-trace', input: { street: '1011 Rosegold St', city: 'Franklin Square', state: 'NY', zip: '11010' } }, + { key: 'verify_address', fixture: 'address-verify', path: '/api/v1/address/verify', input: { street: '2800 N 24th St', city: 'Phoenix', state: 'AZ', zip: '85008' } }, + { key: 'verify_phone', fixture: 'phone-verification', path: '/api/v1/phone/verification', input: { phone_numbers: ['6462467560'] } }, + { key: 'check_dnc', fixture: 'phone-dnc', path: '/api/v1/phone/dnc', input: { phone_numbers: '6027828692' } }, + { key: 'check_tcpa', fixture: 'phone-tcpa', path: '/api/v1/phone/tcpa', input: { phone_numbers: ['2024561111'] } }, +]; + +for (const c of cases) { + test(`search ${c.key}: one POST with bearer token, returns records`, async () => { + const { z, calls } = makeZ(bundleFor(c.input), async () => ({ data: fixture(c.fixture) })); + const result = await searches[c.key].operation.perform(z, bundleFor(c.input)); + assert.equal(calls.length, 1); + assert.equal(calls[0].method, 'POST'); + assert.equal(calls[0].url, `https://api.batchdata.com${c.path}`); + assert.equal(calls[0].headers.Authorization, 'Bearer test-token'); + assert.ok(Array.isArray(result)); + assert.ok(result.length >= 1, 'expected at least one record'); + }); +} + +for (const c of cases.filter((entry) => entry.key !== 'search_properties')) { + test(`action ${c.key}: returns a single object`, async () => { + const { z } = makeZ(bundleFor(c.input), async () => ({ data: fixture(c.fixture) })); + const result = await creates[actionKey({ key: c.key })].operation.perform(z, bundleFor(c.input)); + assert.ok(result && typeof result === 'object' && !Array.isArray(result)); + if (c.key === 'skip_trace') { + assert.equal(result.matched, true); + assert.ok(result.persons.length >= 1); + } + }); +} + +test('search_properties: attaches count meta to each record and handles count-only', async () => { + const body = fixture('property-search'); + const { z } = makeZ(bundleFor({}), async () => ({ data: body })); + const records = await searches.search_properties.operation.perform(z, bundleFor({ query: 'x' })); + assert.equal(records.length, body.results.properties.length); + assert.equal(records[0].searchMeta.resultsFound, body.results.meta.results.resultsFound); + + const countOnly = { results: { properties: [], meta: { results: { resultCount: 0, resultsFound: 1234 } } } }; + const { z: z2 } = makeZ(bundleFor({}), async () => ({ data: countOnly })); + const only = await searches.search_properties.operation.perform(z2, bundleFor({ query: 'x', take: '0' })); + assert.deepEqual(only, [{ searchMeta: { resultCount: 0, resultsFound: 1234 } }]); +}); + +test('search_properties: sends the expected body', async () => { + const { z, calls } = makeZ(bundleFor({}), async () => ({ data: fixture('property-search') })); + await searches.search_properties.operation.perform(z, bundleFor({ query: 'Phoenix, AZ', quick_lists: ['vacant'], take: '5' })); + assert.deepEqual(calls[0].body, { searchCriteria: { query: 'Phoenix, AZ', quickLists: ['vacant'] }, options: { take: 5 } }); +}); + +test('skip_trace: V3 endpoint and explicit TCPA exclusion', async () => { + const input = { api_version: 'v3', street: '1011 Rosegold St', city: 'Franklin Square', state: 'NY', zip: '11010' }; + const { z, calls } = makeZ(bundleFor(input), async () => ({ data: fixture('v3-property-skip-trace') })); + const records = await searches.skip_trace.operation.perform(z, bundleFor(input)); + assert.equal(calls[0].url, 'https://api.batchdata.com/api/v3/property/skip-trace'); + assert.equal(calls[0].body.options.includeTCPABlacklistedPhones, false); + assert.equal(records[0].apiVersion, 'v3'); +}); + +test('no match returns an empty search result and matched:false action result', async () => { + const empty = { results: { persons: [] } }; + const input = { street: '1 Nowhere' }; + const { z } = makeZ(bundleFor(input), async () => ({ data: empty })); + assert.deepEqual(await searches.skip_trace.operation.perform(z, bundleFor(input)), []); + const action = await creates.skip_trace_action.operation.perform(z, bundleFor(input)); + assert.equal(action.matched, false); + assert.equal(action.personCount, 0); +}); + +test('V1 no-match placeholder entries (meta.matched:false) are not returned as persons', async () => { + const placeholder = { results: { persons: [{ propertyAddress: { street: '1 Nowhere' }, name: {}, phoneNumbers: [], emails: [], meta: { matched: false, error: false } }] } }; + const input = { street: '1 Nowhere', api_version: 'v1' }; + const { z } = makeZ(bundleFor(input), async () => ({ data: placeholder })); + assert.deepEqual(await searches.skip_trace.operation.perform(z, bundleFor(input)), []); + const action = await creates.skip_trace_action.operation.perform(z, bundleFor(input)); + assert.equal(action.matched, false); +}); + +test('invalid input becomes a user-facing z.errors.Error before any request', async () => { + const { z, calls } = makeZ(bundleFor({}), async () => ({ data: {} })); + await assert.rejects( + searches.check_dnc.operation.perform(z, bundleFor({ phone_numbers: '' })), + (error) => error instanceof ZError && /at least one phone/i.test(error.message), + ); + assert.equal(calls.length, 0); +}); + +test('HTTP errors map to Zapier errors', async () => { + const run = async (status) => { + const { z } = makeZ(bundleFor({}), async () => ({ status, data: { status: { code: status, message: 'nope' } } })); + return searches.check_dnc.operation.perform(z, bundleFor({ phone_numbers: '6027828692' })); + }; + await assert.rejects(run(401), (e) => e instanceof ExpiredAuthError); + await assert.rejects(run(403), (e) => e.status === 403 && e.message.includes('support@batchservice.com')); + await assert.rejects(run(429), (e) => e instanceof ThrottledError); + await assert.rejects(run(400), (e) => e.code === 'InvalidInput' && e.message === 'nope'); + await assert.rejects(run(503), (e) => e.status === 503 && !/nope/.test(e.message)); +}); + +test('authentication test: 400 or 2xx is valid; 401/403 is invalid', async () => { + const probe = async (status) => { + const { z, calls } = makeZ(bundleFor({}), async () => ({ status, data: {} })); + const outcome = await authentication.test(z, bundleFor({})); + return { outcome, calls }; + }; + const ok = await probe(400); + assert.deepEqual(ok.outcome, { ok: true }); + assert.deepEqual(ok.calls[0].body, { requests: [] }); + assert.equal(ok.calls[0].url, 'https://api.batchdata.com/api/v1/address/verify'); + assert.equal(ok.calls[0].headers.Authorization, 'Bearer test-token'); + assert.deepEqual((await probe(200)).outcome, { ok: true }); + await assert.rejects(probe(401), (e) => e.status === 401); + await assert.rejects(probe(403), (e) => e.status === 403); + await assert.rejects(probe(500), (e) => e.status === 500); +}); diff --git a/test/structure.test.js b/test/structure.test.js new file mode 100644 index 0000000..00344bf --- /dev/null +++ b/test/structure.test.js @@ -0,0 +1,88 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('fs'); +const path = require('path'); +const { searches, creates } = require('../lib/modules'); +const authentication = require('../authentication'); + +const root = path.join(__dirname, '..'); +const allModules = [...Object.values(searches), ...Object.values(creates)]; + +const get = (obj, key) => { + // Resolve "a__b" and "a[]b" output field keys against a sample. + let current = obj; + for (const part of key.replace(/\[\]/g, '__').split('__')) { + if (Array.isArray(current)) current = current[0]; + if (current === null || current === undefined || typeof current !== 'object') return undefined; + current = current[part]; + } + return current; +}; + +test('module inventory: 16 searches, 15 actions, 4 triggers', () => { + assert.equal(Object.keys(searches).length, 16); + assert.equal(Object.keys(creates).length, 15); + assert.equal(Object.keys(require('../lib/modules').triggers).length, 4); +}); + +test('every module has labels, input fields with keys, and outputFields present in the sample', () => { + for (const module of allModules) { + assert.ok(module.key && module.noun && module.display.label && module.display.description, module.key); + const keys = new Set(); + for (const field of module.operation.inputFields) { + assert.ok(field.key && field.label, `${module.key} field`); + assert.ok(!keys.has(field.key), `${module.key} duplicate field ${field.key}`); + keys.add(field.key); + } + for (const field of module.operation.outputFields) { + assert.notEqual(get(module.operation.sample, field.key), undefined, `${module.key} outputField ${field.key} not in sample`); + } + assert.ok(JSON.stringify(module.operation.sample).length < 5000, `${module.key} sample too large`); + } +}); + +test('no callback fields and no wallet endpoints are exposed', () => { + for (const module of allModules) { + for (const field of module.operation.inputFields) { + assert.ok(!/webhook|callback/i.test(field.key), field.key); + } + } + const source = ['lib/operations.js', 'lib/builders.js', 'lib/execute.js'].map((f) => fs.readFileSync(path.join(root, f), 'utf8')).join('\n'); + assert.ok(!/wallet/i.test(source.replace(/webhookUrl/g, ''))); +}); + +test('billing is disclosed on every module description', () => { + for (const module of allModules) { + assert.match(module.display.description, /bill/i, module.key); + } +}); + +test('skip trace exposes the TCPA toggle, off by default', () => { + const field = searches.skip_trace.operation.inputFields.find((f) => f.key === 'include_tcpa_flagged'); + assert.equal(field.type, 'boolean'); + assert.notEqual(field.default, 'true'); +}); + +test('authentication is a custom API key with a test function', () => { + assert.equal(authentication.type, 'custom'); + assert.equal(authentication.fields[0].key, 'api_key'); + assert.equal(authentication.fields[0].type, 'password'); + assert.equal(typeof authentication.test, 'function'); +}); + +test('repository text never mentions retired or sold product names', () => { + const banned = [/batch\s*leads/i, /batch\s*dialer/i]; + const walk = (dir) => + fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + if (['node_modules', '.git'].includes(entry.name)) return []; + const full = path.join(dir, entry.name); + return entry.isDirectory() ? walk(full) : [full]; + }); + for (const file of walk(root)) { + if (file.endsWith('structure.test.js') || file.includes(`${path.sep}fixtures${path.sep}`)) continue; + const text = fs.readFileSync(file, 'utf8'); + for (const pattern of banned) assert.ok(!pattern.test(text), `${file} matches ${pattern}`); + } +}); diff --git a/test/zapier-app.test.js b/test/zapier-app.test.js new file mode 100644 index 0000000..a729060 --- /dev/null +++ b/test/zapier-app.test.js @@ -0,0 +1,50 @@ +'use strict'; + +// Runs the real app through zapier-platform-core's test harness with nock. +// Skipped automatically when the Zapier packages are not installed. +const test = require('node:test'); +const assert = require('node:assert/strict'); + +let zapier; +let nock; +try { + zapier = require('zapier-platform-core'); + nock = require('nock'); +} catch (error) { + zapier = undefined; +} + +const skip = zapier ? false : 'zapier-platform-core / nock not installed'; + +test('zapier harness: authentication.test succeeds on HTTP 400 and fails on 401', { skip }, async () => { + const App = require('../index'); + const appTester = zapier.createAppTester(App); + const bundle = { authData: { api_key: 'test-token' } }; + + nock('https://api.batchdata.com').post('/api/v1/address/verify', { requests: [] }).reply(400, { status: { code: 400, text: 'Bad Request', message: 'empty' } }); + assert.deepEqual(await appTester(App.authentication.test, bundle), { ok: true }); + + nock('https://api.batchdata.com').post('/api/v1/address/verify').reply(401, { status: { code: 401, text: 'Unauthorized' } }); + await assert.rejects(appTester(App.authentication.test, bundle)); +}); + +test('zapier harness: Find Properties through the app', { skip }, async () => { + const App = require('../index'); + const appTester = zapier.createAppTester(App); + const fixture = require('./fixtures/property-search.json'); + nock('https://api.batchdata.com', { reqheaders: { authorization: 'Bearer test-token' } }) + .post('/api/v1/property/search') + .reply(200, fixture); + const results = await appTester(App.searches.search_properties.operation.perform, { + authData: { api_key: 'test-token' }, + inputData: { query: 'Phoenix, AZ', take: '2' }, + }); + assert.ok(Array.isArray(results) && results.length > 0); +}); + +test('zapier harness: App definition has the expected shape', { skip }, () => { + const App = require('../index'); + assert.equal(Object.keys(App.searches).length, 16); + assert.equal(Object.keys(App.creates).length, 15); + assert.equal(Object.keys(App.triggers).length, 4); +});