diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..6ceffb5 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + root: true, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + rules: { + 'no-null/no-null': 2, + }, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'no-null'], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + env: { + browser: true, + node: true, + }, +}; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..9bd4db0 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +* @tjcouch-sil @lyonsil +# not package-lock.json +/package-lock.json diff --git a/.github/workflows/generate-markers-map.yml b/.github/workflows/generate-markers-map.yml new file mode 100644 index 0000000..8fe70a0 --- /dev/null +++ b/.github/workflows/generate-markers-map.yml @@ -0,0 +1,71 @@ +name: Generate Markers Map + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + inputs: + schemaVersion: + description: 'Version of `usx.rng` to generate markers map from, e.g. 3.1. For testing, can specify `master` to use latest version from `ubsicap/usx` or `main` to use latest version from `usfm-bible/tcdocs`, but note that the markers map will have this exact string as its version.' + required: true + default: '3.1' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + # Apparently GitHub doesn't set the inputs to default if you run from other than manual dispatch, so setting defaults here + - name: Make default inputs consistent + id: inputs + run: | + echo "schemaVersion=${{ github.event.inputs.schemaVersion || '3.1' }}" >> "$GITHUB_OUTPUT" + + - name: Checkout usfm-tools + uses: actions/checkout@v4 + + - name: Clone `ubsicap/usx`, checkout the right branch, and move `usx.rng` to root + if: ${{ steps.inputs.outputs.schemaVersion == 'master' || steps.inputs.outputs.schemaVersion < '3.1' }} + run: | + git clone https://github.com/ubsicap/usx.git ../usx + cd ../usx + if [ "${{ steps.inputs.outputs.schemaVersion }}" != "master" ]; then + git checkout "usx${{ steps.inputs.outputs.schemaVersion }}" + fi + mv schema/usx.rng ../usfm-tools/usx.rng + echo "USX_REPO=https://github.com/ubsicap/usx.git" >> "$GITHUB_ENV" + echo "USX_COMMIT=$(git rev-parse HEAD)" >> "$GITHUB_ENV" + + - name: Clone `usfm-bible/tcdocs` and checkout the right branch, and move `usx.rng` to root + if: ${{ steps.inputs.outputs.schemaVersion != 'master' && steps.inputs.outputs.schemaVersion >= '3.1' }} + run: | + git clone https://github.com/usfm-bible/tcdocs.git ../tcdocs + cd ../tcdocs + if [ "${{ steps.inputs.outputs.schemaVersion }}" != "main" ]; then + git checkout "${{ steps.inputs.outputs.schemaVersion }}" + fi + mv grammar/usx.rng ../usfm-tools/usx.rng + echo "USX_REPO=https://github.com/usfm-bible/tcdocs.git" >> "$GITHUB_ENV" + echo "USX_COMMIT=$(git rev-parse HEAD)" >> "$GITHUB_ENV" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Generate markers map + run: npm run generate-markers-map -- --schema usx.rng --version "${{ steps.inputs.outputs.schemaVersion }}" --repo "${{ env.USX_REPO }}" --commit "${{ env.USX_COMMIT }}" + + - name: Upload Markers Map + uses: actions/upload-artifact@v4 + with: + name: markers-map + path: | + dist/* + retention-days: 90 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..4868360 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,31 @@ +name: Test + +on: + push: + branches: ['main'] + pull_request: + # The branches below should be a subset of the branches above + branches: ['main'] + +jobs: + test: + name: Build on ${{ matrix.os }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest] + + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + + - name: Install packages + run: npm ci + + - name: npm unit tests + run: npm test + + - name: check JS/TS linting + run: npm run lint diff --git a/.gitignore b/.gitignore index 9a5aced..16200df 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,6 @@ dist # Vite logs files vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Local copies of files from other repositories +usx.rng diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..e620eff --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +node_modules + +# generated files +package-lock.json +src/test-data +src/markers-3.1.json diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..3c45b9a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,24 @@ +module.exports = { + printWidth: 100, + tabWidth: 2, + singleQuote: true, + trailingComma: 'es5', + bracketSpacing: true, + bracketSameLine: false, + arrowParens: 'avoid', + proseWrap: 'preserve', + // prettier-plugin-jsdoc options + tsdoc: true, + plugins: ['prettier-plugin-jsdoc'], + overrides: [ + { + files: '*.sql', + options: { + parser: 'sql', + language: 'sqlite', + keywordCase: 'upper', + linesBetweenQueries: 1, + }, + }, + ], +}; diff --git a/LICENSE b/LICENSE index 20ec99a..08d6d6b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Paranext +Copyright (c) 2025 SIL Global and United Bible Societies. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 24d5b36..f42f3f4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,677 @@ # usfm-tools -Scripts and utilities for transforming and preparing US* schemas for use in Platform.Bible and Paratext + +Scripts and utilities for transforming and preparing US\* schemas for use in Platform.Bible and Paratext + +## Setup + +To get started with this repo, first clone the repo: + +``` +git clone https://github.com/paranext/usfm-tools.git +``` + +Then install dependencies: + +``` +npm i +``` + +## Terminology + +In this repo, there are some terms used that are rather precise and specific to USFM and others that do not necessarily match with official terminology (including some newly coined terms where there are not known terms). There is lots of documentation in `src/markers-map.model.template.ts`. Here is a short list of terms and definitions for clarity: + +- Attributes - key/value pairs (or, in some cases in USFM, just values because the key is implied via USFM syntax) on a marker that provide some information about that marker + - USFM attributes - key/value pairs or values whose keys are implied that add information to markers but are not essential information about how to represent a marker in USFM. For example, `caller`, `lemma`, and `code` are USFM attributes, but `style` (the marker name in USX) and `closed` (a USX attribute and USJ property that indicates whether the marker has a closing marker in USFM) are not USFM attributes but are only found in other formats and are used to represent the marker itself in USFM. + - USX/XML attributes - [XML attributes](https://www.geeksforgeeks.org/software-engineering/xml-attributes/) on an XML element. Some of these (like `caller` or `lemma`) are USFM attributes while others (like `style` or `closed`) are other kinds of information that are not represented as attributes in USFM + - USJ/JSON properties/attributes - a term sometimes used for each key/value pair in [JSON objects](https://json-schema.org/understanding-json-schema/reference/object). Some of these (like `caller` or `lemma`) are USX attributes and USFM attributes. Others (like `style` in USX, which equates to `marker` in USJ, and `closed`) are USX attributes but are not USFM attributes. Others (like `content`) are other kinds of information that are not represented as attributes in USFM or USX. +- `usx.rng` `attribute` - XML elements with tag name `attribute` in `usx.rng`. These are not like the attributes described above because these are XML elements in [RelaxNG specification](https://relaxng.org/spec-20011203.html) that describe USX attributes. +- USFM Attribute types - different ways attributes are represented in USFM. Each USFM attribute has its own attribute type, and these types do not apply to USX or USJ (they are all normal USX attributes and USJ properties). + - Closing marker attributes - attributes that are listed attached to the closing marker e.g. `lemma` on `w` marker. These look like `\marker content|attributeKey="attributeValue" otherAttributeKey="otherAttributeValue"\marker*` + - Default attribute - an attribute that, if it is the only closing marker attribute for a marker, can be listed without the attribute key e.g. `gloss` on `rb`. These look like `\marker content|defaultAttributeValue\marker*` + - Special attribute types - attributes in USX/USJ that are not just listed on the closing marker but are represented in some other way in USFM. None of these have the attribute key listed in USFM. + - Attribute marker - separate markers that appear after the marker they describe in USFM e.g. `altnumber` on `c` is `ca`. These look like `\marker content \attributeMarker attributeValue` + - Text content attribute - the actual text content of the marker in USFM. e.g. `alt` on `periph`. These look like `\marker content`. + - Leading attribute - text that is added right after the opening marker and before the text content of the marker e.g. `caller` on `f`. These look like `\marker leadingAttribute content` +- `usx.rng` `element` - XML elements with tag name `element` in `usx.rng`. These XML elements are from [RelaxNG specification](https://relaxng.org/spec-20011203.html) and are used to describe markers and/or marker types. +- `usx.rng` `define` - XML elements with tag name `define` in `usx.rng`. These XML elements are from [RelaxNG specification](https://relaxng.org/spec-20011203.html) and are used to describe some set of information that is referred to somewhere else in `usx.rng`. Usually, these `define`s contain one or more `element`s, so they describe one or more markers and/or marker types. +- Closing marker - the USFM representation of the end of a marker. USX and USJ markers just use their equivalent XML/JSON syntax for the closing of an element/object. + - Normal closing marker - a closing marker that uses the same marker name as the opening marker and just have an asterisk at the end e.g. `\nd*` for `nd`. These look like `\marker*`. + - Independent closing marker - a closing marker that uses a different marker name than the opening marker and does not have an asterisk added at the end e.g. `\esbe` for `esb`. These look like `\closingMarker`. +- Specification/spec - the official ruling about how USFM/USX/USJ should look. This is found at https://docs.usfm.bible/usfm/3.1/index.html +- [Whitespace](https://en.wikipedia.org/wiki/Whitespace_character) + - Structural whitespace - whitespace in USFM that is required part of the USFM syntax and delimits different things e.g. normal space after opening markers. This looks like `\marker content` + - Content whitespace - whitespace in USFM that is part of the actual Scripture text or the "content" of the marker. This looks like `\marker here is some content with content whitespace in it` + - Normalization - the process of transforming USFM with any whitespace into USFM with specific whitespace based on a set of rules. Many different USFM representations of the same Scripture content should be able to be normalized into the same USFM string. Paratext has its own rules for normalizing whitespace, and the specification has its own rules that result in the canonical form. + - Canonical form - the official representation of how USFM should look based on the rules described by the specification. The whitespace should be [normalized or "reduced" according to the rules in the specification](https://docs.usfm.bible/usfm/3.1/whitespace.html#ws-reducing). + +## Markers Map + +The markers map is a JSON file that contains information for each USFM marker and marker type. It aims to include all necessary marker-specific information for translating from USJ to USFM that is not about the generic syntax of USFM. + +See [`UsjReaderWriter`](https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-utils/src/scripture/usj-reader-writer.ts) for an example of using this markers map to transform USJ to USFM as well as to convert locations between USFM and USJ space. + +The markers map does not contain the following information necessary for perfectly transforming USJ to USFM: + +- There are a few properties on markers that should not be output to USFM as USFM attributes but rather should be incorporated in other ways. The use of these properties is partially or wholly not represented in the markers map + - `style`/`marker` (the marker name in USX/USJ) + - the XML element tag/`type` (the marker type in USX/USJ) + - the XML element children/`content` (the contents of the marker in USX/USJ) + - `closed` (whether the marker should be explicitly closed in USFM) + - Note: In USFM 3.1, the `+` prefix for nested character markers is optional, but the markers map does not currently expect or have instructions on how to handle any special information to preserve whether or not this prefix is present. +- The `v` marker (`verse` type) canonically has a newline before it. However, Paratext 9.4 does not add a newline before it if it comes after `(` or `[`. +- The `optbreak` marker is transformed to two slashes in a row `//` in USFM +- Non-breaking space (`NBSP`/`U+00A0`) should be converted to `~` in USFM +- General, simple rules about how canonical USFM is structured. Some examples: + - There is a backslash before each marker name (except in certain circumstances when indicated by `markerType.isClosingMarkerEmpty`) and a space after each marker name (except in non-standard circumstances when indicated by `markerType.noSpaceAfterOpening`) e.g. `\nd ` + - There is an asterisk before normal closing markers e.g. `\nd*` + - Newlines before markers as indicated by `markerType.hasNewlineBefore` replace space after the last content before the marker + - Attributes that are not special attribute types or skipped are listed at the end of the marker after a bar `|` in the form `key="value"` with spaces between multiple attributes. + - See [`UsjReaderWriter.toUsfm`](https://github.com/paranext/paranext-core/blob/main/lib/platform-bible-utils/src/scripture/usj-reader-writer.ts) to find the implementation of all general USFM rules. +- The spec seems to be silent regarding what should happen to unknown markers. In Paratext 9.4, markers whose type is `para` but the marker is unknown (meaning the marker info cannot be found or the marker `type` in the marker does not match the marker `type` listed in the marker info) do not have a newline before them when output to USFM contrary to normal `para`-type markers. +- The spec seems to be silent about unexpected closing markers. In Paratext 9.4, closing markers that have no matching opening marker are given the `unmatched` marker type. They have no contents. no closing markers, and no structural space after the marker. + +The markers map also includes most information necessary for parsing USFM and translating from USFM to USJ, but it does not currently cover this use case or aim to cover it. Particularly, it does not contain the following information (there may be other gaps): + +- When to close USFM markers +- Where to create the `table` marker that is currently derived in USX and USJ but is never in USFM +- Which whitespace is USFM structural whitespace that has no representation in USX/USJ and can be skipped +- When two slashes in a row `//` are found, this should be converted to the `optbreak` marker in USX/USJ +- When `~` is found, this should be converted to non-breaking space (`NBSP`/`U+00A0`) in USX/USJ. +- What to do about unknown markers (ones for which there is no marker info). Paratext 9.4 gives them the type `para`. +- What to do about unexpected closing markers (end with `*`). Paratext 9.4, closing markers that have no matching opening marker are given the `unmatched` marker type, have no contents, no closing markers, and no structural space after the marker. + +### Generate Markers Map + +Generate the markers map by placing the USX RelaxNG Schema file `usx.rng` (download the file on a release branch - [`usx.rng` < 3.1](https://github.com/ubsicap/usx/blob/master/schema/usx.rng) or [`usx.rng` >= 3.1](https://github.com/usfm-bible/tcdocs/blob/main/grammar/usx.rng)) in the root of this repo and running `npm run generate-markers-map -- --schema usx.rng --version --commit `. Note that the commit hash is the commit hash for the repo where you got `usx.rng`, _not_ the commit hash of this repo. + +See the release notes and planned changes for USFM versions [in the Roadmap](https://github.com/usfm-bible/tcdocs/blob/main/docs/USFMTC%20Roadmap.md) and [in the Docs](https://docs.usfm.bible/usfm/latest/release-notes.html). + +This script reads the USX RelaxNG Schema file [`usx.rng`](https://github.com/usfm-bible/tcdocs/blob/main/grammar/usx.rng) and generates a JSON file `dist/markers.json` and a TypeScript file `dist/markers-map.model.ts` that contain various information for each USFM marker name. `markers.json` will contain an object with: + +- information about the generated file (`version`, `commit`, `usfmToolsVersion`) +- the [Semantic version](https://semver.org/) of the markers map `markersMapVersion`. The same major version contains no breaking changes +- a `markers` property whose value is a map object + - keys are the marker names + - values are objects containing information about the marker such as the marker type and the marker's default attribute (where applicable) +- a `markersRegExp` property whose value is the same thing as `markers` but for markers whose names match the keys using RegExp +- a `markerTypes` property whose value is a map object + - keys are the marker types + - values are objects that are currently empty but may be filled with information about the marker types in the future +- other properties that slightly affect how the USJ is transformed to USFM that are different depending on what style of USFM you intend to generate, spec or Paratext 9.4 (`isSpaceAfterAttributeMarkersContent`, `shouldOptionalClosingMarkersBePresent`). + +This object is also exported from `dist/markers-map.model.ts` as `USFM_MARKERS_MAP` (matching spec) and `USFM_MARKERS_MAP_PARATEXT` (matching Paratext 9.4). `dist/markers-map.model.ts` also contains TypeScript types relevant to this object. + +Following is a simplified example of what you might see in a `markers.json` file: + +```json +{ + "version": "5.2-test.123", + "commit": "abc123", + "markers": { + "c": { + "type": "chapter", + "leadingAttributes": [ + "number" + ], + "attributeMarkers": [ + "ca", + "cp" + ] + }, + "p": { + "type": "para", + "description": "Paragraph text, with first line indent" + }, + "qt3-s": { + "type": "ms", + "defaultAttribute": "who" + }, + ... + }, + "markersRegExp": { + "t[hc][rc]?\d+(-\d+)?": { + "type": "cell" + } + }, + "markerTypes": { + "cell": { + "skipOutputAttributeToUsfm": [ + "align" + ] + }, + "chapter": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "sid" + ], + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "eid" + ] + }, + "ms": { + "isCloseable": true, + "isClosingMarkerEmpty": true + }, + "para": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "vid" + ] + }, + } +} +``` + +### Transforming `usx.rng` into the markers map + +
+ Expand to read about how the data in `usx.rng` is transformed into `markers.json` + +The marker names and information about those markers are mostly derived from the `usx.rng` file. This schema file contains information about each valid USFM marker in the various `element` definitions: + +- (`marker.type`; `markerTypes` keys) The element's `name` is the marker type +- Skip the definition if all `ref`s pointing to it are pointing to it via `usfm:alt` attribute instead of `name` (`FigureTwo`) +- Marker information: + - (`markers` keys; `markersRegExp` keys) The marker name comes from one of a number of places: + - The `style` attribute may contain the single marker name for that marker type + - The `style` attribute may contain a `choice` of all the marker names associated with that marker type + - The `style` attribute may contain a `ref` pointing to a `choice` of all the marker names associated with that marker type + - If there is not a `style` attribute, the element's `name` is the marker type and the marker name + - (`marker.isIndependentClosingMarkerFor`; `marker.independentClosingMarkers`) additional independent closing marker that goes with another marker + - Check for marker type element direct children `usfm:ptag` or `usfm:tag` with text content and create a simple marker (no attributes or whatnot from the other markers of this marker type) whose name is the text content of the tag. Like `esbe` in `sidebar` marker type + - (`marker.isClosingMarkerOptional`) closing marker should not usually be output to USFM if the `usfm:endtag` has `noout="true"` + - (`marker.description`) get comments of what the marker represents from `a:documentation` right after the `style` attribute or from an XML comment right after the `style` attribute + - Lots of attribute info comes from various sources: + - Gather list of all attributes + - Get `attribute` tags in the `element` tag + - Look in `ref` tags in `element` and check if `define` has first child `attribute` or `optional` then `attribute` (`category`, `closed`, `link-href`, `link-title`, `link-id`) + - Do not consider the `style` attribute as a normal attribute as it is the marker name rather than a USFM attribute + - Do not consider the `closed` attribute as a normal attribute as it is a special attribute that is never output to USFM + - Do not consider `colspan` attribute on `cell` as a normal attribute as it is incorporated into the marker name and is not a USFM attribute + - There are many kinds of special attribute types in USFM representation. One attribute cannot be multiple types of special attribute. Check if an attribute is a special type in this listed order: + - Attributes should not be considered for being a special attribute type in any of the following circumstances: + - the `attribute` tag has multiple `usfm:match` tags + - name is `style` since that attribute is always the marker name in USFM + - the attribute is listed in `markerType.skipOutputAttributeToUsfm` because these special attribute types are related to USFM output + - the attribute is listed in `markerType.skipOutputMarkerToUsfmIfAttributeIsPresent` because these special attribute types are related to USFM output + - The `attribute` has any `usfm:match` with `beforeout` containing `|=`. This is here to prevent `id` on `periph` from being default because it is an unusual USFM marker that doesn't have a default even though it has an attribute + - (`marker.attributeMarkerAttributeName`) attribute markers - e.g. `altnumber`/`ca`, `pubnumber`/`cp`, `altnumber`/`va`, `pubnumber`/`vp`, `category`/`cat` + - One `usfm:match` or `usfm:tag` or `usfm:ptag` with `beforeout` `\\__` + - [Special case] `version` on `usx` is not an attribute marker (this special case may be unnecessary if the generation script is improved to handle markers that are not directly represented in USFM) + - (`markers` keys; `markersRegExp` keys) get marker name from `beforeout` + - (`marker.hasStructuralSpaceAfterCloseAttributeMarker`)`afterout` will have a space after the marker name like `\\__ ` if there should be a space in the canonical output USFM + - (`marker.type`) `para` if `usfm:ptag` or `beforeout` has `\n`; `char` otherwise + - (`marker.isAttributeMarkerFor`/`marker.attributeMarkers`) record the connection between the marker this attribute marker is listed on and this attribute marker + - (`marker.textContentAttribute`) text content attribute - e.g. `periph`'s `alt` + - One `usfm:match` with `match="TEXTNOTATTRIB"` or `match="TEXTNWS"` + - [Special case] `usx` marker `version` is text content (it has `match="TEXTNWS"` in one of two occurrences; probably should be on both. Probably needs some kind of special marking indicating `usx` marker is replaced by `usfm` marker) + - (`marker.leadingAttributes`) Leading attributes - e.g. `v`'s `number` + - One `usfm:match` is present + - `match` must not be `TEXTNOTATTRIB` or `TEXTNOTATTRIBOPT` + - `beforeout` must not contain `\\__ ` + - (`marker.defaultAttribute`) If the marker has a default attribute, it may come from one of two places + - The default attribute will be the value of the `usfm:propval` attribute on the `value` tag in the `style` attribute or in the enumeration. + - If there is no `usfm:propval` attribute on the `value` tag in the `style` attribute or there is no `style` attribute, the default attribute for a marker will be the first non-optional `attribute` `name` listed in the element other than the attributes to skip or the first optional non-skipped `attribute` `name` if there are no non-optional non-skipped `attribute`s. There is only a default attribute if there are zero or one non-optional non-skipped `attribute`s. + - Attributes should be skipped when determining which attribute is the default attribute via normal rules of these instructions for attributes (meaning they are not in the list of attributes that should not be considered and are not other special attribute types like leading attributes) + - [Special case] In less than 3.1, do not consider `link-href`, `link-title`, or `link-id` for default attribute because these attributes are common [linking attributes](https://ubsicap.github.io/usfm/linking/index.html) that can be on many markers but are only default on `jmp` and `xt` (but they are not marked differently on those, so this must be hard-coded) +- Marker type information: + - (`markerType.hasStyleAttribute`) note when the marker shouldn't have a `style` attribute + - If the element has no `style` attribute, the marker shouldn't either. + - Do not consider the marker type to have no `style` attribute if all `ref`s pointing to it have `usfm:ignore="true"`, meaning it is just listing attributes that indicate the whole marker should not be output to USFM + - (`markerType.skipOutputAttributeToUsfm`) Do not output an attribute to USFM if: + - `attribute` has `usfm:ignore="true"` (`attribute` - chapter and verse `sid`, `closed`) + - `attribute` `name` has `ns="http://www.w3.org/2001/XMLSchema-instance"` on it or name starts with `xsi:` (these attributes are not related to Scripture data and should not be exported to USFM) + - the attribute is `vid` on `para` or `table` (probably should have `usfm:ignore` set) + - the attribute is `sid` in `chapter` (probably should have `usfm:ignore` set) + - [Special case] the attribute is `align` or `colspan` attributes in `cell` marker type + - `align` (probably should have `usfm:ignore` set because it is already embedded in the style) + - `colspan` probably needs some kind of special something set because it gets embedded in the style for USFM but is not present in the style already in USX/USJ + - (`markerType.skipOutputMarkerToUsfmIfAttributeIsPresent`) Ignore the opening and closing markers when translating to usfm (but keep the contents of the marker) if `attribute`s listed in the `markerType` are present if any of the following are true: + - If all `ref`s pointing to the `define` have `usfm:ignore="true"` (chapter and verse `eid`) + - If any `usfm:match` in the attribute has `noout="true"` attribute on it (ref `gen`) + - (`markerType.hasNewlineBefore`) marker type should have newlines before the marker if + - In `style` attribute element (or, if there is no `style` element, in the `element` element), one `usfm:ptag` or `usfm:tag` or `usfm:match` direct child with `beforeout` with `\n` in it (`verse` - `\n` is optional, whereas it does not seem to be optional in the others. Does this matter for us? I don't think so; I think it all normalizes out to being just whitespace). + - [Special case] `cell` has `usfm:ptag` but should not have a newline before it. TJ thinks is a bug in `usx.rng`. + - [Special case] `periph` doesn't have `\n` in its `usfm:match` `beforeout`, but it should have a newline before it. TJ thinks is a bug in `usx.rng`. + - [Special case] `usx` doesn't have `\n` in its `usfm:match` `beforeout`, but it should have a newline before it. TJ thinks this is a bug in `usx.rng`. + - (`markerType.isCloseable`) the marker type has a normal closing marker if + - One `usfm:endtag` is present somewhere in the element + - If there are two that share the same attributes other than `matchref` and `before` being the same other than a `+` in one, can consider just the first one. This is for some `char` markers that have both `\nd` and `\+nd` listed + - `usfm:endtag` is outside the `element` for `milestone` because its `element` has `` in it + - `ref` should have closing marker. `usfm:endtag` is outside the element for some reason. + - (`markerType.isClosingMarkerEmpty`) Closing marker is empty if `matchref="''"` (which basically means empty - there is very intentionally nothing to match) + - Note: `ref`'s `usfm:endtag` has `matchref=""`, and it should have a closing marker + - Note: `category` has `matchref=""` and `matchout` is not empty/not provided (`category`). If we end up handling `category` more precisely, this might need to be considered. + + + +### Future improvements + +Following are some improvements that could potentially be made to further strengthen this markers map generation: + +- Do some work to encode that the `usx`, `usfm`, and `USJ` markers are different in each standard +- Should all the special attribute stuff be on `markerType` instead? Some risk in that `cat` is a marker attribute on all `note` marker types, but maybe that's coincidence and it may not forever and always be on all `note` marker types +- Explain how the terms I am using from XML sorta map to the USFM concepts but aren't exact one-to-one equals +- [markerType] note when the marker shouldn't have a `style` attribute + - Improve accuracy: if the `element` has no `style` attribute and has direct child `usfm:tag` (`ref`), `usfm:ptag` (none - `sidebar` is closest), or `usfm:match` (`periph` and `optbreak`), no `style` attribute. If doesn't have one of these direct children (`table`, `usx`), the marker shouldn't be output to USFM at all. Or at least it indicates a very special case. Maybe not handling this yet is why `usx` considers `usfm` to be a marker attribute in the `usx.rng` but we don't. And `table` + - `usx` doesn't have `usfm:tag` or `usfm:ptag` and its attribute has `beforeout` with `\\__`. Could use those two indicators to determine it should be replaced with `usfm` in output. But then this still doesn't cover moving `usfm` under `id` +- [markerType] Figure out how to determine when to close these long-running markers with their own content hierarchies - `usx`, `table`, `periph`, `esb`, others? Actually probably need a general way to represent how any marker closes, not just these specific ones close +- Do we need to keep track of whether a nested marker that closes has `+` on its markers? +- `cl` and `esbe` both specify `afterout="'\n'"` meaning a newline after them. But it seems to get reduced with newlines that come before the stuff after, so I dunno if we really need this. Maybe test P9 putting stuff after these markers and see what happens + - `book` marker type also has a `usfm:match` in it with `matchout="'\n'"`. Thinking this indicates it is a block-level marker, but it's weird because this may be the only one like this. All other block-level markers have `usfm:ptag`. But `id` is always the first line of the file. How should we track this? + - Actually, it seems `hasNewlineBefore` doesn't line up with block-level marker types for `periph` or `verse` (optional newline) either. Maybe block-level should be its own property on marker types. + - `periph` is not quite a block-level marker type, actually; more like a multi-block type. Need to define some rules around when these can end. `periph`, `table`, `usx`, `esb` (has its own closing marker). Can provide attributes in USFM with inline syntax, not block-level syntax. +- If needed, can tell if marker type doesn't have text content via `` + - Probably doesn't matter for our needs because, if a marker is empty, it won't have `contents`. You can tell if there should be a closing marker (like milestones) from other things. + +### Special cases + +The `usx.rng` file does not contain every single piece of information necessary for performing the supported operations with the markers map (like transforming USJ to USFM). Following are some special additions and exceptions to the rules for determining the markers map from the `usx.rng` file that are manually encoded into the markers map to ensure its completeness. Note that not all exceptions are necessarily listed here; you can find exceptions by looking for `special case:` in `src/markers-map.util.ts`. + +- All rules starting with [Special case] in the sections above +- There are some markers that need very special handling that is not represented perfectly in `usx.rng`. In `markers.json`, the special handling is explained in `parseUsfmInstructions` and `outputToUsfmInstructions`: + - [`usfm`](https://docs.usfm.bible/usfm/3.1/doc/usfm.html) with marker type `para` and no default attribute. This marker is present in USFM but most of the time is translated into the `usx` marker in USX and the `USJ` marker in USJ + - Note that `usfm` is a special `para` in that its text content is considered to be `version`, which gets translated to `usx` and `USJ` as an attribute. + - [`USJ`](https://docs.usfm.bible/usfm/3.1/doc/usfm.html) with marker type `USJ` and no default attribute. This marker is present in USJ but is translated into the `usx` marker in USX and the `usfm` marker in USFM. + - [`cell`](https://docs.usfm.bible/usfm/3.1/char/tables/tc.html)-type markers encode the number of columns they span differently between USFM and USX/USJ + +Note: `fig` has an attribute that changes names: in USFM, it is `src`; in USX and USJ, it is `file`. + +### Examples + +Following is a snippet from the schema that is an example of one marker name and marker type: + +```xml + + + book + + + style + id + + + + code + + + + + + + + + + + + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markers": { + "id": { + "type": "book" + } + } +} +``` + +Following is a snippet from the schema that is an example of many marker names in a `choice` that share a marker type: + +```xml + + + + + f + fe + ef + + + + + + + + + + + + + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markers": { + "f": { + "type": "note" + }, + "fe": { + "type": "note" + }, + "ef": { + "type": "note" + } + } +} +``` + +Following is a snippet from the schema that is an example of many marker names in a `choice` in a `ref` that share a marker type: + +```xml + + + para + + + style + + + + + + + + + + + + + + + + + + mt1 + The main title of the book (if multiple levels) + mt2 + A secondary title usually occurring before the main title + mt3 + A tertiary title occurring after the main title + mt4 + mt + The main title of the book (if single level) + rem + Remark + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markers": { + "mt1": { + "type": "para" + }, + "mt2": { + "type": "para" + }, + "mt3": { + "type": "para" + }, + "mt4": { + "type": "para" + }, + "mt": { + "type": "para" + }, + "rem": { + "type": "para" + } + } +} +``` + +Following is a partial snippet from the schema that is an example of many marker names, some with default attributes, that share a marker type: + +```xml + + + + ms + + + style + + + + + + + + + + + + + ts-s + ts-e + ts + t-s + t-e + qt1-s + qt1-e + qt2-s + qt2-e + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markers": { + "ts-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "ts-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "ts": { + "type": "ms" + }, + "t-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "t-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt1-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt1-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt2-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt2-e": { + "type": "ms", + "defaultAttribute": "eid" + } + } +} +``` + +Following is a partial snippet from the schema that is an example of a marker that has the same type and name with no style attribute and with a default attribute: + +```xml + + + + ref + + + + + + + + + + loc + + + [A-Z1-4]{3}(-[A-Z1-4]{3})? ?[a-z0-9\-:]* + + + + + + + gen + + true + false + + + + + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markers": { + "ref": { + "type": "ref", + "defaultAttribute": "loc" + } + } +} +``` + +Following is a snippet from the schema that is an example of a `markersRegExp` entry in which the marker name is matched with RegExp: + +```xml + + + cell + + + style + + t[hc][rc]?\d+(-\d+)? + + + + align + + + + + colspan + + + + + + + + + + + + + + + + + + + +``` + +Generating the marker map from only this snippet would result in the following: + +```json +{ + "markersRegExp": { + "t[hc][rc]?\d+(-\d+)?": { + "type": "cell" + } + } +} +``` + +Here is an example of some USX data. The tag names are the marker types, and the `style` attributes are the marker names: + +```xml + + World English Bible (WEB) + UTF-8 + Exodus + The Second Book of Mosis, Commonly Called Exodus + Exodus + Exodus + The Second Book of Moses, + Commonly Called + Exodus + + + Now these are the names of the sons of Israel, who came into Egypt (every man and his household came with Jacob): Reuben, Simeon, Levi, and Judah, Issachar, Zebulun, and Benjamin, Dan and Naphtali, Gad and Asher. All the souls who came out of Jacob’s body were seventy souls, and Joseph was in Egypt already. Joseph died, as did all his brothers, and all that generation. The children of Israel were fruitful, and increased abundantly, + and multiplied, and grew exceedingly mighty; and the land was filled with them. + + +``` + +
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d7ab279 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12274 @@ +{ + "name": "usfm-tools", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "usfm-tools", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.11", + "commander": "^14.0.0" + }, + "devDependencies": { + "@types/node": "^24.3.0", + "@types/xmldom": "^0.1.34", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.8.3", + "eslint-import-resolver-webpack": "^0.13.10", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.6.0", + "prettier": "^3.5.3", + "prettier-plugin-jsdoc": "^1.3.3", + "tsx": "^4.20.5", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.0", + "vitest": "^3.2.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.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, + "license": "MIT", + "peer": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", + "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@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, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@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==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@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==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "peer": 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.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.1.2.tgz", + "integrity": "sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.3.tgz", + "integrity": "sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "30.1.2", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.1.3", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.0.5", + "jest-config": "30.1.3", + "jest-haste-map": "30.1.0", + "jest-message-util": "30.1.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-resolve-dependencies": "30.1.3", + "jest-runner": "30.1.3", + "jest-runtime": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "jest-watcher": "30.1.3", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.1.2.tgz", + "integrity": "sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.1.2.tgz", + "integrity": "sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expect": "30.1.2", + "jest-snapshot": "30.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.2.tgz", + "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.1.2.tgz", + "integrity": "sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.1.2.tgz", + "integrity": "sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/expect": "30.1.2", + "@jest/types": "30.0.5", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.3.tgz", + "integrity": "sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "jest-worker": "30.1.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.1.2.tgz", + "integrity": "sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.3.tgz", + "integrity": "sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "30.1.2", + "@jest/types": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz", + "integrity": "sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "30.1.3", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.1.2.tgz", + "integrity": "sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.0", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdn/browser-compat-data": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz", + "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@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, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/xmldom": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.34.tgz", + "integrity": "sha512-7eZFfxI9XHYjJJuugddV6N5YNeXgQE1lArWOcd1eCOKWb/FGs5SIjacSYuEJuwhsGS3gy4RuZ5EUIcqYscuPDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": 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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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, + "license": "ISC", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.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, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/ast-metadata-inferer": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz", + "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^5.6.19" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true, + "license": "ISC" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.4.tgz", + "integrity": "sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.1.2.tgz", + "integrity": "sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/transform": "30.1.2", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.0", + "babel-preset-jest": "30.0.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", + "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", + "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", + "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "babel-plugin-jest-hoist": "30.0.1", + "babel-preset-current-node-syntax": "^1.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-searching": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-searching/-/binary-searching-2.0.5.tgz", + "integrity": "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001739", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", + "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "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": ">=18" + } + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", + "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "peer": 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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "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, + "license": "MIT", + "peer": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/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, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.213", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", + "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-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/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-config-erb": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz", + "integrity": "sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jest": "^27.4.0", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "engines": { + "node": ">=16.x.x" + }, + "peerDependencies": { + "eslint": ">=7 || >=8", + "jest": ">=27.0.0", + "react": ">=17.0.0 || >=18.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.10.tgz", + "integrity": "sha512-ciVTEg7sA56wRMR772PyjcBRmyBMLS46xgzQZqt6cWBEKc7cK65ZSSLCTLVRu2gGtKyXUb5stwf4xxLBfERLFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "hasown": "^2.0.2", + "interpret": "^1.4.0", + "is-core-module": "^2.15.1", + "is-regex": "^1.2.0", + "lodash": "^4.17.21", + "resolve": "^2.0.0-next.5", + "semver": "^5.7.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-compat": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", + "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^5.3.13", + "ast-metadata-inferer": "^0.8.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001524", + "find-up": "^5.0.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-compat/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-no-null": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz", + "integrity": "sha512-uRDiz88zCO/2rzGfgG15DBjNsgwWtWiSo4Ezy7zzajUgpnFIqd1TjepKeRmJZHEfBGu58o2a8S0D7vglvvhkVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.0.0" + }, + "peerDependencies": { + "eslint": ">=3.0.0" + } + }, + "node_modules/eslint-plugin-no-type-assertion": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-type-assertion/-/eslint-plugin-no-type-assertion-1.3.0.tgz", + "integrity": "sha512-04wuuIP5ptNzp969tTt0gf/Jsw4G0T5md2/nbgv3dRL/HySSNU7H4vIKNjkuno9T+6h2daj1T9Aki6bDgmXDEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0", + "yarn": "^1.13.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "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.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/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, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.2.tgz", + "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/expect-utils": "30.1.2", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true, + "license": "MIT" + }, + "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-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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, + "license": "ISC", + "peer": 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/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/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, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/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, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "BSD-3-Clause", + "peer": 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-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.1.3.tgz", + "integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "30.1.3", + "@jest/types": "30.0.5", + "import-local": "^3.2.0", + "jest-cli": "30.1.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", + "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.0.5", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.3.tgz", + "integrity": "sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/expect": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.1.0", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-runtime": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "p-limit": "^3.1.0", + "pretty-format": "30.0.5", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.3.tgz", + "integrity": "sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "30.1.3", + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.1.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.3.tgz", + "integrity": "sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.1.3", + "@jest/types": "30.0.5", + "babel-jest": "30.1.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.1.3", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.1.2", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-runner": "30.1.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz", + "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", + "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.1.0.tgz", + "integrity": "sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "jest-util": "30.0.5", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.1.2.tgz", + "integrity": "sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.1.0.tgz", + "integrity": "sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "jest-worker": "30.1.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.1.0.tgz", + "integrity": "sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz", + "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.3.tgz", + "integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz", + "integrity": "sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.3.tgz", + "integrity": "sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "30.1.2", + "@jest/environment": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.1.2", + "jest-haste-map": "30.1.0", + "jest-leak-detector": "30.1.0", + "jest-message-util": "30.1.0", + "jest-resolve": "30.1.3", + "jest-runtime": "30.1.3", + "jest-util": "30.0.5", + "jest-watcher": "30.1.3", + "jest-worker": "30.1.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.3.tgz", + "integrity": "sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/fake-timers": "30.1.2", + "@jest/globals": "30.1.2", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.1.2.tgz", + "integrity": "sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.1.2", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.1.2", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "babel-preset-current-node-syntax": "^1.1.0", + "chalk": "^4.1.2", + "expect": "30.1.2", + "graceful-fs": "^4.2.11", + "jest-diff": "30.1.2", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "pretty-format": "30.0.5", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.1.0.tgz", + "integrity": "sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.0.5", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/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", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.3.tgz", + "integrity": "sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.0.5", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.1.0.tgz", + "integrity": "sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.0.5", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/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", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/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, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "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==", + "dev": true, + "license": "MIT", + "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, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", + "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "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.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-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, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": 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-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-jsdoc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.3.tgz", + "integrity": "sha512-YIxejcbPYK4N58jHGiXjYvrCzBMyvV2AEMSoF5LvqqeMEI0nsmww57I6NGnpVc0AU9ncFCTEBoYHN/xuBf80YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-searching": "^2.0.5", + "comment-parser": "^1.4.0", + "mdast-util-from-markdown": "^2.0.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/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, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "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/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": 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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "peer": 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/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": 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-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/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, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "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/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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/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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/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==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/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, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.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", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", + "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.42.0", + "@typescript-eslint/parser": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.42.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/typescript-eslint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/typescript-eslint/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript-eslint/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript-eslint/node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "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, + "license": "ISC", + "peer": 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/vite": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "peer": 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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "peer": 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/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "MIT", + "peer": 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, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "peer": 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/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "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/package.json b/package.json new file mode 100644 index 0000000..f519876 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "usfm-tools", + "version": "1.0.0", + "description": "Scripts and utilities for transforming and preparing US* schemas for use in Platform.Bible and Paratext", + "scripts": { + "format": "prettier --write .", + "generate-markers-map": "tsx src/generate-markers-map", + "lint": "eslint src/*.ts --cache .", + "bash-generate-3.0.7-map": "npm run generate-markers-map -- --schema src/test-data/usx-3.0.7.rng --version 3.0.7 --repo https://github.com/ubsicap/usx.git --commit 6c490bb5675d281b0fa01876fe67f6e3fd50a4ce --outJSON src/test-data/markers-3.0.7.json > src/test-data/stdout-3.0.7.txt", + "bash-generate-3.1-map": "npm run generate-markers-map -- --schema src/usx-3.1.rng --version 3.1 --repo https://github.com/usfm-bible/tcdocs.git --commit 50f2a6ac3fc1d867d906df28bc00fcff729a7b76 --outJSON src/markers-3.1.json > src/test-data/stdout-3.1.txt", + "bash-generate-test-maps": "npm run bash-generate-3.1-map && npm run bash-generate-3.0.7-map", + "test": "vitest" + }, + "dependencies": { + "@xmldom/xmldom": "^0.8.11", + "commander": "^14.0.0" + }, + "devDependencies": { + "@types/node": "^24.3.0", + "@types/xmldom": "^0.1.34", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0", + "eslint-import-resolver-typescript": "^3.8.3", + "eslint-import-resolver-webpack": "^0.13.10", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-no-type-assertion": "^1.3.0", + "eslint-plugin-promise": "^6.6.0", + "prettier": "^3.5.3", + "prettier-plugin-jsdoc": "^1.3.3", + "tsx": "^4.20.5", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.0", + "vitest": "^3.2.4" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/paranext/usfm-tools.git" + }, + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/paranext/usfm-tools/issues" + }, + "homepage": "https://github.com/paranext/usfm-tools#readme" +} diff --git a/src/command-line.util.ts b/src/command-line.util.ts new file mode 100644 index 0000000..87bfd0b --- /dev/null +++ b/src/command-line.util.ts @@ -0,0 +1,84 @@ +import { exec, ExecOptions } from 'child_process'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { promisify } from 'util'; + +const execAsync = promisify(exec); + +export type CommandOptions = ExecOptions & { + quiet?: boolean; + /** + * Handler for string | Buffer stderr returned from the process after finishing without throwing + * an exception + * + * @param stderr The stderr returned from the process + * @param options The options passed into the `execCommand` that ran the process + */ + stderrHandler?: (stderr: string | Buffer, options: CommandOptions) => void; + /** + * Relative path from the repo root from which to run the command. This does nothing if `cwd` is + * present + */ + pathFromRepoRoot?: string; + /** Prefix to add before the console logs for this command */ + prefix?: string; +}; + +// replace __dirname since it is not available in es modules +/* eslint-disable no-underscore-dangle */ +let { __filename, __dirname } = globalThis; +if (!__dirname) { + __filename = fileURLToPath(import.meta.url); + __dirname = path.dirname(__filename); +} +/* eslint-enable no-underscore-dangle */ + +/** Default implementation of `sterrHandler` in `execCommand` */ +function stderrHandlerDefault(stderr: string | Buffer, options: CommandOptions) { + if (!options.quiet) console.log(`${options.prefix}${stderr}`); +} + +/** + * Executes a command from the repo root directory, logging both the command and the results. + * + * For some reason, it seems multiple processes like git and npm like to use stderr to return things + * that are not errors, so, by default, we only throw if the command throws. To modify this + * functionality, provide a custom `options.stdErrHandler` + * + * @param command + * @param options The options for the exec command. Add quiet to not log anything + */ +export async function execCommand( + command: string, + options: CommandOptions = {} +): Promise>> { + const optionsDefaulted = { + stderrHandler: stderrHandlerDefault, + ...options, + prefix: options.prefix ? `[${options.prefix}] ` : '', + }; + const { quiet, stderrHandler, pathFromRepoRoot, prefix, ...execOptions } = optionsDefaulted; + if (!quiet) console.log(`\n> ${prefix}${command}`); + let result: Awaited>; + try { + result = await execAsync(command, { + cwd: path.resolve(path.join(__dirname, '..', pathFromRepoRoot ?? '')), + ...execOptions, + }); + // This is the type that it has in paranext-multi-extension-template. Not sure why not here + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (e: any) { + throw new Error( + `code ${e.code}!${e.stderr ? `\n${e.stderr}` : ''}${e.stdout ? `\n${e.stdout}` : ''}. Error: ${e}` + ); + } + if (!quiet && result.stdout) console.log(`${prefix}${result.stdout}`); + if (result.stderr) { + if (stderrHandler) stderrHandler(result.stderr, optionsDefaulted); + else + throw new Error( + `${prefix}stderr was present on results returned from process that finished without throwing: ${result.stderr}` + ); + } + return result; +} diff --git a/src/generate-markers-map.ts b/src/generate-markers-map.ts new file mode 100644 index 0000000..81b88a2 --- /dev/null +++ b/src/generate-markers-map.ts @@ -0,0 +1,134 @@ +import { program } from 'commander'; +import fs from 'fs'; +import path from 'path'; +import { MarkersMap } from './markers-map.model.template'; +import { isVersion3_1OrHigher, transformUsxSchemaToMarkersMap } from './markers-map.util'; +import { execCommand } from './command-line.util'; + +(async () => { + try { + // Parse command line arguments + program + .option('--schema ', 'Path to the USX RelaxNG schema file relative to repo root') + .option('--version ', 'Schema version to include in output') + .option('--repo ', 'URL of the git repo the schema file is from to include in output') + .option('--commit ', 'Commit hash the schema file is from to include in output') + .option( + '--outJSON ', + 'Path to the output markers JSON file relative to repo root', + 'dist/markers.json' + ) + .parse(process.argv); + + const options = program.opts(); + + if (!options.schema || !options.version || !options.repo || !options.commit) { + console.error('Error: --schema, --version, --repo, and --commit arguments are required'); + process.exit(1); + } + + const schemaPath = path.resolve(options.schema); + const schemaVersion = options.version; + const repo = options.repo; + const commit = options.commit; + const outJSONPath = path.resolve(options.outJSON); + + // Get the current tag or commit for this repo + let usfmToolsCommit = ''; + const tagCommand = 'git tag --points-at HEAD'; + const tagResult = await execCommand(tagCommand, { quiet: true }); + if (tagResult.stderr) { + console.error( + `Error: '${ + tagCommand + }' returned with stderr ${tagResult.stderr.toString()}. Cannot continue` + ); + process.exit(1); + } + if (tagResult.stdout) usfmToolsCommit = tagResult.stdout.toString(); + else { + const commitCommand = 'git rev-parse HEAD'; + const commitResult = await execCommand(commitCommand, { quiet: true }); + if (commitResult.stderr) { + console.error( + `Error: '${commitCommand}' returned with stderr ${commitResult.stderr.toString()}. Cannot continue` + ); + process.exit(1); + } + if (commitResult.stdout) usfmToolsCommit = commitResult.stdout.toString(); + } + if (!usfmToolsCommit) { + console.log('Somehow we could not get usfmToolsVersion. Cannot continue'); + process.exit(1); + } + usfmToolsCommit = usfmToolsCommit.trim(); + + // Check for working changes + const workingChangesCommand = 'git status --porcelain=v2'; + const workingChangesResult = await execCommand(workingChangesCommand, { quiet: true }); + if (workingChangesResult.stderr) { + console.error( + `Error: '${workingChangesCommand}' returned with stderr ${workingChangesResult.stderr.toString()}. Cannot continue` + ); + process.exit(1); + } + if (workingChangesResult.stdout) { + // If all working changes are inside the `src/test-data` folder, we can ignore + const workingChangesTable = workingChangesResult.stdout + .toString() + .trim() + .split('\n') + .map(workingChangeRowString => workingChangeRowString.split(' ')); + + // The path (always with forward slashes) is at index 8 + if (workingChangesTable.some(row => !row[8].startsWith('src/test-data/'))) + usfmToolsCommit = `${usfmToolsCommit}+`; + } + + // Read and parse the schema file + const schemaContent = fs.readFileSync(schemaPath, 'utf-8'); + + // Get the 3.1 markers map to fill in missing information on the less-than-3.1 maps + const baseMarkersMap: MarkersMap | undefined = isVersion3_1OrHigher(schemaVersion) + ? undefined + : JSON.parse(fs.readFileSync('src/markers-3.1.json', 'utf-8')); + + // Track which definitions are skipped + const skippedDefinitions = new Set(); + + // Generate the markers map + const markersMap: MarkersMap = transformUsxSchemaToMarkersMap( + schemaContent, + schemaVersion, + repo, + commit, + usfmToolsCommit, + skippedDefinitions, + baseMarkersMap + ); + + // Create the dist directory if it doesn't exist + if (!fs.existsSync('dist')) { + fs.mkdirSync('dist'); + } + + // Write the output markers JSON file + fs.writeFileSync(outJSONPath, JSON.stringify(markersMap, undefined, 2), 'utf-8'); + + // Read the markers map model file, replace the placeholder with the generated map, and write it to dist + const markersMapModelPath = path.resolve(__dirname, 'markers-map.model.template.ts'); + const markersMapModelContent = fs.readFileSync(markersMapModelPath, 'utf-8'); + const updatedMarkersMapModelContent = markersMapModelContent.replace( + "JSON.parse('%USFM_MARKERS_MAP_REPLACE_ME%')", + `${JSON.stringify(markersMap, undefined, 2)}` + ); + fs.writeFileSync('dist/markers-map.model.ts', updatedMarkersMapModelContent, 'utf-8'); + + console.log('Generated markers.json successfully'); + console.log('\nSkipped definitions:'); + console.log(Array.from(skippedDefinitions).sort().join('\n')); + } catch (e) { + console.error(`Uncaught error in generate-markers-map async IIFE: ${e}`); + process.exit(1); + } +})(); diff --git a/src/markers-3.1.json b/src/markers-3.1.json new file mode 100644 index 0000000..62b585e --- /dev/null +++ b/src/markers-3.1.json @@ -0,0 +1,1182 @@ +{ + "version": "3.1", + "schemaRepo": "https://github.com/usfm-bible/tcdocs.git", + "schemaCommit": "50f2a6ac3fc1d867d906df28bc00fcff729a7b76", + "markersMapVersion": "1.0.0", + "usfmToolsCommit": "67c8ec557f1657916f04e87329d41aa79dcfde8a+", + "markers": { + "add": { + "type": "char", + "description": "For a translational addition to the text" + }, + "addpn": { + "type": "char", + "description": "For chinese words to be dot underline & underline (DEPRECATED - used nested char@style pn)" + }, + "b": { + "type": "para", + "description": "Poetry text stanza break (e.g. stanza break)" + }, + "bd": { + "type": "char", + "description": "A character style, use bold text" + }, + "bdit": { + "type": "char", + "description": "A character style, use bold + italic text" + }, + "bk": { + "type": "char", + "description": "For the quoted name of a book" + }, + "c": { + "type": "chapter", + "leadingAttributes": [ + "number" + ], + "attributeMarkers": [ + "ca", + "cp" + ] + }, + "ca": { + "type": "char", + "attributeMarkerAttributeName": "altnumber", + "isAttributeMarkerFor": [ + "c" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true + }, + "cat": { + "type": "char", + "attributeMarkerAttributeName": "category", + "isAttributeMarkerFor": [ + "ef", + "efe", + "esb", + "ex", + "f", + "fe", + "x" + ] + }, + "cd": { + "type": "para", + "description": "Chapter Description (Publishing option D, e.g. in Russian Bibles)" + }, + "cl": { + "type": "para", + "description": "Chapter label used for translations that add a word such as \"Chapter\"" + }, + "cls": { + "type": "para", + "description": "Closure of an Epistle" + }, + "cp": { + "type": "para", + "description": "Chapter published style", + "attributeMarkerAttributeName": "pubnumber", + "isAttributeMarkerFor": [ + "c" + ] + }, + "d": { + "type": "para", + "description": "A Hebrew text heading, to provide description (e.g. Psalms)" + }, + "dc": { + "type": "char", + "description": "Deuterocanonical/LXX additions or insertions in the Protocanonical text" + }, + "ef": { + "type": "note", + "description": "Study note", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "efe": { + "type": "note", + "description": "Extended study endnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "efm": { + "type": "char", + "description": "Reference to caller of previous footnote in a study Bible" + }, + "em": { + "type": "char", + "description": "A character style, use emphasized text style" + }, + "esb": { + "type": "sidebar", + "independentClosingMarkers": [ + "esbe" + ], + "attributeMarkers": [ + "cat" + ] + }, + "esbe": { + "type": "sidebar", + "isIndependentClosingMarkerFor": [ + "esb" + ] + }, + "ex": { + "type": "note", + "description": "Extended cross reference", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "f": { + "type": "note", + "description": "Footnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "fdc": { + "type": "char", + "description": "Footnote text, applies to Deuterocanon only (DEPRECATED - use char@style dc)", + "isClosingMarkerOptional": true + }, + "fe": { + "type": "note", + "description": "Endnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "fig": { + "type": "figure" + }, + "fk": { + "type": "char", + "description": "A footnote keyword", + "isClosingMarkerOptional": true + }, + "fl": { + "type": "char", + "description": "A footnote label text item, for marking or \"labelling\" the type or alternate translation being provided in the note.", + "isClosingMarkerOptional": true + }, + "fm": { + "type": "char", + "description": "Reference to caller of previous footnote" + }, + "fp": { + "type": "char", + "description": "A Footnote additional paragraph marker", + "isClosingMarkerOptional": true + }, + "fq": { + "type": "char", + "description": "A footnote scripture quote or alternate rendering", + "isClosingMarkerOptional": true + }, + "fqa": { + "type": "char", + "description": "A footnote alternate rendering for a portion of scripture text", + "isClosingMarkerOptional": true + }, + "fr": { + "type": "char", + "description": "The origin reference for the footnote", + "isClosingMarkerOptional": true + }, + "ft": { + "type": "char", + "description": "Footnote text, Protocanon", + "isClosingMarkerOptional": true + }, + "fv": { + "type": "char", + "description": "A verse number within the footnote text" + }, + "fw": { + "type": "char", + "description": "A footnote witness list, for distinguishing a list of sigla representing witnesses in critical editions.", + "isClosingMarkerOptional": true + }, + "h": { + "type": "para", + "description": "Running header text for a book" + }, + "h1": { + "type": "para", + "description": "Running header text" + }, + "h2": { + "type": "para", + "description": "Running header text, left side of page (DEPRECATED)" + }, + "h3": { + "type": "para", + "description": "Running header text, right side of page (DEPRECATED)" + }, + "ib": { + "type": "para", + "description": "Introduction blank line" + }, + "id": { + "type": "book", + "leadingAttributes": [ + "code" + ] + }, + "ide": { + "type": "para", + "description": "File encoding information (DEPRECATED)" + }, + "ie": { + "type": "para", + "description": "Introduction ending marker" + }, + "iex": { + "type": "para", + "description": "Introduction explanatory or bridge text (e.g. explanation of missing book in Short Old Testament)" + }, + "ili": { + "type": "para", + "description": "A list entry, level 1 (if single level)" + }, + "ili1": { + "type": "para", + "description": "A list entry, level 1 (if multiple levels)" + }, + "ili2": { + "type": "para", + "description": "A list entry, level 2" + }, + "im": { + "type": "para", + "description": "Introduction prose paragraph, with no first line indent (may occur after poetry)" + }, + "imi": { + "type": "para", + "description": "Introduction prose paragraph text, indented, with no first line indent" + }, + "imq": { + "type": "para", + "description": "Introduction prose paragraph, quote from the body text, with no first line indent" + }, + "imt": { + "type": "para", + "description": "Introduction major title, level 1 - (if single level)" + }, + "imt1": { + "type": "para", + "description": "Introduction major title, level 1 (if multiple levels)" + }, + "imt2": { + "type": "para", + "description": "Introduction major title, level 2" + }, + "imt3": { + "type": "para", + "description": "Introduction major title, level 3" + }, + "imt4": { + "type": "para", + "description": "Introduction major title, level 4 (usually within parenthesis)" + }, + "imte": { + "type": "para", + "description": "Introduction major title at introduction end, level 1 (if single level)" + }, + "imte1": { + "type": "para", + "description": "Introduction major title at introduction end, level 1 (if multiple levels)" + }, + "imte2": { + "type": "para", + "description": "Introduction major title at introduction end, level 2" + }, + "io": { + "type": "para", + "description": "Introduction outline text, level 1 (if single level)" + }, + "io1": { + "type": "para", + "description": "Introduction outline text, level 1 (if multiple levels)" + }, + "io2": { + "type": "para", + "description": "Introduction outline text, level 2" + }, + "io3": { + "type": "para", + "description": "Introduction outline text, level 3" + }, + "io4": { + "type": "para", + "description": "Introduction outline text, level 4" + }, + "ior": { + "type": "char" + }, + "iot": { + "type": "para", + "description": "Introduction outline title" + }, + "ip": { + "type": "para", + "description": "Introduction prose paragraph\nDivision or Section introductory paragraph (study Bible)" + }, + "ipi": { + "type": "para", + "description": "Introduction prose paragraph, indented, with first line indent" + }, + "ipq": { + "type": "para", + "description": "Introduction prose paragraph, quote from the body text" + }, + "ipr": { + "type": "para", + "description": "Introduction prose paragraph, right aligned" + }, + "iq": { + "type": "para", + "description": "Introduction poetry text, level 1 (if single level)" + }, + "iq1": { + "type": "para", + "description": "Introduction poetry text, level 1 (if multiple levels)" + }, + "iq2": { + "type": "para", + "description": "Introduction poetry text, level 2" + }, + "iq3": { + "type": "para", + "description": "Introduction poetry text, level 3" + }, + "iqt": { + "type": "char" + }, + "is": { + "type": "para", + "description": "Introduction section heading, level 1 (if single level)" + }, + "is1": { + "type": "para", + "description": "Introduction section heading, level 1 (if multiple levels)" + }, + "is2": { + "type": "para", + "description": "Introduction section heading, level 2" + }, + "it": { + "type": "char", + "description": "A character style, use italic text" + }, + "jmp": { + "type": "char", + "defaultAttribute": "href", + "description": "For associating linking attributes to a span of text" + }, + "k": { + "type": "char", + "defaultAttribute": "key", + "description": "For a keyword" + }, + "k1": { + "type": "para", + "description": "Concordance main entry text or keyword, level 1" + }, + "k2": { + "type": "para", + "description": "Concordance main entry text or keyword, level 2" + }, + "lf": { + "type": "para", + "description": "List footer (introductory remark)" + }, + "lh": { + "type": "para", + "description": "List header (introductory remark)" + }, + "li": { + "type": "para", + "description": "A list entry, level 1 (if single level)" + }, + "li1": { + "type": "para", + "description": "A list entry, level 1 (if multiple levels)" + }, + "li2": { + "type": "para", + "description": "A list entry, level 2" + }, + "li3": { + "type": "para", + "description": "A list entry, level 3" + }, + "li4": { + "type": "para", + "description": "A list entry, level 4" + }, + "lik": { + "type": "char", + "description": "Structured list entry key text" + }, + "lim": { + "type": "para", + "description": "An embedded list entry, level 1 (if single level)" + }, + "lim1": { + "type": "para", + "description": "An embedded list entry, level 1 (if multiple levels)" + }, + "lim2": { + "type": "para", + "description": "An embedded list entry, level 2" + }, + "lim3": { + "type": "para", + "description": "An embedded list entry, level 3" + }, + "lim4": { + "type": "para", + "description": "An embedded list entry, level 4" + }, + "lit": { + "type": "para", + "description": "For a comment or note inserted for liturgical use" + }, + "litl": { + "type": "char", + "description": "List entry total text" + }, + "liv": { + "type": "char", + "description": "Structured list entry value 1 content (if single value)" + }, + "liv1": { + "type": "char", + "description": "Structured list entrt value 1 content (if multiple values)" + }, + "liv2": { + "type": "char", + "description": "Structured list entry value 2 content" + }, + "liv3": { + "type": "char", + "description": "Structured list entry value 3 content" + }, + "liv4": { + "type": "char", + "description": "Structured list entry value 4 content" + }, + "liv5": { + "type": "char", + "description": "Structured list entry value 5 content" + }, + "m": { + "type": "para", + "description": "Paragraph text, with no first line indent (may occur after poetry) aka: Paragraph Continuation" + }, + "mi": { + "type": "para", + "description": "Paragraph text, indented, with no first line indent; often used for discourse" + }, + "mi1": { + "type": "para", + "description": "Paragraph text, level 1 indented, with no first line indent; often used for discourse" + }, + "mi2": { + "type": "para", + "description": "Paragraph text, level 2 indented, with no first line indent; often used for discourse" + }, + "mi3": { + "type": "para", + "description": "Paragraph text, level 3 indented, with no first line indent; often used for discourse" + }, + "mi4": { + "type": "para", + "description": "Paragraph text, level 4 indented, with no first line indent; often used for discourse" + }, + "mr": { + "type": "para", + "description": "A major section division references range heading" + }, + "ms": { + "type": "para", + "description": "A major section division heading, level 1 (if single level)" + }, + "ms1": { + "type": "para", + "description": "A major section division heading, level 1 (if multiple levels)" + }, + "ms2": { + "type": "para", + "description": "A major section division heading, level 2" + }, + "ms3": { + "type": "para", + "description": "A major section division heading, level 3" + }, + "mt": { + "type": "para", + "description": "The main title of the book (if single level)" + }, + "mt1": { + "type": "para", + "description": "The main title of the book (if multiple levels)" + }, + "mt2": { + "type": "para", + "description": "A secondary title usually occurring before the main title" + }, + "mt3": { + "type": "para", + "description": "A tertiary title occurring after the main title" + }, + "mt4": { + "type": "para", + "description": "The main title of the book (if single level)" + }, + "mte": { + "type": "para", + "description": "The main title of the book repeated at the end of the book, level 1 (if single level)" + }, + "mte1": { + "type": "para", + "description": "The main title of the book repeat /ed at the end of the book, level 1 (if multiple levels)" + }, + "mte2": { + "type": "para", + "description": "A secondary title occurring before or after the 'ending' main title" + }, + "nb": { + "type": "para", + "description": "Paragraph text, with no break from previous paragraph text (at chapter boundary)" + }, + "nd": { + "type": "char", + "description": "For name of deity" + }, + "ndx": { + "type": "char", + "description": "A subject index text item" + }, + "no": { + "type": "char", + "description": "A character style, use normal text" + }, + "optbreak": { + "type": "optbreak" + }, + "ord": { + "type": "char", + "description": "For the text portion of an ordinal number" + }, + "p": { + "type": "para", + "description": "Paragraph text, with first line indent" + }, + "p1": { + "type": "para", + "description": "Front or back matter text paragraph, level 1 (if multiple levels)" + }, + "p2": { + "type": "para", + "description": "Front or back matter text paragraph, level 2 (if multiple levels)" + }, + "pb": { + "type": "para", + "description": "Page Break used for new reader portions and children's bibles where content is controlled by the page" + }, + "pc": { + "type": "para", + "description": "Inscription (paragraph text centered)" + }, + "periph": { + "type": "periph", + "textContentAttribute": "alt" + }, + "ph": { + "type": "para", + "description": "Paragraph text, with level 1 hanging indent (if single level) (DEPRECATED - use para@style li#)" + }, + "ph1": { + "type": "para", + "description": "Paragraph text, with level 1 hanging indent (if multiple levels)" + }, + "ph2": { + "type": "para", + "description": "Paragraph text, with level 2 hanging indent" + }, + "ph3": { + "type": "para", + "description": "Paragraph text, with level 3 hanging indent" + }, + "pi": { + "type": "para", + "description": "Paragraph text, level 1 indent (if single level), with first line indent; often used for discourse" + }, + "pi1": { + "type": "para", + "description": "Paragraph text, level 1 indent (if multiple levels), with first line indent; often used for discourse" + }, + "pi2": { + "type": "para", + "description": "Paragraph text, level 2 indent, with first line indent; often used for discourse" + }, + "pi3": { + "type": "para", + "description": "Paragraph text, level 3 indent, with first line indent; often used for discourse" + }, + "pm": { + "type": "para", + "description": "Embedded text paragraph" + }, + "pmc": { + "type": "para", + "description": "Embedded text closing" + }, + "pmo": { + "type": "para", + "description": "Embedded text opening" + }, + "pmr": { + "type": "para", + "description": "Embedded text refrain" + }, + "pn": { + "type": "char", + "description": "For a proper name" + }, + "png": { + "type": "char", + "description": "For a geographic proper name" + }, + "po": { + "type": "para", + "description": "Letter opening" + }, + "pr": { + "type": "para", + "description": "Text refrain (paragraph right-aligned)" + }, + "pro": { + "type": "char", + "description": "For indicating pronunciation in CJK texts (DEPRECATED - used char@style rb)" + }, + "q": { + "type": "para", + "description": "Poetry text, level 1 indent (if single level)" + }, + "q1": { + "type": "para", + "description": "Poetry text, level 1 indent (if multiple levels)" + }, + "q2": { + "type": "para", + "description": "Poetry text, level 2 indent" + }, + "q3": { + "type": "para", + "description": "Poetry text, level 3 indent" + }, + "q4": { + "type": "para", + "description": "Poetry text, level 4 indent" + }, + "qa": { + "type": "para", + "description": "Poetry text, Acrostic marker/heading" + }, + "qac": { + "type": "char", + "description": "Poetry text, Acrostic markup of the first character of a line of acrostic poetry" + }, + "qc": { + "type": "para", + "description": "Poetry text, centered" + }, + "qd": { + "type": "para", + "description": "A Hebrew musical performance annotation, similar in content to Hebrew descriptive title." + }, + "qm": { + "type": "para", + "description": "Poetry text, embedded, level 1 indent (if single level)" + }, + "qm1": { + "type": "para", + "description": "Poetry text, embedded, level 1 indent (if multiple levels)" + }, + "qm2": { + "type": "para", + "description": "Poetry text, embedded, level 2 indent" + }, + "qm3": { + "type": "para", + "description": "Poetry text, embedded, level 3 indent" + }, + "qr": { + "type": "para", + "description": "Poetry text, Right Aligned" + }, + "qs": { + "type": "char", + "description": "Poetry text, Selah" + }, + "qt": { + "type": "char", + "description": "For Old Testament quoted text appearing in the New Testament" + }, + "qt-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt1-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt1-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt2-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt2-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt3-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt3-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt4-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt4-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt5-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt5-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "r": { + "type": "para", + "description": "Parallel reference(s)" + }, + "rb": { + "type": "char", + "defaultAttribute": "gloss" + }, + "ref": { + "type": "ref", + "defaultAttribute": "loc" + }, + "rem": { + "type": "para", + "description": "Remark" + }, + "restore": { + "type": "para", + "description": "Comment about when text was restored" + }, + "rq": { + "type": "char", + "description": "A cross-reference indicating the source text for the preceding quotation." + }, + "s": { + "type": "para", + "description": "A section heading, level 1 (if single level)" + }, + "s1": { + "type": "para", + "description": "A section heading, level 1 (if multiple levels)" + }, + "s2": { + "type": "para", + "description": "A section heading, level 2 (e.g. Proverbs 22-24)" + }, + "s3": { + "type": "para", + "description": "A section heading, level 3 (e.g. Genesis \"The First Day\") (\\s3 can take a \\v!)" + }, + "s4": { + "type": "para", + "description": "A section heading, level 4" + }, + "sc": { + "type": "char", + "description": "A character style, for small capitalization text" + }, + "sd": { + "type": "para", + "description": "Vertical space used to divide the text into sections, level 1 (if single level)" + }, + "sd1": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 1 (if multiple levels)" + }, + "sd2": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 2" + }, + "sd3": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 3" + }, + "sd4": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 4" + }, + "sig": { + "type": "char", + "description": "For the signature of the author of an Epistle" + }, + "sls": { + "type": "char", + "description": "To represent where the original text is in a secondary language or from an alternate text source" + }, + "sp": { + "type": "para", + "description": "A heading, to identify the speaker (e.g. Job)" + }, + "sr": { + "type": "para", + "description": "A section division references range heading" + }, + "sts": { + "type": "para", + "description": "Status\nRemark" + }, + "sup": { + "type": "char", + "description": "A character style, for superscript text. Typically for use in critical edition footnotes." + }, + "t-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "t-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "table": { + "type": "table" + }, + "tl": { + "type": "char", + "description": "For transliterated words" + }, + "toc1": { + "type": "para", + "description": "Long table of contents text" + }, + "toc2": { + "type": "para", + "description": "Short table of contents text" + }, + "toc3": { + "type": "para", + "description": "Book Abbreviation" + }, + "toca1": { + "type": "para", + "description": "Alternative language long table of contents text" + }, + "toca2": { + "type": "para", + "description": "Alternative language short table of contents text" + }, + "toca3": { + "type": "para", + "description": "Alternative language book Abbreviation" + }, + "tr": { + "type": "row" + }, + "ts": { + "type": "ms" + }, + "ts-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "ts-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "usfm": { + "type": "para", + "textContentAttribute": "version", + "parseUsfmInstructions": "If this marker is directly after the first id marker, this marker's version attribute should determine the version attribute of the usx or USJ marker at the top of the USX or USJ document, then this marker should be removed." + }, + "USJ": { + "type": "USJ", + "textContentAttribute": "version", + "markerUsfm": "usfm" + }, + "usx": { + "type": "usx", + "textContentAttribute": "version", + "markerUsfm": "usfm" + }, + "v": { + "type": "verse", + "leadingAttributes": [ + "number" + ], + "attributeMarkers": [ + "va", + "vp" + ] + }, + "va": { + "type": "char", + "attributeMarkerAttributeName": "altnumber", + "isAttributeMarkerFor": [ + "v" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true + }, + "vp": { + "type": "char", + "description": "Published verse marker - this is a verse marking that would be used in the published text", + "attributeMarkerAttributeName": "pubnumber", + "isAttributeMarkerFor": [ + "v" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true + }, + "w": { + "type": "char", + "defaultAttribute": "lemma" + }, + "wa": { + "type": "char", + "description": "An Aramaic wordlist text item" + }, + "wg": { + "type": "char", + "description": "A Greek Wordlist text item" + }, + "wh": { + "type": "char", + "description": "A Hebrew wordlist text item" + }, + "wj": { + "type": "char", + "description": "For marking the words of Jesus" + }, + "x": { + "type": "note", + "description": "Cross reference", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "xdc": { + "type": "char", + "description": "Cross-reference target reference(s), Deuterocanon only (DEPRECATED - use char@style dc)", + "isClosingMarkerOptional": true + }, + "xk": { + "type": "char", + "description": "A cross reference keyword", + "isClosingMarkerOptional": true + }, + "xnt": { + "type": "char", + "description": "Cross-reference target reference(s), New Testament only", + "isClosingMarkerOptional": true + }, + "xo": { + "type": "char", + "description": "The cross reference origin reference", + "isClosingMarkerOptional": true + }, + "xop": { + "type": "char", + "description": "Published cross reference origin text (origin reference that should appear in the published text)", + "isClosingMarkerOptional": true + }, + "xot": { + "type": "char", + "description": "Cross-reference target reference(s), Old Testament only", + "isClosingMarkerOptional": true + }, + "xq": { + "type": "char", + "description": "A cross-reference quotation from the scripture text", + "isClosingMarkerOptional": true + }, + "xt": { + "type": "char", + "defaultAttribute": "href", + "description": "Inline scripture reference formatting.\nThe cross reference target reference(s), protocanon only", + "isClosingMarkerOptional": true + }, + "xta": { + "type": "char", + "description": "Cross reference target references added text", + "isClosingMarkerOptional": true + } + }, + "markersRegExp": { + "t[hc][rc]?\\d+(-\\d+)?": { + "type": "cell" + } + }, + "markerTypes": { + "book": {}, + "cell": { + "skipOutputAttributeToUsfm": [ + "align" + ], + "outputToUsfmInstructions": "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.", + "parseUsfmInstructions": "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).", + "markerTypeUsj": "table:cell" + }, + "chapter": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "sid" + ], + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "eid" + ] + }, + "char": { + "isCloseable": true, + "nestedPrefix": "+" + }, + "figure": { + "isCloseable": true, + "outputToUsfmInstructions": "The USX/USJ file attribute needs its name changed to src in USFM", + "parseUsfmInstructions": "The USFM src attribute needs its name changed to file in USX/USJ" + }, + "ms": { + "isCloseable": true, + "isClosingMarkerEmpty": true + }, + "note": { + "isCloseable": true + }, + "optbreak": { + "hasStyleAttribute": false + }, + "para": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "vid" + ] + }, + "periph": { + "hasNewlineBefore": true, + "hasStyleAttribute": false + }, + "ref": { + "isCloseable": true, + "hasStyleAttribute": false, + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "gen" + ] + }, + "row": { + "hasNewlineBefore": true, + "markerTypeUsj": "table:row" + }, + "sidebar": { + "hasNewlineBefore": true + }, + "table": { + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "vid" + ], + "skipOutputMarkerToUsfm": true + }, + "table:cell": { + "skipOutputAttributeToUsfm": [ + "align" + ], + "outputToUsfmInstructions": "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.", + "parseUsfmInstructions": "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).", + "markerTypeUsj": "table:cell", + "markerTypeUsfm": "cell", + "markerTypeUsx": "cell" + }, + "table:row": { + "hasNewlineBefore": true, + "markerTypeUsj": "table:row", + "markerTypeUsfm": "row", + "markerTypeUsx": "row" + }, + "unmatched": { + "description": "Paratext uses this type for closing markers that it cannot find opening markers for. They are treated like char markers but have no contents, no closing markers, and no space after the marker.", + "outputToUsfmInstructions": "Do not output a structural space after the opening marker for markers with unmatched type.", + "parseUsfmInstructions": "If a closing marker occurs but does not seem to have a matching opening marker, create an unmatched-type marker. There is no structural space after the unmatched-type marker; its end is determined by the asterisk at the end of the marker." + }, + "USJ": { + "hasNewlineBefore": true, + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "noNamespaceSchemaLocation" + ], + "outputToUsfmInstructions": "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM." + }, + "usx": { + "hasNewlineBefore": true, + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "noNamespaceSchemaLocation" + ], + "outputToUsfmInstructions": "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM." + }, + "verse": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "sid" + ], + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "eid" + ] + } + } +} \ No newline at end of file diff --git a/src/markers-map.model.template.ts b/src/markers-map.model.template.ts new file mode 100644 index 0000000..f74afc1 --- /dev/null +++ b/src/markers-map.model.template.ts @@ -0,0 +1,755 @@ +/** + * Information about a USFM marker that is just an attribute in USX/USJ. See {@link MarkerInfo} for + * other kinds of markers. + * + * An attribute marker is a marker that adds information to a previous marker in USFM and is an + * attribute on that previous marker instead in USX/USJ. + * + * @example `ca` and `cp` are attribute markers for `c`. `va` and `vp` are attribute markers for + * `v`. `cat` is an attribute marker for `f`, `esb`, and more. + * + * Following is an example of using the `ca` and `cp` attribute markers in USFM: + * + * ```usfm + * \c 1 \ca 2\ca* + * \cp A + * \s1 This is a section header + * ``` + * + * The equivalent in USX would be: + * + * ```xml + * + * + * This is a section header + * ``` + */ +export type AttributeMarkerInfo = NormalMarkerInfo & { + /** + * List of normal marker names for which this marker is an attribute marker. + * + * @example `ca` and `cp` are attribute markers for `c`. `isAttributeMarkerFor` would be `['c']` + * for both `ca` and `cp`. + */ + isAttributeMarkerFor?: string[]; + /** + * List of RegExp patterns matching marker names for which this marker is an attribute marker. + * + * @example Pretend `ex1` and `ex2` are attribute markers for markers matching RegExp `/test/`. + * `isAttributeMarkerForRegExp` would be `['test']` for both `ex1` and `ex2`. + */ + isAttributeMarkerForRegExp?: string[]; + /** + * The name of the USX/USJ attribute this attribute marker represents. + * + * @example `ca` is an attribute marker for `c` and represents the `altnumber` attribute on the + * `c` marker in USX/USJ. `attributeMarkerAttributeName` would be `altnumber` for the `ca` + * marker. + */ + attributeMarkerAttributeName: string; + /** + * Whether there should be a structural space after the normal closing marker in output USFM if + * this marker is an attribute marker. If this marker is not an attribute marker, it should not + * have a structural space after the normal closing marker. + * + * This field should be ignored if {@link MarkersMap.isSpaceAfterAttributeMarkersContent} is `true` + * because this space is only supposed to be added in contexts in which the space here is + * structural. Otherwise we would be mistakenly adding content to the USFM. + * + * Note that, if {@link MarkersMap.isSpaceAfterAttributeMarkersContent} is `false` (which is the + * case according to spec), horizontal spaces after attribute markers are always considered + * structural; this property only indicates whether there should be a space after the attribute + * marker when outputting USFM as opposed to parsing it. + * + * If not present or `undefined`, defaults to `false`. + * + * @example According to specification, the `va` and `vp` attribute markers have a space after + * their normal closing markers: + * + * ```usfm + * \p \v 10 \va 10 va\va* \vp 10 vp\vp* Some verse text + * ``` + * + * The verse text in this example is just "Some verse text" without a space at the start. + * + * However, when the `vp` marker is not an attribute marker, such as when it has markers in its + * contents, there should not be a structural space after the normal closing marker, and any space + * should be considered content: + * + * ```usfm + * \p \v 10 \va 10 va\va* \vp \+wj 10 vp\+wj*\vp* Some verse text. + * ``` + * + * The verse text in this example is " Some verse text" including a space at the start. + * + * @example The `cat` attribute marker does not have a structural space after its normal closing + * marker: + * + * ```usfm + * \f + \cat category here\cat*\fr 1:2 \ft Some footnote text\f* + * ``` + * + * The verse text in this example is just "Some verse text" without a space at the start. + */ + hasStructuralSpaceAfterCloseAttributeMarker?: boolean; +}; + +/** + * Information about a regular USFM/USX/USJ marker. See {@link MarkerInfo} for other kinds of + * markers. + */ +export type NormalMarkerInfo = { + /** + * Which marker type the marker is. Determines how the marker is structured in the data such as + * what kind of mandatory whitespace is around the marker in USFM. See {@link MarkerTypeInfoBase} + * for information. + */ + type: string; + /** Explanation of the meaning of this marker */ + description?: string; + /** + * Which attribute can be provided without specifying the attribute name in USFM. + * + * A marker can have a default attribute only if it has zero or one non-optional attributes. + * + * An attribute can be provided with default syntax in the USFM only if it is the only attribute + * provided for the marker. + * + * @example A marker with a default attribute: + * + * ```usfm + * \w stuff|thisIsTheLemmaDefaultAttribute\w* + * ``` + * + * @example A marker with multiple attributes (cannot use default attribute syntax): + * + * ```usfm + * \w stuff|lemma="thisIsTheLemma" strong="H1234,G1234"\w* + * ``` + */ + defaultAttribute?: string; + /** + * The name of the text content attribute that is present on this marker if this marker has text + * content in USFM. + * + * Text content attributes are attributes in USX/USJ that are represented in USFM as the actual + * text content of the marker. + * + * @example `alt` is a text content attribute on the `periph` marker. This value would be `alt` + * for the `periph` marker. + * + * Following is an example of a `periph` marker in USFM: + * + * ```usfm + * \periph Example Peripheral|id="x-example" + * \p Some contents of the example peripheral + * ``` + * + * The equivalent in USX would be: + * + * ```xml + * + * + * Some contents of the example peripheral + * + * ``` + */ + textContentAttribute?: string; + /** + * List of leading attributes that must be present on this marker. This list is ordered by the + * order in which the attributes should appear. + * + * Leading attributes are attributes in USJ/USX that are listed in USFM directly after the marker + * and separated only by a space. + * + * @example `code` is a leading attribute on the `id` marker. This value would be `['code']` for + * the `id` marker. + * + * Following is an example of an `id` marker in USFM: + * + * ```usfm + * \id MAT 41MATEX.SFM, Example Translation, September 2025 + * ``` + * + * The equivalent in USX would be: + * + * ```xml + * + * 41MATEX.SFM, Example Translation, September 2025 + * ``` + */ + leadingAttributes?: string[]; + /** + * List of attribute markers that may be present on this marker. This list is ordered by the order + * in which the markers should appear. + * + * An attribute marker is a marker that adds information to a previous marker in USFM and is an + * attribute on that previous marker in USX/USJ. + * + * Note: the attribute names for attribute markers may be different than the marker names. See + * {@link AttributeMarkerInfo.attributeMarkerAttributeName} for more information. + * + * @example `ca` and `cp` are attribute markers for `c`. This value would be `['ca', 'cp']` for + * `c`. + */ + attributeMarkers?: string[]; + /** + * Whether the normal closing marker for this marker is considered optional in USFM, meaning in + * some cases that the normal closing marker would be expected not to be present. + * + * If this marker's type has {@link CloseableMarkerTypeInfo.isCloseable} set to `true`, this marker + * may or may not be expected to have a normal closing marker actually present in USFM depending + * on the value of this property. + * + * - If this is `true`, the normal closing marker for this marker in USFM may be expected to be + * present or absent depending on the value of + * {@link MarkersMap.shouldOptionalClosingMarkersBePresent}. If + * {@link MarkersMap.shouldOptionalClosingMarkersBePresent} is `true`, this marker is expected to + * have the normal closing marker actually present in USFM just like markers for which this + * property is `false`. If {@link MarkersMap.shouldOptionalClosingMarkersBePresent} is `false`, + * this marker is expected not to have the normal closing marker actually present in USFM. The + * `closed` attribute should be present if the presence of a normal closing marker for this + * marker in USFM does not match the presence implied by + * {@link MarkersMap.shouldOptionalClosingMarkersBePresent}. + * - If this is `false`, the normal closing marker for this marker in USFM is expected to always be + * present. If the normal closing marker is absent in USFM, the USX/USJ for this marker should + * have the attribute `closed` set to `false`. + * + * If this marker's type has {@link CloseableMarkerTypeInfo.isCloseable} set to `false`, this + * property is unused; markers of that type do not have a normal closing marker. + * + * If not present or `undefined`, defaults to `false` + */ + isClosingMarkerOptional?: boolean; + /** + * List of independent closing marker names for this marker in USFM if it has any. If this is + * defined, this marker does not have a normal closing marker but rather is closed by a completely + * separate marker in USFM. All contents between this marker and the independent closing marker + * are contents of this marker. In USX and USJ, this marker is closed normally like any other + * object because USX and USJ have clear hierarchical structure. + * + * Note that independent closing markers do not have a `*` at the end because they are not normal + * closing marker for but rather are completely separate markers that close the corresponding + * opening marker. + * + * @example `esb` (a sidebar) is closed by the independent closing marker `esbe`. + * `independentClosingMarkers` would be `['esbe']` for `esb`. Following is an example of a + * sidebar: + * + * ```usfm + * \esb + * \p This paragraph is in a \bd sidebar\bd*. + * \p The sidebar can contain multiple paragraphs. + * \esbe + * ``` + */ + independentClosingMarkers?: string[]; + /** + * List of marker names for which this marker is an independent closing marker. See + * {@link NormalMarkerInfo.independentClosingMarker} for more information on independent closing + * markers and their syntax. + * + * @example `esbe` is an independent closing marker for `esb`. `isIndependentClosingMarkerFor` + * would be `['esb']` for `esbe`. + */ + isIndependentClosingMarkerFor?: string[]; + /** + * List of RegExp patterns matching marker names for which this marker is an independent closing + * marker. See {@link NormalMarkerInfo.independentClosingMarker} for more information on + * independent closing markers and their syntax. + * + * @example Pretend `ex1` and `ex2` are independent closing markers for markers matching RegExp + * `/test/`. `isIndependentClosingMarkerForRegExp` would be `['test']` for both `ex1` and `ex2`. + */ + isIndependentClosingMarkerForRegExp?: string[]; + /** + * Marker to use when operating on the USFM representation of this marker. For example, when + * outputting to USFM, the marker info for the marker listed here in `markerUsfm` should be used + * instead of the marker info for the marker as listed in USX or USJ. + * + * @example When the `usx` marker is output to USFM, it should be transformed to the `usfm` + * marker. + */ + markerUsfm?: string; + /** + * Instructions written in plain text regarding special handling required for this marker when + * transforming from USFM to USX or USJ. These instructions are an explanation of what needs to be + * done to this marker to properly transform it to USX or USJ. + * + * This property is generally only included when it is exceptionally difficult to parse a marker + * properly from USFM; the markers map attempts to use this property as little as possible, + * favoring encoding information in other properties for more automatic transformation instead. + */ + parseUsfmInstructions?: string; +}; + +/** + * Information about a USFM/USX/USJ marker that is essential for proper translation between formats. + * + * @example `w` is a `char`-type marker, so it shares the characteristics of the `char` + * {@link MarkerTypeInfo} with other `char`-type markers and has its own set of characteristics. + * `w`'s `MarkerInfo` is as follows: + * + * ```json + * { + * "type": "char", + * "defaultAttribute": "lemma" + * } + * ``` + */ +export type MarkerInfo = NormalMarkerInfo | AttributeMarkerInfo; + +/** + * Information about a USFM/USX/USJ marker type that has a closing marker. See {@link MarkerTypeInfo} + * for other kinds of marker types. + * + * If the marker type has a closing marker but the closing marker is not present in the USFM for a + * marker with this marker type, the USX/USJ for the marker will have the attribute `closed` set to + * `false` unless {@link NormalMarkerInfo.isClosingMarkerOptional} is `true`. + * + * @example `char` marker types such as `nd` markers have closing markers, but `para` markers such + * as `p` do not: + * + * ```usfm + * \p This is a plain paragraph. + * \p This is a paragraph \nd with some special text\nd* in it. + * ``` + */ +export type CloseableMarkerTypeInfo = MarkerTypeInfoBase & { + /** + * Whether markers of this type can have a normal closing marker in USFM. This property concerns + * normal closing markers like `\wj*`, not independent closing markers like + * {@link NormalMarkerInfo.independentClosingMarkers}, which are completely separate markers. + * + * If this is `true`, markers of this type _may_ have a normal closing marker present in USFM. + * Usually, markers whose type has `isCloseable` set to `true` are expected to have a normal + * closing marker actually present in USFM unless otherwise specified using the `closed` + * attribute. However, some markers are expected _not_ to have a normal closing marker actually + * present in USFM unless otherwise specified using the `closed` attribute. To determine whether a + * specific marker of this type is expected not to have a closing marker present in USFM, see + * {@link NormalMarkerInfo.isClosingMarkerOptional}. + * + * If this is `false`, markers of this type do not have a normal closing marker; there is never + * expected to be a normal closing marker in USFM for markers of this type. In this case, + * {@link NormalMarkerInfo.isClosingMarkerOptional} is unused. + * + * If not present or `undefined`, defaults to `false` (meaning this `MarkerTypeInfo` is a + * {@link NonCloseableMarkerTypeInfo}, not a {@link CloseableMarkerTypeInfo}) + */ + isCloseable: true; + /** + * Whether the closing marker for markers of this type is "empty" in USFM, meaning the marker name + * is absent from the closing marker. This also means that there should not be a structural space + * between the opening and the closing markers in USFM if there are no attributes listed on the + * marker. + * + * If not present or `undefined`, defaults to `false` + * + * @example Markers of type `ms` (such as `qt1-s` and `qt1-e`) have an empty closing marker: + * + * ```usfm + * \qt1-s\* + * ... + * \qt1-e\* + * ``` + * + * The closing marker for `qt1-s` is `\*` as opposed to the closing marker for `nd` which is + * `\nd*`. + * + * Note that there is still a structural space after the opening marker if there are attributes + * present: + * + * ```usfm + * \qt1-s |Someone\* + * ... + * \qt1-e\* + * ``` + */ + isClosingMarkerEmpty?: boolean; +}; + +/** + * Information about a USFM/USX/USJ marker type that does not have a closing marker. See + * {@link MarkerTypeInfo} for other kinds of marker types. + * + * @example `char` marker types such as `nd` markers have closing markers, but `para` marker types + * such as `p` do not: + * + * ```usfm + * \p This is a plain paragraph. + * \p This is a paragraph \nd with some special text\nd* in it. + * ``` + */ +export type NonCloseableMarkerTypeInfo = MarkerTypeInfoBase & { + /** + * Whether markers of this type can have a normal closing marker in USFM. This property concerns + * normal closing markers like `\wj*`, not independent closing markers like + * {@link NormalMarkerInfo.independentClosingMarkers}, which are completely separate markers. + * + * If this is `true`, markers of this type _may_ have a normal closing marker present in USFM. + * Usually, markers whose type has `isCloseable` set to `true` are expected to have a normal + * closing marker actually present in USFM unless otherwise specified using the `closed` + * attribute. However, some markers are expected _not_ to have a normal closing marker actually + * present in USFM unless otherwise specified using the `closed` attribute. To determine whether a + * specific marker of this type is expected not to have a closing marker present in USFM, see + * {@link NormalMarkerInfo.isClosingMarkerOptional}. + * + * If this is `false`, markers of this type do not have a normal closing marker; there is never + * expected to be a normal closing marker in USFM for markers of this type. In this case, + * {@link NormalMarkerInfo.isClosingMarkerOptional} is unused. + * + * If not present or `undefined`, defaults to `false` (meaning this `MarkerTypeInfo` is a + * {@link NonCloseableMarkerTypeInfo}, not a {@link CloseableMarkerTypeInfo}) + */ + isCloseable?: false; +}; + +/** + * Information about a USFM/USX/USJ marker type that is common to all marker types. See + * {@link MarkerTypeInfo} for various kinds of marker types. + */ +export type MarkerTypeInfoBase = { + /** Explanation of the meaning of this marker type */ + description?: string; + /** + * Whether markers of this type should have a `style` attribute in USX/USJ. + * + * If this is `false`, it also means the marker type is the same as the marker name. + * + * If not present or `undefined`, defaults to `true`. + */ + hasStyleAttribute?: boolean; + /** + * List of attributes that should not be output to USFM on markers of this type. + * + * This is used for attributes that are not present in USFM. + * + * This property is not used when converting to USX or USJ. + * + * @example The `sid` attribute on the `verse` type marker is not present in USFM because it is + * derived metadata in USX/USJ and is not present in USFM. + */ + skipOutputAttributeToUsfm?: string[]; + /** + * List of attributes indicating whether to skip outputting this marker to USFM. If any of the + * listed attributes is present on the marker, skip outputting this marker when converting to + * USFM. Only skip outputting the opening and closing marker representations, though; the content + * inside the marker (if present) should not be skipped. + * + * This is used for certain markers that sometimes are normal markers but sometimes are derived + * metadata and are not present in USFM. These derived metadata markers are identified by whether + * they have specific attributes on them. + * + * This property is not used when converting to USX or USJ. + * + * @example If the `verse` marker has an `eid` attribute, it indicates it is a marker denoting the + * end of the verse that is derived metadata in USX/USJ and is not present in USFM. Note that the + * `verse` marker does not have the `style="v"` attribute in this situation, so this list of + * attributes is on the marker type. + * + * Following is an example of a derived metadata `verse` marker in USX: + * + * ```xml + * + * + * This is verse 21. + * + * ``` + * + * The equivalent in USFM would be: + * + * ```usfm + * \p + * \v 21 This is verse 21. + * ``` + * + * @example Generated `ref`s should be skipped but have content inside the marker that should not + * be skipped. These `ref`s wrap project-localized Scripture references in `xt` markers and have + * computer-readable Scripture References as their `loc` attribute. These `ref`s that are derived + * metadata have the `gen` attribute set to `"true"` and can be removed if `gen="true"` is + * present. + * + * Following is an example of a generated `ref` in USX: + * + * ```xml + * + * 2Sam 1:1; 2Sam 1:2-3. + * ``` + * + * The equivalent in USFM would be: + * + * ```usfm + * \xt 2Sam 1:1; 2Sam 1:2-3.\xt* + * ``` + */ + skipOutputMarkerToUsfmIfAttributeIsPresent?: string[]; + /** + * Whether to always skip outputting this marker when converting to USFM. Only skip outputting the + * opening and closing marker representations, though; the content inside the marker (if present) + * should not be skipped. + * + * This is used for marker types that have no representation in USFM in a given version, likely + * meaning they are derived metadata and are not present in USFM. + * + * This property is not used when converting to USX or USJ. + * + * If not present or `undefined`, defaults to `false` + * + * @example In USFM 3.1, the `table` marker type is generated while transforming USFM into USX/USJ + * and is not preserved when transforming from USX/USJ to USFM. + * + * Following is an example of a derived metadata `table` marker in USX: + * + * ```xml + * + * + * + * Header 1 + * Header 2 space after + * Header 3-4 centered + * Header 5 right + * + * + * Row 1 cell 1 + * Row 1 cell 2 space after + * Row 1 cell 3 centered + * Row 1 cell 4-5 right + * + * + * Row 2 cell 1-4 right + * Row 2 cell 5 + * + *
+ * ``` + * + * The equivalent in USFM would be: + * + * ```usfm + * \tr \th1 Header 1\th2 Header 2 space after \thc3-4 Header 3-4 centered\thr5 Header 5 right + * \tr \tc1 Row 1 cell 1\tc2 Row 1 cell 2 space after \thc3 Row 1 cell 3 centered\thr4-5 Row 1 cell 4-5 right + * \tr \tcr1-4 Row 2 cell 1-4 right\tc5 Row 2 cell 5 + * ``` + */ + skipOutputMarkerToUsfm?: boolean; + /** + * Whether markers of this type should have a newline before them in USFM. + * + * Note that the newline is never strictly necessary, and it is not usually present if the very + * first marker in the file (or in examples such as the following example) should have a newline. + * + * If not present or `undefined`, defaults to `false` + * + * @example `para` marker types such as `p` should have a newline, but `char` marker types such as + * `nd` markers should not: + * + * ```usfm + * \p This is a plain paragraph. + * \p This is a paragraph \nd with some special text\nd* in it. + * ``` + */ + hasNewlineBefore?: boolean; + /** + * Marker type to use when operating on the USFM representation of markers of this type. For + * example, when outputting to USFM, the marker type listed here in `markerTypeUsfm` should be + * used instead of the marker's type as listed in USX or USJ. + */ + markerTypeUsfm?: string; + /** + * Marker type to use when operating on the USX representation of markers of this type. For + * example, when outputting to USX, the marker type listed here in `markerTypeUsx` should be used + * instead of the marker's type as listed in USFM or USJ. + */ + markerTypeUsx?: string; + /** + * Marker type to use when operating on the USJ representation of markers of this type. For + * example, when outputting to USJ, the marker type listed here in `markerTypeUsj` should be used + * instead of the marker's type as listed in USFM or USX. + */ + markerTypeUsj?: string; + /** + * Prefix to add to the opening and closing marker before the marker name if a marker of this type + * occurs within another marker of this type when outputting to USFM. + * + * @example In USFM 3.0, `char`-type markers that are nested must have a `+` prefix. Following is + * an example of `nd` inside `wj` (both are `char`-type markers) in USFM: + * + * ```usfm + * \p \wj This is \+nd nested\+nd*!\wj* + * ``` + */ + nestedPrefix?: string; + /** + * Instructions written in plain text regarding special handling required for this marker type + * when transforming to USFM. These instructions are an explanation of what needs to be done to + * markers of this type to properly transform the marker to USFM. + * + * This property is generally only included when it is exceptionally difficult to output a marker + * properly to USFM; the markers map attempts to use this property as little as possible, favoring + * encoding information in other properties for more automatic transformation instead. + */ + outputToUsfmInstructions?: string; + /** + * Instructions written in plain text regarding special handling required for this marker type + * when transforming from USFM to USX or USJ. These instructions are an explanation of what needs + * to be done to markers of this type to properly transform the marker to USX or USJ. + * + * This property is generally only included when it is exceptionally difficult to parse a marker + * properly from USFM; the markers map attempts to use this property as little as possible, + * favoring encoding information in other properties for more automatic transformation instead. + */ + parseUsfmInstructions?: string; +}; + +/** + * Information about a USFM/USX/USJ marker type that is essential for proper translation between + * formats. + * + * @example `char` is a marker type, which means markers like `w` whose marker type is `char` share + * some characteristics, and each marker also has its own set of characteristics which are presented + * with type {@link MarkerInfo}. `char`'s `MarkerTypeInfo` is as follows: + * + * ```json + * { + * "isCloseable": true, + * "nestedPrefix": "+" + * } + * ``` + */ +export type MarkerTypeInfo = CloseableMarkerTypeInfo | NonCloseableMarkerTypeInfo; + +/** A map of all USFM/USX/USJ markers and some information about them */ +export type MarkersMap = { + /** Which version of USFM/USX/USJ this map represents */ + version: string; + /** Which repository this map came from. */ + schemaRepo: string; + /** + * Which commit this map came from. This is necessary because the schema file seems to be + * distributed multiple times in one release version. As such, this specifies the exact version of + * the schema file. + */ + schemaCommit: string; + /** + * Which version of the markers map types this markers map conforms to. Follows [Semantic + * versioning](https://semver.org/); the same major version contains no breaking changes. + */ + markersMapVersion: `1.${number}.${number}${string}`; + /** + * Which tag or commit in the `https://github.com/paranext/usfm-tools` repo this map is generated + * from. + * + * Contains the output from `git tag --points-at HEAD` or `git rev-parse HEAD` + * + * Will also have a `+` at the end if there were working changes outside the `src/test-data` + * folder when this was generated. + */ + usfmToolsCommit: string; + /** + * Whether any whitespace after attribute markers and before the next content is not just + * structural but should actually be considered part of the content of the marker. + * + * Structural whitespace is whitespace in the USFM that is required as part of the USFM syntax and + * usually acts as a delimiter between markers and other things. Content whitespace is whitespace + * in USFM that is part of the actual Scripture text or the "content" of the marker. + * + * According to specification, whitespace after attribute markers is not content but is just + * structural. + * + * According to Paratext 9.4, whitespace after attribute markers is content and is not just + * structural. + * + * This setting determines which interpretation to use when converting from USFM to USX/USJ. + * + * If not present or `undefined`, defaults to `false`. + */ + isSpaceAfterAttributeMarkersContent?: boolean; + /** + * Whether markers with optional closing markers (see + * {@link NormalMarkerInfo.isClosingMarkerOptional}) should still be explicitly closed in USFM. + * That is, whether markers with optional closing markers still need the `closed` attribute set to + * `"false"` in USX/USJ if the closing marker is not present in USFM. + * + * In other words, this setting determines whether markers with optional closing markers should + * still be expected to be explicitly closed (meaning the closing marker is present in USFM) when + * transforming USX/USJ to USFM unless otherwise indicated by the `closed` attribute. + * + * If this is `true` (matches Paratext 9.4), markers with optional closing markers are treated + * like markers whose normal closing marker is not optional in that they are expected to be + * explicitly closed in USFM unless otherwise indicated: + * + * - If they are not explicitly closed in USFM, they should have `closed="false"` + * - If they are explicitly closed in USFM, they do not need `closed="true"` + * + * If this is `false` (matches specification), markers with optional closing markers are expected + * _not_ to be explicitly closed in USFM unless otherwise indicated: + * + * - If they are not explicitly closed in USFM, they do not need `closed="false"` + * - If they are explicitly closed in USFM, they should have `closed="true"` + * + * - Disclaimer: It is not clear that `closed="true"` should be present in this case according to + * `usx.rng`; it seems `usx.rng` indicates that optional closing markers should never be + * output to USFM. It is possible that `usx.rng` considers this to be a case where + * preserving the exact USFM is not important. + * + * If not present or `undefined`, defaults to `false`. + */ + shouldOptionalClosingMarkersBePresent?: boolean; + /** + * Map whose keys are the marker names and whose values are information about that marker + * + * If you find the marker name in this map, you do not need to search the `markersRegExp` map. + */ + markers: Record; + /** + * Map whose keys are string representations of `RegExp` patterns to match against marker names + * (using the + * [test](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) + * function) and whose values are information about that marker + * + * You do not need to search this map if you found the marker name in the `markers` map. + */ + markersRegExp: Record; + /** Map whose keys are the marker types and whose values are information about that marker type */ + markerTypes: Record; +}; + +// This function should safely freeze anything, but TypeScript doesn't understand. +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function deepFreeze(o: any) { + Object.freeze(o); + // Don't want to crash out on null + // eslint-disable-next-line no-null/no-null + if (o === undefined || o === null) { + return o; + } + + Object.getOwnPropertyNames(o).forEach(function freezeProperty(prop) { + if ( + // Need to make sure to avoid null, which is an object type + // eslint-disable-next-line no-null/no-null + o[prop] !== null && + (typeof o[prop] === 'object' || typeof o[prop] === 'function') && + !Object.isFrozen(o[prop]) + ) { + deepFreeze(o[prop]); + } + }); + + return o; +} + +/** + * A map of all USFM/USX/USJ markers and some information about them. Generated from a `usx.rng` + * file + */ +export const USFM_MARKERS_MAP: MarkersMap = deepFreeze(JSON.parse('%USFM_MARKERS_MAP_REPLACE_ME%')); + +/** + * A map of all USFM/USX/USJ markers and some information about them. Generated from a `usx.rng` + * file and adjusted to reflect the way Paratext 9.4 handles USFM. + */ +export const USFM_MARKERS_MAP_PARATEXT: MarkersMap = Object.freeze({ + ...USFM_MARKERS_MAP, + isSpaceAfterAttributeMarkersContent: true, + shouldOptionalClosingMarkersBePresent: true, +}); diff --git a/src/markers-map.util.test.ts b/src/markers-map.util.test.ts new file mode 100644 index 0000000..91b3ffb --- /dev/null +++ b/src/markers-map.util.test.ts @@ -0,0 +1,135 @@ +import fs from 'fs'; +import path from 'path'; +import { afterAll, beforeEach, expect, MockInstance, test, vi } from 'vitest'; +import { MarkersMap } from './markers-map.model.template'; +import { transformUsxSchemaToMarkersMap } from './markers-map.util'; + +// #region set up file path variables + +const dirPath = __dirname ?? import.meta.dirname; +const testDataPath = path.resolve(dirPath, 'test-data'); + +// #endregion set up file path variables + +// #region load test data files + +/** + * Regular expression to extract the console log and skipped definitions from the stdout test data + * files + * + * `(?:>.*\n)+` gets past the npm logs like > npm run generate-markers-map ... + * + * `\n((?:.*\n)+)` captures the console log output + * + * `Skipped definitions:\n` matches the literal text + * + * `((?:.*\n)+)` captures the skipped definitions list + */ +const STDOUT_REGEXP = + /(?:>.*\n)+\n((?:.*\n)+)Generated markers.json successfully\n\nSkipped definitions:\n((?:.*\n)+)/; + +// To generate these test data files: +// 1. Put the desired usx.rng file(s) in src/test-data/ +// 2. Run the generate-markers-map script with the appropriate arguments and redirect stdout to a file +// For example, to generate 3.0.7 and 3.1 files, I used the following commands in bash: +// npm run generate-markers-map -- --schema src/test-data/usx-3.0.7.rng --version 3.0.7 --repo https://github.com/ubsicap/usx.git --commit 6c490bb5675d281b0fa01876fe67f6e3fd50a4ce --outJSON src/test-data/markers-3.0.7.json > src/test-data/stdout-3.0.7.txt +// npm run generate-markers-map -- --schema src/usx-3.1.rng --version 3.1 --repo https://github.com/usfm-bible/tcdocs.git --commit 50f2a6ac3fc1d867d906df28bc00fcff729a7b76 --outJSON src/markers-3.1.json > src/test-data/stdout-3.1.txt +// +// These can be run using `npm run bash-generate-test-maps` +// +// This can be approximated in powershell, but please do not commit this as it puts a BOM at the start of the file that will cause git file churn: +// npm run generate-markers-map -- --schema src/test-data/usx-3.0.7.rng --version 3.0.7 --repo https://github.com/ubsicap/usx.git --commit 6c490bb5675d281b0fa01876fe67f6e3fd50a4ce --outJSON src/test-data/markers-3.0.7.json | out-file -encoding utf8 src/test-data/stdout-3.0.7.txt +// npm run generate-markers-map -- --schema src/usx-3.1.rng --version 3.1 --repo https://github.com/usfm-bible/tcdocs.git --commit 50f2a6ac3fc1d867d906df28bc00fcff729a7b76 --outJSON src/markers-3.1.json | out-file -encoding utf8 src/test-data/stdout-3.1.txt +// +// Note: The 3.1 markers map is used as a base from which to generate older versions, so it is stored in +// src/ instead of src/test-data. usx.rng 3.1 seems to be stable as of writing this, so this file will +// hopefully never need to be updated. It is copied in this repo for convenience. + +const USX_SCHEMA_3_0_7 = fs.readFileSync(path.resolve(testDataPath, 'usx-3.0.7.rng'), 'utf-8'); +const USX_SCHEMA_3_1 = fs.readFileSync(path.resolve(dirPath, 'usx-3.1.rng'), 'utf-8'); + +const USFM_MARKERS_MAP_3_0_7: MarkersMap = JSON.parse( + fs.readFileSync(path.resolve(testDataPath, 'markers-3.0.7.json'), 'utf-8') +); +const USFM_MARKERS_MAP_3_1: MarkersMap = JSON.parse( + fs.readFileSync(path.resolve(dirPath, 'markers-3.1.json'), 'utf-8') +); + +const STDOUT_3_0_7 = fs + .readFileSync(path.resolve(testDataPath, 'stdout-3.0.7.txt'), 'utf-8') + .replace(/\r?\n/g, '\n'); +const STDOUT_3_1 = fs + .readFileSync(path.resolve(testDataPath, 'stdout-3.1.txt'), 'utf-8') + .replace(/\r?\n/g, '\n'); + +const [, CONSOLE_LOG_3_0_7_RAW, SKIPPED_DEFINITIONS_3_0_7_RAW] = STDOUT_3_0_7.match( + STDOUT_REGEXP +) ?? ['', 'FAILED TO MATCH STDOUT_REGEXP', 'FAILED TO MATCH STDOUT_REGEXP']; +const CONSOLE_LOG_3_0_7 = CONSOLE_LOG_3_0_7_RAW.trim().split('\n'); +const SKIPPED_DEFINITIONS_3_0_7 = new Set( + SKIPPED_DEFINITIONS_3_0_7_RAW.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0) +); + +const [, CONSOLE_LOG_3_1_RAW, SKIPPED_DEFINITIONS_3_1_RAW] = STDOUT_3_1.match(STDOUT_REGEXP) ?? [ + '', + 'FAILED TO MATCH STDOUT_REGEXP', + 'FAILED TO MATCH STDOUT_REGEXP', +]; +const CONSOLE_LOG_3_1 = CONSOLE_LOG_3_1_RAW.trim().split('\n'); +const SKIPPED_DEFINITIONS_3_1 = new Set( + SKIPPED_DEFINITIONS_3_1_RAW.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0) +); + +// #endregion load test data files + +// #region tests + +let consoleMock: MockInstance; +beforeEach(() => { + consoleMock = vi.spyOn(console, 'log').mockImplementation(() => { + /* do nothing */ + }); +}); + +afterAll(() => { + consoleMock.mockRestore(); +}); + +test('transformUsxSchemaToMarkersMap properly transform usx.rng 3.0.7', () => { + const skippedDefinitions = new Set(); + const markersMap = transformUsxSchemaToMarkersMap( + USX_SCHEMA_3_0_7, + USFM_MARKERS_MAP_3_0_7.version, + USFM_MARKERS_MAP_3_0_7.schemaRepo, + USFM_MARKERS_MAP_3_0_7.schemaCommit, + USFM_MARKERS_MAP_3_0_7.usfmToolsCommit, + skippedDefinitions, + USFM_MARKERS_MAP_3_1 + ); + + expect(markersMap).toEqual(USFM_MARKERS_MAP_3_0_7); + expect(consoleMock.mock.calls.flat()).toEqual(CONSOLE_LOG_3_0_7); + expect(skippedDefinitions).toEqual(SKIPPED_DEFINITIONS_3_0_7); +}); + +test('transformUsxSchemaToMarkersMap properly transform usx.rng 3.1', () => { + const skippedDefinitions = new Set(); + const markersMap = transformUsxSchemaToMarkersMap( + USX_SCHEMA_3_1, + USFM_MARKERS_MAP_3_1.version, + USFM_MARKERS_MAP_3_1.schemaRepo, + USFM_MARKERS_MAP_3_1.schemaCommit, + USFM_MARKERS_MAP_3_1.usfmToolsCommit, + skippedDefinitions + ); + + expect(markersMap).toEqual(USFM_MARKERS_MAP_3_1); + expect(consoleMock.mock.calls.flat()).toEqual(CONSOLE_LOG_3_1); + expect(skippedDefinitions).toEqual(SKIPPED_DEFINITIONS_3_1); +}); + +// #endregion tests diff --git a/src/markers-map.util.ts b/src/markers-map.util.ts new file mode 100644 index 0000000..5fac421 --- /dev/null +++ b/src/markers-map.util.ts @@ -0,0 +1,2345 @@ +import { DOMParser } from '@xmldom/xmldom'; +import { + AttributeMarkerInfo, + CloseableMarkerTypeInfo, + MarkerInfo, + MarkersMap, + MarkerTypeInfo, +} from './markers-map.model.template'; + +/** Which version of the markers map we are generating */ +const MARKERS_MAP_VERSION = '1.0.0'; + +/** Name of object representing a marker - for use in logging */ +const OBJECT_TYPE_MARKER = 'Marker'; +/** Name of object representing a marker type - for use in logging */ +const OBJECT_TYPE_MARKER_TYPE = 'Marker type'; +/** + * RegExp to match against `usfm:match` or `usf:tag` or `usfm:ptag`'s `beforeout` to see if it has a + * marker. + * + * Matches: + * + * - 0: the whole string + * - 1: `\n` if there is one before the marker; `undefined` otherwise + * - 2: the marker name + * - 3: a space after the marker if there is one; `undefined` otherwise + */ +const BEFORE_OUT_MARKER_NAME_REGEXP = /(\\n)?\\\\(\S+)( ?)/; + +/** XML node types. These are built into the browser, but they are not defined in Node.js */ +enum NODE_TYPE { + /** Node.ELEMENT_NODE */ + ELEMENT = 1, + /** Node.COMMENT_NODE */ + COMMENT = 8, +} + +// #region misc helpful functions + +/** Comparison function for comparing two strings lower case culture invariant */ +function compareStringsInvariantCaseInsensitive(a: string, b: string) { + const aLower = a.toLowerCase(); + const bLower = b.toLowerCase(); + + if (aLower < bLower) return -1; + if (aLower > bLower) return 1; + return 0; +} + +// #endregion misc helpful functions + +// #region XML helper functions + +/** Helper function to get text content of an element */ +function getTextContent(element: ChildNode): string { + return (element.textContent || '').trim(); +} + +/** + * Helper function to get next child element of this element's parent. Almost the exact same as + * `element.nextElementSibling` (which is not available in Node), but this returns `undefined` + * because `null` is dumb + */ +function getNextElementSibling(element: Element): Element | undefined { + const parent = element.parentNode; + + if (!parent) return undefined; + + let foundThisElement = false; + for (let i = 0; i < parent.childNodes.length; i++) { + const sibling = parent.childNodes[i]; + + if (!foundThisElement) { + if (sibling === element) foundThisElement = true; + continue; + } + + // Child is not an element node, so skip + if (sibling.nodeType !== NODE_TYPE.ELEMENT) continue; + + return sibling as Element; + } + + return undefined; +} + +/** + * Helper function to get next child comment-like node of this element's parent. Similar to + * `element.nextSibling`, but this specifically finds an `a:documentation` element or a `Comment` + * node. It also returns `undefined` because `null` is dumb + */ +function getNextCommentSibling(element: Element): ChildNode | undefined { + const parent = element.parentNode; + + if (!parent) return undefined; + + let foundThisElement = false; + for (let i = 0; i < parent.childNodes.length; i++) { + const sibling = parent.childNodes[i]; + + if (!foundThisElement) { + if (sibling === element) foundThisElement = true; + continue; + } + + // Child is not an `a:documentation` node or a `Comment` node, so skip + if (sibling.nodeName !== 'a:documentation' && sibling.nodeType !== NODE_TYPE.COMMENT) continue; + + return sibling; + } + + return undefined; +} + +/** Helper function to get child elements by tag name (not deep search) */ +function getChildElementsByTagName(parent: Element, tagName: string): Element[] { + const elements: Element[] = []; + for (let i = 0; i < parent.childNodes.length; i++) { + // Child is not an element node, so skip + if (parent.childNodes[i].nodeType !== NODE_TYPE.ELEMENT) continue; + + const child = parent.childNodes[i] as Element; + if ( + child.nodeType === NODE_TYPE.ELEMENT && + child.tagName.toLowerCase() === tagName.toLowerCase() + ) { + elements.push(child); + } + } + return elements; +} + +/** + * Helper function to get the first child element with the given tag name (not deep search). + * + * Logs a warning and just returns the first one if there are more than one matching. + */ +function getFirstChildWithTagName(element: Element, tagName: string, defineName: string) { + const nameElements = getChildElementsByTagName(element, tagName); + if (nameElements.length <= 0) return undefined; + + if (nameElements.length > 1) { + console.log( + `Warning: XML Element in definition "${defineName}" has multiple ${tagName} elements but expected one. Using the first one.` + ); + } + + return nameElements[0]; +} + +/** + * Helper function to get an element's name from either its attribute or its direct child name + * element + * + * @param element The element to get the name from + * @param defineName The name of the definition containing the element (for error messages) + * @returns The element name or undefined if not found + */ +function getElementName(element: Element, defineName: string): string | undefined { + let name = element.getAttribute('name') ?? undefined; + if (!name) { + const nameElement = getFirstChildWithTagName(element, 'name', defineName); + if (nameElement) name = getTextContent(nameElement); + } + + return name; +} + +/** Get the associated `define` element for a ref */ +function getDefineElementForRef( + refName: string, + defineElements: Array, + defineName: string +): Element | undefined { + // Find the referenced definition + for (let l = 0; l < defineElements.length; l++) { + const refDefine = defineElements[l]; + if (refDefine.getAttribute('name') !== refName) continue; + + return refDefine; + } + console.log( + `Warning: Could not find referenced definition "${refName}" in definition "${defineName}". Skipping.` + ); + return undefined; +} + +// #endregion XML helper functions + +// #region object merging functions + +/** + * Log an error that something went wrong while merging two objects + * + * @param objectType Type of object e.g. "marker" + * @param objectName Name of object e.g. "esb" + * @param propertyName Name of property that had the conflict e.g. "default attribute" + * @param defineName Name of `define` tag that is the source of this object e.g. "Sidebar" + * @param existingValue Existing property value + * @param newValue New property value that is causing the conflict + */ +function logObjectMergeConflictError( + objectType: string, + objectName: string, + propertyName: string, + defineName: string, + existingValue: unknown, + newValue: unknown +) { + console.error(`Error: ${objectType} named "${objectName}" has conflicting ${propertyName}:`); + console.error(` Existing ${propertyName}: ${JSON.stringify(existingValue)}`); + console.error(` Conflicting ${propertyName}: ${JSON.stringify(newValue)}`); + console.error(` In definition: "${defineName}"`); +} + +/** + * Log a warning while merging two objects that one object had a property and the other did not and + * that the merge will use the present property value + * + * @param objectType Type of object e.g. "marker" + * @param objectName Name of object e.g. "esb" + * @param propertyName Name of property that had the conflict e.g. "default attribute" + * @param defineName Name of `define` tag that is the source of this object e.g. "Sidebar" + * @param existingValue Existing property value + * @param newValue New value for the property + */ +function logObjectUseOnePropertyWarning( + objectType: string, + objectName: string, + propertyName: string, + defineName: string, + existingValue: unknown, + newValue: unknown +) { + console.log( + `Warning: ${objectType} named "${objectName}" has one definition with a ${ + propertyName + } and one without: ${JSON.stringify(existingValue)}, ${JSON.stringify( + newValue + )}. Using the one with the ${propertyName}. In definition: ${defineName}` + ); +} + +/** + * Verify that, of two strings, at most one is defined. + * + * This confirms that the strings can be merged using `{ ...a, ...b }` without conflicts. + * + * @param objectType Type of object e.g. "marker" + * @param objectName Name of object e.g. "esb" + * @param propertyName Name of property that is being merged e.g. "default attribute" + * @param defineName Name of `define` tag that is the source of this object e.g. "Sidebar" + * @param existingString Existing string + * @param newString New string to merge into the existing string + */ +function verifyStringsCanBeMerged( + objectType: string, + objectName: string, + propertyName: string, + defineName: string, + existingString: string | undefined, + newString: string | undefined +) { + if (existingString === newString) return; + + // If both strings are defined but don't match, that's an error + if (existingString && newString) { + logObjectMergeConflictError( + objectType, + objectName, + propertyName, + defineName, + existingString, + newString + ); + process.exit(1); + } + + // One is defined, so just log a warning + logObjectUseOnePropertyWarning( + objectType, + objectName, + propertyName, + defineName, + existingString, + newString + ); +} + +/** + * Merge two strings, deduplicating and concatenating the strings with `\n` between. + * + * @param objectType Type of object e.g. "marker" + * @param objectName Name of object e.g. "esb" + * @param propertyName Name of property that is being merged e.g. "default attribute" + * @param defineName Name of `define` tag that is the source of this object e.g. "Sidebar" + * @param existingString Existing string + * @param newString New string to merge into the existing string + * @param shouldWarn `true` if we should warn if only one string is defined or if both strings are + * defined and get combined + * @returns String consisting of both passed in strings concatenated or `undefined` if there was no + * string passed in + */ +function mergeStrings( + objectType: string, + objectName: string, + propertyName: string, + defineName: string, + existingString: string | undefined, + newString: string | undefined, + shouldWarn = false +) { + // If they're the same (`undefined` or a string), just return it + if (existingString === newString) return existingString; + + // If only one string is defined, just return that + if (!existingString || !newString) { + if (shouldWarn) { + logObjectUseOnePropertyWarning( + objectType, + objectName, + propertyName, + defineName, + existingString, + newString + ); + } + return existingString ?? newString; + } + + // If the new string is one of any in the string split by \n, just return the existing one + if (existingString.split('\n').includes(newString)) return existingString; + + // Both strings are defined but don't match, so concat them + if (shouldWarn) { + console.log( + `Warning: ${objectType} named "${ + objectName + }" has two definitions with different ${propertyName} strings: ${JSON.stringify( + existingString + )}, ${JSON.stringify(newString)}. Concatenating them with \\n between. In definition: ${defineName}` + ); + } + + return `${existingString}\n${newString}`; +} + +/** + * Merge two arrays, combining and deduplicating contents. Returns a new array if the merge changed + * anything; does not modify the original arrays + * + * @param objectType Type of object e.g. "marker" + * @param objectName Name of object e.g. "esb" + * @param propertyName Name of property that is being merged e.g. "default attribute" + * @param defineName Name of `define` tag that is the source of this object e.g. "Sidebar" + * @param existingArray Existing array + * @param newArray New array to merge into the existing array + * @returns Array with merged contents or `undefined` if there was no array + */ +function mergeArrays( + objectType: string, + objectName: string, + propertyName: string, + defineName: string, + existingArray: Array | undefined, + newArray: Array | undefined +) { + // If both are undefined, do nothing + if (!existingArray && !newArray) return undefined; + + // If one is defined, log a warning and use it + if (!existingArray || !newArray) { + logObjectUseOnePropertyWarning( + objectType, + objectName, + propertyName, + defineName, + existingArray, + newArray + ); + return existingArray ?? newArray; + } + // If the arrays are equal, return one + if ( + existingArray.length === newArray.length && + !existingArray.some(attributeA => !newArray.includes(attributeA)) + ) + return existingArray; + + // Both arrays are defined but don't match, so combine them + console.log( + `Warning: ${objectType} named "${ + objectName + }" has two definitions with ${propertyName} arrays of different lengths: ${JSON.stringify( + existingArray + )}, ${JSON.stringify(newArray)}. Combining them. In definition: ${defineName}` + ); + + // Combine the arrays, keeping only unique values + return Array.from(new Set([...existingArray, ...newArray])); +} + +/** + * Verify that two markers with the same name are similar enough that they can merge, then merge + * them + * + * @param markerA Existing marker info + * @param markerB New marker info + * @param markerName Name of marker being compared (for error messages) + * @param defineName Name of definition adding the new marker (for error messages) + * @returns Merged marker info with markerA properties combined with markerB properties + */ +function mergeMarkers( + markerA: MarkerInfo | undefined, + markerB: MarkerInfo, + markerName: string, + defineName: string +) { + // If only one exists, nothing to verify + if (!markerA) return markerB; + + // Both exist, so verify they are compatible + + // Create the merged marker so we can edit the properties without modifying the original markers + const mergedMarker = { ...markerA, ...markerB }; + + // If isClosingMarkerOptional is not `undefined` and is being changed, that's an error + // The data seems too sparse to be able to confidently say if the boolean ever changes, it's + // an error + if ( + markerA.isClosingMarkerOptional !== undefined && + markerA.isClosingMarkerOptional !== markerB.isClosingMarkerOptional + ) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER, + markerName, + 'isClosingMarkerOptional', + defineName, + markerA.isClosingMarkerOptional, + markerB.isClosingMarkerOptional + ); + process.exit(1); + } + + // If types don't match, that's always an error + if (markerA.type !== markerB.type) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER, + markerName, + 'type', + defineName, + markerA.type, + markerB.type + ); + process.exit(1); + } + + // Check defaultAttribute can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerName, + 'defaultAttribute', + defineName, + markerA.defaultAttribute, + markerB.defaultAttribute + ); + + // Check textContentAttribute can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerName, + 'textContentAttribute', + defineName, + markerA.textContentAttribute, + markerB.textContentAttribute + ); + + // Check parseUsfmInstructions can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerName, + 'parseUsfmInstructions', + defineName, + markerA.parseUsfmInstructions, + markerB.parseUsfmInstructions + ); + + // Combine leadingAttributes + const mergedLeadingAttributes = mergeArrays( + OBJECT_TYPE_MARKER, + markerName, + 'leadingAttributes', + defineName, + markerA.leadingAttributes, + markerB.leadingAttributes + ); + if (mergedLeadingAttributes) mergedMarker.leadingAttributes = mergedLeadingAttributes; + + // Combine descriptions + const mergedDescription = mergeStrings( + OBJECT_TYPE_MARKER, + markerName, + 'description', + defineName, + markerA.description, + markerB.description + ); + if (mergedDescription) mergedMarker.description = mergedDescription; + + // Combine attributeMarkers + const mergedAttributeMarkers = mergeArrays( + OBJECT_TYPE_MARKER, + markerName, + 'attributeMarkers', + defineName, + markerA.attributeMarkers, + markerB.attributeMarkers + ); + if (mergedAttributeMarkers) mergedMarker.attributeMarkers = mergedAttributeMarkers; + + // Combine isAttributeMarkerFor + // We will do some merging assuming these properties are here. We always handle if the properties + // are not present, so it is not a problem + const attributeMarkerA = markerA as AttributeMarkerInfo; + const attributeMarkerB = markerB as AttributeMarkerInfo; + const attributeMergedMarker = mergedMarker as AttributeMarkerInfo; + + const mergedIsAttributeMarkerFor = mergeArrays( + OBJECT_TYPE_MARKER, + markerName, + 'isAttributeMarkerFor', + defineName, + attributeMarkerA.isAttributeMarkerFor, + attributeMarkerB.isAttributeMarkerFor + ); + if (mergedIsAttributeMarkerFor) + attributeMergedMarker.isAttributeMarkerFor = mergedIsAttributeMarkerFor; + + const mergedIsAttributeMarkerForRegExp = mergeArrays( + OBJECT_TYPE_MARKER, + markerName, + 'isAttributeMarkerForRegExp', + defineName, + attributeMarkerA.isAttributeMarkerForRegExp, + attributeMarkerB.isAttributeMarkerForRegExp + ); + if (mergedIsAttributeMarkerForRegExp) + attributeMergedMarker.isAttributeMarkerForRegExp = mergedIsAttributeMarkerForRegExp; + + // If hasStructuralSpaceAfterClosingMarker is not `undefined` and is being changed, that's an error + // The data seems too sparse to be able to confidently say if the boolean ever changes, it's + // an error + if ( + attributeMarkerA.hasStructuralSpaceAfterCloseAttributeMarker !== undefined && + attributeMarkerA.hasStructuralSpaceAfterCloseAttributeMarker !== + attributeMarkerB.hasStructuralSpaceAfterCloseAttributeMarker + ) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER_TYPE, + markerName, + 'hasStructuralSpaceAfterCloseAttributeMarker', + defineName, + attributeMarkerA.hasStructuralSpaceAfterCloseAttributeMarker, + attributeMarkerB.hasStructuralSpaceAfterCloseAttributeMarker + ); + process.exit(1); + } + + // Check attributeMarkerAttributeName can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerName, + 'attributeMarkerAttributeName', + defineName, + attributeMarkerA.attributeMarkerAttributeName, + attributeMarkerB.attributeMarkerAttributeName + ); + + // Make sure the requirements for `AttributeMarkerInfo` are met if any `AttributeMarkerInfo` properties + // are present + if ( + (attributeMergedMarker.isAttributeMarkerFor || + attributeMergedMarker.isAttributeMarkerForRegExp) && + !attributeMergedMarker.attributeMarkerAttributeName + ) { + console.log( + `Error: While merging, ${OBJECT_TYPE_MARKER} ${markerName} has isAttributeMarkerFor ${JSON.stringify( + attributeMergedMarker.isAttributeMarkerFor + )} and isAttributeMarkerForRegExp ${ + attributeMergedMarker.isAttributeMarkerForRegExp + } but has no attributeMarkerAttributeName. Must have attributeMarkerAttributeName. Merging in define ${ + defineName + }` + ); + process.exit(1); + } + + return mergedMarker; +} + +/** + * Verify that two marker types with the same name are similar enough that they can merge, then + * merge them + * + * @param markerTypeA Existing marker type info + * @param markerTypeB New marker type info + * @param markerTypeName Name of marker type being compared (for error messages) + * @param defineName Name of definition adding the new marker type (for error messages) + * @returns Merged marker type info with markerTypeA properties combined with markerTypeB properties + */ +function mergeMarkerTypes( + markerTypeA: MarkerTypeInfo | undefined, + markerTypeB: MarkerTypeInfo, + markerTypeName: string, + defineName: string +) { + // If only one exists, nothing to verify + if (!markerTypeA) return markerTypeB; + + // Both exist, so verify they are compatible + + // Create the merged marker type so we can edit the properties without modifying the original marker types + const mergedMarkerType = { ...markerTypeA, ...markerTypeB }; + + // If booleans don't match, that's always an error (note we are assuming not present means `false` + // even though that is not necessarily the case. Assuming the boolean won't be present if it matches + // the default value. We can change this later if needed) + if (markerTypeA.hasStyleAttribute !== markerTypeB.hasStyleAttribute) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'hasStyleAttribute', + defineName, + markerTypeA.hasStyleAttribute, + markerTypeB.hasStyleAttribute + ); + process.exit(1); + } + if (markerTypeA.hasNewlineBefore !== markerTypeB.hasNewlineBefore) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'hasNewlineBefore', + defineName, + markerTypeA.hasNewlineBefore, + markerTypeB.hasNewlineBefore + ); + process.exit(1); + } + if (markerTypeA.isCloseable !== markerTypeB.isCloseable) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'isCloseable', + defineName, + markerTypeA.isCloseable, + markerTypeB.isCloseable + ); + process.exit(1); + } + + // Check outputToUsfmInstructions can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerTypeName, + 'outputToUsfmInstructions', + defineName, + markerTypeA.outputToUsfmInstructions, + markerTypeB.outputToUsfmInstructions + ); + + // Check parseUsfmInstructions can be merged + verifyStringsCanBeMerged( + OBJECT_TYPE_MARKER, + markerTypeName, + 'parseUsfmInstructions', + defineName, + markerTypeA.parseUsfmInstructions, + markerTypeB.parseUsfmInstructions + ); + + // Combine skipOutputAttributeToUsfm + const mergedSkipOutputAttributeToUsfm = mergeArrays( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'skipOutputAttributeToUsfm', + defineName, + markerTypeA.skipOutputAttributeToUsfm, + markerTypeB.skipOutputAttributeToUsfm + ); + if (mergedSkipOutputAttributeToUsfm) + mergedMarkerType.skipOutputAttributeToUsfm = mergedSkipOutputAttributeToUsfm; + + // Combine skipOutputMarkerToUsfmIfAttributeIsPresent + const mergedSkipOutputMarkerToUsfmIfAttributeIsPresent = mergeArrays( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'skipOutputMarkerToUsfmIfAttributeIsPresent', + defineName, + markerTypeA.skipOutputMarkerToUsfmIfAttributeIsPresent, + markerTypeB.skipOutputMarkerToUsfmIfAttributeIsPresent + ); + if (mergedSkipOutputMarkerToUsfmIfAttributeIsPresent) + mergedMarkerType.skipOutputMarkerToUsfmIfAttributeIsPresent = + mergedSkipOutputMarkerToUsfmIfAttributeIsPresent; + + // We will do some merging assuming these properties are here. We always handle if the properties + // are not present, so it is not a problem + const closeableMarkerTypeA = markerTypeA as CloseableMarkerTypeInfo; + const closeableMarkerTypeB = markerTypeB as CloseableMarkerTypeInfo; + + // If booleans don't match, that's always an error (note we are assuming not present means `false` + // even though that is not necessarily the case. Assuming the boolean won't be present if it matches + // the default value. We can change this later if needed) + if (closeableMarkerTypeA.isClosingMarkerEmpty !== closeableMarkerTypeB.isClosingMarkerEmpty) { + logObjectMergeConflictError( + OBJECT_TYPE_MARKER_TYPE, + markerTypeName, + 'isClosingMarkerEmpty', + defineName, + closeableMarkerTypeA.isClosingMarkerEmpty, + closeableMarkerTypeB.isClosingMarkerEmpty + ); + process.exit(1); + } + + return mergedMarkerType; +} + +// #endregion object merging functions + +// #region processing usx.rng data + +/** + * Create a list of all USFM-style (not XML) attributes for the marker an element represents. Also + * gather some information about those attributes. + * + * These attributes are children of the element and attributes found in refs in the element. + * + * The information returned alongside the attributes in this function is only the information about + * attributes that is gathered differently based on if the attribute is a child of the element or if + * the attribute is found through a ref in the element. Plus some derived data that will also be + * used to determine information that is gathered the same way for all attributes. + * + * @param element The XML element that represents the marker being processed + * @param markerType Type of the marker being processed + * @param defineElements The collection of all define elements (for reference lookups) + * @param defineName Name of `define` containing this `element` (for error messages) + * @returns Array of objects containing the attribute and some info about that attribute + */ +function collectAttributesForElement( + element: Element, + markerType: string, + defineElements: Array, + defineName: string +) { + // Make a list of attribute elements to process along with some info we need to determine + // differently based on if the attribute is a child or in a ref + // These attributes are children of the element and attributes found in refs in the element + const elementAttributes: { + /** The `attribute` element in the marker we are analyzing */ + attribute: Element; + /** The name of the attribute we are analyzing */ + // We already got attribute name, so might as well include it + attributeName: string; + /** Whether this attribute is marked as optional */ + // ref may be inside optional, so we determine isOptional differently between the two kinds + isOptional?: boolean; + /** Whether this attribute should be skipped when outputting the marker to USFM */ + // ref may have usfm:ignore on it, so determine skipOutputToUsfm differently between the two + skipOutputToUsfm?: boolean; + }[] = []; + + // ENHANCE: This would best be improved by properly walking through the `attribute` and `ref` tags in + // their encountered order so we can properly determine the order for default attribute, but right now + // we are looking at all `attribute` tags first then `ref` tags after. Luckily, it doesn't matter right + // now for determining default attribute. It very well may never matter as this way of determining + // attribute order is mostly limited to less-than-3.1 (though it is used in a couple places in 3.1+). + + // Look through child attributes of the element + const childAttributes = element.getElementsByTagName('attribute'); + for (let i = 0; i < childAttributes.length; i++) { + const attribute = childAttributes[i]; + + const attributeName = getElementName(attribute, defineName); + if (!attributeName) continue; + + // Make sure this style attribute is a child of this element, not of a nested element + // Also check if attribute is inside an optional element + let isOptional = false; + let parent = attribute.parentNode; + while (parent && parent !== element) { + if (parent.nodeName === 'element') break; // Found the closest parent element, so we're done searching + + if (parent.nodeName === 'optional') isOptional = true; + + parent = parent.parentNode; + } + // If the closest parent element is not the element we are processing, skip this attribute + if (parent !== element) continue; + + elementAttributes.push({ attribute, attributeName, isOptional }); + } + + // Look through direct child refs or refs that are under `optional` tags for attributes + const refs = element.getElementsByTagName('ref'); + for (let j = 0; j < refs.length; j++) { + const ref = refs[j]; + + const refName = ref.getAttribute('name'); + if (!refName) { + console.log( + `Warning: Found ref element without a name attribute in marker type "${markerType}" in definition "${defineName}". Skipping.` + ); + continue; + } + + // Check to make sure this ref is a direct child or a child of an optional of the element or child + // under group. If not, skip it + let isRefOptional = false; + let parent = ref.parentNode; + if (!parent) continue; + if (parent.nodeName === 'optional') { + isRefOptional = true; + parent = parent.parentNode; + if (!parent) continue; + } + if (parent.nodeName === 'group') { + parent = parent.parentNode; + if (!parent) continue; + } + if (parent !== element) continue; + + // If the attribute pointed to by this ref should be ignored when output to usfm, + // indicate so + // ref may have `usfm:ignore="true"` directly on it + const skipOutputToUsfm = ref.getAttribute('usfm:ignore') === 'true'; + + // Get the define element linked from this ref + const refDefine = getDefineElementForRef(refName, defineElements, defineName); + if (refDefine) { + // Find attributes that are direct children or child of an optional of the define + const attributes = refDefine.getElementsByTagName('attribute'); + for (let j = 0; j < attributes.length; j++) { + const attribute = attributes[j]; + + const attributeName = getElementName(attribute, defineName); + if (!attributeName) continue; + + // Skip if not a direct child or child of optional of the define + // Should be optional if it is in an optional or if the ref was optional + let isOptional = isRefOptional; + let parent = attribute.parentNode; + if (!parent) continue; + if (parent.nodeName === 'optional') { + isOptional = true; + parent = parent.parentNode; + if (!parent) continue; + } + if (parent !== refDefine) continue; + + elementAttributes.push({ attribute, attributeName, isOptional, skipOutputToUsfm }); + } + } + } + + // Finish determining the fields with some logic that is the same no matter where the + // attribute comes from + const finalElementAttributes: ((typeof elementAttributes)[number] & { + /** The `usfm:match` elements that are direct children of this `attribute` element */ + usfmMatchElements: Element[]; + })[] = elementAttributes.map(elementAttribute => { + const { attribute, attributeName } = elementAttribute; + // We did some computation on skipOutputToUsfm for when the attribute is through a ref, + // but we need to do more to determine if we should skip outputting this attribute to USFM + // As such, this is just a `let` so we can modify it + let { skipOutputToUsfm } = elementAttribute; + + // Get the `usfm:match` elements because we will do lots with them + const usfmMatchElements = getChildElementsByTagName(attribute, 'usfm:match'); + + // Skip output attribute may have `usfm:ignore="true"` directly on it + if (!skipOutputToUsfm) skipOutputToUsfm = attribute.getAttribute('usfm:ignore') === 'true'; + // Skip output attribute may have child `name` element with `ns` attribute set to XML schema + if (!skipOutputToUsfm) { + const nameElement = getFirstChildWithTagName(attribute, 'name', defineName); + if ( + nameElement && + nameElement.getAttribute('ns') === 'http://www.w3.org/2001/XMLSchema-instance' + ) + skipOutputToUsfm = true; + } + // Skip output attribute name starts with `xsi:` (also indicates it is XML schema-related) + if (!skipOutputToUsfm && attributeName.startsWith('xsi:')) skipOutputToUsfm = true; + + // Special case: some exceptions for skipping output to USFM - I think these are errors in `usx.rng` + // If the errors are fixed, these should be removed + if ((markerType === 'para' || markerType === 'table') && attributeName === 'vid') + skipOutputToUsfm = true; + else if (markerType === 'chapter' && attributeName === 'sid') skipOutputToUsfm = true; + else if (markerType === 'cell' && attributeName === 'align') skipOutputToUsfm = true; + + return { ...elementAttribute, skipOutputToUsfm, usfmMatchElements }; + }); + + return finalElementAttributes; +} + +/** + * Determine if the XML element indicates that the marker type has a newline before it in USFM. + * + * This XML element may be a `style` attribute, an `element` element representing a marker type, or + * a "`usfm:tag`-like" element (`usfm:tag`, `usfm:ptag`, `usfm:match`) + * + * @param element XML element to check + * @param elementType What kind of element this is (for logging) + * @param markerType Which marker type this is (for logging) + * @param defineName Name of `define` containing this XML element (for error messages) + * @returns `true` if the element indicates the marker type has a newline before it in USFM, `false` + * if the element indicates the marker type does not have a newline before it in USFM, and + * `undefined` if the element doesn't have any indication either way. + */ +function determineHasNewlineBeforeForElement( + element: Element, + elementType: string, + markerType: string, + defineName: string +) { + // Special case: cell has `usfm:ptag` though it doesn't have a newline after it. I think this + // is an error in `usx.rng` + // If the error is fixed, this should be removed + if (markerType === 'cell') return false; + // Special case: periph has `usfm:match` though it doesn't have a newline in it. I think this + // is an error in `usx.rng` + // If the error is fixed, this should be removed + if (markerType === 'periph') return true; + // Special case: usx has `usfm:match` though it doesn't have a newline in it. I think this + // is an error in `usx.rng` + // If the error is fixed, this should be removed + if (markerType === 'usx') return true; + + const isElementUsfmTagLike = + element.tagName === 'usfm:tag' || + element.tagName === 'usfm:ptag' || + element.tagName === 'usfm:match'; + const elementUsfmTagLikeElements = isElementUsfmTagLike + ? [element] + : getChildElementsByTagName(element, 'usfm:tag') + .concat(getChildElementsByTagName(element, 'usfm:ptag')) + .concat(getChildElementsByTagName(element, 'usfm:match')); + + if (elementUsfmTagLikeElements.length === 0) return undefined; + + if (elementUsfmTagLikeElements.length > 1) { + console.log( + `Error: ${elementType} for marker type "${ + markerType + }" has more than one usfm:tag or usfm:ptag or usfm:match. This is unexpected; algorithms may need to change. In define ${ + defineName + }` + ); + process.exit(1); + } + + const styleUsfmTagElement = elementUsfmTagLikeElements[0]; + + // has newline before if it is a `usfm:ptag` or `beforeout` has newline in it + return ( + styleUsfmTagElement.tagName === 'usfm:ptag' || + styleUsfmTagElement.getAttribute('beforeout')?.includes('\\n') + ); +} + +/** + * Get the `usfm:endtag` element associated with a marker type `element` if one exists. + * + * @param element Marker type `element` + * @param markerType Which marker type this is (for logging) + * @param defineName Name of `define` containing this XML element (for error messages) + * @returns `usfm:endtag` element for this marker type `element` or `undefined` if one was not found + */ +function getUsfmEndTagForElement(element: Element, markerType: string, defineName: string) { + let usfmEndTagElement: Element | undefined; + const usfmEndTagElements = element.getElementsByTagName('usfm:endtag'); + if (usfmEndTagElements.length > 0) { + // There were at least one `usfm:endtag` elements in the element, so verify we can use the first one + usfmEndTagElement = usfmEndTagElements[0]; + + if (usfmEndTagElements.length > 2) { + console.log( + `Error: Could not determine if marker type should have a closing tag. Marker type "${ + markerType + }" has more than two usfm:endtag elements. In define ${defineName}` + ); + process.exit(1); + } + + if (usfmEndTagElements.length === 2) { + // Determine if the two elements are basically just `\nd` and `\+nd` + // by checking all attributes are the same except `matchref` and the `+` in `before` + const secondEndTagElement = usfmEndTagElements[1]; + + const firstAttributes = Array.from(usfmEndTagElement.attributes); + const secondAttributes = Array.from(secondEndTagElement.attributes); + + if ( + firstAttributes.length !== secondAttributes.length || + firstAttributes.some(firstAttribute => { + const secondAttribute = secondAttributes.find( + secondAttributeToCheck => secondAttributeToCheck.name === firstAttribute.name + ); + // If the second end tag doesn't have this attribute, they don't match + if (!secondAttribute) return true; + + // matchref doesn't have to match, funny enough + if (firstAttribute.name === 'matchref') return false; + + if (firstAttribute.name === 'before') { + // Before should match other than a + in one + return firstAttribute.value.replace('+', '') !== secondAttribute.value.replace('+', ''); + } + + return firstAttribute.value !== secondAttribute.value; + }) + ) { + console.log( + `Error: Could not determine if marker type should have a closing tag. Marker type "${ + markerType + }" has two usfm:endtag elements whose attributes don't match. In define ${defineName}` + ); + process.exit(1); + } + } + } else { + const nextElementSibling = getNextElementSibling(element); + if (nextElementSibling?.tagName === 'usfm:endtag') { + // There are no `usfm:endtag` elements in this element, but the next sibling is one! + usfmEndTagElement = nextElementSibling; + } + } + + return usfmEndTagElement; +} + +/** + * Process a define element to extract marker information + * + * @param defineElement The define element to process + * @param defineElements The collection of all define elements (for reference lookups) + * @param markersMap The markers map to populate + * @param skippedDefinitions Set to populate with names of definitions that were skipped + * @param skipOutputMarkerToUsfmDefineNames Array of names of `define` elements whose marker + * definitions describe markers that should not be exported to USFM (e.g. which attributes + * indicate that the marker should not be exported to USFM) + * @param isVersion3_1OrAbove Whether the `usx.rng` file is from 3.1+. 3.1+ has much more + * information that we can use + */ +function processDefineElement( + defineElement: Element, + defineElements: Array, + markersMap: MarkersMap, + skippedDefinitions: Set, + skipOutputMarkerToUsfmDefineNames: Set, + isVersion3_1OrAbove: boolean +) { + const defineName = defineElement.getAttribute('name'); + if (!defineName) { + console.log('Warning: Found define element without a name attribute. Skipping'); + return; + } + + const skipOutputMarkerToUsfm = skipOutputMarkerToUsfmDefineNames.has(defineName); + + const elements = defineElement.getElementsByTagName('element'); + // Track whether this `define` influenced the markers map so we can record skipped `define`s + let didChangeMarkersMap = false; + + // Process all elements in this definition + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + + // Get the marker type from the element's name + const markerType = getElementName(element, defineName); + + if (!markerType) { + console.log(`Warning: Element in definition "${defineName}" has an empty name. Skipping.`); + continue; + } + + // Compile maps of markers and a type to add for this element so we can set the default attribute if + // we find an element-wide default attribute before adding the markers to the main map + const markersToAdd: Record = {}; + const markersRegExpToAdd: Record = {}; + // There may be independent closing markers for these markers + const independentClosingMarkersToAdd: Record = {}; + // Just modify the existing marker type if this marker just has information about skipping + // it. These markers to skip don't have much information in them + // Need the type assertion here because TypeScript gets ahead of itself otherwise and implies this + // must be a `NonCloseableMarkerTypeInfo` since `isCloseable` is not present + const markerTypeToAdd = ( + skipOutputMarkerToUsfm ? { ...markersMap.markerTypes[markerType] } : {} + ) as MarkerTypeInfo; + + // Look for style attribute to get marker names + let hasStyle = false; + // Try to determine if the marker type should have newline before by looking at the style + // attributes. + let hasNewlineBefore: boolean | undefined = undefined; + const attributes = element.getElementsByTagName('attribute'); + for (let j = 0; j < attributes.length; j++) { + const attribute = attributes[j]; + + // Get the attribute name + const attributeName = getElementName(attribute, defineName); + + // This attribute is not the style attribute + if (!attributeName || attributeName !== 'style') continue; + + // Make sure this style attribute is a child of this element, not of a nested element + let parent = attribute.parentNode; + while (parent && parent !== element) { + // Found the closest parent element, so we're done searching + if (parent.nodeName === 'element') break; + + parent = parent.parentNode; + } + // If the closest parent element is not the element we are processing, skip this attribute + if (parent !== element) continue; + + const styleAttribute = attribute; + hasStyle = true; + + // Determine if there should be a newline before the marker based on the style attribute + const styleHasNewlineBefore = determineHasNewlineBeforeForElement( + attribute, + 'Style attribute', + markerType, + defineName + ); + if (isVersion3_1OrAbove && styleHasNewlineBefore === undefined) + console.log( + `Warning: Style attribute for marker type "${ + markerType + }" has no usfm:tag or usfm:ptag or usfm:match. This is unexpected; algorithms may need to change. In define ${ + defineName + }` + ); + if (styleHasNewlineBefore !== undefined) { + if (hasNewlineBefore !== undefined && hasNewlineBefore !== styleHasNewlineBefore) { + console.log( + `Error: Marker type was found to have multiple style attributes with conflicting hasNewlineBefore. Earlier style hasNewlineBefore: ${ + hasNewlineBefore + }; later style hasNewlineBefore: ${styleHasNewlineBefore}. In define ${defineName}` + ); + process.exit(1); + } + hasNewlineBefore = styleHasNewlineBefore; + } + + // Collect all value elements and param pattern elements under style and under the referenced enums + // Start with value elements under style + const styleValueElements = Array.from(styleAttribute.getElementsByTagName('value')); + // Start with param pattern elements under style + const styleParamPatternElements = Array.from( + styleAttribute.getElementsByTagName('param') + ).filter(param => param.getAttribute('name') === 'pattern'); + + // Add in the value elements under ref elements. Ref elements may be multiple levels deep + + // List of all ref elements we are searching + const styleRefElements = Array.from(styleAttribute.getElementsByTagName('ref')); + let styleRefElementsIndex = 0; + // Process all ref elements, including any new ones we find in referenced definitions + while (styleRefElementsIndex < styleRefElements.length) { + const refName = styleRefElements[styleRefElementsIndex].getAttribute('name'); + styleRefElementsIndex++; + + if (!refName) { + console.log( + `Warning: Found ref element without a name attribute in definition "${defineName}". Skipping.` + ); + continue; + } + + // Find the referenced definition + const refDefine = getDefineElementForRef(refName, defineElements, defineName); + if (refDefine) { + // Found the ref! Get its values and be done + styleValueElements.push(...Array.from(refDefine.getElementsByTagName('value'))); + styleParamPatternElements.push( + ...Array.from(refDefine.getElementsByTagName('param')).filter( + param => param.getAttribute('name') === 'pattern' + ) + ); + // Also add unique new ref elements to the list to process + const newRefElements = Array.from(refDefine.getElementsByTagName('ref')).filter( + newRefElement => + !styleRefElements.some( + styleRefElement => + styleRefElement.getAttribute('name') === newRefElement.getAttribute('name') + ) + ); + styleRefElements.push(...newRefElements); + } + } + + if (styleValueElements.length === 0 && styleParamPatternElements.length === 0) { + console.log( + `Warning: Style attribute in definition "${defineName}" has no value or param pattern elements. Skipping.` + ); + continue; + } + + // Get marker names from value elements in the style attribute + for (let k = 0; k < styleValueElements.length; k++) { + const styleValueElement = styleValueElements[k]; + const markerName = getTextContent(styleValueElement); + if (markerName) { + const markerInfo: MarkerInfo = { type: markerType }; + + // Sometimes, defaultAttribute is specified on the style value element + const defaultAttribute = styleValueElement.getAttribute('usfm:propval'); + if (defaultAttribute) markerInfo.defaultAttribute = defaultAttribute; + + // Sometimes there is documentation right after + const commentNode = getNextCommentSibling(styleValueElement); + if (commentNode) markerInfo.description = getTextContent(commentNode); + + markersToAdd[markerName] = mergeMarkers( + markersToAdd[markerName], + markerInfo, + markerName, + defineName + ); + } + } + + // Get marker names from param pattern elements in the style attribute + for (let k = 0; k < styleParamPatternElements.length; k++) { + const styleParamPatternElement = styleParamPatternElements[k]; + const markerNameRegExp = getTextContent(styleParamPatternElement); + if (markerNameRegExp) { + const markerInfo: MarkerInfo = { type: markerType }; + + // Sometimes, defaultAttribute is specified on the param pattern element + const defaultAttribute = styleParamPatternElement.getAttribute('usfm:propval'); + if (defaultAttribute) { + markerInfo.defaultAttribute = defaultAttribute; + } + + markersRegExpToAdd[markerNameRegExp] = mergeMarkers( + markersRegExpToAdd[markerNameRegExp], + markerInfo, + markerNameRegExp, + defineName + ); + } + } + } + + // Determine if there should be a newline before the marker based on the element + const elementHasNewlineBefore = determineHasNewlineBeforeForElement( + element, + 'Element', + markerType, + defineName + ); + + if (elementHasNewlineBefore !== undefined) { + if (hasNewlineBefore !== undefined && hasNewlineBefore !== elementHasNewlineBefore) { + console.log( + `Error: Marker type "${markerType}" was found to have conflicting hasNewlineBefore. From style hasNewlineBefore: ${ + hasNewlineBefore + }; From element hasNewlineBefore: ${elementHasNewlineBefore}. In define ${defineName}` + ); + process.exit(1); + } + hasNewlineBefore = elementHasNewlineBefore; + } + + // Set hasNewlineBefore on marker type if applicable + if (hasNewlineBefore === undefined) { + // Only 3.1+ has this data, and it's not really expected that skip output markers will have it + if (isVersion3_1OrAbove && !skipOutputMarkerToUsfm) { + console.log( + `Warning: could not determine marker type "${ + markerType + }" hasNewlineBefore. In define ${defineName}.` + ); + } + } else if (hasNewlineBefore) markerTypeToAdd.hasNewlineBefore = true; + + // Determine if the marker type should have a closing tag + // First step is to find an appropriate `usfm:endtag` + const usfmEndTagElement = getUsfmEndTagForElement(element, markerType, defineName); + + // There's an end tag, so mark that on the marker type. Also check the `usfm:endtag` for + // being empty + if (usfmEndTagElement) { + markerTypeToAdd.isCloseable = true; + if (markerTypeToAdd.isCloseable && usfmEndTagElement.getAttribute('matchref') === "''") { + markerTypeToAdd.isClosingMarkerEmpty = true; + } + } + + // Determine if there is an independent closing marker for these markers in the element + const elementUsfmTagElements = getChildElementsByTagName(element, 'usfm:tag').concat( + getChildElementsByTagName(element, 'usfm:ptag') + ); + elementUsfmTagElements.forEach(usfmTagElement => { + const markerName = getTextContent(usfmTagElement); + + // If the usfm:tag or usfm:ptag is empty, it seems to be representing this opening marker and + // will be covered below + if (!markerName) return; + + // Determine if the independent closing marker should have a newline + const additionalMarkerHasNewline = determineHasNewlineBeforeForElement( + usfmTagElement, + `additional marker "${markerName}"`, + markerType, + defineName + ); + + if (additionalMarkerHasNewline !== hasNewlineBefore) { + console.log( + `Error: additional plain marker "${markerName}" in marker type "${ + markerType + }" has different hasNewlineBefore. marker type: ${hasNewlineBefore}; additional marker: ${ + hasNewlineBefore + }. In define ${defineName}` + ); + process.exit(1); + } + + // Just set up a simple marker for now; we will add the connections between this closing marker + // and the new markers from this element later when we have all of them + const markerInfo: MarkerInfo = { type: markerType }; + + independentClosingMarkersToAdd[markerName] = mergeMarkers( + independentClosingMarkersToAdd[markerName], + markerInfo, + markerName, + defineName + ); + }); + + // If the element doesn't have a style attribute and if this `define` indicates the marker + // should not be skipped for USFM, its element name (markerType) represents a marker + if (!hasStyle && !skipOutputMarkerToUsfm) { + const markerName = markerType; + const markerInfo: MarkerInfo = { type: markerType }; + + markersToAdd[markerName] = mergeMarkers( + markersToAdd[markerName], + markerInfo, + markerName, + defineName + ); + + markerTypeToAdd.hasStyleAttribute = false; + } + + const markerNamesToAdd = Object.keys(markersToAdd); + const markerNamesToAddRegExp = Object.keys(markersRegExpToAdd); + const independentClosingMarkerNamesToAdd = Object.keys(independentClosingMarkersToAdd); + const totalNumberOfMarkersAdded = + markerNamesToAdd.length + + markerNamesToAddRegExp.length + + independentClosingMarkerNamesToAdd.length; + + if (!hasStyle && totalNumberOfMarkersAdded > 1) { + console.log( + `Error: Marker type "${ + markerType + }" has no "style" attribute but is trying to create ${totalNumberOfMarkersAdded} markers. This does not make sense because there must be a "style" attribute to distinguish between markers. In define ${ + defineName + }` + ); + process.exit(1); + } + + // Get a list of marker names we are creating before adding attribute markers and such + // If we are creating any new markers, we changed the markers map + const didCreateMarker = totalNumberOfMarkersAdded > 0; + + didChangeMarkersMap = didCreateMarker; + // If this `define` created a marker or may to edit an existing marker type based on the + // attributes, figure out element-level attribute information, then add all collected marker + // info to the main markers map + if (didCreateMarker || skipOutputMarkerToUsfm) { + // Gather all the attributes on the element and some information about them + const elementAttributes = collectAttributesForElement( + element, + markerType, + defineElements, + defineName + ); + + // Process all found attributes and some other info and build up additional marker info + // to put on each marker for this marker type + const extraMarkerInfo: Partial = {}; + + // If there are independent closing markers, add them to the marker info for each marker + if (independentClosingMarkerNamesToAdd.length > 0) { + // Check that we don't have both normal closing marker and independent closing markers because + // we have not necessarily perfectly factored this possibility into the markers map + if (markerTypeToAdd.isCloseable) { + console.log( + `Warn: Marker type "${ + markerType + }" has both a normal closing marker and independent closing markers ${JSON.stringify( + independentClosingMarkerNamesToAdd + )}. This markers map currently does not expect both to be present, so there could be issues; please investigate. In define ${defineName}` + ); + } + + extraMarkerInfo.independentClosingMarkers = independentClosingMarkerNamesToAdd; + } + + // Determine if the end tag is optional for all markers created by this element + if (usfmEndTagElement?.getAttribute('noout') === 'true') + extraMarkerInfo.isClosingMarkerOptional = true; + + // As we look through the attributes, collect attribute markers to add to the markers map + const attributeMarkersToAdd: Record = {}; + + // Track the first non-optional non-skipped attributes so we can get default attribute + let nonOptionalCount = 0; + let firstRequiredNonSkippedAttribute: string | undefined; + let firstOptionalNonSkippedAttribute: string | undefined; + + // Loop through all attributes and determine some characteristics + for (let j = 0; j < elementAttributes.length; j++) { + const { attribute, attributeName, isOptional, skipOutputToUsfm, usfmMatchElements } = + elementAttributes[j]; + + // Determine if we should manually skip this attribute + // Always skip style attribute because it is not like other attributes and should not + // be considered in this area + if (attributeName === 'style') continue; + // Special case: always skip closed attribute for now because it's a really weird + // attribute that we have to do manual things with. Maybe we will handle this better + // in the future + if (attributeName === 'closed') continue; + // Exception case - `colspan` is an attribute that gets incorporated into the marker + // name. But it isn't marked in any special way in `usx.rng`. + if (markerType === 'cell' && attributeName === 'colspan') continue; + + // Put this attribute in the list of marker skip attributes and continue to the next + // attribute if any of the following are true: + // - This `define` is a marker that should not be output to USFM + // - Attribute has `usfm:match` with `noout="true"` + if ( + skipOutputMarkerToUsfm || + usfmMatchElements.some(usfmMatch => usfmMatch.getAttribute('noout') === 'true') + ) { + if (!markerTypeToAdd.skipOutputMarkerToUsfmIfAttributeIsPresent) + markerTypeToAdd.skipOutputMarkerToUsfmIfAttributeIsPresent = []; + markerTypeToAdd.skipOutputMarkerToUsfmIfAttributeIsPresent.push(attributeName); + didChangeMarkersMap = true; + continue; + } + + // If we should skip this attribute, add it to the skipped list on the marker type + if (skipOutputToUsfm) { + if (!markerTypeToAdd.skipOutputAttributeToUsfm) + markerTypeToAdd.skipOutputAttributeToUsfm = []; + markerTypeToAdd.skipOutputAttributeToUsfm.push(attributeName); + } + + // Determine if this attribute is hard-coded into the USFM attributes list and specifically not + // default attribute + let isInAttributesListNotDefault = usfmMatchElements.some(usfmMatchElement => + usfmMatchElement.getAttribute('beforeout')?.includes(`|${attributeName}=`) + ); + + // Special case: in less than 3.1, the `link-__` attributes are first, but they should not be default + // in most cases. There's not enough info for those special cases. Just say they can't be default. + if ( + !isVersion3_1OrAbove && + (attributeName === 'link-href' || + attributeName === 'link-title' || + attributeName === 'link-id') + ) + isInAttributesListNotDefault = true; + + // Determine if this meets the generic conditions to be a special type of attribute + // - Attributes skipped when output to USFM are never special attributes becuase all special + // attributes relate to how the attribute is output to USFM. + // - Attributes hard-coded to be listed in the attributes list are not special attributes either. + // - Special attributes also shouldn't have multiple `usfm:match`, `usfm:tag`, or `usfm:ptag` elements + let canBeSpecialAttributeType = !skipOutputToUsfm && !isInAttributesListNotDefault; + + if (usfmMatchElements.length > 1) { + console.log( + `Warning: Attribute "${attributeName}" on marker type "${ + markerType + }" has multiple usfm:match tags. It will not be considered for special attribute properties like leading attribute. In define ${ + defineName + }` + ); + canBeSpecialAttributeType = false; + } + + const usfmTagElements = getChildElementsByTagName(attribute, 'usfm:tag'); + if (usfmTagElements.length > 1) { + console.log( + `Warning: Attribute "${attributeName}" on marker type "${ + markerType + }" has multiple usfm:tag tags. It will not be considered for special attribute properties like leading attribute. In define ${ + defineName + }` + ); + canBeSpecialAttributeType = false; + } + + const usfmParagraphTagElements = getChildElementsByTagName(attribute, 'usfm:ptag'); + if (usfmParagraphTagElements.length > 1) { + console.log( + `Warning: Attribute "${attributeName}" on marker type "${ + markerType + }" has multiple usfm:ptag tags. It will not be considered for special attribute properties like leading attribute. In define ${ + defineName + }` + ); + canBeSpecialAttributeType = false; + } + + // Determine if the attribute is a special attribute + let isSpecialAttribute = false; + + if (canBeSpecialAttributeType) { + const usfmMatchElement = usfmMatchElements.length > 0 ? usfmMatchElements[0] : undefined; + const usfmTagElement = usfmTagElements.length > 0 ? usfmTagElements[0] : undefined; + const usfmParagraphTagElement = + usfmParagraphTagElements.length > 0 ? usfmParagraphTagElements[0] : undefined; + + // Determine if this is an attribute marker + const matchLikeElements = [usfmMatchElement, usfmTagElement, usfmParagraphTagElement]; + // Test the found match-like elements for if they have a marker in their `beforeout` meaning + // they would print a marker before their contents when outputting to USFM + let isAttributeMarker = false; + matchLikeElements.forEach(matchLikeElement => { + if (!matchLikeElement) return; + + // Special case: `usx` `version` is not an attribute marker even though it looks just like one + if (markerType === 'usx' && attributeName === 'version') return; + + const beforeOutMatches = BEFORE_OUT_MARKER_NAME_REGEXP.exec( + matchLikeElement.getAttribute('beforeout') ?? '' + ); + // Get the marker name out of the `usfm:match`-like element's `beforeout` if it exists + const attributeMarkerName = beforeOutMatches?.[2]; + + if (!attributeMarkerName) return; + + if (isAttributeMarker) { + console.log( + `Warning: found more than one usfm:match-like elements with beforeout with a marker inside in attribute ${ + attributeName + } in define ${defineName}. Ignoring all but the first.` + ); + return; + } + isAttributeMarker = true; + + // If it's a `usfm:ptag`, it is a paragraph marker + let isParagraphMarkerType = matchLikeElement.tagName === 'usfm:ptag'; + if (!isParagraphMarkerType) + // If the `beforeout` has `\n`, it is a paragraph marker + isParagraphMarkerType = !!beforeOutMatches[1]; + + // If the closing tag has a space after it, this is a structural space + const afterOutMatches = BEFORE_OUT_MARKER_NAME_REGEXP.exec( + matchLikeElement.getAttribute('afterout') ?? '' + ); + const hasStructuralSpaceAfterClosingMarker = !!afterOutMatches?.[3]; + + // Create the attribute marker info and set it up to be added to the markers map + const attributeMarkerInfo: MarkerInfo = { + type: isParagraphMarkerType ? 'para' : 'char', + attributeMarkerAttributeName: attributeName, + }; + + if (markerNamesToAdd.length > 0) + attributeMarkerInfo.isAttributeMarkerFor = markerNamesToAdd; + if (markerNamesToAddRegExp.length > 0) + attributeMarkerInfo.isAttributeMarkerForRegExp = markerNamesToAddRegExp; + if (hasStructuralSpaceAfterClosingMarker) + attributeMarkerInfo.hasStructuralSpaceAfterCloseAttributeMarker = + hasStructuralSpaceAfterClosingMarker; + + attributeMarkersToAdd[attributeMarkerName] = mergeMarkers( + attributeMarkersToAdd[attributeMarkerName], + attributeMarkerInfo, + attributeMarkerName, + defineName + ); + + // Add info about this attribute marker to the markers to add + if (!extraMarkerInfo.attributeMarkers) extraMarkerInfo.attributeMarkers = []; + extraMarkerInfo.attributeMarkers.push(attributeMarkerName); + }); + isSpecialAttribute = isAttributeMarker; + + // Determine if this is a text content attribute + if ( + !isSpecialAttribute && + (usfmMatchElement?.getAttribute('match') === 'TEXTNOTATTRIB' || + usfmMatchElement?.getAttribute('match') === 'TEXTNWS' || + (markerType === 'usx' && attributeName === 'version')) + ) { + // If the attribute is specified as matching the text content of the marker, it is a text + // content attribute! Add info about this text content attribute to the markers + extraMarkerInfo.textContentAttribute = attributeName; + isSpecialAttribute = true; + } + + // Determine if this is a leading attribute + if ( + !isSpecialAttribute && + usfmMatchElement && + usfmMatchElement.getAttribute('match') !== 'TEXTNOTATTRIBOPT' + ) { + // The attribute has a `usfm:match` element and is not one of the other special attributes + // and isn't an optional text content attribute (not supported in this script as it is only + // relevant in deprecated Figure USFM 2.0 syntax as of 3.1), so it is a leading attribute! + if (!extraMarkerInfo.leadingAttributes) extraMarkerInfo.leadingAttributes = []; + extraMarkerInfo.leadingAttributes.push(attributeName); + isSpecialAttribute = true; + } + } + + // Determine first required/optional attribute to figure out default attribute + // Don't factor in attributes that: + // - should be skipped when outputting to usfm + // - are specifically not default attributes + // - are special attributes which are never default attributes + if (!skipOutputToUsfm && !isInAttributesListNotDefault && !isSpecialAttribute) { + if (!isOptional) { + nonOptionalCount++; + if (!firstRequiredNonSkippedAttribute) { + firstRequiredNonSkippedAttribute = attributeName; + } + } else if (!firstOptionalNonSkippedAttribute) { + firstOptionalNonSkippedAttribute = attributeName; + } + } + } + + // Figure out default attribute + // Find the first non-optional non-skipped attribute or, if there are no non-optional attributes, + // the first non-skipped attribute to consider to be the default attribute + // If there's exactly one non-optional attribute, use it as the default + if (nonOptionalCount === 1) { + extraMarkerInfo.defaultAttribute = firstRequiredNonSkippedAttribute; + } + // If there are no non-optional attributes, use the first optional attribute + else if (nonOptionalCount === 0 && firstOptionalNonSkippedAttribute) { + extraMarkerInfo.defaultAttribute = firstOptionalNonSkippedAttribute; + } + + // Done collecting additional marker information from attributes. Now, + // Add all collected markers to the main markers map, applying the extra marker info + const updateMarkerInfoDefineName = `${defineName} (merging extraMarkerInfo into marker to add)`; + for (const [markerName, markerInfo] of Object.entries(markersToAdd)) { + // Add extra marker info to each marker we found in the element + const updatedMarkerInfo = + Object.keys(extraMarkerInfo).length > 0 + ? mergeMarkers( + markerInfo, + { ...markerInfo, ...extraMarkerInfo }, + markerName, + updateMarkerInfoDefineName + ) + : markerInfo; + + markersMap.markers[markerName] = mergeMarkers( + markersMap.markers[markerName], + updatedMarkerInfo, + markerName, + defineName + ); + } + + // Add all collected RegExp markers to the main markers map, applying the extra marker info + for (const [markerName, markerInfo] of Object.entries(markersRegExpToAdd)) { + // Add extra marker info to each marker we found in the element + const updatedMarkerInfo = + Object.keys(extraMarkerInfo).length > 0 + ? mergeMarkers( + markerInfo, + { ...markerInfo, ...extraMarkerInfo }, + markerName, + updateMarkerInfoDefineName + ) + : markerInfo; + + markersMap.markersRegExp[markerName] = mergeMarkers( + markersMap.markersRegExp[markerName], + updatedMarkerInfo, + markerName, + defineName + ); + } + + // Add all collected independent closing markers to the main markers map without the extra info + // because it doesn't apply to them + for (const [markerName, markerInfo] of Object.entries(independentClosingMarkersToAdd)) { + const independentClosingMarkerExtraInfo: Partial = {}; + + if (markerNamesToAdd.length > 0) + independentClosingMarkerExtraInfo.isIndependentClosingMarkerFor = markerNamesToAdd; + if (markerNamesToAddRegExp.length > 0) + independentClosingMarkerExtraInfo.isIndependentClosingMarkerForRegExp = + markerNamesToAddRegExp; + + const updatedMarkerInfo = + Object.keys(independentClosingMarkerExtraInfo).length > 0 + ? mergeMarkers( + markerInfo, + { ...markerInfo, ...independentClosingMarkerExtraInfo }, + markerName, + `${defineName} (merging independentClosingMarkerExtraInfo into marker to add)` + ) + : markerInfo; + + markersMap.markers[markerName] = mergeMarkers( + markersMap.markers[markerName], + updatedMarkerInfo, + markerName, + defineName + ); + } + + // Add attribute markers without the extra info because it doesn't apply to them + for (const [markerName, markerInfo] of Object.entries(attributeMarkersToAdd)) { + markersMap.markers[markerName] = mergeMarkers( + markersMap.markers[markerName], + markerInfo, + markerName, + defineName + ); + } + + // Add the marker type to the main markers map + if (!didCreateMarker && skipOutputMarkerToUsfm && !markersMap.markerTypes[markerType]) { + // This isn't necessarily a problem, but it's easier to make sure we don't add any fake marker + // types that don't have real markers associated with them if we assume the modifications to + // existing marker types will always come after those marker types are defined. Can always + // come back and fix this later if we encounter a problem + console.log( + `Error: Tried adding skipOutputMarkerToUsfmIfAttributeIsPresent to marker type "${ + markerType + }" that doesn't already exist! In ${defineName}` + ); + process.exit(1); + } + markersMap.markerTypes[markerType] = mergeMarkerTypes( + markersMap.markerTypes[markerType], + markerTypeToAdd, + markerType, + defineName + ); + } + } + + // If this definition didn't create any markers, add it to skipped + if (!didChangeMarkersMap) { + skippedDefinitions.add(defineName); + } +} + +// #endregion processing usx.rng data + +/** + * Determine if the version provided is 3.1 or higher. This is important for many reasons: + * + * - 3.1 and up is generated pretty much completely separately from less than 3.1, so they have many + * differences in common with other versions in the same group + * - Both groups have separate problems, things missing, etc. that need to be adjusted + * - Both groups have some slight differences in how to handle them + * - 3.1 and up has a lot more necessary information than less than 3.1, so less than 3.1 needs to + * build on a base generated from 3.1 or higher + * + * @param version Which `usx.rng` version this markers map is generated from + * @returns `true` if 3.1 or higher; `false` otherwise + */ +export function isVersion3_1OrHigher(version: string): boolean { + return version >= '3.1' && version !== 'master'; +} + +/** + * Transform a USX RelaxNG schema into a markers map + * + * @param usxSchema USX RelaxNG schema + * @param version Which USX version this schema represents + * @param repo Repo where the USX schema file is from + * @param commit Hash of the commit at which the USX schema file was retrieved in the specified repo + * @param usfmToolsCommit Git tag or hash of the commit at which the markers map is being generated + * in this usfm-tools repo + * @param skippedDefinitions Optional set to populate with names of definitions that did not result + * in adding any markers to the map. This Set is transformed in place and is not returned + * @param baseMarkersMap Optional map to use to fill in missing marker information on the maps that + * are version less than 3.1. The `usx.rng` files below 3.1 do not have some necessary + * information. + * @returns The generated markers map + */ +export function transformUsxSchemaToMarkersMap( + usxSchema: string, + version: string, + repo: string, + commit: string, + usfmToolsCommit: string, + skippedDefinitions: Set = new Set(), + baseMarkersMap?: MarkersMap +): MarkersMap { + const parser = new DOMParser(); + const doc = parser.parseFromString(usxSchema, 'text/xml'); + + const markersMap: MarkersMap = { + version, + schemaRepo: repo, + schemaCommit: commit, + markersMapVersion: MARKERS_MAP_VERSION, + usfmToolsCommit: usfmToolsCommit, + markers: {}, + markersRegExp: {}, + markerTypes: {}, + }; + + // Get all define elements + const defineElements = Array.from(doc.getElementsByTagName('define')); + + // Determine which definitions should be skipped entirely (if all `ref`s pointing to it are + // only pointing via `usfm:alt`) + const refElements = doc.getElementsByTagName('ref'); + // Set of define names that are referred to in `ref` `name` + const referredDefines = new Set(); + // Set of define names that are referred to in `ref` `usfm:alt` + const referredAltDefines = new Set(); + // Set of define names that have `usfm:ignore` on all `ref`s pointing to them + const referredIgnoreDefines = new Set(); + // Set of define names that do not have `usfm:ignore` on at least one `ref` pointing to them + const referredNonIgnoreDefines = new Set(); + for (let i = 0; i < refElements.length; i++) { + const refElement = refElements[i]; + const referredName = refElement.getAttribute('name'); + if (referredName) referredDefines.add(referredName); + + const referredAltName = refElement.getAttribute('usfm:alt'); + if (referredAltName) referredAltDefines.add(referredAltName); + + // if this ref is ignored, add it to the ignored defines if it hasn't already been added + // to the non-ignored defines + const ignored = refElement.getAttribute('usfm:ignore') === 'true'; + + // Let's assume usfm:ignore only applies to `name` because it makes no sense to be ignored alt + if (ignored && referredAltName) { + console.log( + `Error: Found a ref tag with both usfm:alt ${ + referredAltName + } and usfm:ignore true. name ${referredName}. Doesn't make sense` + ); + process.exit(1); + } + + if (referredName) { + if (ignored) { + if (!referredNonIgnoreDefines.has(referredName)) referredIgnoreDefines.add(referredName); + else referredIgnoreDefines.delete(referredName); + } else { + // This ref is not ignored. Record that it is not *always* ignored in every ref + referredNonIgnoreDefines.add(referredName); + referredIgnoreDefines.delete(referredName); + } + } + } + // Filter out all the `usfm:alt` referrals that are also referred to by `name` + const referredDefinesAltOnly = Array.from(referredAltDefines).filter( + referredNameAlt => !referredDefines.has(referredNameAlt) + ); + // Remove all `usfm:alt`-only defines from consideration + referredDefinesAltOnly.forEach(referredAltName => { + const referredDefineElementIndex = defineElements.findIndex( + defineElement => defineElement.getAttribute('name') === referredAltName + ); + if (referredDefineElementIndex < 0) { + console.log( + `Could not find define element with name ${ + referredAltName + } to remove it from the list of define elements to consider.` + ); + return; + } + skippedDefinitions.add(referredAltName); + defineElements.splice(referredDefineElementIndex, 1); + }); + + const isVersion3_1OrAbove = isVersion3_1OrHigher(version); + // Special case: set some specific exceptions for 3.0.x because it doesn't have some info present in 3.1 + if (!isVersion3_1OrAbove) { + referredIgnoreDefines.add('ChapterEnd'); + referredIgnoreDefines.add('VerseEnd'); + } + + // Process all define elements + for (let i = 0; i < defineElements.length; i++) { + processDefineElement( + defineElements[i], + defineElements, + markersMap, + skippedDefinitions, + referredIgnoreDefines, + isVersion3_1OrAbove + ); + } + + // Special case: Fill in some stuff that isn't quite right in the schema: + // - Add the required markers that might not be in the schema + // - Add some one-off instructions for outputting to USFM in a particularly challenging way + // - Add some extra information to some existing markers + const manualDefineName = 'added manually'; + // Create `usfm` marker based on `usx` marker but with some differences + markersMap.markers['usfm'] = mergeMarkers( + markersMap.markers['usfm'], + { + ...markersMap.markers['usx'], + type: 'para', + parseUsfmInstructions: + "If this marker is directly after the first id marker, this marker's version attribute should determine the version attribute of the usx or USJ marker at the top of the USX or USJ document, then this marker should be removed.", + }, + 'usfm', + manualDefineName + ); + const usxAndUsjOutputInstructions = + "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM."; + // Add output instructions to `usx` marker type + markersMap.markerTypes['usx'] = mergeMarkerTypes( + markersMap.markerTypes['usx'], + { + // Add the existing properties of usx marker type so we don't have conflicts merging types + ...markersMap.markerTypes['usx'], + outputToUsfmInstructions: usxAndUsjOutputInstructions, + }, + 'usx', + manualDefineName + ); + // Add usfm output marker name to usx marker + markersMap.markers['usx'] = mergeMarkers( + markersMap.markers['usx'], + { + // Need type so it passes TypeScript type checking + type: 'usx', + markerUsfm: 'usfm', + }, + 'usx', + manualDefineName + ); + // Create USJ marker based on usx marker + markersMap.markers['USJ'] = mergeMarkers( + markersMap.markers['USJ'], + { ...markersMap.markers['usx'], type: 'USJ' }, + 'USJ', + manualDefineName + ); + // Create USJ marker type based on usx marker type + markersMap.markerTypes['USJ'] = mergeMarkerTypes( + markersMap.markerTypes['USJ'], + { ...markersMap.markerTypes['usx'], outputToUsfmInstructions: usxAndUsjOutputInstructions }, + 'USJ', + manualDefineName + ); + // Create unmatched marker type to handle Paratext output with unmatched closing markers + // Putting this in both spec and Paratext markers maps because spec seems to be silent regarding what + // to do about unknown markers, and this is enough of a known case that it seems reasonable to preserve + // it anyway. The markers map is not for validating USJ/USFM but rather for translating it, so this + // seems reasonable enough to do. + markersMap.markerTypes['unmatched'] = mergeMarkerTypes( + markersMap.markerTypes['unmatched'], + { + description: + 'Paratext uses this type for closing markers that it cannot find opening markers for. They are treated like char markers but have no contents, no closing markers, and no space after the marker.', + outputToUsfmInstructions: + 'Do not output a structural space after the opening marker for markers with unmatched type.', + parseUsfmInstructions: + 'If a closing marker occurs but does not seem to have a matching opening marker, create an unmatched-type marker. There is no structural space after the unmatched-type marker; its end is determined by the asterisk at the end of the marker.', + }, + 'unmatched', + manualDefineName + ); + // Add parse/output instructions to cell + markersMap.markerTypes['cell'] = mergeMarkerTypes( + markersMap.markerTypes['cell'], + { + outputToUsfmInstructions: + "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.", + parseUsfmInstructions: + "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).", + }, + 'cell', + manualDefineName + ); + // Set up the USJ marker type names for table content marker types row and cell + const rowTypeNoAlternateTypes = { ...markersMap.markerTypes['row'] }; + const rowUsjType = 'table:row'; + markersMap.markerTypes['row'] = mergeMarkerTypes( + markersMap.markerTypes['row'], + { + // Add the existing properties of row marker type so we don't have conflicts merging types + ...markersMap.markerTypes['row'], + markerTypeUsj: rowUsjType, + }, + 'row', + manualDefineName + ); + markersMap.markerTypes[rowUsjType] = mergeMarkerTypes( + rowTypeNoAlternateTypes, + { + // Add the existing properties of row marker type so we don't have conflicts merging types + ...markersMap.markerTypes['row'], + markerTypeUsfm: 'row', + markerTypeUsx: 'row', + }, + rowUsjType, + manualDefineName + ); + const cellTypeNoAlternateTypes = { ...markersMap.markerTypes['cell'] }; + const cellUsjType = 'table:cell'; + markersMap.markerTypes['cell'] = mergeMarkerTypes( + markersMap.markerTypes['cell'], + { + // Add the existing properties of cell marker type so we don't have conflicts merging types + ...markersMap.markerTypes['cell'], + markerTypeUsj: cellUsjType, + }, + 'cell', + manualDefineName + ); + markersMap.markerTypes[cellUsjType] = mergeMarkerTypes( + cellTypeNoAlternateTypes, + { + // Add the existing properties of cell marker type so we don't have conflicts merging types + ...markersMap.markerTypes['cell'], + markerTypeUsfm: 'cell', + markerTypeUsx: 'cell', + }, + cellUsjType, + manualDefineName + ); + // Add the nested prefix + to char marker. This is technically in `usx.rng` 3.1+, but it's quite + // strange and probably not worth deriving as we are phasing nested prefixes out anyway. + markersMap.markerTypes['char'] = mergeMarkerTypes( + markersMap.markerTypes['char'], + { + // Add the existing properties of char marker type so we don't have conflicts merging types + ...markersMap.markerTypes['char'], + nestedPrefix: '+', + }, + 'char', + manualDefineName + ); + // Add instructions for converting figure attribute between USFM src and USX/USJ file + markersMap.markerTypes['figure'] = mergeMarkerTypes( + markersMap.markerTypes['figure'], + { + // Add the existing properties of figure marker type so we don't have conflicts merging types + ...markersMap.markerTypes['figure'], + outputToUsfmInstructions: 'The USX/USJ file attribute needs its name changed to src in USFM', + parseUsfmInstructions: 'The USFM src attribute needs its name changed to file in USX/USJ', + }, + 'figure', + manualDefineName + ); + // Indicate table-type markers should be removed outputting to USFM. Probably would be best for + // `usx.rng` to have something indicating this because this may not be the case in v3.2 or v4. + // See https://github.com/usfm-bible/tcdocs/blob/main/proposals/2025/U25003%20Lists%20and%20Tables.md + markersMap.markerTypes['table'] = mergeMarkerTypes( + markersMap.markerTypes['table'], + { + // Add the existing properties of table marker type so we don't have conflicts merging types + ...markersMap.markerTypes['table'], + skipOutputMarkerToUsfm: true, + }, + 'table', + manualDefineName + ); + + // Special case: Fix some inaccuracies in less than 3.1 + if (!isVersion3_1OrAbove) { + // periph does not have a default attribute. `id` looks like it is default, but it always uses + // non-default syntax for some reason + if (markersMap.markers['periph']?.defaultAttribute === 'id') + delete markersMap.markers['periph'].defaultAttribute; + + // `ts` seems to be misidentified as `para`, but it is a milestone + if (markersMap.markers['ts']?.type === 'para') markersMap.markers['ts'].type = 'ms'; + + // Add `fig` which seems to be mistakenly missing style in less than 3.1 and therefore doesn't get + // included. (`figure` type is being added in section above) + markersMap.markers['fig'] = mergeMarkers( + markersMap.markers['fig'], + { type: 'figure' }, + 'fig', + manualDefineName + ); + + // Less than 3.1 doesn't have `esbe`, the end marker for `esb`, because it only has USX information + markersMap.markers['esb'] = mergeMarkers( + markersMap.markers['esb'], + { type: 'sidebar', independentClosingMarkers: ['esbe'] }, + 'esb', + manualDefineName + ); + markersMap.markers['esbe'] = mergeMarkers( + markersMap.markers['esbe'], + { type: 'sidebar', isIndependentClosingMarkerFor: ['esb'] }, + 'esbe', + manualDefineName + ); + + // Less than 3.1 seems to be missing `sts` marker + markersMap.markers['sts'] = mergeMarkers( + markersMap.markers['sts'], + { type: 'para' }, + 'sts', + manualDefineName + ); + + // Less than 3.1 seems to be missing `efe` marker + markersMap.markers['efe'] = mergeMarkers( + markersMap.markers['efe'], + { type: 'note' }, + 'efe', + manualDefineName + ); + + // Indicate ref-type markers should be removed outputting to USFM in less than 3.1 because ref was + // introduced into the standard in 3.1, but Paratext generates ref when transforming from USFM to + // USX even in 3.0. + markersMap.markerTypes['ref'] = mergeMarkerTypes( + markersMap.markerTypes['ref'], + { + // Add the existing properties of ref marker type so we don't have conflicts merging types + ...markersMap.markerTypes['ref'], + skipOutputMarkerToUsfm: true, + }, + 'ref', + manualDefineName + ); + + // Less than 3.1 has link-href as first attribute in too many places. Just hard-code for these two + markersMap.markers['jmp'] = mergeMarkers( + markersMap.markers['jmp'], + { + type: 'char', + defaultAttribute: 'link-href', + }, + 'jmp', + manualDefineName + ); + markersMap.markers['xt'] = mergeMarkers( + markersMap.markers['xt'], + { + type: 'char', + defaultAttribute: 'link-href', + }, + 'xt', + manualDefineName + ); + + // Less than 3.1 has a bunch of problems with milestone default attributes + markersMap.markers['qt-s'] = mergeMarkers( + markersMap.markers['qt-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt-s', + manualDefineName + ); + markersMap.markers['qt1-s'] = mergeMarkers( + markersMap.markers['qt1-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt1-s', + manualDefineName + ); + markersMap.markers['qt2-s'] = mergeMarkers( + markersMap.markers['qt2-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt2-s', + manualDefineName + ); + markersMap.markers['qt3-s'] = mergeMarkers( + markersMap.markers['qt3-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt3-s', + manualDefineName + ); + markersMap.markers['qt4-s'] = mergeMarkers( + markersMap.markers['qt4-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt4-s', + manualDefineName + ); + markersMap.markers['qt5-s'] = mergeMarkers( + markersMap.markers['qt5-s'], + { type: 'ms', defaultAttribute: 'who' }, + 'qt5-s', + manualDefineName + ); + markersMap.markers['qt-e'] = mergeMarkers( + markersMap.markers['qt-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt-e', + manualDefineName + ); + markersMap.markers['qt1-e'] = mergeMarkers( + markersMap.markers['qt1-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt1-e', + manualDefineName + ); + markersMap.markers['qt2-e'] = mergeMarkers( + markersMap.markers['qt2-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt2-e', + manualDefineName + ); + markersMap.markers['qt3-e'] = mergeMarkers( + markersMap.markers['qt3-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt3-e', + manualDefineName + ); + markersMap.markers['qt4-e'] = mergeMarkers( + markersMap.markers['qt4-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt4-e', + manualDefineName + ); + markersMap.markers['qt5-e'] = mergeMarkers( + markersMap.markers['qt5-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'qt5-e', + manualDefineName + ); + markersMap.markers['t-s'] = mergeMarkers( + markersMap.markers['t-s'], + { type: 'ms', defaultAttribute: 'sid' }, + 't-s', + manualDefineName + ); + markersMap.markers['t-e'] = mergeMarkers( + markersMap.markers['t-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 't-e', + manualDefineName + ); + markersMap.markers['ts-s'] = mergeMarkers( + markersMap.markers['ts-s'], + { type: 'ms', defaultAttribute: 'sid' }, + 'ts-s', + manualDefineName + ); + markersMap.markers['ts-e'] = mergeMarkers( + markersMap.markers['ts-e'], + { type: 'ms', defaultAttribute: 'eid' }, + 'ts-e', + manualDefineName + ); + } + + // Fill in missing information from the base markers map + if (baseMarkersMap) { + Object.entries(markersMap.markers).forEach(([markerName, markerInfo]) => { + let baseMarkerInfo = baseMarkersMap.markers[markerName]; + if (!markerInfo || !baseMarkerInfo) return [markerName, markerInfo]; + + // If default attribute is already somewhere in base marker's attributes, remove it + // because it was mis-labeled because there wasn't enough info to know what it was + if (markerInfo.defaultAttribute) { + // Collect all attribute names + const baseMarkerAttributeNames = [ + ...(baseMarkerInfo.leadingAttributes ?? []), + baseMarkerInfo.textContentAttribute, + ]; + if (baseMarkerInfo.textContentAttribute) + baseMarkerAttributeNames.push(baseMarkerInfo.textContentAttribute); + if (baseMarkerInfo.attributeMarkers) { + baseMarkerInfo.attributeMarkers.forEach(attributeMarkerName => { + const attributeMarker = baseMarkersMap.markers[attributeMarkerName]; + if (!attributeMarker || !('attributeMarkerAttributeName' in attributeMarker)) return; + baseMarkerAttributeNames.push(attributeMarker.attributeMarkerAttributeName); + }); + } + + // If the default attribute is found in the base attributes, get rid of it + if (baseMarkerAttributeNames.includes(markerInfo.defaultAttribute)) + delete markerInfo.defaultAttribute; + } + + // Special case: `k`'s default attribute was introduced in 3.1 + if (!isVersion3_1OrAbove && markerName === 'k') { + baseMarkerInfo = { ...baseMarkerInfo }; + delete baseMarkerInfo.defaultAttribute; + } + + // Fill in all information from base + markersMap.markers[markerName] = { ...baseMarkerInfo, ...markerInfo }; + }); + + Object.entries(markersMap.markerTypes).forEach(([markerType, markerTypeInfo]) => { + const baseMarkerTypeInfo = baseMarkersMap.markerTypes[markerType]; + if (!markerTypeInfo || !baseMarkerTypeInfo) return [markerType, markerTypeInfo]; + // Fill in all information from base + markersMap.markerTypes[markerType] = { ...baseMarkerTypeInfo, ...markerTypeInfo }; + }); + } + + // Sort the markers, marker types, and `isAttributeMarkerFor`s + markersMap.markers = Object.fromEntries( + Object.entries(markersMap.markers).sort(([markerNameA], [markerNameB]) => { + return compareStringsInvariantCaseInsensitive(markerNameA, markerNameB); + }) + ); + markersMap.markersRegExp = Object.fromEntries( + Object.entries(markersMap.markersRegExp).sort(([markerNameA], [markerNameB]) => { + return compareStringsInvariantCaseInsensitive(markerNameA, markerNameB); + }) + ); + markersMap.markerTypes = Object.fromEntries( + Object.entries(markersMap.markerTypes).sort(([markerTypeA], [markerTypeB]) => { + return compareStringsInvariantCaseInsensitive(markerTypeA, markerTypeB); + }) + ); + Object.values(markersMap.markers) + .concat(Object.values(markersMap.markersRegExp)) + .forEach(markerInfo => { + if (!markerInfo || !('attributeMarkerAttributeName' in markerInfo)) return; + + markerInfo.isAttributeMarkerFor?.sort(compareStringsInvariantCaseInsensitive); + markerInfo.isAttributeMarkerForRegExp?.sort(compareStringsInvariantCaseInsensitive); + }); + + return markersMap; +} diff --git a/src/test-data/markers-3.0.7.json b/src/test-data/markers-3.0.7.json new file mode 100644 index 0000000..e9832e3 --- /dev/null +++ b/src/test-data/markers-3.0.7.json @@ -0,0 +1,1184 @@ +{ + "version": "3.0.7", + "schemaRepo": "https://github.com/ubsicap/usx.git", + "schemaCommit": "6c490bb5675d281b0fa01876fe67f6e3fd50a4ce", + "markersMapVersion": "1.0.0", + "usfmToolsCommit": "67c8ec557f1657916f04e87329d41aa79dcfde8a+", + "markers": { + "add": { + "type": "char", + "description": "For a translational addition to the text" + }, + "addpn": { + "type": "char", + "description": "For chinese words to be dot underline & underline (DEPRECATED - used nested char@style pn)" + }, + "b": { + "type": "para", + "description": "Poetry text stanza break (e.g. stanza break)" + }, + "bd": { + "type": "char", + "description": "A character style, use bold text" + }, + "bdit": { + "type": "char", + "description": "A character style, use bold + italic text" + }, + "bk": { + "type": "char", + "description": "For the quoted name of a book" + }, + "c": { + "type": "chapter", + "leadingAttributes": [ + "number" + ], + "attributeMarkers": [ + "ca", + "cp" + ] + }, + "ca": { + "type": "char", + "attributeMarkerAttributeName": "altnumber", + "isAttributeMarkerFor": [ + "c" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true, + "description": "Second (alternate) chapter number" + }, + "cat": { + "type": "char", + "attributeMarkerAttributeName": "category", + "isAttributeMarkerFor": [ + "ef", + "efe", + "esb", + "ex", + "f", + "fe", + "x" + ], + "description": "Note category (study Bible)" + }, + "cd": { + "type": "para", + "description": "Chapter Description (Publishing option D, e.g. in Russian Bibles)" + }, + "cl": { + "type": "para", + "description": "Chapter label used for translations that add a word such as \"Chapter\"" + }, + "cls": { + "type": "para", + "description": "Closure of an Epistle" + }, + "cp": { + "type": "para", + "description": "Published chapter number", + "attributeMarkerAttributeName": "pubnumber", + "isAttributeMarkerFor": [ + "c" + ] + }, + "d": { + "type": "para", + "description": "A Hebrew text heading, to provide description (e.g. Psalms)" + }, + "dc": { + "type": "char", + "description": "Deuterocanonical/LXX additions or insertions in the Protocanonical text" + }, + "ef": { + "type": "note", + "description": "Study note", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "efe": { + "type": "note", + "description": "Extended study endnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "efm": { + "type": "char", + "description": "Reference to caller of previous footnote in a study Bible" + }, + "em": { + "type": "char", + "description": "A character style, use emphasized text style" + }, + "esb": { + "type": "sidebar", + "independentClosingMarkers": [ + "esbe" + ], + "attributeMarkers": [ + "cat" + ] + }, + "esbe": { + "type": "sidebar", + "isIndependentClosingMarkerFor": [ + "esb" + ] + }, + "ex": { + "type": "note", + "description": "Extended cross reference", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "f": { + "type": "note", + "description": "Footnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "fdc": { + "type": "char", + "description": "Footnote text, applies to Deuterocanon only (DEPRECATED - use char@style dc)", + "isClosingMarkerOptional": true + }, + "fe": { + "type": "note", + "description": "Endnote", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "fig": { + "type": "figure" + }, + "fk": { + "type": "char", + "description": "A footnote keyword", + "isClosingMarkerOptional": true + }, + "fl": { + "type": "char", + "description": "A footnote label text item, for marking or \"labelling\" the type or alternate translation being provided in the note.", + "isClosingMarkerOptional": true + }, + "fm": { + "type": "char", + "description": "Reference to caller of previous footnote" + }, + "fp": { + "type": "char", + "description": "A Footnote additional paragraph marker", + "isClosingMarkerOptional": true + }, + "fq": { + "type": "char", + "description": "A footnote scripture quote or alternate rendering", + "isClosingMarkerOptional": true + }, + "fqa": { + "type": "char", + "description": "A footnote alternate rendering for a portion of scripture text", + "isClosingMarkerOptional": true + }, + "fr": { + "type": "char", + "description": "The origin reference for the footnote", + "isClosingMarkerOptional": true + }, + "ft": { + "type": "char", + "description": "Footnote text, Protocanon", + "isClosingMarkerOptional": true + }, + "fv": { + "type": "char", + "description": "A verse number within the footnote text" + }, + "fw": { + "type": "char", + "description": "A footnote witness list, for distinguishing a list of sigla representing witnesses in critical editions.", + "isClosingMarkerOptional": true + }, + "h": { + "type": "para", + "description": "Running header text for a book" + }, + "h1": { + "type": "para", + "description": "Running header text (DEPRECATED)" + }, + "h2": { + "type": "para", + "description": "Running header text, left side of page (DEPRECATED)" + }, + "h3": { + "type": "para", + "description": "Running header text, right side of page (DEPRECATED)" + }, + "ib": { + "type": "para", + "description": "Introduction blank line" + }, + "id": { + "type": "book", + "leadingAttributes": [ + "code" + ] + }, + "ide": { + "type": "para", + "description": "File encoding information" + }, + "ie": { + "type": "para", + "description": "Introduction ending marker" + }, + "iex": { + "type": "para", + "description": "Introduction explanatory or bridge text (e.g. explanation of missing book in Short Old Testament)" + }, + "ili": { + "type": "para", + "description": "A list entry, level 1 (if single level)" + }, + "ili1": { + "type": "para", + "description": "A list entry, level 1 (if multiple levels)" + }, + "ili2": { + "type": "para", + "description": "A list entry, level 2" + }, + "im": { + "type": "para", + "description": "Introduction prose paragraph, with no first line indent (may occur after poetry)" + }, + "imi": { + "type": "para", + "description": "Introduction prose paragraph text, indented, with no first line indent" + }, + "imq": { + "type": "para", + "description": "Introduction prose paragraph, quote from the body text, with no first line indent" + }, + "imt": { + "type": "para", + "description": "Introduction major title, level 1 (if single level)\nIntroduction major title, level 1 - (if single level)" + }, + "imt1": { + "type": "para", + "description": "Introduction major title, level 1 (if multiple levels)" + }, + "imt2": { + "type": "para", + "description": "Introduction major title, level 2" + }, + "imt3": { + "type": "para", + "description": "Introduction major title, level 3" + }, + "imt4": { + "type": "para", + "description": "Introduction major title, level 4 (usually within parenthesis)" + }, + "imte": { + "type": "para", + "description": "Introduction major title at introduction end, level 1 (if single level)" + }, + "imte1": { + "type": "para", + "description": "Introduction major title at introduction end, level 1 (if multiple levels)" + }, + "imte2": { + "type": "para", + "description": "Introduction major title at introduction end, level 2" + }, + "io": { + "type": "para", + "description": "Introduction outline text, level 1 (if single level)" + }, + "io1": { + "type": "para", + "description": "Introduction outline text, level 1 (if multiple levels)" + }, + "io2": { + "type": "para", + "description": "Introduction outline text, level 2" + }, + "io3": { + "type": "para", + "description": "Introduction outline text, level 3" + }, + "io4": { + "type": "para", + "description": "Introduction outline text, level 4" + }, + "ior": { + "type": "char", + "description": "Introduction references range for outline entry; for marking references separately" + }, + "iot": { + "type": "para", + "description": "Introduction outline title" + }, + "ip": { + "type": "para", + "description": "Introduction prose paragraph\nDivision or Section introductory paragraph (study Bible)" + }, + "ipi": { + "type": "para", + "description": "Introduction prose paragraph, indented, with first line indent" + }, + "ipq": { + "type": "para", + "description": "Introduction prose paragraph, quote from the body text" + }, + "ipr": { + "type": "para", + "description": "Introduction prose paragraph, right aligned" + }, + "iq": { + "type": "para", + "description": "Introduction poetry text, level 1 (if single level)" + }, + "iq1": { + "type": "para", + "description": "Introduction poetry text, level 1 (if multiple levels)" + }, + "iq2": { + "type": "para", + "description": "Introduction poetry text, level 2" + }, + "iq3": { + "type": "para", + "description": "Introduction poetry text, level 3" + }, + "iqt": { + "type": "char" + }, + "is": { + "type": "para", + "description": "Introduction section heading, level 1 (if single level)" + }, + "is1": { + "type": "para", + "description": "Introduction section heading, level 1 (if multiple levels)" + }, + "is2": { + "type": "para", + "description": "Introduction section heading, level 2" + }, + "it": { + "type": "char", + "description": "A character style, use italic text" + }, + "jmp": { + "type": "char", + "defaultAttribute": "link-href", + "description": "For associating linking attributes to a span of text" + }, + "k": { + "type": "char", + "description": "For a keyword" + }, + "k1": { + "type": "para", + "description": "Concordance main entry text or keyword, level 1" + }, + "k2": { + "type": "para", + "description": "Concordance main entry text or keyword, level 2" + }, + "lf": { + "type": "para", + "description": "List footer (introductory remark)" + }, + "lh": { + "type": "para", + "description": "List header (introductory remark)" + }, + "li": { + "type": "para", + "description": "A list entry, level 1 (if single level)" + }, + "li1": { + "type": "para", + "description": "A list entry, level 1 (if multiple levels)" + }, + "li2": { + "type": "para", + "description": "A list entry, level 2" + }, + "li3": { + "type": "para", + "description": "A list entry, level 3" + }, + "li4": { + "type": "para", + "description": "A list entry, level 4" + }, + "lik": { + "type": "char", + "description": "Structured list entry key text" + }, + "lim": { + "type": "para", + "description": "An embedded list entry, level 1 (if single level)" + }, + "lim1": { + "type": "para", + "description": "An embedded list entry, level 1 (if multiple levels)" + }, + "lim2": { + "type": "para", + "description": "An embedded list entry, level 2" + }, + "lim3": { + "type": "para", + "description": "An embedded list entry, level 3" + }, + "lim4": { + "type": "para", + "description": "An embedded list entry, level 4" + }, + "lit": { + "type": "para", + "description": "For a comment or note inserted for liturgical use" + }, + "litl": { + "type": "char", + "description": "List entry total text" + }, + "liv": { + "type": "char", + "description": "Structured list entry value 1 content (if single value)" + }, + "liv1": { + "type": "char", + "description": "Structured list entrt value 1 content (if multiple values)" + }, + "liv2": { + "type": "char", + "description": "Structured list entry value 2 content" + }, + "liv3": { + "type": "char", + "description": "Structured list entry value 3 content" + }, + "liv4": { + "type": "char", + "description": "Structured list entry value 4 content" + }, + "liv5": { + "type": "char", + "description": "Structured list entry value 5 content" + }, + "m": { + "type": "para", + "description": "Paragraph text, with no first line indent (may occur after poetry) aka: Paragraph Continuation" + }, + "mi": { + "type": "para", + "description": "Paragraph text, indented, with no first line indent; often used for discourse" + }, + "mr": { + "type": "para", + "description": "A major section division references range heading" + }, + "ms": { + "type": "para", + "description": "A major section division heading, level 1 (if single level)" + }, + "ms1": { + "type": "para", + "description": "A major section division heading, level 1 (if multiple levels)" + }, + "ms2": { + "type": "para", + "description": "A major section division heading, level 2" + }, + "ms3": { + "type": "para", + "description": "A major section division heading, level 3" + }, + "mt": { + "type": "para", + "description": "The main title of the book (if single level)" + }, + "mt1": { + "type": "para", + "description": "The main title of the book (if multiple levels)" + }, + "mt2": { + "type": "para", + "description": "A secondary title usually occurring before the main title" + }, + "mt3": { + "type": "para", + "description": "A tertiary title occurring after the main title" + }, + "mt4": { + "type": "para", + "description": "Introduction major title, level 1 (if single level)\nA small secondary title sometimes occuring within parentheses" + }, + "mte": { + "type": "para", + "description": "The main title of the book repeated at the end of the book, level 1 (if single level)" + }, + "mte1": { + "type": "para", + "description": "The main title of the book repeat /ed at the end of the book, level 1 (if multiple levels)" + }, + "mte2": { + "type": "para", + "description": "A secondary title occurring before or after the 'ending' main title" + }, + "nb": { + "type": "para", + "description": "Paragraph text, with no break from previous paragraph text (at chapter boundary)" + }, + "nd": { + "type": "char", + "description": "For name of deity" + }, + "ndx": { + "type": "char", + "description": "A subject index text item" + }, + "no": { + "type": "char", + "description": "A character style, use normal text" + }, + "optbreak": { + "type": "optbreak" + }, + "ord": { + "type": "char", + "description": "For the text portion of an ordinal number" + }, + "p": { + "type": "para", + "description": "Paragraph text, with first line indent\nFront or back matter text paragraph, level 1" + }, + "p1": { + "type": "para", + "description": "Front or back matter text paragraph, level 1 (if multiple levels)" + }, + "p2": { + "type": "para", + "description": "Front or back matter text paragraph, level 2 (if multiple levels)" + }, + "pb": { + "type": "para", + "description": "Page Break used for new reader portions and children's bibles where content is controlled by the page" + }, + "pc": { + "type": "para", + "description": "Inscription (paragraph text centered)" + }, + "periph": { + "type": "periph", + "textContentAttribute": "alt" + }, + "ph": { + "type": "para", + "description": "Paragraph text, with level 1 hanging indent (if single level) (DEPRECATED - use para@style li#)" + }, + "ph1": { + "type": "para", + "description": "Paragraph text, with level 1 hanging indent (if multiple levels)" + }, + "ph2": { + "type": "para", + "description": "Paragraph text, with level 2 hanging indent" + }, + "ph3": { + "type": "para", + "description": "Paragraph text, with level 3 hanging indent" + }, + "pi": { + "type": "para", + "description": "Paragraph text, level 1 indent (if single level), with first line indent; often used for discourse" + }, + "pi1": { + "type": "para", + "description": "Paragraph text, level 1 indent (if multiple levels), with first line indent; often used for discourse" + }, + "pi2": { + "type": "para", + "description": "Paragraph text, level 2 indent, with first line indent; often used for discourse" + }, + "pi3": { + "type": "para", + "description": "Paragraph text, level 3 indent, with first line indent; often used for discourse" + }, + "pm": { + "type": "para", + "description": "Embedded text paragraph" + }, + "pmc": { + "type": "para", + "description": "Embedded text closing" + }, + "pmo": { + "type": "para", + "description": "Embedded text opening" + }, + "pmr": { + "type": "para", + "description": "Embedded text refrain" + }, + "pn": { + "type": "char", + "description": "For a proper name" + }, + "png": { + "type": "char", + "description": "For a geographic proper name" + }, + "po": { + "type": "para", + "description": "Letter opening" + }, + "pr": { + "type": "para", + "description": "Text refrain (paragraph right-aligned)" + }, + "pro": { + "type": "char", + "description": "For indicating pronunciation in CJK texts (DEPRECATED - used char@style rb)" + }, + "q": { + "type": "para", + "description": "Poetry text, level 1 indent (if single level)" + }, + "q1": { + "type": "para", + "description": "Poetry text, level 1 indent (if multiple levels)" + }, + "q2": { + "type": "para", + "description": "Poetry text, level 2 indent" + }, + "q3": { + "type": "para", + "description": "Poetry text, level 3 indent" + }, + "q4": { + "type": "para", + "description": "Poetry text, level 4 indent" + }, + "qa": { + "type": "para", + "description": "Poetry text, Acrostic marker/heading" + }, + "qac": { + "type": "char", + "description": "Poetry text, Acrostic markup of the first character of a line of acrostic poetry" + }, + "qc": { + "type": "para", + "description": "Poetry text, centered" + }, + "qd": { + "type": "para", + "description": "A Hebrew musical performance annotation, similar in content to Hebrew descriptive title." + }, + "qm": { + "type": "para", + "description": "Poetry text, embedded, level 1 indent (if single level)" + }, + "qm1": { + "type": "para", + "description": "Poetry text, embedded, level 1 indent (if multiple levels)" + }, + "qm2": { + "type": "para", + "description": "Poetry text, embedded, level 2 indent" + }, + "qm3": { + "type": "para", + "description": "Poetry text, embedded, level 3 indent" + }, + "qr": { + "type": "para", + "description": "Poetry text, Right Aligned" + }, + "qs": { + "type": "char", + "description": "Poetry text, Selah" + }, + "qt": { + "type": "char", + "description": "For Old Testament quoted text appearing in the New Testament" + }, + "qt-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt1-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt1-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt2-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt2-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt3-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt3-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt4-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt4-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "qt5-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "qt5-s": { + "type": "ms", + "defaultAttribute": "who" + }, + "r": { + "type": "para", + "description": "Parallel reference(s)" + }, + "rb": { + "type": "char", + "defaultAttribute": "gloss" + }, + "ref": { + "type": "ref", + "defaultAttribute": "loc" + }, + "rem": { + "type": "para", + "description": "Remark" + }, + "restore": { + "type": "para", + "description": "Comment about when text was restored" + }, + "rq": { + "type": "char", + "description": "A cross-reference indicating the source text for the preceding quotation." + }, + "s": { + "type": "para", + "description": "A section heading, level 1 (if single level)" + }, + "s1": { + "type": "para", + "description": "A section heading, level 1 (if multiple levels)" + }, + "s2": { + "type": "para", + "description": "A section heading, level 2 (e.g. Proverbs 22-24)" + }, + "s3": { + "type": "para", + "description": "A section heading, level 3 (e.g. Genesis \"The First Day\")" + }, + "s4": { + "type": "para", + "description": "A section heading, level 4" + }, + "sc": { + "type": "char", + "description": "A character style, for small capitalization text" + }, + "sd": { + "type": "para", + "description": "Vertical space used to divide the text into sections, level 1 (if single level)" + }, + "sd1": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 1 (if multiple levels)" + }, + "sd2": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 2" + }, + "sd3": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 3" + }, + "sd4": { + "type": "para", + "description": "Semantic division location (vertical space used to divide the text into sections), level 4" + }, + "sig": { + "type": "char", + "description": "For the signature of the author of an Epistle" + }, + "sls": { + "type": "char", + "description": "To represent where the original text is in a secondary language or from an alternate text source" + }, + "sp": { + "type": "para", + "description": "A heading, to identify the speaker (e.g. Job)" + }, + "sr": { + "type": "para", + "description": "A section division references range heading" + }, + "sts": { + "type": "para", + "description": "Status\nRemark" + }, + "sup": { + "type": "char", + "description": "A character style, for superscript text. Typically for use in critical edition footnotes." + }, + "t-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "t-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "table": { + "type": "table" + }, + "tl": { + "type": "char", + "description": "For transliterated words" + }, + "toc1": { + "type": "para", + "description": "Long table of contents text" + }, + "toc2": { + "type": "para", + "description": "Short table of contents text" + }, + "toc3": { + "type": "para", + "description": "Book Abbreviation" + }, + "toca1": { + "type": "para", + "description": "Alternative language long table of contents text" + }, + "toca2": { + "type": "para", + "description": "Alternative language short table of contents text" + }, + "toca3": { + "type": "para", + "description": "Alternative language book Abbreviation" + }, + "tr": { + "type": "row", + "description": "Table row" + }, + "ts": { + "type": "ms", + "description": "Translator's chunk (to identify chunks of text suitable for translating at one time)" + }, + "ts-e": { + "type": "ms", + "defaultAttribute": "eid" + }, + "ts-s": { + "type": "ms", + "defaultAttribute": "sid" + }, + "usfm": { + "type": "para", + "textContentAttribute": "version", + "parseUsfmInstructions": "If this marker is directly after the first id marker, this marker's version attribute should determine the version attribute of the usx or USJ marker at the top of the USX or USJ document, then this marker should be removed." + }, + "USJ": { + "type": "USJ", + "textContentAttribute": "version", + "markerUsfm": "usfm" + }, + "usx": { + "type": "usx", + "textContentAttribute": "version", + "markerUsfm": "usfm" + }, + "v": { + "type": "verse", + "leadingAttributes": [ + "number" + ], + "attributeMarkers": [ + "va", + "vp" + ] + }, + "va": { + "type": "char", + "attributeMarkerAttributeName": "altnumber", + "isAttributeMarkerFor": [ + "v" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true, + "description": "Second (alternate) verse number (for coding dual numeration in Psalms; see also NRSV Exo 22.1-4)" + }, + "vp": { + "type": "char", + "description": "Published verse marker - this is a verse marking that would be used in the published text", + "attributeMarkerAttributeName": "pubnumber", + "isAttributeMarkerFor": [ + "v" + ], + "hasStructuralSpaceAfterCloseAttributeMarker": true + }, + "w": { + "type": "char", + "defaultAttribute": "lemma" + }, + "wa": { + "type": "char", + "description": "An Aramaic wordlist text item" + }, + "wg": { + "type": "char", + "description": "A Greek Wordlist text item" + }, + "wh": { + "type": "char", + "description": "A Hebrew wordlist text item" + }, + "wj": { + "type": "char", + "description": "For marking the words of Jesus" + }, + "x": { + "type": "note", + "description": "Cross reference", + "leadingAttributes": [ + "caller" + ], + "attributeMarkers": [ + "cat" + ] + }, + "xdc": { + "type": "char", + "description": "Cross-reference target reference(s), Deuterocanon only (DEPRECATED - use char@style dc)", + "isClosingMarkerOptional": true + }, + "xk": { + "type": "char", + "description": "A cross reference keyword", + "isClosingMarkerOptional": true + }, + "xnt": { + "type": "char", + "description": "Cross-reference target reference(s), New Testament only", + "isClosingMarkerOptional": true + }, + "xo": { + "type": "char", + "description": "The cross reference origin reference", + "isClosingMarkerOptional": true + }, + "xop": { + "type": "char", + "description": "Published cross reference origin text (origin reference that should appear in the published text)", + "isClosingMarkerOptional": true + }, + "xot": { + "type": "char", + "description": "Cross-reference target reference(s), Old Testament only", + "isClosingMarkerOptional": true + }, + "xq": { + "type": "char", + "description": "A cross-reference quotation from the scripture text", + "isClosingMarkerOptional": true + }, + "xt": { + "type": "char", + "defaultAttribute": "link-href", + "description": "A target reference(s)\nA cross reference target reference(s)\nThe cross reference target reference(s), protocanon only", + "isClosingMarkerOptional": true + }, + "xta": { + "type": "char", + "description": "Cross reference target references added text", + "isClosingMarkerOptional": true + } + }, + "markersRegExp": { + "[Zz].+": { + "type": "ms", + "defaultAttribute": "sid" + }, + "qt[1-5]?(\\-[se])?": { + "type": "ms", + "defaultAttribute": "sid" + }, + "t[hc][rc]?\\d+": { + "type": "cell" + }, + "ts?(\\-[se])?": { + "type": "ms", + "defaultAttribute": "sid" + } + }, + "markerTypes": { + "book": {}, + "cell": { + "skipOutputAttributeToUsfm": [ + "align" + ], + "outputToUsfmInstructions": "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.", + "parseUsfmInstructions": "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).", + "markerTypeUsj": "table:cell" + }, + "chapter": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "sid" + ], + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "eid" + ] + }, + "char": { + "isCloseable": true, + "nestedPrefix": "+" + }, + "figure": { + "isCloseable": true, + "outputToUsfmInstructions": "The USX/USJ file attribute needs its name changed to src in USFM", + "parseUsfmInstructions": "The USFM src attribute needs its name changed to file in USX/USJ" + }, + "ms": { + "isCloseable": true, + "isClosingMarkerEmpty": true + }, + "note": { + "isCloseable": true + }, + "optbreak": { + "hasStyleAttribute": false + }, + "para": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "vid" + ] + }, + "periph": { + "hasNewlineBefore": true, + "hasStyleAttribute": false + }, + "ref": { + "isCloseable": true, + "hasStyleAttribute": false, + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "gen" + ], + "skipOutputMarkerToUsfm": true + }, + "row": { + "hasNewlineBefore": true, + "markerTypeUsj": "table:row" + }, + "sidebar": { + "hasNewlineBefore": true + }, + "table": { + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "vid" + ], + "skipOutputMarkerToUsfm": true + }, + "table:cell": { + "skipOutputAttributeToUsfm": [ + "align" + ], + "outputToUsfmInstructions": "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.", + "parseUsfmInstructions": "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).", + "markerTypeUsj": "table:cell", + "markerTypeUsfm": "cell", + "markerTypeUsx": "cell" + }, + "table:row": { + "hasNewlineBefore": true, + "markerTypeUsj": "table:row", + "markerTypeUsfm": "row", + "markerTypeUsx": "row" + }, + "unmatched": { + "description": "Paratext uses this type for closing markers that it cannot find opening markers for. They are treated like char markers but have no contents, no closing markers, and no space after the marker.", + "outputToUsfmInstructions": "Do not output a structural space after the opening marker for markers with unmatched type.", + "parseUsfmInstructions": "If a closing marker occurs but does not seem to have a matching opening marker, create an unmatched-type marker. There is no structural space after the unmatched-type marker; its end is determined by the asterisk at the end of the marker." + }, + "USJ": { + "hasNewlineBefore": true, + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "xsi:noNamespaceSchemaLocation" + ], + "outputToUsfmInstructions": "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM." + }, + "usx": { + "hasNewlineBefore": true, + "hasStyleAttribute": false, + "skipOutputAttributeToUsfm": [ + "xsi:noNamespaceSchemaLocation" + ], + "outputToUsfmInstructions": "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM." + }, + "verse": { + "hasNewlineBefore": true, + "skipOutputAttributeToUsfm": [ + "sid" + ], + "skipOutputMarkerToUsfmIfAttributeIsPresent": [ + "eid" + ] + } + } +} \ No newline at end of file diff --git a/src/test-data/stdout-3.0.7.txt b/src/test-data/stdout-3.0.7.txt new file mode 100644 index 0000000..53005a4 --- /dev/null +++ b/src/test-data/stdout-3.0.7.txt @@ -0,0 +1,74 @@ + +> usfm-tools@1.0.0 generate-markers-map +> tsx src/generate-markers-map --schema src/test-data/usx-3.0.7.rng --version 3.0.7 --repo https://github.com/ubsicap/usx.git --commit 6c490bb5675d281b0fa01876fe67f6e3fd50a4ce --outJSON src/test-data/markers-3.0.7.json + +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: undefined, "version". Using the one with the textContentAttribute. In definition: Scripture (merging extraMarkerInfo into marker to add) +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: undefined, "version". Using the one with the textContentAttribute. In definition: Peripheral (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a defaultAttribute and one without: undefined, "code". Using the one with the defaultAttribute. In definition: BookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a defaultAttribute and one without: undefined, "code". Using the one with the defaultAttribute. In definition: PeripheralBookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a defaultAttribute and one without: undefined, "code". Using the one with the defaultAttribute. In definition: PeripheralDividedBookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "periph" has one definition with a defaultAttribute and one without: undefined, "id". Using the one with the defaultAttribute. In definition: PeripheralDivision (merging extraMarkerInfo into marker to add) +Warning: Marker type named "para" has one definition with a skipOutputAttributeToUsfm and one without: undefined, ["vid"]. Using the one with the skipOutputAttributeToUsfm. In definition: Para +Warning: Marker named "w" has one definition with a defaultAttribute and one without: undefined, "lemma". Using the one with the defaultAttribute. In definition: CharWithAttrib.char.style.w (merging extraMarkerInfo into marker to add) +Warning: Marker named "rb" has one definition with a defaultAttribute and one without: undefined, "gloss". Using the one with the defaultAttribute. In definition: CharWithAttrib.char.style.rb (merging extraMarkerInfo into marker to add) +Warning: Marker named "ts?(\-[se])?" has one definition with a defaultAttribute and one without: undefined, "sid". Using the one with the defaultAttribute. In definition: Milestone (merging extraMarkerInfo into marker to add) +Warning: Marker named "[Zz].+" has one definition with a defaultAttribute and one without: undefined, "sid". Using the one with the defaultAttribute. In definition: Milestone (merging extraMarkerInfo into marker to add) +Warning: Marker named "qt[1-5]?(\-[se])?" has one definition with a defaultAttribute and one without: undefined, "sid". Using the one with the defaultAttribute. In definition: MilestoneWithAttrib.ms.style.qt (merging extraMarkerInfo into marker to add) +Warning: Marker named "c" has one definition with a defaultAttribute and one without: undefined, "number". Using the one with the defaultAttribute. In definition: ChapterStart (merging extraMarkerInfo into marker to add) +Warning: Marker type named "chapter" has one definition with a skipOutputMarkerToUsfmIfAttributeIsPresent and one without: undefined, ["eid"]. Using the one with the skipOutputMarkerToUsfmIfAttributeIsPresent. In definition: ChapterEnd +Warning: Marker type named "para" has one definition with a skipOutputAttributeToUsfm and one without: ["vid"], undefined. Using the one with the skipOutputAttributeToUsfm. In definition: BookChapterLabel +Warning: Marker type named "verse" has one definition with a skipOutputMarkerToUsfmIfAttributeIsPresent and one without: undefined, ["eid"]. Using the one with the skipOutputMarkerToUsfmIfAttributeIsPresent. In definition: VerseEnd +Warning: Marker named "f" has one definition with a defaultAttribute and one without: undefined, "caller". Using the one with the defaultAttribute. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "fe" has one definition with a defaultAttribute and one without: undefined, "caller". Using the one with the defaultAttribute. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "ef" has one definition with a defaultAttribute and one without: undefined, "caller". Using the one with the defaultAttribute. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "x" has one definition with a defaultAttribute and one without: undefined, "caller". Using the one with the defaultAttribute. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "ex" has one definition with a defaultAttribute and one without: undefined, "caller". Using the one with the defaultAttribute. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "esb" has one definition with a defaultAttribute and one without: undefined, "category". Using the one with the defaultAttribute. In definition: Sidebar (merging extraMarkerInfo into marker to add) +Warning: Style attribute in definition "Figure" has no value or param pattern elements. Skipping. +Warning: Marker named "ref" has one definition with a defaultAttribute and one without: undefined, "loc". Using the one with the defaultAttribute. In definition: Reference (merging extraMarkerInfo into marker to add) +Warning: Marker named "usfm" has one definition with a textContentAttribute and one without: undefined, "version". Using the one with the textContentAttribute. In definition: added manually +Warning: Marker named "usfm" has one definition with a parseUsfmInstructions and one without: undefined, "If this marker is directly after the first id marker, this marker's version attribute should determine the version attribute of the usx or USJ marker at the top of the USX or USJ document, then this marker should be removed.". Using the one with the parseUsfmInstructions. In definition: added manually +Warning: Marker named "usx" has one definition with a outputToUsfmInstructions and one without: undefined, "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM.". Using the one with the outputToUsfmInstructions. In definition: added manually +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: "version", undefined. Using the one with the textContentAttribute. In definition: added manually +Warning: Marker named "cell" has one definition with a outputToUsfmInstructions and one without: undefined, "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.". Using the one with the outputToUsfmInstructions. In definition: added manually +Warning: Marker named "cell" has one definition with a parseUsfmInstructions and one without: undefined, "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).". Using the one with the parseUsfmInstructions. In definition: added manually +Warning: Marker type named "cell" has one definition with a skipOutputAttributeToUsfm and one without: ["align"], undefined. Using the one with the skipOutputAttributeToUsfm. In definition: added manually +Warning: Marker named "esb" has one definition with a defaultAttribute and one without: "category", undefined. Using the one with the defaultAttribute. In definition: added manually +Warning: Marker named "jmp" has one definition with a defaultAttribute and one without: undefined, "link-href". Using the one with the defaultAttribute. In definition: added manually +Warning: Marker named "xt" has one definition with a defaultAttribute and one without: undefined, "link-href". Using the one with the defaultAttribute. In definition: added manually +Generated markers.json successfully + +Skipped definitions: +BookHeaders.para.style.enum +BookIdentification.book.code.enum +BookIntroduction.para.style.enum +BookIntroductionEndTitles.para.style.enum +BookTitles.para.style.enum +Chapter +ChapterContent +Char.char.style.enum +CharWithAttrib.enum +CrossReferenceChar.char.style.enum +Figure +FootnoteChar.char.style.enum +IntroChar.char.style.enum +List.para.style.enum +ListChar.char.style.enum +Milestone.ms.style.enum +MilestoneWithAttrib.enum +Para.para.style.enum +Peripheral.BAK.periph.id.enum +Peripheral.FRT.periph.id.enum +Peripheral.INT.periph.id.enum +Peripheral.OTH.periph.id.enum +PeripheralBook +PeripheralBookIdentification.book.code.enum +PeripheralContent +PeripheralDividedBook +PeripheralDividedBookIdentification.book.code.enum +PeripheralOther +USX +Verse +cell.align.enum +char.closed +char.link diff --git a/src/test-data/stdout-3.1.txt b/src/test-data/stdout-3.1.txt new file mode 100644 index 0000000..c3e4653 --- /dev/null +++ b/src/test-data/stdout-3.1.txt @@ -0,0 +1,93 @@ + +> usfm-tools@1.0.0 generate-markers-map +> tsx src/generate-markers-map --schema src/usx-3.1.rng --version 3.1 --repo https://github.com/usfm-bible/tcdocs.git --commit 50f2a6ac3fc1d867d906df28bc00fcff729a7b76 --outJSON src/markers-3.1.json + +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: undefined, "version". Using the one with the textContentAttribute. In definition: Peripheral (merging extraMarkerInfo into marker to add) +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: undefined, "version". Using the one with the textContentAttribute. In definition: Scripture (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a leadingAttributes and one without: undefined, ["code"]. Using the one with the leadingAttributes. In definition: BookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a leadingAttributes and one without: undefined, ["code"]. Using the one with the leadingAttributes. In definition: PeripheralBookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "id" has one definition with a leadingAttributes and one without: undefined, ["code"]. Using the one with the leadingAttributes. In definition: PeripheralDividedBookIdentification (merging extraMarkerInfo into marker to add) +Warning: Marker named "periph" has one definition with a textContentAttribute and one without: undefined, "alt". Using the one with the textContentAttribute. In definition: PeripheralDivision (merging extraMarkerInfo into marker to add) +Warning: Marker type named "para" has one definition with a skipOutputAttributeToUsfm and one without: undefined, ["vid"]. Using the one with the skipOutputAttributeToUsfm. In definition: Section +Warning: could not determine marker type "table" hasNewlineBefore. In define Table. +Warning: Marker named "c" has one definition with a leadingAttributes and one without: undefined, ["number"]. Using the one with the leadingAttributes. In definition: ChapterStart (merging extraMarkerInfo into marker to add) +Warning: Marker named "c" has one definition with a attributeMarkers and one without: undefined, ["ca","cp"]. Using the one with the attributeMarkers. In definition: ChapterStart (merging extraMarkerInfo into marker to add) +Warning: Marker named "cp" has one definition with a isAttributeMarkerFor and one without: undefined, ["c"]. Using the one with the isAttributeMarkerFor. In definition: ChapterStart +Warning: Marker named "cp" has one definition with a attributeMarkerAttributeName and one without: undefined, "pubnumber". Using the one with the attributeMarkerAttributeName. In definition: ChapterStart +Warning: Marker type named "chapter" has one definition with a skipOutputMarkerToUsfmIfAttributeIsPresent and one without: undefined, ["eid"]. Using the one with the skipOutputMarkerToUsfmIfAttributeIsPresent. In definition: ChapterEnd +Warning: Marker type named "para" has one definition with a skipOutputAttributeToUsfm and one without: ["vid"], undefined. Using the one with the skipOutputAttributeToUsfm. In definition: BookChapterLabel +Warning: Marker named "v" has one definition with a leadingAttributes and one without: undefined, ["number"]. Using the one with the leadingAttributes. In definition: VerseStart (merging extraMarkerInfo into marker to add) +Warning: Marker named "v" has one definition with a attributeMarkers and one without: undefined, ["va","vp"]. Using the one with the attributeMarkers. In definition: VerseStart (merging extraMarkerInfo into marker to add) +Warning: Marker named "vp" has one definition with a isAttributeMarkerFor and one without: undefined, ["v"]. Using the one with the isAttributeMarkerFor. In definition: VerseStart +Warning: Marker named "vp" has one definition with a attributeMarkerAttributeName and one without: undefined, "pubnumber". Using the one with the attributeMarkerAttributeName. In definition: VerseStart +Warning: Marker type named "verse" has one definition with a skipOutputMarkerToUsfmIfAttributeIsPresent and one without: undefined, ["eid"]. Using the one with the skipOutputMarkerToUsfmIfAttributeIsPresent. In definition: VerseEnd +Warning: Marker named "fe" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "fe" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "f" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "f" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "efe" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "efe" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "ef" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "ef" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: Footnote (merging extraMarkerInfo into marker to add) +Warning: Marker named "ex" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "ex" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "x" has one definition with a leadingAttributes and one without: undefined, ["caller"]. Using the one with the leadingAttributes. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "x" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: CrossReference (merging extraMarkerInfo into marker to add) +Warning: Marker named "cat" has two definitions with isAttributeMarkerFor arrays of different lengths: ["fe","f","efe","ef"], ["ex","x"]. Combining them. In definition: CrossReference +Warning: Marker named "xt" has one definition with a defaultAttribute and one without: "href", undefined. Using the one with the defaultAttribute. In definition: CrossReferenceChar +Warning: Marker named "esb" has one definition with a attributeMarkers and one without: undefined, ["cat"]. Using the one with the attributeMarkers. In definition: Sidebar (merging extraMarkerInfo into marker to add) +Warning: Marker named "cat" has two definitions with isAttributeMarkerFor arrays of different lengths: ["fe","f","efe","ef","ex","x"], ["esb"]. Combining them. In definition: Sidebar +Warning: Attribute "loc" on marker type "ref" has multiple usfm:match tags. It will not be considered for special attribute properties like leading attribute. In define Reference +Warning: Marker named "ref" has one definition with a defaultAttribute and one without: undefined, "loc". Using the one with the defaultAttribute. In definition: Reference (merging extraMarkerInfo into marker to add) +Warning: Marker named "usx" has one definition with a outputToUsfmInstructions and one without: undefined, "If this marker is the top-level marker containing all other markers in this document, it should not be directly output to USFM. Instead, if this marker's version attribute is other than 3.0, a new usfm marker with this version attribute needs to be added after the id marker if one is present in the USFM.". Using the one with the outputToUsfmInstructions. In definition: added manually +Warning: Marker named "usx" has one definition with a textContentAttribute and one without: "version", undefined. Using the one with the textContentAttribute. In definition: added manually +Warning: Marker named "cell" has one definition with a outputToUsfmInstructions and one without: undefined, "If this marker has a colspan attribute, the USFM marker name should be this marker's name plus hyphen (-) plus the marker's final column number (first column number found in the marker name plus colspan minus 1). Then the colspan attribute should not be output as a USFM attribute.". Using the one with the outputToUsfmInstructions. In definition: added manually +Warning: Marker named "cell" has one definition with a parseUsfmInstructions and one without: undefined, "If this marker's name has a hyphen (-) and a number after the marker, the USX/USJ marker name should be just the portion of the marker name before the hyphen, and it should have the colspan attribute which is the number of columns spanned by the marker (second column number plus 1 minus first column number).". Using the one with the parseUsfmInstructions. In definition: added manually +Warning: Marker type named "cell" has one definition with a skipOutputAttributeToUsfm and one without: ["align"], undefined. Using the one with the skipOutputAttributeToUsfm. In definition: added manually +Warning: Marker named "figure" has one definition with a outputToUsfmInstructions and one without: undefined, "The USX/USJ file attribute needs its name changed to src in USFM". Using the one with the outputToUsfmInstructions. In definition: added manually +Warning: Marker named "figure" has one definition with a parseUsfmInstructions and one without: undefined, "The USFM src attribute needs its name changed to file in USX/USJ". Using the one with the parseUsfmInstructions. In definition: added manually +Generated markers.json successfully + +Skipped definitions: +Attributes +BookIdentification.book.code.enum +Cell.style.enum +Chapter +ChapterContent +Char.char.style.enum +CharContent +CrossReference.style.enum +CrossReferenceChar.char.style.enum +Figure +FigureTwo +Footnote.style.enum +FootnoteChar.char.style.enum +FullChar.char.style.enum +FullCharExtra.char.style.enum +Header.para.style.enum +Internal.style.enum +IntroChar.char.style.enum +Introduction.para.style.enum +List.para.style.enum +ListChar.char.style.enum +Milestone.style.enum +NoteCharContent +OtherPara.para.style.enum +Peripheral.BAK.periph.id.enum +Peripheral.FRT.periph.id.enum +Peripheral.INT.periph.id.enum +Peripheral.OTH.periph.id.enum +PeripheralBook +PeripheralBookIdentification.book.code.enum +PeripheralContent +PeripheralDividedBook +PeripheralDividedBookIdentification.book.code.enum +PeripheralOther +SectionPara.para.style.enum +Title.para.style.enum +USX +Verse +VersePara.para.style.enum +category +cell.align.enum +char.closed diff --git a/src/test-data/usx-3.0.7.rng b/src/test-data/usx-3.0.7.rng new file mode 100644 index 0000000..980b32a --- /dev/null +++ b/src/test-data/usx-3.0.7.rng @@ -0,0 +1,1727 @@ + + + + + + + + + + + + + + + + + 3 + \d+\.\d+(\.\d+)? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + \d+\.\d+(\.\d+)? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + GEN + + EXO + + LEV + + NUM + + DEU + + JOS + + JDG + + RUT + + 1SA + + 2SA + + 1KI + + 2KI + + 1CH + + 2CH + + EZR + + NEH + + EST + + JOB + + PSA + + PRO + + ECC + + SNG + + ISA + + JER + + LAM + + EZK + + DAN + + HOS + + JOL + + AMO + + OBA + + JON + + MIC + + NAM + + HAB + + ZEP + + HAG + + ZEC + + MAL + + MAT + + MRK + + LUK + + JHN + + ACT + + ROM + + 1CO + + 2CO + + GAL + + EPH + + PHP + + COL + + 1TH + + 2TH + + 1TI + + 2TI + + TIT + + PHM + + HEB + + JAS + + 1PE + + 2PE + + 1JN + + 2JN + + 3JN + + JUD + + REV + + TOB + + JDT + + ESG + + WIS + + SIR + + BAR + + LJE + + S3Y + + SUS + + BEL + + 1MA + + 2MA + + 3MA + + 4MA + + 1ES + + 2ES + + MAN + + PS2 + + ODA + + PSS + + EZA + + 5EZ + + 6EZ + + DAG + + PS3 + + 2BA + + LBA + + JUB + + ENO + + 1MQ + + 2MQ + + 3MQ + + REP + + 4BA + + LAO + + + + + + + + + + + + id + + + + + + + + + + + CNC + + GLO + + TDX + + NDX + + + + + + + + + + + + id + + + + + + + + + + + XXA + + XXB + + XXC + + XXD + + XXE + + XXF + + XXG + + FRT + + BAK + + OTH + + INT + + + + + + + + + + + + + x\-[\p{L}_\-\.:]+ + + + + + + + + + + + + + + + + + + + + + + + + + + title + halftitle + promo + imprimatur + pubdata + foreword + preface + contents + alphacontents + abbreviations + + + + + intbible + intot + intpent + inthistory + intpoetry + intprophesy + intdc + intnt + intgospels + intepistles + intletters + + + + + chron + measures + maps + lxxquotes + + + + + cover + spine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ide + + h + + h1 + + h2 + + h3 + + toc1 + + toc2 + + toc3 + + toca1 + + toca2 + + toca3 + + rem + + usfm + + + + + + + + + + + + + + + + + + + + + + mt + + mt1 + + mt2 + + mt3 + + mt4 + imt + + imt1 + + imt2 + + rem + + + + + + + + + + + + + + + + + + + + + + + + + + + + imt + + imt1 + + imt2 + + imt3 + + imt4 + + ib + + ie + + ili + + ili1 + + ili2 + + im + + imi + + imq + + io + + io1 + + io2 + + io3 + + io4 + + iot + + ip + + ipi + + ipq + + ipr + + iq + + iq1 + + iq2 + + iq3 + + is + + is1 + + is2 + + imte + + imte1 + + imte2 + + iex + + rem + + + + + + + + + + + + + + + + + + + + + + + mt + + mt1 + + mt2 + + mt3 + + mt4 + + imt + + imt1 + + imt2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [A-Z1-4]{3} ?[a-z0-9,\-:\p{L}\p{Mn}]* + + + + + + + + + + + + + + + + + + + + + restore + + cls + + iex + + ip + + lit + + m + + mi + + nb + + p + + pb + + pc + + pi + + pi1 + + pi2 + + pi3 + + po + + pr + + pmo + + pm + + pmc + + pmr + + ph + + ph1 + + ph2 + + ph3 + + q + + q1 + + q2 + + q3 + + q4 + + qa + + qc + + qr + + qm + + qm1 + + qm2 + + qm3 + + qd + + b + + d + + ms + + ms1 + + ms2 + + ms3 + + mr + + r + + s + + s1 + + s2 + + s3 + + s4 + + sr + + sp + + sd + + sd1 + + sd2 + + sd3 + + sd4 + + ts + + cp + + cl + + cd + + mte + + mte1 + + mte2 + + p + + p1 + + p2 + + k1 + + k2 + + rem + + + + + + + + + + + + [A-Z1-4]{3} ?[a-z0-9\-:\p{L}\p{Mn}]* + + + + + + + + + + + + + + + + + + + + + + lh + + li + + li1 + + li2 + + li3 + + li4 + + lf + + lim + + lim1 + + lim2 + + lim3 + + lim4 + + + + + + + + + [A-Z1-4]{3} ?[a-z0-9\-:\p{L}\p{Mn}]* + + + + + + + tr + + + + + + + + + + + + + + + + + t[hc][rc]?\d+ + + + + + + + + + + + + + + + + + + + + + + + + + + + start + + center + + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ior + + iqt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + va + + vp + + ca + + qac + + qs + + add + + addpn + + bk + + dc + + efm + + fm + + k + + nd + + ndx + + ord + + pn + + png + + pro + + qt + + rq + + sig + + sls + + tl + + wg + + wh + + wa + + wj + + xt + + jmp + + no + + it + + bd + + bdit + + em + + sc + + sup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + litl + + lik + + liv + + liv1 + + liv2 + + liv3 + + liv4 + + liv5 + + + + + + + + + + + + + + w + + + + + + + + + + + + 1 + + + + + + + + ([HG]\d{4,5}(:[a-z])?,?)+ + + + + + + + + [a-z]{3,5}\d?:\d+\.\d+\.\d+\.\d+ + + + + + + + + + + + + + + + + + + + + + + + + rb + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + (.*///?(.*/?)+)|((prj:[A-Za-z\-0-9]{3,8} )?[A-Z1-4]{3} \d+:\d+(\-\d+)?)|(#[^\s]+) + + + + + + + + + + + + + + [\p{L}\d_\-\.:]+ + + + + + + + + + + + + + + + + + + + + + [\p{L}\d_\-\.:]+ + + + + + + + + [\p{L}\d_\-\.:]+ + + + + + + + + + + + + + ts?(\-[se])? + + + [Zz].+ + + + + + + + + + + + + qt[1-5]?(\-[se])? + + + + + + + [\p{L}\d_\-\.:]+ + + + + + + + + [\p{L}\d_\-\.:]+ + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + c + + + + 1 + [A-Z1-4]{3} ?[0-9]+ + + + + + + 1 + [0-9]+\p{L}?(‏?[\-,][0-9]+\p{L}?)* + + + + + + + 1 + + + + + + + + + + + + + + 1 + [A-Z1-4]{3} ?[0-9]+ + + + + + + + + + cl + + + + + + + + + + + + + + + + 1 + [0-9]+[\p{L}\p{Mn}]*(‏?[\-,][0-9]+[\p{L}\p{Mn}]*)* + + + + v + + + + + 1 + [0-9]+[\p{L}\p{Mn}]*(‏?[\-,:][0-9]+[\p{L}\p{Mn}]*)* + + + + + + + 1 + + + + + + [A-Z1-4]{3} ?[a-z0-9,\-:\p{L}\p{Mn}]* + + + + + + + + + + + [A-Z1-4]{3} ?[a-z0-9,\-:\p{L}\p{Mn}]* + + + + + + + + + + f + fe + ef + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fr + + cat + + ft + + fk + + fq + + fqa + + fl + + fw + + fp + + fv + + fdc + + xt + + it + + bd + + bdit + + em + + sc + + + + + + + fv + + + + + + + + + x + ex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xo + + xop + + xt + + xta + + xk + + xq + + xot + + xnt + + xdc + + + + + + + esb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [A-Z1-4]{3}(-[A-Z1-4]{3})? ?[a-z0-9\-:]* + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/usx-3.1.rng b/src/usx-3.1.rng new file mode 100644 index 0000000..2859e06 --- /dev/null +++ b/src/usx-3.1.rng @@ -0,0 +1,2049 @@ + + + + A single simple horizontal (non newline) whitespace character + + + A sequence of more horizontal whitespace characters + + + A sequence of zero or more horizontal whitespace characters + + + A single newline (as supported by all operating systems) + + + A sequence of newline characters + + + A reducable whitespace character, including a single newline sequence + + + Matches any single reducible whitespace character, may split newline + + + A sequence of reducable whitespace characters + + + A sequence of zero or more reducable whitespace characters + + + All possible whitespace characters including content whitespace. Matches a single character + + + A sequence of non-newline whitespace up to and including a newline + + + Delimits a marker + + + Delimits simple text + + + Reducable characters following an attribute value + + + Matches text inside an attribute value (not including the quotes) + + + Matches a default attribute value string + + + Matches an attribute name + + + Matches simple text up to the next marker + + + Matches simple text without trailing whitespace + + + Matches simple text up to the start of a sequence of attributes delimited by | + + + Matches simple text up to the start of a sequence of attributes delimited by | if present + + + Matches the attributes list delimiter of | + + + Three letter uppercase code including digits + + + Verse number, including ranges and sequences + + + USX eid, sid, vid references + + + Milestone sid or eid any identifier, in effect + + + href bible reference + + + + + + + + + + + + + + + + + + + + + + + + + usx + + + + version + + 3 + \d+\.\d+(\.\d+)? + + + + + + noNamespaceSchemaLocation + + + + + + + + + + + + usx + + + + + version + + 3 + \d+\.\d+(\.\d+)? + + + + + + noNamespaceSchemaLocation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + book + + + style + id + + + + code + + + + + + + + + + + + + + + + GEN + EXO + LEV + NUM + DEU + JOS + JDG + RUT + 1SA + 2SA + 1KI + 2KI + 1CH + 2CH + EZR + NEH + EST + JOB + PSA + PRO + ECC + SNG + ISA + JER + LAM + EZK + DAN + HOS + JOL + AMO + OBA + JON + MIC + NAM + HAB + ZEP + HAG + ZEC + MAL + MAT + MRK + LUK + JHN + ACT + ROM + 1CO + 2CO + GAL + EPH + PHP + COL + 1TH + 2TH + 1TI + 2TI + TIT + PHM + HEB + JAS + 1PE + 2PE + 1JN + 2JN + 3JN + JUD + REV + TOB + JDT + ESG + WIS + SIR + BAR + LJE + S3Y + SUS + BEL + 1MA + 2MA + 3MA + 4MA + 1ES + 2ES + MAN + PS2 + ODA + PSS + EZA + 5EZ + 6EZ + DAG + PS3 + 2BA + LBA + JUB + ENO + 1MQ + 2MQ + 3MQ + REP + 4BA + LAO + + + [0-9A-Z]{3} + + + + + + book + + + style + id + + + + code + + + + + + + + + + + + + + + + CNC + GLO + TDX + NDX + + + + + book + + + style + id + + + + code + + + + + + + + + + + + + + + + XXA + XXB + XXC + XXD + XXE + XXF + XXG + FRT + BAK + OTH + INT + + + + + + periph + + + + alt + + + + + + id + + + + + + + x\-[\p{L}_\-\.:]+ + + + + + + + + + + + + + + + + + + + + + + + title + halftitle + promo + imprimatur + pubdata + foreword + preface + contents + alphacontents + abbreviations + + + + + intbible + intot + intpent + inthistory + intpoetry + intprophesy + intdc + intnt + intgospels + intepistles + intletters + + + + + chron + measures + maps + lxxquotes + + + + + cover + spine + + + + + + + + + + + + + + + + + + + + + + + + + + + para + + + style + + + + + + + + + + + + ide + File encoding information (DEPRECATED) + h1 + Running header text + h2 + Running header text, left side of page (DEPRECATED) + h3 + Running header text, right side of page (DEPRECATED) + h + Running header text for a book + toc1 + Long table of contents text + toc2 + Short table of contents text + toc3 + Book Abbreviation + toca1 + Alternative language long table of contents text + toca2 + Alternative language short table of contents text + toca3 + Alternative language book Abbreviation + rem + Remark + sts + Status + + + + + para + + + style + + + + + + + + + + + + + + + + + + mt1 + The main title of the book (if multiple levels) + mt2 + A secondary title usually occurring before the main title + mt3 + A tertiary title occurring after the main title + mt4 + mt + The main title of the book (if single level) + rem + Remark + + + + + + para + + + style + + + + + + + + + + + + + + + + + + + + + + + + imt1 + Introduction major title, level 1 (if multiple levels) + imt2 + Introduction major title, level 2 + imt3 + Introduction major title, level 3 + imt4 + Introduction major title, level 4 (usually within parenthesis) + imte1 + Introduction major title at introduction end, level 1 (if multiple levels) + imte2 + Introduction major title at introduction end, level 2 + imte + Introduction major title at introduction end, level 1 (if single level) + imt + Introduction major title, level 1 - (if single level) + ib + Introduction blank line + ie + Introduction ending marker + ili1 + A list entry, level 1 (if multiple levels) + ili2 + A list entry, level 2 + ili + A list entry, level 1 (if single level) + imi + Introduction prose paragraph text, indented, with no first line indent + imq + Introduction prose paragraph, quote from the body text, with no first line indent + im + Introduction prose paragraph, with no first line indent (may occur after poetry) + io1 + Introduction outline text, level 1 (if multiple levels) + io2 + Introduction outline text, level 2 + io3 + Introduction outline text, level 3 + io4 + Introduction outline text, level 4 + iot + Introduction outline title + io + Introduction outline text, level 1 (if single level) + ipi + Introduction prose paragraph, indented, with first line indent + ipq + Introduction prose paragraph, quote from the body text + ipr + Introduction prose paragraph, right aligned + ip + Introduction prose paragraph + iq1 + Introduction poetry text, level 1 (if multiple levels) + iq2 + Introduction poetry text, level 2 + iq3 + Introduction poetry text, level 3 + iq + Introduction poetry text, level 1 (if single level) + is1 + Introduction section heading, level 1 (if multiple levels) + is2 + Introduction section heading, level 2 + is + Introduction section heading, level 1 (if single level) + iex + Introduction explanatory or bridge text (e.g. explanation of missing book in Short Old Testament) + rem + Remark + + + + + para + + + style + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + para + + + style + + + + + vid + + + [A-Z1-4]{3} ?[a-z0-9\-:]*(‏?[\-,][0-9]+)* + + + + + + + + + + + + + + + + + + + + + + + restore + Comment about when text was restored + iex + Introduction explanatory or bridge text (e.g. explanation of missing book in Short Old Testament) + ip + Division or Section introductory paragraph (study Bible) + ms1 + A major section division heading, level 1 (if multiple levels) + ms2 + A major section division heading, level 2 + ms3 + A major section division heading, level 3 + ms + A major section division heading, level 1 (if single level) + mr + A major section division references range heading + mte1 + The main title of the book repeat /ed at the end of the book, level 1 (if multiple levels) + mte2 + A secondary title occurring before or after the 'ending' main title + mte + The main title of the book repeated at the end of the book, level 1 (if single level) + r + Parallel reference(s) + s1 + A section heading, level 1 (if multiple levels) + s2 + A section heading, level 2 (e.g. Proverbs 22-24) + s3 + A section heading, level 3 (e.g. Genesis "The First Day") (\s3 can take a \v!) + s4 + A section heading, level 4 + sr + A section division references range heading + sp + A heading, to identify the speaker (e.g. Job) + sd1 + Semantic division location (vertical space used to divide the text into sections), level 1 (if multiple levels) + sd2 + Semantic division location (vertical space used to divide the text into sections), level 2 + sd3 + Semantic division location (vertical space used to divide the text into sections), level 3 + sd4 + Semantic division location (vertical space used to divide the text into sections), level 4 + sd + Vertical space used to divide the text into sections, level 1 (if single level) + s + A section heading, level 1 (if single level) + cl + Chapter label used for translations that add a word such as "Chapter" + cd + Chapter Description (Publishing option D, e.g. in Russian Bibles) + + + + + para + + + + style + + + + + style + + + + + + vid + + + [A-Z1-4]{3} ?[a-z0-9\-:]*(‏?[\-,][0-9]+)* + + + + + + + + + + + + + + + + + + + + + + + cls + Closure of an Epistle + nb + Paragraph text, with no break from previous paragraph text (at chapter boundary) + pc + Inscription (paragraph text centered) + pi1 + Paragraph text, level 1 indent (if multiple levels), with first line indent; often used for discourse + pi2 + Paragraph text, level 2 indent, with first line indent; often used for discourse + pi3 + Paragraph text, level 3 indent, with first line indent; often used for discourse + pi + Paragraph text, level 1 indent (if single level), with first line indent; often used for discourse + po + Letter opening + pr + Text refrain (paragraph right-aligned) + pmo + Embedded text opening + pmc + Embedded text closing + pmr + Embedded text refrain + pm + Embedded text paragraph + ph1 + Paragraph text, with level 1 hanging indent (if multiple levels) + ph2 + Paragraph text, with level 2 hanging indent + ph3 + Paragraph text, with level 3 hanging indent + ph + Paragraph text, with level 1 hanging indent (if single level) (DEPRECATED - use para@style li#) + p + Paragraph text, with first line indent + q1 + Poetry text, level 1 indent (if multiple levels) + q2 + Poetry text, level 2 indent + q3 + Poetry text, level 3 indent + q4 + Poetry text, level 4 indent + qc + Poetry text, centered + qr + Poetry text, Right Aligned + qm1 + Poetry text, embedded, level 1 indent (if multiple levels) + qm2 + Poetry text, embedded, level 2 indent + qm3 + Poetry text, embedded, level 3 indent + qm + Poetry text, embedded, level 1 indent (if single level) + qd + A Hebrew musical performance annotation, similar in content to Hebrew descriptive title. + q + Poetry text, level 1 indent (if single level) + b + Poetry text stanza break (e.g. stanza break) + d + A Hebrew text heading, to provide description (e.g. Psalms) + mi1 + Paragraph text, level 1 indented, with no first line indent; often used for discourse + mi2 + Paragraph text, level 2 indented, with no first line indent; often used for discourse + mi3 + Paragraph text, level 3 indented, with no first line indent; often used for discourse + mi4 + Paragraph text, level 4 indented, with no first line indent; often used for discourse + mi + Paragraph text, indented, with no first line indent; often used for discourse + m + Paragraph text, with no first line indent (may occur after poetry) aka: Paragraph Continuation + + + + + lit + For a comment or note inserted for liturgical use + cp + Chapter published style + pb + Page Break used for new reader portions and children's bibles where content is controlled by the page + p1 + Front or back matter text paragraph, level 1 (if multiple levels) + p2 + Front or back matter text paragraph, level 2 (if multiple levels) + qa + Poetry text, Acrostic marker/heading + k1 + Concordance main entry text or keyword, level 1 + k2 + Concordance main entry text or keyword, level 2 + rem + Remark + sts + Remark + + + + + para + + + style + + + + + vid + + + [A-Z1-4]{3} ?[a-z0-9\-:]*(‏?[\-,][0-9]+)* + + + + + + + + + + + + + + + + + + + + + + + + lh + List header (introductory remark) + li1 + A list entry, level 1 (if multiple levels) + li2 + A list entry, level 2 + li3 + A list entry, level 3 + li4 + A list entry, level 4 + lim1 + An embedded list entry, level 1 (if multiple levels) + lim2 + An embedded list entry, level 2 + lim3 + An embedded list entry, level 3 + lim4 + An embedded list entry, level 4 + lim + An embedded list entry, level 1 (if single level) + li + A list entry, level 1 (if single level) + lf + List footer (introductory remark) + + + + + table + + + vid + + [A-Z1-4]{3} ?[a-z0-9\-:]*(‏?[\-,][0-9]+)* + + + + + + row + + + style + tr + + + + + + + + + + + + + + cell + + + style + + t[hc][rc]?\d+(-\d+)? + + + + align + + + + + colspan + + + + + + + + + + + + + + + + + + + + + + start + left in LTR, right in RTL + center + center + end + right in LTR, left in RTL + + + + + char + + + style + + + + + + + + + + + + + + + + + + + + + + + + + ior + iqt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style + closed + + + + + + + + + + + char + + + style + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xt + + + + + + + + + + vp + Published verse marker - this is a verse marking that would be used in the published text + qac + Poetry text, Acrostic markup of the first character of a line of acrostic poetry + qs + Poetry text, Selah + add + For a translational addition to the text + addpn + For chinese words to be dot underline & underline (DEPRECATED - used nested char@style pn) + bk + For the quoted name of a book + dc + Deuterocanonical/LXX additions or insertions in the Protocanonical text + efm + Reference to caller of previous footnote in a study Bible + fm + Reference to caller of previous footnote + fv + A verse number within the footnote text + k + For a keyword + nd + For name of deity + ndx + A subject index text item + ord + For the text portion of an ordinal number + png + For a geographic proper name + pn + For a proper name + pro + For indicating pronunciation in CJK texts (DEPRECATED - used char@style rb) + qt + For Old Testament quoted text appearing in the New Testament + rq + A cross-reference indicating the source text for the preceding quotation. + sig + For the signature of the author of an Epistle + sls + To represent where the original text is in a secondary language or from an alternate text source + tl + For transliterated words + wg + A Greek Wordlist text item + wh + A Hebrew wordlist text item + wa + An Aramaic wordlist text item + wj + For marking the words of Jesus + jmp + For associating linking attributes to a span of text + no + A character style, use normal text + it + A character style, use italic text + bdit + A character style, use bold + italic text + bd + A character style, use bold text + em + A character style, use emphasized text style + sc + A character style, for small capitalization text + sup + A character style, for superscript text. Typically for use in critical edition footnotes. + xt + Inline scripture reference formatting. + w + rb + + + + + char + + + + + style + + + + + + + + + + + + + + + + + style + + + + + + + + + + + + + + + + + + + + char + + + style + + + + + + + + + + char + + + style + + + + + + + + + + + + + char + + + style + + + + + + + + + + + + + + + + + + + + + + + + + litl + List entry total text + lik + Structured list entry key text + liv1 + Structured list entrt value 1 content (if multiple values) + liv2 + Structured list entry value 2 content + liv3 + Structured list entry value 3 content + liv4 + Structured list entry value 4 content + liv5 + Structured list entry value 5 content + liv + Structured list entry value 1 content (if single value) + + + + + + + + figure + + + style + fig + + + + + + + + + + + + + + + + + + + + figure + + + style + fig + + + + + + + alt + + + + + src + + + + + size + + + + + loc + + + + + copy + + + + + alt + + + + + ref + + + + + + + + closed + + + + + + + ms + + + style + + + + + + + + + + + + + ts-s + ts-e + ts + t-s + t-e + qt1-s + qt1-e + qt2-s + qt2-e + qt3-s + qt3-e + qt4-s + qt4-e + qt5-s + qt5-e + qt-s + qt-e + + + + + + + + + + + chapter + + + style + c + + + + number + + [1-9][0-9]* + + + + + sid + + + 1 + [A-Z1-4]{3} ?[0-9]+ + + + + + + + altnumber + + + 1 + [1-9][0-9]*\p{L}?(‏?[\-,][0-9]+\p{L}?)* + + + + + + + pubnumber + + 1 + + + + + + + + + chapter + + eid + + 1 + [A-Z1-4]{3} ?[0-9]+ + + + + + + + + para + + + style + cl + + + + + + + + + + + + + + + verse + + + style + v + + + + number + + + 1 + [1-9][0-9]*[\p{L}\p{Mn}]*(‏?[\-,][0-9]+[\p{L}\p{Mn}]*)* + + + + + + altnumber + + + 1 + [1-9][0-9]*[\p{L}\p{Mn}]*(‏?[\-,:][0-9]+[\p{L}\p{Mn}]*)* + + + + + + + pubnumber + + 1 + + + + + + sid + + + [A-Z1-4]{3} ?[‏a-z0-9,\-:\p{L}\p{Mn}]* + + + + + + + + + verse + + eid + + + [A-Z1-4]{3} ?[‏a-z0-9,\-:\p{L}\p{Mn}]* + + + + + + + + note + + + style + + + + + caller + + + + + + + + + + + + + + + + + + + fe + Endnote + f + Footnote + efe + Extended study endnote + ef + Study note + + + + + char + + + style + + + + + + + + + + + + + + + + + + + + + + + fr + The origin reference for the footnote + ft + Footnote text, Protocanon + fk + A footnote keyword + fqa + A footnote alternate rendering for a portion of scripture text + fq + A footnote scripture quote or alternate rendering + fl + A footnote label text item, for marking or "labelling" the type or alternate translation being provided in the note. + fw + A footnote witness list, for distinguishing a list of sigla representing witnesses in critical editions. + fdc + Footnote text, applies to Deuterocanon only (DEPRECATED - use char@style dc) + fp + A Footnote additional paragraph marker + + + + + note + + + style + + + + + caller + + + + + + + + + + + + + + ex + Extended cross reference + x + Cross reference + + + + + char + + + style + + + + + + + + + + + + + + + + + + + + + + + xop + Published cross reference origin text (origin reference that should appear in the published text) + xo + The cross reference origin reference + xta + Cross reference target references added text + xt + The cross reference target reference(s), protocanon only + xk + A cross reference keyword + xq + A cross-reference quotation from the scripture text + xot + Cross-reference target reference(s), Old Testament only + xnt + Cross-reference target reference(s), New Testament only + xdc + Cross-reference target reference(s), Deuterocanon only (DEPRECATED - use char@style dc) + + + + + sidebar + + + style + esb + + + + + + + + + + + + + + + esbe + + + + + + + + category + + + + + + + ref + + + + + + + + + + loc + + + [A-Z1-4]{3}(-[A-Z1-4]{3})? ?[a-z0-9\-:]* + + + + + + + gen + + true + false + + + + + + + + + + optbreak + + + + + + id + Initial identifying marker + periph + Peripheral division + usfm + USFM version + c + Chapter + ca + Alternate Chapter number + cp + Chapter publication string + v + Verse + va + Alternative versification + vp + Published verse number + fig + Figure + esb + Sidebar + cat + Category + + + + + th1 + th2 + th3 + th4 + th5 + th6 + th7 + th8 + th9 + th10 + th11 + th12 + tc1 + tc2 + tc3 + tc4 + tc5 + tc6 + tc7 + tc8 + tc9 + tc10 + tc11 + tc12 + tcr1 + tcr2 + tcr3 + tcr4 + tcr5 + tcr6 + tcr7 + tcr8 + tcr9 + tc10 + tc11 + tc12 + tcc1 + tcc2 + tcc3 + tcc4 + tcc5 + tcc6 + tcc7 + tcc8 + tcc9 + tcc10 + tcc11 + tcc12 + thc1 + thc2 + thc3 + thc4 + thc5 + thc6 + thc7 + thc8 + thc9 + thc10 + thc11 + tch12 + thr1 + thr2 + thr3 + thr4 + thr5 + thr6 + thr7 + thr8 + thr9 + thr10 + thr11 + thr12 + + + \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..c012260 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + assetsInclude: ['**/*.rng'], +});