diff --git a/.eslintrc.js b/.eslintrc.js index bba3ac53d..221f7a421 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,7 @@ module.exports = { + root: true, extends: ["airbnb-base", "prettier"], - ignorePatterns: [ - "tests/translations/**/*.js", - "uswds*.js" - ], + ignorePatterns: ["tests/translations/**/*.js", "uswds*.js"], rules: { // For imports in the browser, file extensions are always required. "import/extensions": ["error", "always"], @@ -46,6 +44,25 @@ module.exports = { "class-methods-use-this": 0, }, }, + { + files: ["api-interop-layer/**/*.test.js"], + extends: ["airbnb-base", "prettier"], + parserOptions: { ecmaVersion: 2024 }, + rules: { + // This rule disallows using require() on files in devDependencies. But + // for test code, we'll rely on that heavily so we can disable the rule + // in here. + "import/no-extraneous-dependencies": [0], + + // For imports in Node, file extensions are optional and discouraged as + // a matter of practice. + "import/extensions": ["error", "always"], + + // chai provides "empty" expressions, such as `to.be.true` + "no-unused-expressions": "off" + }, + env: { mocha: true }, + }, { files: [ "tests/**/*.js", diff --git a/.github/actions/javascript-lint/action.yml b/.github/actions/javascript-lint/action.yml index fa1407ea4..4cbdae5c9 100644 --- a/.github/actions/javascript-lint/action.yml +++ b/.github/actions/javascript-lint/action.yml @@ -15,10 +15,14 @@ runs: shell: bash run: cd tests/api && npm ci + - name: install api-interop-layer dependencies + shell: bash + run: cd api-interop-layer && npm ci + - name: add problem matcher shell: bash run: echo "::add-matcher::${{ github.workspace }}/.github/workflows/problem-matcher-eslint.json" - name: run eslint shell: bash - run: npm run js-lint \ No newline at end of file + run: npm run js-lint diff --git a/.github/actions/setup-site/action.yml b/.github/actions/setup-site/action.yml index 8dba3f9d5..7178c2035 100644 --- a/.github/actions/setup-site/action.yml +++ b/.github/actions/setup-site/action.yml @@ -51,3 +51,11 @@ runs: - name: clear the Drupal cache shell: bash run: make cc + + # Restart the interop layer once the database is loaded. It immediately + # tries to run some queries, but if the database isn't ready, it'll crash + # and die. + - name: restart the interop layer + shell: bash + run: | + docker compose restart api-interop-layer \ No newline at end of file diff --git a/.github/workflows/code-standards.yaml b/.github/workflows/code-standards.yaml index cf485eac1..30dcafb9e 100644 --- a/.github/workflows/code-standards.yaml +++ b/.github/workflows/code-standards.yaml @@ -101,6 +101,28 @@ jobs: if: needs.should-test.outputs.yes == 'true' uses: ./.github/actions/style-lint + interop-layer-unit-tests: + name: interop layer unit tests + runs-on: ubuntu-latest + needs: [should-test] + defaults: + run: + working-directory: ./api-interop-layer/ + + steps: + - name: checkout + if: needs.should-test.outputs.yes == 'true' + uses: actions/checkout@v4 + - name: setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + - name: install dependencies + run: npm ci + - name: test + run: npm test + build-drupal-image: name: build Drupal image runs-on: ubuntu-latest diff --git a/api-interop-layer/.c8rc.json b/api-interop-layer/.c8rc.json new file mode 100644 index 000000000..17d329238 --- /dev/null +++ b/api-interop-layer/.c8rc.json @@ -0,0 +1,6 @@ +{ + "all": true, + "reporter": ["html"], + "exclude": ["node_modules/**", "coverage", "**/*.test.js"], + "require": ["mocha.js"] +} diff --git a/api-interop-layer/.gitignore b/api-interop-layer/.gitignore new file mode 100644 index 000000000..be2736575 --- /dev/null +++ b/api-interop-layer/.gitignore @@ -0,0 +1,2 @@ +.nyc_output +coverage diff --git a/api-interop-layer/Dockerfile b/api-interop-layer/Dockerfile new file mode 100644 index 000000000..c4ff3d297 --- /dev/null +++ b/api-interop-layer/Dockerfile @@ -0,0 +1,11 @@ +FROM node:20 + +RUN mkdir /app +WORKDIR /app + +ADD ./package.json . +ADD ./package-lock.json . + +RUN npm ci + +CMD npm start \ No newline at end of file diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/00_EndToEndBase.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/00_EndToEndBase.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/00_EndToEndBase.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/00_EndToEndBase.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/01_Schema.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/01_Schema.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/01_Schema.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/01_Schema.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/AlertInfo.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Alerts/AlertInfo.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/AlertInfo.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Alerts/AlertInfo.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/Alerts.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Alerts/Alerts.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/Alerts.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Alerts/Alerts.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/Filter.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Alerts/Filter.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Alerts/Filter.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Alerts/Filter.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/DailyForecast/DailyForecast.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/DailyForecast/DailyForecast.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/DailyForecast/DailyForecast.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/DailyForecast/DailyForecast.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/DailyForecast/HourlyData.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/DailyForecast/HourlyData.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/DailyForecast/HourlyData.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/DailyForecast/HourlyData.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/Alerts.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/Alerts.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/Alerts.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/Alerts.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/Filters.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/Filters.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/Filters.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/Filters.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/HourlyForecast.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/HourlyForecast.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/HourlyForecast/HourlyForecast.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/HourlyForecast/HourlyForecast.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/FeelsLike.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Observations/FeelsLike.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/FeelsLike.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Observations/FeelsLike.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/InvalidObservations.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Observations/InvalidObservations.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/InvalidObservations.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Observations/InvalidObservations.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/Observations.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Observations/Observations.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/Observations.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Observations/Observations.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/Wind.php.test b/api-interop-layer/_tests_to_copy/EndToEnd/Observations/Wind.php.test similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/Observations/Wind.php.test rename to api-interop-layer/_tests_to_copy/EndToEnd/Observations/Wind.php.test diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/alertInfo.json b/api-interop-layer/_tests_to_copy/EndToEnd/schemas/alertInfo.json similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/alertInfo.json rename to api-interop-layer/_tests_to_copy/EndToEnd/schemas/alertInfo.json diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/alerts.json b/api-interop-layer/_tests_to_copy/EndToEnd/schemas/alerts.json similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/alerts.json rename to api-interop-layer/_tests_to_copy/EndToEnd/schemas/alerts.json diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/daily.json b/api-interop-layer/_tests_to_copy/EndToEnd/schemas/daily.json similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/daily.json rename to api-interop-layer/_tests_to_copy/EndToEnd/schemas/daily.json diff --git a/web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/hourly.json b/api-interop-layer/_tests_to_copy/EndToEnd/schemas/hourly.json similarity index 100% rename from web/modules/weather_blocks/src/Plugin/Block/Test/EndToEnd/schemas/hourly.json rename to api-interop-layer/_tests_to_copy/EndToEnd/schemas/hourly.json diff --git a/web/modules/weather_data/src/Service/Test/AFDParser.php.test b/api-interop-layer/_tests_to_copy/Test/AFDParser.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/AFDParser.php.test rename to api-interop-layer/_tests_to_copy/Test/AFDParser.php.test diff --git a/web/modules/weather_data/src/Service/Test/AlertUtility.php.test b/api-interop-layer/_tests_to_copy/Test/AlertUtility.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/AlertUtility.php.test rename to api-interop-layer/_tests_to_copy/Test/AlertUtility.php.test diff --git a/web/modules/weather_data/src/Service/Test/DataLayer.php.test b/api-interop-layer/_tests_to_copy/Test/DataLayer.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/DataLayer.php.test rename to api-interop-layer/_tests_to_copy/Test/DataLayer.php.test diff --git a/web/modules/weather_data/src/Service/Test/NewRelicMetrics.php.test b/api-interop-layer/_tests_to_copy/Test/NewRelicMetrics.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/NewRelicMetrics.php.test rename to api-interop-layer/_tests_to_copy/Test/NewRelicMetrics.php.test diff --git a/web/modules/weather_data/src/Service/Test/Satellite.php.test b/api-interop-layer/_tests_to_copy/Test/Satellite.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/Satellite.php.test rename to api-interop-layer/_tests_to_copy/Test/Satellite.php.test diff --git a/web/modules/weather_data/src/Service/Test/SpatialUtility.php.test b/api-interop-layer/_tests_to_copy/Test/SpatialUtility.php.test similarity index 100% rename from web/modules/weather_data/src/Service/Test/SpatialUtility.php.test rename to api-interop-layer/_tests_to_copy/Test/SpatialUtility.php.test diff --git a/api-interop-layer/data/alerts/geometry.js b/api-interop-layer/data/alerts/geometry.js new file mode 100644 index 000000000..3783e425a --- /dev/null +++ b/api-interop-layer/data/alerts/geometry.js @@ -0,0 +1,72 @@ +const unwindGeometryCollection = (geojson, parentIsCollection = false) => { + if (geojson.type === "GeometryCollection") { + const geometries = geojson.geometries.flatMap((geometry) => + unwindGeometryCollection(geometry, true), + ); + if (parentIsCollection) { + return geometries; + } + + geojson.geometries = geometries; + return geojson; + } + + return geojson; +}; + +export const generateAlertGeometry = async (db, rawAlert) => { + // if the alert already has geometry, nothing to do + if (rawAlert.geometry) { + return unwindGeometryCollection(rawAlert.geometry); + } + + // if we have affected zones, generate a geometry from zones + const zones = rawAlert.properties.affectedZones; + if (Array.isArray(zones) && zones.length > 0) { + const sql = ` + SELECT ST_ASGEOJSON( + ST_SIMPLIFY( + ST_SRID( + ST_COLLECT(shape), + 0 + ), + 0.003 + ) + ) + AS shape + FROM weathergov_geo_zones + WHERE id IN (${zones.map(() => "?").join(",")})`; + const [{ shape }] = await db.query(sql, zones); + if (shape) { + return unwindGeometryCollection(shape); + } + } + + // if all geocodes are the same, generate a geometry from geocodes + const counties = rawAlert.properties.geocode?.SAME; + if (Array.isArray(counties) && counties.length > 0) { + const sql = ` + SELECT ST_ASGEOJSON( + ST_SIMPLIFY( + ST_SRID( + ST_COLLECT(shape), + 0 + ), + 0.003 + ) + ) + AS shape + FROM weathergov_geo_counties + WHERE countyFips IN (${counties.map((c) => `'${c.slice(1)}'`).join(",")})`; + const [{ shape }] = await db.query(sql); + + if (shape) { + return unwindGeometryCollection(shape); + } + } + + // we cannot generate a geometry. + return null; +} + +export default { generateAlertGeometry }; diff --git a/api-interop-layer/data/alerts/geometry.test.js b/api-interop-layer/data/alerts/geometry.test.js new file mode 100644 index 000000000..185801557 --- /dev/null +++ b/api-interop-layer/data/alerts/geometry.test.js @@ -0,0 +1,100 @@ +import sinon from "sinon"; +import { expect } from "chai"; +import * as mariadb from "mariadb"; +import { generateAlertGeometry } from "./geometry.js"; + +describe("alert geometries", () => { + const sandbox = sinon.createSandbox(); + const db = { + query: sandbox.stub(), + end: () => Promise.resolve(), + }; + + // Do this before everything, so it'll happen before any describe blocks run, + // otherwise the connection creation won't be stubbed when the script is first + // imported below. + before(() => { + mariadb.default.createConnection.resolves(db); + }); + + beforeEach(() => { + sandbox.resetBehavior(); + sandbox.resetHistory(); + }); + + it("returns an alert with a geometry as-is", async () => { + const rawAlert = { + geometry: "existing geometry", + }; + + const geometry = await generateAlertGeometry(db, rawAlert); + expect(geometry).to.equal("existing geometry"); + }); + + it("autogenerates a geometry from affected zones", async () => { + const affectedZones = ["zone 1", "zone 2", "zone 3"]; + const rawAlert = { + geometry: false, + properties: { + affectedZones, + }, + }; + const query = `SELECT ST_ASGEOJSON( + ST_SIMPLIFY( + ST_SRID( + ST_COLLECT(shape), + 0 + ), + 0.003 + ) + ) + AS shape + FROM weathergov_geo_zones + WHERE id IN (?,?,?)`; + db.query.withArgs(sinon.match(query), sinon.match.same(affectedZones)) + .resolves([{ shape: { combined: "zones" } }]); + + const geometry = await generateAlertGeometry(db, rawAlert); + expect(geometry).to.eql({ combined: "zones" }); + }); + + it("autogenerates a geometry from same geocodes if no zones are present", async () => { + const rawAlert = { + geometry: false, + properties: { + geocode: { + // SAME code is FIPS code with a leading zero. The leading + // zero gets stripped out, so we need to include it here + // so we get what we expect later. + "SAME": ["0county 1", "0county 2", "0county 3"], + }, + }, + }; + const query = `SELECT ST_ASGEOJSON( + ST_SIMPLIFY( + ST_SRID( + ST_COLLECT(shape), + 0 + ), + 0.003 + ) + ) + AS shape + FROM weathergov_geo_counties + WHERE countyFips IN ('county 1','county 2','county 3')`; + db.query.withArgs(sinon.match(query)).resolves([{ shape: { combined: "county" } }]); + + const geometry = await generateAlertGeometry(db, rawAlert); + expect(geometry).to.eql({ combined: "county" }); + }); + + it("returns null geometry if no zones or different geocodes are present", async () => { + const rawAlert = { + geometry: false, + properties: {}, + }; + + const geometry = await generateAlertGeometry(db, rawAlert); + expect(geometry).to.be.null; + }); +}); diff --git a/api-interop-layer/data/alerts/index.js b/api-interop-layer/data/alerts/index.js new file mode 100644 index 000000000..45af639e2 --- /dev/null +++ b/api-interop-layer/data/alerts/index.js @@ -0,0 +1,222 @@ +import dayjs from "../../util/day.js"; +import { fetchAPIJson } from "../../util/fetch.js"; +import { createLogger } from "../../util/monitoring/index.js"; +import paragraphSquash from "../../util/paragraphSquash.js"; +import { openDatabase } from "../db.js"; +import alertKinds from "./kinds.js"; +import { + parseDescription, + parseDuration, + parseLocations, +} from "./parse/index.js"; +import sort from "./sort.js"; +import { generateAlertGeometry } from "./geometry.js"; + +const logger = createLogger("alerts"); +const cachedAlerts = []; + +const metadata = { + error: false, + updated: null, +}; + +export const updateAlerts = async () => { + logger.verbose("updating alerts"); + const rawAlerts = await fetchAPIJson("/alerts/active?status=actual").then( + ({ error, features }) => { + if (error) { + return { error: true }; + } + return features.map((feature) => { + Object.keys(feature.properties).forEach((key) => { + const value = feature.properties[key]; + const date = dayjs(value); + + // The day.js parser looks for ANY ISO-8601 valid text in the string + // and attempts to convert it. As a result, some harmless text ends + // up getting picked up as valid dates. For example: + // + // PLEASE CALL 5-1-1 + // + // day.js parses that to May 1, 2001. That is obviously not correct. + // But we know all of our timestamps are *only* ISO8601 strings with + // full date information, so we can check that the string starts with + // a YYYY-MM-DD format as well as parsing to a valid day.js object. + if (date.isValid() && /^\d{4}-\d{2}-\d{2}/.test(value)) { + feature.properties[key] = date; + } + }); + + return feature; + }); + }, + ); + + if (rawAlerts.error) { + metadata.error = true; + return metadata; + } + + const db = await openDatabase(); + + logger.verbose(`got ${rawAlerts.length} alerts`); + const alerts = []; + + for await (const rawAlert of rawAlerts) { + const alert = { + metadata: alertKinds.get(rawAlert.properties.event.toLowerCase()), + }; + + // If we get an alert type that we don't have a mapping for, capture that in + // logs. Default to a land alert with the lowest priority so we can at least + // still show it to users. + if (!alert.metadata) { + logger.warn(`Unknown alert type: ${rawAlert.properties.event}`); + alert.metadata = { + level: { priority: Number.MAX_SAFE_INTEGER, text: "other" }, + kind: "land", + priority: Number.MAX_SAFE_INTEGER, + }; + } + + // For now, we're only ingesting land alerts. Once we get into marine + // alerts, we'll revisit this, but since we don't know what the use case + // will be in the future, we'll just leave them out entirely for now. + if (!alert.metadata || alert.metadata.kind !== "land") { + logger.verbose( + `ignoring "${rawAlert.properties.event}" - not a land alert`, + ); + continue; // eslint-disable-line no-continue + } + + alerts.push(alert); + + alert.id = alerts.length; + if (rawAlert.properties.id.startsWith("urn:oid:2.49.0.1.840")) { + alert.id = rawAlert.properties.id.split(".").slice(-3).join("_"); + } + + alert.event = rawAlert.properties.event; + + const { locations, description } = parseLocations( + rawAlert.properties.description, + ); + + alert.sender = rawAlert.properties.senderName; + alert.locations = locations; + alert.description = parseDescription(description); + alert.instruction = paragraphSquash(rawAlert.properties.instruction); + + alert.area = paragraphSquash(rawAlert.properties.areaDesc) + ?.split(";") + .map((line) => line.trim()); + + alert.sent = rawAlert.properties.sent; + alert.effective = rawAlert.properties.effective; + // Sometimes onset is missing. In that case, use the starting time. + alert.onset = rawAlert.properties.onset ?? alert.effective; + alert.expires = rawAlert.properties.expires; + alert.ends = rawAlert.properties.ends; + + // If an alert has an ending time, that is when the alert is over. If the + // alert doesn't have an end time, try using the expiration time. If that's + // also missing, then the alert is indefinite. + alert.finish = alert.ends; + if (!alert.finish) { + alert.finish = alert.expires; + } + if (!alert.finish) { + alert.finish = null; + } + + alert.geometry = await generateAlertGeometry(db, rawAlert); + } + + alerts.sort(sort); + + cachedAlerts.length = 0; + cachedAlerts.push(...alerts); + metadata.updated = dayjs(); + metadata.error = false; + + await db.end(); + + logger.verbose(`storing ${cachedAlerts.length} alerts`); + return cachedAlerts; +}; + +updateAlerts(); + +// Update the alerts every 30 seconds. They are cached upstream for about a +// minute, so there's no need to try much more often than this. +// +// Tell Node not to keep a reference to this timer. Otherwise, Node will think +// the process is still active forever. This is not an issue in production, +// where we don't want the process to end, but in testing, we want the process +// to quit cleanly when the Mocha tests are finished. +setInterval(updateAlerts, 30_000).unref(); + +export default async ({ grid, point, place: { timezone } }) => { + let geometry; + + if (grid.error) { + logger.warn("no grid; falling back to point"); + logger.verbose(`getting alerts for ${point.latitude}, ${point.longitude}`); + geometry = { + type: "Feature", + properties: {}, + geometry: { + type: "Point", + coordinates: [point.longitude, point.latitude], + }, + }; + } else { + logger.verbose(`getting alerts for ${grid.wfo} ${grid.x} ${grid.y}`); + geometry = grid.geometry; + } + const location = `ST_GEOMFROMGEOJSON('${JSON.stringify(geometry)}')`; + const db = await openDatabase(); + + const alerts = []; + for await (const alert of cachedAlerts) { + if (alert.geometry) { + const sql = ` + SELECT ST_INTERSECTS( + ${location}, + ST_GEOMFROMGEOJSON('${JSON.stringify(alert.geometry)}') + ) as yes`; + const [{ yes }] = await db.query(sql); + + if (yes > 0) { + alert.duration = parseDuration(alert, timezone); + alert.timing = { + start: alert.onset.tz(timezone).format("dddd MM/DD h:mm A __"), + end: alert.finish?.tz(timezone).format("dddd MM/DD h:mm A __"), + }; + + logger.verbose(`has ${alert.event}`); + alerts.push(alert); + } + } + } + const highest = alerts + .map(({ metadata: { level } }) => level) + .sort((a, b) => { + const priorityA = a.priority; + const priorityB = b.priority; + + return priorityB - priorityA; + }) + .pop(); + + await db.end(); + logger.verbose(`got ${alerts.length} alerts; highest is ${highest?.text}`); + + // Clone the cached stuff so external entities can't overwrite it. Also so + // external references aren't modified unexpectedly mid-request. + return { + items: [...alerts], + highestLevel: highest?.text, + metadata: { ...metadata }, + }; +}; diff --git a/api-interop-layer/data/alerts/index.test.js b/api-interop-layer/data/alerts/index.test.js new file mode 100644 index 000000000..b9dab1ed7 --- /dev/null +++ b/api-interop-layer/data/alerts/index.test.js @@ -0,0 +1,368 @@ +import sinon from "sinon"; +import { expect } from "chai"; +import * as mariadb from "mariadb"; + +describe("alert data module", () => { + const sandbox = sinon.createSandbox(); + const db = { + query: sandbox.stub(), + end: () => Promise.resolve(), + }; + + const response = { status: 200, json: sandbox.stub() }; + + // Do this before everything, so it'll happen before any describe blocks run, + // otherwise the connection creation won't be stubbed when the script is first + // imported below. + before(() => { + mariadb.default.createConnection.resolves(db); + }); + + beforeEach(() => { + response.status = 200; + sandbox.resetBehavior(); + sandbox.resetHistory(); + + fetch.resolves(response); + db.query.resolves([{ yes: 1 }]); + }); + + it("fetches alerts when the module is loaded", async () => { + response.json.resolves({ features: [] }); + await import("./index.js"); + + expect( + fetch.calledWith("https://api.weather.gov/alerts/active?status=actual"), + ).to.be.true; + }); + + describe("after initial setup", () => { + let alertHandler; + before(async () => { + alertHandler = await import("./index.js"); + }); + + describe("error handling", () => { + beforeEach(async () => { + response.json.resolves({ + features: [ + { + geometry: "geo", + properties: { + id: "one", + event: "Severe Thunderstorm Warning", + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + expires: new Date().toISOString(), + ends: new Date().toISOString(), + }, + }, + ], + }); + + await alertHandler.updateAlerts(); + + response.json.resetBehavior(); + response.json.resetHistory(); + }); + + it("updates metadata but does NOT update alerts if there is an error", async () => { + const expected = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + response.status = 400; + response.json.resolves({ no: "errors" }); + await alertHandler.updateAlerts(); + + const actual = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(expected.metadata.error).to.equal(false); + expect(actual.metadata.error).to.equal(true); + + // We've validated the error flag was changed. Now validate that the + // rest of returned data is the same. + delete expected.metadata.error; + delete actual.metadata.error; + expect(actual).to.eql(expected); + }); + + it("clears the error flag after a successful update", async () => { + response.status = 400; + response.json.resolves({ no: "errors" }); + await alertHandler.updateAlerts(); + + const initial = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + response.status = 200; + response.json.resolves({ features: [] }); + await alertHandler.updateAlerts(); + + const after = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(initial.metadata.error).to.equal(true); + expect(after.metadata.error).to.equal(false); + + expect(initial.items.length).to.equal(1); + expect(after.items.length).to.equal(0); + }); + }); + + describe("the main alert function", () => { + it("does not store alerts that are not land-based", async () => { + const shared = { + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + expires: new Date().toISOString(), + ends: new Date().toISOString(), + }; + + response.json.resolves({ + features: [ + { + geometry: "geo", + properties: { + id: "one", + event: "Severe Thunderstorm Warning", + ...shared, + }, + }, + { + geometry: "geo", + properties: { + id: "two", + event: "Special Marine Warning", + ...shared, + }, + }, + { + geometry: "geo", + properties: { + id: "three", + event: "Typhoon Warning", + ...shared, + }, + }, + { + geometry: "geo", + properties: { + id: "four", + event: "avalanche warning", + ...shared, + }, + }, + ], + }); + + // This is the doohickey that actually parses, filters, and sorts the + // alerts. We need to run it first. + await alertHandler.updateAlerts(); + + const alerts = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + const kinds = alerts.items.map(({ metadata: { kind } }) => kind); + expect(kinds).to.have.same.members(["land", "land", "land"]); + }); + + it("derives an alert ID", async () => { + response.json.resolves({ + features: [ + { + geometry: "geo", + properties: { + id: "urn:oid:2.49.0.1.840.part1.part2.part3", + event: "Severe Thunderstorm Warning", + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + expires: new Date().toISOString(), + ends: new Date().toISOString(), + }, + }, + ], + }); + + await alertHandler.updateAlerts(); + + const alerts = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(alerts.items[0].id).to.equal("part1_part2_part3"); + }); + + it("passes unknown alert types straight through", async () => { + response.json.resolves({ + features: [ + { + geometry: "geo", + properties: { + id: "one", + event: "Severe Meatballstorm Warning", + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + expires: new Date().toISOString(), + ends: new Date().toISOString(), + }, + }, + ], + }); + + await alertHandler.updateAlerts(); + + const { + items: [{ event, metadata }], + } = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(event).to.equal("Severe Meatballstorm Warning"); + expect(metadata).to.eql({ + level: { + priority: Number.MAX_SAFE_INTEGER, + text: "other", + }, + kind: "land", + priority: Number.MAX_SAFE_INTEGER, + }); + }); + + describe("correctly sets the highest alert level", () => { + const getAlert = (type) => ({ + geometry: "geo", + properties: { + id: "one", + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + expires: new Date().toISOString(), + ends: new Date().toISOString(), + event: type, + }, + }); + + it("when one of them is a warning", async () => { + response.json.resolves({ + features: [ + getAlert("Severe Thunderstorm Warning"), + getAlert("Severe Thunderstorm Watch"), + getAlert("severe weather statement"), + getAlert("avalanche advisory"), + ], + }); + + await alertHandler.updateAlerts(); + + const { highestLevel: actual } = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(actual).to.equal("warning"); + }); + + it("when there are no warnings, but at least one watch", async () => { + response.json.resolves({ + features: [ + getAlert("Severe Thunderstorm Watch"), + getAlert("severe weather statement"), + getAlert("avalanche advisory"), + ], + }); + + await alertHandler.updateAlerts(); + + const { highestLevel: actual } = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(actual).to.equal("watch"); + }); + + it("when there are no warnings or watches", async () => { + response.json.resolves({ + features: [ + getAlert("severe weather statement"), + getAlert("avalanche advisory"), + ], + }); + + await alertHandler.updateAlerts(); + + const { highestLevel: actual } = await alertHandler.default({ + grid: { geometry: [] }, + place: { timezone: "America/Chicago" }, + }); + + expect(actual).to.equal("other"); + }); + }); + }); + + describe("computes the alert finish time", () => { + const alertResponse = { + features: [ + { + geometry: "geo", + properties: { + id: "one", + event: "Severe Thunderstorm Warning", + sent: new Date().toISOString(), + effective: new Date().toISOString(), + onset: new Date().toISOString(), + }, + }, + ], + }; + + it("if the alert has an ends property", async () => { + alertResponse.features[0].properties.ends = "2430-04-03T12:00:00Z"; + alertResponse.features[0].properties.expires = null; + response.json.resolves(alertResponse); + + const [{ ends, finish }] = await alertHandler.updateAlerts(); + + expect(ends.isSame(finish)).to.be.true; + }); + + it("if the alert does not have an ends property but does have expires", async () => { + alertResponse.features[0].properties.ends = null; + alertResponse.features[0].properties.expires = "2430-04-03T12:00:00Z"; + response.json.resolves(alertResponse); + + const [{ expires, finish }] = await alertHandler.updateAlerts(); + + expect(expires.isSame(finish)).to.be.true; + }); + + it("if the alert has neither ends nor expires properties", async () => { + alertResponse.features[0].properties.ends = null; + alertResponse.features[0].properties.expires = null; + response.json.resolves(alertResponse); + + const [{ finish }] = await alertHandler.updateAlerts(); + + expect(finish).to.be.null; + }); + }); + }); +}); diff --git a/api-interop-layer/data/alerts/kinds.js b/api-interop-layer/data/alerts/kinds.js new file mode 100644 index 000000000..683d519f1 --- /dev/null +++ b/api-interop-layer/data/alerts/kinds.js @@ -0,0 +1,1032 @@ +const ALERT_KIND = { + LAND: "land", + MARINE: "marine", + OTHER: "other", +}; + +const ALERT_LEVEL = { + WARNING: { + priority: 0, + text: "warning", + }, + + WATCH: { + priority: 128, + text: "watch", + }, + + OTHER: { + priority: 2048, + text: "other", + }, +}; + +const alertTypes = new Map([ + // Priorities are spaced at intervals of powers of two so that new + // alerts can be inserted exactly in the middle of any existing alerts + // without needing to reorder all of the other alerts. + [ + "tsunami warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 0, + }, + ], + [ + "tornado warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 1024, + }, + ], + [ + "extreme wind warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 2048, + }, + ], + [ + "severe thunderstorm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 3072, + }, + ], + [ + "flash flood warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 4096, + }, + ], + [ + "flash flood statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 5120, + }, + ], + [ + "severe weather statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 6144, + }, + ], + [ + "shelter in place warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 7168, + }, + ], + [ + "evacuation immediate", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 8192, + }, + ], + [ + "civil danger warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 9216, + }, + ], + [ + "nuclear power plant warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 10240, + }, + ], + [ + "radiological hazard warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 11264, + }, + ], + [ + "hazardous materials warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 12288, + }, + ], + [ + "fire warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 13312, + }, + ], + [ + "civil emergency message", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 14336, + }, + ], + [ + "law enforcement warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 15360, + }, + ], + [ + "storm surge warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 16384, + }, + ], + [ + "hurricane force wind warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 17408, + }, + ], + [ + "hurricane warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 18432, + }, + ], + [ + "typhoon warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 19456, + }, + ], + [ + "special marine warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 20480, + }, + ], + [ + "blizzard warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 21504, + }, + ], + [ + "snow squall warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 22528, + }, + ], + [ + "ice storm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 23552, + }, + ], + [ + "winter storm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 24576, + }, + ], + [ + "high wind warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 25600, + }, + ], + [ + "tropical storm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 26624, + }, + ], + [ + "storm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 27648, + }, + ], + [ + "tsunami advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 28672, + }, + ], + [ + "tsunami watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 29696, + }, + ], + [ + "avalanche warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 30720, + }, + ], + [ + "earthquake warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 31744, + }, + ], + [ + "volcano warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 32768, + }, + ], + [ + "ashfall warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 33792, + }, + ], + [ + "coastal flood warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 34816, + }, + ], + [ + "lakeshore flood warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 35840, + }, + ], + [ + "flood warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 36864, + }, + ], + [ + "high surf warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 37888, + }, + ], + [ + "dust storm warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 38912, + }, + ], + [ + "blowing dust warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.OTHER, + priority: 39936, + }, + ], + [ + "lake effect snow warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 40960, + }, + ], + [ + "excessive heat warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 41984, + }, + ], + [ + "tornado watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 43008, + }, + ], + [ + "severe thunderstorm watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 44032, + }, + ], + [ + "flash flood watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 45056, + }, + ], + [ + "gale warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 46080, + }, + ], + [ + "flood statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 47104, + }, + ], + [ + "wind chill warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 48128, + }, + ], + [ + "extreme cold warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 49152, + }, + ], + [ + "hard freeze warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 50176, + }, + ], + [ + "freeze warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 51200, + }, + ], + [ + "red flag warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.LAND, + priority: 52224, + }, + ], + [ + "storm surge watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 53248, + }, + ], + [ + "hurricane watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 54272, + }, + ], + [ + "hurricane force wind watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 55296, + }, + ], + [ + "typhoon watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 56320, + }, + ], + [ + "tropical storm watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 57344, + }, + ], + [ + "storm watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 58368, + }, + ], + [ + "hurricane local statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 59392, + }, + ], + [ + "typhoon local statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 60416, + }, + ], + [ + "tropical storm local statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 61440, + }, + ], + [ + "tropical depression local statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 62464, + }, + ], + [ + "avalanche advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 63488, + }, + ], + [ + "winter weather advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 64512, + }, + ], + [ + "wind chill advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 65536, + }, + ], + [ + "heat advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 66560, + }, + ], + [ + "urban and small stream flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 67584, + }, + ], + [ + "small stream flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 68608, + }, + ], + [ + "arroyo and small stream flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 69632, + }, + ], + [ + "flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 70656, + }, + ], + [ + "hydrologic advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 71680, + }, + ], + [ + "lakeshore flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 72704, + }, + ], + [ + "coastal flood advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 73728, + }, + ], + [ + "high surf advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 74752, + }, + ], + [ + "heavy freezing spray warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 75776, + }, + ], + [ + "dense fog advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 76800, + }, + ], + [ + "dense smoke advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 77824, + }, + ], + [ + "small craft advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.MARINE, + priority: 78848, + }, + ], + [ + "brisk wind advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.MARINE, + priority: 79872, + }, + ], + [ + "hazardous seas warning", + { + level: ALERT_LEVEL.WARNING, + kind: ALERT_KIND.MARINE, + priority: 80896, + }, + ], + [ + "dust advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.OTHER, + priority: 81920, + }, + ], + [ + "blowing dust advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 82944, + }, + ], + [ + "lake wind advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 83968, + }, + ], + [ + "wind advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 84992, + }, + ], + [ + "frost advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 86016, + }, + ], + [ + "ashfall advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 87040, + }, + ], + [ + "freezing fog advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 88064, + }, + ], + [ + "freezing spray advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.MARINE, + priority: 89088, + }, + ], + [ + "low water advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.MARINE, + priority: 90112, + }, + ], + [ + "local area emergency", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 91136, + }, + ], + [ + "avalanche watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 92160, + }, + ], + [ + "blizzard watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 93184, + }, + ], + [ + "rip current statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 94208, + }, + ], + [ + "beach hazards statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 95232, + }, + ], + [ + "gale watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 96256, + }, + ], + [ + "winter storm watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 97280, + }, + ], + [ + "hazardous seas watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 98304, + }, + ], + [ + "heavy freezing spray watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 99328, + }, + ], + [ + "coastal flood watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 100352, + }, + ], + [ + "lakeshore flood watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 101376, + }, + ], + [ + "flood watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 102400, + }, + ], + [ + "high wind watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 103424, + }, + ], + [ + "excessive heat watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 104448, + }, + ], + [ + "extreme cold watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 105472, + }, + ], + [ + "wind chill watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 106496, + }, + ], + [ + "lake effect snow watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 107520, + }, + ], + [ + "hard freeze watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.MARINE, + priority: 108544, + }, + ], + [ + "freeze watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 109568, + }, + ], + [ + "fire weather watch", + { + level: ALERT_LEVEL.WATCH, + kind: ALERT_KIND.LAND, + priority: 110592, + }, + ], + [ + "extreme fire danger", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 111616, + }, + ], + [ + "911 telephone outage", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 112640, + }, + ], + [ + "coastal flood statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 113664, + }, + ], + [ + "lakeshore flood statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 114688, + }, + ], + [ + "special weather statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 115712, + }, + ], + [ + "marine weather statement", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.MARINE, + priority: 116736, + }, + ], + [ + "air quality alert", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 117760, + }, + ], + [ + "air stagnation advisory", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 118784, + }, + ], + [ + "hazardous weather outlook", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 119808, + }, + ], + [ + "hydrologic outlook", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 120832, + }, + ], + [ + "short term forecast", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 121856, + }, + ], + [ + "administrative message", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 122880, + }, + ], + [ + "test", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 123904, + }, + ], + [ + "child abduction emergency", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.LAND, + priority: 124928, + }, + ], + [ + "blue alert", + { + level: ALERT_LEVEL.OTHER, + kind: ALERT_KIND.OTHER, + priority: 125952, + }, + ], +]); + +export default alertTypes; + +export const rest = () => { + const output = [...alertTypes.entries()] + .sort(([, { priority: a }], [, { priority: b }]) => a - b) + .map(([name, metadata]) => ({ + name, + kind: metadata.kind, + })); + return output; +}; diff --git a/api-interop-layer/data/alerts/parse/description.js b/api-interop-layer/data/alerts/parse/description.js new file mode 100644 index 000000000..8c4aa6d3b --- /dev/null +++ b/api-interop-layer/data/alerts/parse/description.js @@ -0,0 +1,107 @@ +import paragraphSquash from "../../../util/paragraphSquash.js"; + +export const extractUrls = (str) => { + const regex = /https:\/\/[A-Za-z0-9\-._~:?#[\]@!$]+(\/[\S]+|$)\b/gi; + + const match = str.match(regex); + + // If there are any URL matches... + if (match) { + // Only keep URLs that are .gov and do not have username or password + // components. + const urls = match + .map((s) => new URL(s)) + .filter((url) => { + if (url.username || url.password || !url.hostname.endsWith(".gov")) { + return false; + } + return true; + }); + + // If there aren't any such valid URLs, we're done. + if (urls.length === 0) { + return false; + } + + return urls.map((url) => { + const internal = /\.?weather\.gov$/.test(url.hostname); + return { + type: "link", + url: url.href, + external: !internal, + }; + }); + } + return false; +}; + +const getParagraphNodesForString = (str) => { + const links = extractUrls(str); + if (!links) { + return [{ type: "text", content: str }]; + } + + const nodes = []; + let current = str; + for (const link of links) { + const position = current.indexOf(link.url); + const text = current.slice(0, position); + + nodes.push({ type: "text", content: text }, link); + + current = current.slice(position + link.url.length); + } + + if (current && current.length > 0) { + nodes.push({ type: "text", content: current }); + } + + return nodes; +}; + +export const parseDescription = (description) => { + if (!description) { + return [{ type: "paragraph", nodes: [] }]; + } + + const blocks = paragraphSquash(description); + + const nodes = blocks + .split(/\r\n|\r|\n/m) + .filter((text) => text.length) + .flatMap((paragraph) => { + const paragraphNodes = []; + + const overview = paragraph.match(/^\.\.\.([^.]+)\.\.\.$/); + if (overview) { + paragraphNodes.push({ + type: "paragraph", + nodes: getParagraphNodesForString(overview[1]), + }); + } + + const headings = paragraph.match(/^\*\s+([A-Z\s]+)\.\.\.(.*)$/); + if (headings) { + paragraphNodes.push( + { + type: "heading", + text: headings[1].toLowerCase(), + }, + { type: "paragraph", nodes: getParagraphNodesForString(headings[2]) }, + ); + } + + if (paragraphNodes.length === 0) { + paragraphNodes.push({ + type: "paragraph", + nodes: getParagraphNodesForString(paragraph), + }); + } + + return paragraphNodes; + }); + + return nodes; +}; + +export default { parseDescription }; diff --git a/api-interop-layer/data/alerts/parse/description.test.js b/api-interop-layer/data/alerts/parse/description.test.js new file mode 100644 index 000000000..04302ddde --- /dev/null +++ b/api-interop-layer/data/alerts/parse/description.test.js @@ -0,0 +1,407 @@ +import { expect } from "chai"; +import { parseDescription, extractUrls } from "./description.js"; + + +describe("Alert Description Parsing", () => { + it("Can parse a basic WHAT/WHERE/WHEN example", () => { + const input = "* WHAT...Snow expected. Total snow accumulations of 5 to 10\ninches.\n\n"; + const expected = [ + { + type: "heading", + text: "what" + }, + { + type: "paragraph", + nodes: [ + { + type: "text", + content: "Snow expected. Total snow accumulations of 5 to 10 inches." + } + ] + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); + + it("Can parse a full WHAT/WHERE/WHEN example", () => { + let input = "* WHAT...Snow expected. Total snow accumulations of 5 to 10\ninches.\n\n"; + input += "* WHERE...Eastern San Juan Mountains Above 10000 Feet.\n\n"; + input += "* WHEN...From 11 PM this evening to 11 PM MST Thursday.\n\n"; + input += "* IMPACTS...Travel could be very difficult."; + input += " The hazardous conditions may impact travel over Wolf Creek Pass."; + + const expected = [ + { + "type": "heading", + "text": "what", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Snow expected. Total snow accumulations of 5 to 10 inches.", + }, + ], + }, + { + "type": "heading", + "text": "where", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Eastern San Juan Mountains Above 10000 Feet.", + }, + ], + }, + { + "type": "heading", + "text": "when", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "From 11 PM this evening to 11 PM MST Thursday.", + }, + ], + }, + { + "type": "heading", + "text": "impacts", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Travel could be very difficult. The hazardous conditions may impact travel over Wolf Creek Pass.", + }, + ], + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); + + it("Can parse a full description with an overview", () => { + const input = `...WINTER CONDITIONS RETURN TO THE SIERRA AND NORTHEAST CALIFORNIA +FOR MID-LATE WEEK... + +This bit...has ellipses in the middle...but is not an overview. + +.After a few days of warm weather, a potent winter storm will bring +windy and colder conditions with periods of heavy snow to the Sierra +and higher elevations of northeast California later this week. While +weather-related travel impacts aren't expected through Wednesday +morning, conditions will begin to worsen Wednesday afternoon and +evening, with the most widespread winter travel impacts likely from +Wednesday evening through much of Thursday. + +* WHAT...Heavy snow possible. Snow accumulations of 4 to 10 inches +above 5000 feet west of US-395, with 10 to 20 inches possible for +higher passes such as Fredonyer Summit and Yuba Pass. Winds +gusting as high as 50 mph. + +* WHERE...Lassen-Eastern Plumas-Eastern Sierra Counties. + +* WHEN...From late Wednesday morning through Friday morning. +Heaviest snow is most likely from late Wednesday afternoon through +Thursday morning. + +* IMPACTS...Travel could be very difficult at times, with hazardous +conditions impacting the commutes from Wednesday evening through +Friday morning. Strong winds may blow down some tree limbs and a +few power outages may result. + +* ADDITIONAL DETAILS...Snow levels will start near 6500 feet on +Wednesday, then drop to near 5500 feet Wednesday night and near +5000 feet by Thursday morning.`; + + const expected = [ + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "WINTER CONDITIONS RETURN TO THE SIERRA AND NORTHEAST CALIFORNIA FOR MID-LATE WEEK", + }, + ], + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "This bit...has ellipses in the middle...but is not an overview.", + }, + ], + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + ".After a few days of warm weather, a potent winter storm will bring windy and colder conditions with periods of heavy snow to the Sierra and higher elevations of northeast California later this week. While weather-related travel impacts aren't expected through Wednesday morning, conditions will begin to worsen Wednesday afternoon and evening, with the most widespread winter travel impacts likely from Wednesday evening through much of Thursday.", + }, + ], + }, + { + "type": "heading", + "text": "what", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Heavy snow possible. Snow accumulations of 4 to 10 inches above 5000 feet west of US-395, with 10 to 20 inches possible for higher passes such as Fredonyer Summit and Yuba Pass. Winds gusting as high as 50 mph.", + }, + ], + }, + { + "type": "heading", + "text": "where", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Lassen-Eastern Plumas-Eastern Sierra Counties.", + }, + ], + }, + { + "type": "heading", + "text": "when", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "From late Wednesday morning through Friday morning. Heaviest snow is most likely from late Wednesday afternoon through Thursday morning.", + }, + ], + }, + { + "type": "heading", + "text": "impacts", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Travel could be very difficult at times, with hazardous conditions impacting the commutes from Wednesday evening through Friday morning. Strong winds may blow down some tree limbs and a few power outages may result.", + }, + ], + }, + { + "type": "heading", + "text": "additional details", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Snow levels will start near 6500 feet on Wednesday, then drop to near 5500 feet Wednesday night and near 5000 feet by Thursday morning.", + }, + ], + }, + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); +}); + +describe("Extracting URLs", () => { + it("Can parse out a basic gov url", () => { + const input = `Scattered showers with brief heavy rainfall will continue this week. +A low pressure system from the north will batter your area, relentlessly. +Be sure to stock up. See https://www.weather.gov/safety/food for more information.`; + const expected = { + type: "link", + url: "https://www.weather.gov/safety/food", + external: false + }; + + const actual = extractUrls(input); + + expect(actual).to.have.lengthOf(1); + expect(expected).to.eql(actual[0]); + }); + + it("Ignores non-government URLs", () => { + const input = `Scattered showers with brief heavy rainfall will go on and +on and on, boring everyone who has to stay inside. They will attempt to visit sites +like https://fake.com/should/not/render which will not be clickable URLs.`; + const actual = extractUrls(input); + + expect(actual).to.be.false; + }); + + it("Ignores URLs that have user/pass information in them", () => { + const input = `Weather will, once again, be horrendous wherever you happen to be. +Maybe you are cursed? Anyway, the spammers would like you to click this link here that +has a username and password in the URL (https://root:1234@weather.gov/hack/the/gibson), which +you shouldn't be able to do thanks to Cautious Public Servants TM.`; + const actual = extractUrls(input); + + expect(actual).to.be.false; + }); + + it("Can parse nodes that include an internal link", () => { + const input = `* WHAT...There will be winds like you cannot believe. See https://winds.weather.gov/info for more information.`; + const expected = [ + { + "type": "heading", + "text": "what", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "There will be winds like you cannot believe. See ", + }, + { + "type": "link", + "url": "https://winds.weather.gov/info", + "external": false, + }, + { + "type": "text", + "content": " for more information.", + }, + ], + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); + + it("Can parse nodes that include an external link", () => { + const input = `* IMPACTS...There will be shaking like you cannot believe. See https://usgs.gov/earthquakes for more information.`; + const expected = [ + { + "type": "heading", + "text": "impacts", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "There will be shaking like you cannot believe. See ", + }, + { + "type": "link", + "url": "https://usgs.gov/earthquakes", + "external": true, + }, + { + "type": "text", + "content": " for more information.", + }, + ], + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); + + it("Correctly parses nodes that include invalid urls", () => { + const input = `* WHEN...There will be weather like you cannot believe. See https://other-weather-site.com for more information, or even check out http://insecure.gov or else www.foo.net`; + const expected = [ + { + "type": "heading", + "text": "when", + }, + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "There will be weather like you cannot believe. See https://other-weather-site.com for more information, or even check out http://insecure.gov or else www.foo.net", + }, + ], + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); + + it("Can parse nodes that include both internal and external links", () => { + const input = `Damaging winds will blow down large objects such as trees and power lines. Power outages are expected. See www.your-power-company.com/outages for more information. Travel will be difficult, especially for high profile vehicles. For road safety, see https://transportation.gov/safe-travels . For more weather information, check out https://weather.gov/your-office for up to date forecasts and alerts.`; + const expected = [ + { + "type": "paragraph", + "nodes": [ + { + "type": "text", + "content": + "Damaging winds will blow down large objects such as trees and power lines. Power outages are expected. See www.your-power-company.com/outages for more information. Travel will be difficult, especially for high profile vehicles. For road safety, see " + }, + { + "type": "link", + "url": "https://transportation.gov/safe-travels", + "external": true, + }, + { + "type": "text", + "content": + " . For more weather information, check out ", + }, + { + "type": "link", + "url": "https://weather.gov/your-office", + "external": false, + }, + { + "type": "text", + "content": " for up to date forecasts and alerts.", + }, + ], + } + ]; + + const actual = parseDescription(input); + + expect(expected).to.eql(actual); + }); +}); diff --git a/api-interop-layer/data/alerts/parse/duration.js b/api-interop-layer/data/alerts/parse/duration.js new file mode 100644 index 000000000..356a30e9f --- /dev/null +++ b/api-interop-layer/data/alerts/parse/duration.js @@ -0,0 +1,76 @@ +import dayjs from "../../../util/day.js"; + +export const parseDuration = (alert, timezone) => { + const now = dayjs().tz(timezone); + const tomorrow = now.add(1, "day").startOf("day"); + const later = tomorrow.add(1, "day"); + + if (alert.onset.isSameOrBefore(now)) { + // The event has already begun. Now we need to see if we know + // when it ends. + if (alert.finish) { + const finish = alert.finish.tz(timezone); + + if (finish.isSameOrAfter(now)) { + // We are currently in the middle of the event. + if (finish.isBefore(tomorrow)) { + // It ends today + return `until ${finish.format("h:mm A")} today`; + } + + // Day.js doesn't support short format timezones anymore, but thankfully + // the Intl.DateTimeFormat stdlib does. We can format the finish date + // with it and then extract just the timezone. The output of formatting + // is something like: + // + // [date time string] [short timezone] + // + // So we can just split on the space and take the second element. + const [, tz] = new Intl.DateTimeFormat("en-US", { + timeZone: timezone, + timeZoneName: "short", + }) + .format(finish.toDate()) + .split(" "); + + // It ends after today + return `until ${finish.format("dddd MM/DD h:mm A")} ${tz}`; + } + // The event has already concluded. We shouldn't be + // showing this alert at all. + return "has concluded"; + } + // This alert has no ending or expiration time. This is a + // weird scenario, but we should handle it just in case. + return "is in effect"; + } + + // The event is in the future. + const onsetHour = alert.onset.tz(timezone).get("hour"); + + if (alert.onset.isBefore(tomorrow)) { + // The event starts later today + if (onsetHour < 12) { + return "this morning"; + } + if (onsetHour < 18) { + return "this afternoon"; + } + return "tonight"; + } + if (alert.onset.isBefore(later)) { + // The event starts tomorrow + if (onsetHour < 12) { + return "tomorrow morning"; + } + if (onsetHour < 18) { + return "tomorrow afternoon"; + } + return "tomorrow night"; + } + + // The alert starts in the further future + return alert.onset.tz(timezone).format("dddd"); +}; + +export default { parseDuration }; diff --git a/api-interop-layer/data/alerts/parse/duration.test.js b/api-interop-layer/data/alerts/parse/duration.test.js new file mode 100644 index 000000000..840cd72d4 --- /dev/null +++ b/api-interop-layer/data/alerts/parse/duration.test.js @@ -0,0 +1,128 @@ +import { expect } from "chai"; +import dayjs from "dayjs"; +import sinon from "sinon"; +import { parseDuration } from "./duration.js"; + +describe("alert parsing > duration", () => { + let clock; + + before(() => { + clock = sinon.useFakeTimers(); + }); + + beforeEach(() => { + clock.reset(); + }); + + after(() => { + clock.restore(); + }); + + describe("for alerts whose onset is in the past", () => { + it("ending later today", () => { + const now = dayjs("2024-09-01T08:00:00-05:00"); + clock.tick(now.valueOf()); + const onset = now.subtract(2, "hours"); + const finish = now.add(2, "hours"); + + const duration = parseDuration({ onset, finish }, "America/Chicago"); + expect(duration).to.equal("until 10:00 AM today"); + }); + + it("ending after today", () => { + const now = dayjs("2024-09-01T08:00:00-05:00"); + clock.tick(now.valueOf()); + const onset = now.subtract(2, "hours"); + const finish = now.add(2, "hours").add(1, "day"); + + const duration = parseDuration({ onset, finish }, "America/Chicago"); + expect(duration).to.equal("until Monday 09/02 10:00 AM CDT"); + }); + + it("with unknown ending", () => { + const now = dayjs("2024-09-01T08:00:00-05:00"); + clock.tick(now.valueOf()); + const onset = now.subtract(2, "hours"); + + const duration = parseDuration({ onset }, "America/Chicago"); + expect(duration).to.equal("is in effect"); + }); + + it("already ended", () => { + const now = dayjs("2024-09-01T08:00:00-05:00"); + clock.tick(now.valueOf()); + const onset = now.subtract(2, "hours"); + const finish = now.subtract(1, "hour"); + + const duration = parseDuration({ onset, finish }, "America/Chicago"); + expect(duration).to.equal("has concluded"); + }); + }); + + describe("for alerts that have not yet started", () => { + const now = dayjs("2024-09-01T08:00:00-05:00"); + beforeEach(() => { + clock.tick(now.valueOf()); + }); + + describe("starting later today", () => { + it("starts in the morning", () => { + const onset = now.add(1, "hour"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("this morning"); + }); + + it("starts in the afternoon", () => { + const onset = now.add(6, "hours"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("this afternoon"); + }); + + it("starts in the night", () => { + const onset = now.add(12, "hours"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("tonight"); + }); + }); + + describe("starting tomorrow", () => { + it("starts in the morning", () => { + const onset = now.add(1, "day"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("tomorrow morning"); + }); + + it("starts in the afternoon", () => { + const onset = now.add(1, "day").add(6, "hours"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("tomorrow afternoon"); + }); + + it("starts in the night", () => { + const onset = now.add(1, "day").add(12, "hours"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("tomorrow night"); + }); + }); + + it("starting in the further future", () => { + const onset = now.add(2, "days"); + + const duration = parseDuration({ onset }, "America/Chicago"); + + expect(duration).to.equal("Tuesday"); + }); + }); +}); diff --git a/api-interop-layer/data/alerts/parse/index.js b/api-interop-layer/data/alerts/parse/index.js new file mode 100644 index 000000000..423189761 --- /dev/null +++ b/api-interop-layer/data/alerts/parse/index.js @@ -0,0 +1,3 @@ +export { parseDuration } from "./duration.js"; +export { parseDescription } from "./description.js"; +export { parseLocations } from "./locations.js"; diff --git a/api-interop-layer/data/alerts/parse/locations.js b/api-interop-layer/data/alerts/parse/locations.js new file mode 100644 index 000000000..2d0405427 --- /dev/null +++ b/api-interop-layer/data/alerts/parse/locations.js @@ -0,0 +1,122 @@ +import { titleCase } from "../../../util/case.js"; + +export const parseLocations = (description) => { + if (!description) { + return { description, location: false }; + } + + let updatedDescription = description; + const locations = { regions: [], cities: [] }; + + // If the alert description has fine-grained location information, there + // will be a line that starts with: + // + // IN [STATE] THIS [WARNING | WATCH | WHATEVER] INCLUDES 13 COUNTIES + // + // So if we have a line that matches, we should try parsing it. + const [startToken] = + description.match( + /IN \S+ (THIS|THE NEW) \S+ INCLUDES \d+ COUNTIES\n$/ims, + ) ?? []; + if (startToken) { + // Keep track of where the extra location information lives inside + // the alert description so it's easier to remove it later. + const startIndex = updatedDescription.indexOf(startToken); + let endIndex = startIndex + startToken.length; + + // First get the regions of the covered states. This will be things + // like "Northwest Nebraska". This will create two matches: one for + // the entire line and another for just the region area name. + updatedDescription + .slice(endIndex) + .match(/IN (.+)\n/g) + // The region description will end with a newline. For + // simplicity in the regex later, we'll eat this newline + // here. + .map((v) => v.trim()) + .forEach((regionToken) => { + const [, region] = regionToken.match(/IN (.+)/); + + // Account for the two newlines at the end of the token. + endIndex += regionToken.length + 2; + + // If the alert covers multiple states, we can end up with + // several of these "THIS WATCH INCLUDES 42 COUNTIES" + // headings. If this is such a thing, then it is not a + // county area heading and we can skip it. + if (/THIS \S+ INCLUDES \d+ COUNTIES$/.test(regionToken)) { + return; + } + + const area = titleCase(region.replace(/^IN /, "")); + // The list of counties begins where the region name is + // followed by two newlines and continues until either + // another pair of newlines OR the end of the text. + const [, innerPlaces] = + description.slice(endIndex).match(/([\s\S]+?)(\n\n|$)/is) ?? []; + + // The counties are delimitted by multiple spaces, so replace + // 2 or more spaces with a single comma. The county list also + // spans multiple lines, so replace newlines with commas as + // well. Finally, split the list on commas to get the + // individual items. + const counties = innerPlaces + .trim() + .replace(/\n/g, " ") + .replace(/\s{2,}/g, ",") + .split(",") + .map(titleCase); + + if (counties.length > 0) { + locations.regions.push({ + area, + counties, + }); + } + + // Keep advancing the end index. + endIndex += innerPlaces?.length ?? 0; + }); + + // When there is this particularly formatted location information + // in the alert description, there is also sometimes a list of + // cities. So let's look for those, too. + const [citiesToken, cities] = + updatedDescription.match( + /THIS INCLUDES THE CITIES OF([\s\S]+?)(\n\n|$)/is, + ) ?? []; + + if (cities) { + locations.cities = cities + // The list of cities may be grammatically correct and end + // with an "and" before the last item. We don't actually + // care about that, so remove it if it's there. + .replace(/\sand\s/i, "") + // Cites are delimitted by commas and a single city can span + // multiple lines (like "St. Louis" where perhaps the "St." + // is on one line and "Louis" is on the other). So, replace + // newlines with spaces. + .replace(/\n/g, " ") + .split(",") + // Trim the city names and title-case them. Sometimes the cities will + // have a period at the very end, too, so eat that, just in case. + .map((s) => titleCase(s.trim().replace(/\.$/, ""))); + + // Advance the end index, plus two newlines. + endIndex += citiesToken.length + 2; + } + + // Build a new description string with the location information stripped out + // since we have captured that in structured data now. + updatedDescription = + updatedDescription.slice(0, startIndex) + + updatedDescription.slice(endIndex); + } + + if (locations.regions.length > 0 || locations.cities.length > 0) { + return { description: updatedDescription.trim(), locations }; + } + return { description, location: false }; +}; + +export default { parseLocations }; diff --git a/api-interop-layer/data/alerts/parse/locations.test.js b/api-interop-layer/data/alerts/parse/locations.test.js new file mode 100644 index 000000000..96f14df7f --- /dev/null +++ b/api-interop-layer/data/alerts/parse/locations.test.js @@ -0,0 +1,102 @@ +import { expect } from "chai"; +import { parseLocations } from "./locations.js"; + +describe("Alert location parsing", () => { + it("Correctly parses the case where there are no found locations in the text", () => { + const input = "* WHAT...North winds 25 to 35 mph with gusts up to 60 to 65 mph\nexpected.\n\n* WHERE...Santa Ynez Mountains Eastern Range.\n\n* WHEN...Until 1 AM PST Friday.\n\n* IMPACTS...Damaging winds will blow down large objects such as\ntrees and power lines. Power outages are expected. See www.your-power-company.com/outages for more information. Travel will\nbe difficult, especially for high profile vehicles. For road safety, see https://transportation.gov/safe-travels . For more weather information, check out https://weather.gov/your-office for up to date forecasts and alerts."; + + const actual = parseLocations(input); + + expect(actual.location).to.be.false; + }); + + it("Can parse locations for a single state from the description", () => { + const input = "IN NEBRASKA THIS WATCH INCLUDES 15 COUNTIES\n\nIN CENTRAL NEBRASKA\n\nCUSTER\n\nIN NORTH CENTRAL NEBRASKA\n\nBLAINE BOYD BROWN\nCHERRY GARFIELD HOLT\nKEYA PAHA LOUP ROCK\nTHOMAS WHEELER\n\nTHIS INCLUDES THE CITIES OF AINSWORTH, ATKINSON, BARTLETT,\nBASSETT, BREWSTER, BROKEN BOW, BURWELL, BUTTE, CURTIS, DUNNING\n\n* WHAT...North winds 25 to 35 mph with gusts up to 60 to 65 mph\nexpected.\n\n* WHERE...Santa Ynez Mountains Eastern Range.\n\n* WHEN...Until 1 AM PST Friday.\n\n* IMPACTS...Damaging winds will blow down large objects such as\ntrees and power lines. Power outages are expected. See www.your-power-company.com/outages for more information. Travel will\nbe difficult, especially for high profile vehicles. For road safety, see https://transportation.gov/safe-travels . For more weather information, check out https://weather.gov/your-office for up to date forecasts and alerts."; + const expected = { + regions: [ + { + area: "Central Nebraska", + counties: ["Custer"] + }, + { + area: "North Central Nebraska", + counties: [ + "Blaine", + "Boyd", + "Brown", + "Cherry", + "Garfield", + "Holt", + "Keya Paha", + "Loup", + "Rock", + "Thomas", + "Wheeler", + ] + } + ], + cities: [ + "Ainsworth", + "Atkinson", + "Bartlett", + "Bassett", + "Brewster", + "Broken Bow", + "Burwell", + "Butte", + "Curtis", + "Dunning", + ] + }; + + const actual = parseLocations(input); + + expect(expected).to.eql(actual.locations); + }); + + it("Can parse location info for multiple states from the description", () => { + const input = "IN OREGON THIS WATCH INCLUDES 3 COUNTIES\n\nIN NORTHERN OREGON\n\nCOUNTY ONE\n\nIN LUNAR OREGON\n\nTRANQUILITY BASE DARK SIDE\n\nIN NEBRASKA THIS WATCH INCLUDES 15 COUNTIES\n\nIN CENTRAL NEBRASKA\n\nCUSTER\n\nIN NORTH CENTRAL NEBRASKA\n\nBLAINE BOYD BROWN\nCHERRY GARFIELD HOLT\nKEYA PAHA LOUP ROCK\nTHOMAS WHEELER\n\nTHIS INCLUDES THE CITIES OF AINSWORTH, ATKINSON, BARTLETT,\nBASSETT, BREWSTER, BROKEN BOW, BURWELL, BUTTE, CURTIS, DUNNING\n\n* WHAT...North winds 25 to 35 mph with gusts up to 60 to 65 mph\nexpected.\n\n* WHERE...Santa Ynez Mountains Eastern Range.\n\n* WHEN...Until 1 AM PST Friday.\n\n* IMPACTS...Damaging winds will blow down large objects such as\ntrees and power lines. Power outages are expected. See www.your-power-company.com/outages for more information. Travel will\nbe difficult, especially for high profile vehicles. For road safety, see https://transportation.gov/safe-travels . For more weather information, check out https://weather.gov/your-office for up to date forecasts and alerts."; + const expected = { + "regions": [ + {"area": "Northern Oregon", "counties": ["County One"]}, + { + "area": "Lunar Oregon", + "counties": ["Tranquility Base", "Dark Side"], + }, + {"area": "Central Nebraska", "counties": ["Custer"]}, + { + "area": "North Central Nebraska", + "counties": [ + "Blaine", + "Boyd", + "Brown", + "Cherry", + "Garfield", + "Holt", + "Keya Paha", + "Loup", + "Rock", + "Thomas", + "Wheeler", + ], + }, + ], + "cities": [ + "Ainsworth", + "Atkinson", + "Bartlett", + "Bassett", + "Brewster", + "Broken Bow", + "Burwell", + "Butte", + "Curtis", + "Dunning", + ] + }; + + const actual = parseLocations(input); + + expect(expected).to.eql(actual.locations); + }); +}); diff --git a/api-interop-layer/data/alerts/sort.js b/api-interop-layer/data/alerts/sort.js new file mode 100644 index 000000000..5a650bf86 --- /dev/null +++ b/api-interop-layer/data/alerts/sort.js @@ -0,0 +1,49 @@ +import dayjs from "../../util/day.js"; + +export default (alertA, alertB) => { + const now = dayjs(); + + const priorityA = alertA.metadata.priority; + const priorityB = alertB.metadata.priority; + + // If both alerts are currently active... + if (alertA.onset.isBefore(now) && alertB.onset.isBefore(now)) { + // ...and they have the same priority, sort them by when they finish. + if (priorityA === priorityB) { + if (alertA.finish.isBefore(alertB.finish)) { + return -1; + } + if (alertB.finish.isBefore(alertA.finish)) { + return 1; + } + return 0; + } + + // ...or else sort them by priority. + return priorityA - priorityB; + } + + // If we're here, both alerts start in the future. If they start at different + // times, sort them by onset. + if (alertA.onset.isBefore(alertB.onset)) { + return -1; + } + if (alertB.onset.isBefore(alertA.onset)) { + return 1; + } + + // Otherwise, they start at the same time in the future. If they have the same + // priority, sort them by ending time. + if (priorityA === priorityB) { + if (alertA.finish.isBefore(alertB.finish)) { + return -1; + } + if (alertB.finish.isBefore(alertA.finish)) { + return 1; + } + return 0; + } + + // Otherwise, sort them by priority. + return priorityA - priorityB; +}; diff --git a/api-interop-layer/data/alerts/sort.test.js b/api-interop-layer/data/alerts/sort.test.js new file mode 100644 index 000000000..5839a3167 --- /dev/null +++ b/api-interop-layer/data/alerts/sort.test.js @@ -0,0 +1,163 @@ +import { expect } from "chai"; +import dayjs from "../../util/day.js"; +import alertSort from "./sort.js"; + +describe("alert sorting", () => { + describe("two alerts are currently active", () => { + const onset = dayjs().subtract(1, "hour"); + it("if the first has higher priority, it is sorted above", () => { + const expected = -1; + const actual = alertSort( + { onset, metadata: { priority: 0 } }, + { onset, metadata: { priority: 1 } }, + ); + + expect(actual).to.equal(expected); + }); + + it("if the second has higher priority, it is sorted above", () => { + const expected = 1; + const actual = alertSort( + { onset, metadata: { priority: 1 } }, + { onset, metadata: { priority: 0 } }, + ); + + expect(actual).to.equal(expected); + }); + + describe("if they have the same priority", () => { + it("if the first ends sooner, it is sorted above", () => { + const expected = -1; + const actual = alertSort( + { onset, metadata: { priority: 1 }, finish: dayjs().add(1, "hour") }, + { onset, metadata: { priority: 1 }, finish: dayjs().add(2, "hour") }, + ); + + expect(actual).to.equal(expected); + }); + + it("if the second ends sooner, it is sorted above", () => { + const expected = 1; + const actual = alertSort( + { onset, metadata: { priority: 1 }, finish: dayjs().add(2, "hour") }, + { onset, metadata: { priority: 1 }, finish: dayjs().add(1, "hour") }, + ); + + expect(actual).to.equal(expected); + }); + + it("if they end at the same time, they are not sorted", () => { + const expected = 0; + const actual = alertSort( + { onset, metadata: { priority: 1 }, finish: dayjs().add(1, "hour") }, + { onset, metadata: { priority: 1 }, finish: dayjs().add(1, "hour") }, + ); + + expect(actual).to.equal(expected); + }); + }); + }); + + describe("both alerts onset in the future", () => { + const onset = dayjs().add(1, "hour"); + describe("the alerts onset at different times", () => { + it("if the first begins first, it is sorted above", () => { + const expected = -1; + const actual = alertSort( + { onset, metadata: {} }, + { onset: onset.add(1, "hour"), metadata: {} }, + ); + + expect(actual).to.equal(expected); + }); + + it("if the second begins first, it is sorted above", () => { + const expected = 1; + const actual = alertSort( + { onset: onset.add(1, "hour"), metadata: {} }, + { onset, metadata: {} }, + ); + + expect(actual).to.equal(expected); + }); + }); + + describe("the alerts onset at the same time", () => { + it("if the first has higher priority, it is sorted above", () => { + const expected = -1; + const actual = alertSort( + { onset, metadata: { priority: 0 } }, + { onset, metadata: { priority: 1 } }, + ); + + expect(actual).to.equal(expected); + }); + + it("if the second has higher priority, it is sorted above", () => { + const expected = 1; + const actual = alertSort( + { onset, metadata: { priority: 1 } }, + { onset, metadata: { priority: 0 } }, + ); + + expect(actual).to.equal(expected); + }); + + describe("if they have the same priority", () => { + it("if the first ends sooner, it is sorted above", () => { + const expected = -1; + const actual = alertSort( + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(1, "hour"), + }, + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(2, "hour"), + }, + ); + + expect(actual).to.equal(expected); + }); + + it("if the second ends sooner, it is sorted above", () => { + const expected = 1; + const actual = alertSort( + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(2, "hour"), + }, + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(1, "hour"), + }, + ); + + expect(actual).to.equal(expected); + }); + + it("if they end at the same time, they are not sorted", () => { + const expected = 0; + const actual = alertSort( + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(1, "hour"), + }, + { + onset, + metadata: { priority: 1 }, + finish: dayjs().add(1, "hour"), + }, + ); + + expect(actual).to.equal(expected); + }); + }); + }); + }); +}); diff --git a/api-interop-layer/data/db.js b/api-interop-layer/data/db.js new file mode 100644 index 000000000..2c6b0b926 --- /dev/null +++ b/api-interop-layer/data/db.js @@ -0,0 +1,29 @@ +import mariadb from "mariadb"; + +import { sleep } from "../util/sleep.js"; + +export const openDatabase = async () => { + const connectionDetails = { + user: process.env.DB_USERNAME ?? "drupal", + password: process.env.DB_PASSWORD ?? "drupal", + database: process.env.DB_NAME ?? "weathergov", + host: process.env.DB_HOST ?? "database", + port: process.env.DB_PORT ?? 3306, + ssl: { rejectUnauthorized: false }, + }; + + return mariadb.createConnection(connectionDetails); +}; + +// Try to connect, wait, try again, wait, etc. If the database isn't ready after +// 4 attempts and 30 seconds, we'll just fail. +const db = await openDatabase() + .catch(() => sleep(5_000)) + .then(openDatabase) + .catch(() => sleep(9_000)) + .then(openDatabase) + .catch(() => sleep(16_000)) + .then(openDatabase); +await db.end(); + +export default { openDatabase }; diff --git a/api-interop-layer/data/forecast/daily.js b/api-interop-layer/data/forecast/daily.js new file mode 100644 index 000000000..2425932e7 --- /dev/null +++ b/api-interop-layer/data/forecast/daily.js @@ -0,0 +1,102 @@ +import dayjs from "../../util/day.js"; +import { convertProperties } from "../../util/convert.js"; +import { parseAPIIcon } from "../../util/icon.js"; +import { sentenceCase } from "../../util/case.js"; + +const dayjsOffset = (iso8601) => { + const time = dayjs(iso8601); + const [, offset] = iso8601.match(/([-+]\d{2}:\d{2})$/) ?? []; + + if (!offset || offset === "z") { + return time; + } + + const [, direction, hours, minutes] = + offset.match(/([-+])(\d{2}):(\d{2})/) ?? []; + const bump = +hours * 60 + +minutes; + + return time.utcOffset(bump * (direction === "-" ? -1 : 1)); +}; + +export default (data, { timezone }) => { + if (data.error) { + return { error: true }; + } + const days = []; + let previousDay = -1; + + for (const period of data.properties.periods) { + const start = dayjsOffset(period.startTime); + + if (start.get("day") !== previousDay) { + if (days.length > 0) { + days[days.length - 1].end = period.startTime; + } + + days.push({ start: period.startTime, periods: [] }); + previousDay = start.get("day"); + } + + const dayPeriod = days[days.length - 1]; + if (!dayPeriod.start) { + dayPeriod.start = period.startTime; + } + if (days.length > 0) { + days[days.length - 1].end = period.endTime; + } + + const isOvernight = + days.length === 1 && + dayPeriod.periods.length === 0 && + period.isDaytime === false; + + const periodData = { + start: dayjs(period.startTime), + end: dayjs(period.endTime), + isDaytime: period.isDaytime, + isOvernight, + monthAndDay: start.tz(timezone).format("MMM D"), + dayName: days.length === 1 ? "Today" : start.tz(timezone).format("dddd"), + data: convertProperties({ + icon: parseAPIIcon(period.icon), + description: sentenceCase(period.shortForecast), + temperature: { + unitCode: "wmoUnit:degF", + value: period.temperature, + }, + probabilityOfPrecipitation: period.probabilityOfPrecipitation, + windSpeed: { + unitCode: "wxgov:mph", + value: Number.parseInt(period.windSpeed, 10), + }, + windDirection: period.windDirection, + }), + }; + + // Add time labels to the first day + if (days.length === 1) { + if (isOvernight) { + periodData.timeLabel = "NOW-6AM"; + } else if (periodData.isDaytime) { + periodData.timeLabel = "6AM-6PM"; + } else { + periodData.timeLabel = "6PM-6AM"; + } + } + + dayPeriod.periods.push(periodData); + } + + days.forEach((day) => { + day.start = dayjs(day.start); + day.end = dayjs(day.end); + }); + + return { + ...convertProperties({ elevation: data.properties.elevation }), + generated: data.properties.generatedAt, + updated: data.properties.updateTime, + valid: data.properties.validTimes, + days: days.filter(({ periods }) => periods.length > 0), + }; +}; diff --git a/api-interop-layer/data/forecast/gridpoint.js b/api-interop-layer/data/forecast/gridpoint.js new file mode 100644 index 000000000..86b2f71fe --- /dev/null +++ b/api-interop-layer/data/forecast/gridpoint.js @@ -0,0 +1,60 @@ +import dayjs from "../../util/day.js"; +import quantitativePrecipitation from "./quantitativePrecipitation.js"; + +export default (data, hours, place) => { + // If we got an error, bail out. There's no data to process. + if (data.error) { + return { error: true }; + } + + // QPF is different from everything else. The value given to us is the total + // predicted precipitation (liquid equivalent) over the duration, rather than + // the precipitation for each hour in the duration. So pull it out, parse it + // separately, and then remove it from the larger hourly dataset. + const qpf = quantitativePrecipitation( + data.properties.quantitativePrecipitation, + place, + ); + delete data.properties.quantitativePrecipitation; + + // For properties that have a unit of measure and a value, we want to parse + // and add those to the hours map. + const properties = Object.keys(data.properties).filter( + (key) => + data.properties[key].uom && Array.isArray(data.properties[key].values), + ); + + for (const key of properties) { + const { uom, values } = data.properties[key]; + + for (const value of values) { + // In order to parse the datetime string, we gotta split the duration off + // first. We'll parse them separately. + const [isoTimestamp, isoDuration] = value.validTime.split("/"); + const start = dayjs(isoTimestamp); + const duration = dayjs.duration(isoDuration).asHours(); + + // Starting from the first hour, we'll advance one hour at a time until we + // have covered the full duration for this particular value. And we'll add + // it to the hours map. + for (let offset = 0; offset < duration; offset += 1) { + const ts = start.add(offset, "hours").startOf("hour"); + const time = ts.toISOString(); + const hourData = hours.get(time) ?? {}; + + // Internally, we'll preserve the Moment object so we don't have to + // create it for comparison purposes elsewhere. Then add this value. + hourData.time = ts; + hourData[key] = { uom, value: value.value }; + + // And save it back to the map. + hours.set(time, hourData); + } + } + } + + // The geometry isn't really related to the forecast (I mean, it super is, but + // not in this context), but we get the grid's geometry from this API call. + // We use it for filtering alerts and stuff, so send it back up. + return { geometry: data.geometry, qpf }; +}; diff --git a/api-interop-layer/data/forecast/hourly.js b/api-interop-layer/data/forecast/hourly.js new file mode 100644 index 000000000..50fde36cb --- /dev/null +++ b/api-interop-layer/data/forecast/hourly.js @@ -0,0 +1,30 @@ +import { sentenceCase } from "../../util/case.js"; +import dayjs from "../../util/day.js"; +import { parseAPIIcon } from "../../util/icon.js"; + +export default (data, hours, { timezone }) => { + if (data.error) { + return; + } + + for (const period of data.properties.periods) { + let start = dayjs(period.startTime).tz(timezone); + const end = dayjs(period.endTime).tz(timezone); + + while (start < end) { + // Always take hours DOWN to the last whole hour. This should never be an + // issue with API data, but let's protect ourselves anyway. + const time = start.startOf("hour").toISOString(); + + const hourData = hours.get(time) ?? {}; + hourData.time = start; + hourData.hour = start.format("h A"); + hourData.shortForecast = sentenceCase(period.shortForecast); + hourData.icon = parseAPIIcon(period.icon); + + hours.set(time, hourData); + + start = start.add(1, "hour"); + } + } +}; diff --git a/api-interop-layer/data/forecast/index.js b/api-interop-layer/data/forecast/index.js new file mode 100644 index 000000000..ad72f090f --- /dev/null +++ b/api-interop-layer/data/forecast/index.js @@ -0,0 +1,104 @@ +import daily from "./daily.js"; +import gridpoint from "./gridpoint.js"; +import hourly from "./hourly.js"; +import { convertValue, convertProperties } from "../../util/convert.js"; +import dayjs from "../../util/day.js"; +import { fetchAPIJson } from "../../util/fetch.js"; + +export default async ({ grid, place }) => { + const hours = new Map(); + + // The hours map is passed into the gridpoint and hourly data processors so + // we can build a comprehensive – but single – list of all the hours covered + // by either the gridpoints or /forecast/hourly endpoints. It's kinda clunky, + // but it saves us having to merge two arrays later. + // + // We pass the place object along to all of them so they can access the + // timezone and coerce the times provided to us into forecast-local times. + const gridpointPromise = fetchAPIJson( + `/gridpoints/${grid.wfo}/${grid.x},${grid.y}`, + ).then((data) => gridpoint(data, hours, place)); + + const dailyPromise = fetchAPIJson( + `/gridpoints/${grid.wfo}/${grid.x},${grid.y}/forecast`, + ).then((data) => daily(data, place)); + + const hourlyPromise = fetchAPIJson( + `/gridpoints/${grid.wfo}/${grid.x},${grid.y}/forecast/hourly`, + ).then((data) => { + hourly(data, hours, place); + }); + + // We don't capture the results of the hourly processing function because it + // doesn't return anything. All of its work gets put into the hours map. + const [dailyData, gridpointData] = await Promise.all([ + dailyPromise, + gridpointPromise, + hourlyPromise, + ]); + + const earliest = dayjs() + .tz(place.timezone) + .set("minute", 0) + .set("second", 0) + .set("millisecond", 0); + + // Sort the hours and remove any that occur before midnight at place-local + // time today. + const orderedHours = [...hours.values()] + .sort(({ time: a }, { time: b }) => { + const timeA = dayjs(a); + const timeB = dayjs(b); + + if (timeA > timeB) { + return 1; + } + if (timeA < timeB) { + return -1; + } + return 0; + }) + .filter(({ time }) => time.isAfter(earliest)); + + // Do unit conversions on all the hourly properties. Each item in the array + // is an object representing one hour. Each property in the object represents + // a measurable value. + orderedHours.forEach(convertProperties); + + // Also convert the QPF. QPF is represented as an array of individual + // measurements instead of an array of objects whose values are measurements. + if (gridpointData.qpf) { + gridpointData.qpf.forEach(convertValue); + } + + // Now add the appropriate QPF and hourly data to each day. + for (const day of dailyData.days ?? []) { + const start = dayjs.tz(day.start); + const end = dayjs.tz(day.end); + + if (gridpointData.qpf) { + day.qpf = gridpointData.qpf.filter(({ start: qpfStart, end: qpfEnd }) => { + // QPF is provided in multi-hour chunks, but unlike the other measurables, + // the value is the total across the time period rather than continuous. + // So we have to preserve the multi-hour-ness of QPF. As a result, + // determining whether a QPF belongs to a given day is slightly more + // complex. If either the QPF start or end time is between the day start + // and end time, then it belongs in the day. + if (qpfStart.isSameOrAfter(start) && qpfStart.isBefore(end)) { + return true; + } + return qpfEnd.isSameOrAfter(start) && qpfEnd.isBefore(end); + }); + } + + // Hours are simpler. Is the hour between the start and end? Done. + day.hours = orderedHours.filter( + ({ time }) => time.isSameOrAfter(start) && time.isSameOrBefore(end), + ); + } + + // Whatever gridData is returned here gets merged into the top-level grid + // object that contains other information such as the WFO and grid X and Y + // coordinates. + return { gridData: gridpointData, daily: dailyData }; +}; diff --git a/api-interop-layer/data/forecast/quantitativePrecipitation.js b/api-interop-layer/data/forecast/quantitativePrecipitation.js new file mode 100644 index 000000000..8c50381c1 --- /dev/null +++ b/api-interop-layer/data/forecast/quantitativePrecipitation.js @@ -0,0 +1,22 @@ +import dayjs from "../../util/day.js"; + +export default (data, { timezone }) => { + const { uom, values } = data; + + return values.map(({ validTime, value }) => { + const [isoTimestamp, isoDuration] = validTime.split("/"); + + const start = dayjs(isoTimestamp); + const duration = dayjs.duration(isoDuration); + const end = start.add(duration); + + return { + start, + end, + uom, + value, + startHour: start.tz(timezone).format("h A"), + endHour: end.tz(timezone).format("h A"), + }; + }); +}; diff --git a/api-interop-layer/data/forecast/quantitativePrecipitation.test.js b/api-interop-layer/data/forecast/quantitativePrecipitation.test.js new file mode 100644 index 000000000..9ab2b5747 --- /dev/null +++ b/api-interop-layer/data/forecast/quantitativePrecipitation.test.js @@ -0,0 +1,145 @@ +import sinon from "sinon"; +import dayjs from "dayjs"; +import { expect } from "chai"; +import qpf from "./quantitativePrecipitation.js"; +import forecast from "./index.js"; + +describe("quantitative precipitation forecase (QPF)", () => { + let clock; + before(() => { + clock = sinon.useFakeTimers({ now: 0 }); + }); + + after(() => { + clock.restore(); + }); + + it("parses the raw data", () => { + const raw = { + uom: "raw-units", + values: [ + { + validTime: "2024-09-09T21:00:00Z/PT3H", + value: 32, + }, + { + validTime: "2024-09-10T00:00:00Z/PT6H", + value: 19, + }, + { validTime: "2024-09-10T06:00:00Z/PT2H", value: 4 }, + ], + }; + + const expected = [ + { + start: dayjs("2024-09-09T21:00:00Z"), + end: dayjs("2024-09-10T00:00:00Z"), + uom: "raw-units", + value: 32, + startHour: "4 PM", + endHour: "7 PM", + }, + { + start: dayjs("2024-09-10T00:00:00Z"), + end: dayjs("2024-09-10T06:00:00Z"), + uom: "raw-units", + value: 19, + startHour: "7 PM", + endHour: "1 AM", + }, + { + start: dayjs("2024-09-10T06:00:00Z"), + end: dayjs("2024-09-10T08:00:00Z"), + uom: "raw-units", + value: 4, + startHour: "1 AM", + endHour: "3 AM", + }, + ]; + + const actual = qpf(raw, { timezone: "America/Chicago" }); + + expect(actual).to.eql(expected); + }); + + it("puts QPF into the right days", async () => { + fetch.withArgs("https://api.weather.gov/gridpoints/BOB/X,Y").resolves({ + status: 200, + json: sinon.stub().resolves({ + properties: { + quantitativePrecipitation: { + uom: "some units", + values: [ + { + validTime: "2024-09-10T01:00:00Z/PT4H", + value: 9, + }, + { validTime: "2024-09-10T05:00:00Z/PT20H", value: 100 }, + { validTime: "2024-09-11T01:00:00Z/PT3H", value: 4 }, + ], + }, + }, + }), + }); + + fetch + .withArgs("https://api.weather.gov/gridpoints/BOB/X,Y/forecast") + .resolves({ + status: 200, + json: sinon.stub().resolves({ + properties: { + periods: [ + { + startTime: "2024-09-10T03:00:00Z", + endTime: "2024-09-10T09:00:00Z", + }, + ], + }, + }), + }); + + fetch + .withArgs("https://api.weather.gov/gridpoints/BOB/X,Y/forecast/hourly") + .resolves({ + status: 200, + json: sinon.stub().resolves({ + properties: { + periods: [], + }, + }), + }); + + const grid = { + wfo: "BOB", + x: "X", + y: "Y", + }; + + const place = { + timezone: "America/Los_Angeles", + }; + + const expected = [ + { + start: dayjs("2024-09-10T01:00:00Z"), + end: dayjs("2024-09-10T05:00:00Z"), + uom: "some units", + value: 9, + startHour: "6 PM", + endHour: "10 PM", + }, + { + start: dayjs("2024-09-10T05:00:00Z"), + end: dayjs("2024-09-11T01:00:00Z"), + uom: "some units", + value: 100, + startHour: "10 PM", + endHour: "6 PM", + }, + ]; + + const actual = await forecast({ grid, place }); + + expect(actual.daily.days[0].qpf).to.eql(expected); + }); +}); diff --git a/api-interop-layer/data/index.js b/api-interop-layer/data/index.js new file mode 100644 index 000000000..0b32469ea --- /dev/null +++ b/api-interop-layer/data/index.js @@ -0,0 +1,139 @@ +import getAlerts from "./alerts/index.js"; +import getForecast from "./forecast/index.js"; +import getObservations from "./obs/index.js"; +import getPoint from "./points.js"; +import getSatellite from "./satellite.js"; +import dayjs from "../util/day.js"; +import { createLogger } from "../util/monitoring/index.js"; + +const logger = createLogger("forecast"); + +export const getDataForPoint = async (lat, lon) => { + logger.verbose(`fetching forecast for ${lat}, ${lon}}`); + const { point, place, grid } = await getPoint(lat, lon); + + let satellitePromise = Promise.resolve({ error: true }); + let forecast = { daily: { error: true } }; + let observed = { error: true }; + + // If we don't have a grid, we can't fetch satellite metadata, forecast, or + // observations – all of these are based around WFO and WFO grid. + if (!grid.error) { + satellitePromise = getSatellite({ grid }); + + const { forecast: fct, observed: obs } = await Promise.all([ + getForecast({ grid, place }), + getObservations({ grid, point }), + ]).then(([forecastData, obsData]) => { + // The forecast endpoint returns extra information about the grid. Why? I + // dunno. But anyway, let's put it with the other grid info and remove it + // from the forecast data. + Object.assign(grid, forecastData.gridData); + delete forecastData.gridData; + + // The daily forecast endpoint includes elevation information, but that + // really belongs with the grid, so let's move that, too. + if (!forecastData.daily.error && forecastData.daily.elevation) { + grid.elevation = forecastData.daily.elevation; + delete forecastData.daily.elevation; + } + + return { forecast: forecastData, observed: obsData }; + }); + + forecast = fct; + observed = obs; + } + + // Get alerts regardless. If there's no grid, we can fallback to using the + // requested point lat/lon. + // + // Why do we use the grid at all, you ask? Because a grid cell is geographically + // larger, so any error between the requested location and the actual lat/lon + // we're using is smoothed over because instead of looking for alerts that + // intersect a single point, we're looking for alerts that intersect a 1.5km + // by 1.5km square. + const alerts = await getAlerts({ grid, point, place }); + + // If we have a daily forecast, we can go ahead and populate it with related + // data. + if (!forecast.daily.error) { + // Now map alerts into the daily forecast. Only do the days that have hours in + // them. This shouldn't be an issue, but better safe than sorry. + for (const day of forecast.daily.days.filter( + ({ hours }) => hours.length > 0, + )) { + day.alerts = { metadata: { count: 0, highest: "other" }, items: [] }; + + const start = day.hours[0].time; + const end = day.hours[day.hours.length - 1].time; + + // Filter down to just the alerts that are or will be active during this + // particular day. + const dayAlerts = alerts.items.filter( + ({ onset, finish }) => + onset.isSameOrBefore(end) && finish.isSameOrAfter(start), + ); + + dayAlerts.forEach((alert) => { + // How deep into the hourly forecast does this alert appear? This is based + // on the hourly part of the forecast day, not the entire forecast day, + // because the hourly part begins at the top of the next hour. This is + // essentially which hour the alert begins on. + const offset = Math.max( + 0, + Math.floor(dayjs.duration(alert.onset.diff(start)).asHours()), + ); + + // How long will the alert last AFTER the start of the first hour of the + // hourly forecast? + const absoluteDuration = Math.ceil( + dayjs + .duration(alert.finish.diff(start.add(offset, "hours"))) + .asHours(), + ); + + // Cap the alert duration at the remaining hours in the forecast. + const duration = Math.min(absoluteDuration, day.hours.length - offset); + + // Save the alert. + day.alerts.items.push({ + id: alert.id, + event: alert.event, + level: alert.metadata.level.text, + offset, + duration, + // The number of hours remaining in the forecast when this alert ends. + remainder: day.hours.length - offset - duration, + }); + }); + + // Get the number of alerts and the "level" of the most significant alert + // and pull those up to the top level. + day.alerts.metadata.count = day.alerts.items.length; + day.alerts.metadata.highest = dayAlerts + .map(({ metadata: { level } }) => level) + .sort((a, b) => { + const priorityA = a.priority; + const priorityB = b.priority; + + return priorityB - priorityA; + }) + .pop()?.text; + } + } + + const satellite = await satellitePromise; + + return { + alerts, + observed, + point, + place, + grid, + forecast: forecast.daily, + satellite, + }; +}; + +export default { getDataForPoint }; diff --git a/api-interop-layer/data/obs/index.js b/api-interop-layer/data/obs/index.js new file mode 100644 index 000000000..d92368ae2 --- /dev/null +++ b/api-interop-layer/data/obs/index.js @@ -0,0 +1,170 @@ +import dayjs from "../../util/day.js"; +import { openDatabase } from "../db.js"; +import isObservationValid from "./valid.js"; +import { convertProperties } from "../../util/convert.js"; +import { fetchAPIJson } from "../../util/fetch.js"; +import { parseAPIIcon } from "../../util/icon.js"; +import { sendNewRelicMetric, createLogger } from "../../util/monitoring/index.js"; + +const logger = createLogger("observations"); + +export default async ({ + grid: { wfo, x, y }, + point: { latitude, longitude }, +}) => { + const dbPromise = openDatabase(); + + const stations = await fetchAPIJson( + `/gridpoints/${wfo}/${x},${y}/stations`, + ).then((out) => { + if (out.error) { + return out; + } + if (!Array.isArray(out.features) || out.features.length === 0) { + return { error: true }; + } + + return out.features.slice(0, 3); + }); + if (stations.error) { + logger.warn("Failed to get a list of stations"); + return { + error: true, + message: "Failed to find an approved observation station", + }; + } + + let station = stations.shift(); + + const others = stations.map(({ properties: { stationIdentifier } }) => + fetchAPIJson(`/stations/${stationIdentifier}/observations?limit=1`).then( + (out) => { + if (out.error) { + logger.warn(`station ${stationIdentifier} returned an error`); + return out; + } + if (!Array.isArray(out.features) || out.features.length === 0) { + logger.warn(`station ${stationIdentifier} returned, but has no data`); + return { error: true, message: "No valid observations found." }; + } + + return out.features[0].properties; + }, + ), + ); + + let observation = await fetchAPIJson( + `/stations/${station.properties.stationIdentifier}/observations?limit=1`, + ).then((out) => { + if (out.error) { + logger.warn( + `station ${station.properties.stationIdentifier} returned an error`, + ); + return out; + } + if (!Array.isArray(out.features) || out.features.length === 0) { + logger.warn( + `station ${station.properties.stationIdentifier} returned, but has no data`, + ); + return { error: true, message: "No valid observations found." }; + } + + return out.features[0].properties; + }); + + if (!isObservationValid(observation)) { + logger.warn( + `observations from ${station.properties.stationIdentifier} (first choice) are invalid`, + ); + + /* eslint-disable prefer-destructuring */ + const fallbackObs = await Promise.all(others); + if (isObservationValid(fallbackObs[0])) { + station = stations[0]; + observation = fallbackObs[0]; + logger.info( + `observations from ${station.properties.stationIdentifier} (second choice) are valid`, + ); + } else if (isObservationValid(fallbackObs[1])) { + station = stations[1]; + observation = fallbackObs[1]; + logger.info( + `observations from ${station.properties.stationIdentifier} (third choice) are valid`, + ); + } else { + logger.warn( + `observations from ${stations.map(({ properties: { stationIdentifier } }) => stationIdentifier).join(", ")} (second and third choice) are invalid`, + ); + + station = null; + observation = null; + } + /* eslint-enable prefer-destructuring */ + } + + if (station && observation) { + logger.verbose( + `using observations from ${station.properties.stationIdentifier}`, + ); + + const db = await dbPromise; + + const data = Object.keys(observation) + .filter((key) => observation[key]?.unitCode) + .reduce((o, key) => ({ ...o, [key]: observation[key] }), {}); + + // Add a "feels like" property, which is coerced from the heat index and + // wind chill, if provided. + data.feelsLike = data.heatIndex; + + // Can't just check truthiness because 0 is valid. + if (Number.isNaN(Number.parseInt(data.feelsLike?.value, 10))) { + data.feelsLike = data.windChill; + } + if (Number.isNaN(Number.parseInt(data.feelsLike?.value, 10))) { + data.feelsLike = data.temperature; + } + + convertProperties(data); + + const [{ distance }] = await db.query(` + SELECT ST_DISTANCE_SPHERE( + ST_GEOMFROMGEOJSON('${JSON.stringify(station.geometry)}'), + ST_SRID(ST_GEOMFROMTEXT('POINT(${longitude} ${latitude})'), 4326) + ) as distance + `); + await db.end(); + + sendNewRelicMetric({ + name: "wx.observation", + type: "gauge", + value: distance, + attributes: { + stationIndex: stations.indexOf(station) + 1, + obsStation: station.properties.stationIdentifier, + }, + }); + + return { + timestamp: { + formatted: observation.timestamp, + utc: dayjs(observation.timestamp), + }, + icon: parseAPIIcon(observation.icon), + description: observation.textDescription, + station: convertProperties({ + id: station.properties.stationIdentifier, + name: station.properties.name, + elevation: station.properties.elevation, + distance: { + unitCode: "wmoUnit:m", + value: distance, + }, + }), + data, + }; + } + + logger.warn(`No valid observations found for ${wfo}/${x}/${y}`); + return { error: true, message: "No valid observations found" }; +}; diff --git a/api-interop-layer/data/obs/index.test.js b/api-interop-layer/data/obs/index.test.js new file mode 100644 index 000000000..ebd4ed5ea --- /dev/null +++ b/api-interop-layer/data/obs/index.test.js @@ -0,0 +1,419 @@ +import { expect } from "chai"; +import * as mariadb from "mariadb"; +import sinon, { createSandbox } from "sinon"; + +describe("observations module", () => { + const sandbox = createSandbox(); + const stations = { + status: 200, + json: sandbox.stub(), + }; + + const response = { + status: 200, + json: sandbox.stub(), + }; + + const db = { + query: sandbox.stub(), + end: () => Promise.resolve(), + }; + + let getObservations; + + before(async () => { + mariadb.default.createConnection.resolves(db); + + // Import the module now. Its dependency on the database will cause a hang + // if we load it before the mocking is all setup. The reason is that the + // database utility itself blocks until it can establish a connection. + const module = await import("./index.js"); + getObservations = module.default; + }); + + beforeEach(() => { + response.status = 200; + stations.response = 200; + + stations.json.resolves({ + features: [ + { properties: { stationIdentifier: "station1" } }, + { properties: { stationIdentifier: "station2" } }, + { properties: { stationIdentifier: "station3" } }, + ], + }); + + fetch + .withArgs("https://api.weather.gov/gridpoints/TEST/1,1/stations") + .resolves(stations); + + // We need to specifically deal with all of these endpoints for every test + // because the obs module automatically retries them if they fail. If we + // don't make them, they'll reject. Most of the tests will still pass + // because we're ultimately not relying on 2nd and 3rd stations, but they'll + // possibly be slower as a result. + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves(response); + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves(response); + fetch + .withArgs( + "https://api.weather.gov/stations/station3/observations?limit=1", + ) + .resolves(response); + + db.query.resolves([{ distance: 100 }]); + }); + + describe("properly handles feels-like temperature", () => { + it("uses actual temperature if heat index and wind chill are empty", async () => { + response.json.resolves({ + features: [ + { + properties: { + temperature: { value: 100, unitCode: "wmoUnit:degC" }, + }, + }, + ], + }); + + const expected = { degC: 100, degF: 212 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.feelsLike).to.eql(expected); + }); + + it("uses heat index if present", async () => { + response.json.resolves({ + features: [ + { + properties: { + temperature: { value: 100, unitCode: "wmoUnit:degC" }, + heatIndex: { value: 100, unitCode: "wmoUnit:degC" }, + }, + }, + ], + }); + + const expected = { degC: 100, degF: 212 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.feelsLike).to.eql(expected); + }); + + it("uses wind chill if it is present and there is no heat index", async () => { + response.json.resolves({ + features: [ + { + properties: { + temperature: { value: 100, unitCode: "wmoUnit:degC" }, + windChill: { value: 100, unitCode: "wmoUnit:degC" }, + }, + }, + ], + }); + + const expected = { degC: 100, degF: 212 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.feelsLike).to.eql(expected); + }); + }); + + describe("properly handles null and zero wind", () => { + it("preserves null if the wind is null", async () => { + response.json.resolves({ + features: [ + { + properties: { + // Temperature is always required for a valid obs + temperature: { value: 100, unitCode: "wmoUnit:degC" }, + windSpeed: { + unitCode: "wmoUnit:km_h-1", + value: null, + }, + }, + }, + ], + }); + + const expected = { mph: null, "km/h": null }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.windSpeed).to.eql(expected); + }); + + it("preserves zero if the wind is zero", async () => { + response.json.resolves({ + features: [ + { + properties: { + // Temperature is always required for a valid obs + temperature: { value: 100, unitCode: "wmoUnit:degC" }, + windSpeed: { + unitCode: "wmoUnit:km_h-1", + value: 0, + }, + }, + }, + ], + }); + + const expected = { mph: 0, "km/h": 0 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.windSpeed).to.eql(expected); + }); + }); + + describe("handles errors", () => { + describe("all observation stations return invalid data", () => { + const features = [ + { + properties: { + temperature: { value: null, unitCode: "wmoUnit:degC" }, + }, + }, + ]; + const invalid = { + status: 200, + json: sinon.stub().resolves(features), + }; + + it("tries the second observation if the first is invalid", async () => { + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves({ + status: 200, + json: sinon.stub().resolves({ + features: [ + { + properties: { + temperature: { value: 50, unitCode: "wmoUnit:degC" }, + }, + }, + ], + }), + }); + + const expected = { degC: 50, degF: 122 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.temperature).to.eql(expected); + }); + + it("tries the third observation if the second is invalid", async () => { + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station3/observations?limit=1", + ) + .resolves({ + status: 200, + json: sinon.stub().resolves({ + features: [ + { + properties: { + temperature: { value: 25, unitCode: "wmoUnit:degC" }, + }, + }, + ], + }), + }); + + const expected = { degC: 25, degF: 77 }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs.data.temperature).to.eql(expected); + }); + + describe("returns an error if all observations are invalid", () => { + it("all stations return invalid observations", async () => { + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station3/observations?limit=1", + ) + .resolves(invalid); + + const expected = { + error: true, + message: "No valid observations found", + }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs).to.eql(expected); + }); + + it("all stations return no observations", async () => { + const originalFeatures = [...features]; + features.length = 0; + + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves(invalid); + + fetch + .withArgs( + "https://api.weather.gov/stations/station3/observations?limit=1", + ) + .resolves(invalid); + + const expected = { + error: true, + message: "No valid observations found", + }; + + const obs = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(obs).to.eql(expected); + + features.push(...originalFeatures); + }); + }); + }); + + it("returns an error if none of the stations return", async () => { + fetch + .withArgs( + "https://api.weather.gov/stations/station1/observations?limit=1", + ) + .resolves({ status: 400 }); + fetch + .withArgs( + "https://api.weather.gov/stations/station2/observations?limit=1", + ) + .resolves({ status: 400 }); + fetch + .withArgs( + "https://api.weather.gov/stations/station3/observations?limit=1", + ) + .resolves({ status: 400 }); + + const expected = { + error: true, + message: "No valid observations found", + }; + + const actual = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(actual).to.eql(expected); + }); + + it("returns an error if getting the list of stations fails", async () => { + fetch + .withArgs("https://api.weather.gov/gridpoints/TEST/1,1/stations") + .rejects(); + + const expected = { + error: true, + message: "Failed to find an approved observation station", + }; + + const actual = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(actual).to.eql(expected); + }); + + it("returns an error if the list of stations is zero", async () => { + stations.json.resolves({ features: [] }); + + const expected = { + error: true, + message: "Failed to find an approved observation station", + }; + + const actual = await getObservations({ + grid: { wfo: "TEST", x: 1, y: 1 }, + point: {}, + }); + + expect(actual).to.eql(expected); + }); + }); +}); diff --git a/api-interop-layer/data/obs/valid.js b/api-interop-layer/data/obs/valid.js new file mode 100644 index 000000000..0daa3c8b8 --- /dev/null +++ b/api-interop-layer/data/obs/valid.js @@ -0,0 +1,11 @@ +export default (observation) => { + if (observation.error) { + return false; + } + + // The temperature must exist and must not be null. + if (observation.temperature?.value === null) { + return false; + } + return true; +}; diff --git a/api-interop-layer/data/points.js b/api-interop-layer/data/points.js new file mode 100644 index 000000000..da2061d95 --- /dev/null +++ b/api-interop-layer/data/points.js @@ -0,0 +1,48 @@ +import { openDatabase } from "./db.js"; +import { fetchAPIJson } from "../util/fetch.js"; +import { createLogger } from "../util/monitoring/index.js"; + +const logger = createLogger("point"); + +export default async (latitude, longitude) => { + logger.verbose(`getting information for place at ${latitude}, ${longitude}`); + const point = { latitude, longitude }; + + const pointsPromise = fetchAPIJson(`/points/${latitude},${longitude}`).then( + (data) => { + if (data.error) { + return { error: true }; + } + + return { + wfo: data.properties.gridId, + x: data.properties.gridX, + y: data.properties.gridY, + }; + }, + ); + + const db = await openDatabase(); + const placePromise = db + .query( + `SELECT + name,state,stateName,county,timezone,stateFIPS,countyFIPS + FROM weathergov_geo_places + ORDER BY ST_DISTANCE(point,ST_GEOMFROMTEXT('POINT(${longitude} ${latitude})')) + LIMIT 1`, + ) + .then((row) => { + if (Array.isArray(row) && row.length > 0) { + return row[0]; + } + return null; + }); + + const [grid, place] = await Promise.all([pointsPromise, placePromise]); + + if (place && place.name && place.state) { + place.fullName = `${place.name}, ${place.state}`; + } + + return { point, place, grid }; +}; diff --git a/api-interop-layer/data/satellite.js b/api-interop-layer/data/satellite.js new file mode 100644 index 000000000..b46ca2159 --- /dev/null +++ b/api-interop-layer/data/satellite.js @@ -0,0 +1,26 @@ +import { createLogger } from "../util/monitoring/index.js"; +import { fetchAPIJson } from "../util/fetch.js"; + +const logger = createLogger("satellite"); + +export default async ({ grid: { wfo } }) => { + try { + const satelliteMetadata = await fetchAPIJson( + `https://cdn.star.nesdis.noaa.gov/WFO/catalogs/WFO_02_${wfo.toLowerCase()}_catalog.json`, + ); + + const satellite = satelliteMetadata?.meta?.satellite; + if (satellite) { + const goes = satellite === "GOES-West" ? "GOES18" : "GOES16"; + + return { + gif: `https://cdn.star.nesdis.noaa.gov/WFO/${wfo.toLowerCase()}/GEOCOLOR/${goes}-${wfo.toUpperCase()}-GEOCOLOR-600x600.gif`, + }; + } + } catch (e) { + logger.error(`Error getting satellite metadata for ${wfo}`); + logger.error(e.message); + } + + return { error: true }; +}; diff --git a/api-interop-layer/data/satellite.test.js b/api-interop-layer/data/satellite.test.js new file mode 100644 index 000000000..f2d165aac --- /dev/null +++ b/api-interop-layer/data/satellite.test.js @@ -0,0 +1,50 @@ +import { expect } from "chai"; +import { createSandbox } from "sinon"; +import getSatelliteData from "./satellite.js"; + +describe("satellite metadata module", () => { + const sandbox = createSandbox(); + const response = { + status: 200, + json: sandbox.stub(), + }; + + beforeEach(() => { + response.status = 200; + fetch.resolves(response); + }); + + describe("returns a URL if everything goes well", () => { + it("for GOES-16 imagery", async () => { + response.json.resolves({ meta: { satellite: "GOES-West" } }); + const actual = await getSatelliteData({ grid: { wfo: "wfo1" } }); + + expect(actual).to.eql({ + gif: "https://cdn.star.nesdis.noaa.gov/WFO/wfo1/GEOCOLOR/GOES18-WFO1-GEOCOLOR-600x600.gif", + }); + }); + + it("for GOES-18 imagery", async () => { + response.json.resolves({ meta: { satellite: "GOES-East" } }); + const actual = await getSatelliteData({ grid: { wfo: "wfo2" } }); + + expect(actual).to.eql({ + gif: "https://cdn.star.nesdis.noaa.gov/WFO/wfo2/GEOCOLOR/GOES16-WFO2-GEOCOLOR-600x600.gif", + }); + }); + }); + + it("returns an error object if the metadata is invalid", async () => { + response.json.resolves({ nometa: {} }); + const actual = await getSatelliteData({ grid: { wfo: "wfo3" } }); + + expect(actual).to.eql({ error: true }); + }); + + it("returns an error object if the metadata fetch is unsuccessful", async () => { + response.status = 404; + const actual = await getSatelliteData({ grid: { wfo: "wfo4" } }); + + expect(actual).to.eql({ error: true }); + }); +}); diff --git a/api-interop-layer/interop-layer.schema.json b/api-interop-layer/interop-layer.schema.json new file mode 100644 index 000000000..fa76a6067 --- /dev/null +++ b/api-interop-layer/interop-layer.schema.json @@ -0,0 +1,747 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://weather.gov/interop.schema.json", + "title": "weather.gov API interoperability layer", + "description": "The results of querying for a specific latitude and longitude", + "type": "object", + "properties": { + "alerts": { + "title": "Point alerts", + "description": "Alerts that are applicable to the given lat/lon.", + "type": "object", + "properties": { + "items": { + "title": "List of alerts", + "description": "The alerts themselves", + "type": "array", + "items": { + "title": "Alert", + "type": "object", + "properties": { + "metadata": { + "title": "Alert metadata", + "description": "Prioritization and categorization metadata", + "type": "object", + "properties": { + "level": { + "title": "Alert level", + "description": "Alert level information", + "type": "object", + "properties": { + "priority": { + "description": "The priority of this alert relative to others. Lower numbers are higher priority.", + "type": "integer" + }, + "text": { + "$ref": "#/$defs/alert/level" + } + }, + "required": ["priority", "text"] + }, + "kind": { + "$ref": "#/$defs/alert/level" + }, + "priority": { + "description": "The priority of this alert relative to others. Lower numbers are higher priority.", + "type": "integer" + } + }, + "required": ["level", "kind", "priority"] + }, + "id": { + "description": "ID of this alert. NOTE: may not be globally unique", + "type": "string" + }, + "event": { + "description": "The alert event, such as 'Severe Thunderstorm Warning.'", + "type": "string" + }, + "sender": { + "description": "The government office responsible for issuing this alert. Usually a NWS office, but sometimes state or local civil authorities.", + "type": "string" + }, + "locations": { + "title": "Alert locations", + "description": "A list of counties by state region and cities, if an alert description includes embedded location information.", + "type": "object", + "properties": { + "regions": { + "title": "List of regions", + "description": "A list of state regions covered by this alert, as derived from the alert description.", + "type": "array", + "items": { + "title": "Alert location", + "type": "object", + "properties": { + "area": { + "description": "The name of a state region covered by this alert, as derived from the alert description.", + "type": "string" + }, + "counties": { + "title": "List of counties", + "description": "A list of counties within this state region covered by this alert, as derived from the alert description.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["area", "counties"] + } + }, + "cities": { + "title": "List of cities", + "description": "A list of cities impacted by this alert, as derived from the alert description.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["regions", "cities"] + }, + "description": { + "title": "List of parsed content nodes", + "description": "The alert description, parsed into content nodes.", + "type": "array", + "items": { + "title": "Parsed content node", + "type": "object", + "properties": { + "type": { + "description": "The kind of content node", + "type": "string", + "enum": ["heading", "paragraph"] + }, + "nodes": { + "title": "List of parsed in-paragraph nodes", + "description": "For paragraph nodes, the list of content nodes that go into the paragraph.", + "type": "array", + "items": { + "title": "Parsed in-paragraph node", + "type": "object", + "properties": { + "type": { + "description": "The type of in-paragraph content node.", + "type": "string", + "enum": ["text", "link"] + }, + "text": { + "description": "For text nodes, the textual content.", + "type": "string" + }, + "url": { + "description": "For link nodes, the URL.", + "type": "string" + }, + "external": { + "description": "For link nodes, whether the link is for a site outside of weather.gov.", + "type": "boolean" + } + }, + "required": ["type"] + } + }, + "text": { + "description": "For heading nodes, the textual content of the node", + "type": "string" + } + }, + "required": ["type"] + } + }, + "instruction": { + "description": "Safety instructions associated with the alert", + "type": "string" + }, + "area": { + "title": "List of areas", + "description": "A list of areas affected by this alert, as provided by the origin.", + "type": "array", + "items": { + "type": "string" + } + }, + "sent": { + "description": "When the alert was initially sent.", + "type": "string", + "format": "date-time" + }, + "effective": { + "description": "When the alert becomes effective.", + "type": "string", + "format": "date-time" + }, + "onset": { + "description": "When the conditions described in the alert are forecast to begin.", + "type": "string", + "format": "date-time" + }, + "expires": { + "description": "When the alert will expire. NOTE: this is NOT when the hazardous conditions are forecast to end.", + "type": "string", + "format": "date-time" + }, + "ends": { + "description": "When the conditions described in the alert are forecast to end.", + "type": ["string", "null"], + "format": "date-time" + }, + "finish": { + "description": "When the alert will no longer displayed on weather.gov, as derived from the expires and ends properties.", + "type": "string", + "format": "date-time" + }, + "geometry": { + "description": "GeoJSON GeometryCollection representing the area covered by this alert.", + "$ref": "https://geojson.org/schema/GeometryCollection.json" + }, + "duration": { + "description": "When the alert will no longer be displayed on weather.gov, in human-friendly text based on the timezone of the alert area.", + "type": "string" + }, + "timing": { + "title": "Alert timing", + "description": "Human-friendly text describing the beginning and completion of the alert, based on the timezone of the alert area.", + "type": "object", + "properties": { + "start": { + "type": "string" + }, + "end": { + "type": "string" + } + }, + "required": ["start", "end"] + } + }, + "required": [ + "id", + "event", + "sender", + "description", + "instruction", + "area", + "sent", + "effective", + "onset", + "expires", + "ends", + "finish", + "geometry", + "duration", + "timing" + ] + } + }, + "highestLevel": { + "$ref": "#/$defs/alert/level" + } + }, + "required": ["items", "highestLevel"] + }, + "point": { + "title": "Point", + "description": "Information about the point", + "type": "object", + "properties": { + "latitude": { + "type": "number", + "minimum": -90, + "maximum": 90 + }, + "longitude": { + "type": "number", + "minimum": -360, + "maximum": 360 + } + }, + "required": ["latitude", "longitude"] + }, + "place": { + "title": "Place", + "description": "Information about the place at the described point, as close as we know.", + "type": "object", + "properties": { + "name": { + "description": "City or other municipal name.", + "type": "string" + }, + "state": { + "description": "2-letter abbreviation of the state or territory.", + "type": "string", + "minLength": 2, + "maxLength": 2 + }, + "stateName": { + "description": "Full name of the state.", + "type": "string" + }, + "county": { + "description": "Full name of the county.", + "type": "string" + }, + "timezone": { + "description": "Full tzdb name of the timezone at this point, as best we know.", + "type": "string" + }, + "stateFIPS": { + "description": "2-digit FIPS code for this state.", + "type": "string", + "pattern": "^\\d{2}$" + }, + "countyFIPS": { + "description": "5-digit FIPS code for this county. Note that this value has the state FIPS code prepended to the usual 3-digit county FIPS code.", + "type": "string", + "pattern": "^\\d{5}$" + }, + "fullName": { + "description": "The full name of this place, with state or territory abbreviation.", + "type": "string" + } + }, + "required": [ + "name", + "state", + "stateName", + "county", + "timezone", + "stateFIPS", + "countyFIPS", + "fullName" + ] + }, + "grid": { + "title": "NWS Grid", + "description": "The NWS grid cell that this point falls in.", + "type": "object", + "properties": { + "wfo": { + "description": "The NWS weather forecasting office (WFO) that serves this point.", + "type": "string", + "pattern": "^[A-Z]{3}$" + }, + "x": { + "description": "WFO grid X coordinate.", + "type": "integer" + }, + "y": { + "description": "WFO grid Y coordinate.", + "type": "integer" + }, + "geometry": { + "description": "GeoJSON Polygon representing the area covered by this WFO grid cell.", + "$ref": "https://geojson.org/schema/Polygon.json" + }, + "elevation": { + "description": "Elevation of this grid point.", + "$ref": "#/$defs/measures/distance" + } + }, + "required": ["wfo", "x", "y", "geometry", "elevation"] + }, + "observed": { + "title": "Observations", + "description": "Most-recently observed conditions for this location from the nearest approved observation station.", + "type": "object", + "properties": { + "timestamp": { + "description": "When the observation was recorded.", + "type": "string", + "format": "date-time" + }, + "icon": { + "$ref": "#/$defs/icon" + }, + "description": { + "description": "Textual description of the observed conditions, if available.", + "type": "string" + }, + "station": { + "title": "Observation station", + "description": "Metadata about the observation station that reported this data.", + "type": "object", + "properties": { + "id": { + "description": "The 4-character ID for the observation station.", + "type": "string", + "pattern": "^[A-Z0-9]{4}$" + }, + "name": { + "description": "The full name of the observation station.", + "type": "string" + }, + "elevation": { + "description": "The elevation at the observation station.", + "$ref": "#/$defs/measures/distance" + }, + "distance": { + "description": "The flat-ground distance between the observation station and the requested point.", + "$ref": "#/$defs/measures/distance" + } + }, + "required": ["id", "name", "elevation", "distance"] + }, + "data": { + "title": "Observation data", + "description": "The observed data. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The data provided by the NWS public API is converted into US and SI units.", + "type": "object" + } + }, + "required": ["timestamp", "icon", "station", "data"] + }, + "forecast": { + "title": "Forecast", + "description": "Forecast for this point.", + "type": "object", + "properties": { + "generated": { + "description": "When the forecast was generated.", + "type": "string", + "format": "date-time" + }, + "updated": { + "description": "When the forecast was last updated.", + "type": "string", + "format": "date-time" + }, + "valid": { + "description": "When the forecast is valid. This is a combination of ISO 8601 date-time and duration, in the form 'date-time/duration'.", + "type": "string" + }, + "days": { + "title": "List of daily forecasts", + "description": "The daily forecasts for each day in the forecast period.", + "type": "array", + "items": { + "title": "Daily forecast", + "type": "object", + "properties": { + "start": { + "description": "The starting time for this daily forecast.", + "type": "string", + "format": "date-time" + }, + "end": { + "description": "The ending time for this daily forecast.", + "type": "string", + "format": "date-time" + }, + "periods": { + "title": "List of daily forecast periods", + "description": "The periods of the daily forecast, such as overnight, day, and night.", + "type": "array", + "items": { + "title": "Daily forecast period", + "type": "object", + "properties": { + "start": { + "description": "The starting time for this period of the daily forecast.", + "type": "string", + "format": "date-time" + }, + "end": { + "description": "The ending time for this period of the daily forecast.", + "type": "string", + "format": "date-time" + }, + "isDaytime": { + "description": "Whether this period represents the daytime period. A period can be daytime, nighttime, or overnight.", + "type": "boolean" + }, + "isOvernight": { + "description": "Whether this period represents the overnight period. A period can be daytime, nighttime, or overnight.", + "type": "boolean" + }, + "monthAndDay": { + "description": "The short month name (eg, Jan, Feb, etc.) and day number that this forecast period applies to. Formatted in en-US locale.", + "type": "string", + "pattern": "^[A-Z][a-z]{2} d{1,2}$" + }, + "dayName": { + "description": "The name of the day this forecast period applies to, or 'Today' if it's the current day. Uses English day names.", + "type": "string", + "pattern": "^[A-Z][a-z]+$" + }, + "timeLabel": { + "description": "Textual representation of the hour range covered by this period, in the timezone of the location.", + "type": "string", + "pattern": "^1?[0-9]-1?[0-9]$" + }, + "data": { + "title": "Daily forecast period data", + "description": "The forecast data for this period.", + "type": "object", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "description": { + "description": "Textual description of the forecast period conditions.", + "type": "text" + }, + "temperature": { + "description": "Forecast temperature for this forecast period.", + "$ref": "#/$defs/measures/temperature" + }, + "probabilityOfPrecipitation": { + "description": "Forecast probability of precipitation for this forecast period.", + "type": "integer" + }, + "windSpeed": { + "description": "Forecast wind speed for this forecast period.", + "$ref": "#/$defs/measures/speed" + }, + "windDirection": { + "description": "Forecast wind direction for this forecast period, in cardinal/ordinal direction (eg, N, NW, WNW, etc.).", + "type": "string" + } + } + } + } + } + }, + "qpf": { + "title": "List of hourly QPFs", + "description": "Forecast quantitative precipitation for this forecast period. Note that QPF is delivered in multi-hour totals rather than individual-hour totals, so it must be treated differently than other forecast period data.", + "type": "array", + "allOf": [ + { + "$ref": "#/$defs/measures/length" + } + ], + "items": { + "title": "QPF", + "type": "object", + "properties": { + "start": { + "description": "The starting time for this QPF forecast.", + "type": "string", + "format": "date-time" + }, + "end": { + "description": "The ending time for this QPF forecast.", + "type": "string", + "format": "date-time" + }, + "startHour": { + "description": "The starting hour in the timezone of the forecast, in AM/PM.", + "type": "string", + "pattern": "^1?\\d (A|P)M$" + }, + "endHour": { + "description": "The ending hour in the timezone of the forecast, in AM/PM.", + "type": "string", + "pattern": "^1?\\d (A|P)M$" + } + } + } + }, + "hours": { + "title": "List of hourly forecasts", + "description": "Hourly forecast for each hour of this daily forecast period. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The properties listed below are created by weather.gov and are the only guaranteed properties.", + "type": "array", + "items": { + "title": "Hourly forecast", + "type": "object", + "properties": { + "time": { + "description": "The time at which this hourly forecast begins.", + "type": "string", + "format": "date-time" + }, + "hour": { + "description": "Human-friendly hour when the hourly forecast begins. Eg, '6 AM", + "type": "string", + "pattern": "^1?\\d (A|P)M$" + }, + "icon": { + "$ref": "#/$defs/icon" + } + }, + "required": ["time", "hour"] + } + }, + "alerts": { + "title": "Daily forecast alerts", + "description": "Information about alerts that are valid during this forecast day.", + "type": "object", + "properties": { + "metadata": { + "title": "Daily forecast alert metadata", + "description": "Top-level metadata about the alerts for this forecast day.", + "type": "object", + "properties": { + "count": { + "description": "The number of alerts that are applicable to this forecast day.", + "type": "integer" + }, + "highest": { + "$ref": "#/$defs/alert/level" + } + } + }, + "items": { + "title": "List of alerts", + "description": "List of alerts.", + "type": "array", + "items": { + "title": "Daily forecast alert", + "type": "object", + "properties": { + "id": { + "description": "An ID for this alert. NOTE: this may not be globally unique.", + "type": "string" + }, + "event": { + "description": "The event type for the alert. Eg, 'Severe Thunderstorm Warning,' etc.", + "type": "string" + }, + "level": { + "$ref": "#/$defs/alert/level" + }, + "offset": { + "description": "The number of hours after the first whole hour covered by this forecast period when the alert will begin.", + "type": "integer" + }, + "duration": { + "description": "The number of hours that this alert will be active after the first whole hour of this forecast period, up to the total number of hours remaining in the forecast period.", + "type": "integer" + }, + "remainder": { + "description": "The number of hours that this alert will be active in excess of the duration property.", + "type": "integer" + } + } + } + } + } + } + }, + "required": ["start", "end", "periods", "qpf", "hours", "alerts"] + } + } + }, + "required": ["generated", "updated", "valid", "days"] + }, + "satellite": { + "title": "Satellite", + "description": "Information about satellite imagery for this point.", + "type": "object", + "properties": { + "gif": { + "description": "URL to the 600x600 geocolor GIF of the most recent satellite for this point.", + "type": "string", + "format": "uri" + } + } + }, + "@metadata": { + "title": "Response metadata", + "description": "Metadata about the response itself.", + "type": "object", + "properties": { + "timing": { + "title": "Response timing", + "description": "The time spent answering the request.", + "type": "object", + "properties": { + "e2e": { + "description": "Total time spent, in seconds.", + "type": "number" + }, + "api": { + "title": "Response API timing", + "description": "Time spent making and receiving each request and response to the NWS public API. Keys are the API URLs and values are the times in seconds.", + "type": "object" + } + } + }, + "size": { + "description": "The uncompressed size of the data being returned, excluding the metadata, in bytes.", + "type": "integer" + } + } + } + }, + "$defs": { + "alert": { + "kind": { + "description": "The kind of alert", + "type": "string", + "enum": ["land", "marine", "other"] + }, + "level": { + "description": "The alert level, as defined by weather.gov.", + "type": "string", + "enum": ["warning", "watch", "other"] + } + }, + "icon": { + "title": "Icon", + "description": "Information about the icon that represents this forecast period's conditions.", + "type": "object", + "properties": { + "icon": { + "description": "The icon filename, as used by weather.gov.", + "type": "string" + }, + "base": { + "description": "The basename of the icon (without file extension).", + "type": "string" + } + } + }, + "measures": { + "distance": { + "title": "Distance", + "type": "object", + "properties": { + "m": { + "description": "Elevation, in meters.", + "type": "number" + }, + "ft": { + "description": "Elevation, in ft.", + "type": "number" + }, + "mi": { + "description": "Elevation, in miles.", + "type": "number" + } + }, + "required": ["m", "ft", "mi"] + }, + "speed": { + "title": "Speed", + "type": "object", + "properties": { + "mph": { + "description": "Speed, in miles per hour.", + "type": "integer" + }, + "km/h": { + "description": "Speed, in kilometers per hour.", + "type": "integer" + } + }, + "required": ["mph", "km/h"] + }, + "temperature": { + "title": "Temperature", + "type": "object", + "properties": { + "degF": { + "description": "Temperature, in degrees Fahrenheit.", + "type": "integer" + }, + "degC": { + "description": "Temperature, in degrees Celsius.", + "type": "integer" + } + }, + "required": ["degF", "degC"] + } + } + } +} diff --git a/api-interop-layer/main.js b/api-interop-layer/main.js new file mode 100644 index 000000000..0357c6511 --- /dev/null +++ b/api-interop-layer/main.js @@ -0,0 +1,88 @@ +import fastify from "fastify"; +import newrelic from "newrelic"; +import { getDataForPoint } from "./data/index.js"; +import { rest as alertsRest } from "./data/alerts/kinds.js"; +import { createLogger } from "./util/monitoring/index.js"; + +const main = async () => { + const port = process.env.PORT || 8082; + const server = fastify(); + const logger = createLogger("main"); + + server.setErrorHandler((err, request, reply) => { + logger.error(err); + reply.status(500).send({ error: true }); + }); + + process.on("uncaughtException", (err) => { + logger.error("Uncaught exception"); + logger.error(err); + }); + + server.get("/", (_, response) => { + response.send({ ok: true }); + }); + + server.route({ + method: "GET", + url: "/point/:latitude/:longitude", + schema: { + params: { + latitude: { + type: "number", + minimum: -90, + maximum: 90, + }, + longitude: { + type: "number", + minimum: -180, + maximum: 180, + }, + }, + }, + handler: async (request, response) => { + logger.verbose(request.url); + + const { latitude, longitude } = request.params; + performance.clearResourceTimings(); + const timer = performance.now(); + const data = await getDataForPoint(latitude, longitude); + const end = performance.now() - timer; + + const apiTimings = performance + .getEntriesByType("resource") + .filter(({ initiatorType }) => initiatorType === "fetch") + .reduce( + (all, { name, duration }) => ({ ...all, [name]: duration }), + {}, + ); + + if (data.error) { + // track this error in New Relic + newrelic.recordLogEvent({ message: request.url, level: "error", error: data.error }); + + // If there is a top-level error, set the status code accordingly. + if (data.status) { + response.code(data.status); + } + } + + response.send({ + ...data, + "@metadata": { + timing: { e2e: end, api: apiTimings }, + size: JSON.stringify(data).length, + }, + }); + }, + }); + + server.get("/meta/alerts", (_, response) => { + response.send(alertsRest()); + }); + + await server.listen({ port, host: "0.0.0.0" }); + logger.info(`Listening on ${port}`); +}; + +main(); diff --git a/api-interop-layer/mocha.js b/api-interop-layer/mocha.js new file mode 100644 index 000000000..a2f6b8fbd --- /dev/null +++ b/api-interop-layer/mocha.js @@ -0,0 +1,19 @@ +import sinon from "sinon"; // eslint-disable-line import/no-extraneous-dependencies +import * as mariadb from "mariadb"; + +export async function mochaGlobalSetup() { + sinon.stub(global, "fetch"); + sinon.stub(mariadb.default, "createConnection"); +} + +export async function mochaGlobalTeardown() { + global.fetch.restore(); + mariadb.default.createConnection.restore(); +} + +export const mochaHooks = { + beforeEach() { + fetch.resetHistory(); + fetch.resetBehavior(); + }, +}; diff --git a/api-interop-layer/newrelic.cjs b/api-interop-layer/newrelic.cjs new file mode 100644 index 000000000..c610bafb4 --- /dev/null +++ b/api-interop-layer/newrelic.cjs @@ -0,0 +1,53 @@ +'use strict' +/** + * New Relic agent configuration. + * + * See lib/config/default.js in the agent distribution for a more complete + * description of configuration variables and their potential values. + */ +exports.config = { + /** + * Array of application names. + */ + app_name: [`api-interop-${process.env.APP_NAME || 'local'}`], + /** + * Your New Relic license key. + */ + license_key: process.env.NEWRELIC_LICENSE, + logging: { + /** + * Level at which to log. 'trace' is most useful to New Relic when diagnosing + * issues with the agent, 'info' and higher will impose the least overhead on + * production applications. + */ + level: 'info' + }, + /** + * When true, all request headers except for those listed in attributes.exclude + * will be captured for all traces, unless otherwise specified in a destination's + * attributes include/exclude lists. + */ + allow_all_headers: true, + attributes: { + /** + * Prefix of attributes to exclude from all destinations. Allows * as wildcard + * at end. + * + * NOTE: If excluding headers, they must be in camelCase form to be filtered. + * + * @name NEW_RELIC_ATTRIBUTES_EXCLUDE + */ + exclude: [ + 'request.headers.cookie', + 'request.headers.authorization', + 'request.headers.proxyAuthorization', + 'request.headers.setCookie*', + 'request.headers.x*', + 'response.headers.cookie', + 'response.headers.authorization', + 'response.headers.proxyAuthorization', + 'response.headers.setCookie*', + 'response.headers.x*' + ] + } +} diff --git a/api-interop-layer/package-lock.json b/api-interop-layer/package-lock.json new file mode 100644 index 000000000..5540df323 --- /dev/null +++ b/api-interop-layer/package-lock.json @@ -0,0 +1,3947 @@ +{ + "name": "wxgov-api-interop-layer", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wxgov-api-interop-layer", + "version": "1.0.0", + "license": "CC0-1.0", + "dependencies": { + "convert": "^5.3.0", + "dayjs": "^1.11.12", + "fastify": "^4.28.1", + "mariadb": "^3.3.1", + "newrelic": "^12.5.0", + "nodemon": "^3.1.4" + }, + "devDependencies": { + "c8": "^10.1.2", + "chai": "^5.1.1", + "chai-as-promised": "^8.0.0", + "mocha": "^10.7.3", + "sinon": "^18.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@contrast/fn-inspect": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@contrast/fn-inspect/-/fn-inspect-4.3.0.tgz", + "integrity": "sha512-XGfFm1iO48fsoiJxh2ngTLqBvo6yweJvu1eMs9QxArLDXxxrQvCQ78zywBhYfQ9fChAOZFsbwoVWYxk390KVKw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.19.0", + "node-gyp-build": "^4.8.1" + }, + "engines": { + "node": ">=16.9.1" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.2.tgz", + "integrity": "sha512-DWp92gDD7/Qkj7r8kus6/HCINeo3yPZWZ3paKgDgsbKbSpoxKg1yvN8xe2Q8uE3zOsPe3bX8FQX2+XValq2yTw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "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, + "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-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "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 + }, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "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, + "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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@newrelic/native-metrics": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-11.0.0.tgz", + "integrity": "sha512-+j6mzlQ7BG8+diL8VaayewSQRo9/wXhB9yWTlvwuGOdJK5v0K4HEoQJ4Vc993kMjbHzJIRWuD04dwQcMklT0eQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.19.0", + "node-gyp-build": "^4.8.1", + "prebuildify": "^6.0.1" + }, + "engines": { + "node": ">=18", + "npm": ">=6" + } + }, + "node_modules/@newrelic/security-agent": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@newrelic/security-agent/-/security-agent-1.5.0.tgz", + "integrity": "sha512-QCKn6WRPNgWPocD1mWwdP3kP1+U9FdOblliXaNbGA6vxXOl9NgBiFv4AgRsJxFNxwPI/6iAeA05Y454Ml8qbyQ==", + "dependencies": { + "axios": "^1.7.4", + "check-disk-space": "^3.4.0", + "content-type": "^1.0.5", + "fast-safe-stringify": "^2.1.1", + "find-package-json": "^1.2.0", + "hash.js": "^1.1.7", + "html-entities": "^2.3.6", + "is-invalid-path": "^1.0.2", + "js-yaml": "^4.1.0", + "jsonschema": "^1.4.1", + "lodash": "^4.17.21", + "log4js": "^6.9.1", + "pretty-bytes": "^5.6.0", + "request-ip": "^3.3.0", + "ringbufferjs": "^2.0.0", + "semver": "^7.5.4", + "sync-request": "^6.1.0", + "unescape": "^1.0.1", + "unescape-js": "^1.1.4", + "uuid": "^9.0.1", + "ws": "^8.17.1" + } + }, + "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, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@prisma/prisma-fmt-wasm": { + "version": "4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085.tgz", + "integrity": "sha512-zYz3rFwPB82mVlHGknAPdnSY/a308dhPOblxQLcZgZTDRtDXOE1MgxoRAys+jekwR4/bm3+rZDPs1xsFMsPZig==", + "optional": true + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@tyriar/fibonacci-heap": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@tyriar/fibonacci-heap/-/fibonacci-heap-2.0.9.tgz", + "integrity": "sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==" + }, + "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==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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==" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==" + }, + "node_modules/c8": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", + "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } + } + }, + "node_modules/c8/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/c8/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chai-as-promised": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-8.0.0.tgz", + "integrity": "sha512-sMsGXTrS3FunP/wbqh/KxM8Kj/aLPXQGkNtvE5wPfSToq8wkkvBpTZo1LIiEVmC4BwkKpag+l5h/20lBMk6nUg==", + "dev": true, + "dependencies": { + "check-error": "^2.0.0" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "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/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/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/check-disk-space": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", + "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==", + "engines": { + "node": ">=16" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "optional": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" + }, + "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/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==", + "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==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/convert/-/convert-5.3.0.tgz", + "integrity": "sha512-8bZ9aL/9ywyBpaPujOoKi+1q68RKEOt0djguntjkc2gBn/mNBudcVjRO2/2F7/1vuh2LQo5BTADDEesd2oh1jw==", + "license": "MIT" + }, + "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 + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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 + }, + "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==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" + }, + "node_modules/fastify": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", + "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "optional": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "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==" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-basic/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/http-basic/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==", + "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/http-basic/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==" + }, + "node_modules/http-basic/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-in-the-middle": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-1.0.2.tgz", + "integrity": "sha512-6KLcFrPCEP3AFXMfnWrIFkZpYNBVzZAoBJJDEZKtI3LXkaDjM3uFMJQjxiizUuZTZ9Oh9FNv/soXbx5TcpaDmA==", + "engines": { + "node": ">=6.0" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "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==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.13.0.tgz", + "integrity": "sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==", + "dependencies": { + "cookie": "^0.6.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "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/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/logform": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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==" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mariadb": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.1.tgz", + "integrity": "sha512-L8bh4iuZU3J8H7Co7rQ6OY9FDLItAN1rGy8kPA7Dyxo8AiHADuuONoypKKp1pE09drs6e5LR7UW9luLZ/A4znA==", + "dependencies": { + "@types/geojson": "^7946.0.14", + "@types/node": "^20.11.17", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "optional": true + }, + "node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/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/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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/mocha/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/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "optional": true + }, + "node_modules/newrelic": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-12.5.0.tgz", + "integrity": "sha512-MwUB6edgtCM6zNoIOUyuO1EYd4NRB093QAfL7jq2t1jzp+MRQ9XVL/fg2ex/xX+HSft2rNNqDs8Yd8p5H/CheA==", + "dependencies": { + "@grpc/grpc-js": "^1.9.4", + "@grpc/proto-loader": "^0.7.5", + "@newrelic/security-agent": "^1.3.0", + "@tyriar/fibonacci-heap": "^2.0.7", + "concat-stream": "^2.0.0", + "https-proxy-agent": "^7.0.1", + "import-in-the-middle": "^1.6.0", + "json-bigint": "^1.0.0", + "json-stringify-safe": "^5.0.0", + "module-details-from-path": "^1.0.3", + "readable-stream": "^3.6.1", + "require-in-the-middle": "^7.4.0", + "semver": "^7.5.2", + "winston-transport": "^4.5.0" + }, + "bin": { + "newrelic-naming-rules": "bin/test-naming-rules.js" + }, + "engines": { + "node": ">=18", + "npm": ">=6.0.0" + }, + "optionalDependencies": { + "@contrast/fn-inspect": "^4.2.0", + "@newrelic/native-metrics": "^11.0.0", + "@prisma/prisma-fmt-wasm": "^4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085" + } + }, + "node_modules/newrelic/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "optional": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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, + "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-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, + "node_modules/prebuildify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", + "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", + "optional": true, + "dependencies": { + "minimist": "^1.2.5", + "mkdirp-classic": "^0.5.3", + "node-abi": "^3.3.0", + "npm-run-path": "^3.1.0", + "pump": "^3.0.0", + "tar-fs": "^2.1.0" + }, + "bin": { + "prebuildify": "bin.js" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/request-ip": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", + "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", + "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/ringbufferjs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ringbufferjs/-/ringbufferjs-2.0.0.tgz", + "integrity": "sha512-GCOqTzUsTHF7nrqcgtNGAFotXztLgiePpIDpyWZ7R5I02tmfJWV+/yuJc//Hlsd8G+WzI1t/dc2y/w2imDZdog==" + }, + "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" + } + ] + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" + }, + "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==", + "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/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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sinon": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/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/sinon/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/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.fromcodepoint": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz", + "integrity": "sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==" + }, + "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==", + "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "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/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/then-request/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/then-request/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==", + "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/then-request/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==" + }, + "node_modules/then-request/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unescape-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.4.tgz", + "integrity": "sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==", + "dependencies": { + "string.fromcodepoint": "^0.2.1" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "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==" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston-transport": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz", + "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==", + "dependencies": { + "logform": "^2.6.1", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "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, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/api-interop-layer/package.json b/api-interop-layer/package.json new file mode 100644 index 000000000..8e7145d27 --- /dev/null +++ b/api-interop-layer/package.json @@ -0,0 +1,28 @@ +{ + "name": "wxgov-api-interop-layer", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "nodemon -e js --experimental-loader newrelic/esm-loader.mjs -r newrelic main.js", + "test": "LOG_LEVEL=silent c8 mocha '**/*.test.js' --exclude 'node_modules/**' --require mocha.js" + }, + "author": "", + "license": "CC0-1.0", + "dependencies": { + "convert": "^5.3.0", + "dayjs": "^1.11.12", + "fastify": "^4.28.1", + "mariadb": "^3.3.1", + "newrelic": "^12.5.0", + "nodemon": "^3.1.4" + }, + "devDependencies": { + "c8": "^10.1.2", + "chai": "^5.1.1", + "chai-as-promised": "^8.0.0", + "mocha": "^10.7.3", + "sinon": "^18.0.0" + } +} diff --git a/api-interop-layer/util/case.js b/api-interop-layer/util/case.js new file mode 100644 index 000000000..67450dc51 --- /dev/null +++ b/api-interop-layer/util/case.js @@ -0,0 +1,10 @@ +export const sentenceCase = (str) => + str?.replace(/ [A-Z]/g, (letter) => letter.toLowerCase()); + +export const titleCase = (str) => + str?.replace( + /\w\S*/g, + (text) => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(), + ); + +export default { sentenceCase, titleCase }; diff --git a/api-interop-layer/util/convert.js b/api-interop-layer/util/convert.js new file mode 100644 index 000000000..0056ee2eb --- /dev/null +++ b/api-interop-layer/util/convert.js @@ -0,0 +1,202 @@ +import convert from "convert"; + +const cardinalLong = [ + "north", + "northeast", + "east", + "southeast", + "south", + "southwest", + "west", + "northwest", + "north", +]; +const cardinalShort = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; + +const unitMapping = new Map([ + [ + "wmoUnit:degC", + { + in: { name: "celsius", label: "degC", decimals: 0 }, + out: [{ name: "fahrenheit", label: "degF", decimals: 0 }], + }, + ], + [ + "wmoUnit:degF", + { + in: { name: "fahrenheit", label: "degF", decimals: 0 }, + out: [{ name: "celsius", label: "degC", decimals: 0 }], + }, + ], + [ + "wmoUnit:km_h-1", + { + in: { name: "km", label: "km/h", decimals: 0 }, + out: [{ name: "miles", label: "mph", decimals: 0 }], + }, + ], + [ + "wxgov:mph", + { + in: { name: "miles", label: "mph", decimals: 0 }, + out: [{ name: "km", label: "km/h", decimals: 0 }], + }, + ], + [ + "wmoUnit:degree_(angle)", + { + in: { name: "degrees", label: "degrees", decimals: 0 }, + out: [ + { + convert: (v) => { + // 1. Whatever degrees we got from the API, constrain it to 0°-360°. + // 2. Add 22.5° to it. This accounts for north starting at -22.5° + // 3. Use integer division by 45° to see which direction index this is. + // This indexes into the two direction name arrays above. + const index = Math.floor(((v % 360) + 22.5) / 45); + return cardinalShort[index]; + }, + label: "cardinalShort", + decimals: 0, + }, + { + convert: (v) => { + // 1. Whatever degrees we got from the API, constrain it to 0°-360°. + // 2. Add 22.5° to it. This accounts for north starting at -22.5° + // 3. Use integer division by 45° to see which direction index this is. + // This indexes into the two direction name arrays above. + const index = Math.floor(((v % 360) + 22.5) / 45); + return cardinalLong[index]; + }, + label: "cardinalLong", + decimals: 0, + }, + ], + }, + ], + [ + "wmoUnit:percent", + { in: { name: "percent", label: "percent", decimals: 0 }, out: [] }, + ], + [ + "wmoUnit:Pa", + { + in: { name: "pascal", label: "pa", decimals: 0 }, + out: [ + { name: "millibar", label: "mb", decimals: 0 }, + { convert: (v) => v / 3386.38, label: "inHg", decimals: 2 }, + ], + }, + ], + [ + "wmoUnit:mm", + { + in: { name: "millimeters", label: "mm", decimals: 2 }, + out: [{ name: "inches", label: "in", decimals: 2 }], + }, + ], + [ + "wmoUnit:m", + { + in: { name: "meters", label: "m", decimals: 0 }, + out: [ + { name: "feet", label: "ft", decimals: 0 }, + { name: "miles", label: "mi", decimals: 0 }, + ], + }, + ], +]); + +const round = (value, { decimals }) => { + if (Number.isNaN(+value)) { + return value; + } + + const multiple = 10 ** decimals; + return Math.round(value * multiple) / multiple; +}; + +export const convertValue = (obj) => { + let unitKey = "unitCode"; + + if (!unitMapping.has(obj.unitCode)) { + unitKey = "uom"; + } + if (!unitMapping.has(obj[unitKey])) { + return obj; + } + + const unit = obj[unitKey]; + const { value } = obj; + delete obj[unitKey]; + delete obj.value; + + const conversion = unitMapping.get(unit); + + // If the input value is null, preserve that. + obj[conversion.in.label] = + value !== null ? round(value, conversion.in) : null; + + for (const out of conversion.out) { + if (value === null) { + obj[out.label] = null; + } else if (out.convert) { + obj[out.label] = out.convert(value); + } else { + obj[out.label] = convert(value, conversion.in.name).to(out.name); + } + + // Likewise preserve nulls in the outputs. + if (obj[out.label] !== null) { + obj[out.label] = round(obj[out.label], out); + } + } + + return obj; +}; + +export const convertProperties = (obj) => { + let unitKey = "unitCode"; + + const keys = Object.keys(obj).filter((key) => { + if (unitMapping.has(obj[key]?.unitCode)) { + return true; + } + if (unitMapping.has(obj[key]?.uom)) { + unitKey = "uom"; + return true; + } + return false; + }); + + for (const key of keys) { + const prop = obj[key]; + const conversion = unitMapping.get(prop[unitKey]); + const { value } = obj[key]; + + // If the input value is null, preserve that. + obj[key] = { + [conversion.in.label]: + value !== null ? round(value, conversion.in) : null, + }; + + for (const out of conversion.out) { + if (value === null) { + obj[key][out.label] = null; + } else if (out.convert) { + obj[key][out.label] = out.convert(value); + } else { + obj[key][out.label] = convert(value, conversion.in.name).to(out.name); + } + + // Likewise preserve nulls in the outputs. + if (obj[key][out.label] !== null) { + obj[key][out.label] = round(obj[key][out.label], out); + } + } + } + + return obj; +}; + +export default { convertProperties }; diff --git a/api-interop-layer/util/day.js b/api-interop-layer/util/day.js new file mode 100644 index 000000000..3d6093163 --- /dev/null +++ b/api-interop-layer/util/day.js @@ -0,0 +1,14 @@ +import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration.js"; +import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; +import isSameOrBefore from "dayjs/plugin/isSameOrBefore.js"; +import tz from "dayjs/plugin/timezone.js"; +import utc from "dayjs/plugin/utc.js"; + +dayjs.extend(duration); +dayjs.extend(isSameOrAfter); +dayjs.extend(isSameOrBefore); +dayjs.extend(tz); +dayjs.extend(utc); + +export default dayjs; diff --git a/api-interop-layer/util/fetch.js b/api-interop-layer/util/fetch.js new file mode 100644 index 000000000..86574c664 --- /dev/null +++ b/api-interop-layer/util/fetch.js @@ -0,0 +1,46 @@ +import { createLogger } from "./monitoring/index.js"; +import { sleep } from "./sleep.js"; + +const logger = createLogger("fetch wrapper"); + +const BASE_URL = process.env.API_URL ?? "https://api.weather.gov"; + +const internalFetch = async (path) => { + const url = URL.canParse(path) ? path : new URL(path, BASE_URL).toString(); + logger.verbose(`making request to ${url}`); + + return fetch(url).then(async (r) => { + if (r.status >= 200 && r.status < 400) { + logger.verbose(`success from ${path}`); + return r.json(); + } + + const response = await r.json(); + logger.error(`non-success on ${path}`); + logger.error(response); + + // If there was a server error, retry. These are often temporary. + if (r.status >= 500) { + const error = new Error(); + error.cause = { ...response, status: r.status }; + return Promise.reject(error); + } + + // For request errors, don't retry. They're not likely to resolve on their + // own so there's no point. + return { status: r.status, ...response, error: true }; + }); +}; + +export const fetchAPIJson = async (path, { wait = sleep } = {}) => + internalFetch(path) + .catch(() => wait(75).then(() => internalFetch(path))) + .catch(() => wait(124).then(() => internalFetch(path))) + .catch(() => wait(204).then(() => internalFetch(path))) + .catch(() => wait(337).then(() => internalFetch(path))) + .catch((e) => { + logger.error(e.cause); + return { ...e.cause, error: true }; + }); + +export default { fetchAPIJson }; diff --git a/api-interop-layer/util/fetch.test.js b/api-interop-layer/util/fetch.test.js new file mode 100644 index 000000000..5807ae9f2 --- /dev/null +++ b/api-interop-layer/util/fetch.test.js @@ -0,0 +1,155 @@ +import sinon from "sinon"; +import { expect, use } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import { fetchAPIJson } from "./fetch.js"; + +use(chaiAsPromised); + +describe("fetch module", () => { + const sandbox = sinon.createSandbox(); + const response = { status: 200, json: sandbox.stub() }; + const wait = sandbox.stub(); + + beforeEach(() => { + response.status = 200; + sandbox.resetBehavior(); + sandbox.resetHistory(); + wait.resolves(); + }); + + it("succeeds on the first attempt", async () => { + response.json.resolves("success"); + fetch.resolves(response); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + expect(result).to.equal("success"); + expect(wait.callCount).to.equal(0); + expect(fetch.callCount).to.equal(1); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("fails once and then succeeds", async () => { + response.json.resolves("success"); + fetch.onCall(0).rejects(); + fetch.onCall(1).resolves(response); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + expect(result).to.equal("success"); + + expect(wait.callCount).to.equal(1); + expect(wait.calledWith(75)).to.equal(true); + + expect(fetch.callCount).to.equal(2); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("fails twice and then succeeds", async () => { + response.json.resolves("success"); + fetch.onCall(0).rejects(); + fetch.onCall(1).rejects(); + fetch.onCall(2).resolves(response); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + expect(result).to.equal("success"); + + expect(wait.callCount).to.equal(2); + expect(wait.calledWith(75)).to.equal(true); + expect(wait.calledWith(124)).to.equal(true); + + expect(fetch.callCount).to.equal(3); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("fails three times and then succeeds", async () => { + response.json.resolves("success"); + fetch.onCall(0).rejects(); + fetch.onCall(1).rejects(); + fetch.onCall(2).rejects(); + fetch.onCall(3).resolves(response); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + expect(result).to.equal("success"); + + expect(wait.callCount).to.equal(3); + expect(wait.calledWith(75)).to.equal(true); + expect(wait.calledWith(124)).to.equal(true); + expect(wait.calledWith(204)).to.equal(true); + + expect(fetch.callCount).to.equal(4); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("fails four times and then succeeds", async () => { + response.json.resolves("success"); + fetch.onCall(0).rejects(); + fetch.onCall(1).rejects(); + fetch.onCall(2).rejects(); + fetch.onCall(3).rejects(); + fetch.onCall(4).resolves(response); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + expect(result).to.equal("success"); + + expect(wait.callCount).to.equal(4); + expect(wait.calledWith(75)).to.equal(true); + expect(wait.calledWith(124)).to.equal(true); + expect(wait.calledWith(204)).to.equal(true); + expect(wait.calledWith(337)).to.equal(true); + + expect(fetch.callCount).to.equal(5); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("fails fives times and gives up", async () => { + fetch.onCall(0).rejects(); + fetch.onCall(1).rejects(); + fetch.onCall(2).rejects(); + fetch.onCall(3).rejects(); + fetch.onCall(4).rejects(); + + const result = await fetchAPIJson("/path/goes/here", { wait }); + + await expect(result).to.eql({ error: true }); + + expect(wait.callCount).to.equal(4); + expect(wait.calledWith(75)).to.equal(true); + expect(wait.calledWith(124)).to.equal(true); + expect(wait.calledWith(204)).to.equal(true); + expect(wait.calledWith(337)).to.equal(true); + + expect(fetch.callCount).to.equal(5); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); + + it("does not retry on request errors (status code 4xx)", async () => { + response.status = 400; + response.json.resolves({ message: "here" }); + fetch.resolves(response); + + const result = await fetchAPIJson("/path/goes/here"); + + expect(result).to.eql({ error: true, status: 400, message: "here" }); + expect(wait.callCount).to.equal(0); + expect(fetch.callCount).to.equal(1); + expect(fetch.calledWith("https://api.weather.gov/path/goes/here")).to.equal( + true, + ); + }); +}); diff --git a/api-interop-layer/util/icon.js b/api-interop-layer/util/icon.js new file mode 100644 index 000000000..8a65874dc --- /dev/null +++ b/api-interop-layer/util/icon.js @@ -0,0 +1,49 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const dir = path.dirname(new URL(import.meta.url).pathname); +const legacyMapping = JSON.parse( + await fs.readFile(`${dir}/icon.legacyMapping.json`), +); + +export const parseAPIIcon = (apiIcon) => { + const icon = { + icon: null, + base: null, + }; + + // Make sure we can parse the icon URL first. If we can't... well... finished! + if (!URL.canParse(apiIcon)) { + return icon; + } + + const iconPath = new URL(apiIcon).pathname + .split("/") + // When an icon URL is split into parts, we can throw away the first three + // parts every time because we don't care about them. They are: + // 1: an empty string, before the leading slash + // 2: "icons" + // 3: "land" + .splice(3) + // Some of the conditions have additional text to indicate something like + // rainfall change or stuff like that. We don't use that, so go ahead and + // remove it. + .map((segment) => segment.replace(/,.*$/, "")); + + // If there are three path components left, that means the API icon is for + // two concurrent conditions. However, we only take the first for now. + // So remove the second condition. + if (iconPath.length === 3) { + iconPath.splice(2, 1); + } + + const iconKey = iconPath.join("/"); + if (legacyMapping[iconKey]) { + icon.icon = legacyMapping[iconKey].icon; + icon.base = icon.icon.slice(0, -4); + } + + return icon; +}; + +export default { parseAPIIcon }; diff --git a/web/modules/weather_data/src/Service/legacyMapping.json b/api-interop-layer/util/icon.legacyMapping.json similarity index 100% rename from web/modules/weather_data/src/Service/legacyMapping.json rename to api-interop-layer/util/icon.legacyMapping.json diff --git a/api-interop-layer/util/icon.legacyMapping.test.js b/api-interop-layer/util/icon.legacyMapping.test.js new file mode 100644 index 000000000..4df30b9ba --- /dev/null +++ b/api-interop-layer/util/icon.legacyMapping.test.js @@ -0,0 +1,37 @@ +import fs from "fs/promises"; +import path from "path"; +import { expect } from "chai"; + +const exists = async (file) => + fs + .access(file, fs.constants.F_OK) + .then(() => true) + .catch(() => false); + +describe("weather icon legacy mapping", async () => { + it("refers to files that actually exist", async () => { + const dir = path.dirname(new URL(import.meta.url).pathname); + + const iconPath = path.resolve( + dir, + "../../web/themes/new_weather_theme/assets/images/weather/icons/conditions", + ); + + const iconMapping = JSON.parse( + await fs.readFile(path.join(dir, "icon.legacyMapping.json")), + ); + + const errors = []; + // eslint-disable-next-line no-restricted-syntax + for await (const [key, { icon }] of Object.entries(iconMapping)) { + if (!(await exists(path.join(iconPath, icon)))) { + errors.push(`Icon for [${key}] does not exist [${icon}]`); + } + } + + if (errors.length) { + console.log(errors); // eslint-disable-line no-console + } + expect(errors).to.have.length(0); + }); +}); diff --git a/api-interop-layer/util/monitoring/index.js b/api-interop-layer/util/monitoring/index.js new file mode 100644 index 000000000..7a6f38f70 --- /dev/null +++ b/api-interop-layer/util/monitoring/index.js @@ -0,0 +1,73 @@ +import newrelic from "newrelic"; + +const NEW_RELIC_METRICS_URL = "https://metric-api.newrelic.com/metric/v1"; + +export const sendNewRelicMetric = (metric) => { + const [ appName ] = newrelic.agent.config.app_name; + const licenseKey = newrelic.agent.config.license_key; + if (!licenseKey) { + return {}; // nothing to do + } + + // augment metric attributes with our application name, since NR metrics does + // not record where we are sending this metric from + metric.attributes ??= {}; + metric.attributes.applicationName = appName; + metric.timestamp ??= Date.now(); + + const body = JSON.stringify([{ "metrics": [metric] }]); + return fetch(NEW_RELIC_METRICS_URL, { + method: "POST", + headers: { "Api-Key": licenseKey }, + body, + }).then(async (r) => { + const response = await r.json(); + if (r.status !== 202) { + /* eslint-disable no-console */ + console.log(`NR error: ${response}`); + /* eslint-enable no-console */ + } + return response; + }); +}; + +const writeLog = (name, level, message) => { + newrelic.recordLogEvent({ message, level, name }); + /* eslint-disable no-console */ + if (typeof message === "string") { + console.log(`[${name}] | ${level} | ${message} |`); + } else { + console.log(`[${name}] | ${level} |`); + console.log(message); + console.log("|"); + } + /* eslint-enable no-console */ +}; + +const logLevels = { + silent: 0, + error: 1, + warn: 2, + info: 3, + verbose: 4, +}; + +const logLevel = + logLevels[process.env.LOG_LEVEL?.toLowerCase()] ?? logLevels.info; + +const noop = () => {}; + +export const createLogger = (name) => ({ + error: + logLevel >= logLevels.error ? (msg) => writeLog(name, "error", msg) : noop, + warn: + logLevel >= logLevels.warn ? (msg) => writeLog(name, "warn", msg) : noop, + info: + logLevel >= logLevels.info ? (msg) => writeLog(name, "info", msg) : noop, + verbose: + logLevel >= logLevels.verbose + ? (msg) => writeLog(name, "verbose", msg) + : noop, +}); + +export default { createLogger }; diff --git a/api-interop-layer/util/paragraphSquash.js b/api-interop-layer/util/paragraphSquash.js new file mode 100644 index 000000000..b34554ff6 --- /dev/null +++ b/api-interop-layer/util/paragraphSquash.js @@ -0,0 +1 @@ +export default (str) => str?.replace(/([^\n])\n([^\n])/gm, "$1 $2"); diff --git a/api-interop-layer/util/sleep.js b/api-interop-layer/util/sleep.js new file mode 100644 index 000000000..757a032a8 --- /dev/null +++ b/api-interop-layer/util/sleep.js @@ -0,0 +1,8 @@ +export const sleep = async (ms) => + new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, ms); + }); + +export default { sleep }; diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 4816e84e5..6416a2860 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -8,8 +8,10 @@ services: links: !override - database-test - api-proxy-test + - api-interop-layer-test environment: # we want to extend, not override API_URL: http://api-proxy-test:9081 + INTEROP_URL: http://api-interop-layer-test:9082 DRUPAL_DB_HOST: database-test profiles: !override ["test"] @@ -21,6 +23,14 @@ services: - 4306:3306 profiles: !override ["test"] + api-interop-layer-test: + extends: + file: ./docker-compose.yml + service: api-proxy + ports: !override + - 9082:8082 + profiles: !override ["test"] + api-proxy-test: extends: file: ./docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml index 489958247..f2b4ea6f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,31 @@ services: - ./tests/api:/app - /app/node_modules + api-interop-layer: + build: + context: ./api-interop-layer + dockerfile: Dockerfile + environment: + PORT: 8082 + DB_NAME: weathergov + DB_USERNAME: drupal + DB_PASSWORD: drupal + DB_HOST: database + DB_PORT: 3306 + API_URL: http://api-proxy:8081 + APP_NAME: ${APP_NAME:-local} + NEWRELIC_LICENSE: $NEWRELIC_LICENSE + networks: + - weather.gov + links: + - database + - api-proxy + ports: + - 8082:8082 + volumes: + - ./api-interop-layer:/app + - /app/node_modules + drupal: build: context: ./ @@ -40,8 +65,10 @@ services: links: - database - api-proxy + - api-interop-layer environment: API_URL: http://api-proxy:8081 + INTEROP_URL: http://api-interop-layer:8082 DRUPAL_DB_NAME: weathergov DRUPAL_DB_USERNAME: drupal DRUPAL_DB_PASSWORD: drupal diff --git a/docs/dev/api-interop-layer.md b/docs/dev/api-interop-layer.md new file mode 100644 index 000000000..d7677a4f5 --- /dev/null +++ b/docs/dev/api-interop-layer.md @@ -0,0 +1,33 @@ +# weather.gov API interop layer + +We built an interop layer between weather.gov and the NWS public API to simplify +the data entering the page rendering process. The interop layer handles the +multiple requests necessary to the API, retrying in the event of errors, unit +normalization and conversion, etc. + +## Caching + +### Alerts + +The alerts module fetches all active alerts as soon as the interop layer starts +and then every 30 seconds thereafter. This background process handles fetching, +parsing, and normalizing all the alerts. It also transparently handles errors +with the goal of always presenting alerts if we're able. + +Flow diagram of how alerts are updated: + +![](diagrams/interop-layer-alerts.png) + +## Endpoints + +There is currently only one functional endpoint in the interop layer, as it was +originally conceived as a way of having a one-stop-shop for all the data we +needed in order to render a location forecast. + +### `/point/{lat}/{lon}` + +[Schema of returned data](interop/README.md) + +Flow diagram of how it works: + +![](diagrams/interop-layer-point.png) diff --git a/docs/dev/diagrams/interop-layer-alerts.png b/docs/dev/diagrams/interop-layer-alerts.png new file mode 100644 index 000000000..ae8532f92 Binary files /dev/null and b/docs/dev/diagrams/interop-layer-alerts.png differ diff --git a/docs/dev/diagrams/interop-layer-alerts.puml b/docs/dev/diagrams/interop-layer-alerts.puml new file mode 100644 index 000000000..c7b84d700 --- /dev/null +++ b/docs/dev/diagrams/interop-layer-alerts.puml @@ -0,0 +1,106 @@ +@startuml weather.gov API interop layer / alerts updating +title weather.gov API interop layer / alert updating + +start + +:startup; + +repeat + :updateAlerts() + • data/alerts/index.js; + + :fetch from API; + + if(error) then (yes) + :set metadata.error + to true; + else (no) + :parse time properties + into date/time objects; + + while(alerts) + :get alert priority, + level, and kind + (land, marine, etc); + + if(unknown alert type) then (yes) + :set priority to lowest, + kind to "land", and + level to "other"; + endif + + :remove non-land alerts; + note right + weather.gov currently only + serves land alerts. When + that changes, this filter + must be removed. + end note + + :parse alert ID; + + :parseLocations(alert.description) + • alerts/parse/locations.js; + + if(description) then (yes) + :parse state regions, counties, + and cities from description; + + :remove location information + from remaining description; + endif + + :parseDescription(alert.description) + • alerts/parse/description.js; + + if(description) then (yes) + :parse into heading and + paragraph nodes; + + :parse text nodes into + pure text and link nodes; + else + :return a single empty + paragraph node; + endif + + if(alert onset is missing) then (yes) + :set onset to equal + effective time; + endif + + if(alert has ends property) then (yes) + :set alert finish time + to equal the ends time; + else if(alert has expires property) then (yes) + :set alert finish time + to equal the expires time; + endif + + if(alert has geometry) then (yes) + else (no) + if(alert has zones) then (yes) + :get collected geometry of + all impacted zones; + + :set alert geometry; + else if(alert has SAME codes) then (yes) + :get collected geometry of + all impacted counties by + SAME code; + + :set alert geometry; + endif + endif + + endwhile + + :update cached alerts; + :update last update time; + :set metadata.error to false; + endif + + :wait 30 + seconds; + + diff --git a/docs/dev/diagrams/interop-layer-point.png b/docs/dev/diagrams/interop-layer-point.png new file mode 100644 index 000000000..eb79f5edf Binary files /dev/null and b/docs/dev/diagrams/interop-layer-point.png differ diff --git a/docs/dev/diagrams/interop-layer-point.puml b/docs/dev/diagrams/interop-layer-point.puml new file mode 100644 index 000000000..69739442c --- /dev/null +++ b/docs/dev/diagrams/interop-layer-point.puml @@ -0,0 +1,201 @@ +@startuml weather.gov API interop layer / point endpoint +title weather.gov API interop layer / point endpoint + +start +:entry; + +:getDataForPoint(lat, lon) +• data/index.js; + +:getPoint(lat,lon) +• data/points.js; +note right + This has to happen before + anything else, since all + other data is fetched by + WFO grid (except alerts) +end note + +fork + :get grid; +fork again + :get place; +end fork + +if (got grid?) then (yes) + fork + :getSatellite(grid) + • data/satellite.js; + + if(request failed?) then (yes) + #pink:ERROR: No satellite; + else (no) + if(valid response?) then (yes) + :build satellite GIF URL; + else (no) + #pink:ERROR: No satellite; + endif + endif + fork again + :getForecast({ grid, place }) + • data/forecast/index.js; + + fork + :gridpoint(data, hours, place) + • data/forecast/gridpoint.js; + + if(error?) then (yes) + #pink:ERROR: Some hourly + data is unvailable; + else (no) + :parse; + endif + fork again + :daily(data, place) + • data/forecast/daily.js; + + if(error?) then (yes) + #pink:ERROR: No forecast; + else (no) + :parse; + endif + fork again + :hourly(data, hours, place) + • data/forecast/hourly.js; + + if(error?) then (yes) + #pink:ERROR: Some hourly + data is unvailable; + else (no) + :parse; + endif + end fork + + if(has daily forecast) then(yes) + :assemble; + + if(has gridpoint data) then (yes) + :add gridpoint data to hourly; + else(no) + endif + + if(has hourly data) then (yes) + :add gridpoint data + to hourly; + :add qualitative + precip data; + else(no) + endif + else (no) + #pink:forecast: error; + endif + + fork again + :getObservations({ grid, point }) + • data/obs/index.js; + + if(first station responds) then (yes) + if(first obs is valid) then (yes) + :use observation; + else(no) + if(second station responds) then (yes) + if(second obs is valid) then (yes) + :use observation; + else(no) + if(third station responds) then (yes) + if(third obs is valid) then (yes) + :use observation; + else(no) + #pink:obs: error + no valid observations; + endif + else(no) + #pink:obs: error + could not get get + an obs station; + endif + endif + else(no) + if(third station responds) then (yes) + if(third obs is valid) then (yes) + :use observation; + endif + else(no) + #pink:obs: error + could not get get + an obs station; + endif + endif + endif + else(no) + if(second station responds) then (yes) + if(second obs is valid) then (yes) + :use observation; + else + if(third station responds) then (yes) + if(third obs is valid) then (yes) + :use observation; + else(no) + #pink:obs: error + no valid observations; + endif + else(no) + #pink:obs: error + could not get get + an obs station; + endif + endif + else(no) + if(third station responds) then (yes) + if(third obs is valid) then (yes) + :use observation; + else(no) + #pink:obs: error + no valid observations; + endif + else(no) + #pink:obs: error + could not get get + an obs station; + endif + endif + endif + end fork + +endif + +:getAlerts({ grid, point, place }) +• alerts/index.js; + +if(got grid?) then (yes) + :get alerts whose geometry + intersects the WFO grid + geometry; + note left + We prefer to intersect alerts with + the grid geometry because the grid + geometry is bigger. Location errors + from the browser location API or + from the geocoding lookup can be + smoothed out a little better over + a 1.5km x 1.5km square than over a + single point. + end note +else (no) + :get alerts whose geometry + intersects the point lat + and lon; +endif + +if(has forecast) then(yes) + :map alerts into days; + note left + The alerts mapped into the daily + forecast have enough metadata to + display them in the hourly table, + if there is an hourly forecast. + end note +endif + +end +@enduml \ No newline at end of file diff --git a/docs/dev/index.md b/docs/dev/index.md index 1d1e4a2f4..156907234 100644 --- a/docs/dev/index.md +++ b/docs/dev/index.md @@ -38,12 +38,13 @@ then: 1. Make sure you have [git commit signing configured](git-signing.md) for this repo or globally. 2. Read up on how we've [structured our Drupal code](drupal.md). -3. Learn about [setting up debugging](debugging.md). -4. Learn about [replacing API calls with well-known data](intercepting-the-api.md) +3. Learn about our [API interoperability layer](api-interop-layer.md). +4. Learn about [setting up debugging](debugging.md). +5. Learn about [replacing API calls with well-known data](intercepting-the-api.md) to see how we reproduce particular weather scenarios without needing to rely on the actual weather. -5. Check out our [expectations around code quality](qasp.md). -6. Look at [how we do testing](testing.md). -7. Look at our [process for submitting, reviewing, and merging new code](review-standards.md). -8. Get familiar with [our Makefile](makefile.md). It'll be helpful! -9. Add our [code review templates](code_review_templates) to your [saved replies](saved-replies.md). +6. Check out our [expectations around code quality](qasp.md). +7. Look at [how we do testing](testing.md). +8. Look at our [process for submitting, reviewing, and merging new code](review-standards.md). +9. Get familiar with [our Makefile](makefile.md). It'll be helpful! +10. Add our [code review templates](code_review_templates) to your [saved replies](saved-replies.md). diff --git a/docs/dev/interop/README.md b/docs/dev/interop/README.md new file mode 100644 index 000000000..bf418589d --- /dev/null +++ b/docs/dev/interop/README.md @@ -0,0 +1,103 @@ +# README + +## Top-level Schemas + +* [weather.gov API interoperability layer](./interop-layer.md "The results of querying for a specific latitude and longitude") – `https://weather.gov/interop.schema.json` + +## Other Schemas + +### Objects + +* [Alert](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md) – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items` + +* [Alert level](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md "Alert level information") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level` + +* [Alert location](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md) – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items` + +* [Alert locations](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md "A list of counties by state region and cities, if an alert description includes embedded location information") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations` + +* [Alert metadata](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md "Prioritization and categorization metadata") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata` + +* [Alert timing](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md "Human-friendly text describing the beginning and completion of the alert, based on the timezone of the alert area") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing` + +* [Daily forecast](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md) – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items` + +* [Daily forecast alert](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md) – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items` + +* [Daily forecast alert metadata](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md "Top-level metadata about the alerts for this forecast day") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata` + +* [Daily forecast alerts](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md "Information about alerts that are valid during this forecast day") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts` + +* [Daily forecast period](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md) – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items` + +* [Daily forecast period data](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md "The forecast data for this period") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data` + +* [Distance](./interop-layer-defs-measures-distance.md) – `https://weather.gov/interop.schema.json#/$defs/measures/distance` + +* [Forecast](./interop-layer-properties-forecast.md "Forecast for this point") – `https://weather.gov/interop.schema.json#/properties/forecast` + +* [Hourly forecast](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md) – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items` + +* [Icon](./interop-layer-defs-icon.md "Information about the icon that represents this forecast period's conditions") – `https://weather.gov/interop.schema.json#/$defs/icon` + +* [NWS Grid](./interop-layer-properties-nws-grid.md "The NWS grid cell that this point falls in") – `https://weather.gov/interop.schema.json#/properties/grid` + +* [Observation data](./interop-layer-properties-observations-properties-observation-data.md "The observed data") – `https://weather.gov/interop.schema.json#/properties/observed/properties/data` + +* [Observation station](./interop-layer-properties-observations-properties-observation-station.md "Metadata about the observation station that reported this data") – `https://weather.gov/interop.schema.json#/properties/observed/properties/station` + +* [Observations](./interop-layer-properties-observations.md "Most-recently observed conditions for this location from the nearest approved observation station") – `https://weather.gov/interop.schema.json#/properties/observed` + +* [Parsed content node](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md) – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items` + +* [Parsed in-paragraph node](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md) – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items` + +* [Place](./interop-layer-properties-place.md "Information about the place at the described point, as close as we know") – `https://weather.gov/interop.schema.json#/properties/place` + +* [Point](./interop-layer-properties-point.md "Information about the point") – `https://weather.gov/interop.schema.json#/properties/point` + +* [Point alerts](./interop-layer-properties-point-alerts.md "Alerts that are applicable to the given lat/lon") – `https://weather.gov/interop.schema.json#/properties/alerts` + +* [QPF](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md) – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items` + +* [Response API timing](./interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md "Time spent making and receiving each request and response to the NWS public API") – `https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/api` + +* [Response metadata](./interop-layer-properties-response-metadata.md "Metadata about the response itself") – `https://weather.gov/interop.schema.json#/properties/@metadata` + +* [Response timing](./interop-layer-properties-response-metadata-properties-response-timing.md "The time spent answering the request") – `https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing` + +* [Satellite](./interop-layer-properties-satellite.md "Information about satellite imagery for this point") – `https://weather.gov/interop.schema.json#/properties/satellite` + +* [Speed](./interop-layer-defs-measures-speed.md) – `https://weather.gov/interop.schema.json#/$defs/measures/speed` + +* [Temperature](./interop-layer-defs-measures-temperature.md) – `https://weather.gov/interop.schema.json#/$defs/measures/temperature` + +### Arrays + +* [List of alerts](./interop-layer-properties-point-alerts-properties-list-of-alerts.md "The alerts themselves") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items` + +* [List of alerts](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md "List of alerts") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items` + +* [List of areas](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md "A list of areas affected by this alert, as provided by the origin") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/area` + +* [List of cities](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md "A list of cities impacted by this alert, as derived from the alert description") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/cities` + +* [List of counties](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md "A list of counties within this state region covered by this alert, as derived from the alert description") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/counties` + +* [List of daily forecast periods](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md "The periods of the daily forecast, such as overnight, day, and night") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods` + +* [List of daily forecasts](./interop-layer-properties-forecast-properties-list-of-daily-forecasts.md "The daily forecasts for each day in the forecast period") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days` + +* [List of hourly QPFs](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md "Forecast quantitative precipitation for this forecast period") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf` + +* [List of hourly forecasts](./interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md "Hourly forecast for each hour of this daily forecast period") – `https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours` + +* [List of parsed content nodes](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md "The alert description, parsed into content nodes") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description` + +* [List of parsed in-paragraph nodes](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md "For paragraph nodes, the list of content nodes that go into the paragraph") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes` + +* [List of regions](./interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md "A list of state regions covered by this alert, as derived from the alert description") – `https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions` + +## Version Note + +The schemas linked above follow the JSON Schema Spec version: `https://json-schema.org/draft/2020-12/schema` diff --git a/docs/dev/interop/interop-layer-defs-alert-kind.md b/docs/dev/interop/interop-layer-defs-alert-kind.md new file mode 100644 index 000000000..7876ff967 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-alert-kind.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/alert/kind +``` + +The kind of alert + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## kind Type + +`string` + +## kind Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :--------- | :---------- | +| `"land"` | | +| `"marine"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-defs-alert-level.md b/docs/dev/interop/interop-layer-defs-alert-level.md new file mode 100644 index 000000000..8b546a66b --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-alert-level.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/alert/level +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## level Type + +`string` + +## level Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-defs-alert.md b/docs/dev/interop/interop-layer-defs-alert.md new file mode 100644 index 000000000..292874bab --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-alert.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/alert +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## alert Type + +unknown diff --git a/docs/dev/interop/interop-layer-defs-icon-properties-base.md b/docs/dev/interop/interop-layer-defs-icon-properties-base.md new file mode 100644 index 000000000..b4f2c70dd --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-icon-properties-base.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/icon/properties/base +``` + +The basename of the icon (without file extension). + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## base Type + +`string` diff --git a/docs/dev/interop/interop-layer-defs-icon-properties-icon.md b/docs/dev/interop/interop-layer-defs-icon-properties-icon.md new file mode 100644 index 000000000..14c065316 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-icon-properties-icon.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/icon/properties/icon +``` + +The icon filename, as used by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## icon Type + +`string` diff --git a/docs/dev/interop/interop-layer-defs-icon.md b/docs/dev/interop/interop-layer-defs-icon.md new file mode 100644 index 000000000..8c77fadf2 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-icon.md @@ -0,0 +1,58 @@ +# Icon Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/icon +``` + +Information about the icon that represents this forecast period's conditions. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## icon Type + +`object` ([Icon](interop-layer-defs-icon.md)) + +# icon Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [icon](#icon) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon-properties-icon.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/icon") | +| [base](#base) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon-properties-base.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/base") | + +## icon + +The icon filename, as used by weather.gov. + +`icon` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon-properties-icon.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/icon") + +### icon Type + +`string` + +## base + +The basename of the icon (without file extension). + +`base` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon-properties-base.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/base") + +### base Type + +`string` diff --git a/docs/dev/interop/interop-layer-defs-measures-distance-properties-ft.md b/docs/dev/interop/interop-layer-defs-measures-distance-properties-ft.md new file mode 100644 index 000000000..8e67b420e --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-distance-properties-ft.md @@ -0,0 +1,15 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/ft +``` + +Elevation, in ft. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## ft Type + +`number` diff --git a/docs/dev/interop/interop-layer-defs-measures-distance-properties-m.md b/docs/dev/interop/interop-layer-defs-measures-distance-properties-m.md new file mode 100644 index 000000000..cb04f30cd --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-distance-properties-m.md @@ -0,0 +1,15 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/m +``` + +Elevation, in meters. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## m Type + +`number` diff --git a/docs/dev/interop/interop-layer-defs-measures-distance-properties-mi.md b/docs/dev/interop/interop-layer-defs-measures-distance-properties-mi.md new file mode 100644 index 000000000..2f23ba423 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-distance-properties-mi.md @@ -0,0 +1,15 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/mi +``` + +Elevation, in miles. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## mi Type + +`number` diff --git a/docs/dev/interop/interop-layer-defs-measures-distance.md b/docs/dev/interop/interop-layer-defs-measures-distance.md new file mode 100644 index 000000000..8691be8eb --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-distance.md @@ -0,0 +1,77 @@ +# Distance Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/distance +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## distance Type + +`object` ([Distance](interop-layer-defs-measures-distance.md)) + +# distance Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [m](#m) | `number` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-m.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/m") | +| [ft](#ft) | `number` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-ft.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/ft") | +| [mi](#mi) | `number` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-mi.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/mi") | + +## m + +Elevation, in meters. + +`m` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-m.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/m") + +### m Type + +`number` + +## ft + +Elevation, in ft. + +`ft` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-ft.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/ft") + +### ft Type + +`number` + +## mi + +Elevation, in miles. + +`mi` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance-properties-mi.md "https://weather.gov/interop.schema.json#/$defs/measures/distance/properties/mi") + +### mi Type + +`number` diff --git a/docs/dev/interop/interop-layer-defs-measures-speed-properties-h.md b/docs/dev/interop/interop-layer-defs-measures-speed-properties-h.md new file mode 100644 index 000000000..7db656cfb --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-speed-properties-h.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/km/h +``` + +Speed, in kilometers per hour. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## h Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures-speed-properties-mph.md b/docs/dev/interop/interop-layer-defs-measures-speed-properties-mph.md new file mode 100644 index 000000000..8ae121535 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-speed-properties-mph.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/mph +``` + +Speed, in miles per hour. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## mph Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures-speed.md b/docs/dev/interop/interop-layer-defs-measures-speed.md new file mode 100644 index 000000000..6d027ffee --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-speed.md @@ -0,0 +1,58 @@ +# Speed Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/speed +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## speed Type + +`object` ([Speed](interop-layer-defs-measures-speed.md)) + +# speed Properties + +| Property | Type | Required | Nullable | Defined by | +| :----------- | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [mph](#mph) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-speed-properties-mph.md "https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/mph") | +| [km/h](#kmh) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-speed-properties-h.md "https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/km/h") | + +## mph + +Speed, in miles per hour. + +`mph` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-speed-properties-mph.md "https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/mph") + +### mph Type + +`integer` + +## km/h + +Speed, in kilometers per hour. + +`km/h` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-speed-properties-h.md "https://weather.gov/interop.schema.json#/$defs/measures/speed/properties/km/h") + +### h Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degc.md b/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degc.md new file mode 100644 index 000000000..4772ffad0 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degc.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degC +``` + +Temperature, in degrees Celsius. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## degC Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degf.md b/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degf.md new file mode 100644 index 000000000..b58459bf9 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-temperature-properties-degf.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degF +``` + +Temperature, in degrees Fahrenheit. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## degF Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures-temperature.md b/docs/dev/interop/interop-layer-defs-measures-temperature.md new file mode 100644 index 000000000..9a4647dc9 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures-temperature.md @@ -0,0 +1,58 @@ +# Temperature Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures/temperature +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## temperature Type + +`object` ([Temperature](interop-layer-defs-measures-temperature.md)) + +# temperature Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------ | :-------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [degF](#degf) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-temperature-properties-degf.md "https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degF") | +| [degC](#degc) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-temperature-properties-degc.md "https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degC") | + +## degF + +Temperature, in degrees Fahrenheit. + +`degF` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-temperature-properties-degf.md "https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degF") + +### degF Type + +`integer` + +## degC + +Temperature, in degrees Celsius. + +`degC` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-temperature-properties-degc.md "https://weather.gov/interop.schema.json#/$defs/measures/temperature/properties/degC") + +### degC Type + +`integer` diff --git a/docs/dev/interop/interop-layer-defs-measures.md b/docs/dev/interop/interop-layer-defs-measures.md new file mode 100644 index 000000000..63172a7ed --- /dev/null +++ b/docs/dev/interop/interop-layer-defs-measures.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs/measures +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## measures Type + +unknown diff --git a/docs/dev/interop/interop-layer-defs.md b/docs/dev/interop/interop-layer-defs.md new file mode 100644 index 000000000..3ab6b1462 --- /dev/null +++ b/docs/dev/interop/interop-layer-defs.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/$defs +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## $defs Type + +unknown diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-generated.md b/docs/dev/interop/interop-layer-properties-forecast-properties-generated.md new file mode 100644 index 000000000..8a66e5d5c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-generated.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/generated +``` + +When the forecast was generated. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## generated Type + +`string` + +## generated Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-count.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-count.md new file mode 100644 index 000000000..469670ef8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-count.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/count +``` + +The number of alerts that are applicable to this forecast day. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## count Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-highest.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-highest.md new file mode 100644 index 000000000..8cfbcd8d7 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-highest.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/highest +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## highest Type + +`string` + +## highest Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md new file mode 100644 index 000000000..31d1c806c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md @@ -0,0 +1,68 @@ +# Daily forecast alert metadata Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata +``` + +Top-level metadata about the alerts for this forecast day. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## metadata Type + +`object` ([Daily forecast alert metadata](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md)) + +# metadata Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------------ | :-------- | :------- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [count](#count) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-count.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/count") | +| [highest](#highest) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-highest.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/highest") | + +## count + +The number of alerts that are applicable to this forecast day. + +`count` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-count.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/count") + +### count Type + +`integer` + +## highest + +The alert level, as defined by weather.gov. + +`highest` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata-properties-highest.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata/properties/highest") + +### highest Type + +`string` + +### highest Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-duration.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-duration.md new file mode 100644 index 000000000..700e8fb82 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-duration.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/duration +``` + +The number of hours that this alert will be active after the first whole hour of this forecast period, up to the total number of hours remaining in the forecast period. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## duration Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-event.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-event.md new file mode 100644 index 000000000..685cb6c21 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-event.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/event +``` + +The event type for the alert. Eg, 'Severe Thunderstorm Warning,' etc. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## event Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-id.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-id.md new file mode 100644 index 000000000..8bf64cc10 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-id.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/id +``` + +An ID for this alert. NOTE: this may not be globally unique. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## id Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-level.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-level.md new file mode 100644 index 000000000..77bbf148f --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-level.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/level +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## level Type + +`string` + +## level Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-offset.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-offset.md new file mode 100644 index 000000000..4b32b2efa --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-offset.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/offset +``` + +The number of hours after the first whole hour covered by this forecast period when the alert will begin. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## offset Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-remainder.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-remainder.md new file mode 100644 index 000000000..30a4ddbc3 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-remainder.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/remainder +``` + +The number of hours that this alert will be active in excess of the duration property. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## remainder Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md new file mode 100644 index 000000000..6dfee1743 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md @@ -0,0 +1,144 @@ +# Daily forecast alert Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Daily forecast alert](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [id](#id) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-id.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/id") | +| [event](#event) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-event.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/event") | +| [level](#level) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-level.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/level") | +| [offset](#offset) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-offset.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/offset") | +| [duration](#duration) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-duration.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/duration") | +| [remainder](#remainder) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-remainder.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/remainder") | + +## id + +An ID for this alert. NOTE: this may not be globally unique. + +`id` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-id.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/id") + +### id Type + +`string` + +## event + +The event type for the alert. Eg, 'Severe Thunderstorm Warning,' etc. + +`event` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-event.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/event") + +### event Type + +`string` + +## level + +The alert level, as defined by weather.gov. + +`level` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-level.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/level") + +### level Type + +`string` + +### level Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | + +## offset + +The number of hours after the first whole hour covered by this forecast period when the alert will begin. + +`offset` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-offset.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/offset") + +### offset Type + +`integer` + +## duration + +The number of hours that this alert will be active after the first whole hour of this forecast period, up to the total number of hours remaining in the forecast period. + +`duration` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-duration.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/duration") + +### duration Type + +`integer` + +## remainder + +The number of hours that this alert will be active in excess of the duration property. + +`remainder` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert-properties-remainder.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items/items/properties/remainder") + +### remainder Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md new file mode 100644 index 000000000..150d08fc6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md @@ -0,0 +1,15 @@ +# List of alerts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items +``` + +List of alerts. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object[]` ([Daily forecast alert](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md new file mode 100644 index 000000000..985fbd58b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md @@ -0,0 +1,58 @@ +# Daily forecast alerts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts +``` + +Information about alerts that are valid during this forecast day. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## alerts Type + +`object` ([Daily forecast alerts](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md)) + +# alerts Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [metadata](#metadata) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata") | +| [items](#items) | `array` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items") | + +## metadata + +Top-level metadata about the alerts for this forecast day. + +`metadata` + +* is optional + +* Type: `object` ([Daily forecast alert metadata](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/metadata") + +### metadata Type + +`object` ([Daily forecast alert metadata](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-daily-forecast-alert-metadata.md)) + +## items + +List of alerts. + +`items` + +* is optional + +* Type: `object[]` ([Daily forecast alert](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts/properties/items") + +### items Type + +`object[]` ([Daily forecast alert](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts-properties-list-of-alerts-daily-forecast-alert.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-end.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-end.md new file mode 100644 index 000000000..8c75fbd08 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-end.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/end +``` + +The ending time for this daily forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## end Type + +`string` + +## end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-description.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-description.md new file mode 100644 index 000000000..27a25d569 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-description.md @@ -0,0 +1,15 @@ +# Untitled text in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/description +``` + +Textual description of the forecast period conditions. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## description Type + +`text` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-probabilityofprecipitation.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-probabilityofprecipitation.md new file mode 100644 index 000000000..0941393d8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-probabilityofprecipitation.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/probabilityOfPrecipitation +``` + +Forecast probability of precipitation for this forecast period. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## probabilityOfPrecipitation Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-winddirection.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-winddirection.md new file mode 100644 index 000000000..a8535c66b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-winddirection.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/windDirection +``` + +Forecast wind direction for this forecast period, in cardinal/ordinal direction (eg, N, NW, WNW, etc.). + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## windDirection Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md new file mode 100644 index 000000000..2e379c464 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md @@ -0,0 +1,134 @@ +# Daily forecast period data Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data +``` + +The forecast data for this period. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## data Type + +`object` ([Daily forecast period data](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md)) + +# data Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------------------------------------------- | :-------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [icon](#icon) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/icon") | +| [description](#description) | `text` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-description.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/description") | +| [temperature](#temperature) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-temperature.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/temperature") | +| [probabilityOfPrecipitation](#probabilityofprecipitation) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-probabilityofprecipitation.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/probabilityOfPrecipitation") | +| [windSpeed](#windspeed) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-speed.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/windSpeed") | +| [windDirection](#winddirection) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-winddirection.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/windDirection") | + +## icon + +Information about the icon that represents this forecast period's conditions. + +`icon` + +* is optional + +* Type: `object` ([Icon](interop-layer-defs-icon.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/icon") + +### icon Type + +`object` ([Icon](interop-layer-defs-icon.md)) + +## description + +Textual description of the forecast period conditions. + +`description` + +* is optional + +* Type: `text` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-description.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/description") + +### description Type + +`text` + +## temperature + +Forecast temperature for this forecast period. + +`temperature` + +* is optional + +* Type: `object` ([Temperature](interop-layer-defs-measures-temperature.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-temperature.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/temperature") + +### temperature Type + +`object` ([Temperature](interop-layer-defs-measures-temperature.md)) + +## probabilityOfPrecipitation + +Forecast probability of precipitation for this forecast period. + +`probabilityOfPrecipitation` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-probabilityofprecipitation.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/probabilityOfPrecipitation") + +### probabilityOfPrecipitation Type + +`integer` + +## windSpeed + +Forecast wind speed for this forecast period. + +`windSpeed` + +* is optional + +* Type: `object` ([Speed](interop-layer-defs-measures-speed.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-speed.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/windSpeed") + +### windSpeed Type + +`object` ([Speed](interop-layer-defs-measures-speed.md)) + +## windDirection + +Forecast wind direction for this forecast period, in cardinal/ordinal direction (eg, N, NW, WNW, etc.). + +`windDirection` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data-properties-winddirection.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data/properties/windDirection") + +### windDirection Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-dayname.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-dayname.md new file mode 100644 index 000000000..0fb31dd14 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-dayname.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/dayName +``` + +The name of the day this forecast period applies to, or 'Today' if it's the current day. Uses English day names. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## dayName Type + +`string` + +## dayName Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z][a-z]+$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%5Ba-z%5D%2B%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-end.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-end.md new file mode 100644 index 000000000..353ef6fa3 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-end.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/end +``` + +The ending time for this period of the daily forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## end Type + +`string` + +## end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isdaytime.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isdaytime.md new file mode 100644 index 000000000..d2e9fc2c0 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isdaytime.md @@ -0,0 +1,15 @@ +# Untitled boolean in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isDaytime +``` + +Whether this period represents the daytime period. A period can be daytime, nighttime, or overnight. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## isDaytime Type + +`boolean` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isovernight.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isovernight.md new file mode 100644 index 000000000..50290a604 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isovernight.md @@ -0,0 +1,15 @@ +# Untitled boolean in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isOvernight +``` + +Whether this period represents the overnight period. A period can be daytime, nighttime, or overnight. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## isOvernight Type + +`boolean` diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-monthandday.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-monthandday.md new file mode 100644 index 000000000..6e40c7fe0 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-monthandday.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/monthAndDay +``` + +The short month name (eg, Jan, Feb, etc.) and day number that this forecast period applies to. Formatted in en-US locale. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## monthAndDay Type + +`string` + +## monthAndDay Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z][a-z]{2} d{1,2}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%5Ba-z%5D%7B2%7D%20d%7B1%2C2%7D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-start.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-start.md new file mode 100644 index 000000000..d842d2299 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-start.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/start +``` + +The starting time for this period of the daily forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## start Type + +`string` + +## start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-timelabel.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-timelabel.md new file mode 100644 index 000000000..ed1e41844 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-timelabel.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/timeLabel +``` + +Textual representation of the hour range covered by this period, in the timezone of the location. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## timeLabel Type + +`string` + +## timeLabel Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?[0-9]-1?[0-9]$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5B0-9%5D-1%3F%5B0-9%5D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md new file mode 100644 index 000000000..0c6734240 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md @@ -0,0 +1,210 @@ +# Daily forecast period Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Daily forecast period](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------------- | :-------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [start](#start) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/start") | +| [end](#end) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/end") | +| [isDaytime](#isdaytime) | `boolean` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isdaytime.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isDaytime") | +| [isOvernight](#isovernight) | `boolean` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isovernight.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isOvernight") | +| [monthAndDay](#monthandday) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-monthandday.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/monthAndDay") | +| [dayName](#dayname) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-dayname.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/dayName") | +| [timeLabel](#timelabel) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-timelabel.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/timeLabel") | +| [data](#data) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data") | + +## start + +The starting time for this period of the daily forecast. + +`start` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/start") + +### start Type + +`string` + +### start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## end + +The ending time for this period of the daily forecast. + +`end` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/end") + +### end Type + +`string` + +### end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## isDaytime + +Whether this period represents the daytime period. A period can be daytime, nighttime, or overnight. + +`isDaytime` + +* is optional + +* Type: `boolean` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isdaytime.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isDaytime") + +### isDaytime Type + +`boolean` + +## isOvernight + +Whether this period represents the overnight period. A period can be daytime, nighttime, or overnight. + +`isOvernight` + +* is optional + +* Type: `boolean` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-isovernight.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/isOvernight") + +### isOvernight Type + +`boolean` + +## monthAndDay + +The short month name (eg, Jan, Feb, etc.) and day number that this forecast period applies to. Formatted in en-US locale. + +`monthAndDay` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-monthandday.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/monthAndDay") + +### monthAndDay Type + +`string` + +### monthAndDay Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z][a-z]{2} d{1,2}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%5Ba-z%5D%7B2%7D%20d%7B1%2C2%7D%24 "try regular expression with regexr.com") + +## dayName + +The name of the day this forecast period applies to, or 'Today' if it's the current day. Uses English day names. + +`dayName` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-dayname.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/dayName") + +### dayName Type + +`string` + +### dayName Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z][a-z]+$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%5Ba-z%5D%2B%24 "try regular expression with regexr.com") + +## timeLabel + +Textual representation of the hour range covered by this period, in the timezone of the location. + +`timeLabel` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-timelabel.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/timeLabel") + +### timeLabel Type + +`string` + +### timeLabel Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?[0-9]-1?[0-9]$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5B0-9%5D-1%3F%5B0-9%5D%24 "try regular expression with regexr.com") + +## data + +The forecast data for this period. + +`data` + +* is optional + +* Type: `object` ([Daily forecast period data](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods/items/properties/data") + +### data Type + +`object` ([Daily forecast period data](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period-properties-daily-forecast-period-data.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md new file mode 100644 index 000000000..167c77b0d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md @@ -0,0 +1,15 @@ +# List of daily forecast periods Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods +``` + +The periods of the daily forecast, such as overnight, day, and night. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## periods Type + +`object[]` ([Daily forecast period](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-hour.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-hour.md new file mode 100644 index 000000000..354ae195e --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-hour.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/hour +``` + +Human-friendly hour when the hourly forecast begins. Eg, '6 AM + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## hour Type + +`string` + +## hour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-time.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-time.md new file mode 100644 index 000000000..371e446af --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-time.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/time +``` + +The time at which this hourly forecast begins. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## time Type + +`string` + +## time Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md new file mode 100644 index 000000000..b938ebe64 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md @@ -0,0 +1,91 @@ +# Hourly forecast Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Hourly forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [time](#time) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-time.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/time") | +| [hour](#hour) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-hour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/hour") | +| [icon](#icon) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/icon") | + +## time + +The time at which this hourly forecast begins. + +`time` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-time.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/time") + +### time Type + +`string` + +### time Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## hour + +Human-friendly hour when the hourly forecast begins. Eg, '6 AM + +`hour` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast-properties-hour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/hour") + +### hour Type + +`string` + +### hour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") + +## icon + +Information about the icon that represents this forecast period's conditions. + +`icon` + +* is optional + +* Type: `object` ([Icon](interop-layer-defs-icon.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours/items/properties/icon") + +### icon Type + +`object` ([Icon](interop-layer-defs-icon.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md new file mode 100644 index 000000000..5ad2cb67d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md @@ -0,0 +1,15 @@ +# List of hourly forecasts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours +``` + +Hourly forecast for each hour of this daily forecast period. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The properties listed below are created by weather.gov and are the only guaranteed properties. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## hours Type + +`object[]` ([Hourly forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-allof-0.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-allof-0.md new file mode 100644 index 000000000..d069005c0 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-allof-0.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/allOf/0 +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## 0 Type + +unknown diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-end.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-end.md new file mode 100644 index 000000000..718d62091 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-end.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/end +``` + +The ending time for this QPF forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## end Type + +`string` + +## end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-endhour.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-endhour.md new file mode 100644 index 000000000..8b809873a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-endhour.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/endHour +``` + +The ending hour in the timezone of the forecast, in AM/PM. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## endHour Type + +`string` + +## endHour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-start.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-start.md new file mode 100644 index 000000000..4ac6b5587 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-start.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/start +``` + +The starting time for this QPF forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## start Type + +`string` + +## start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-starthour.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-starthour.md new file mode 100644 index 000000000..9036130f6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-starthour.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/startHour +``` + +The starting hour in the timezone of the forecast, in AM/PM. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## startHour Type + +`string` + +## startHour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md new file mode 100644 index 000000000..9aedfbfcd --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md @@ -0,0 +1,124 @@ +# QPF Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([QPF](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [start](#start) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/start") | +| [end](#end) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/end") | +| [startHour](#starthour) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-starthour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/startHour") | +| [endHour](#endhour) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-endhour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/endHour") | + +## start + +The starting time for this QPF forecast. + +`start` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/start") + +### start Type + +`string` + +### start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## end + +The ending time for this QPF forecast. + +`end` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/end") + +### end Type + +`string` + +### end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## startHour + +The starting hour in the timezone of the forecast, in AM/PM. + +`startHour` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-starthour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/startHour") + +### startHour Type + +`string` + +### startHour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") + +## endHour + +The ending hour in the timezone of the forecast, in AM/PM. + +`endHour` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf-properties-endhour.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf/items/properties/endHour") + +### endHour Type + +`string` + +### endHour Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^1?\d (A|P)M$ +``` + +[try pattern](https://regexr.com/?expression=%5E1%3F%5Cd%20\(A%7CP\)M%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md new file mode 100644 index 000000000..715f71837 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md @@ -0,0 +1,19 @@ +# List of hourly QPFs Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf +``` + +Forecast quantitative precipitation for this forecast period. Note that QPF is delivered in multi-hour totals rather than individual-hour totals, so it must be treated differently than other forecast period data. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## qpf Type + +`object[]` ([QPF](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md)) + +all of + +* [Untitled undefined type in weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-allof-0.md "check type definition") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-start.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-start.md new file mode 100644 index 000000000..2848556e0 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-start.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/start +``` + +The starting time for this daily forecast. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## start Type + +`string` + +## start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md new file mode 100644 index 000000000..ea9de09e0 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md @@ -0,0 +1,146 @@ +# Daily forecast Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Daily forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [start](#start) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/start") | +| [end](#end) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/end") | +| [periods](#periods) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods") | +| [qpf](#qpf) | Merged | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf") | +| [hours](#hours) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours") | +| [alerts](#alerts) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts") | + +## start + +The starting time for this daily forecast. + +`start` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-start.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/start") + +### start Type + +`string` + +### start Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## end + +The ending time for this daily forecast. + +`end` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-end.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/end") + +### end Type + +`string` + +### end Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## periods + +The periods of the daily forecast, such as overnight, day, and night. + +`periods` + +* is required + +* Type: `object[]` ([Daily forecast period](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/periods") + +### periods Type + +`object[]` ([Daily forecast period](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-daily-forecast-periods-daily-forecast-period.md)) + +## qpf + +Forecast quantitative precipitation for this forecast period. Note that QPF is delivered in multi-hour totals rather than individual-hour totals, so it must be treated differently than other forecast period data. + +`qpf` + +* is required + +* Type: `object[]` ([QPF](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/qpf") + +### qpf Type + +`object[]` ([QPF](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-qpf.md)) + +all of + +* [Untitled undefined type in weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-qpfs-allof-0.md "check type definition") + +## hours + +Hourly forecast for each hour of this daily forecast period. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The properties listed below are created by weather.gov and are the only guaranteed properties. + +`hours` + +* is required + +* Type: `object[]` ([Hourly forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/hours") + +### hours Type + +`object[]` ([Hourly forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-list-of-hourly-forecasts-hourly-forecast.md)) + +## alerts + +Information about alerts that are valid during this forecast day. + +`alerts` + +* is required + +* Type: `object` ([Daily forecast alerts](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days/items/properties/alerts") + +### alerts Type + +`object` ([Daily forecast alerts](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast-properties-daily-forecast-alerts.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts.md b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts.md new file mode 100644 index 000000000..f22669896 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-list-of-daily-forecasts.md @@ -0,0 +1,15 @@ +# List of daily forecasts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/days +``` + +The daily forecasts for each day in the forecast period. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## days Type + +`object[]` ([Daily forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md)) diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-updated.md b/docs/dev/interop/interop-layer-properties-forecast-properties-updated.md new file mode 100644 index 000000000..90530519e --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-updated.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/updated +``` + +When the forecast was last updated. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## updated Type + +`string` + +## updated Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-forecast-properties-valid.md b/docs/dev/interop/interop-layer-properties-forecast-properties-valid.md new file mode 100644 index 000000000..dad85535c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast-properties-valid.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast/properties/valid +``` + +When the forecast is valid. This is a combination of ISO 8601 date-time and duration, in the form 'date-time/duration'. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## valid Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-forecast.md b/docs/dev/interop/interop-layer-properties-forecast.md new file mode 100644 index 000000000..8ce34183a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-forecast.md @@ -0,0 +1,104 @@ +# Forecast Schema + +```txt +https://weather.gov/interop.schema.json#/properties/forecast +``` + +Forecast for this point. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## forecast Type + +`object` ([Forecast](interop-layer-properties-forecast.md)) + +# forecast Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [generated](#generated) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-generated.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/generated") | +| [updated](#updated) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-updated.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/updated") | +| [valid](#valid) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-valid.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/valid") | +| [days](#days) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days") | + +## generated + +When the forecast was generated. + +`generated` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-generated.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/generated") + +### generated Type + +`string` + +### generated Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## updated + +When the forecast was last updated. + +`updated` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-updated.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/updated") + +### updated Type + +`string` + +### updated Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## valid + +When the forecast is valid. This is a combination of ISO 8601 date-time and duration, in the form 'date-time/duration'. + +`valid` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-valid.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/valid") + +### valid Type + +`string` + +## days + +The daily forecasts for each day in the forecast period. + +`days` + +* is required + +* Type: `object[]` ([Daily forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast-properties-list-of-daily-forecasts.md "https://weather.gov/interop.schema.json#/properties/forecast/properties/days") + +### days Type + +`object[]` ([Daily forecast](interop-layer-properties-forecast-properties-list-of-daily-forecasts-daily-forecast.md)) diff --git a/docs/dev/interop/interop-layer-properties-nws-grid-properties-geometry.md b/docs/dev/interop/interop-layer-properties-nws-grid-properties-geometry.md new file mode 100644 index 000000000..bc8ffc1b3 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-nws-grid-properties-geometry.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/grid/properties/geometry +``` + +GeoJSON Polygon representing the area covered by this WFO grid cell. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## geometry Type + +unknown diff --git a/docs/dev/interop/interop-layer-properties-nws-grid-properties-wfo.md b/docs/dev/interop/interop-layer-properties-nws-grid-properties-wfo.md new file mode 100644 index 000000000..95c86840b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-nws-grid-properties-wfo.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/grid/properties/wfo +``` + +The NWS weather forecasting office (WFO) that serves this point. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## wfo Type + +`string` + +## wfo Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z]{3}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%7B3%7D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-nws-grid-properties-x.md b/docs/dev/interop/interop-layer-properties-nws-grid-properties-x.md new file mode 100644 index 000000000..58e51391b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-nws-grid-properties-x.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/grid/properties/x +``` + +WFO grid X coordinate. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## x Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-nws-grid-properties-y.md b/docs/dev/interop/interop-layer-properties-nws-grid-properties-y.md new file mode 100644 index 000000000..a4cc34d64 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-nws-grid-properties-y.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/grid/properties/y +``` + +WFO grid Y coordinate. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## y Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-nws-grid.md b/docs/dev/interop/interop-layer-properties-nws-grid.md new file mode 100644 index 000000000..f6ea8400f --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-nws-grid.md @@ -0,0 +1,125 @@ +# NWS Grid Schema + +```txt +https://weather.gov/interop.schema.json#/properties/grid +``` + +The NWS grid cell that this point falls in. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## grid Type + +`object` ([NWS Grid](interop-layer-properties-nws-grid.md)) + +# grid Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------------ | :------- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [wfo](#wfo) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-wfo.md "https://weather.gov/interop.schema.json#/properties/grid/properties/wfo") | +| [x](#x) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-x.md "https://weather.gov/interop.schema.json#/properties/grid/properties/x") | +| [y](#y) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-y.md "https://weather.gov/interop.schema.json#/properties/grid/properties/y") | +| [geometry](#geometry) | Not specified | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-geometry.md "https://weather.gov/interop.schema.json#/properties/grid/properties/geometry") | +| [elevation](#elevation) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/grid/properties/elevation") | + +## wfo + +The NWS weather forecasting office (WFO) that serves this point. + +`wfo` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-wfo.md "https://weather.gov/interop.schema.json#/properties/grid/properties/wfo") + +### wfo Type + +`string` + +### wfo Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z]{3}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z%5D%7B3%7D%24 "try regular expression with regexr.com") + +## x + +WFO grid X coordinate. + +`x` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-x.md "https://weather.gov/interop.schema.json#/properties/grid/properties/x") + +### x Type + +`integer` + +## y + +WFO grid Y coordinate. + +`y` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-y.md "https://weather.gov/interop.schema.json#/properties/grid/properties/y") + +### y Type + +`integer` + +## geometry + +GeoJSON Polygon representing the area covered by this WFO grid cell. + +`geometry` + +* is required + +* Type: unknown + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-nws-grid-properties-geometry.md "https://weather.gov/interop.schema.json#/properties/grid/properties/geometry") + +### geometry Type + +unknown + +## elevation + +Elevation of this grid point. + +`elevation` + +* is required + +* Type: `object` ([Distance](interop-layer-defs-measures-distance.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/grid/properties/elevation") + +### elevation Type + +`object` ([Distance](interop-layer-defs-measures-distance.md)) diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-description.md b/docs/dev/interop/interop-layer-properties-observations-properties-description.md new file mode 100644 index 000000000..8deac9043 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-description.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/description +``` + +Textual description of the observed conditions, if available. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## description Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-observation-data.md b/docs/dev/interop/interop-layer-properties-observations-properties-observation-data.md new file mode 100644 index 000000000..93f945173 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-observation-data.md @@ -0,0 +1,15 @@ +# Observation data Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/data +``` + +The observed data. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The data provided by the NWS public API is converted into US and SI units. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## data Type + +`object` ([Observation data](interop-layer-properties-observations-properties-observation-data.md)) diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-id.md b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-id.md new file mode 100644 index 000000000..fae2a66e8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-id.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/id +``` + +The 4-character ID for the observation station. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## id Type + +`string` + +## id Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z0-9]{4}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z0-9%5D%7B4%7D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-name.md b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-name.md new file mode 100644 index 000000000..0e72ee35b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station-properties-name.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/name +``` + +The full name of the observation station. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## name Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-observation-station.md b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station.md new file mode 100644 index 000000000..abc9e1683 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-observation-station.md @@ -0,0 +1,106 @@ +# Observation station Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/station +``` + +Metadata about the observation station that reported this data. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## station Type + +`object` ([Observation station](interop-layer-properties-observations-properties-observation-station.md)) + +# station Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [id](#id) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station-properties-id.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/id") | +| [name](#name) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station-properties-name.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/name") | +| [elevation](#elevation) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/elevation") | +| [distance](#distance) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/distance") | + +## id + +The 4-character ID for the observation station. + +`id` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station-properties-id.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/id") + +### id Type + +`string` + +### id Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^[A-Z0-9]{4}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5BA-Z0-9%5D%7B4%7D%24 "try regular expression with regexr.com") + +## name + +The full name of the observation station. + +`name` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station-properties-name.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/name") + +### name Type + +`string` + +## elevation + +The elevation at the observation station. + +`elevation` + +* is required + +* Type: `object` ([Distance](interop-layer-defs-measures-distance.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/elevation") + +### elevation Type + +`object` ([Distance](interop-layer-defs-measures-distance.md)) + +## distance + +The flat-ground distance between the observation station and the requested point. + +`distance` + +* is required + +* Type: `object` ([Distance](interop-layer-defs-measures-distance.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-measures-distance.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station/properties/distance") + +### distance Type + +`object` ([Distance](interop-layer-defs-measures-distance.md)) diff --git a/docs/dev/interop/interop-layer-properties-observations-properties-timestamp.md b/docs/dev/interop/interop-layer-properties-observations-properties-timestamp.md new file mode 100644 index 000000000..5238d9e7b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations-properties-timestamp.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed/properties/timestamp +``` + +When the observation was recorded. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## timestamp Type + +`string` + +## timestamp Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-observations.md b/docs/dev/interop/interop-layer-properties-observations.md new file mode 100644 index 000000000..9b6950225 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-observations.md @@ -0,0 +1,119 @@ +# Observations Schema + +```txt +https://weather.gov/interop.schema.json#/properties/observed +``` + +Most-recently observed conditions for this location from the nearest approved observation station. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## observed Type + +`object` ([Observations](interop-layer-properties-observations.md)) + +# observed Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------------- | :------- | :------- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [timestamp](#timestamp) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-timestamp.md "https://weather.gov/interop.schema.json#/properties/observed/properties/timestamp") | +| [icon](#icon) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/observed/properties/icon") | +| [description](#description) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-description.md "https://weather.gov/interop.schema.json#/properties/observed/properties/description") | +| [station](#station) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station") | +| [data](#data) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-data.md "https://weather.gov/interop.schema.json#/properties/observed/properties/data") | + +## timestamp + +When the observation was recorded. + +`timestamp` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-timestamp.md "https://weather.gov/interop.schema.json#/properties/observed/properties/timestamp") + +### timestamp Type + +`string` + +### timestamp Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## icon + +Information about the icon that represents this forecast period's conditions. + +`icon` + +* is required + +* Type: `object` ([Icon](interop-layer-defs-icon.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon.md "https://weather.gov/interop.schema.json#/properties/observed/properties/icon") + +### icon Type + +`object` ([Icon](interop-layer-defs-icon.md)) + +## description + +Textual description of the observed conditions, if available. + +`description` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-description.md "https://weather.gov/interop.schema.json#/properties/observed/properties/description") + +### description Type + +`string` + +## station + +Metadata about the observation station that reported this data. + +`station` + +* is required + +* Type: `object` ([Observation station](interop-layer-properties-observations-properties-observation-station.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-station.md "https://weather.gov/interop.schema.json#/properties/observed/properties/station") + +### station Type + +`object` ([Observation station](interop-layer-properties-observations-properties-observation-station.md)) + +## data + +The observed data. The full list of properties is not provided here as it is taken directly from the NWS public API and is not controlled by weather.gov. The data provided by the NWS public API is converted into US and SI units. + +`data` + +* is required + +* Type: `object` ([Observation data](interop-layer-properties-observations-properties-observation-data.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations-properties-observation-data.md "https://weather.gov/interop.schema.json#/properties/observed/properties/data") + +### data Type + +`object` ([Observation data](interop-layer-properties-observations-properties-observation-data.md)) diff --git a/docs/dev/interop/interop-layer-properties-place-properties-county.md b/docs/dev/interop/interop-layer-properties-place-properties-county.md new file mode 100644 index 000000000..2fc371f00 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-county.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/county +``` + +Full name of the county. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## county Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-place-properties-countyfips.md b/docs/dev/interop/interop-layer-properties-place-properties-countyfips.md new file mode 100644 index 000000000..aa05d1d09 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-countyfips.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/countyFIPS +``` + +5-digit FIPS code for this county. Note that this value has the state FIPS code prepended to the usual 3-digit county FIPS code. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## countyFIPS Type + +`string` + +## countyFIPS Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^\d{5}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5Cd%7B5%7D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-place-properties-fullname.md b/docs/dev/interop/interop-layer-properties-place-properties-fullname.md new file mode 100644 index 000000000..09c6bfdc8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-fullname.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/fullName +``` + +The full name of this place, with state or territory abbreviation. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## fullName Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-place-properties-name.md b/docs/dev/interop/interop-layer-properties-place-properties-name.md new file mode 100644 index 000000000..b88215536 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-name.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/name +``` + +City or other municipal name. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## name Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-place-properties-state.md b/docs/dev/interop/interop-layer-properties-place-properties-state.md new file mode 100644 index 000000000..719ca326c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-state.md @@ -0,0 +1,21 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/state +``` + +2-letter abbreviation of the state or territory. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## state Type + +`string` + +## state Constraints + +**maximum length**: the maximum number of characters for this string is: `2` + +**minimum length**: the minimum number of characters for this string is: `2` diff --git a/docs/dev/interop/interop-layer-properties-place-properties-statefips.md b/docs/dev/interop/interop-layer-properties-place-properties-statefips.md new file mode 100644 index 000000000..c39b4bed7 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-statefips.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/stateFIPS +``` + +2-digit FIPS code for this state. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## stateFIPS Type + +`string` + +## stateFIPS Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^\d{2}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5Cd%7B2%7D%24 "try regular expression with regexr.com") diff --git a/docs/dev/interop/interop-layer-properties-place-properties-statename.md b/docs/dev/interop/interop-layer-properties-place-properties-statename.md new file mode 100644 index 000000000..497c7aa55 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-statename.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/stateName +``` + +Full name of the state. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## stateName Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-place-properties-timezone.md b/docs/dev/interop/interop-layer-properties-place-properties-timezone.md new file mode 100644 index 000000000..d000686fd --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place-properties-timezone.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place/properties/timezone +``` + +Full tzdb name of the timezone at this point, as best we know. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## timezone Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-place.md b/docs/dev/interop/interop-layer-properties-place.md new file mode 100644 index 000000000..6276b4005 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-place.md @@ -0,0 +1,198 @@ +# Place Schema + +```txt +https://weather.gov/interop.schema.json#/properties/place +``` + +Information about the place at the described point, as close as we know. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## place Type + +`object` ([Place](interop-layer-properties-place.md)) + +# place Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------------------ | :------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [name](#name) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-name.md "https://weather.gov/interop.schema.json#/properties/place/properties/name") | +| [state](#state) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-state.md "https://weather.gov/interop.schema.json#/properties/place/properties/state") | +| [stateName](#statename) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-statename.md "https://weather.gov/interop.schema.json#/properties/place/properties/stateName") | +| [county](#county) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-county.md "https://weather.gov/interop.schema.json#/properties/place/properties/county") | +| [timezone](#timezone) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-timezone.md "https://weather.gov/interop.schema.json#/properties/place/properties/timezone") | +| [stateFIPS](#statefips) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-statefips.md "https://weather.gov/interop.schema.json#/properties/place/properties/stateFIPS") | +| [countyFIPS](#countyfips) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-countyfips.md "https://weather.gov/interop.schema.json#/properties/place/properties/countyFIPS") | +| [fullName](#fullname) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place-properties-fullname.md "https://weather.gov/interop.schema.json#/properties/place/properties/fullName") | + +## name + +City or other municipal name. + +`name` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-name.md "https://weather.gov/interop.schema.json#/properties/place/properties/name") + +### name Type + +`string` + +## state + +2-letter abbreviation of the state or territory. + +`state` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-state.md "https://weather.gov/interop.schema.json#/properties/place/properties/state") + +### state Type + +`string` + +### state Constraints + +**maximum length**: the maximum number of characters for this string is: `2` + +**minimum length**: the minimum number of characters for this string is: `2` + +## stateName + +Full name of the state. + +`stateName` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-statename.md "https://weather.gov/interop.schema.json#/properties/place/properties/stateName") + +### stateName Type + +`string` + +## county + +Full name of the county. + +`county` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-county.md "https://weather.gov/interop.schema.json#/properties/place/properties/county") + +### county Type + +`string` + +## timezone + +Full tzdb name of the timezone at this point, as best we know. + +`timezone` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-timezone.md "https://weather.gov/interop.schema.json#/properties/place/properties/timezone") + +### timezone Type + +`string` + +## stateFIPS + +2-digit FIPS code for this state. + +`stateFIPS` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-statefips.md "https://weather.gov/interop.schema.json#/properties/place/properties/stateFIPS") + +### stateFIPS Type + +`string` + +### stateFIPS Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^\d{2}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5Cd%7B2%7D%24 "try regular expression with regexr.com") + +## countyFIPS + +5-digit FIPS code for this county. Note that this value has the state FIPS code prepended to the usual 3-digit county FIPS code. + +`countyFIPS` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-countyfips.md "https://weather.gov/interop.schema.json#/properties/place/properties/countyFIPS") + +### countyFIPS Type + +`string` + +### countyFIPS Constraints + +**pattern**: the string must match the following regular expression: + +```regexp +^\d{5}$ +``` + +[try pattern](https://regexr.com/?expression=%5E%5Cd%7B5%7D%24 "try regular expression with regexr.com") + +## fullName + +The full name of this place, with state or territory abbreviation. + +`fullName` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place-properties-fullname.md "https://weather.gov/interop.schema.json#/properties/place/properties/fullName") + +### fullName Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-highestlevel.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-highestlevel.md new file mode 100644 index 000000000..2cb013a2a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-highestlevel.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/highestLevel +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## highestLevel Type + +`string` + +## highestLevel Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities-items.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities-items.md new file mode 100644 index 000000000..71286b90a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities-items.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/cities/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md new file mode 100644 index 000000000..6c8c5df28 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md @@ -0,0 +1,15 @@ +# List of cities Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/cities +``` + +A list of cities impacted by this alert, as derived from the alert description. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## cities Type + +`string[]` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-area.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-area.md new file mode 100644 index 000000000..081c8f11c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-area.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/area +``` + +The name of a state region covered by this alert, as derived from the alert description. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## area Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties-items.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties-items.md new file mode 100644 index 000000000..1498cacb5 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties-items.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/counties/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md new file mode 100644 index 000000000..d70ebe1c2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md @@ -0,0 +1,15 @@ +# List of counties Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/counties +``` + +A list of counties within this state region covered by this alert, as derived from the alert description. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## counties Type + +`string[]` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md new file mode 100644 index 000000000..f104e0301 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md @@ -0,0 +1,58 @@ +# Alert location Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Alert location](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [area](#area) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-area.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/area") | +| [counties](#counties) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/counties") | + +## area + +The name of a state region covered by this alert, as derived from the alert description. + +`area` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-area.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/area") + +### area Type + +`string` + +## counties + +A list of counties within this state region covered by this alert, as derived from the alert description. + +`counties` + +* is required + +* Type: `string[]` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location-properties-list-of-counties.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions/items/properties/counties") + +### counties Type + +`string[]` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md new file mode 100644 index 000000000..e292699d1 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md @@ -0,0 +1,15 @@ +# List of regions Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions +``` + +A list of state regions covered by this alert, as derived from the alert description. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## regions Type + +`object[]` ([Alert location](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md)) diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md new file mode 100644 index 000000000..8e6523378 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md @@ -0,0 +1,58 @@ +# Alert locations Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations +``` + +A list of counties by state region and cities, if an alert description includes embedded location information. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## locations Type + +`object` ([Alert locations](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md)) + +# locations Properties + +| Property | Type | Required | Nullable | Defined by | +| :------------------ | :------ | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [regions](#regions) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions") | +| [cities](#cities) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/cities") | + +## regions + +A list of state regions covered by this alert, as derived from the alert description. + +`regions` + +* is required + +* Type: `object[]` ([Alert location](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/regions") + +### regions Type + +`object[]` ([Alert location](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-regions-alert-location.md)) + +## cities + +A list of cities impacted by this alert, as derived from the alert description. + +`cities` + +* is required + +* Type: `string[]` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations-properties-list-of-cities.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations/properties/cities") + +### cities Type + +`string[]` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-priority.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-priority.md new file mode 100644 index 000000000..1aa854b7d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-priority.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/priority +``` + +The priority of this alert relative to others. Lower numbers are higher priority. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## priority Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-text.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-text.md new file mode 100644 index 000000000..a0a05ce2e --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-text.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/text +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## text Type + +`string` + +## text Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md new file mode 100644 index 000000000..ef6d9523e --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md @@ -0,0 +1,68 @@ +# Alert level Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level +``` + +Alert level information + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## level Type + +`object` ([Alert level](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md)) + +# level Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------- | :-------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [priority](#priority) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-priority.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/priority") | +| [text](#text) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/text") | + +## priority + +The priority of this alert relative to others. Lower numbers are higher priority. + +`priority` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-priority.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/priority") + +### priority Type + +`integer` + +## text + +The alert level, as defined by weather.gov. + +`text` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level/properties/text") + +### text Type + +`string` + +### text Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-kind.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-kind.md new file mode 100644 index 000000000..6fb526a9a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-kind.md @@ -0,0 +1,25 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/kind +``` + +The alert level, as defined by weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## kind Type + +`string` + +## kind Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-priority.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-priority.md new file mode 100644 index 000000000..16e2722d6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-priority.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/priority +``` + +The priority of this alert relative to others. Lower numbers are higher priority. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## priority Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md new file mode 100644 index 000000000..f1b9b76b8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md @@ -0,0 +1,87 @@ +# Alert metadata Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata +``` + +Prioritization and categorization metadata + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## metadata Type + +`object` ([Alert metadata](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md)) + +# metadata Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------- | :-------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [level](#level) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level") | +| [kind](#kind) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-kind.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/kind") | +| [priority](#priority) | `integer` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-priority.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/priority") | + +## level + +Alert level information + +`level` + +* is required + +* Type: `object` ([Alert level](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/level") + +### level Type + +`object` ([Alert level](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-alert-level.md)) + +## kind + +The alert level, as defined by weather.gov. + +`kind` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-kind.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/kind") + +### kind Type + +`string` + +### kind Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | + +## priority + +The priority of this alert relative to others. Lower numbers are higher priority. + +`priority` + +* is required + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata-properties-priority.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata/properties/priority") + +### priority Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-end.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-end.md new file mode 100644 index 000000000..1f5cbcd6c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-end.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/end +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## end Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-start.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-start.md new file mode 100644 index 000000000..87415f4f2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-start.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/start +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## start Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md new file mode 100644 index 000000000..74d97faef --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md @@ -0,0 +1,58 @@ +# Alert timing Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing +``` + +Human-friendly text describing the beginning and completion of the alert, based on the timezone of the alert area. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## timing Type + +`object` ([Alert timing](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md)) + +# timing Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [start](#start) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-start.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/start") | +| [end](#end) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-end.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/end") | + +## start + + + +`start` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-start.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/start") + +### start Type + +`string` + +## end + + + +`end` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing-properties-end.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing/properties/end") + +### end Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-duration.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-duration.md new file mode 100644 index 000000000..d0d04f8f5 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-duration.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/duration +``` + +When the alert will no longer be displayed on weather.gov, in human-friendly text based on the timezone of the alert area. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## duration Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-effective.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-effective.md new file mode 100644 index 000000000..091d793f6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-effective.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/effective +``` + +When the alert becomes effective. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## effective Type + +`string` + +## effective Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-ends.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-ends.md new file mode 100644 index 000000000..2a3a13798 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-ends.md @@ -0,0 +1,19 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/ends +``` + +When the conditions described in the alert are forecast to end. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## ends Type + +`string` + +## ends Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-event.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-event.md new file mode 100644 index 000000000..b5f358d40 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-event.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/event +``` + +The alert event, such as 'Severe Thunderstorm Warning.' + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## event Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-expires.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-expires.md new file mode 100644 index 000000000..603def08a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-expires.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/expires +``` + +When the alert will expire. NOTE: this is NOT when the hazardous conditions are forecast to end. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## expires Type + +`string` + +## expires Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-finish.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-finish.md new file mode 100644 index 000000000..d63776aaa --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-finish.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/finish +``` + +When the alert will no longer displayed on weather.gov, as derived from the expires and ends properties. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## finish Type + +`string` + +## finish Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-geometry.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-geometry.md new file mode 100644 index 000000000..5054ec930 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-geometry.md @@ -0,0 +1,15 @@ +# Untitled undefined type in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/geometry +``` + +GeoJSON GeometryCollection representing the area covered by this alert. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## geometry Type + +unknown diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-id.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-id.md new file mode 100644 index 000000000..7bb916e86 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-id.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/id +``` + +ID of this alert. NOTE: may not be globally unique + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## id Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-instruction.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-instruction.md new file mode 100644 index 000000000..eb57716b2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-instruction.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/instruction +``` + +Safety instructions associated with the alert + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## instruction Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas-items.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas-items.md new file mode 100644 index 000000000..9cffb81b2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas-items.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/area/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md new file mode 100644 index 000000000..ca33ea43d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md @@ -0,0 +1,15 @@ +# List of areas Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/area +``` + +A list of areas affected by this alert, as provided by the origin. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## area Type + +`string[]` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-external.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-external.md new file mode 100644 index 000000000..f6e51ea72 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-external.md @@ -0,0 +1,15 @@ +# Untitled boolean in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/external +``` + +For link nodes, whether the link is for a site outside of weather.gov. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## external Type + +`boolean` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-text.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-text.md new file mode 100644 index 000000000..0f21f4c18 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-text.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/text +``` + +For text nodes, the textual content. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## text Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-type.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-type.md new file mode 100644 index 000000000..cc9c518fa --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-type.md @@ -0,0 +1,24 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/type +``` + +The type of in-paragraph content node. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## type Type + +`string` + +## type Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :------- | :---------- | +| `"text"` | | +| `"link"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-url.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-url.md new file mode 100644 index 000000000..a8f27def6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-url.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/url +``` + +For link nodes, the URL. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## url Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md new file mode 100644 index 000000000..a504d428b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md @@ -0,0 +1,105 @@ +# Parsed in-paragraph node Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Parsed in-paragraph node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------- | :-------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [type](#type) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-type.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/type") | +| [text](#text) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/text") | +| [url](#url) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-url.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/url") | +| [external](#external) | `boolean` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-external.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/external") | + +## type + +The type of in-paragraph content node. + +`type` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-type.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/type") + +### type Type + +`string` + +### type Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :------- | :---------- | +| `"text"` | | +| `"link"` | | + +## text + +For text nodes, the textual content. + +`text` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/text") + +### text Type + +`string` + +## url + +For link nodes, the URL. + +`url` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-url.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/url") + +### url Type + +`string` + +## external + +For link nodes, whether the link is for a site outside of weather.gov. + +`external` + +* is optional + +* Type: `boolean` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node-properties-external.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes/items/properties/external") + +### external Type + +`boolean` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md new file mode 100644 index 000000000..1edd0e8bc --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md @@ -0,0 +1,15 @@ +# List of parsed in-paragraph nodes Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes +``` + +For paragraph nodes, the list of content nodes that go into the paragraph. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## nodes Type + +`object[]` ([Parsed in-paragraph node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md)) diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-text.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-text.md new file mode 100644 index 000000000..1380d454d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-text.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/text +``` + +For heading nodes, the textual content of the node + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## text Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-type.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-type.md new file mode 100644 index 000000000..d130663f2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-type.md @@ -0,0 +1,24 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/type +``` + +The kind of content node + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## type Type + +`string` + +## type Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :------------ | :---------- | +| `"heading"` | | +| `"paragraph"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md new file mode 100644 index 000000000..7a3c1fac8 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md @@ -0,0 +1,86 @@ +# Parsed content node Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Parsed content node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [type](#type) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-type.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/type") | +| [nodes](#nodes) | `array` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes") | +| [text](#text) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/text") | + +## type + +The kind of content node + +`type` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-type.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/type") + +### type Type + +`string` + +### type Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :------------ | :---------- | +| `"heading"` | | +| `"paragraph"` | | + +## nodes + +For paragraph nodes, the list of content nodes that go into the paragraph. + +`nodes` + +* is optional + +* Type: `object[]` ([Parsed in-paragraph node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/nodes") + +### nodes Type + +`object[]` ([Parsed in-paragraph node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-list-of-parsed-in-paragraph-nodes-parsed-in-paragraph-node.md)) + +## text + +For heading nodes, the textual content of the node + +`text` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node-properties-text.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description/items/properties/text") + +### text Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md new file mode 100644 index 000000000..51356410c --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md @@ -0,0 +1,15 @@ +# List of parsed content nodes Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description +``` + +The alert description, parsed into content nodes. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## description Type + +`object[]` ([Parsed content node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md)) diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-onset.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-onset.md new file mode 100644 index 000000000..9dc4436aa --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-onset.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/onset +``` + +When the conditions described in the alert are forecast to begin. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## onset Type + +`string` + +## onset Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sender.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sender.md new file mode 100644 index 000000000..0465bd11a --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sender.md @@ -0,0 +1,15 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sender +``` + +The government office responsible for issuing this alert. Usually a NWS office, but sometimes state or local civil authorities. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## sender Type + +`string` diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sent.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sent.md new file mode 100644 index 000000000..2c80a1c48 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sent.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sent +``` + +When the alert was initially sent. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## sent Type + +`string` + +## sent Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md new file mode 100644 index 000000000..92dc4bcd6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md @@ -0,0 +1,367 @@ +# Alert Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object` ([Alert](interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md)) + +# items Properties + +| Property | Type | Required | Nullable | Defined by | +| :-------------------------- | :------------ | :------- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [metadata](#metadata) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata") | +| [id](#id) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-id.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/id") | +| [event](#event) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-event.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/event") | +| [sender](#sender) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sender.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sender") | +| [locations](#locations) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations") | +| [description](#description) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description") | +| [instruction](#instruction) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-instruction.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/instruction") | +| [area](#area) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/area") | +| [sent](#sent) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sent.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sent") | +| [effective](#effective) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-effective.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/effective") | +| [onset](#onset) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-onset.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/onset") | +| [expires](#expires) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-expires.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/expires") | +| [ends](#ends) | `string` | Required | can be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-ends.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/ends") | +| [finish](#finish) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-finish.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/finish") | +| [geometry](#geometry) | Not specified | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-geometry.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/geometry") | +| [duration](#duration) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-duration.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/duration") | +| [timing](#timing) | `object` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing") | + +## metadata + +Prioritization and categorization metadata + +`metadata` + +* is optional + +* Type: `object` ([Alert metadata](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/metadata") + +### metadata Type + +`object` ([Alert metadata](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-metadata.md)) + +## id + +ID of this alert. NOTE: may not be globally unique + +`id` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-id.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/id") + +### id Type + +`string` + +## event + +The alert event, such as 'Severe Thunderstorm Warning.' + +`event` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-event.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/event") + +### event Type + +`string` + +## sender + +The government office responsible for issuing this alert. Usually a NWS office, but sometimes state or local civil authorities. + +`sender` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sender.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sender") + +### sender Type + +`string` + +## locations + +A list of counties by state region and cities, if an alert description includes embedded location information. + +`locations` + +* is optional + +* Type: `object` ([Alert locations](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/locations") + +### locations Type + +`object` ([Alert locations](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-locations.md)) + +## description + +The alert description, parsed into content nodes. + +`description` + +* is required + +* Type: `object[]` ([Parsed content node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/description") + +### description Type + +`object[]` ([Parsed content node](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-parsed-content-nodes-parsed-content-node.md)) + +## instruction + +Safety instructions associated with the alert + +`instruction` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-instruction.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/instruction") + +### instruction Type + +`string` + +## area + +A list of areas affected by this alert, as provided by the origin. + +`area` + +* is required + +* Type: `string[]` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-list-of-areas.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/area") + +### area Type + +`string[]` + +## sent + +When the alert was initially sent. + +`sent` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-sent.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/sent") + +### sent Type + +`string` + +### sent Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## effective + +When the alert becomes effective. + +`effective` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-effective.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/effective") + +### effective Type + +`string` + +### effective Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## onset + +When the conditions described in the alert are forecast to begin. + +`onset` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-onset.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/onset") + +### onset Type + +`string` + +### onset Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## expires + +When the alert will expire. NOTE: this is NOT when the hazardous conditions are forecast to end. + +`expires` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-expires.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/expires") + +### expires Type + +`string` + +### expires Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## ends + +When the conditions described in the alert are forecast to end. + +`ends` + +* is required + +* Type: `string` + +* can be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-ends.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/ends") + +### ends Type + +`string` + +### ends Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## finish + +When the alert will no longer displayed on weather.gov, as derived from the expires and ends properties. + +`finish` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-finish.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/finish") + +### finish Type + +`string` + +### finish Constraints + +**date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification") + +## geometry + +GeoJSON GeometryCollection representing the area covered by this alert. + +`geometry` + +* is required + +* Type: unknown + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-geometry.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/geometry") + +### geometry Type + +unknown + +## duration + +When the alert will no longer be displayed on weather.gov, in human-friendly text based on the timezone of the alert area. + +`duration` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-duration.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/duration") + +### duration Type + +`string` + +## timing + +Human-friendly text describing the beginning and completion of the alert, based on the timezone of the alert area. + +`timing` + +* is required + +* Type: `object` ([Alert timing](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items/items/properties/timing") + +### timing Type + +`object` ([Alert timing](interop-layer-properties-point-alerts-properties-list-of-alerts-alert-properties-alert-timing.md)) diff --git a/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts.md b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts.md new file mode 100644 index 000000000..1c062e261 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts-properties-list-of-alerts.md @@ -0,0 +1,15 @@ +# List of alerts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts/properties/items +``` + +The alerts themselves + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## items Type + +`object[]` ([Alert](interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md)) diff --git a/docs/dev/interop/interop-layer-properties-point-alerts.md b/docs/dev/interop/interop-layer-properties-point-alerts.md new file mode 100644 index 000000000..7ba10fb0b --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-alerts.md @@ -0,0 +1,68 @@ +# Point alerts Schema + +```txt +https://weather.gov/interop.schema.json#/properties/alerts +``` + +Alerts that are applicable to the given lat/lon. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## alerts Type + +`object` ([Point alerts](interop-layer-properties-point-alerts.md)) + +# alerts Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------------- | :------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [items](#items) | `array` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items") | +| [highestLevel](#highestlevel) | `string` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-highestlevel.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/highestLevel") | + +## items + +The alerts themselves + +`items` + +* is required + +* Type: `object[]` ([Alert](interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-list-of-alerts.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/items") + +### items Type + +`object[]` ([Alert](interop-layer-properties-point-alerts-properties-list-of-alerts-alert.md)) + +## highestLevel + +The alert level, as defined by weather.gov. + +`highestLevel` + +* is required + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts-properties-highestlevel.md "https://weather.gov/interop.schema.json#/properties/alerts/properties/highestLevel") + +### highestLevel Type + +`string` + +### highestLevel Constraints + +**enum**: the value of this property must be equal to one of the following values: + +| Value | Explanation | +| :---------- | :---------- | +| `"warning"` | | +| `"watch"` | | +| `"other"` | | diff --git a/docs/dev/interop/interop-layer-properties-point-properties-latitude.md b/docs/dev/interop/interop-layer-properties-point-properties-latitude.md new file mode 100644 index 000000000..bcf37009d --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-properties-latitude.md @@ -0,0 +1,21 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/point/properties/latitude +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## latitude Type + +`number` + +## latitude Constraints + +**maximum**: the value of this number must smaller than or equal to: `90` + +**minimum**: the value of this number must greater than or equal to: `-90` diff --git a/docs/dev/interop/interop-layer-properties-point-properties-longitude.md b/docs/dev/interop/interop-layer-properties-point-properties-longitude.md new file mode 100644 index 000000000..b22c2d18e --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point-properties-longitude.md @@ -0,0 +1,21 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/point/properties/longitude +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## longitude Type + +`number` + +## longitude Constraints + +**maximum**: the value of this number must smaller than or equal to: `360` + +**minimum**: the value of this number must greater than or equal to: `-360` diff --git a/docs/dev/interop/interop-layer-properties-point.md b/docs/dev/interop/interop-layer-properties-point.md new file mode 100644 index 000000000..b28013f54 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-point.md @@ -0,0 +1,70 @@ +# Point Schema + +```txt +https://weather.gov/interop.schema.json#/properties/point +``` + +Information about the point + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## point Type + +`object` ([Point](interop-layer-properties-point.md)) + +# point Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------- | :------- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [latitude](#latitude) | `number` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-properties-latitude.md "https://weather.gov/interop.schema.json#/properties/point/properties/latitude") | +| [longitude](#longitude) | `number` | Required | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-properties-longitude.md "https://weather.gov/interop.schema.json#/properties/point/properties/longitude") | + +## latitude + + + +`latitude` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-properties-latitude.md "https://weather.gov/interop.schema.json#/properties/point/properties/latitude") + +### latitude Type + +`number` + +### latitude Constraints + +**maximum**: the value of this number must smaller than or equal to: `90` + +**minimum**: the value of this number must greater than or equal to: `-90` + +## longitude + + + +`longitude` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-properties-longitude.md "https://weather.gov/interop.schema.json#/properties/point/properties/longitude") + +### longitude Type + +`number` + +### longitude Constraints + +**maximum**: the value of this number must smaller than or equal to: `360` + +**minimum**: the value of this number must greater than or equal to: `-360` diff --git a/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-e2e.md b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-e2e.md new file mode 100644 index 000000000..2fd6ca2d2 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-e2e.md @@ -0,0 +1,15 @@ +# Untitled number in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/e2e +``` + +Total time spent, in seconds. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## e2e Type + +`number` diff --git a/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md new file mode 100644 index 000000000..d3d17d165 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md @@ -0,0 +1,15 @@ +# Response API timing Schema + +```txt +https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/api +``` + +Time spent making and receiving each request and response to the NWS public API. Keys are the API URLs and values are the times in seconds. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## api Type + +`object` ([Response API timing](interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md)) diff --git a/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing.md b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing.md new file mode 100644 index 000000000..11556dc11 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-response-metadata-properties-response-timing.md @@ -0,0 +1,58 @@ +# Response timing Schema + +```txt +https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing +``` + +The time spent answering the request. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## timing Type + +`object` ([Response timing](interop-layer-properties-response-metadata-properties-response-timing.md)) + +# timing Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [e2e](#e2e) | `number` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing-properties-e2e.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/e2e") | +| [api](#api) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/api") | + +## e2e + +Total time spent, in seconds. + +`e2e` + +* is optional + +* Type: `number` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing-properties-e2e.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/e2e") + +### e2e Type + +`number` + +## api + +Time spent making and receiving each request and response to the NWS public API. Keys are the API URLs and values are the times in seconds. + +`api` + +* is optional + +* Type: `object` ([Response API timing](interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing/properties/api") + +### api Type + +`object` ([Response API timing](interop-layer-properties-response-metadata-properties-response-timing-properties-response-api-timing.md)) diff --git a/docs/dev/interop/interop-layer-properties-response-metadata-properties-size.md b/docs/dev/interop/interop-layer-properties-response-metadata-properties-size.md new file mode 100644 index 000000000..0358b56f6 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-response-metadata-properties-size.md @@ -0,0 +1,15 @@ +# Untitled integer in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/@metadata/properties/size +``` + +The uncompressed size of the data being returned, excluding the metadata, in bytes. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## size Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-response-metadata.md b/docs/dev/interop/interop-layer-properties-response-metadata.md new file mode 100644 index 000000000..06cc59937 --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-response-metadata.md @@ -0,0 +1,58 @@ +# Response metadata Schema + +```txt +https://weather.gov/interop.schema.json#/properties/@metadata +``` + +Metadata about the response itself. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## @metadata Type + +`object` ([Response metadata](interop-layer-properties-response-metadata.md)) + +# @metadata Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------- | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [timing](#timing) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing") | +| [size](#size) | `integer` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-size.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/size") | + +## timing + +The time spent answering the request. + +`timing` + +* is optional + +* Type: `object` ([Response timing](interop-layer-properties-response-metadata-properties-response-timing.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-response-timing.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/timing") + +### timing Type + +`object` ([Response timing](interop-layer-properties-response-metadata-properties-response-timing.md)) + +## size + +The uncompressed size of the data being returned, excluding the metadata, in bytes. + +`size` + +* is optional + +* Type: `integer` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-response-metadata-properties-size.md "https://weather.gov/interop.schema.json#/properties/@metadata/properties/size") + +### size Type + +`integer` diff --git a/docs/dev/interop/interop-layer-properties-satellite-properties-gif.md b/docs/dev/interop/interop-layer-properties-satellite-properties-gif.md new file mode 100644 index 000000000..97641d7ce --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-satellite-properties-gif.md @@ -0,0 +1,19 @@ +# Untitled string in weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json#/properties/satellite/properties/gif +``` + +URL to the 600x600 geocolor GIF of the most recent satellite for this point. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## gif Type + +`string` + +## gif Constraints + +**URI**: the string must be a URI, according to [RFC 3986](https://tools.ietf.org/html/rfc3986 "check the specification") diff --git a/docs/dev/interop/interop-layer-properties-satellite.md b/docs/dev/interop/interop-layer-properties-satellite.md new file mode 100644 index 000000000..967a8f8fd --- /dev/null +++ b/docs/dev/interop/interop-layer-properties-satellite.md @@ -0,0 +1,43 @@ +# Satellite Schema + +```txt +https://weather.gov/interop.schema.json#/properties/satellite +``` + +Information about satellite imagery for this point. + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json\*](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## satellite Type + +`object` ([Satellite](interop-layer-properties-satellite.md)) + +# satellite Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------- | :------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [gif](#gif) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-satellite-properties-gif.md "https://weather.gov/interop.schema.json#/properties/satellite/properties/gif") | + +## gif + +URL to the 600x600 geocolor GIF of the most recent satellite for this point. + +`gif` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-satellite-properties-gif.md "https://weather.gov/interop.schema.json#/properties/satellite/properties/gif") + +### gif Type + +`string` + +### gif Constraints + +**URI**: the string must be a URI, according to [RFC 3986](https://tools.ietf.org/html/rfc3986 "check the specification") diff --git a/docs/dev/interop/interop-layer.md b/docs/dev/interop/interop-layer.md new file mode 100644 index 000000000..109e15981 --- /dev/null +++ b/docs/dev/interop/interop-layer.md @@ -0,0 +1,245 @@ +# weather.gov API interoperability layer Schema + +```txt +https://weather.gov/interop.schema.json +``` + +The results of querying for a specific latitude and longitude + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------------------------- | +| Can be instantiated | No | Unknown status | No | Forbidden | Allowed | none | [interop-layer.schema.json](../../../api-interop-layer/interop-layer.schema.json "open original schema") | + +## weather.gov API interoperability layer Type + +`object` ([weather.gov API interoperability layer](interop-layer.md)) + +# weather.gov API interoperability layer Properties + +| Property | Type | Required | Nullable | Defined by | +| :---------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [alerts](#alerts) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point-alerts.md "https://weather.gov/interop.schema.json#/properties/alerts") | +| [point](#point) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-point.md "https://weather.gov/interop.schema.json#/properties/point") | +| [place](#place) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-place.md "https://weather.gov/interop.schema.json#/properties/place") | +| [grid](#grid) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-nws-grid.md "https://weather.gov/interop.schema.json#/properties/grid") | +| [observed](#observed) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-observations.md "https://weather.gov/interop.schema.json#/properties/observed") | +| [forecast](#forecast) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-forecast.md "https://weather.gov/interop.schema.json#/properties/forecast") | +| [satellite](#satellite) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-satellite.md "https://weather.gov/interop.schema.json#/properties/satellite") | +| [@metadata](#metadata) | `object` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-properties-response-metadata.md "https://weather.gov/interop.schema.json#/properties/@metadata") | + +## alerts + +Alerts that are applicable to the given lat/lon. + +`alerts` + +* is optional + +* Type: `object` ([Point alerts](interop-layer-properties-point-alerts.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point-alerts.md "https://weather.gov/interop.schema.json#/properties/alerts") + +### alerts Type + +`object` ([Point alerts](interop-layer-properties-point-alerts.md)) + +## point + +Information about the point + +`point` + +* is optional + +* Type: `object` ([Point](interop-layer-properties-point.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-point.md "https://weather.gov/interop.schema.json#/properties/point") + +### point Type + +`object` ([Point](interop-layer-properties-point.md)) + +## place + +Information about the place at the described point, as close as we know. + +`place` + +* is optional + +* Type: `object` ([Place](interop-layer-properties-place.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-place.md "https://weather.gov/interop.schema.json#/properties/place") + +### place Type + +`object` ([Place](interop-layer-properties-place.md)) + +## grid + +The NWS grid cell that this point falls in. + +`grid` + +* is optional + +* Type: `object` ([NWS Grid](interop-layer-properties-nws-grid.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-nws-grid.md "https://weather.gov/interop.schema.json#/properties/grid") + +### grid Type + +`object` ([NWS Grid](interop-layer-properties-nws-grid.md)) + +## observed + +Most-recently observed conditions for this location from the nearest approved observation station. + +`observed` + +* is optional + +* Type: `object` ([Observations](interop-layer-properties-observations.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-observations.md "https://weather.gov/interop.schema.json#/properties/observed") + +### observed Type + +`object` ([Observations](interop-layer-properties-observations.md)) + +## forecast + +Forecast for this point. + +`forecast` + +* is optional + +* Type: `object` ([Forecast](interop-layer-properties-forecast.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-forecast.md "https://weather.gov/interop.schema.json#/properties/forecast") + +### forecast Type + +`object` ([Forecast](interop-layer-properties-forecast.md)) + +## satellite + +Information about satellite imagery for this point. + +`satellite` + +* is optional + +* Type: `object` ([Satellite](interop-layer-properties-satellite.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-satellite.md "https://weather.gov/interop.schema.json#/properties/satellite") + +### satellite Type + +`object` ([Satellite](interop-layer-properties-satellite.md)) + +## @metadata + +Metadata about the response itself. + +`@metadata` + +* is optional + +* Type: `object` ([Response metadata](interop-layer-properties-response-metadata.md)) + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-properties-response-metadata.md "https://weather.gov/interop.schema.json#/properties/@metadata") + +### @metadata Type + +`object` ([Response metadata](interop-layer-properties-response-metadata.md)) + +# weather.gov API interoperability layer Definitions + +## Definitions group alert + +Reference this group by using + +```json +{"$ref":"https://weather.gov/interop.schema.json#/$defs/alert"} +``` + +| Property | Type | Required | Nullable | Defined by | +| :------- | :--- | :------- | :------- | :--------- | + +## Definitions group icon + +Reference this group by using + +```json +{"$ref":"https://weather.gov/interop.schema.json#/$defs/icon"} +``` + +| Property | Type | Required | Nullable | Defined by | +| :------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [icon](#icon) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon-properties-icon.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/icon") | +| [base](#base) | `string` | Optional | cannot be null | [weather.gov API interoperability layer](interop-layer-defs-icon-properties-base.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/base") | + +### icon + +The icon filename, as used by weather.gov. + +`icon` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon-properties-icon.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/icon") + +#### icon Type + +`string` + +### base + +The basename of the icon (without file extension). + +`base` + +* is optional + +* Type: `string` + +* cannot be null + +* defined in: [weather.gov API interoperability layer](interop-layer-defs-icon-properties-base.md "https://weather.gov/interop.schema.json#/$defs/icon/properties/base") + +#### base Type + +`string` + +## Definitions group measures + +Reference this group by using + +```json +{"$ref":"https://weather.gov/interop.schema.json#/$defs/measures"} +``` + +| Property | Type | Required | Nullable | Defined by | +| :------- | :--- | :------- | :------- | :--------- | diff --git a/package-lock.json b/package-lock.json index 45dd02ee1..c500e974f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "weather.gov", "version": "1.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -10,7 +10,7 @@ "license": "CC0-1.0", "dependencies": { "@prettier/plugin-php": "^0.22.2", - "mariadb": "^3.3.2", + "mariadb": "^3.3.1", "shapefile": "^0.6.6", "twing": "^7.0.0" }, @@ -252,7 +252,6 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", "engines": { "node": ">=18" }, @@ -261,9 +260,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", + "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -272,14 +271,14 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.10.4", + "qs": "6.13.0", "safe-buffer": "^5.1.2", "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", @@ -334,9 +333,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -427,9 +426,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -438,18 +437,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "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", @@ -482,23 +469,6 @@ "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, - "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/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -534,16 +504,6 @@ "node": ">= 8" } }, - "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, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@playwright/test": { "version": "1.47.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", @@ -633,9 +593,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.1.tgz", - "integrity": "sha512-adOMRLVmleuWs/5V/w5/l7o0chDK/az+5ncCsIapTKogsu/3MVWvSgP58qVTXi5IwpfGt8pMobNq9rOWtJyu5Q==", + "version": "22.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.2.tgz", + "integrity": "sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==", "dependencies": { "undici-types": "~6.19.2" } @@ -669,9 +629,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -976,19 +936,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -1072,9 +1019,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/asynckit": { @@ -1117,9 +1064,9 @@ } }, "node_modules/aws4": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", - "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true }, "node_modules/axe-core": { @@ -1132,13 +1079,13 @@ } }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" + "engines": { + "node": ">= 0.4" } }, "node_modules/balanced-match": { @@ -1506,6 +1453,23 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/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, + "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/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -1697,13 +1661,13 @@ } }, "node_modules/cypress": { - "version": "13.14.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.14.2.tgz", - "integrity": "sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz", + "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^3.0.1", + "@cypress/request": "^3.0.4", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", @@ -1865,12 +1829,12 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2297,9 +2261,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -2454,9 +2418,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz", + "integrity": "sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -2484,7 +2448,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-3.5.0.tgz", "integrity": "sha512-JZQ6XnBTNI8h1B9M7wJSFzc48SYbh7VMMKaNTQOFa3BQlnmXPrVc4PKen8R+fpv6VleiPeej6VxloGb42zdRvw==", "dev": true, - "license": "MIT", "dependencies": { "globals": "^13.20.0" }, @@ -2555,9 +2518,9 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", "dev": true, "peer": true, "dependencies": { @@ -2565,8 +2528,8 @@ "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "es-iterator-helpers": "^1.0.19", @@ -2582,40 +2545,40 @@ "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.36.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", + "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", "dev": true, "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { @@ -2718,9 +2681,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2889,6 +2852,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3027,9 +2996,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -3064,17 +3033,17 @@ } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/fs-extra": { @@ -3601,14 +3570,14 @@ } }, "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -3672,7 +3641,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -4273,9 +4241,9 @@ } }, "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -4285,9 +4253,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-tokens": { @@ -4363,20 +4328,6 @@ "jsdom": ">=10.0.0" } }, - "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/jsdom/node_modules/tough-cookie": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", @@ -4505,9 +4456,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", - "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, "node_modules/language-subtag-registry": { @@ -4598,6 +4549,23 @@ } } }, + "node_modules/listr2/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, + "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/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4902,7 +4870,6 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -5068,18 +5035,12 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { + "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 }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -5264,24 +5225,6 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -5500,9 +5443,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", "dev": true, "engines": { "node": "20 || >=22" @@ -5518,9 +5461,9 @@ } }, "node_modules/path-to-regexp": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", - "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true, "engines": { "node": ">=16" @@ -5562,9 +5505,9 @@ "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { @@ -5613,11 +5556,10 @@ } }, "node_modules/playwright-core": { - "version": "1.47.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz", - "integrity": "sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", "dev": true, - "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -5631,7 +5573,6 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -5640,18 +5581,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/playwright/node_modules/playwright-core": { - "version": "1.47.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", - "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -5662,9 +5591,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -5680,11 +5609,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -5700,8 +5628,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/postcss-safe-parser": { "version": "7.0.0", @@ -5760,7 +5687,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -5844,9 +5770,9 @@ "dev": true }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, "dependencies": { "end-of-stream": "^1.1.0", @@ -5863,12 +5789,12 @@ } }, "node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -6241,9 +6167,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6456,9 +6382,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6594,6 +6520,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -6784,21 +6721,21 @@ } }, "node_modules/stylelint-config-recommended-scss": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", - "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, "dependencies": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.0", - "stylelint-scss": "^6.0.0" + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^16.0.2" + "stylelint": "^16.6.1" }, "peerDependenciesMeta": { "postcss": { @@ -6854,15 +6791,17 @@ } }, "node_modules/stylelint-scss": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz", - "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.7.0.tgz", + "integrity": "sha512-RFIa2A+pVWS5wjNT+whtK7wsbZEWazyqesCuSaPbPlZ8lh2TujwVJSnCYJijg6ChZzwI8pZPRZS1L6A9aCbXDg==", "dev": true, "dependencies": { - "known-css-properties": "^0.31.0", + "css-tree": "2.3.1", + "is-plain-object": "5.0.0", + "known-css-properties": "^0.34.0", "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.1.0", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -6873,9 +6812,9 @@ } }, "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -6891,9 +6830,9 @@ "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", "dev": true, "dependencies": { "flat-cache": "^5.0.0" @@ -6915,12 +6854,6 @@ "node": ">=18" } }, - "node_modules/stylelint/node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -7029,15 +6962,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -7182,9 +7115,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "dev": true }, "node_modules/tunnel-agent": { @@ -7548,14 +7481,14 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "peer": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -7564,8 +7497,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -7628,17 +7561,17 @@ "dev": true }, "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==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -7662,44 +7595,100 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "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==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/write-file-atomic/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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/wrap-ansi/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, - "engines": { - "node": ">=10.0.0" + "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/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "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, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -7808,5 +7797,5663 @@ "url": "https://github.com/sponsors/sindresorhus" } } + }, + "dependencies": { + "@axe-core/playwright": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.0.tgz", + "integrity": "sha512-kEr3JPEVUSnKIYp/egV2jvFj+chIjCjPp3K3zlpJMza/CB3TFw8UZNbI9agEC2uMz4YbgAOyzlbUy0QS+OofFA==", + "dev": true, + "requires": { + "axe-core": "~4.10.0" + } + }, + "@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@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, + "optional": true + }, + "@csstools/css-parser-algorithms": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "requires": {} + }, + "@cypress/request": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", + "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.13.0", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@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, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "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, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "@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, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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 + }, + "@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, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@playwright/test": { + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", + "integrity": "sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==", + "dev": true, + "requires": { + "playwright": "1.47.2" + } + }, + "@prettier/plugin-php": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.22.2.tgz", + "integrity": "sha512-md0+7tNbsP0oy+wIP3KZZc6fzx1k1jtWaMjOy/gM8yU9f2BDYEi+iHOc/UNPihYvPI28zFTbjvlhH4QXQjQwNg==", + "requires": { + "linguist-languages": "^7.27.0", + "php-parser": "^3.1.5" + } + }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", + "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.1" + } + }, + "@sinonjs/samsam": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + }, + "dependencies": { + "type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true + } + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true + }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/node": { + "version": "22.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.2.tgz", + "integrity": "sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==", + "requires": { + "undici-types": "~6.19.2" + } + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } + }, + "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, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ally.js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", + "integrity": "sha512-ZewdfuwP6VewtMN36QY0gmiyvBfMnmEaNwbVu2nTS6zRt069viTgkYgaDiqu6vRJ1VJCriNqV0jGMu44R8zNbA==", + "dev": true, + "requires": { + "css.escape": "^1.5.0", + "platform": "1.3.3" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "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, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "peer": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-source": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/array-source/-/array-source-0.0.4.tgz", + "integrity": "sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==" + }, + "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 + }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "peer": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true + }, + "axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true + }, + "axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "peer": true + }, + "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 + }, + "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 + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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 + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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 + }, + "cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "capitalize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-1.0.0.tgz", + "integrity": "sha512-ZvPF27zRh4ZiRbWYfSktO+t7xi4RPfqL9w6gfPAWGT5pT9TjB0rlP8cKHmKWHYYCR8QHKDDebX3HVHcfw6K3GQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "requires": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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 + }, + "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, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "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, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "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==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-functions-list": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "dev": true + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "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 + }, + "cssstyle": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "dev": true, + "requires": { + "rrweb-cssom": "^0.7.1" + } + }, + "cypress": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz", + "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==", + "dev": true, + "requires": { + "@cypress/request": "^3.0.4", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.1", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.3", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + } + }, + "cypress-axe": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.5.0.tgz", + "integrity": "sha512-Hy/owCjfj+25KMsecvDgo4fC/781ccL+e8p+UUYoadGVM2ogZF9XIKbiM6KI8Y3cEaSreymdD6ZzccbI2bY0lQ==", + "dev": true, + "requires": {} + }, + "cypress-plugin-tab": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz", + "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==", + "dev": true, + "requires": { + "ally.js": "^1.4.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "peer": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "requires": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true + }, + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true + }, + "deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "peer": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "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, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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 + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "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 + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, + "es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "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 + }, + "eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + } + }, + "eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz", + "integrity": "sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-cypress": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-3.5.0.tgz", + "integrity": "sha512-JZQ6XnBTNI8h1B9M7wJSFzc48SYbh7VMMKaNTQOFa3BQlnmXPrVc4PKen8R+fpv6VleiPeej6VxloGb42zdRvw==", + "dev": true, + "requires": { + "globals": "^13.20.0" + } + }, + "eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "requires": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "dev": true, + "peer": true, + "requires": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.36.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", + "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", + "dev": true, + "peer": true, + "requires": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "peer": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "peer": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "esrever": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/esrever/-/esrever-0.2.0.tgz", + "integrity": "sha512-1e9YJt6yQkyekt2BUjTky7LZWWVyC2cIpgdnsTAvMcnzXIZvlW/fTMPkxBcZoYhgih4d+EC+iw+yv9GIkz7vrw==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "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 + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "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 + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-source": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-source/-/file-source-0.6.1.tgz", + "integrity": "sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==", + "requires": { + "stream-source": "0.3" + } + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "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 + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "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 + }, + "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 + }, + "get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "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 + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^3.1.1" + } + }, + "html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true + }, + "htmlspecialchars": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/htmlspecialchars/-/htmlspecialchars-1.0.5.tgz", + "integrity": "sha512-gRSdRUTthlrkxtvTz3s98ly/OCU9guJTDm0EtQ5pMhmGYew5x/zwcDrt9KvEu+jy9bXNppAmzLzUTmCSJytNKQ==" + }, + "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, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "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 + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "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, + "peer": true + }, + "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 + }, + "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 + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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, + "peer": true + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "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 + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "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 + }, + "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, + "peer": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "peer": true, + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2" + } + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "requires": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "dependencies": { + "tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, + "requires": { + "tldts": "^6.1.32" + } + } + } + }, + "jsdom-global": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", + "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==", + "dev": true, + "requires": {} + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "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 + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "peer": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "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 + }, + "known-css-properties": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "peer": true + }, + "language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "peer": true, + "requires": { + "language-subtag-registry": "^0.3.20" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, + "levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/levenshtein/-/levenshtein-1.0.5.tgz", + "integrity": "sha512-UQf1nnmxjl7O0+snDXj2YF2r74Gkya8ZpnegrUBYN9tikh2dtxV/ey8e07BO5wwo0i76yjOvbDhFHdcPEiH9aA==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "linguist-languages": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.27.0.tgz", + "integrity": "sha512-Wzx/22c5Jsv2ag+uKy+ITanGA5hzvBZngrNGDXLTC7ZjGM6FLCYGgomauTkxNJeP9of353OM0pWqngYA180xgw==" + }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "locutus": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.32.tgz", + "integrity": "sha512-fr7OCpbE4xeefhHqfh6hM2/l9ZB3XvClHgtgFnQNImrM/nqL950o6FO98vmUH8GysfQRCcyBYtZ4C8GcY52Edw==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "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, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "requires": { + "get-func-name": "^2.0.1" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "luxon": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", + "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==" + }, + "mariadb": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.2.tgz", + "integrity": "sha512-kZvRy00thfFxEksfbDWq+77nB2M520PIZ26LLuHbOvyeZ5XQ3OCY/YsDDu+ifYNHIcs+7UCmjm50GiPdogc24w==", + "requires": { + "@types/geojson": "^7946.0.14", + "@types/node": "^22.5.4", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.3.0" + } + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true + }, + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "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 + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "mocha-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mocha-cli/-/mocha-cli-1.0.1.tgz", + "integrity": "sha512-cRBJVwtw1+ZE7+J0lvSaR+c0tE7rLX9Slca6f/6f6eq8L0TdcPminauCconsvPiAENbt0qkpleTd2AUCD8nFzg==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "debug": "^2.2.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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 + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "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 + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "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 + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "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, + "peer": true + }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } + }, + "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 + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + } + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "pad": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", + "integrity": "sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw==", + "requires": { + "wcwidth": "^1.0.1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "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 + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "requires": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "dependencies": { + "lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "dev": true + } + } + }, + "path-source": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/path-source/-/path-source-0.1.3.tgz", + "integrity": "sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==", + "requires": { + "array-source": "0.0", + "file-source": "0.6" + } + }, + "path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true + }, + "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 + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "php-parser": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", + "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==" + }, + "picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "platform": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", + "integrity": "sha512-VJK1SRmXBpjwsB4YOHYSturx48rLKMzHgCqDH2ZDa6ZbMS/N5huoNqyQdK5Fj/xayu3fqbXckn5SeCS1EbMDZg==", + "dev": true + }, + "playwright": { + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", + "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.47.2" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "playwright-core": { + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", + "dev": true + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "postcss-safe-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "dev": true, + "requires": {} + }, + "postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "requires": {} + }, + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "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 + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "peer": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "requires": { + "side-channel": "^1.0.6" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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 + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "peer": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, + "regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "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 + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "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, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "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, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "runes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/runes/-/runes-0.4.3.tgz", + "integrity": "sha512-K6p9y4ZyL9wPzA+PMDloNQPfoDGTiFYDvdlXznyGKgD10BJpcAosvATKrExRKOrNLgD8E7Um7WGW0lxsnOuNLg==" + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "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==" + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "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" + } + }, + "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, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shapefile": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/shapefile/-/shapefile-0.6.6.tgz", + "integrity": "sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==", + "requires": { + "array-source": "0.0", + "commander": "2", + "path-source": "0.1", + "slice-source": "0.4", + "stream-source": "0.3", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "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 + }, + "sinon": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", + "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "dependencies": { + "diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "slice-source": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/slice-source/-/slice-source-0.4.1.tgz", + "integrity": "sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==" + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "requires": { + "no-case": "^2.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true + }, + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "peer": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, + "stream-source": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/stream-source/-/stream-source-0.3.5.tgz", + "integrity": "sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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 + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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 + } + } + }, + "string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "peer": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + } + }, + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "peer": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylelint": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "dev": true, + "requires": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.41", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "requires": { + "flat-cache": "^5.0.0" + } + }, + "flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "requires": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "requires": {} + }, + "stylelint-config-recommended-scss": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", + "dev": true, + "requires": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" + } + }, + "stylelint-config-standard": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", + "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^14.0.1" + } + }, + "stylelint-config-standard-scss": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz", + "integrity": "sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==", + "dev": true, + "requires": { + "stylelint-config-recommended-scss": "^14.0.0", + "stylelint-config-standard": "^36.0.0" + } + }, + "stylelint-scss": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.7.0.tgz", + "integrity": "sha512-RFIa2A+pVWS5wjNT+whtK7wsbZEWazyqesCuSaPbPlZ8lh2TujwVJSnCYJijg6ChZzwI8pZPRZS1L6A9aCbXDg==", + "dev": true, + "requires": { + "css-tree": "2.3.1", + "is-plain-object": "5.0.0", + "known-css-properties": "^0.34.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==" + }, + "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 + }, + "throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tldts": { + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.47.tgz", + "integrity": "sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==", + "dev": true, + "requires": { + "tldts-core": "^6.1.47" + } + }, + "tldts-core": { + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.47.tgz", + "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==", + "dev": true + }, + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, + "tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "requires": { + "punycode": "^2.3.1" + } + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "twig-lexer": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/twig-lexer/-/twig-lexer-0.9.2.tgz", + "integrity": "sha512-jqW70ktyWR1alB7q7n6urBWewuF1iXwm2A9FMq0fFwBp+Gn9a1ORWyZ7AyQYqf33xNNl+pAbgNebWbnBtxDtXQ==" + }, + "twing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/twing/-/twing-7.0.0.tgz", + "integrity": "sha512-/mxM7HIJPOGMqlixD9ENiJQQerbr4lEgrY4icAgJZFd1Mc+1+DQ0pvGUn/UFtXTdRGjasqZrPYvgEFTOdFrMnw==", + "requires": { + "capitalize": "^1.0.0", + "create-hash": "^1.2.0", + "esrever": "^0.2.0", + "htmlspecialchars": "^1.0.5", + "iconv-lite": "^0.6.3", + "is-plain-object": "^2.0.4", + "isobject": "^3.0.1", + "levenshtein": "^1.0.5", + "locutus": "^2.0.31", + "luxon": "^1.19.3", + "pad": "^2.0.3", + "regex-parser": "^2.2.8", + "runes": "^0.4.3", + "snake-case": "^2.1.0", + "source-map": "^0.6.1", + "twig-lexer": "^0.9.0", + "utf8-binary-cutter": "^0.9.2" + }, + "dependencies": { + "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==", + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "utf8-binary-cutter": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/utf8-binary-cutter/-/utf8-binary-cutter-0.9.2.tgz", + "integrity": "sha512-lS/2TaA9idsyafus4+WaB+C/AfL3JD85C/sgMJBpplZay1G5SwTQcxmd4jiJLI1VxSJr6a3yuNicBxD+iU2MKQ==", + "requires": { + "lodash": "^4.17.10" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "requires": { + "xml-name-validator": "^5.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true + }, + "whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true + }, + "whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "requires": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "peer": true, + "requires": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "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, + "peer": true, + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "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, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "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, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "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 + } + } + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true + }, + "xml-parse": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/xml-parse/-/xml-parse-0.4.0.tgz", + "integrity": "sha512-+wgw8F9dPiBEOD91RnzJ+s9HJcW5jNR8fgtmqqTpa2YEC22TnExMJPnE5tzEbfyPyjeVZqLdLPj6M0k6oqPM0g==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "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, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } } } diff --git a/package.json b/package.json index 487225d54..89ead2a37 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "playwright:e2e": "playwright test e2e/*", "js-component-tests": "npx mocha web/themes/**/tests/components/*-tests.js", "js-format": "npx prettier -w 'web/themes/**/assets/**/*.js' 'tests/**/*.js' '*.js'", - "js-lint": "eslint 'web/**/assets/**/*.js' 'tests/**/*.js' '*.js'", + "js-lint": "eslint '**/*.js'", "php-format": "npx prettier -w 'web/**/*.php' 'web/**/*.php.test' 'web/**/*.theme' 'web/**/*.module'", "style-format": "npx prettier -w 'web/themes/**/*.scss'", "style-lint": "stylelint '**/*.scss'", @@ -68,7 +68,7 @@ }, "dependencies": { "@prettier/plugin-php": "^0.22.2", - "mariadb": "^3.3.2", + "mariadb": "^3.3.1", "shapefile": "^0.6.6", "twing": "^7.0.0" } diff --git a/scripts/compile-svg-sprite.js b/scripts/compile-svg-sprite.js index f0202a410..d29a387d4 100644 --- a/scripts/compile-svg-sprite.js +++ b/scripts/compile-svg-sprite.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); -const jsdom = require('jsdom').JSDOM; +// eslint-disable-next-line import/no-extraneous-dependencies +const Jsdom = require('jsdom').JSDOM; // Grab the passed-in filenames from the command // line. These should have been provided from a glob @@ -20,13 +21,11 @@ const outputPath = path.resolve( // easily manipulating the elements as // we create them. This also parses the XML // easily into HTML friendly SVG. -const dom = new jsdom(`
/>/>`); +const dom = new Jsdom(`/>/>`); const window = dom.window; const document = window.document; -const getBasename = (filepath) => { - return path.basename(filepath, ".svg"); -}; +const getBasename = (filepath) => path.basename(filepath, ".svg"); /** * Given a path filename, make the @@ -49,11 +48,7 @@ const filenameToId = (str) => { */ const cleanupWhitespace = (str) => { const lines = str.split("\n"); - return lines.map(line => { - return line.replace(/^\w+\n$/, ""); - }).filter(line => { - return line !== ""; - }).join("\n"); + return lines.map(line => line.replace(/^\w+\n$/, "")).filter(line => line !== "").join("\n"); }; /** @@ -63,9 +58,7 @@ const cleanupWhitespace = (str) => { * @return string A string with any inline style * tags removed from the SVG XML. */ -const removeStyleTags = (str) => { - return str.replace(/