From a64d5980962e99d9570d0f9219c5f49977fb5aa0 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:16:42 -0700 Subject: [PATCH 01/14] fix: add better type definitions for public functions --- package-lock.json | 25 ++++ package.json | 1 + src/main/js/doc.js | 317 +++++++++++++++++++++++++++++++++++++----- src/main/js/error.js | 33 +++++ src/main/js/html.js | 17 ++- src/main/js/isd.js | 26 +++- src/main/js/styles.js | 23 ++- src/main/js/utils.js | 56 +++++--- 8 files changed, 436 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index be702943..38042b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", + "@types/sax": "^1.2.7", "eslint": "^9.1.1", "filesaver.js-npm": "latest", "globals": "^15.0.0", @@ -580,12 +581,30 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/node": { + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -2865,6 +2884,12 @@ "node": "*" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index 591b4d61..da0c1afc 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", + "@types/sax": "^1.2.7", "eslint": "^9.1.1", "filesaver.js-npm": "latest", "globals": "^15.0.0", diff --git a/src/main/js/doc.js b/src/main/js/doc.js index e73b6bdb..242cdf8d 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -34,6 +34,14 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @module imscDoc */ +/** + * @typedef {import("./error").ErrorHandler} ErrorHandler + */ + +/** + * @typedef {sax.Tag | sax.QualifiedTag} Node + */ + /** * Allows a client to provide callbacks to handle children of the element * @typedef {Object} MetadataHandler @@ -47,7 +55,7 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @callback OpenTagCallBack * @param {string} ns Namespace URI of the element * @param {string} name Local name of the element - * @param {Object[]} attributes List of attributes, each consisting of a + * @param {Record} attributes List of attributes, each consisting of a * `uri`, `name` and `value` */ @@ -70,9 +78,9 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * be called back when nodes are present in elements. * * @param {string} xmlstring XML document - * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback + * @param {ErrorHandler} errorHandler Error callback * @param {?MetadataHandler} metadataHandler Callback for elements - * @returns {Object} Opaque in-memory representation of an IMSC1 document + * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ export function fromXML(xmlstring, errorHandler, metadataHandler) { @@ -807,19 +815,31 @@ function resolveTiming(doc, element, prev_sibling, parent) { } -class ForeignElement { +export class ForeignElement { constructor(node) { this.node = node; } } -class TT { +export class TT { constructor() { + /** + * @type {number[]} + */ this.events = []; this.head = new Head(); + + /** + * @type {?Body} + */ this.body = null; } + /** + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(node, xmllang, errorHandler) { /* compute cell resolution */ @@ -887,7 +907,9 @@ class TT { }; /* xml:lang */ - + /** + * @type {string} + */ this.lang = xmllang; } @@ -922,10 +944,10 @@ class TT { } - /* + /** * Retrieves the range of ISD times covered by the document * - * @returns {Array} Array of two elements: min_begin_time and max_begin_time + * @returns {[number, number]} Array of two elements: min_begin_time and max_begin_time * */ getMediaTimeRange() { @@ -933,10 +955,10 @@ class TT { return [this.events[0], this.events[this.events.length - 1]]; }; - /* + /** * Returns list of ISD begin times * - * @returns {Array} + * @returns {number[]} */ getMediaTimeEvents() { @@ -948,7 +970,7 @@ class TT { * Represents a TTML Head element */ -class Head { +export class Head { constructor() { this.styling = new Styling(); this.layout = new Layout(); @@ -959,9 +981,16 @@ class Head { * Represents a TTML Styling element */ -class Styling { +export class Styling { constructor() { + /** + * @type {Record} + */ this.styles = {}; + + /** + * @type {Record} + */ this.initials = {}; } } @@ -970,13 +999,28 @@ class Styling { * Represents a TTML Style element */ -class Style { +export class Style { constructor() { + /** + * @type {string} + */ this.id = null; + + /** + * @type {Record} + */ this.styleAttrs = null; + + /** + * @type {string[]} + */ this.styleRefs = null; } + /** + * @param {Node} node + * @param {ErrorHandler} errorHandler + */ initFromNode(node, errorHandler) { this.id = elementGetXMLID(node); this.styleAttrs = elementGetStyles(node, errorHandler); @@ -988,11 +1032,17 @@ class Style { * Represents a TTML initial element */ -class Initial { +export class Initial { constructor() { + /** + * @type {Record} + */ this.styleAttrs = null; } + /** + * @param {Node} node + */ initFromNode(node) { this.styleAttrs = {}; @@ -1018,13 +1068,16 @@ class Initial { * */ -class Layout { +export class Layout { constructor() { this.regions = {}; } } -class ContentElement { +export class ContentElement { + /** + * @param {string} kind + */ constructor(kind) { this.kind = kind; } @@ -1034,13 +1087,32 @@ class ContentElement { * Represents a TTML image element */ -class Image extends ContentElement { +export class Image extends ContentElement { + /** + * @param {string} src + * @param {string} type + */ constructor(src, type) { super("image"); + + /** + * @type {string} + */ this.src = src; + + /** + * @type {string} + */ this.type = type; } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, xmllang, errorHandler) { this.src = "src" in node.attributes ? node.attributes.src.value : null; @@ -1068,31 +1140,56 @@ class Image extends ContentElement { * */ -class IdentifiedElement { +export class IdentifiedElement { + /** + * @param {string} id + */ constructor(id) { this.id = id; } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + */ initFromNode(doc, parent, node) { this.id = elementGetXMLID(node); } } -class LayoutElement { +export class LayoutElement { + /** + * @param {string} id + */ constructor(id) { this.regionID = id; } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + */ initFromNode(doc, parent, node) { this.regionID = elementGetRegionID(node); } } -class StyledElement { +export class StyledElement { + /** + * @param {Record} styleAttrs + */ constructor(styleAttrs) { this.styleAttrs = styleAttrs; } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, errorHandler) { this.styleAttrs = elementGetStyles(node, errorHandler); @@ -1104,7 +1201,10 @@ class StyledElement { } } -class AnimatedElement { +export class AnimatedElement { + /** + * @param {any[]} sets + */ constructor(sets) { this.sets = sets; } @@ -1114,7 +1214,10 @@ class AnimatedElement { } } -class ContainerElement { +export class ContainerElement { + /** + * @param {string} contents + */ constructor(contents) { this.contents = contents; } @@ -1124,13 +1227,25 @@ class ContainerElement { } } -class TimedElement { +export class TimedElement { + /** + * + * @param {number} explicit_begin + * @param {number} explicit_end + * @param {number} explicit_dur + */ constructor(explicit_begin, explicit_end, explicit_dur) { this.explicit_begin = explicit_begin; this.explicit_end = explicit_end; this.explicit_dur = explicit_dur; } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, errorHandler) { const t = processTiming(doc, parent, node, errorHandler); this.explicit_begin = t.explicit_begin; @@ -1145,11 +1260,17 @@ class TimedElement { * Represents a TTML body element */ -class Body extends ContentElement { +export class Body extends ContentElement { constructor() { super("body"); } + /** + * @param {TT} doc + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, node, xmllang, errorHandler) { StyledElement.prototype.initFromNode.call(this, doc, null, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler); @@ -1165,11 +1286,18 @@ class Body extends ContentElement { * Represents a TTML div element */ -class Div extends ContentElement { +export class Div extends ContentElement { constructor() { super("div"); } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, xmllang, errorHandler) { StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); @@ -1185,11 +1313,18 @@ class Div extends ContentElement { * Represents a TTML p element */ -class P extends ContentElement { +export class P extends ContentElement { constructor() { super("p"); } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, xmllang, errorHandler) { StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); @@ -1205,11 +1340,19 @@ class P extends ContentElement { * Represents a TTML span element */ -class Span extends ContentElement { +export class Span extends ContentElement { constructor() { super("span"); } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {string} xmllang + * @param {string} xmlspace + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, xmllang, xmlspace, errorHandler) { StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); @@ -1226,11 +1369,19 @@ class Span extends ContentElement { * Represents a TTML anonymous span element */ -class AnonymousSpan extends ContentElement { +export class AnonymousSpan extends ContentElement { constructor() { super("span"); } + /** + * @param {TT} doc + * @param {Node} parent + * @param {string} text + * @param {string} xmlspace + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromText(doc, parent, text, xmllang, xmlspace, errorHandler) { TimedElement.prototype.initFromNode.call(this, doc, parent, null, errorHandler); @@ -1244,11 +1395,18 @@ class AnonymousSpan extends ContentElement { * Represents a TTML br element */ -class Br extends ContentElement { +export class Br extends ContentElement { constructor() { super("br"); } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, xmllang, errorHandler) { LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); @@ -1262,9 +1420,13 @@ class Br extends ContentElement { * */ -class Region { +export class Region { constructor() { } + /** + * @param {string} xmllang + * @returns {Region} + */ createDefaultRegion(xmllang) { const r = new Region(); @@ -1280,6 +1442,12 @@ class Region { return r; } + /** + * @param {TT} doc + * @param {Node} node + * @param {string} xmllang + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, node, xmllang, errorHandler) { IdentifiedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler); TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler); @@ -1304,10 +1472,16 @@ class Region { * */ -class Set { +export class Set { constructor() { } + /** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {ErrorHandler} errorHandler + */ initFromNode(doc, parent, node, errorHandler) { TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler); @@ -1341,14 +1515,28 @@ class Set { * */ +/** + * + * @param {Node} node + * @returns {string | null} + */ function elementGetXMLID(node) { return node && "xml:id" in node.attributes ? node.attributes["xml:id"].value || null : null; } +/** + * @param {Node} node + * @returns {string} + */ function elementGetRegionID(node) { return node && "region" in node.attributes ? node.attributes.region.value : ""; } +/** + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {string} + */ function elementGetTimeContainer(node, errorHandler) { const tc = node && "timeContainer" in node.attributes ? node.attributes.timeContainer.value : null; @@ -1371,12 +1559,21 @@ function elementGetTimeContainer(node, errorHandler) { } +/** + * @param {Node} node + * @returns {string[]} + */ function elementGetStyleRefs(node) { return node && "style" in node.attributes ? node.attributes.style.value.split(" ") : []; } +/** + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {Record} + */ function elementGetStyles(node, errorHandler) { const s = {}; @@ -1418,6 +1615,12 @@ function elementGetStyles(node, errorHandler) { return s; } +/** + * @param {Node} node + * @param {string} ns + * @param {string} name + * @returns {string | null} + */ function findAttribute(node, ns, name) { for (const i in node.attributes) { @@ -1431,6 +1634,11 @@ function findAttribute(node, ns, name) { return null; } +/** + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {number | null} + */ function extractAspectRatio(node, errorHandler) { let ar = findAttribute(node, ns_ittp, "aspectRatio"); @@ -1475,9 +1683,12 @@ function extractAspectRatio(node, errorHandler) { } -/* +/** * Returns the cellResolution attribute from a node * + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {{w: number, h: number}} */ function extractCellResolution(node, errorHandler) { @@ -1512,6 +1723,11 @@ function extractCellResolution(node, errorHandler) { } +/** + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {{ effectiveFrameRate: number, tickRate: number }} + */ function extractFrameAndTickRate(node, errorHandler) { // subFrameRate is ignored per IMSC1 specification @@ -1604,6 +1820,11 @@ function extractFrameAndTickRate(node, errorHandler) { } +/** + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {{w: number, h: number} | null} + */ function extractExtent(node, errorHandler) { const attr = findAttribute(node, ns_tts, "extent"); @@ -1635,6 +1856,12 @@ function extractExtent(node, errorHandler) { } +/** + * @param {number} tickRate + * @param {number} effectiveFrameRate + * @param {string} str + * @returns {number | null} + */ function parseTimeExpression(tickRate, effectiveFrameRate, str) { const CLOCK_TIME_FRACTION_RE = /^(\d{2,}):(\d\d):(\d\d(?:\.\d+)?)$/; @@ -1700,6 +1927,13 @@ function parseTimeExpression(tickRate, effectiveFrameRate, str) { return r; } +/** + * @param {TT} doc + * @param {Node} parent + * @param {Node} node + * @param {ErrorHandler} errorHandler + * @returns {{explicit_begin: number, explicit_end: number, explicit_dur: number}} + */ function processTiming(doc, parent, node, errorHandler) { /* determine explicit begin */ @@ -1758,6 +1992,11 @@ function processTiming(doc, parent, node, errorHandler) { } +/** + * @param {Styling} styling + * @param {Style} style + * @param {ErrorHandler} errorHandler + */ function mergeChainedStyles(styling, style, errorHandler) { while (style.styleRefs.length > 0) { @@ -1777,6 +2016,12 @@ function mergeChainedStyles(styling, style, errorHandler) { } +/** + * @param {Styling} styling + * @param {string[]} stylerefs + * @param {Record} styleattrs + * @param {ErrorHandler} errorHandler + */ function mergeReferencedStyles(styling, stylerefs, styleattrs, errorHandler) { for (let i = stylerefs.length - 1; i >= 0; i--) { @@ -1794,6 +2039,10 @@ function mergeReferencedStyles(styling, stylerefs, styleattrs, errorHandler) { } +/** + * @param {Record} from_styles + * @param {Record} into_styles + */ function mergeStylesIfNotPresent(from_styles, into_styles) { for (const sname in from_styles) { @@ -1811,13 +2060,15 @@ function mergeStylesIfNotPresent(from_styles, into_styles) { /* TODO: validate style format at parsing */ -/* +/** * Binary search utility function * * @typedef {Object} BinarySearchResult * @property {boolean} found Was an exact match found? * @property {number} index Position of the exact match or insert position * + * @param {number[]} arr + * @param {number} searchval * @returns {BinarySearchResult} */ diff --git a/src/main/js/error.js b/src/main/js/error.js index 84c27f69..e23287cd 100644 --- a/src/main/js/error.js +++ b/src/main/js/error.js @@ -3,6 +3,14 @@ * */ +/** + * @module imscError + */ + +/** + * @param {ErrorHandler} errorHandler + * @param {string} msg + */ export function reportWarning(errorHandler, msg) { if (errorHandler && errorHandler.warn && errorHandler.warn(msg)) @@ -10,6 +18,10 @@ export function reportWarning(errorHandler, msg) { } +/** + * @param {ErrorHandler} errorHandler + * @param {string} msg + */ export function reportError(errorHandler, msg) { if (errorHandler && errorHandler.error && errorHandler.error(msg)) @@ -17,6 +29,10 @@ export function reportError(errorHandler, msg) { } +/** + * @param {ErrorHandler} errorHandler + * @param {string} msg + */ export function reportFatal(errorHandler, msg) { if (errorHandler && errorHandler.fatal) @@ -25,3 +41,20 @@ export function reportFatal(errorHandler, msg) { throw msg; } + +/** + * Generic interface for handling events. The interface exposes four + * methods: + * *
info
: unusual event that does not result in an inconsistent state + * *
warn
: unexpected event that should not result in an inconsistent state + * *
error
: unexpected event that may result in an inconsistent state + * *
fatal
: unexpected event that results in an inconsistent state + * and termination of processing + * Each method takes a single
string
describing the event as argument, + * and returns a single
boolean
, which terminates processing if
true
. + * + * @typedef {Object} ErrorHandler + * @property {(msg: string) => boolean} warn + * @property {(msg: string) => boolean} error + * @property {(msg: string) => boolean} fatal + */ diff --git a/src/main/js/html.js b/src/main/js/html.js index bd0a557a..9a62ac70 100755 --- a/src/main/js/html.js +++ b/src/main/js/html.js @@ -27,6 +27,11 @@ import { reportError } from "./error.js"; import { byName } from "./styles.js"; +/** + * @typedef {import("./isd").ISD} ISD + * @typedef {import("./error").ErrorHandler} ErrorHandler + */ + /** * @module imscHTML */ @@ -36,7 +41,7 @@ const browserIsFirefox = /firefox/i.test(navigator.userAgent); /** * Function that maps
smpte:background
URIs to URLs resolving to image resource * @callback IMGResolver - * @param {string}
smpte:background
URI + * @param {string} value
smpte:background
URI * @return {string} PNG resource URL */ @@ -56,8 +61,8 @@ const browserIsFirefox = /firefox/i.test(navigator.userAgent); * is called for the next ISD, otherwise previousISDState should be set to * null. * - * @param {Object} isd ISD to be rendered - * @param {Object} element Element into which the ISD is rendered + * @param {ISD} isd ISD to be rendered + * @param {HTMLElement} element Element into which the ISD is rendered * @param {?IMGResolver} imgResolver Resolve
smpte:background
URIs into URLs. * @param {?number} eheight Height (in pixel) of the child
div
or null * to use clientHeight of the parent element @@ -65,10 +70,10 @@ const browserIsFirefox = /firefox/i.test(navigator.userAgent); * to use clientWidth of the parent element * @param {?boolean} displayForcedOnlyMode Value of the IMSC1 displayForcedOnlyMode parameter, * or false if null - * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback - * @param {Object} previousISDState State saved during processing of the previous ISD, or null if initial call + * @param {?ErrorHandler} errorHandler Error callback + * @param {ISD} previousISDState State saved during processing of the previous ISD, or null if initial call * @param {?boolean} enableRollUp Enables roll-up animations (see CEA 708) - * @return {Object} ISD state to be provided when this funtion is called for the next ISD + * @return {ISD} ISD state to be provided when this function is called for the next ISD */ export function renderHTML(isd, diff --git a/src/main/js/isd.js b/src/main/js/isd.js index b3880e06..f3e677ad 100644 --- a/src/main/js/isd.js +++ b/src/main/js/isd.js @@ -32,15 +32,20 @@ import { ComputedLength, hasOwnProperty } from "./utils.js"; * @module imscISD */ +/** + * @typedef {import("./doc").TT} TT + * @typedef {import("./error").ErrorHandler} ErrorHandler + */ + /** * Creates a canonical representation of an IMSC1 document returned by
imscDoc.fromXML()
* at a given absolute offset in seconds. This offset does not have to be one of the values returned * by
getMediaTimeEvents()
. * - * @param {Object} tt IMSC1 document + * @param {TT} tt IMSC1 document * @param {number} offset Absolute offset (in seconds) - * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback - * @returns {Object} Opaque in-memory representation of an ISD + * @param {ErrorHandler} errorHandler Error callback + * @returns {ISD} Opaque in-memory representation of an ISD */ export function generateISD(tt, offset, errorHandler) { @@ -720,15 +725,26 @@ function pruneEmptySpans(element) { } } -class ISD { +export class ISD { constructor(tt) { + /** + * @type {ISDContentElement[]} + */ this.contents = []; + + /** + * @type {string} + */ this.aspectRatio = tt.aspectRatio; + + /** + * @type {string} + */ this.lang = tt.lang; } } -class ISDContentElement { +export class ISDContentElement { constructor(ttelem) { /* assume the element is a region if it does not have a kind */ diff --git a/src/main/js/styles.js b/src/main/js/styles.js index df523e96..68423ed2 100644 --- a/src/main/js/styles.js +++ b/src/main/js/styles.js @@ -31,7 +31,22 @@ import { ComputedLength, parseColor, parseLength, parsePosition, parseTextShadow * @module imscStyles */ -class StylingAttributeDefinition { +/** + * @typedef {import("./doc").TT} TT + * @typedef {import("./doc").Node} Node + */ + +export class StylingAttributeDefinition { + /** + * @param {string} ns + * @param {string} name + * @param {string} initialValue + * @param {string[]} appliesTo + * @param {boolean} isInherit + * @param {boolean} isAnimatable + * @param {(value: string) => any} parseFunc + * @param {(doc: TT, parent: Node, element: Node, attr: string) => any} computeFunc + */ constructor(ns, name, initialValue, appliesTo, isInherit, isAnimatable, parseFunc, computeFunc) { this.name = name; this.ns = ns; @@ -1193,12 +1208,18 @@ export const all = [ /* TODO: allow null parse function */ +/** + * @type {Record} + */ export const byQName = {}; for (const i in all) { byQName[all[i].qname] = all[i]; } +/** + * @type {Record} + */ export const byName = {}; for (const j in all) { diff --git a/src/main/js/utils.js b/src/main/js/utils.js index 5a682f5a..f7372512 100644 --- a/src/main/js/utils.js +++ b/src/main/js/utils.js @@ -28,23 +28,6 @@ * @module imscUtils */ -/* Documents the error handler interface */ - -/** - * @classdesc Generic interface for handling events. The interface exposes four - * methods: - * *
info
: unusual event that does not result in an inconsistent state - * *
warn
: unexpected event that should not result in an inconsistent state - * *
error
: unexpected event that may result in an inconsistent state - * *
fatal
: unexpected event that results in an inconsistent state - * and termination of processing - * Each method takes a single
string
describing the event as argument, - * and returns a single
boolean
, which terminates processing if
true
. - * - * @name ErrorHandler - * @class - */ - /* * Parses a TTML color expression * @@ -75,6 +58,10 @@ const NAMED_COLOR = { cyan: [0, 255, 255, 255], }; +/** + * @param {string} str + * @returns {[number, number, number, number]} + */ export function parseColor(str) { let m; @@ -115,6 +102,10 @@ export function parseColor(str) { const LENGTH_RE = /^((?:\+|-)?\d*(?:\.\d+)?)(px|em|c|%|rh|rw)$/; +/** + * @param {string} str + * @returns {{ value: number, unit: string } | null} + */ export function parseLength(str) { let m; @@ -129,6 +120,10 @@ export function parseLength(str) { return r; }; +/** + * @param {string} str + * @returns {string | any[] | null} + */ export function parseTextShadow(str) { const shadows = str.match(/([^(,)]|\([^)]+\))+/g); @@ -202,6 +197,15 @@ export function parseTextShadow(str) { return r; }; +/** + * @typedef {{ value: number, unit: string }} Offset + * @typedef {{ edge: string, offset: Offset }} Position + */ + +/** + * @param {string} str + * @returns {{h: Position, v: Position} | null} + */ export function parsePosition(str) { /* see https://www.w3.org/TR/ttml2/#style-value-position */ @@ -327,15 +331,27 @@ export function parsePosition(str) { }; export class ComputedLength { + /** + * @param {number} rw + * @param {number} rh + */ constructor(rw, rh) { this.rw = rw; this.rh = rh; } + /** + * @param {number} width + * @param {number} height + * @returns {number} + */ toUsedLength(width, height) { return width * this.rw + height * this.rh; }; + /** + * @returns {boolean} + */ isZero() { return this.rw === 0 && this.rh === 0; }; @@ -406,6 +422,12 @@ export function toComputedLength(lengthVal, lengthUnit, emLength, percentLength, } +/** + * + * @param {Object} obj + * @param {string} prop + * @returns {boolean} + */ export function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } From bffafeb4cdf1afb06dc14bd4c0ec8eb7c1c301d1 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:20:09 -0700 Subject: [PATCH 02/14] chore: format fixes --- src/main/js/doc.js | 1 - src/main/js/error.js | 8 ++++---- src/main/js/utils.js | 1 - 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/js/doc.js b/src/main/js/doc.js index 242cdf8d..f6420062 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -1516,7 +1516,6 @@ export class Set { */ /** - * * @param {Node} node * @returns {string | null} */ diff --git a/src/main/js/error.js b/src/main/js/error.js index e23287cd..fc6b8e3d 100644 --- a/src/main/js/error.js +++ b/src/main/js/error.js @@ -45,10 +45,10 @@ export function reportFatal(errorHandler, msg) { /** * Generic interface for handling events. The interface exposes four * methods: - * *
info
: unusual event that does not result in an inconsistent state - * *
warn
: unexpected event that should not result in an inconsistent state - * *
error
: unexpected event that may result in an inconsistent state - * *
fatal
: unexpected event that results in an inconsistent state + * -
info
: unusual event that does not result in an inconsistent state + * -
warn
: unexpected event that should not result in an inconsistent state + * -
error
: unexpected event that may result in an inconsistent state + * -
fatal
: unexpected event that results in an inconsistent state * and termination of processing * Each method takes a single
string
describing the event as argument, * and returns a single
boolean
, which terminates processing if
true
. diff --git a/src/main/js/utils.js b/src/main/js/utils.js index f7372512..036d74e5 100644 --- a/src/main/js/utils.js +++ b/src/main/js/utils.js @@ -423,7 +423,6 @@ export function toComputedLength(lengthVal, lengthUnit, emLength, percentLength, } /** - * * @param {Object} obj * @param {string} prop * @returns {boolean} From f0688a60fc40c2b8875908030e3c8e58ae723425 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Tue, 18 Jun 2024 23:58:04 -0700 Subject: [PATCH 03/14] feat: add DOM Parser see: #242 --- package-lock.json | 36 ++++++------ package.json | 16 ++++- src/main/js/doc.js | 20 +++---- src/main/js/main.js | 1 + src/main/js/parser.js | 98 +++++++++++++++++++++++++++++++ src/test/webapp/gen-renders.html | 12 ++-- src/test/webapp/js/gen-renders.js | 9 +-- 7 files changed, 154 insertions(+), 38 deletions(-) create mode 100644 src/main/js/parser.js diff --git a/package-lock.json b/package-lock.json index 38042b02..0a2292a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.1.5", "license": "BSD-2-Clause", "dependencies": { - "sax": "1.2.1" + "sax": "^1.4.1" }, "devDependencies": { "@eslint/js": "^9.1.1", @@ -1241,6 +1241,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "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", @@ -2611,20 +2625,6 @@ "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2661,9 +2661,9 @@ "dev": true }, "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/serialize-javascript": { "version": "6.0.2", diff --git a/package.json b/package.json index da0c1afc..23cf7820 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,20 @@ "main": "dist/main/js/main.js", "types": "dist/main/js/main.d.ts", "unpkg": "dist/imsc.min.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./*.js": { + "types": "./dist/*.d.ts", + "import": "./dist/*.js" + }, + "./*": { + "types": "./dist/*.d.ts", + "import": "./dist/*.js" + } + }, "scripts": { "prepublishOnly": "grunt build:release", "dev": "npx http-server build/public_html", @@ -37,7 +51,7 @@ "test": "node --test ./src/test/js/*Test.js" }, "dependencies": { - "sax": "1.2.1" + "sax": "^1.4.1" }, "devDependencies": { "@eslint/js": "^9.1.1", diff --git a/src/main/js/doc.js b/src/main/js/doc.js index f6420062..ed5d5645 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -24,9 +24,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import sax from "sax"; import { reportError, reportFatal, reportWarning } from "./error.js"; import { ns_ebutts, ns_ittp, ns_itts, ns_tt, ns_ttp, ns_tts } from "./names.js"; +import { createDOMParser } from "./parser.js"; import { byName, byQName } from "./styles.js"; import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; @@ -36,10 +36,8 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; /** * @typedef {import("./error").ErrorHandler} ErrorHandler - */ - -/** - * @typedef {sax.Tag | sax.QualifiedTag} Node + * @typedef {import("./parser").Node} Node + * @typedef {import("./parser").Parser} Parser */ /** @@ -80,18 +78,18 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @param {string} xmlstring XML document * @param {ErrorHandler} errorHandler Error callback * @param {?MetadataHandler} metadataHandler Callback for elements + * @param {?Parser} parser XML parser * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ -export function fromXML(xmlstring, errorHandler, metadataHandler) { - const p = sax.parser(true, { xmlns: true }); +export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createDOMParser()) { const estack = []; const xmllangstack = []; const xmlspacestack = []; let metadata_depth = 0; let doc = null; - p.onclosetag = function () { + parser.onclosetag = function () { if (estack[0] instanceof Region) { @@ -191,7 +189,7 @@ export function fromXML(xmlstring, errorHandler, metadataHandler) { estack.shift(); }; - p.ontext = function (str) { + parser.ontext = function (str) { if (estack[0] === undefined) { @@ -234,7 +232,7 @@ export function fromXML(xmlstring, errorHandler, metadataHandler) { }; - p.onopentag = function (node) { + parser.onopentag = function (node) { // maintain the xml:space stack @@ -604,7 +602,7 @@ export function fromXML(xmlstring, errorHandler, metadataHandler) { // parse the document - p.write(xmlstring).close(); + parser.write(xmlstring).close(); // all referential styling has been flatten, so delete styles diff --git a/src/main/js/main.js b/src/main/js/main.js index 0a093b7d..7a6d3bfd 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -27,3 +27,4 @@ export { fromXML } from "./doc.js"; export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; +export { createDOMParser, createSAXParser } from "./parser.js"; diff --git a/src/main/js/parser.js b/src/main/js/parser.js new file mode 100644 index 00000000..a953e885 --- /dev/null +++ b/src/main/js/parser.js @@ -0,0 +1,98 @@ +import sax from "sax"; + +/** + * @typedef {sax.Tag | sax.QualifiedTag} Node + */ + +/** + * @typedef {Object} Parser + * @property {(xml: string) => Parser} write + * @property {() => Parser} close + * @property {(node: Node) => void} onopentag + * @property {(text: string) => void} ontext + * @property {() => void} onclosetag + */ + +export class XMLParser { + /** + * @param {Element} element + * @returns {SAX} + */ + static toNode(element) { + const attrs = element.attributes; + const node = XMLParser.toNS(element); + node.attributes = {}; + + for (let i = 0, len = attrs.length; i < len; i++) { + const attr = attrs[i]; + node.attributes[attr.name] = XMLParser.toNS(attr); + } + + return node; + } + + static toNS(node) { + return { + name: node.nodeName, + prefix: node.prefix, + local: node.localName, + uri: node.namespaceURI, + value: node.value, + }; + } + + onopentag = (node) => { console.log(node); } + ontext = (str) => { console.log(str); } + onclosetag = () => { } + + write(xmlstring) { + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlstring, "application/xml"); + const errorNode = doc.querySelector("parsererror"); + + if (errorNode) { + throw new Error("XML parsing error: " + errorNode.textContent); + } + + this.process(doc.firstChild); + + return this; + } + + process(element) { + const node = XMLParser.toNode(element); + this.onopentag(node); + + const children = element.childNodes; + + for (let i = 0, len = children.length; i < len; i++) { + const child = children[i]; + + if (child.nodeType === Node.TEXT_NODE) { + this.ontext(child.textContent); + } else if (child.nodeType === Node.ELEMENT_NODE) { + this.process(child); + } + } + + this.onclosetag(); + } + + close() { + return this; + } +} + +/** + * @returns {Parser} + */ +export function createDOMParser() { + return new XMLParser(); +} + +/** + * @returns {Parser} + */ +export function createSAXParser() { + return sax.parser(true, { xmlns: true }); +} diff --git a/src/test/webapp/gen-renders.html b/src/test/webapp/gen-renders.html index 68726056..6a162b56 100644 --- a/src/test/webapp/gen-renders.html +++ b/src/test/webapp/gen-renders.html @@ -20,10 +20,14 @@
- - + + + +
diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index e25a803c..110b5c76 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -46,7 +46,7 @@ var errorHandler = { /* */ -function generateRenders(reffiles_root) { +function generateRenders(reffiles_root, use_sax) { var zip = new JSZip(); @@ -61,7 +61,7 @@ function generateRenders(reffiles_root) { for (var i in finfos) { - p.push(asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfos[i])); + p.push(asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfos[i], use_sax)); } @@ -85,7 +85,7 @@ function generateRenders(reffiles_root) { } -function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo) { +function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo, use_sax) { var test_name = finfo.name || getTestName(finfo.path, finfo.params || {}); @@ -94,7 +94,8 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo) { return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { - var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler); + var parser = use_sax ? imsc.createSAXParser() : imsc.createDOMParser(); + var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, parser); test_renders_dir.file("doc.json", JSON.stringify( From 8a887a93992b910d88c8a5c2b0578615ca200771 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:00:43 -0700 Subject: [PATCH 04/14] Update getIMSC1Document.js --- src/test/js/utils/getIMSC1Document.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/js/utils/getIMSC1Document.js b/src/test/js/utils/getIMSC1Document.js index 51d5fe70..752f8b18 100644 --- a/src/test/js/utils/getIMSC1Document.js +++ b/src/test/js/utils/getIMSC1Document.js @@ -1,5 +1,6 @@ import fs from "node:fs/promises"; import { fromXML } from "../../../main/js/doc.js"; +import { creareSAXParser } from "../../../main/js/parser.js"; const errorHandler = { info: function (msg) { @@ -18,5 +19,5 @@ const errorHandler = { export async function getIMSC1Document(url, metadataHandler) { const contents = await fs.readFile(url, "utf8"); - return fromXML(contents, errorHandler, metadataHandler); + return fromXML(contents, errorHandler, metadataHandler, createSAXParser()); } From e7db800b358a104c8d6b2d1b6a08a3f358209ac3 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:03:34 -0700 Subject: [PATCH 05/14] Update getIMSC1Document.js --- src/test/js/utils/getIMSC1Document.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/js/utils/getIMSC1Document.js b/src/test/js/utils/getIMSC1Document.js index 752f8b18..871a0cb3 100644 --- a/src/test/js/utils/getIMSC1Document.js +++ b/src/test/js/utils/getIMSC1Document.js @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import { fromXML } from "../../../main/js/doc.js"; -import { creareSAXParser } from "../../../main/js/parser.js"; +import { createSAXParser } from "../../../main/js/parser.js"; const errorHandler = { info: function (msg) { From 4452ce8f38703fc1b7bb73e4f8202b1791be4192 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 13:51:26 -0400 Subject: [PATCH 06/14] chore: rebase package-lock.json on integration/v2 resolutions The previous lockfile carried stale transitive resolutions from before the merge (rollup 4.16.4 among others), which would have downgraded the fresh lockfile on integration/v2. This regenerates from the upstream lockfile, so the only delta is sax resolving to 1.6.1 per this branch's ^1.4.1 range. Co-Authored-By: Claude Fable 5 --- package-lock.json | 1549 +++++++++++++++++++++++++++------------------ 1 file changed, 937 insertions(+), 612 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ff94180..f8f43c56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,16 +33,20 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "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" } @@ -52,6 +56,7 @@ "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" }, @@ -60,28 +65,71 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -96,6 +144,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -104,26 +153,78 @@ } }, "node_modules/@eslint/js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.1.1.tgz", - "integrity": "sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "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==", + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -131,6 +232,7 @@ "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" }, @@ -139,17 +241,12 @@ "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==", - "dev": true - }, "node_modules/@humanwhocodes/retry": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.3.tgz", - "integrity": "sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -159,17 +256,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -177,85 +271,63 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "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", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@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, - "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, - "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==", + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^22.20 || ^24.12 || >=25" } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", @@ -281,6 +353,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", @@ -299,15 +372,15 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -347,14 +420,15 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -369,254 +443,409 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "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/node": { - "version": "20.14.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", - "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~8.3.0" } }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -629,15 +858,17 @@ "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -649,20 +880,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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, - "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" }, @@ -677,13 +900,15 @@ "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 + "dev": true, + "license": "Python-2.0" }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -693,39 +918,44 @@ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" }, "node_modules/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 + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "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.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -735,25 +965,15 @@ "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 - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "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" } @@ -763,6 +983,7 @@ "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" @@ -779,6 +1000,7 @@ "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" }, @@ -790,40 +1012,53 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, + "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" + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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", @@ -838,17 +1073,19 @@ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -863,13 +1100,15 @@ "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 + "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", "engines": { "node": ">=0.10.0" } @@ -879,15 +1118,27 @@ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "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/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" }, @@ -896,28 +1147,34 @@ } }, "node_modules/eslint": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.1.1.tgz", - "integrity": "sha512-b4cRQ0BeZcSEzPpY2PjFY70VbO32K7BStTGtBsnIGdTSEEQzBi8hPBcGQmTG2zUvFr9uLe0TK42bw8YszuHEqg==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "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": "^3.0.2", - "@eslint/js": "9.1.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -926,15 +1183,11 @@ "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -943,14 +1196,23 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -963,10 +1225,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "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" }, @@ -975,14 +1238,15 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -991,11 +1255,26 @@ "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", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1008,6 +1287,7 @@ "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" }, @@ -1020,6 +1300,7 @@ "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" } @@ -1028,13 +1309,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "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" } @@ -1043,7 +1326,8 @@ "version": "0.4.14", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/exit": { "version": "0.1.2", @@ -1054,11 +1338,22 @@ "node": ">= 0.8.0" } }, + "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", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -1070,40 +1365,36 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "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 - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -1115,13 +1406,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/filesaver.js-npm/-/filesaver.js-npm-1.0.1.tgz", "integrity": "sha512-UvDxCSp2+i5oav5BEswN8nxnQiH3gzXGqtC4NDaFqFKhRLHqc0FGHceC9m8fV1WArsTnTNSJ+EyZFCHD/0zzJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "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" }, @@ -1134,6 +1427,7 @@ "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" @@ -1150,6 +1444,7 @@ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, + "license": "MIT", "dependencies": { "detect-file": "^1.0.0", "is-glob": "^4.0.3", @@ -1165,6 +1460,7 @@ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", @@ -1181,6 +1477,7 @@ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -1190,6 +1487,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -1199,16 +1497,18 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1218,6 +1518,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, + "license": "MIT", "dependencies": { "for-in": "^1.0.1" }, @@ -1230,6 +1531,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -1240,7 +1542,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -1248,6 +1551,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1261,6 +1565,7 @@ "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" } @@ -1278,7 +1583,9 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1298,6 +1605,7 @@ "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" }, @@ -1306,19 +1614,21 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1331,6 +1641,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -1345,6 +1656,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -1361,6 +1673,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -1369,10 +1682,11 @@ } }, "node_modules/globals": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.0.0.tgz", - "integrity": "sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==", + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -1384,27 +1698,29 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/grunt": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", - "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.3.tgz", + "integrity": "sha512-ng0CbpyNp/ox5e5CBY9TkZgVdAL4wK+nBHO6rNE8cXGa5kM++Lxlp0MpFBVZbpgOR2oCp/91V+T3CZVSWWLqMA==", "dev": true, + "license": "MIT", "dependencies": { "dateformat": "~4.6.2", "eventemitter2": "~0.4.13", "exit": "~0.1.2", "findup-sync": "~5.0.0", "glob": "~7.1.6", - "grunt-cli": "~1.4.3", + "grunt-cli": "^1.4.3", "grunt-known-options": "~2.0.0", "grunt-legacy-log": "~3.0.0", "grunt-legacy-util": "~2.0.1", "iconv-lite": "~0.6.3", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "nopt": "~3.0.6" + "js-yaml": "^3.15.0", + "minimatch": "^3.1.5", + "nopt": "^5.0.0" }, "bin": { "grunt": "bin/grunt" @@ -1414,16 +1730,17 @@ } }, "node_modules/grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz", + "integrity": "sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==", "dev": true, + "license": "MIT", "dependencies": { "grunt-known-options": "~2.0.0", "interpret": "~1.1.0", "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" + "nopt": "~5.0.0", + "v8flags": "^4.0.1" }, "bin": { "grunt": "bin/grunt" @@ -1432,24 +1749,12 @@ "node": ">=10" } }, - "node_modules/grunt-cli/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, "node_modules/grunt-contrib-clean": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", "integrity": "sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA==", "dev": true, + "license": "MIT", "dependencies": { "async": "^3.2.3", "rimraf": "^2.6.2" @@ -1466,6 +1771,7 @@ "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-3.0.0.tgz", "integrity": "sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" }, @@ -1478,49 +1784,52 @@ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.1.tgz", + "integrity": "sha512-vytI3IUC8qUK9TcvvpHpGJzDojua/sfJV4TdLB4FtCFzospqduzBuL3+dEfpvO+tGECv7/273+33hjjMXSa92g==", "dev": true, + "license": "MIT", "dependencies": { "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", + "grunt-legacy-log-utils": "^2.1.3", "hooker": "~0.2.3", - "lodash": "~4.17.19" + "lodash": "^4.18.0" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.3.tgz", + "integrity": "sha512-sgG+QvKmdb44wZyzJP+ejDsy3jYxG2wzohpol+JTMlXqMUBDoZb01JPQ5jKAedtZBFwhmABAc88T9hEBLy3U+Q==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" + "chalk": "^4.1.0" }, "engines": { "node": ">=10" } }, "node_modules/grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.2.tgz", + "integrity": "sha512-0xoDILyR4BVJel5uJwnhjdWN9evOQ8A0uXbQUIJ0hgVthIA6kloXHSoqATQPj6BRrHrHkcQtCeGVb0ixFoHyEQ==", "dev": true, + "license": "MIT", "dependencies": { "async": "~3.2.0", - "exit": "~0.1.2", + "exit-x": "~0.2.2", "getobject": "~1.0.0", "hooker": "~0.2.3", - "lodash": "~4.17.21", + "lodash": "^4.18.0", "underscore.string": "~3.3.5", "which": "~2.0.2" }, @@ -1533,6 +1842,7 @@ "resolved": "https://registry.npmjs.org/grunt-npmcopy/-/grunt-npmcopy-0.2.0.tgz", "integrity": "sha512-iiIpifpz5UCWPYtskdgCbDjKOoSjmwdEj9hvIHZFHVWjjfehXN6VNoeBp9c6v8XuD81BnRLRf8z/rkwmmmxvqA==", "dev": true, + "license": "MIT", "dependencies": { "glob": "^7.1.3", "lodash": "^4.17.11" @@ -1545,7 +1855,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1566,6 +1878,7 @@ "resolved": "https://registry.npmjs.org/grunt-sync/-/grunt-sync-0.8.2.tgz", "integrity": "sha512-PB+xKI9YPyZn3NZQXpKHfZVlxHdf1L8GMl+Wi0mLhYypWuOdZPW2EzTmSuhhFbXjkb0aIOxvII1zdZZEl9zqGg==", "dev": true, + "license": "MIT", "dependencies": { "fs-extra": "^6.0.1", "glob": "^7.0.5", @@ -1579,7 +1892,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1599,29 +1914,19 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/grunt/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, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" } }, "node_modules/grunt/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1638,10 +1943,11 @@ } }, "node_modules/grunt/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==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1650,38 +1956,29 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/grunt/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/grunt/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 + "dev": true, + "license": "BSD-3-Clause" }, "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/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1694,6 +1991,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -1715,6 +2013,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -1723,10 +2022,11 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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" } @@ -1735,13 +2035,15 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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" @@ -1758,6 +2060,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -1766,7 +2069,9 @@ "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" @@ -1776,25 +2081,29 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, + "license": "MIT", "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -1803,28 +2112,17 @@ "node": ">=0.10.0" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, + "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "hasown": "^2.0.3" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1835,6 +2133,7 @@ "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" } @@ -1844,6 +2143,7 @@ "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" }, @@ -1855,31 +2155,25 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "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-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, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -1892,6 +2186,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -1901,6 +2196,7 @@ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, + "license": "MIT", "dependencies": { "is-unc-path": "^1.0.0" }, @@ -1913,6 +2209,7 @@ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, + "license": "MIT", "dependencies": { "unc-path-regex": "^0.1.2" }, @@ -1925,6 +2222,7 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1933,28 +2231,42 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "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 + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1966,25 +2278,29 @@ "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 + "dev": true, + "license": "MIT" }, "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 + "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 + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -1994,6 +2310,7 @@ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -2006,6 +2323,7 @@ "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" } @@ -2015,6 +2333,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2024,6 +2343,7 @@ "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" @@ -2037,6 +2357,7 @@ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -2046,6 +2367,7 @@ "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", "dev": true, + "license": "MIT", "dependencies": { "extend": "^3.0.2", "findup-sync": "^4.0.0", @@ -2065,6 +2387,7 @@ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", "dev": true, + "license": "MIT", "dependencies": { "detect-file": "^1.0.0", "is-glob": "^4.0.0", @@ -2080,6 +2403,7 @@ "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" }, @@ -2091,24 +2415,27 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "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 + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-iterator": { @@ -2116,6 +2443,7 @@ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -2128,6 +2456,7 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2136,26 +2465,42 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-2.0.7.tgz", "integrity": "sha512-kWAICpJv8fIY0Ka/90iOX9nCJ407Fgj82ceWwcxi2HvVkKGHRMS/Y4caqBaju5skNYXiQohGUjwGZ7rVgzUhRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "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.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2164,27 +2509,33 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "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/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/object.defaults": { @@ -2192,6 +2543,7 @@ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, + "license": "MIT", "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -2207,6 +2559,7 @@ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, + "license": "MIT", "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -2220,6 +2573,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -2232,6 +2586,7 @@ "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" } @@ -2241,6 +2596,7 @@ "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", @@ -2253,39 +2609,12 @@ "node": ">= 0.8.0" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "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" }, @@ -2301,6 +2630,7 @@ "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" }, @@ -2315,13 +2645,15 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "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" }, @@ -2334,6 +2666,7 @@ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -2348,6 +2681,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2357,6 +2691,7 @@ "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" } @@ -2366,6 +2701,7 @@ "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" } @@ -2375,6 +2711,7 @@ "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" } @@ -2383,13 +2720,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, + "license": "MIT", "dependencies": { "path-root-regex": "^0.1.0" }, @@ -2402,17 +2741,19 @@ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -2423,6 +2764,7 @@ "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" } @@ -2431,42 +2773,25 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "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/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" - } - ] - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2482,6 +2807,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.9.0" }, @@ -2490,18 +2816,23 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "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" } @@ -2511,6 +2842,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -2524,25 +2856,18 @@ "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/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2554,7 +2879,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2571,12 +2898,13 @@ } }, "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -2586,22 +2914,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" } }, @@ -2610,6 +2948,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.13.0.tgz", "integrity": "sha512-FYEvpCaD5jGtyBuBFcQImEGmTxDTPbiHjJdrYIp+mFIwgXiXabxvKUK7ZT9P31ozu2Tqm9llYQMRWsfvTMTAOw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/plugin-inject": "^5.0.4" }, @@ -2617,45 +2956,28 @@ "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/serialize-javascript": { "version": "7.1.1", @@ -2671,13 +2993,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "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" }, @@ -2690,67 +3014,65 @@ "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/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true - }, - "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==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "license": "MIT", + "engines": { + "node": ">=20.0.0" } }, - "node_modules/source-map-support/node_modules/source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2763,6 +3085,7 @@ "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" }, @@ -2775,6 +3098,7 @@ "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" }, @@ -2783,13 +3107,14 @@ } }, "node_modules/terser": { - "version": "5.30.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", - "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -2800,23 +3125,12 @@ "node": ">=10" } }, - "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 - }, - "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 - }, "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" }, @@ -2825,16 +3139,18 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" }, "node_modules/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" }, @@ -2843,10 +3159,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2860,6 +3177,7 @@ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2869,6 +3187,7 @@ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" @@ -2878,16 +3197,18 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -2897,6 +3218,7 @@ "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" } @@ -2905,18 +3227,17 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/which": { @@ -2924,6 +3245,7 @@ "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" }, @@ -2939,6 +3261,7 @@ "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" } @@ -2947,13 +3270,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "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" }, From b0887649c82628e6c22e920a14e1b24b09b32c1b Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 14:30:52 -0400 Subject: [PATCH 07/14] fix: address code review feedback on DOM parser and packaging - point exports/main/types at the actual dist/main layout (dist/index.js did not exist and broke `import "imsc"`) - default fromXML() to the sax parser in node via a "node" export condition (mainNode.js); browsers keep the DOMParser default - move createSAXParser() to saxParser.js and declare sideEffects: false so browser bundles can tree-shake sax - parse from documentElement instead of firstChild so comments/PIs before the root element do not break the DOM parser - pass the parser as the fourth argument in gen-renders.js so the SAX button exercises sax rather than the DOM default - move tslib to dependencies (compiled output imports it) - guard module-scope window/document access in html.js so importing the package does not throw in node - add a regression test for the node default parser Co-Authored-By: Claude Fable 5 --- package-lock.json | 5 ++-- package.json | 26 ++++++++++++--------- src/main/js/html.js | 11 ++++++--- src/main/js/main.js | 3 ++- src/main/js/mainNode.js | 33 +++++++++++++++++++++++++++ src/main/js/parser.js | 12 ++-------- src/main/js/saxParser.js | 12 ++++++++++ src/test/js/DefaultParserTest.js | 32 ++++++++++++++++++++++++++ src/test/js/utils/getIMSC1Document.js | 2 +- src/test/webapp/js/gen-renders.js | 2 +- 10 files changed, 108 insertions(+), 30 deletions(-) create mode 100644 src/main/js/mainNode.js create mode 100644 src/main/js/saxParser.js create mode 100644 src/test/js/DefaultParserTest.js diff --git a/package-lock.json b/package-lock.json index f8f43c56..43fd73f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.1.5", "license": "BSD-2-Clause", "dependencies": { - "sax": "^1.4.1" + "sax": "^1.4.1", + "tslib": "^2.6.2" }, "devDependencies": { "@eslint/js": "^9.1.1", @@ -28,7 +29,6 @@ "jszip": "latest", "rollup": "^4.14.3", "rollup-plugin-polyfill-node": "^0.13.0", - "tslib": "^2.6.2", "typescript": "^5.4.5" } }, @@ -3142,7 +3142,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, "license": "0BSD" }, "node_modules/type-check": { diff --git a/package.json b/package.json index e882a9f3..84aec250 100644 --- a/package.json +++ b/package.json @@ -25,22 +25,26 @@ "imsc" ], "author": "Pierre-Anthony Lemieux ", - "main": "dist/main/js/main.js", - "types": "dist/main/js/main.d.ts", + "main": "dist/main/mainNode.js", + "types": "dist/main/main.d.ts", "unpkg": "dist/imsc.min.js", + "sideEffects": false, "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/main/main.d.ts", + "node": "./dist/main/mainNode.js", + "default": "./dist/main/main.js" }, "./*.js": { - "types": "./dist/*.d.ts", - "import": "./dist/*.js" + "types": "./dist/main/*.d.ts", + "default": "./dist/main/*.js" }, "./*": { - "types": "./dist/*.d.ts", - "import": "./dist/*.js" - } + "types": "./dist/main/*.d.ts", + "default": "./dist/main/*.js" + }, + "./dist/*": "./dist/*", + "./package.json": "./package.json" }, "scripts": { "prepublishOnly": "grunt build:release", @@ -51,7 +55,8 @@ "test": "node --test ./src/test/js/*Test.js" }, "dependencies": { - "sax": "^1.4.1" + "sax": "^1.4.1", + "tslib": "^2.6.2" }, "devDependencies": { "@eslint/js": "^9.1.1", @@ -70,7 +75,6 @@ "jszip": "latest", "rollup": "^4.14.3", "rollup-plugin-polyfill-node": "^0.13.0", - "tslib": "^2.6.2", "typescript": "^5.4.5" } } diff --git a/src/main/js/html.js b/src/main/js/html.js index 9a62ac70..9c50b0bf 100755 --- a/src/main/js/html.js +++ b/src/main/js/html.js @@ -1834,10 +1834,15 @@ for (let i = 0; i < STYLING_MAP_DEFS.length; i++) { /* CSS property names */ -const RUBYPOSITION_ISWK = "webkitRubyPosition" in window.getComputedStyle(document.documentElement); +/* guard against non-browser environments, where renderHTML() is not usable but + importing the module must not throw */ + +const IS_BROWSER = typeof window !== "undefined" && typeof document !== "undefined"; + +const RUBYPOSITION_ISWK = IS_BROWSER && "webkitRubyPosition" in window.getComputedStyle(document.documentElement); const RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? "webkitRubyPosition" : "rubyPosition"; -const TEXTEMPHASISSTYLE_PROP = "webkitTextEmphasisStyle" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; +const TEXTEMPHASISSTYLE_PROP = IS_BROWSER && "webkitTextEmphasisStyle" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; -const TEXTEMPHASISPOSITION_PROP = "webkitTextEmphasisPosition" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; +const TEXTEMPHASISPOSITION_PROP = IS_BROWSER && "webkitTextEmphasisPosition" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; diff --git a/src/main/js/main.js b/src/main/js/main.js index 7a6d3bfd..b53edc76 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -27,4 +27,5 @@ export { fromXML } from "./doc.js"; export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; -export { createDOMParser, createSAXParser } from "./parser.js"; +export { createDOMParser } from "./parser.js"; +export { createSAXParser } from "./saxParser.js"; diff --git a/src/main/js/mainNode.js b/src/main/js/mainNode.js new file mode 100644 index 00000000..4be07a33 --- /dev/null +++ b/src/main/js/mainNode.js @@ -0,0 +1,33 @@ +/* + * Node entry point. Identical to main.js, except that fromXML() defaults to + * the sax parser, since node does not provide the DOMParser global that the + * default DOM parser relies on. + */ + +import { fromXML as fromXMLWithParser } from "./doc.js"; +import { createSAXParser } from "./saxParser.js"; + +export { renderHTML } from "./html.js"; +export { generateISD } from "./isd.js"; +export { createDOMParser } from "./parser.js"; +export { createSAXParser }; + +/** + * @typedef {import("./error.js").ErrorHandler} ErrorHandler + * @typedef {import("./doc.js").MetadataHandler} MetadataHandler + * @typedef {import("./doc.js").TT} TT + * @typedef {import("./parser.js").Parser} Parser + */ + +/** + * Same as fromXML() in doc.js, but defaults to the sax parser. + * + * @param {string} xmlstring XML document + * @param {ErrorHandler} errorHandler Error callback + * @param {?MetadataHandler} metadataHandler Callback for elements + * @param {?Parser} parser XML parser + * @returns {?TT} Opaque in-memory representation of an IMSC1 document + */ +export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParser()) { + return fromXMLWithParser(xmlstring, errorHandler, metadataHandler, parser); +} diff --git a/src/main/js/parser.js b/src/main/js/parser.js index a953e885..20385b54 100644 --- a/src/main/js/parser.js +++ b/src/main/js/parser.js @@ -1,7 +1,5 @@ -import sax from "sax"; - /** - * @typedef {sax.Tag | sax.QualifiedTag} Node + * @typedef {import("sax").Tag | import("sax").QualifiedTag} Node */ /** @@ -54,7 +52,7 @@ export class XMLParser { throw new Error("XML parsing error: " + errorNode.textContent); } - this.process(doc.firstChild); + this.process(doc.documentElement); return this; } @@ -90,9 +88,3 @@ export function createDOMParser() { return new XMLParser(); } -/** - * @returns {Parser} - */ -export function createSAXParser() { - return sax.parser(true, { xmlns: true }); -} diff --git a/src/main/js/saxParser.js b/src/main/js/saxParser.js new file mode 100644 index 00000000..80900109 --- /dev/null +++ b/src/main/js/saxParser.js @@ -0,0 +1,12 @@ +import sax from "sax"; + +/** + * @typedef {import("./parser.js").Parser} Parser + */ + +/** + * @returns {Parser} + */ +export function createSAXParser() { + return sax.parser(true, { xmlns: true }); +} diff --git a/src/test/js/DefaultParserTest.js b/src/test/js/DefaultParserTest.js new file mode 100644 index 00000000..48e19ee8 --- /dev/null +++ b/src/test/js/DefaultParserTest.js @@ -0,0 +1,32 @@ +import { ok } from "node:assert"; +import { test } from "node:test"; +import { fromXML } from "../../main/js/mainNode.js"; + +const errorHandler = { + info: function (msg) { + throw msg; + }, + warn: function (msg) { + throw msg; + }, + error: function (msg) { + throw msg; + }, + fatal: function (msg) { + throw msg; + }, +}; + +const XML = '

hello

'; + +test("Node entry point parses without an explicit parser", () => { + + /* regression: fromXML() must not default to the DOM parser in node, + where the DOMParser global does not exist */ + + const doc = fromXML(XML, errorHandler); + + ok(doc !== null); + ok(Array.isArray(doc.getMediaTimeEvents())); + +}); diff --git a/src/test/js/utils/getIMSC1Document.js b/src/test/js/utils/getIMSC1Document.js index 871a0cb3..b35ea00c 100644 --- a/src/test/js/utils/getIMSC1Document.js +++ b/src/test/js/utils/getIMSC1Document.js @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import { fromXML } from "../../../main/js/doc.js"; -import { createSAXParser } from "../../../main/js/parser.js"; +import { createSAXParser } from "../../../main/js/saxParser.js"; const errorHandler = { info: function (msg) { diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index 110b5c76..c90f300b 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -95,7 +95,7 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo, use_sa return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { var parser = use_sax ? imsc.createSAXParser() : imsc.createDOMParser(); - var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, parser); + var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, null, parser); test_renders_dir.file("doc.json", JSON.stringify( From 36e7674e3b4f6303f83919b0123311c1c9d6e60a Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 18:41:13 -0400 Subject: [PATCH 08/14] refactor: make sax a test-only dependency The library is browser-only as of v2, so the DOM parser is the only parser it ships. sax remains solely for the unit tests, which run in node, where the DOMParser global does not exist. - remove createSAXParser() from the public API and move it to the test utilities; the gen-renders webapp now uses the sax global it already loads via a script tag - remove mainNode.js and the "node" export condition; the single entry point is dist/main/main.js - move sax to devDependencies and drop @types/sax; the public Node typedef is now structural instead of referencing sax types - collapse the rollup config to one bundle pair, since the imsc.all.* variants existed only to inline sax - set "types": [] in tsconfig so builds do not depend on @types packages visible in parent directories - fix infinite recursion in "grunt clean" (self-referencing task alias) - replace DefaultParserTest with EntryPointTest, which asserts the entry imports in node and exposes exactly the public API Co-Authored-By: Claude Fable 5 --- Gruntfile.cjs | 2 -- package-lock.json | 31 ++---------------------- package.json | 6 ++--- properties.json | 2 -- rollup.config.js | 35 --------------------------- src/main/js/main.js | 1 - src/main/js/mainNode.js | 33 ------------------------- src/main/js/parser.js | 19 +++++++++++++-- src/main/js/saxParser.js | 12 --------- src/test/js/DefaultParserTest.js | 32 ------------------------ src/test/js/EntryPointTest.js | 20 +++++++++++++++ src/test/js/utils/getIMSC1Document.js | 2 +- src/test/js/utils/saxParser.js | 16 ++++++++++++ src/test/webapp/js/gen-renders.js | 2 +- tsconfig.json | 1 + 15 files changed, 60 insertions(+), 154 deletions(-) delete mode 100644 src/main/js/mainNode.js delete mode 100644 src/main/js/saxParser.js delete mode 100644 src/test/js/DefaultParserTest.js create mode 100644 src/test/js/EntryPointTest.js create mode 100644 src/test/js/utils/saxParser.js diff --git a/Gruntfile.cjs b/Gruntfile.cjs index 1d4a45fd..4b14174d 100644 --- a/Gruntfile.cjs +++ b/Gruntfile.cjs @@ -80,6 +80,4 @@ module.exports = function (grunt) { grunt.registerTask("build", ["build:debug"]); - grunt.registerTask("clean", ["clean"]); - }; diff --git a/package-lock.json b/package-lock.json index b8a34529..e689368f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "1.1.5", "license": "BSD-2-Clause", "dependencies": { - "sax": "^1.6.1", "tslib": "^2.6.2" }, "devDependencies": { @@ -17,7 +16,6 @@ "@rollup/plugin-commonjs": "^29.0.3", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", - "@types/sax": "^1.2.7", "eslint": "^9.39.5", "filesaver.js-npm": "latest", "globals": "^17.11.0", @@ -29,6 +27,7 @@ "jszip": "latest", "rollup": "^4.14.3", "rollup-plugin-polyfill-node": "^0.13.0", + "sax": "^1.6.1", "typescript": "^5.4.5" } }, @@ -849,16 +848,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", - "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -866,16 +855,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2991,6 +2970,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -3212,13 +3192,6 @@ "node": "*" } }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, - "license": "MIT" - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index 44a3ea75..42785526 100644 --- a/package.json +++ b/package.json @@ -25,14 +25,13 @@ "imsc" ], "author": "Pierre-Anthony Lemieux ", - "main": "dist/main/mainNode.js", + "main": "dist/main/main.js", "types": "dist/main/main.d.ts", "unpkg": "dist/imsc.min.js", "sideEffects": false, "exports": { ".": { "types": "./dist/main/main.d.ts", - "node": "./dist/main/mainNode.js", "default": "./dist/main/main.js" }, "./*.js": { @@ -55,7 +54,6 @@ "test": "node --test ./src/test/js/*Test.js" }, "dependencies": { - "sax": "^1.6.1", "tslib": "^2.6.2" }, "devDependencies": { @@ -63,7 +61,6 @@ "@rollup/plugin-commonjs": "^29.0.3", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", - "@types/sax": "^1.2.7", "eslint": "^9.39.5", "filesaver.js-npm": "latest", "globals": "^17.11.0", @@ -75,6 +72,7 @@ "jszip": "latest", "rollup": "^4.14.3", "rollup-plugin-polyfill-node": "^0.13.0", + "sax": "^1.6.1", "typescript": "^5.4.5" } } diff --git a/properties.json b/properties.json index ab796296..39e4f924 100644 --- a/properties.json +++ b/properties.json @@ -4,8 +4,6 @@ "webappBuildDir" : "build/public_html", "unitTestsResourcesDir" : "src/test/resources", "umdBuildDir" : "dist", - "umdAllDebugName" : "imsc.all.debug.js", "umdDebugName" : "imsc.debug.js", - "umdAllMinName" : "imsc.all.min.js", "umdMinName" : "imsc.min.js" } diff --git a/rollup.config.js b/rollup.config.js index c3339f46..8adc92ea 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -4,10 +4,8 @@ import terser from "@rollup/plugin-terser"; import nodePolyfill from "rollup-plugin-polyfill-node"; export default [ - // debug { input: "dist/main/main.js", - external: ["sax"], plugins: [ commonjs({ sourceMap: true, @@ -23,44 +21,11 @@ export default [ format: "umd", name: "imsc", sourcemap: true, - globals: { - sax: "sax", - }, }, { file: "dist/imsc.min.js", format: "umd", name: "imsc", sourcemap: true, - globals: { - sax: "sax", - }, - plugins: [terser()], - }], - }, - - // all - { - input: "dist/main/main.js", - plugins: [ - commonjs({ - sourceMap: true, - }), - nodeResolve({ - preferBuiltins: true, - browser: true, - }), - nodePolyfill(), - ], - output: [{ - file: "dist/imsc.all.debug.js", - format: "umd", - name: "imsc", - sourcemap: true, - }, { - file: "dist/imsc.all.min.js", - format: "umd", - name: "imsc", - sourcemap: true, plugins: [terser()], }], }, diff --git a/src/main/js/main.js b/src/main/js/main.js index b53edc76..a4cf681e 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -28,4 +28,3 @@ export { fromXML } from "./doc.js"; export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; export { createDOMParser } from "./parser.js"; -export { createSAXParser } from "./saxParser.js"; diff --git a/src/main/js/mainNode.js b/src/main/js/mainNode.js deleted file mode 100644 index 4be07a33..00000000 --- a/src/main/js/mainNode.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Node entry point. Identical to main.js, except that fromXML() defaults to - * the sax parser, since node does not provide the DOMParser global that the - * default DOM parser relies on. - */ - -import { fromXML as fromXMLWithParser } from "./doc.js"; -import { createSAXParser } from "./saxParser.js"; - -export { renderHTML } from "./html.js"; -export { generateISD } from "./isd.js"; -export { createDOMParser } from "./parser.js"; -export { createSAXParser }; - -/** - * @typedef {import("./error.js").ErrorHandler} ErrorHandler - * @typedef {import("./doc.js").MetadataHandler} MetadataHandler - * @typedef {import("./doc.js").TT} TT - * @typedef {import("./parser.js").Parser} Parser - */ - -/** - * Same as fromXML() in doc.js, but defaults to the sax parser. - * - * @param {string} xmlstring XML document - * @param {ErrorHandler} errorHandler Error callback - * @param {?MetadataHandler} metadataHandler Callback for elements - * @param {?Parser} parser XML parser - * @returns {?TT} Opaque in-memory representation of an IMSC1 document - */ -export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParser()) { - return fromXMLWithParser(xmlstring, errorHandler, metadataHandler, parser); -} diff --git a/src/main/js/parser.js b/src/main/js/parser.js index 20385b54..48decd09 100644 --- a/src/main/js/parser.js +++ b/src/main/js/parser.js @@ -1,5 +1,20 @@ /** - * @typedef {import("sax").Tag | import("sax").QualifiedTag} Node + * @typedef {Object} Attribute + * @property {string} name + * @property {?string} prefix + * @property {?string} local + * @property {?string} uri + * @property {?string} value + */ + +/** + * @typedef {Object} Node + * @property {string} name + * @property {?string} prefix + * @property {?string} local + * @property {?string} uri + * @property {?string} value + * @property {Object.} attributes */ /** @@ -14,7 +29,7 @@ export class XMLParser { /** * @param {Element} element - * @returns {SAX} + * @returns {Node} */ static toNode(element) { const attrs = element.attributes; diff --git a/src/main/js/saxParser.js b/src/main/js/saxParser.js deleted file mode 100644 index 80900109..00000000 --- a/src/main/js/saxParser.js +++ /dev/null @@ -1,12 +0,0 @@ -import sax from "sax"; - -/** - * @typedef {import("./parser.js").Parser} Parser - */ - -/** - * @returns {Parser} - */ -export function createSAXParser() { - return sax.parser(true, { xmlns: true }); -} diff --git a/src/test/js/DefaultParserTest.js b/src/test/js/DefaultParserTest.js deleted file mode 100644 index 48e19ee8..00000000 --- a/src/test/js/DefaultParserTest.js +++ /dev/null @@ -1,32 +0,0 @@ -import { ok } from "node:assert"; -import { test } from "node:test"; -import { fromXML } from "../../main/js/mainNode.js"; - -const errorHandler = { - info: function (msg) { - throw msg; - }, - warn: function (msg) { - throw msg; - }, - error: function (msg) { - throw msg; - }, - fatal: function (msg) { - throw msg; - }, -}; - -const XML = '

hello

'; - -test("Node entry point parses without an explicit parser", () => { - - /* regression: fromXML() must not default to the DOM parser in node, - where the DOMParser global does not exist */ - - const doc = fromXML(XML, errorHandler); - - ok(doc !== null); - ok(Array.isArray(doc.getMediaTimeEvents())); - -}); diff --git a/src/test/js/EntryPointTest.js b/src/test/js/EntryPointTest.js new file mode 100644 index 00000000..a51d4d4e --- /dev/null +++ b/src/test/js/EntryPointTest.js @@ -0,0 +1,20 @@ +import { equal, ok } from "node:assert"; +import { test } from "node:test"; + +test("Entry point imports in node", async () => { + + /* the library is browser-only, but the unit tests run in node, so importing + the entry point must not evaluate browser globals at module scope */ + + const imsc = await import("../../main/js/main.js"); + + equal(typeof imsc.fromXML, "function"); + equal(typeof imsc.createDOMParser, "function"); + equal(typeof imsc.renderHTML, "function"); + equal(typeof imsc.generateISD, "function"); + + /* sax is a test-only dependency and must not be part of the public API */ + + ok(!("createSAXParser" in imsc)); + +}); diff --git a/src/test/js/utils/getIMSC1Document.js b/src/test/js/utils/getIMSC1Document.js index b35ea00c..386bbc06 100644 --- a/src/test/js/utils/getIMSC1Document.js +++ b/src/test/js/utils/getIMSC1Document.js @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import { fromXML } from "../../../main/js/doc.js"; -import { createSAXParser } from "../../../main/js/saxParser.js"; +import { createSAXParser } from "./saxParser.js"; const errorHandler = { info: function (msg) { diff --git a/src/test/js/utils/saxParser.js b/src/test/js/utils/saxParser.js new file mode 100644 index 00000000..7fafa638 --- /dev/null +++ b/src/test/js/utils/saxParser.js @@ -0,0 +1,16 @@ +import sax from "sax"; + +/** + * @typedef {import("../../../main/js/parser.js").Parser} Parser + */ + +/** + * Creates a sax-based parser for use in the unit tests, which run in node, + * where the DOMParser global required by the default DOM parser does not + * exist. The library itself is browser-only and does not use sax. + * + * @returns {Parser} + */ +export function createSAXParser() { + return sax.parser(true, { xmlns: true }); +} diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index c90f300b..b3784438 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -94,7 +94,7 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo, use_sa return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { - var parser = use_sax ? imsc.createSAXParser() : imsc.createDOMParser(); + var parser = use_sax ? sax.parser(true, { xmlns: true }) : imsc.createDOMParser(); var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, null, parser); test_renders_dir.file("doc.json", diff --git a/tsconfig.json b/tsconfig.json index 8a728db1..bdb4e028 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,6 +36,7 @@ "strictNullChecks": true, "strictPropertyInitialization": true, "target": "ES5", + "types": [], }, "include": [ "src/main" From 0281d6121838b9458b60c6b5ee25aeda0bf69729 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 19:30:48 -0400 Subject: [PATCH 09/14] refactor: rename createDOMParser and drop SAX from the webapp Review feedback from #259: - rename createDOMParser() to createSAXParserFromDOMParser(), since it creates a SAX-style event parser on top of the web platform DOMParser - remove the SAX generation paths from gen-renders, which always runs in a UA; the DOM-backed parser is used unconditionally and the sax script tag and npmcopy entry are gone sax remains a devDependency solely for the node unit tests. Co-Authored-By: Claude Fable 5 --- Gruntfile.cjs | 1 - src/main/js/doc.js | 4 ++-- src/main/js/main.js | 2 +- src/main/js/parser.js | 2 +- src/test/js/EntryPointTest.js | 2 +- src/test/webapp/gen-renders.html | 13 ++++--------- src/test/webapp/js/gen-renders.js | 9 ++++----- 7 files changed, 13 insertions(+), 20 deletions(-) diff --git a/Gruntfile.cjs b/Gruntfile.cjs index 4b14174d..e568c534 100644 --- a/Gruntfile.cjs +++ b/Gruntfile.cjs @@ -39,7 +39,6 @@ module.exports = function (grunt) { default: { files: { "<%= properties.webappBuildDir %>/libs/": [ - "sax:main", "filesaver.js-npm:main", "jszip/dist/jszip.js", ], diff --git a/src/main/js/doc.js b/src/main/js/doc.js index ed5d5645..36f2224c 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -26,7 +26,7 @@ import { reportError, reportFatal, reportWarning } from "./error.js"; import { ns_ebutts, ns_ittp, ns_itts, ns_tt, ns_ttp, ns_tts } from "./names.js"; -import { createDOMParser } from "./parser.js"; +import { createSAXParserFromDOMParser } from "./parser.js"; import { byName, byQName } from "./styles.js"; import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; @@ -82,7 +82,7 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ -export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createDOMParser()) { +export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParserFromDOMParser()) { const estack = []; const xmllangstack = []; const xmlspacestack = []; diff --git a/src/main/js/main.js b/src/main/js/main.js index a4cf681e..eec3d35a 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -27,4 +27,4 @@ export { fromXML } from "./doc.js"; export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; -export { createDOMParser } from "./parser.js"; +export { createSAXParserFromDOMParser } from "./parser.js"; diff --git a/src/main/js/parser.js b/src/main/js/parser.js index 48decd09..9b5d7973 100644 --- a/src/main/js/parser.js +++ b/src/main/js/parser.js @@ -99,7 +99,7 @@ export class XMLParser { /** * @returns {Parser} */ -export function createDOMParser() { +export function createSAXParserFromDOMParser() { return new XMLParser(); } diff --git a/src/test/js/EntryPointTest.js b/src/test/js/EntryPointTest.js index a51d4d4e..21c7d412 100644 --- a/src/test/js/EntryPointTest.js +++ b/src/test/js/EntryPointTest.js @@ -9,7 +9,7 @@ test("Entry point imports in node", async () => { const imsc = await import("../../main/js/main.js"); equal(typeof imsc.fromXML, "function"); - equal(typeof imsc.createDOMParser, "function"); + equal(typeof imsc.createSAXParserFromDOMParser, "function"); equal(typeof imsc.renderHTML, "function"); equal(typeof imsc.generateISD, "function"); diff --git a/src/test/webapp/gen-renders.html b/src/test/webapp/gen-renders.html index 6a162b56..76ad260f 100644 --- a/src/test/webapp/gen-renders.html +++ b/src/test/webapp/gen-renders.html @@ -9,7 +9,6 @@ - @@ -20,14 +19,10 @@
- - - - + +
diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index b3784438..e25a803c 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -46,7 +46,7 @@ var errorHandler = { /* */ -function generateRenders(reffiles_root, use_sax) { +function generateRenders(reffiles_root) { var zip = new JSZip(); @@ -61,7 +61,7 @@ function generateRenders(reffiles_root, use_sax) { for (var i in finfos) { - p.push(asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfos[i], use_sax)); + p.push(asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfos[i])); } @@ -85,7 +85,7 @@ function generateRenders(reffiles_root, use_sax) { } -function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo, use_sax) { +function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo) { var test_name = finfo.name || getTestName(finfo.path, finfo.params || {}); @@ -94,8 +94,7 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo, use_sa return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { - var parser = use_sax ? sax.parser(true, { xmlns: true }) : imsc.createDOMParser(); - var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, null, parser); + var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler); test_renders_dir.file("doc.json", JSON.stringify( From b047e5dd01a8cef1fb6351d33a08cff03acc9251 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 21:39:15 -0400 Subject: [PATCH 10/14] refactor: detect CSS property names lazily in renderHTML renderHTML() is browser-only (mocked or real) and now throws when browser globals are absent, per review feedback on #259. Detection moved from module scope to the first renderHTML() call, so importing the module stays safe in node (where the unit tests run) and mocked DOM globals installed after import are picked up correctly. Co-Authored-By: Claude Fable 5 --- src/main/js/html.js | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/js/html.js b/src/main/js/html.js index 9c50b0bf..79909940 100755 --- a/src/main/js/html.js +++ b/src/main/js/html.js @@ -87,6 +87,8 @@ export function renderHTML(isd, enableRollUp, ) { + initCSSPropertyNames(); + /* maintain aspect ratio if specified */ let height = eheight || element.clientHeight; @@ -1832,17 +1834,29 @@ for (let i = 0; i < STYLING_MAP_DEFS.length; i++) { STYLMAP_BY_QNAME[STYLING_MAP_DEFS[i].qname] = STYLING_MAP_DEFS[i]; } -/* CSS property names */ +/* CSS property names, detected lazily on the first render so that importing + this module does not require browser globals; renderHTML() is browser-only + (mocked or real) and throws when they are absent */ + +let RUBYPOSITION_ISWK = null; + +let RUBYPOSITION_PROP = null; + +let TEXTEMPHASISSTYLE_PROP = null; -/* guard against non-browser environments, where renderHTML() is not usable but - importing the module must not throw */ +let TEXTEMPHASISPOSITION_PROP = null; -const IS_BROWSER = typeof window !== "undefined" && typeof document !== "undefined"; +function initCSSPropertyNames() { -const RUBYPOSITION_ISWK = IS_BROWSER && "webkitRubyPosition" in window.getComputedStyle(document.documentElement); + if (RUBYPOSITION_PROP !== null) return; -const RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? "webkitRubyPosition" : "rubyPosition"; + const style = window.getComputedStyle(document.documentElement); -const TEXTEMPHASISSTYLE_PROP = IS_BROWSER && "webkitTextEmphasisStyle" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; + RUBYPOSITION_ISWK = "webkitRubyPosition" in style; -const TEXTEMPHASISPOSITION_PROP = IS_BROWSER && "webkitTextEmphasisPosition" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; + RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? "webkitRubyPosition" : "rubyPosition"; + + TEXTEMPHASISSTYLE_PROP = "webkitTextEmphasisStyle" in style ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; + + TEXTEMPHASISPOSITION_PROP = "webkitTextEmphasisPosition" in style ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; +} From 1c18c327c9a0065eeb87ca1de6017a9c4e4de422 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Mon, 31 Aug 2026 21:44:57 -0400 Subject: [PATCH 11/14] revert: restore module-scope CSS property detection in html.js The library is browser-only, so importing it outside a browser (mocked or real) is unsupported and may throw, per review feedback on #259. This restores html.js as it was before the environment guard and the lazy detection, and removes the test that asserted the entry point imports in node. Co-Authored-By: Claude Fable 5 --- src/main/js/html.js | 29 +++++------------------------ src/test/js/EntryPointTest.js | 20 -------------------- 2 files changed, 5 insertions(+), 44 deletions(-) delete mode 100644 src/test/js/EntryPointTest.js diff --git a/src/main/js/html.js b/src/main/js/html.js index 79909940..9a62ac70 100755 --- a/src/main/js/html.js +++ b/src/main/js/html.js @@ -87,8 +87,6 @@ export function renderHTML(isd, enableRollUp, ) { - initCSSPropertyNames(); - /* maintain aspect ratio if specified */ let height = eheight || element.clientHeight; @@ -1834,29 +1832,12 @@ for (let i = 0; i < STYLING_MAP_DEFS.length; i++) { STYLMAP_BY_QNAME[STYLING_MAP_DEFS[i].qname] = STYLING_MAP_DEFS[i]; } -/* CSS property names, detected lazily on the first render so that importing - this module does not require browser globals; renderHTML() is browser-only - (mocked or real) and throws when they are absent */ - -let RUBYPOSITION_ISWK = null; - -let RUBYPOSITION_PROP = null; - -let TEXTEMPHASISSTYLE_PROP = null; - -let TEXTEMPHASISPOSITION_PROP = null; +/* CSS property names */ -function initCSSPropertyNames() { +const RUBYPOSITION_ISWK = "webkitRubyPosition" in window.getComputedStyle(document.documentElement); - if (RUBYPOSITION_PROP !== null) return; +const RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? "webkitRubyPosition" : "rubyPosition"; - const style = window.getComputedStyle(document.documentElement); +const TEXTEMPHASISSTYLE_PROP = "webkitTextEmphasisStyle" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; - RUBYPOSITION_ISWK = "webkitRubyPosition" in style; - - RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? "webkitRubyPosition" : "rubyPosition"; - - TEXTEMPHASISSTYLE_PROP = "webkitTextEmphasisStyle" in style ? "webkitTextEmphasisStyle" : "textEmphasisStyle"; - - TEXTEMPHASISPOSITION_PROP = "webkitTextEmphasisPosition" in style ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; -} +const TEXTEMPHASISPOSITION_PROP = "webkitTextEmphasisPosition" in window.getComputedStyle(document.documentElement) ? "webkitTextEmphasisPosition" : "textEmphasisPosition"; diff --git a/src/test/js/EntryPointTest.js b/src/test/js/EntryPointTest.js deleted file mode 100644 index 21c7d412..00000000 --- a/src/test/js/EntryPointTest.js +++ /dev/null @@ -1,20 +0,0 @@ -import { equal, ok } from "node:assert"; -import { test } from "node:test"; - -test("Entry point imports in node", async () => { - - /* the library is browser-only, but the unit tests run in node, so importing - the entry point must not evaluate browser globals at module scope */ - - const imsc = await import("../../main/js/main.js"); - - equal(typeof imsc.fromXML, "function"); - equal(typeof imsc.createSAXParserFromDOMParser, "function"); - equal(typeof imsc.renderHTML, "function"); - equal(typeof imsc.generateISD, "function"); - - /* sax is a test-only dependency and must not be part of the public API */ - - ok(!("createSAXParser" in imsc)); - -}); From 3287b1c11b1c7dd84811d3394e5aaa65d7e2b6b2 Mon Sep 17 00:00:00 2001 From: Pierre-Anthony Lemieux Date: Mon, 31 Aug 2026 22:26:04 -0700 Subject: [PATCH 12/14] Minor refactors --- src/main/js/doc.js | 3 +- src/main/js/dom_to_parser.js | 115 +++++++++++++++++++++++++++++++++++ src/main/js/main.js | 2 +- src/main/js/parser.js | 110 ++++++++++----------------------- 4 files changed, 150 insertions(+), 80 deletions(-) create mode 100644 src/main/js/dom_to_parser.js diff --git a/src/main/js/doc.js b/src/main/js/doc.js index 36f2224c..4f492036 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -26,7 +26,6 @@ import { reportError, reportFatal, reportWarning } from "./error.js"; import { ns_ebutts, ns_ittp, ns_itts, ns_tt, ns_ttp, ns_tts } from "./names.js"; -import { createSAXParserFromDOMParser } from "./parser.js"; import { byName, byQName } from "./styles.js"; import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; @@ -82,7 +81,7 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ -export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParserFromDOMParser()) { +export function fromXML(xmlstring, errorHandler, metadataHandler, parser) { const estack = []; const xmllangstack = []; const xmlspacestack = []; diff --git a/src/main/js/dom_to_parser.js b/src/main/js/dom_to_parser.js new file mode 100644 index 00000000..7755bc0d --- /dev/null +++ b/src/main/js/dom_to_parser.js @@ -0,0 +1,115 @@ +/* + * Copyright (c) Sandflow Consulting LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Implements an XML parser from the web browser's DOMParser + * + * @module parser + */ + +/** + * @typedef {import("./parser.js").Node} Node + * @typedef {import("./parser.js").Parser} Parser + * @typedef {import("./parser.js").Attribute} Attribute + */ + +export class XMLParser { + /** + * @param {Element} element + * @returns {Node} + */ + static toNode(element) { + const attrs = element.attributes; + const node = XMLParser.toNS(element); + node.attributes = {}; + + for (let i = 0, len = attrs.length; i < len; i++) { + const attr = attrs[i]; + node.attributes[attr.name] = XMLParser.toNS(attr); + } + + return node; + } + + static toNS(node) { + return { + name: node.nodeName, + prefix: node.prefix, + local: node.localName, + uri: node.namespaceURI, + value: node.value, + }; + } + + onopentag = (node) => { console.log(node); } + ontext = (str) => { console.log(str); } + onclosetag = () => { } + + write(xmlstring) { + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlstring, "application/xml"); + const errorNode = doc.querySelector("parsererror"); + + if (errorNode) { + throw new Error("XML parsing error: " + errorNode.textContent); + } + + this.process(doc.documentElement); + + return this; + } + + process(element) { + const node = XMLParser.toNode(element); + this.onopentag(node); + + const children = element.childNodes; + + for (let i = 0, len = children.length; i < len; i++) { + const child = children[i]; + + if (child.nodeType === Node.TEXT_NODE) { + this.ontext(child.textContent); + } else if (child.nodeType === Node.ELEMENT_NODE) { + this.process(child); + } + } + + this.onclosetag(); + } + + close() { + return this; + } +} + +/** + * @returns {Parser} + */ +export function createSAXParserFromDOMParser() { + return new XMLParser(); +} + diff --git a/src/main/js/main.js b/src/main/js/main.js index eec3d35a..f0557fdd 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -27,4 +27,4 @@ export { fromXML } from "./doc.js"; export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; -export { createSAXParserFromDOMParser } from "./parser.js"; +export { createSAXParserFromDOMParser } from "./dom_to_parser.js"; diff --git a/src/main/js/parser.js b/src/main/js/parser.js index 9b5d7973..4d6d6d29 100644 --- a/src/main/js/parser.js +++ b/src/main/js/parser.js @@ -1,3 +1,35 @@ +/* + * Copyright (c) Sandflow Consulting LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Defines the contract for the parser expected by doc.js + * + * @module parser + */ + /** * @typedef {Object} Attribute * @property {string} name @@ -26,80 +58,4 @@ * @property {() => void} onclosetag */ -export class XMLParser { - /** - * @param {Element} element - * @returns {Node} - */ - static toNode(element) { - const attrs = element.attributes; - const node = XMLParser.toNS(element); - node.attributes = {}; - - for (let i = 0, len = attrs.length; i < len; i++) { - const attr = attrs[i]; - node.attributes[attr.name] = XMLParser.toNS(attr); - } - - return node; - } - - static toNS(node) { - return { - name: node.nodeName, - prefix: node.prefix, - local: node.localName, - uri: node.namespaceURI, - value: node.value, - }; - } - - onopentag = (node) => { console.log(node); } - ontext = (str) => { console.log(str); } - onclosetag = () => { } - - write(xmlstring) { - const parser = new DOMParser(); - const doc = parser.parseFromString(xmlstring, "application/xml"); - const errorNode = doc.querySelector("parsererror"); - - if (errorNode) { - throw new Error("XML parsing error: " + errorNode.textContent); - } - - this.process(doc.documentElement); - - return this; - } - - process(element) { - const node = XMLParser.toNode(element); - this.onopentag(node); - - const children = element.childNodes; - - for (let i = 0, len = children.length; i < len; i++) { - const child = children[i]; - - if (child.nodeType === Node.TEXT_NODE) { - this.ontext(child.textContent); - } else if (child.nodeType === Node.ELEMENT_NODE) { - this.process(child); - } - } - - this.onclosetag(); - } - - close() { - return this; - } -} - -/** - * @returns {Parser} - */ -export function createSAXParserFromDOMParser() { - return new XMLParser(); -} - +export {}; From 3440a147e513ed1988eb0ff0d7de730f0fcaef44 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:20:06 -0400 Subject: [PATCH 13/14] fix: pass the parser explicitly in gen-renders and guard fromXML Follow-up to the rd/minor-refactor-to-259 merge, which made the parser argument to fromXML() required: - gen-renders.js relied on the removed default; it now passes createSAXParserFromDOMParser() explicitly - fromXML() reports a fatal error when called without a parser, so consumers get a clear message instead of a TypeError from parser internals - the parser JSDoc param is no longer marked optional, so the emitted type declarations match the required argument Co-Authored-By: Claude Fable 5 --- src/main/js/doc.js | 6 +++++- src/test/js/RequiredParserTest.js | 20 ++++++++++++++++++++ src/test/webapp/js/gen-renders.js | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/test/js/RequiredParserTest.js diff --git a/src/main/js/doc.js b/src/main/js/doc.js index 4f492036..ccd809d9 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -77,11 +77,15 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @param {string} xmlstring XML document * @param {ErrorHandler} errorHandler Error callback * @param {?MetadataHandler} metadataHandler Callback for elements - * @param {?Parser} parser XML parser + * @param {Parser} parser XML parser * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ export function fromXML(xmlstring, errorHandler, metadataHandler, parser) { + if (!parser) { + reportFatal(errorHandler, "No parser provided"); + } + const estack = []; const xmllangstack = []; const xmlspacestack = []; diff --git a/src/test/js/RequiredParserTest.js b/src/test/js/RequiredParserTest.js new file mode 100644 index 00000000..fe7a361d --- /dev/null +++ b/src/test/js/RequiredParserTest.js @@ -0,0 +1,20 @@ +import { equal, throws } from "node:assert"; +import { test } from "node:test"; +import { fromXML } from "../../main/js/doc.js"; + +test("fromXML requires a parser", () => { + + let fatal_msg = null; + + const errorHandler = { + info: function () { }, + warn: function () { }, + error: function () { }, + fatal: function (msg) { fatal_msg = msg; }, + }; + + throws(() => fromXML("", errorHandler)); + + equal(fatal_msg, "No parser provided"); + +}); diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index e25a803c..3cc40626 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -94,7 +94,7 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo) { return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { - var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler); + var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, null, imsc.createSAXParserFromDOMParser()); test_renders_dir.file("doc.json", JSON.stringify( From ae4d2f6d171437cc3b112b020e6dc8d709b29659 Mon Sep 17 00:00:00 2001 From: Casey Occhialini <1508707+littlespex@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:47:38 -0400 Subject: [PATCH 14/14] refactor: split fromXML into a parser-agnostic core and entry wrapper Per review feedback on #259: doc.js now exports fromParser(), which requires a parser, and main.js exports fromXML() with the original three-argument signature, defaulting to the DOMParser-backed parser. gen-renders and the README signature are unchanged from v1 usage; tests call fromParser() directly. Co-Authored-By: Claude Fable 5 --- src/main/js/doc.js | 2 +- src/main/js/isd.js | 2 +- src/main/js/main.js | 27 +++++++++++++++++++++++++-- src/test/js/RequiredParserTest.js | 8 +++++--- src/test/js/utils/getIMSC1Document.js | 4 ++-- src/test/webapp/js/gen-renders.js | 2 +- 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/js/doc.js b/src/main/js/doc.js index ccd809d9..3cd709f4 100644 --- a/src/main/js/doc.js +++ b/src/main/js/doc.js @@ -81,7 +81,7 @@ import { ComputedLength, hasOwnProperty, parseLength } from "./utils.js"; * @returns {?TT} Opaque in-memory representation of an IMSC1 document */ -export function fromXML(xmlstring, errorHandler, metadataHandler, parser) { +export function fromParser(xmlstring, errorHandler, metadataHandler, parser) { if (!parser) { reportFatal(errorHandler, "No parser provided"); } diff --git a/src/main/js/isd.js b/src/main/js/isd.js index f3e677ad..11b6fe27 100644 --- a/src/main/js/isd.js +++ b/src/main/js/isd.js @@ -38,7 +38,7 @@ import { ComputedLength, hasOwnProperty } from "./utils.js"; */ /** - * Creates a canonical representation of an IMSC1 document returned by
imscDoc.fromXML()
+ * Creates a canonical representation of an IMSC1 document returned by
fromXML()
* at a given absolute offset in seconds. This offset does not have to be one of the values returned * by
getMediaTimeEvents()
. * diff --git a/src/main/js/main.js b/src/main/js/main.js index f0557fdd..ca832e9c 100644 --- a/src/main/js/main.js +++ b/src/main/js/main.js @@ -24,7 +24,30 @@ * POSSIBILITY OF SUCH DAMAGE. */ -export { fromXML } from "./doc.js"; +import { fromParser } from "./doc.js"; +import { createSAXParserFromDOMParser } from "./dom_to_parser.js"; + export { renderHTML } from "./html.js"; export { generateISD } from "./isd.js"; -export { createSAXParserFromDOMParser } from "./dom_to_parser.js"; +export { createSAXParserFromDOMParser }; + +/** + * @typedef {import("./error.js").ErrorHandler} ErrorHandler + * @typedef {import("./doc.js").MetadataHandler} MetadataHandler + * @typedef {import("./doc.js").TT} TT + * @typedef {import("./parser.js").Parser} Parser + */ + +/** + * Parses an IMSC1 document into an opaque in-memory representation, using the + * DOMParser-backed parser unless a parser is provided. + * + * @param {string} xmlstring XML document + * @param {ErrorHandler} errorHandler Error callback + * @param {?MetadataHandler} metadataHandler Callback for elements + * @param {?Parser} parser XML parser + * @returns {?TT} Opaque in-memory representation of an IMSC1 document + */ +export function fromXML(xmlstring, errorHandler, metadataHandler, parser = createSAXParserFromDOMParser()) { + return fromParser(xmlstring, errorHandler, metadataHandler, parser); +} diff --git a/src/test/js/RequiredParserTest.js b/src/test/js/RequiredParserTest.js index fe7a361d..54e63ca8 100644 --- a/src/test/js/RequiredParserTest.js +++ b/src/test/js/RequiredParserTest.js @@ -1,8 +1,10 @@ import { equal, throws } from "node:assert"; import { test } from "node:test"; -import { fromXML } from "../../main/js/doc.js"; +import { fromParser } from "../../main/js/doc.js"; -test("fromXML requires a parser", () => { +const XML = '

hello

'; + +test("fromParser requires a parser", () => { let fatal_msg = null; @@ -13,7 +15,7 @@ test("fromXML requires a parser", () => { fatal: function (msg) { fatal_msg = msg; }, }; - throws(() => fromXML("", errorHandler)); + throws(() => fromParser(XML, errorHandler)); equal(fatal_msg, "No parser provided"); diff --git a/src/test/js/utils/getIMSC1Document.js b/src/test/js/utils/getIMSC1Document.js index 386bbc06..b1f94ec9 100644 --- a/src/test/js/utils/getIMSC1Document.js +++ b/src/test/js/utils/getIMSC1Document.js @@ -1,5 +1,5 @@ import fs from "node:fs/promises"; -import { fromXML } from "../../../main/js/doc.js"; +import { fromParser } from "../../../main/js/doc.js"; import { createSAXParser } from "./saxParser.js"; const errorHandler = { @@ -19,5 +19,5 @@ const errorHandler = { export async function getIMSC1Document(url, metadataHandler) { const contents = await fs.readFile(url, "utf8"); - return fromXML(contents, errorHandler, metadataHandler, createSAXParser()); + return fromParser(contents, errorHandler, metadataHandler, createSAXParser()); } diff --git a/src/test/webapp/js/gen-renders.js b/src/test/webapp/js/gen-renders.js index 3cc40626..e25a803c 100644 --- a/src/test/webapp/js/gen-renders.js +++ b/src/test/webapp/js/gen-renders.js @@ -94,7 +94,7 @@ function asyncProcessRefFile(reffiles_root, renders_dir, pngs_dir, finfo) { return asyncLoadFile(getReferenceFilePath(reffiles_root, finfo.path)) .then(function (contents) { - var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler, null, imsc.createSAXParserFromDOMParser()); + var doc = imsc.fromXML(contents.replace(/\r\n/g, '\n'), errorHandler); test_renders_dir.file("doc.json", JSON.stringify(