From cf618eb5c459fcb2c75a9ca1c1d59d30775982f2 Mon Sep 17 00:00:00 2001 From: Grzegorz Zachar Date: Wed, 23 Feb 2022 10:02:38 +0100 Subject: [PATCH 01/28] POC --- devtools/lightning-inspect.js | 7 ++++--- examples/mouse-pointer/basic-usage.html | 3 +-- src/application/Application.mjs | 2 +- src/tree/Stage.mjs | 14 ++++++++++++++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/devtools/lightning-inspect.js b/devtools/lightning-inspect.js index 1417d51a..ea0013b8 100644 --- a/devtools/lightning-inspect.js +++ b/devtools/lightning-inspect.js @@ -194,12 +194,13 @@ window.attachInspector = function({Application, Element, ElementCore, Stage, Com document.body.appendChild(root); var self = this; let updateRootStyleFromCanvas = function (bcr) { + const p = self.stage.getRenderPrecision() / self.stage.getOption('devicePixelRatio'); root.style.left = bcr.left + 'px'; root.style.top = bcr.top + 'px'; - root.style.width = Math.ceil(bcr.width / self.stage.getRenderPrecision()) + 'px'; - root.style.height = Math.ceil(bcr.height / self.stage.getRenderPrecision()) + 'px'; + root.style.width = Math.ceil(bcr.width / p) + 'px'; + root.style.height = Math.ceil(bcr.height / p) + 'px'; root.style.transformOrigin = '0 0 0'; - root.style.transform = 'scale(' + self.stage.getRenderPrecision() + ',' + self.stage.getRenderPrecision() + ')'; + root.style.transform = 'scale(' + p + ',' + p + ')'; } if (ResizeObserver != null) { diff --git a/examples/mouse-pointer/basic-usage.html b/examples/mouse-pointer/basic-usage.html index c6092813..9399148b 100644 --- a/examples/mouse-pointer/basic-usage.html +++ b/examples/mouse-pointer/basic-usage.html @@ -74,8 +74,7 @@ } - const options = {stage: {w: 900, h: 900, clearColor: 0xFF000000, canvas2d: false, useImageWorker: false}, debug: true, enablePointer: ENABLE_POINTER} - + const options = {stage: {w: 1080, h: 720, clearColor: 0xFF000000, canvas2d: false, useImageWorker: false, devicePixelRatio: 2}, debug: true, enablePointer: ENABLE_POINTER} const app = new BasicUsageExample(options); document.body.appendChild(app.stage.getCanvas()); diff --git a/src/application/Application.mjs b/src/application/Application.mjs index 5100f6a2..adb8b623 100644 --- a/src/application/Application.mjs +++ b/src/application/Application.mjs @@ -606,7 +606,7 @@ export default class Application extends Component { // and perform collision detection while (n--) { const child = affectedChildren[n]; - const precision = this.stage.getRenderPrecision(); + const precision = this.stage.getRenderPrecision() / this.stage.getOption('devicePixelRatio'); const ctx = child.core._worldContext; const cx = ctx.px * precision; diff --git a/src/tree/Stage.mjs b/src/tree/Stage.mjs index 099371bf..3da40eb5 100644 --- a/src/tree/Stage.mjs +++ b/src/tree/Stage.mjs @@ -77,6 +77,11 @@ export default class Stage extends EventEmitter { // Override width and height. if (this.getCanvas()) { + if (this.getOption('devicePixelRatio') !== 1) { + const ratio = this.getOption('devicePixelRatio'); + this.getCanvas().style.width = this._options['w'] / ratio + 'px'; + this.getCanvas().style.height = this._options['h'] / ratio + 'px'; + } this._options.w = this.getCanvas().width; this._options.h = this.getCanvas().height; } @@ -186,6 +191,15 @@ export default class Stage extends EventEmitter { opt('canvas2d', false); opt('platform', null); opt('readPixelsBeforeDraw', false); + opt('devicePixelRatio', 1) + + if (o['devicePixelRatio'] != null && o['devicePixelRatio'] !== 1) { + console.log('o', o) + this._options['precision'] *= o['devicePixelRatio'] + this._options['w'] *= o['devicePixelRatio'] + this._options['h'] *= o['devicePixelRatio'] + + } } setApplication(app) { From 69152bb0b5dc6caad8a16ddb7eb1a7c310bb4400 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Mon, 23 Jan 2023 12:22:06 -0500 Subject: [PATCH 02/28] TypeScript: Fix generic paramater Ref value getByRef() bug Fixes #444 --- src/tree/Element.d.mts | 84 +++++++++++-- ...ent-generic-ref-type-subclassing.test-d.ts | 111 ++++++++++++++++++ test-d/Components/components-loose.test-d.ts | 1 - .../components-strong-typing.test-d.ts | 2 +- test-d/Elements/Element-Types.test-d.ts | 10 +- tsconfig.typedoc.json | 3 +- 6 files changed, 192 insertions(+), 19 deletions(-) create mode 100644 test-d/Components/component-generic-ref-type-subclassing.test-d.ts diff --git a/src/tree/Element.d.mts b/src/tree/Element.d.mts index ed5ba592..ce47f804 100644 --- a/src/tree/Element.d.mts +++ b/src/tree/Element.d.mts @@ -135,16 +135,16 @@ export type TransformPossibleElement = string extends keyof TemplateSpec ? true : false; /** - * Gets an object shape containing all the Refs (child Element / Components) in a TemplateSpec + * Remove index signatures from an object * * @privateRemarks - * The refs are transformed into proper Element / Component references + * Converts a loose Element template to a strong Element template by + * removing the index signature that Element.TemplateSpecLoose adds * * @hidden Internal use only */ -export type TemplateSpecRefs = { - [P in keyof TemplateSpec as TransformPossibleElement extends never ? never : P]: - TransformPossibleElement +export type RemoveIndex = { + [ K in keyof T as string extends K ? never : number extends K ? never : K ] : T[K] }; /** @@ -173,7 +173,7 @@ type IsTerminus = * tuple item is the value type for that path (wrapped in a single element tuple) * * @privateRemarks - * This is a helper type function for {@link TaggedElements} + * This is a helper type function for {@link TemplateSpecTags} * * Example: * @@ -232,7 +232,7 @@ type Join = * Combines tag paths returned by {@link SpecToTagPaths} into a complete flattened object shape * * @privateRemarks - * This is a helper type function for {@link TaggedElements}. + * This is a helper type function for {@link TemplateSpecTags}. * * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are * included. @@ -282,6 +282,55 @@ type CombineTagPaths = { never; } +/** + * Like {@link CombineTagPaths} but only includes the first level of refs from TagPaths + * + * @privateRemarks + * This is a helper type function for {@link TemplateSpecTags}. + * + * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are + * included. + * + * Example: + * + * ```ts + * type Result = CombineTagPaths< + * ['MyElement', [object]] | + * ['MyParentElement', [{ + * MyChildComponent: typeof MyComponent + * MyChildElement: { + * MyGrandChildElement: object + * } + * }]] | + * ['MyParentElement', 'MyChildComponent', [typeof MyComponent]] + * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | + * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + * > + * ``` + * + * equates to: + * + * ```ts + * type Result = { + * 'MyElement': object; + * 'MyParentElement': { + * MyChildComponent: typeof MyComponent + * MyChildElement: { + * MyGrandChildElement: object + * } + * }; + * } + * ``` + */ +type CombineTagPathsSingleLevel = { + [PathWithType in TagPaths as PathWithType extends [infer Key extends ValidRef, [any]] ? Key : never]: + PathWithType extends [any, [infer Type]] + ? + Type + : + never; +} + /** * Returns a flattened map of the TemplateSpec where each key is is a `.` separated tag path to an element * @@ -289,7 +338,7 @@ type CombineTagPaths = { * * Example: * ```ts - * type Result = TaggedElements<{ + * type Result = TemplateSpecTags<{ * MyElement: object * MyParentElement: { * MyChildComponent: typeof MyComponent @@ -319,10 +368,22 @@ type CombineTagPaths = { * * @hidden Internal use only */ -export type TaggedElements = { +export type TemplateSpecTags = { [K in keyof CombineTagPaths>]: TransformPossibleElement>[K]>; }; +/** + * Gets an object shape containing all the Refs (child Element / Components) in a TemplateSpec + * + * @privateRemarks + * The refs are transformed into proper Element / Component references + * + * @hidden Internal use only + */ +export type TemplateSpecRefs = { + [K in keyof CombineTagPathsSingleLevel>]: TransformPossibleElement>[K]>; +}; + // // Public types // @@ -1583,7 +1644,7 @@ declare class Element< * information. * @param tagName `.` separated tag path */ - tag>(tagName: Path): TaggedElements[Path] | undefined; + tag>>(tagName: Path): TemplateSpecTags>[Path] | undefined; tag(tagName: IsLooseTemplateSpec extends true ? string : never): any; /** * Returns all Elements from the subtree that have this tag. @@ -1606,7 +1667,8 @@ declare class Element< * * @param ref */ - getByRef>(ref: RefKey): TemplateSpecRefs[RefKey] | undefined; + getByRef>>(ref: RefKey): TemplateSpecRefs>[RefKey] | undefined; + getByRef(tagName: IsLooseTemplateSpec extends true ? string : never): any; /** * Get the location identifier of this Element diff --git a/test-d/Components/component-generic-ref-type-subclassing.test-d.ts b/test-d/Components/component-generic-ref-type-subclassing.test-d.ts new file mode 100644 index 00000000..c4d4a8f7 --- /dev/null +++ b/test-d/Components/component-generic-ref-type-subclassing.test-d.ts @@ -0,0 +1,111 @@ +import { expectType } from 'tsd'; +import lng from '../../index.js'; +import { TemplateSpecTags, TemplateSpecRefs } from '../../src/tree/Element.mjs'; + +/// +/// Test that we can create a Component class that accepts a generic Component type +/// for a Ref in its template spec +/// + +class Header extends lng.Component { + headerSpecificProperty = 'abc' +} + +export interface IPageTemplateSpec< + T extends lng.Component.Constructor = lng.Component.Constructor, +> extends lng.Component.TemplateSpec { + Header: typeof Header + Content: T +} + +export interface IPageTypeConfig extends lng.Component.TypeConfig { + IsPage: true +} + +export class Page + extends lng.Component, IPageTypeConfig> + implements lng.Component.ImplementTemplateSpec> +{ + static override _template(): lng.Component.Template { + return { + w: (w: number) => w, + h: (h: number) => h, + rect: true, + color: 0xff0e0e0e, + + Header: { + type: Header, + }, + Content: undefined, + } + } + + override _init() { + /// Content (Direct checks) + expectType>["Content"]>>(this.Content_tag); + expectType>["Content"]>>(this.Content_getByRef); + expectType>["Content"] | undefined>(this.tag('Content')); + expectType>["Content"] | undefined>(this.getByRef('Content')); + + /// Content (Upcast checks) + expectType((this as Page).Content_tag); + expectType((this as Page).Content_getByRef); + expectType((this as Page).tag('Content')); + expectType((this as Page).getByRef('Content')); + + /// Header (direct checks) + expectType>["Header"]>>(this.Header_tag); + expectType>["Header"]>>(this.Header_getByRef); + expectType>["Header"] | undefined>(this.tag('Header')); + expectType>["Header"] | undefined>(this.getByRef('Header')); + + /// Header (upcast checks) + expectType
((this as Page).Header_tag); + expectType
((this as Page).Header_getByRef); + expectType
((this as Page).tag('Header')); + expectType
((this as Page).getByRef('Header')); + } + + protected Content_tag = this.tag('Content')! + protected Content_getByRef = this.getByRef('Content')!; + + protected Header_tag = this.tag('Header')! + protected Header_getByRef = this.getByRef('Header')!; +} + + +class List extends lng.Component { + listSpecificProperty = true +} + +export class Discovery extends Page { + static override _template(): lng.Component.Template> { + // Must assert the specific template type to the type of the template spec + // because `super._template()` isn't/can't be aware of List + const pageTemplate = super._template() as lng.Component.Template< + IPageTemplateSpec + > + + pageTemplate.Content = { + type: List, + } + + return pageTemplate + } + + override _init() { + /// Content (in sub-class) + expectType(this.Content_tag); + expectType(this.Content_getByRef); + expectType(this.tag('Content')); + expectType(this.getByRef('Content')); + expectType(this.Content_tag.listSpecificProperty); + expectType(this.Content_getByRef.listSpecificProperty); + + /// Header (in sub-class) + expectType
(this.Header_tag); + expectType
(this.Header_getByRef); + expectType
(this.tag('Header')); + expectType
(this.getByRef('Header')); + } +} diff --git a/test-d/Components/components-loose.test-d.ts b/test-d/Components/components-loose.test-d.ts index 900c302b..0749262d 100644 --- a/test-d/Components/components-loose.test-d.ts +++ b/test-d/Components/components-loose.test-d.ts @@ -20,7 +20,6 @@ * Tests for loosely typed Components with TemplateSpecLoose */ import lng from '../../index.js'; -import { TaggedElements } from '../../src/tree/Element.mjs'; // Should be able to create a loose Component with unknown properties class MyLooseComponentA extends lng.Component { diff --git a/test-d/Components/components-strong-typing.test-d.ts b/test-d/Components/components-strong-typing.test-d.ts index 92b67033..815a5025 100644 --- a/test-d/Components/components-strong-typing.test-d.ts +++ b/test-d/Components/components-strong-typing.test-d.ts @@ -22,7 +22,7 @@ import { expectType } from 'tsd'; import { Lightning } from '../../index.typedoc.js'; -import { TaggedElements, SpecToTagPaths } from '../../src/tree/Element.mjs'; +import { TemplateSpecTags, SpecToTagPaths } from '../../src/tree/Element.mjs'; import { MyLooseComponentC } from './components-loose.test-d.js'; namespace MyComponentA { diff --git a/test-d/Elements/Element-Types.test-d.ts b/test-d/Elements/Element-Types.test-d.ts index ed1ac0d1..76148bcc 100644 --- a/test-d/Elements/Element-Types.test-d.ts +++ b/test-d/Elements/Element-Types.test-d.ts @@ -25,7 +25,7 @@ import { expectAssignable, expectType } from 'tsd'; import lng from '../../index.js'; import { CompileComponentTemplateSpecType } from '../../src/application/Component.mjs'; import { SignalMapType } from '../../src/internalTypes.mjs'; -import { InlineElement, IsLooseTemplateSpec, SmoothTemplate, TaggedElements, TemplateSpecRefs, TransformPossibleElement, TransitionsTemplate } from '../../src/tree/Element.mjs'; +import { InlineElement, IsLooseTemplateSpec, SmoothTemplate, TemplateSpecTags, TemplateSpecRefs, TransformPossibleElement, TransitionsTemplate } from '../../src/tree/Element.mjs'; export interface TestTemplateSpec extends lng.Component.TemplateSpec { prop1: string; @@ -302,11 +302,11 @@ function TemplateSpecRefs_Test() { } // -// TaggedElements +// TemplateSpecTags // -function TaggedElements_Test() { +function TemplateSpecTags_Test() { /// Strong template specs returns flat tag path map - type T1000 = TaggedElements; + type T1000 = TemplateSpecTags; expectType<{ 'MyStrongElement_InlineEmpty': lng.Element>; 'MyStrongElement_InlineEmpty2': lng.Element>; @@ -323,7 +323,7 @@ function TaggedElements_Test() { }>({} as T1000); /// Loose template specs return empty object type - type T2000 = TaggedElements; + type T2000 = TemplateSpecTags; expectType<{}>({} as T2000); } diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json index 063b64da..5e9d387f 100644 --- a/tsconfig.typedoc.json +++ b/tsconfig.typedoc.json @@ -23,12 +23,13 @@ "src/tree/Element.d.mts:TransitionsTemplate", "src/internalTypes.d.mts:HandlerReturnType", "src/tree/Element.d.mts:TemplateSpecRefs", - "src/tree/Element.d.mts:TaggedElements", + "src/tree/Element.d.mts:TemplateSpecTags", "src/animation/AnimationSettings.d.mts:AnimationForceLiteral", "src/animation/AnimationSettings.d.mts:AnimationForceType", "src/internalTypes.d.mts:HandlerParameters", "src/internalTypes.d.mts:EventMapType", "src/tree/Element.d.mts:IsLooseTemplateSpec", + "src/tree/Element.d.mts:RemoveIndex" ] } } From dc5a168dfc056a0c6ddc7e7d841cbf9db9d9db35 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Fri, 10 Feb 2023 16:45:11 -0500 Subject: [PATCH 03/28] Fix issue that affected the original tag() implementation and hence also the new getByRef() implementation... Using tag() on a Component that has a lower-case property of instance type `Element` or `Component` in its TemplateSpec resulted in tag() causing a very strange error due to "circular references". The new getByRef() implementation is based on how tag() originally worked and saw the same exact issue. The error was tracked back to IsTerminus returning `false` for any instance type of `Element` or `Component` and the fact that SpecToTagPaths did not filter out lower-case properties. This resulted in SpecToTagPaths recursively entering a lower-case `Element`/`Component` property (which is where it should have actually terminated recursion at) and then further recursively enter the instance's `stage`, `application`, `ctx`, etc properties ultimately resulting in a circular reference. SpecToTagPaths now only returns paths for upper case ValidRef properties. And IsTerminus returns true for `Element` and `Component`. I've also moved many of the internal type functions that existed in Element.d.mts into internalTypes.d.mts and added comprehensive unit tests for each of them. I've also added a test for the fixed scenario that was originally untested in components-strong-typing.test-d.ts. This has also been tested with the TypeScript version of TMDB which is how I originally found the issue. --- src/application/Component.d.mts | 4 +- src/internalTypes.d.mts | 200 ++++++++- src/tree/Element.d.mts | 200 +-------- .../components-strong-typing.test-d.ts | 6 +- test-d/internalTypes.test-d.ts | 397 +++++++++++++++++- tsconfig.typedoc.json | 2 +- 6 files changed, 596 insertions(+), 213 deletions(-) diff --git a/src/application/Component.d.mts b/src/application/Component.d.mts index bff33246..10ec476f 100644 --- a/src/application/Component.d.mts +++ b/src/application/Component.d.mts @@ -16,8 +16,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HandlerReturnType, HandlerParameters, SignalMapType } from "../internalTypes.mjs"; -import Element, { CompileElementTemplateSpecType, InlineElement, ValidRef } from "../tree/Element.mjs"; +import { HandlerReturnType, HandlerParameters, SignalMapType, ValidRef } from "../internalTypes.mjs"; +import Element, { CompileElementTemplateSpecType, InlineElement } from "../tree/Element.mjs"; import Stage from "../tree/Stage.mjs"; import Application from "./Application.mjs"; diff --git a/src/internalTypes.d.mts b/src/internalTypes.d.mts index c812c3e8..c3e4a96c 100644 --- a/src/internalTypes.d.mts +++ b/src/internalTypes.d.mts @@ -130,4 +130,202 @@ export type HandlerReturnType = ? ReturnType : - void; \ No newline at end of file + void; + +/** + * Set of all capital letters + * + * @hidden Internal use only + */ +type Alphabet = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'; + +/** + * Any string that begins with a capital letter + * + * @hidden Internal use only + */ +export type ValidRef = `${Alphabet}${string}`; + +/** + * Returns `true` if T is a type that should terminate the calculation of + * tag paths. + * + * @hidden Internal use only + */ +type IsTerminus = + T extends (string | number | boolean | any[] | Element.Constructor | Element) + ? + true + : + T extends object + ? + object extends T + ? + true + : + false + : + false + +/** + * Generates a union of template spec object path string tuples where the last + * tuple item is the value type for that path (wrapped in a single element tuple) + * + * @privateRemarks + * This is a helper type function for {@link TemplateSpecTags} + * + * Example: + * + * ```ts + * type Result = SpecToTagPaths<{ + * MyElement: object + * MyParentElement: { + * MyChildComponent: typeof MyComponent + * MyChildElement: { + * MyGrandChildElement: object + * } + * } + * }> + * ``` + * + * Equates to: + * + * ```ts + * type Result = + * ['MyElement', [object]] | + * ['MyParentElement', [{ + * MyChildComponent: typeof MyComponent + * MyChildElement: { + * MyGrandChildElement: object + * } + * }]] | + * ['MyParentElement', 'MyChildComponent', [typeof MyComponent]] + * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | + * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]]; + * ``` + * + * @hidden Internal use only + */ +export type SpecToTagPaths = + IsTerminus extends true + ? + [[T]] + : + { + [K in Extract]: [K, ...SpecToTagPaths] | [K, [T[K]]] + }[Extract] + +/** + * Joins the given path string tuple into a single `.` separated string tag path + * + * @hidden Internal use only + */ +export type Join = + T extends [] ? never : + T extends [infer F] ? F : + T extends [infer F, ...infer R] ? + F extends string ? + `${F}.${Join>}` : never : string; + +/** + * Combines tag paths returned by {@link SpecToTagPaths} into a complete flattened object shape + * + * @privateRemarks + * This is a helper type function for {@link TemplateSpecTags}. + * + * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are + * included. + * + * Example: + * + * ```ts + * type Result = CombineTagPaths< + * ['MyElement', [object]] | + * ['MyParentElement', [{ + * MyChildComponent: typeof Component + * MyChildElement: { + * MyGrandChildElement: object + * } + * }]] | + * ['MyParentElement', 'MyChildComponent', [typeof Component]] + * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | + * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + * > + * ``` + * + * equates to: + * + * ```ts + * type Result = { + * 'MyElement': object; + * 'MyParentElement': { + * MyChildComponent: typeof Component + * MyChildElement: { + * MyGrandChildElement: object + * } + * }; + * 'MyParentElement.MyChildComponent': typeof Component; + * 'MyParentElement.MyChildElement': { MyGrandChildElement: object }; + * 'MyParentElement.MyChildElement.MyGrandChildElement': object + * } + * ``` + * + * @hidden Internal use only + */ +export type CombineTagPaths = { + [PathWithType in TagPaths as PathWithType extends [...infer Path extends string[], [any]] ? Join : never]: + PathWithType extends [...any, [infer Type]] + ? + Type + : + never; +} + +/** + * Like {@link CombineTagPaths} but only includes the first level of refs from TagPaths + * + * @privateRemarks + * This is a helper type function for {@link TemplateSpecTags}. + * + * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are + * included. + * + * Example: + * + * ```ts + * type Result = CombineTagPathsSingleLevel< + * ['MyElement', [object]] | + * ['MyParentElement', [{ + * MyChildComponent: typeof Component + * MyChildElement: { + * MyGrandChildElement: object + * } + * }]] | + * ['MyParentElement', 'MyChildComponent', [typeof Component]] + * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | + * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + * > + * ``` + * + * equates to: + * + * ```ts + * type Result = { + * 'MyElement': object; + * 'MyParentElement': { + * MyChildComponent: typeof Component + * MyChildElement: { + * MyGrandChildElement: object + * } + * } + * } + * ``` + */ +export type CombineTagPathsSingleLevel = { + [PathWithType in TagPaths as PathWithType extends [infer Key extends string, [any]] ? Key : never]: + PathWithType extends [any, [infer Type]] + ? + Type + : + never; +} diff --git a/src/tree/Element.d.mts b/src/tree/Element.d.mts index ce47f804..7a432bfb 100644 --- a/src/tree/Element.d.mts +++ b/src/tree/Element.d.mts @@ -23,7 +23,7 @@ import TransitionSettings from "../animation/TransitionSettings.mjs"; import Component from "../application/Component.mjs"; import { AnimatableValueTypes, ExtractAnimatableValueTypes } from "../commonTypes.mjs"; import EventEmitter from "../EventEmitter.mjs"; -import { Documentation, EventMapType, ReduceSpecificity, SignalMapType, TextureType } from "../internalTypes.mjs"; +import { CombineTagPaths, CombineTagPathsSingleLevel, Documentation, EventMapType, ReduceSpecificity, SpecToTagPaths, TextureType, ValidRef } from "../internalTypes.mjs"; import TextTexture from "../textures/TextTexture.mjs"; import ElementCore from "./core/ElementCore.mjs"; import ElementTexturizer from "./core/ElementTexturizer.mjs"; @@ -37,20 +37,6 @@ import TextureSource from "./TextureSource.mjs"; // Private types // -/** - * Set of all capital letters - * - * @hidden Internal use only - */ -type Alphabet = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'; - -/** - * Any string that begins with a capital letter - * - * @hidden Internal use only - */ -export type ValidRef = `${Alphabet}${string}`; - /** * Filters out any non-ref keys from an inline Element template and returns the filtered * type with Strong Element template spec. @@ -147,190 +133,6 @@ export type RemoveIndex = { [ K in keyof T as string extends K ? never : number extends K ? never : K ] : T[K] }; -/** - * Returns `true` if T is a type that should terminate the calculation of - * tag paths. - * - * @hidden Internal use only - */ -type IsTerminus = - T extends (string | number | boolean | any[] | Element.Constructor) - ? - true - : - T extends object - ? - object extends T - ? - true - : - false - : - false - -/** - * Generates a union of template spec object path string tuples where the last - * tuple item is the value type for that path (wrapped in a single element tuple) - * - * @privateRemarks - * This is a helper type function for {@link TemplateSpecTags} - * - * Example: - * - * ```ts - * type Result = SpecToTagPaths<{ - * MyElement: object - * MyParentElement: { - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * } - * }> - * ``` - * - * Equates to: - * - * ```ts - * type Result = - * ['MyElement', [object]] | - * ['MyParentElement', [{ - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * }]] | - * ['MyParentElement', 'MyChildComponent', [typeof MyComponent]] - * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | - * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]]; - * ``` - * - * @hidden Internal use only - */ -export type SpecToTagPaths = - IsTerminus extends true - ? - [[T]] - : - { - [K in Extract]: [K, ...SpecToTagPaths] | [K, [T[K]]] - }[Extract] - -/** - * Joins the given path string tuple into a single `.` separated string tag path - * - * @hidden Internal use only - */ -type Join = - T extends [] ? never : - T extends [infer F] ? F : - T extends [infer F, ...infer R] ? - F extends string ? - `${F}.${Join>}` : never : string; - -/** - * Combines tag paths returned by {@link SpecToTagPaths} into a complete flattened object shape - * - * @privateRemarks - * This is a helper type function for {@link TemplateSpecTags}. - * - * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are - * included. - * - * Example: - * - * ```ts - * type Result = CombineTagPaths< - * ['MyElement', [object]] | - * ['MyParentElement', [{ - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * }]] | - * ['MyParentElement', 'MyChildComponent', [typeof MyComponent]] - * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | - * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] - * > - * ``` - * - * equates to: - * - * ```ts - * type Result = { - * 'MyElement': object; - * 'MyParentElement': { - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * }; - * 'MyParentElement.MyChildComponent': typeof MyComponent; - * 'MyParentElement.MyChildElement': { MyGrandChildElement: object }; - * 'MyParentElement.MyChildElement.MyGrandChildElement': object - * } - * ``` - * - * @hidden Internal use only - */ -type CombineTagPaths = { - [PathWithType in TagPaths as PathWithType extends [...infer Path extends ValidRef[], [any]] ? Join : never]: - PathWithType extends [...any, [infer Type]] - ? - Type - : - never; -} - -/** - * Like {@link CombineTagPaths} but only includes the first level of refs from TagPaths - * - * @privateRemarks - * This is a helper type function for {@link TemplateSpecTags}. - * - * Only path elements that are a valid reference name (i.e. start with a capital letter {@link ValidRef}) are - * included. - * - * Example: - * - * ```ts - * type Result = CombineTagPaths< - * ['MyElement', [object]] | - * ['MyParentElement', [{ - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * }]] | - * ['MyParentElement', 'MyChildComponent', [typeof MyComponent]] - * ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] | - * ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] - * > - * ``` - * - * equates to: - * - * ```ts - * type Result = { - * 'MyElement': object; - * 'MyParentElement': { - * MyChildComponent: typeof MyComponent - * MyChildElement: { - * MyGrandChildElement: object - * } - * }; - * } - * ``` - */ -type CombineTagPathsSingleLevel = { - [PathWithType in TagPaths as PathWithType extends [infer Key extends ValidRef, [any]] ? Key : never]: - PathWithType extends [any, [infer Type]] - ? - Type - : - never; -} - /** * Returns a flattened map of the TemplateSpec where each key is is a `.` separated tag path to an element * diff --git a/test-d/Components/components-strong-typing.test-d.ts b/test-d/Components/components-strong-typing.test-d.ts index 815a5025..7357f6e1 100644 --- a/test-d/Components/components-strong-typing.test-d.ts +++ b/test-d/Components/components-strong-typing.test-d.ts @@ -22,7 +22,6 @@ import { expectType } from 'tsd'; import { Lightning } from '../../index.typedoc.js'; -import { TemplateSpecTags, SpecToTagPaths } from '../../src/tree/Element.mjs'; import { MyLooseComponentC } from './components-loose.test-d.js'; namespace MyComponentA { @@ -193,6 +192,9 @@ class MyComponentB extends Lightning.Component implem namespace MyComponentC { export interface TemplateSpec extends Lightning.Component.TemplateSpec { propC: string; + /// Make sure an element can be specified as a property + /// Previously adding a property like this completely broke tag/getByRef for the component + elementProp: Lightning.Element; MyComponentB: typeof MyComponentB; MyLooseComponentC: typeof MyLooseComponentC; } @@ -326,6 +328,8 @@ class MyComponentC extends Lightning.Component implem propC: string = ''; + elementProp: Lightning.Element = this.tag('MyComponentB')!; + get MyLooseComponentC(): MyLooseComponentC { return this.getByRef('MyLooseComponentC')!; } diff --git a/test-d/internalTypes.test-d.ts b/test-d/internalTypes.test-d.ts index 23dc02d9..9c9eacbd 100644 --- a/test-d/internalTypes.test-d.ts +++ b/test-d/internalTypes.test-d.ts @@ -16,33 +16,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { expectError, expectType } from "tsd"; -import { EventMapType, ReduceSpecificity, SignalMapType, TextureType } from "../src/internalTypes.mjs"; +import { expectAssignable, expectError, expectNotAssignable, expectType } from "tsd"; +import { CombineTagPaths, CombineTagPathsSingleLevel, EventMapType, IsTerminus, Join, ReduceSpecificity, SignalMapType, SpecToTagPaths, TextureType, ValidRef } from "../src/internalTypes.mjs"; import Application from '../src/application/Application.mjs'; import Component from '../src/application/Component.mjs'; import Element from '../src/application/Component.mjs'; import Texture from "../src/tree/Texture.mjs"; function ReduceSpecificity_Tests() { - // Should work for a single type passed to param U + /// Should work for a single type passed to param U function IndividualTypes() { - // string + /// string expectType({} as ReduceSpecificity<'string literal', string>); expectType({} as ReduceSpecificity<'another string literal', string>); expectType({} as ReduceSpecificity<32472398, string>); expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); - // boolean (special case) + /// boolean (special case) expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity<'not a boolean', boolean>); - // number + /// number expectType({} as ReduceSpecificity<1234, number>); expectType({} as ReduceSpecificity<4321, number>); expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); - // Should be able to reflect already non-specific in param T types back + /// Should be able to reflect already non-specific in param T types back function Identity() { expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); @@ -50,7 +50,7 @@ function ReduceSpecificity_Tests() { } } - // Should work for a union of types in param U + /// Should work for a union of types in param U function MultipleTypes() { expectType({} as ReduceSpecificity<'string literal', string | boolean | number>); expectType({} as ReduceSpecificity<'another string literal', string | boolean | number>); @@ -59,7 +59,7 @@ function ReduceSpecificity_Tests() { expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); - // Should be able to reflect already non-specific in param T types back + /// Should be able to reflect already non-specific in param T types back function Identity() { expectType({} as ReduceSpecificity); expectType({} as ReduceSpecificity); @@ -109,4 +109,383 @@ function SignalMapType_Tests() { // @ts-expect-error Providing an empty object type is not supported type T1000 = SignalMapType<{}>; +} + +function ValidRef_Tests() { + /// Should allow all strings that begin with a capital letter to be assigned + expectAssignable('Apple'); + expectAssignable('Blueberry'); + expectAssignable('Cat'); + expectAssignable('Dog'); + expectAssignable('Earth'); + expectAssignable('Farm'); + expectAssignable('Gorge'); + expectAssignable('Horse'); + expectAssignable('Ice'); + expectAssignable('Jelly'); + expectAssignable('Kite'); + expectAssignable('Lemon'); + expectAssignable('Mango'); + expectAssignable('Nest'); + expectAssignable('Orange'); + expectAssignable('Pineapple'); + expectAssignable('Quail'); + expectAssignable('Rabbit'); + expectAssignable('Squirrel'); + expectAssignable('Testing123'); + expectAssignable('Umbrella'); + expectAssignable('Vine'); + expectAssignable('WaterBuffalo'); + expectAssignable('Xylophone'); + expectAssignable('Yak'); + expectAssignable('Zebra'); + + /// Should not allow any strings that begin with a lowercase letter to be assigned + expectNotAssignable('apple'); + expectNotAssignable('blueberry'); + expectNotAssignable('cat'); + expectNotAssignable('dog'); + expectNotAssignable('earth'); + expectNotAssignable('farm'); + expectNotAssignable('gorge'); + expectNotAssignable('horse'); + expectNotAssignable('ice'); + expectNotAssignable('jelly'); + expectNotAssignable('kite'); + expectNotAssignable('lemon'); + expectNotAssignable('mango'); + expectNotAssignable('nest'); + expectNotAssignable('orange'); + expectNotAssignable('pineapple'); + expectNotAssignable('quail'); + expectNotAssignable('rabbit'); + expectNotAssignable('squirrel'); + expectNotAssignable('testing123'); + expectNotAssignable('umbrella'); + expectNotAssignable('vine'); + expectNotAssignable('waterBuffalo'); + expectNotAssignable('xylophone'); + expectNotAssignable('yak'); + expectNotAssignable('zebra'); + + /// Should not allow any strings that begin with other characters to be assigned + expectNotAssignable('1apple'); + expectNotAssignable('2blueberry'); + expectNotAssignable('3cat'); + expectNotAssignable('4dog'); + expectNotAssignable('5earth'); + expectNotAssignable('6farm'); + expectNotAssignable('7gorge'); + expectNotAssignable('8horse'); + expectNotAssignable('9ice'); + expectNotAssignable('_jelly'); + expectNotAssignable('!kite'); + expectNotAssignable('@lemon'); + expectNotAssignable('#mango'); + expectNotAssignable('$nest'); + expectNotAssignable('%orange'); + expectNotAssignable('^pineapple'); + expectNotAssignable('&quail'); + expectNotAssignable('*rabbit'); + expectNotAssignable('(squirrel)'); + expectNotAssignable(')testing123'); + expectNotAssignable('-umbrella'); + expectNotAssignable('+vine'); + expectNotAssignable('=waterBuffalo'); + expectNotAssignable('[xylophone]'); + expectNotAssignable('{yak}'); + expectNotAssignable('}zebra{'); +} + +function IsTerminus_Tests() { + /// The following should be considered terminus types + // Empty objects + expectType({} as IsTerminus<{}>); + // Strings + expectType({} as IsTerminus<'abc'>); + expectType({} as IsTerminus<'CBA'>); + // Numbers + expectType({} as IsTerminus<123>); + expectType({} as IsTerminus<321>); + // Booleans + expectType({} as IsTerminus); + expectType({} as IsTerminus); + // Any array + expectType({} as IsTerminus<[]>); + expectType({} as IsTerminus<['abc', 123]>); + expectType({} as IsTerminus<[true, false]>); + expectType({} as IsTerminus<[Element, typeof Element]>); + // Element / Component Constructor + expectType({} as IsTerminus); + expectType({} as IsTerminus); + // Element / Component Instance + expectType({} as IsTerminus); + expectType({} as IsTerminus); + + /// The following should NOT be considered terminus types + // Objects with properties + expectType({} as IsTerminus<{ a: number }>); + expectType({} as IsTerminus<{ B: typeof Element }>); + expectType({} as IsTerminus<{ c: Element }>); + expectType({} as IsTerminus<{ + a: number; + B: typeof Element; + c: Element + }>); +} + +function SpecToTagPaths_Tests() { + /// Direct Terminus Types + function TerminusTypes() { + /// Empty Object + expectType<[[object]]>({} as SpecToTagPaths); + + /// Empty Object (bracket form) + expectType<[[{}]]>({} as SpecToTagPaths<{}>); + + /// String + expectType<[[string]]>({} as SpecToTagPaths); + expectType<[['abc']]>({} as SpecToTagPaths<'abc'>); + + /// Number + expectType<[[number]]>({} as SpecToTagPaths); + expectType<[[123]]>({} as SpecToTagPaths<123>); + + /// Boolean + expectType<[[boolean]]>({} as SpecToTagPaths); + expectType<[[false]]>({} as SpecToTagPaths); + + /// Array + expectType<[[[]]]>({} as SpecToTagPaths<[]>); + expectType<[[[true, 'abc']]]>({} as SpecToTagPaths<[true, 'abc']>); + expectType<[[[Element, typeof Element]]]>({} as SpecToTagPaths<[Element, typeof Element]>); + + /// Element / Component Constructor + expectType<[[typeof Element]]>({} as SpecToTagPaths); + expectType<[[typeof Component]]>({} as SpecToTagPaths); + + /// Element Instance + expectType<[[Element]]>({} as SpecToTagPaths); + expectType<[[Component]]>({} as SpecToTagPaths); + } + + /// Single Level All Terminus Types + type T2000 = SpecToTagPaths<{ + EmptyObject: object + EmptyObject_BracketForm: {} + String: 'abc' + Number: 123 + Boolean: true + Array: [] + ElementConstructor: typeof Element + ElementInstance: Element + }> + expectType< + ["EmptyObject", [object]] | + ["EmptyObject_BracketForm", [{}]] | + ["String", ['abc']] | + ["Number", [123]] | + ["Boolean", [true]] | + ["Array", [[]]] | + ["ElementConstructor", [typeof Element]] | + ["ElementInstance", [Element]] + >({} as T2000); + + /// Non-Ref Props (Lower case props) should be ignored and result in `never` + type T3000 = SpecToTagPaths<{ + prop1: number, + prop2: string, + prop3: boolean, + prop4: typeof Element, + prop5: Element, + prop6: object, + prop7: {}, + prop8: [], + }> + expectType({} as T3000); + + /// Complex nested structure + type T5000 = SpecToTagPaths<{ + prop1: number, + MyElement: object + MyParentElement: { + nestedProp: string, + MyChildComponent: typeof Component + MyChildElement: { + evenMoreNestedProp: boolean, + MyGrandChildElement: object + } + } + }> + expectType< + ['MyElement', [object]] | + ['MyParentElement', [{ + nestedProp: string, + MyChildComponent: typeof Component + MyChildElement: { + evenMoreNestedProp: boolean, + MyGrandChildElement: object + } + }]] | + ['MyParentElement', 'MyChildComponent', [typeof Component]] | + ['MyParentElement', 'MyChildElement', [{ + evenMoreNestedProp: boolean, + MyGrandChildElement: object + }]] | + ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + >({} as T5000); +} + +function Join_Tests() { + /// Empty Array should result in never + expectType({} as Join<[]>); + + /// Single item array should result in that item + expectType<''>({} as Join<['']>); + expectType<'abc'>({} as Join<['abc']>); + + /// Multiple item array should result in a string with the items joined by a dot + expectType<'a.b'>({} as Join<['a', 'b']>); + expectType<'1.2.3'>({} as Join<['1', '2', '3']>); + expectType<'a.Very.Long.joined.String.123'>({} as Join<[ + 'a', 'Very', 'Long', 'joined', 'String', '123' + ]>); +} + +function CombineTagPaths_Tests() { + /// Never should result in an empty object + type T1000 = CombineTagPaths; + expectType<{}>({} as T1000); + + /// Should transform a single tag path into a flat object + type T2000 = CombineTagPaths< + ['prop', [object]] + > + expectType<{ + prop: object + }>({} as T2000); + + /// Should transform a many tag paths into a flat object + type T3000 = CombineTagPaths< + | ['A', ['abc']] + | ['a', 'B', [123]] + | ['C', 'd', '1', '2', [true]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Element', [typeof Element]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Component', [typeof Component]] + > + expectType<{ + A: "abc"; + "a.B": 123; + "C.d.1.2": true; + "MyChild.MyGrandChild.MyGreatGrandChild_Element": typeof Element; + "MyChild.MyGrandChild.MyGreatGrandChild_Component": typeof Component; + }>({} as T3000); + + /// The documented example should work + type T4000 = CombineTagPaths< + | ['MyElement', [object]] + | ['MyParentElement', [{ + MyChildComponent: typeof Component + MyChildElement: { + MyGrandChildElement: object + } + }]] + | ['MyParentElement', 'MyChildComponent', [typeof Component]] + | ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] + | ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + > + expectType<{ + 'MyElement': object; + 'MyParentElement': { + MyChildComponent: typeof Component + MyChildElement: { + MyGrandChildElement: object + } + }; + 'MyParentElement.MyChildComponent': typeof Component; + 'MyParentElement.MyChildElement': { MyGrandChildElement: object }; + 'MyParentElement.MyChildElement.MyGrandChildElement': object + }>({} as T4000); +} + +function CombineTagPathsSingleLevel_Tests() { + /// Never should result in an empty object + type T1000 = CombineTagPathsSingleLevel; + expectType<{}>({} as T1000); + + /// Should transform a single tag path into a flat object (Only if the tag path is a single level) + type T2000 = CombineTagPathsSingleLevel< + ['prop', [object]] + > + expectType<{ + prop: object + }>({} as T2000); + + /// Should transform a many tag paths into a flat object (Only if the tag path is a single level) + type T3000 = CombineTagPathsSingleLevel< + | ['A', ['abc']] + | ['a', [123]] + | ['C', [true]] + | ['MyChild', [typeof Element]] + | ['MyChild2', [typeof Component]] + > + expectType<{ + A: "abc"; + "a": 123; + "C": true; + "MyChild": typeof Element; + "MyChild2": typeof Component; + }>({} as T3000); + + /// Should return empty object if all tag paths are multi-level + type T4000 = CombineTagPathsSingleLevel< + | ['a', 'B', [123]] + | ['C', 'd', '1', '2', [true]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Element', [typeof Element]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Component', [typeof Component]] + > + expectType<{}>({} as T4000); + + /// Should transform single-level tag paths into a flat object (even if there are multi-level tag paths) + type T5000 = CombineTagPathsSingleLevel< + | ['A', ['abc']] + | ['a', [123]] + | ['C', [true]] + | ['MyChild', [typeof Element]] + | ['MyChild2', [typeof Component]] + | ['a', 'B', [123]] + | ['C', 'd', '1', '2', [true]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Element', [typeof Element]] + | ['MyChild', 'MyGrandChild', 'MyGreatGrandChild_Component', [typeof Component]] + > + expectType<{ + A: "abc"; + "a": 123; + "C": true; + "MyChild": typeof Element; + "MyChild2": typeof Component; + }>({} as T5000); + + /// Should the documented example should work + type T6000 = CombineTagPathsSingleLevel< + | ['MyElement', [object]] + | ['MyParentElement', [{ + MyChildComponent: typeof Component + MyChildElement: { + MyGrandChildElement: object + } + }]] + | ['MyParentElement', 'MyChildComponent', [typeof Component]] + | ['MyParentElement', 'MyChildElement', [{ MyGrandChildElement: object }]] + | ['MyParentElement', 'MyChildElement', 'MyGrandChildElement', [object]] + > + expectType<{ + 'MyElement': object; + 'MyParentElement': { + MyChildComponent: typeof Component + MyChildElement: { + MyGrandChildElement: object + } + } + }>({} as T6000); } \ No newline at end of file diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json index 5e9d387f..a9542fb4 100644 --- a/tsconfig.typedoc.json +++ b/tsconfig.typedoc.json @@ -8,7 +8,7 @@ "entryPointStrategy": "expand", "intentionallyNotExported": [ "src/components/ListComponent.d.mts:ListItems", - "src/tree/Element.d.mts:ValidRef", + "src/internalTypes.d.mts:ValidRef", "src/tree/Element.d.mts:InlineElement", "src/internalTypes.d.mts:Documentation", "src/application/Component.d.mts:IsCustomKeyHandlersAugmented", From 21b80b8dee7bab07f51de0008d6244a80e05994c Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Mon, 13 Feb 2023 17:17:53 -0500 Subject: [PATCH 04/28] Add default loose TypeConfigs --- src/application/Component.d.mts | 8 +- src/internalTypes.d.mts | 14 +- src/tree/Element.d.mts | 36 +++-- test-d/Components/Component-events.test-d.ts | 131 +++++++++++++++++-- test-d/Elements/Element-Types.test-d.ts | 17 ++- test-d/Elements/Element.test-d.ts | 2 +- 6 files changed, 180 insertions(+), 28 deletions(-) diff --git a/src/application/Component.d.mts b/src/application/Component.d.mts index 10ec476f..1aace792 100644 --- a/src/application/Component.d.mts +++ b/src/application/Component.d.mts @@ -282,6 +282,12 @@ declare namespace Component { SignalMapType: SignalMap } + export interface TypeConfigLoose extends TypeConfig { + EventMapType: EventMap + SignalMapType: SignalMap + [s: string]: any + } + /** * Augmentable interface for supplying custom key handler methods for components. * @@ -380,7 +386,7 @@ interface Component extends Component.KeyHandlers { declare class Component< // Components use loose typing TemplateSpecs by default TemplateSpecType extends Component.TemplateSpecLoose = Component.TemplateSpecLoose, - TypeConfig extends Component.TypeConfig = Component.TypeConfig + TypeConfig extends Component.TypeConfigLoose = Component.TypeConfigLoose > extends Element< TemplateSpecType, TypeConfig diff --git a/src/internalTypes.d.mts b/src/internalTypes.d.mts index c3e4a96c..82cd4be2 100644 --- a/src/internalTypes.d.mts +++ b/src/internalTypes.d.mts @@ -22,8 +22,9 @@ * @hidden Internal use only * @module */ +import EventEmitter from './EventEmitter.mjs'; import Component from './application/Component.mjs'; -import Element from './tree/Element.mjs' +import Element, { IsLooseTypeConfig } from './tree/Element.mjs' /** * Allows all the documentation of a template spec to be inherited by any Element @@ -76,13 +77,15 @@ export type ReduceSpecificity = : never; - /** * Extracts the EventMapType from Element Config * * @hidden Internal use only */ -export type EventMapType = TypeConfig['EventMapType']; +export type EventMapType = + IsLooseTypeConfig extends true + ? TypeConfig['EventMapType'] & { [s: string]: (...args: any[]) => void; } + : TypeConfig['EventMapType'] /** * Extracts the TextureType from Element TypeConfig @@ -96,7 +99,10 @@ export type TextureType = TypeConfig['Tex * * @hidden Internal use only */ -export type SignalMapType = TypeConfig['SignalMapType']; +export type SignalMapType = + IsLooseTypeConfig extends true + ? TypeConfig['SignalMapType'] & { [key: string]: (...args: any[]) => any } + : TypeConfig['SignalMapType'] /** * If `PossibleFunction` is a function, it returns the parameters from it as a tuple. diff --git a/src/tree/Element.d.mts b/src/tree/Element.d.mts index 7a432bfb..64f7158a 100644 --- a/src/tree/Element.d.mts +++ b/src/tree/Element.d.mts @@ -120,6 +120,11 @@ export type TransformPossibleElement = string extends keyof TemplateSpec ? true : false; +/** + * Returns `true` if TypeConfig is loose, `false` if it is strong + */ +export type IsLooseTypeConfig = string extends keyof TypeConfig ? true : false; + /** * Remove index signatures from an object * @@ -171,8 +176,12 @@ export type RemoveIndex = { * @hidden Internal use only */ export type TemplateSpecTags = { - [K in keyof CombineTagPaths>]: TransformPossibleElement>[K]>; -}; + [K in keyof CombineTagPaths>>]: TransformPossibleElement>>[K]>; +} & (IsLooseTemplateSpec extends true + ? { + [K in string]: any; + } + : {}); /** * Gets an object shape containing all the Refs (child Element / Components) in a TemplateSpec @@ -183,8 +192,12 @@ export type TemplateSpecTags = { * @hidden Internal use only */ export type TemplateSpecRefs = { - [K in keyof CombineTagPathsSingleLevel>]: TransformPossibleElement>[K]>; -}; + [K in keyof CombineTagPathsSingleLevel>>]: TransformPossibleElement>>[K]>; +} & (IsLooseTemplateSpec extends true + ? { + [K in string]: any; + } + : {}); // // Public types @@ -1172,12 +1185,18 @@ declare namespace Element { TextureType: Texture, EventMapType: Element.EventMap } + + export interface TypeConfigLoose extends TypeConfig { + TextureType: Texture + EventMapType: Element.EventMap + [s: string]: any + } } declare class Element< // Elements use loose typing TemplateSpecs by default (for ease of use as Elements aren't often fully definable) TemplateSpecType extends Element.TemplateSpecLoose = Element.TemplateSpecLoose, - TypeConfig extends Element.TypeConfig = Element.TypeConfig + TypeConfig extends Element.TypeConfigLoose = Element.TypeConfigLoose > extends EventEmitter> implements Documentation { constructor(stage: Stage); @@ -1446,8 +1465,8 @@ declare class Element< * information. * @param tagName `.` separated tag path */ - tag>>(tagName: Path): TemplateSpecTags>[Path] | undefined; - tag(tagName: IsLooseTemplateSpec extends true ? string : never): any; + tag>(tagName: Path): TemplateSpecTags[Path] | undefined; + /** * Returns all Elements from the subtree that have this tag. * @@ -1469,8 +1488,7 @@ declare class Element< * * @param ref */ - getByRef>>(ref: RefKey): TemplateSpecRefs>[RefKey] | undefined; - getByRef(tagName: IsLooseTemplateSpec extends true ? string : never): any; + getByRef>(ref: RefKey): TemplateSpecRefs[RefKey] | undefined; /** * Get the location identifier of this Element diff --git a/test-d/Components/Component-events.test-d.ts b/test-d/Components/Component-events.test-d.ts index 5e4881a8..dace7f78 100644 --- a/test-d/Components/Component-events.test-d.ts +++ b/test-d/Components/Component-events.test-d.ts @@ -38,7 +38,10 @@ declare module '../../index.typedoc.js' { } } -namespace MyComponent { +// +// Strong typing for signals and events +// +namespace MyComponent_Strong { export interface TemplateSpec extends Lightning.Component.TemplateSpec { } @@ -58,9 +61,9 @@ namespace MyComponent { } } -class MyComponent extends Lightning.Component< - MyComponent.TemplateSpec, - MyComponent.TypeConfig +class MyComponent_Strong extends Lightning.Component< + MyComponent_Strong.TemplateSpec, + MyComponent_Strong.TypeConfig > { sendMoney(amount: number) { if (amount > 10000000) { @@ -76,7 +79,10 @@ class MyComponent extends Lightning.Component< namespace MyParentComponent { export interface TemplateSpec extends Lightning.Component.TemplateSpec { - MyComponent: typeof MyComponent + MyComponent_Strong: typeof MyComponent_Strong + MyComponent_Strong2: typeof MyComponent_Strong + MyComponent_Strong3: typeof MyComponent_Strong + MyComponent_Strong4: typeof MyComponent_Strong } export interface SignalMap extends Lightning.Component.SignalMap { @@ -90,24 +96,55 @@ namespace MyParentComponent { } class MyParentComponent extends Lightning.Component { - MyComponent = this.getByRef('MyComponent')!; + MyComponent_Strong = this.getByRef('MyComponent_Strong')!; static override _template(): Lightning.Component.Template { return { - MyComponent: { - type: MyComponent, + MyComponent_Strong: { + type: MyComponent_Strong, signals: { - money: true + /// Boolean handler + money: true, }, passSignals: { audit: true, } + }, + MyComponent_Strong2: { + type: MyComponent_Strong, + signals: { + /// Direct handler + money: (amount: number) => {}, + }, + passSignals: { + /// String handler + audit: 'audit', + } + }, + MyComponent_Strong3: { + type: MyComponent_Strong, + signals: { + /// Direct handler + // @ts-expect-error Signal parameters are checked + money: (invalidParamType: string) => {}, + }, + }, + MyComponent_Strong4: { + type: MyComponent_Strong, + signals: { + // @ts-expect-error Any signal is not allowed for strong TypeConfigs + notAValidSignal: true, + }, + passSignals: { + // @ts-expect-error Any signal is not allowed for strong TypeConfigs + notAValidSignal: true, + } } }; } override _handleEnter() { - this.MyComponent.sendMoney(100); + this.MyComponent_Strong.sendMoney(100); } money(amount: number) { @@ -116,15 +153,61 @@ class MyParentComponent extends Lightning.Component(this.signal('anythingShouldGo', 100)); + expectType(this.signal('asWellAsAnyParam', 'string', 100, { a: 1 }, [1, 2, 3])); + + ////// Loose Events + + /// EventEmitter.on + expectType(this.on('anythingShouldGo', () => {})); + expectType(this.on('asWellAsAnyParam', (anyParam: number, shouldGo: string) => {})); + + /// EventEmitter.once + expectType(this.once('anythingShouldGo', () => {})); + expectType(this.once('asWellAsAnyParam', (anyParam: number, shouldGo: string) => {})); + + /// EventEmitter.has + expectType(this.has('anythingShouldGo', () => {})); + expectType(this.has('asWellAsAnyParam', (anyParam: number, shouldGo: string) => {})); + + /// EventEmitter.off + expectType(this.off('anythingShouldGo', () => {})); + expectType(this.off('asWellAsAnyParam', (anyParam: number, shouldGo: string) => {})); + + /// EventEmitter.emit + expectType(this.emit('anythingShouldGo', 100)); + expectType(this.emit('asWellAsAnyParam', 'string', 100, { a: 1 }, [1, 2, 3])); + + /// EventEmitter.removeListener + expectType(this.removeListener('anythingShouldGo', () => {})); + expectType(this.removeListener('asWellAsAnyParam', (anyParam: number, shouldGo: string) => {})); + + /// EventEmitter.listenerCount + expectType(this.listenerCount('anythingShouldGo')); + expectType(this.listenerCount('asWellAsAnyParam')); + + /// EventEmitter.removeAllListeners + expectType(this.removeAllListeners('anythingShouldGo')); + expectType(this.removeAllListeners('asWellAsAnyParam')); + } +} namespace MyApplication { export interface TemplateSpec extends Lightning.Application.TemplateSpec { MyParentComponent: typeof MyParentComponent + MyComponent_Loose: typeof MyComponent_Loose } } class MyApplication extends Lightning.Application { MyParentComponent = this.getByRef('MyParentComponent')!; + MyComponent_Loose = this.getByRef('MyComponent_Loose')!; static override _template(): Lightning.Component.Template { return { @@ -136,14 +219,38 @@ class MyApplication extends Lightning.Application { }, deposit: 'depositHandler' }, + }, + /// Loose TypeConfig allows any signals to be set up + MyComponent_Loose: { + type: MyComponent_Loose, + signals: { + anythingShouldGo: true, + asWellAsAnyDirectHandler() { + // Handle asWellAsAnyDirectHandler + }, + orStringHandler: 'depositHandler' + }, + passSignals: { + anythingShouldGo: true, + orStringHandler: 'depositHandler' + } } }; } override _init() { - this.MyParentComponent.MyComponent.on('burglarAlarm', (sound) => { + ////// Strong TypeConfig allows only defined events to be set up + this.MyParentComponent.MyComponent_Strong.on('burglarAlarm', (sound) => { expectType(this.fireAncestors('$callPolice')); - }) + }); + + // @ts-expect-error Any event name is not allowed for strong TypeConfigs + this.MyParentComponent.MyComponent_Strong.on('anyEventNameIsNotAllowed', () => {}); + // @ts-expect-error Defined event names cannot have invalid parameters + this.MyParentComponent.MyComponent_Strong.on('burglarAlarm', (sound, notValidParameter) => {}); + + ////// Loose TypeConfig allows any events to be set up + this.MyComponent_Loose.on('anythingShouldGo', (anyParam: number, shouldGo: string) => {}); } depositHandler(amount: number) { diff --git a/test-d/Elements/Element-Types.test-d.ts b/test-d/Elements/Element-Types.test-d.ts index 76148bcc..b99d5953 100644 --- a/test-d/Elements/Element-Types.test-d.ts +++ b/test-d/Elements/Element-Types.test-d.ts @@ -324,7 +324,22 @@ function TemplateSpecTags_Test() { /// Loose template specs return empty object type type T2000 = TemplateSpecTags; - expectType<{}>({} as T2000); + expectType<{ + 'MyStrongElement_InlineEmpty': lng.Element>; + 'MyStrongElement_InlineEmpty2': lng.Element>; + 'MyStrongElement_ExplicitType': lng.Element; + 'MyLooseElement': lng.Element; + 'MyListComponent': lng.components.ListComponent; + 'MyStrongElement_InlineChildren': lng.Element>; + 'MyStrongElement_InlineChildren.Child1': lng.Element>; + 'MyStrongElement_InlineChildren.Child2': lng.Element>; + 'MyStrongElement_InlineChildren.Child3': lng.Element; + 'MyStrongElement_InlineChildren.Child4': lng.components.ListComponent; + 'MyStrongElement_InlineChildren.Child5': lng.Element>; + 'MyStrongElement_InlineChildren.Child5.GrandChild1': lng.Element>; + } & { + [s: string]: any; + }>({} as T2000); } // diff --git a/test-d/Elements/Element.test-d.ts b/test-d/Elements/Element.test-d.ts index fac2ab58..fb99bb2a 100644 --- a/test-d/Elements/Element.test-d.ts +++ b/test-d/Elements/Element.test-d.ts @@ -173,7 +173,7 @@ class MyElementTest extends lng.Component implements >(this.tag('MyStrongElement.ChildComponent')); expectType< - lng.Element, lng.Element.TypeConfig> | undefined + lng.Element, lng.Element.TypeConfigLoose> | undefined >(this.tag('MyStrongElement.ChildElement')); // # LOOSE # From 8440d35667e774603ee42c3127d94e7c69ff46aa Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 14 Feb 2023 11:13:28 -0500 Subject: [PATCH 05/28] Add loose EventEmitter tests for Elements --- src/application/Component.d.mts | 2 +- test-d/Elements/Element.test-d.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/application/Component.d.mts b/src/application/Component.d.mts index 1aace792..73951e26 100644 --- a/src/application/Component.d.mts +++ b/src/application/Component.d.mts @@ -445,7 +445,7 @@ declare class Component< */ _captureKeyRelease?(e: KeyboardEvent): boolean | void; - /** + /** * Overridable catch-all **bottom-up** _key-up_ event handler * * @remarks diff --git a/test-d/Elements/Element.test-d.ts b/test-d/Elements/Element.test-d.ts index fb99bb2a..665c481a 100644 --- a/test-d/Elements/Element.test-d.ts +++ b/test-d/Elements/Element.test-d.ts @@ -988,6 +988,29 @@ class MyElementTest extends lng.Component implements expectType(this.MyStrongElement.add(this.TestComponent)); /// If you pass an array, you get `null` back expectType(this.MyStrongElement.add([this.MyLooseElement, this.TestComponent])); + + // + // EventEmitter + // + // # LOOSE ONLY # + // Unless explicitly specified, all Elements default to having Loose Type Configs. + // Even if they have Strong Template Specs. + this.MyLooseElement.on('anythingIsAllowed', () => {}); + this.MyStrongElement.on('anythingIsAllowed', () => {}); + this.MyLooseElement.off('anythingIsAllowed', () => {}); + this.MyStrongElement.off('anythingIsAllowed', () => {}); + this.MyLooseElement.once('anythingIsAllowed', () => {}); + this.MyStrongElement.once('anythingIsAllowed', () => {}); + this.MyLooseElement.emit('anythingIsAllowed'); + this.MyStrongElement.emit('anythingIsAllowed'); + this.MyLooseElement.has('anythingIsAllowed', () => {}); + this.MyStrongElement.has('anythingIsAllowed', () => {}); + this.MyLooseElement.removeAllListeners('anythingIsAllowed'); + this.MyStrongElement.removeAllListeners('anythingIsAllowed'); + this.MyLooseElement.removeListener('anythingIsAllowed', () => {}); + this.MyStrongElement.removeListener('anythingIsAllowed', () => {}); + this.MyLooseElement.listenerCount('anythingIsAllowed'); + this.MyStrongElement.listenerCount('anythingIsAllowed'); } } From 3b3fc31ae58e2faf09a25f605690a382b24ff2a8 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 14 Feb 2023 12:02:31 -0500 Subject: [PATCH 06/28] Add tests for explicit loose type configs --- test-d/Components/Component-events.test-d.ts | 122 +++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/test-d/Components/Component-events.test-d.ts b/test-d/Components/Component-events.test-d.ts index dace7f78..472b6000 100644 --- a/test-d/Components/Component-events.test-d.ts +++ b/test-d/Components/Component-events.test-d.ts @@ -59,6 +59,11 @@ namespace MyComponent_Strong { SignalMapType: SignalMap, EventMapType: EventMap } + + export interface TypeConfigLoose extends Lightning.Component.TypeConfigLoose { + SignalMapType: SignalMap, + EventMapType: EventMap + } } class MyComponent_Strong extends Lightning.Component< @@ -260,4 +265,121 @@ class MyApplication extends Lightning.Application { $augmentedComponentsEventsTest(amount: number) { } +} + +// +// Explicit Loose TypeConfigs +// +// A component can be configured explicitly to have a loose type config +// Known signals and events will be type checked as usual but any signal or event can +// still be set up. +class MyComponent_Strong_LooseTypeConfig extends Lightning.Component< + MyComponent_Strong.TemplateSpec, + MyComponent_Strong.TypeConfigLoose +> { + sendMoney(amount: number) { + /// Test that known events and signals are type checked + type T1000 = typeof this.emit<"burglarAlarm">; + expectType<(name: "burglarAlarm", sound: string) => void>({} as T1000); + + type T2000 = typeof this.on<"burglarAlarm">; + expectType<(name: "burglarAlarm", listener: (sound: string) => void) => void>({} as T2000); + + type T3000 = typeof this.signal<"audit">; + expectType<(event: "audit") => void>({} as T3000); + + type T4000 = typeof this.signal<"money">; + expectType<(event: "money", amount: number) => void>({} as T4000); + + /// Test that unknown events and signals are allowed without errors + type T5000 = typeof this.emit<"unknownEvent">; + expectType<(name: "unknownEvent", ...args: any[]) => void>({} as T5000); + + type T6000 = typeof this.on<"unknownEvent">; + expectType<(name: "unknownEvent", listener: (...args: any[]) => void) => void>({} as T6000); + + type T7000 = typeof this.signal<"unknownSignal">; + expectType<(event: "unknownSignal", ...args: any[]) => any>({} as T7000); + + /// Test that the parameter types of known events and signals are inferred correctly + ///// Test the positive cases + this.emit('burglarAlarm', 'sound'); + this.on('burglarAlarm', (sound) => { + expectType(sound); + }); + this.signal('audit'); + this.signal('money', 100); + ///// Test the error cases + // @ts-expect-error second param should be a string + this.emit('burglarAlarm', 100); + // @ts-expect-error `sound` should be a string + this.on('burglarAlarm', (sound: number) => {}); + // @ts-expect-error `audit` should not have any parameters + this.signal('audit', 100); + // @ts-expect-error `money` should have a number parameter + this.signal('money', '100'); + + /// Test that unknown events and signals are allowed without errors + this.emit('unknownEvent', 'sound'); + this.on('unknownEvent', (sound: string) => { + expectType(sound); + }); + this.signal('unknownSignal'); + this.signal('unknownSignal', 100); + } +} + +namespace MyApplication_LooseTypeConfig { + export interface TemplateSpec extends Lightning.Application.TemplateSpec { + MyComponent1: typeof MyComponent_Strong_LooseTypeConfig; + MyComponent2: typeof MyComponent_Strong_LooseTypeConfig; + } +} + +class MyApplication_LooseTypeConfig extends Lightning.Application { + MyComponent1 = this.getByRef('MyComponent1')!; + MyComponent2 = this.getByRef('MyComponent2')!; + + + static override _template(): Lightning.Component.Template { + return { + MyComponent1: { + type: MyComponent_Strong_LooseTypeConfig, + signals: { + /// Should allow known signals with a direct handler + audit(...args) { + /// Should infer the correct parameter types of known signals + expectType<[]>(args); + }, + /// Should allow known signals with a direct handler + money(...args) { + /// Should infer the correct parameter types of known signals + expectType<[number]>(args); + }, + /// Should allow unknown signals with a direct handler + unknownSignal(...args) { + /// Should infer unknown signal parmas as any[] + expectType(args); + }, + /// Should allow unknown signals with a string handler + unknownSignal2: 'handler', + /// Should allow unknown signals with a boolean handler + unknownSingal3: true, + }, + }, + MyComponent2: { + type: MyComponent_Strong_LooseTypeConfig, + signals: { + /// Should allow known signals with a string handler + audit: 'handler', + /// Should allow known signals with a boolean handler + money: true, + }, + }, + }; + } + + override _init() { + this.MyComponent1.emit('burglarAlarm', 'BANG!'); + } } \ No newline at end of file From fc8de7464543ada985a678aac16e284a2d9f4ed7 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 14 Feb 2023 12:12:14 -0500 Subject: [PATCH 07/28] Add some more tests that check that completely invalid signals handlers result in errors... for explicit loose type configs --- test-d/Components/Component-events.test-d.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test-d/Components/Component-events.test-d.ts b/test-d/Components/Component-events.test-d.ts index 472b6000..dbc113fd 100644 --- a/test-d/Components/Component-events.test-d.ts +++ b/test-d/Components/Component-events.test-d.ts @@ -333,12 +333,14 @@ namespace MyApplication_LooseTypeConfig { export interface TemplateSpec extends Lightning.Application.TemplateSpec { MyComponent1: typeof MyComponent_Strong_LooseTypeConfig; MyComponent2: typeof MyComponent_Strong_LooseTypeConfig; + MyComponent3: typeof MyComponent_Strong_LooseTypeConfig; } } class MyApplication_LooseTypeConfig extends Lightning.Application { MyComponent1 = this.getByRef('MyComponent1')!; MyComponent2 = this.getByRef('MyComponent2')!; + MyComponent3 = this.tag('MyComponent3')!; static override _template(): Lightning.Component.Template { @@ -376,6 +378,20 @@ class MyApplication_LooseTypeConfig extends Lightning.Application Date: Tue, 14 Feb 2023 12:13:19 -0500 Subject: [PATCH 08/28] Add documentation on Loose Type Configs --- docs/TypeScript/Components/TypeConfigs.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/TypeScript/Components/TypeConfigs.md b/docs/TypeScript/Components/TypeConfigs.md index 65c634a4..fbce1d8c 100644 --- a/docs/TypeScript/Components/TypeConfigs.md +++ b/docs/TypeScript/Components/TypeConfigs.md @@ -129,4 +129,17 @@ class MyParentComponent extends Lightning.Component { } // ... } -``` \ No newline at end of file +``` + +## Loose Type Configs + +If a Type Config is not explicitly provided, a **Loose Type Config** will be used by default. This is similar to the [**Loose Template Spec**](TemplateSpecs.md). Events and Signals will be handled in a much more looser fashion, allowing you to hook up any Events/Signals regardless of if any are explicitly specified. + +You can also explicitly extend the base `LooseTypeConfig` interface if you want the best of both worlds. Explicitly specified Events and Signals will be type checked. But any other Event or Signal will be allowed and be able to emit/receive `any` set of parameters. + +```ts +export interface TypeConfigLoose extends Lightning.Component.TypeConfigLoose { + SignalMapType: MyComponentSignalMap, + EventMapType: MyComponentEventMap +} +``` From 1c3b6393cc33b748980b04cff1a85dd0b89ad1ac Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Fri, 17 Feb 2023 10:36:04 -0500 Subject: [PATCH 09/28] TypeScript: Add string[] as an option for TextTexture fontFace Also a test for TextTexture properties --- src/textures/TextTexture.d.mts | 2 +- test-d/Elements/Element.test-d.ts | 39 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/textures/TextTexture.d.mts b/src/textures/TextTexture.d.mts index 762e019d..dee292f9 100644 --- a/src/textures/TextTexture.d.mts +++ b/src/textures/TextTexture.d.mts @@ -99,7 +99,7 @@ declare namespace TextTexture { * * @defaultValue `null` (uses {@link Stage.Options.defaultFontFace}) */ - fontFace?: string | null; + fontFace?: string | string[] | null; /** * Word wrap mode * diff --git a/test-d/Elements/Element.test-d.ts b/test-d/Elements/Element.test-d.ts index fac2ab58..cfe3f12a 100644 --- a/test-d/Elements/Element.test-d.ts +++ b/test-d/Elements/Element.test-d.ts @@ -66,6 +66,45 @@ class MyElementTest extends lng.Component implements w: 123, h: 123, tagRoot: true, + /// Test all the TextTexture properties + text: { + text: 'abc', + fontFace: ['Roboto', 'Arial'], + fontSize: 12, + fontStyle: 'normal', + textColor: 0xff0000ff, + textAlign: 'center', + fontBaselineRatio: 1, + wordWrap: true, + wordBreak: true, + wordWrapWidth: 100, + lineHeight: 20, + textBaseline: 'alphabetic', + verticalAlign: 'top', + offsetY: 1, + maxLines: 1, + maxLinesSuffix: '...', + precision: 1, + paddingLeft: 1, + paddingRight: 1, + shadow: true, + shadowColor: 0xff0000ff, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowBlur: 1, + highlight: true, + highlightColor: 0xff0000ff, + highlightOffset: 1, + highlightPaddingLeft: 1, + highlightPaddingRight: 1, + letterSpacing: 1, + textIndent: 1, + cutSx: 1, + cutEx: 1, + cutSy: 1, + cutEy: 1, + advancedRenderer: false, + }, smooth: { x: [100, { delay: 0, duration: 10, timingFunction: 'ease-in' }], y: 200, From 5dc3b953064c090e1614b235912f351bd6187189 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Fri, 17 Feb 2023 10:46:23 -0500 Subject: [PATCH 10/28] Documentation: Improve documentation for TextTexture fontFace and Stage defaultFontFace --- docs/RenderEngine/Textures/Text.md | 2 +- docs/RuntimeConfig/index.md | 2 +- src/textures/TextTexture.d.mts | 8 ++++++++ src/tree/Stage.d.mts | 9 ++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/RenderEngine/Textures/Text.md b/docs/RenderEngine/Textures/Text.md index 7ab48a9d..0db16a8f 100644 --- a/docs/RenderEngine/Textures/Text.md +++ b/docs/RenderEngine/Textures/Text.md @@ -11,7 +11,7 @@ You can use various properties to control the way in which you want to render te | Name | Type | Default | Description | |---|---|---|---| | `text` | String | '' | Text to display | -| `fontFace` | Integer | null | Font family used for current text | +| `fontFace` | String or String[] | `null` | Font family used for current text. If an array is provided, font families that appear later in the array are used as fallbacks. If the (default) `null` value is specified, the font family value specified in the `defaultFontFace` [Stage Option](../../RuntimeConfig/index.md#stage-configuration-options) is used. If the resolved font family (or families) is unavailable to the browser, a fallback is chosen by the browser. The special [CSS defined font family values](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#values) of "serif" and "sans-serif" may be used as well. | | `fontSize` | Integer | 40 | Font size | | `fontStyle` | String | 'normal' | Font style | | `lineHeight` | Integer | null | Line height | diff --git a/docs/RuntimeConfig/index.md b/docs/RuntimeConfig/index.md index 569909f1..2916c90a 100644 --- a/docs/RuntimeConfig/index.md +++ b/docs/RuntimeConfig/index.md @@ -37,7 +37,7 @@ const App = new MyApp(options); | `precision` | Float | 1 | Global stage scaling (see details below) | | `memoryPressure` | Number | 24e6 | Maximum GPU memory usage in pixels (see details below) | | `clearColor` | Float[] | [0,0,0,0] | Background color in ARGB values (0 to 1) | -| `defaultFontFace` | String | sans-serif | Font face for text rendering | +| `defaultFontFace` | String | "sans-serif" | Default font family to use for text. See the [fontFace Text property](../RenderEngine/Textures/Text.md#properties) for how this value ends up being used. The special [CSS defined font family values](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#values) of "serif" and "sans-serif" may be used as well. | | `fontSharp` | Object, Boolean | { precision:0.6666666667, fontSize: 39 } | Determine when to apply gl.NEAREST to TEXTURE_MAG_FILTER | | `fixedDt` | Number | 0 (auto) | Fixed time step per frame (in ms) | | `useImageWorker` | Boolean | true | By default, use a Web Worker that parses images off-thread (web only) | diff --git a/src/textures/TextTexture.d.mts b/src/textures/TextTexture.d.mts index dee292f9..679955dd 100644 --- a/src/textures/TextTexture.d.mts +++ b/src/textures/TextTexture.d.mts @@ -97,6 +97,14 @@ declare namespace TextTexture { /** * Font family * + * @remarks + * If an array is provided, font families that appear later in the array are used as fallbacks. If the + * (default) `null` value is specified, the font family value specified in the `defaultFontFace` + * {@link Stage.Options.defaultFontFace Stage Option} is used. If the resolved font + * family (or families) is unavailable to the browser, a fallback is chosen by the browser. The special + * [CSS defined font family values](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#values) + * of "serif" and "sans-serif" may be used as well. + * * @defaultValue `null` (uses {@link Stage.Options.defaultFontFace}) */ fontFace?: string | string[] | null; diff --git a/src/tree/Stage.d.mts b/src/tree/Stage.d.mts index 2c90f287..cb291b69 100644 --- a/src/tree/Stage.d.mts +++ b/src/tree/Stage.d.mts @@ -30,6 +30,7 @@ import ElementCore from "./core/ElementCore.mjs"; import TextureManager from "./TextureManager.mjs"; import Element from "./Element.mjs"; import Shader from "./Shader.mjs"; +import type TextTexture from "../textures/TextTexture.mjs"; declare namespace Stage { /** @@ -134,7 +135,13 @@ declare namespace Stage { */ clearColor: number | RGBA | null; /** - * Default font-face to use for text + * Default font family to use for text + * + * @remarks + * See {@link TextTexture.Settings.fontFace} for how this value ends up being used. + * + * The special [CSS defined font family values](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#values) + * of "serif" and "sans-serif" may be used as well. * * @defaultValue `'sans-serif'` */ From bd65f5a73ddb8c0f298c620377099814c0d08df8 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Wed, 22 Feb 2023 12:53:12 -0500 Subject: [PATCH 11/28] TypeScript: Allow `id` accessor of Component to be overridden by a string accessor As well as a number accessor, since by default `id` produces a number if it is not overridden. Fixes #456 --- src/tree/Element.d.mts | 2 +- test-d/Components/Component.test-d.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tree/Element.d.mts b/src/tree/Element.d.mts index ed5ba592..bd6287be 100644 --- a/src/tree/Element.d.mts +++ b/src/tree/Element.d.mts @@ -1320,7 +1320,7 @@ declare class Element< isElement: 1; - readonly id: number; + get id(): number | string; ref: string | undefined; diff --git a/test-d/Components/Component.test-d.ts b/test-d/Components/Component.test-d.ts index 42198e11..9947ea05 100644 --- a/test-d/Components/Component.test-d.ts +++ b/test-d/Components/Component.test-d.ts @@ -45,3 +45,11 @@ function SpecialMethods() { // @ts-expect-error c.seekAncestorByType(Element); } + +/// Basic Component Specification Tests +class MyComponent extends Component { + /// The id Component property should be overridable to return a string or a number + override get id(): string | number { + return 'MyComponent'; + } +} From a61ef085be2f1cc2fc957d32db32d7a38335756c Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Wed, 18 Jan 2023 12:53:35 -0500 Subject: [PATCH 12/28] Integrate Vite and Vitest. Add test for TextTextureRendererUtils. --- .gitignore | 1 + package-lock.json | 2562 +++++++++++++++-- package.json | 21 +- .../TextTextureRendererUtils.test.mjs | 31 + src/vite-env.d.ts | 2 + tsconfig.json | 2 +- vite.config.js | 67 + 7 files changed, 2517 insertions(+), 169 deletions(-) create mode 100644 src/textures/TextTextureRendererUtils.test.mjs create mode 100644 src/vite-env.d.ts create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore index 3b751a2a..e2b76306 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ jspm_packages .node_repl_history dist +dist-vite .idea diff --git a/package-lock.json b/package-lock.json index feeeee22..716a56d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,16 +13,23 @@ "@babel/plugin-transform-parameters": "^7.8.3", "@babel/plugin-transform-spread": "^7.8.3", "@babel/preset-env": "^7.8.3", + "@rollup/plugin-babel": "^6.0.3", + "@rollup/plugin-terser": "^0.3.0", + "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", + "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^1.30.1", + "rollup": "^1.32.1", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", - "rollup-plugin-license": "2.5.0", + "rollup-plugin-license": "^2.5.0", "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", + "terser": "^5.16.1", "tsd": "^0.21.0", - "typedoc": "^0.23.10" + "typedoc": "^0.23.10", + "vite": "^4.0.4", + "vitest": "^0.27.2" } }, "node_modules/@babel/code-frame": { @@ -235,12 +242,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -351,10 +358,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1293,6 +1309,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/standalone": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.12.tgz", + "integrity": "sha512-hK/X+m1il3w1tYS4H8LDaGCEdiT47SVqEXY8RiEAgou26BystipSU8ZL6EvBR6t5l7lTv0ilBiChXWblKJ5iUA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", @@ -1328,18 +1353,429 @@ } }, "node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "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", @@ -1375,6 +1811,91 @@ "node": ">= 8" } }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", + "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz", + "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.0", + "smob": "^0.0.6", + "terser": "^5.15.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "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 + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1421,6 +1942,21 @@ "tsserver": "typescript/bin/tsserver" } }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -1432,9 +1968,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.49", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.49.tgz", - "integrity": "sha512-K1AFuMe8a+pXmfHTtnwBvqoEylNKVeaiKYkjmcEAdytMQVJ/i9Fu7sc13GxgXdO49gkE7Hy8SyJonUZUn+eVaw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "dev": true }, "node_modules/@types/json-schema": { @@ -1461,6 +1997,38 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "node_modules/@vitejs/plugin-legacy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz", + "integrity": "sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==", + "dev": true, + "dependencies": { + "@babel/standalone": "^7.20.6", + "core-js": "^3.26.1", + "magic-string": "^0.27.0", + "regenerator-runtime": "^0.13.11", + "systemjs": "^6.13.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^4.0.0" + } + }, + "node_modules/@vitejs/plugin-legacy/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1473,6 +2041,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -1662,11 +2239,20 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "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/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1710,15 +2296,16 @@ "dev": true }, "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" }, @@ -1834,6 +2421,235 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/concurrently": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/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/concurrently/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concurrently/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/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/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1843,6 +2659,17 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/core-js": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", + "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-compat": { "version": "3.15.2", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", @@ -1862,16 +2689,34 @@ "semver": "bin/semver.js" } }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "dev": true, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -1906,15 +2751,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/define-properties": { @@ -2009,7 +2854,44 @@ "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" } }, "node_modules/escalade": { @@ -2289,6 +3171,20 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2788,9 +3684,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "node_modules/just-extend": { @@ -2814,6 +3710,18 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/local-pkg": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", + "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2857,6 +3765,15 @@ "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", "dev": true }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3036,6 +3953,36 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mlly": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz", + "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==", + "dev": true, + "dependencies": { + "acorn": "^8.8.1", + "pathe": "^1.0.0", + "pkg-types": "^1.0.1", + "ufo": "^1.0.1" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", + "dev": true + }, "node_modules/mocha": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", @@ -3131,6 +4078,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nise": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", @@ -3366,6 +4325,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -3384,6 +4349,12 @@ "node": ">=6.14" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -3396,6 +4367,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", + "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.0.0", + "pathe": "^1.0.0" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", + "dev": true + }, "node_modules/plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -3411,6 +4399,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3604,9 +4616,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { @@ -3678,13 +4690,20 @@ "dev": true }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/reusify": { @@ -3802,6 +4821,32 @@ "terser": "^4.6.2" } }, + "node_modules/rollup-plugin-terser/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", @@ -3834,6 +4879,15 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -3864,6 +4918,15 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/shell-quote": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shiki": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", @@ -3875,6 +4938,12 @@ "vscode-textmate": "5.2.0" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/sinon": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", @@ -3908,6 +4977,12 @@ "node": ">=8" } }, + "node_modules/smob": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", + "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", + "dev": true + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3917,10 +4992,19 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "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, "dependencies": { "buffer-from": "^1.0.0", @@ -3942,6 +5026,12 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, "node_modules/spdx-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", @@ -4017,6 +5107,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4083,6 +5179,30 @@ "node": ">=0.10.0" } }, + "node_modules/strip-literal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", + "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", + "dev": true, + "dependencies": { + "acorn": "^8.8.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4129,30 +5249,76 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==", + "dev": true + }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/terser/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==", + "node_modules/terser/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" + } + }, + "node_modules/tinybench": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", + "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", + "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" } }, "node_modules/to-fast-properties": { @@ -4176,6 +5342,15 @@ "node": ">=8.0" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -4214,6 +5389,12 @@ "node": ">=8" } }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4291,6 +5472,12 @@ "node": ">=4.2.0" } }, + "node_modules/ufo": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", + "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -4340,17 +5527,196 @@ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.3", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.27.2.tgz", + "integrity": "sha512-IDwuVhslF10qCnWOGJui7/2KksAOBHi+UbVo6Pqt4f5lgn+kS2sVvYDsETRG5PSuslisGB5CFGvb9I6FQgymBQ==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^0.2.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "source-map-support": "^0.5.21", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-node/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.27.2.tgz", + "integrity": "sha512-y7tdsL2uaQy+KF18AlmNHZe29ukyFytlxrpSTwwmgLE2XHR/aPucJP9FLjWoqjgqFlXzRAjHlFJLU+HDyI/OsA==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.27.2", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vitest/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, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "engines": { + "node": ">=0.10.0" } }, "node_modules/vscode-oniguruma": { @@ -4396,6 +5762,22 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -4719,12 +6101,12 @@ } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { @@ -4808,10 +6190,16 @@ "@babel/types": "^7.14.5" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -5570,6 +6958,12 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/standalone": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.12.tgz", + "integrity": "sha512-hK/X+m1il3w1tYS4H8LDaGCEdiT47SVqEXY8RiEAgou26BystipSU8ZL6EvBR6t5l7lTv0ilBiChXWblKJ5iUA==", + "dev": true + }, "@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", @@ -5599,15 +6993,219 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5634,6 +7232,57 @@ "fastq": "^1.6.0" } }, + "@rollup/plugin-babel": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", + "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + } + }, + "@rollup/plugin-terser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz", + "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==", + "dev": true, + "requires": { + "serialize-javascript": "^6.0.0", + "smob": "^0.0.6", + "terser": "^5.15.1" + }, + "dependencies": { + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "estree-walker": { + "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 + } + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -5676,6 +7325,21 @@ "integrity": "sha512-jbtC+RgKZ9Kk65zuRZbKLTACf+tvFW4Rfq0JEMXrlmV3P3yme+Hm+pnb5fJRyt61SjIitcrC810wj7+1tgsEmg==", "dev": true }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -5687,9 +7351,9 @@ } }, "@types/estree": { - "version": "0.0.49", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.49.tgz", - "integrity": "sha512-K1AFuMe8a+pXmfHTtnwBvqoEylNKVeaiKYkjmcEAdytMQVJ/i9Fu7sc13GxgXdO49gkE7Hy8SyJonUZUn+eVaw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "dev": true }, "@types/json-schema": { @@ -5716,12 +7380,42 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "@vitejs/plugin-legacy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz", + "integrity": "sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==", + "dev": true, + "requires": { + "@babel/standalone": "^7.20.6", + "core-js": "^3.26.1", + "magic-string": "^0.27.0", + "regenerator-runtime": "^0.13.11", + "systemjs": "^6.13.0" + }, + "dependencies": { + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + } + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -5875,9 +7569,15 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "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 + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true }, "call-bind": { @@ -5914,15 +7614,16 @@ "dev": true }, "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } @@ -5962,66 +7663,232 @@ "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "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 + }, + "commenting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", + "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concurrently": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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 + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "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 - }, - "commenting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", - "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -6031,6 +7898,12 @@ "safe-buffer": "~5.1.1" } }, + "core-js": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", + "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", + "dev": true + }, "core-js-compat": { "version": "3.15.2", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", @@ -6049,10 +7922,16 @@ } } }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "dev": true + }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -6083,9 +7962,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -6171,6 +8050,36 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6377,6 +8286,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6749,9 +8665,9 @@ } }, "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "just-extend": { @@ -6772,6 +8688,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "local-pkg": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", + "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", + "dev": true + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -6809,6 +8731,15 @@ "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", "dev": true }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6942,6 +8873,32 @@ "minimist": "^1.2.5" } }, + "mlly": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz", + "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==", + "dev": true, + "requires": { + "acorn": "^8.8.1", + "pathe": "^1.0.0", + "pkg-types": "^1.0.1", + "ufo": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", + "dev": true + } + } + }, "mocha": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", @@ -7023,6 +8980,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, "nise": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", @@ -7213,6 +9176,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -7225,12 +9194,37 @@ "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pkg-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", + "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.0.0", + "pathe": "^1.0.0" + }, + "dependencies": { + "pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", + "dev": true + } + } + }, "plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -7240,6 +9234,17 @@ "irregular-plurals": "^3.2.0" } }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7384,9 +9389,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regenerator-transform": { @@ -7448,13 +9453,14 @@ "dev": true }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "reusify": { @@ -7544,6 +9550,25 @@ "rollup-pluginutils": "^2.8.2", "serialize-javascript": "^4.0.0", "terser": "^4.6.2" + }, + "dependencies": { + "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 + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + } } }, "rollup-pluginutils": { @@ -7564,6 +9589,15 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -7591,6 +9625,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "shell-quote": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "dev": true + }, "shiki": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", @@ -7602,6 +9642,12 @@ "vscode-textmate": "5.2.0" } }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "sinon": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", @@ -7629,16 +9675,28 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "smob": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", + "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "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, "requires": { "buffer-from": "^1.0.0", @@ -7659,6 +9717,12 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, "spdx-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", @@ -7734,6 +9798,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -7788,6 +9858,23 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "strip-literal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", + "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", + "dev": true, + "requires": { + "acorn": "^8.8.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7824,25 +9911,56 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==", + "dev": true + }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true } } }, + "tinybench": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", + "dev": true + }, + "tinypool": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", + "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", + "dev": true + }, + "tinyspy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", + "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7858,6 +9976,12 @@ "is-number": "^7.0.0" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -7886,6 +10010,12 @@ } } }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -7937,6 +10067,12 @@ "dev": true, "peer": true }, + "ufo": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", + "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==", + "dev": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -7987,6 +10123,94 @@ "spdx-expression-parse": "^3.0.0" } }, + "vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "dependencies": { + "rollup": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "vite-node": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.27.2.tgz", + "integrity": "sha512-IDwuVhslF10qCnWOGJui7/2KksAOBHi+UbVo6Pqt4f5lgn+kS2sVvYDsETRG5PSuslisGB5CFGvb9I6FQgymBQ==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^0.2.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "source-map-support": "^0.5.21", + "vite": "^3.0.0 || ^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "vitest": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.27.2.tgz", + "integrity": "sha512-y7tdsL2uaQy+KF18AlmNHZe29ukyFytlxrpSTwwmgLE2XHR/aPucJP9FLjWoqjgqFlXzRAjHlFJLU+HDyI/OsA==", + "dev": true, + "requires": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.27.2", + "why-is-node-running": "^2.2.2" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "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 + } + } + }, "vscode-oniguruma": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", @@ -8027,6 +10251,16 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index a309ad20..f5000dce 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,15 @@ ], "scripts": { "build": "rollup -c", + "build-vite": "mkdir -p dist-vite && rm -fr dist-vite/* && concurrently -c \"auto\" \"npm:build:lightning\" \"npm:build:lightning.min\" \"npm:build:lightning.es5\" \"npm:build:lightning.es5.min\"", "release": "npm run build && npm publish --access public", "typedoc": "typedoc --tsconfig tsconfig.typedoc.json", - "tsd": "tsd" + "tsd": "tsd", + "build:lightning": "vite build --mode production", + "build:lightning.min": "BUILD_MINIFY=true vite build --mode production", + "build:lightning.es5": "BUILD_ES5=true vite build --mode production", + "build:lightning.es5.min": "BUILD_ES5=true BUILD_MINIFY=true vite build --mode production", + "test": "vitest" }, "repository": { "type": "git", @@ -45,15 +51,22 @@ "@babel/plugin-transform-parameters": "^7.8.3", "@babel/plugin-transform-spread": "^7.8.3", "@babel/preset-env": "^7.8.3", + "@rollup/plugin-babel": "^6.0.3", + "@rollup/plugin-terser": "^0.3.0", + "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", + "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^1.30.1", + "rollup": "^1.32.1", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", "rollup-plugin-license": "2.5.0", "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", + "terser": "^5.16.1", "tsd": "^0.21.0", - "typedoc": "^0.23.10" + "typedoc": "^0.23.10", + "vite": "^4.0.4", + "vitest": "^0.27.2" } -} \ No newline at end of file +} diff --git a/src/textures/TextTextureRendererUtils.test.mjs b/src/textures/TextTextureRendererUtils.test.mjs new file mode 100644 index 00000000..847340bc --- /dev/null +++ b/src/textures/TextTextureRendererUtils.test.mjs @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest'; +import { getFontSetting } from './TextTextureRendererUtils.mjs'; + +describe('TextTextureRendererUtils', () => { + describe('getFontSetting', () => { + it('should form a valid CSS font string', () => { + expect(getFontSetting('Arial', 'normal', 12, 1, 'Default')).toBe('normal 12px "Arial"'); + expect(getFontSetting('Times New Roman', 'bold', 30, 1, 'Default')).toBe('bold 30px "Times New Roman"'); + }); + it('should adjust font size for precision', () => { + expect(getFontSetting('Arial', 'normal', 12, 2, 'Default')).toBe('normal 24px "Arial"'); + }); + it('should support "serif" and "sans-serif" specially', () => { + expect(getFontSetting('serif', 'italic', 12, 1, 'Default')).toBe('italic 12px serif'); + expect(getFontSetting('sans-serif', 'normal', 12, 1, 'Default')).toBe('normal 12px sans-serif'); + }); + it('should default to the defaultFontFace if fontFace is null', () => { + expect(getFontSetting(null, 'normal', 12, 1, 'Default')).toBe('normal 12px "Default"'); + expect(getFontSetting([null], 'normal', 12, 1, 'Default')).toBe('normal 12px "Default"'); + }); + it('should defaultFontFace should also handle "serif" and "sans-serif" specially', () => { + expect(getFontSetting(null, 'normal', 12, 1, 'serif')).toBe('normal 12px serif'); + expect(getFontSetting([null], 'normal', 12, 1, 'sans-serif')).toBe('normal 12px sans-serif'); + }); + it('should support an array of fonts', () => { + expect(getFontSetting(['Arial'], 'normal', 12, 1, 'Default')).toBe('normal 12px "Arial"'); + expect(getFontSetting(['serif', 'Arial'], 'italic', 12, 1, 'Default')).toBe('italic 12px serif,"Arial"'); + expect(getFontSetting(['serif', 'Arial', null], 'bold', 12, 1, 'Default')).toBe('bold 12px serif,"Arial","Default"'); + }); + }); +}); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..4f512b22 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +// This enables Vite's import.meta augmentations and possibly other things? diff --git a/tsconfig.json b/tsconfig.json index ba2ebb38..2388d6a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "include": [ - "**/*.d.mts", "**/*.d.ts", "**/*.ts" + "**/*.d.mts", "**/*.d.ts", "**/*.ts", "**/*.mjs" ], "compilerOptions": { "lib": ["ES2018", "DOM"], diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000..4280d28c --- /dev/null +++ b/vite.config.js @@ -0,0 +1,67 @@ +import { resolve } from 'path' +import { defineConfig } from 'vite' +import { babel } from '@rollup/plugin-babel'; +import cleanup from 'rollup-plugin-cleanup'; +import license from 'rollup-plugin-license'; + +const isEs5Build = process.env.BUILD_ES5 === 'true'; +const isMinifiedBuild = process.env.BUILD_MINIFY === 'true'; + +export default defineConfig(({ command, mode, ssrBuild }) => { + return { + plugins: [ + /* Cleanup comments */ + cleanup({ + comments: 'none', + extensions: ['mjs'] + }), + // !!! License banner NOT working right now !!! + /* Add version number to bundle */ + license({ + banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, + }), + isEs5Build && babel({ + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: '39', + }, + spec: true, + debug: false, + modules: false, + }, + ], + ], + }), + ], + build: { + sourcemap: isMinifiedBuild, + emptyOutDir: false, + outDir: 'dist-vite', + minify: isMinifiedBuild ? 'terser' : false, + terserOptions: { + keep_classnames: true, + keep_fnames: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points + entry: resolve(__dirname, 'src/lightning.mjs'), + formats: ['umd'], + name: 'lng', + // the proper extensions will be added + fileName: () => { + let extension = isMinifiedBuild ? '.min.js' : '.js'; + if (isEs5Build) { + extension = '.es5' + extension; + } + return 'lightning' + extension; + } + }, + }, + vitest: { + commandLine: 'npm test --', + }, + } +}); From 1eb98d67ebe78db43b7c91e9ab6624e13cc3f60b Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Fri, 17 Feb 2023 17:09:30 -0500 Subject: [PATCH 13/28] Vite: Get bundle banner working with custom plugin --- banner.vite-plugin.ts | 17 +++++++++++++++++ vite.config.js | 21 ++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 banner.vite-plugin.ts diff --git a/banner.vite-plugin.ts b/banner.vite-plugin.ts new file mode 100644 index 00000000..191a3b26 --- /dev/null +++ b/banner.vite-plugin.ts @@ -0,0 +1,17 @@ +import type { Plugin } from 'vite'; + +export function banner(bannerText: string): Plugin { + return { + name: 'banner', + enforce: 'post', + generateBundle(options, bundle) { + // Add banner to the beginning of each chunk + Object.keys(bundle).forEach((key) => { + const file = bundle[key]; + if (file.type === 'chunk') { + file.code = bannerText + '\n' + file.code; + } + }); + } + }; +} diff --git a/vite.config.js b/vite.config.js index 4280d28c..6324afa7 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,8 +1,12 @@ +// @ts-check import { resolve } from 'path' import { defineConfig } from 'vite' import { babel } from '@rollup/plugin-babel'; +import { banner } from './banner.vite-plugin'; +// @ts-expect-error Ignore esModuleInterop error ts(1259) import cleanup from 'rollup-plugin-cleanup'; -import license from 'rollup-plugin-license'; +// @ts-expect-error Ignore "Consider using --resolveJsonModule" error ts(2732) +import packageJson from './package.json'; const isEs5Build = process.env.BUILD_ES5 === 'true'; const isMinifiedBuild = process.env.BUILD_MINIFY === 'true'; @@ -13,13 +17,8 @@ export default defineConfig(({ command, mode, ssrBuild }) => { /* Cleanup comments */ cleanup({ comments: 'none', - extensions: ['mjs'] - }), - // !!! License banner NOT working right now !!! - /* Add version number to bundle */ - license({ - banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, }), + /* ES5 (if requested) */ isEs5Build && babel({ presets: [ [ @@ -35,6 +34,14 @@ export default defineConfig(({ command, mode, ssrBuild }) => { ], ], }), + /* Add comment banner to top of bundle */ + banner([ + '/*', + ` * Lightning v${packageJson.version}`, + ' *', + ' * https://github.com/rdkcentral/Lightning', + ' */', + ].join('\n')), ], build: { sourcemap: isMinifiedBuild, From c62ac26d589b8a32994cc622b163080e8fde333a Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Fri, 17 Feb 2023 17:47:26 -0500 Subject: [PATCH 14/28] Upgrade rollup and remove rollup-plugin-license Fix up some types in vite.config.js --- package-lock.json | 304 +++------------------------------------------- package.json | 3 +- vite.config.js | 6 +- 3 files changed, 18 insertions(+), 295 deletions(-) diff --git a/package-lock.json b/package-lock.json index 716a56d2..d2563634 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,10 +19,9 @@ "chai": "^4.2.0", "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^1.32.1", + "rollup": "^3.10.0", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", - "rollup-plugin-license": "^2.5.0", "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", "terser": "^5.16.1", @@ -2029,18 +2028,6 @@ "node": ">=12" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -2104,15 +2091,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -2409,12 +2387,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/commenting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", - "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4063,15 +4035,6 @@ "node": ">=6" } }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4253,18 +4216,6 @@ "node": ">=6" } }, - "node_modules/package-name-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/package-name-regex/-/package-name-regex-2.0.1.tgz", - "integrity": "sha512-U+K6/cuwHwr/8pUQrpNpKOIFSdS/EluTRSmtn92mug1UiPcff4t9AHs36e2xXJtpEtRfbg+JOj3Y/GLX+mzT6w==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://www.buymeacoffee.com/dword" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4717,17 +4668,19 @@ } }, "node_modules/rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - }, "bin": { "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-babel": { @@ -4753,61 +4706,6 @@ "node": "^10.14.2 || >=12.0.0" } }, - "node_modules/rollup-plugin-license": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-2.5.0.tgz", - "integrity": "sha512-HUjGV+i1tRxi/zL4WpeNCLJZfEJBbCcDmwGJCjKBvcLDIK6VNW1JmYKjSJJOqJjNqRIvKt6/BLSQB9RwNDLtQw==", - "dev": true, - "dependencies": { - "commenting": "1.1.0", - "glob": "7.1.7", - "lodash": "4.17.21", - "magic-string": "0.25.7", - "mkdirp": "1.0.4", - "moment": "2.29.1", - "package-name-regex": "2.0.1", - "spdx-expression-validate": "2.0.0", - "spdx-satisfies": "5.0.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "rollup": "^1.0.0 || ^2.0.0" - } - }, - "node_modules/rollup-plugin-license/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup-plugin-license/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/rollup-plugin-terser": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", @@ -5032,17 +4930,6 @@ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", "dev": true }, - "node_modules/spdx-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", - "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", - "dev": true, - "dependencies": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -5069,38 +4956,12 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-expression-validate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", - "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/spdx-license-ids": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, - "node_modules/spdx-ranges": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", - "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", - "dev": true - }, - "node_modules/spdx-satisfies": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz", - "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==", - "dev": true, - "dependencies": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5623,22 +5484,6 @@ "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/rollup": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", - "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/vitest": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.27.2.tgz", @@ -7404,12 +7249,6 @@ } } }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -7455,12 +7294,6 @@ "sprintf-js": "~1.0.2" } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -7711,12 +7544,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "commenting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", - "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8968,12 +8795,6 @@ } } }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9125,12 +8946,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "package-name-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/package-name-regex/-/package-name-regex-2.0.1.tgz", - "integrity": "sha512-U+K6/cuwHwr/8pUQrpNpKOIFSdS/EluTRSmtn92mug1UiPcff4t9AHs36e2xXJtpEtRfbg+JOj3Y/GLX+mzT6w==", - "dev": true - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -9470,14 +9285,12 @@ "dev": true }, "rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", "dev": true, "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" + "fsevents": "~2.3.2" } }, "rollup-plugin-babel": { @@ -9500,45 +9313,6 @@ "rollup-pluginutils": "^2.8.2" } }, - "rollup-plugin-license": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-2.5.0.tgz", - "integrity": "sha512-HUjGV+i1tRxi/zL4WpeNCLJZfEJBbCcDmwGJCjKBvcLDIK6VNW1JmYKjSJJOqJjNqRIvKt6/BLSQB9RwNDLtQw==", - "dev": true, - "requires": { - "commenting": "1.1.0", - "glob": "7.1.7", - "lodash": "4.17.21", - "magic-string": "0.25.7", - "mkdirp": "1.0.4", - "moment": "2.29.1", - "package-name-regex": "2.0.1", - "spdx-expression-validate": "2.0.0", - "spdx-satisfies": "5.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, "rollup-plugin-terser": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", @@ -9723,17 +9497,6 @@ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", "dev": true }, - "spdx-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", - "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", - "dev": true, - "requires": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -9760,38 +9523,12 @@ "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-validate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", - "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0" - } - }, "spdx-license-ids": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, - "spdx-ranges": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", - "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", - "dev": true - }, - "spdx-satisfies": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz", - "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==", - "dev": true, - "requires": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -10134,17 +9871,6 @@ "postcss": "^8.4.20", "resolve": "^1.22.1", "rollup": "^3.7.0" - }, - "dependencies": { - "rollup": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", - "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - } } }, "vite-node": { diff --git a/package.json b/package.json index f5000dce..35e26fe3 100644 --- a/package.json +++ b/package.json @@ -57,10 +57,9 @@ "chai": "^4.2.0", "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^1.32.1", + "rollup": "^3.10.0", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", - "rollup-plugin-license": "2.5.0", "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", "terser": "^5.16.1", diff --git a/vite.config.js b/vite.config.js index 6324afa7..6ff601d2 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,4 +1,5 @@ // @ts-check +/// import { resolve } from 'path' import { defineConfig } from 'vite' import { babel } from '@rollup/plugin-babel'; @@ -11,7 +12,7 @@ import packageJson from './package.json'; const isEs5Build = process.env.BUILD_ES5 === 'true'; const isMinifiedBuild = process.env.BUILD_MINIFY === 'true'; -export default defineConfig(({ command, mode, ssrBuild }) => { +export default defineConfig(() => { return { plugins: [ /* Cleanup comments */ @@ -67,8 +68,5 @@ export default defineConfig(({ command, mode, ssrBuild }) => { } }, }, - vitest: { - commandLine: 'npm test --', - }, } }); From 865dd4b57f8be4a6f20c83a81f5ec42997b6d9cd Mon Sep 17 00:00:00 2001 From: wouterlucas Date: Fri, 24 Feb 2023 15:44:31 +0100 Subject: [PATCH 15/28] Add devicePixelRatio to settings --- docs/RuntimeConfig/index.md | 3 +-- src/tree/Stage.d.mts | 8 ++++++++ src/tree/Stage.mjs | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/RuntimeConfig/index.md b/docs/RuntimeConfig/index.md index 569909f1..c04a5a08 100644 --- a/docs/RuntimeConfig/index.md +++ b/docs/RuntimeConfig/index.md @@ -49,8 +49,7 @@ const App = new MyApp(options); | `debugFrame` | Boolean | false | If set to *true*, logs debug information about each frame including how many render-to-texture elements were re-rendered. This may impact performance and should not be turned on in production. | | `forceTxCanvasSource` | Boolean | false | If set to *true*, forces the Render Engine to use the canvasSource over getImageData for text (this helps with text generation on certain devices). | | `pauseRafLoopOnIdle` | Boolean | false | If set to *true* will stop the Render Engine from calling `RequestAnimationFrame` when there are no stage updates. | - - +| `devicePixelRatio` | Number | 1 | The DPR is the logical to physical pixel density for a touch enabled device and affects how we calculate collisions | ## Downscaling diff --git a/src/tree/Stage.d.mts b/src/tree/Stage.d.mts index 2c90f287..5f4a3605 100644 --- a/src/tree/Stage.d.mts +++ b/src/tree/Stage.d.mts @@ -262,6 +262,14 @@ declare namespace Stage { * @defaultValue `false` */ pauseRafLoopOnIdle: boolean; + /** + * The Device Pixel Ratio (DPR) affects how touch events are registered and handled on a device, + * including the conversion of physical pixel coordinates to logical pixel coordinates and the adjustment + * of element size and layout based on the device's pixel density. + * + * @defaultValue `1` + */ + devicePixelRatio: number; } /** * Events produced by Stage along with their handler signatures diff --git a/src/tree/Stage.mjs b/src/tree/Stage.mjs index 7457f685..85173f5a 100644 --- a/src/tree/Stage.mjs +++ b/src/tree/Stage.mjs @@ -195,6 +195,7 @@ export default class Stage extends EventEmitter { opt('debugFrame', false); opt('forceTxCanvasSource', false); opt('pauseRafLoopOnIdle', false); + opt('devicePixelRatio', 1); } setApplication(app) { From d528113707d28a4772aa14a6b077e84189194adf Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 28 Feb 2023 13:31:05 -0500 Subject: [PATCH 16/28] WIP --- .gitignore | 5 +- package-lock.json | 944 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 21 +- rollup.config.js | 26 +- tsconfig.json | 8 +- vite.config.js | 16 +- 6 files changed, 963 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index e2b76306..b622c73f 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,7 @@ jspm_packages .node_repl_history dist -dist-vite +dist-old .idea @@ -48,3 +48,6 @@ dist-vite # Type Docs /typedocs + +# Dev tools +/devtools \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d2563634..600e21c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@babel/preset-env": "^7.8.3", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-terser": "^0.3.0", + "@types/node": "^18.14.0", "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", "concurrently": "^7.6.0", @@ -28,6 +29,7 @@ "tsd": "^0.21.0", "typedoc": "^0.23.10", "vite": "^4.0.4", + "vite-plugin-dts": "^2.0.2", "vitest": "^0.27.2" } }, @@ -428,9 +430,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.0.tgz", + "integrity": "sha512-ONjtg4renj14A9pj3iA5T5+r5Eijxbr2eNIkMBTC74occDSsRZUpe8vowmowAjFR1imWlkD8eEmjYXiREZpGZg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1775,6 +1777,108 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.26.4", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2", + "@rushstack/rig-package": "0.3.18", + "@rushstack/ts-command-line": "4.13.2", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1895,6 +1999,110 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/@rushstack/node-core-library": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/rig-package/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1931,6 +2139,51 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "node_modules/@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tsd/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.7.4.tgz", @@ -1941,6 +2194,12 @@ "tsserver": "typescript/bin/tsserver" } }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "node_modules/@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", @@ -1985,9 +2244,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.0.tgz", - "integrity": "sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg==", + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", + "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -2037,6 +2296,22 @@ "node": ">=0.4.0" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -2360,6 +2635,12 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2381,6 +2662,15 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -3076,10 +3366,16 @@ "node": ">=0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3092,6 +3388,12 @@ "node": ">=8.6.0" } }, + "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 + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -3137,6 +3439,20 @@ "flat": "cli.js" } }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3259,6 +3575,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -3343,6 +3665,15 @@ "node": ">= 4" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -3589,6 +3920,12 @@ "node": ">=6" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/js-cleanup": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", @@ -3640,6 +3977,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -3661,6 +4004,18 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -3676,6 +4031,12 @@ "node": ">=0.10.0" } }, + "node_modules/kolorist": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.7.0.tgz", + "integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==", + "dev": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3719,6 +4080,18 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4234,6 +4607,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4374,6 +4753,15 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4974,6 +5362,15 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -5221,6 +5618,16 @@ "node": ">=8" } }, + "node_modules/ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, "node_modules/tsd": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.21.0.tgz", @@ -5391,6 +5798,24 @@ "node": ">=4" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -5401,6 +5826,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vite": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", @@ -5484,6 +5918,42 @@ "node": ">=0.10.0" } }, + "node_modules/vite-plugin-dts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-2.0.2.tgz", + "integrity": "sha512-i3HBlrdqE2FQxQqrNwFj9P2ei/I7lt/d3Q8NOE1JCz/gNYhNf/oUeIJamIdWQUNQGhUd/Y6mtpm3kOYPw1gz8Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "magic-string": "^0.29.0", + "ts-morph": "17.0.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.9.0" + } + }, + "node_modules/vite-plugin-dts/node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/vitest": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.27.2.tgz", @@ -5775,6 +6245,36 @@ "engines": { "node": ">=6" } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } } }, "dependencies": { @@ -6088,9 +6588,9 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.0.tgz", + "integrity": "sha512-ONjtg4renj14A9pj3iA5T5+r5Eijxbr2eNIkMBTC74occDSsRZUpe8vowmowAjFR1imWlkD8eEmjYXiREZpGZg==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -7051,6 +7551,90 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@microsoft/api-extractor": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.26.4", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2", + "@rushstack/rig-package": "0.3.18", + "@rushstack/ts-command-line": "4.13.2", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + } + } + }, + "@microsoft/api-extractor-model": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2" + } + }, + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7128,6 +7712,88 @@ } } }, + "@rushstack/node-core-library": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "dev": true, + "requires": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 + } + } + }, + "@rushstack/rig-package": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "dev": true, + "requires": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "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 + } + } + }, + "@rushstack/ts-command-line": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -7164,12 +7830,56 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "dev": true, + "requires": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "@tsd/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-jbtC+RgKZ9Kk65zuRZbKLTACf+tvFW4Rfq0JEMXrlmV3P3yme+Hm+pnb5fJRyt61SjIitcrC810wj7+1tgsEmg==", "dev": true }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", @@ -7214,9 +7924,9 @@ "dev": true }, "@types/node": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.0.tgz", - "integrity": "sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg==", + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", + "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", "dev": true }, "@types/normalize-package-data": { @@ -7255,6 +7965,18 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -7517,6 +8239,12 @@ } } }, + "code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -7538,6 +8266,12 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -8058,10 +8792,16 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -8071,6 +8811,12 @@ "micromatch": "^4.0.4" } }, + "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 + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -8107,6 +8853,17 @@ "is-buffer": "~2.0.3" } }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8198,6 +8955,12 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -8258,6 +9021,12 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -8443,6 +9212,12 @@ } } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "js-cleanup": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", @@ -8482,6 +9257,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -8497,6 +9278,16 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -8509,6 +9300,12 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "kolorist": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.7.0.tgz", + "integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==", + "dev": true + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8543,6 +9340,18 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -8958,6 +9767,12 @@ "lines-and-columns": "^1.1.6" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -9060,6 +9875,12 @@ "source-map-js": "^1.0.2" } }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9541,6 +10362,12 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -9725,6 +10552,16 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, "tsd": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.21.0.tgz", @@ -9850,6 +10687,21 @@ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -9860,6 +10712,12 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "dev": true + }, "vite": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", @@ -9897,6 +10755,35 @@ } } }, + "vite-plugin-dts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-2.0.2.tgz", + "integrity": "sha512-i3HBlrdqE2FQxQqrNwFj9P2ei/I7lt/d3Q8NOE1JCz/gNYhNf/oUeIJamIdWQUNQGhUd/Y6mtpm3kOYPw1gz8Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.15", + "@microsoft/api-extractor": "^7.33.5", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.53.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.6.0", + "magic-string": "^0.29.0", + "ts-morph": "17.0.1" + }, + "dependencies": { + "magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + } + } + }, "vitest": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.27.2.tgz", @@ -10119,6 +11006,27 @@ "lodash": "^4.17.15", "yargs": "^13.3.0" } + }, + "z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "requires": { + "commander": "^9.4.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true + } + } } } } diff --git a/package.json b/package.json index 35e26fe3..c5b1d17c 100644 --- a/package.json +++ b/package.json @@ -3,33 +3,30 @@ "name": "@lightningjs/core", "version": "2.9.0", "license": "Apache-2.0", + "type": "module", + "types": "dist/index.d.ts", + "module": "dist/lightning.esm.js", "main": "dist/lightning.js", - "module": "index.js", - "types": "index.d.ts", "exports": { ".": { "import": { - "types": "./index.d.ts", - "default": "./index.js" + "types": "./dist/index.d.ts", + "default": "./dist/lightning.esm.js" }, "require": { - "types": "./index.d.ts", + "types": "./dist/index.d.ts", "default": "./dist/lightning.js" } }, "./package.json": "./package.json" }, "files": [ - "tsconfig.json", - "index.js", - "index.d.ts", - "src/**", "dist/**", "devtools/**" ], "scripts": { - "build": "rollup -c", - "build-vite": "mkdir -p dist-vite && rm -fr dist-vite/* && concurrently -c \"auto\" \"npm:build:lightning\" \"npm:build:lightning.min\" \"npm:build:lightning.es5\" \"npm:build:lightning.es5.min\"", + "build-old": "rollup -c", + "build": "mkdir -p dist && rm -fr dist/* && concurrently -c \"auto\" \"npm:build:lightning\" \"npm:build:lightning.min\" \"npm:build:lightning.es5\" \"npm:build:lightning.es5.min\"", "release": "npm run build && npm publish --access public", "typedoc": "typedoc --tsconfig tsconfig.typedoc.json", "tsd": "tsd", @@ -53,6 +50,7 @@ "@babel/preset-env": "^7.8.3", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-terser": "^0.3.0", + "@types/node": "^18.14.0", "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", "concurrently": "^7.6.0", @@ -66,6 +64,7 @@ "tsd": "^0.21.0", "typedoc": "^0.23.10", "vite": "^4.0.4", + "vite-plugin-dts": "^2.0.2", "vitest": "^0.27.2" } } diff --git a/rollup.config.js b/rollup.config.js index 9e6ba996..6ac98d6f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -17,7 +17,6 @@ * limitations under the License. */ -import license from 'rollup-plugin-license'; import cleanup from 'rollup-plugin-cleanup'; import { terser } from 'rollup-plugin-terser'; import babel from 'rollup-plugin-babel'; @@ -41,13 +40,9 @@ export default [{ /* Cleanup comments */ cleanup(CLEANUP_CONFIG), - /* Add version number to bundle */ - license({ - banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, - }), ], output: { - file: './dist/lightning.js', + file: './dist-old/lightning.js', format: 'umd', name: 'lng' } @@ -57,14 +52,9 @@ export default [{ input: './src/lightning.mjs', plugins: [ terser(TERSER_CONFIG), - - /* Add version number to bundle */ - license({ - banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, - }), ], output: { - file: './dist/lightning.min.js', + file: './dist-old/lightning.min.js', format: 'umd', name: 'lng', sourcemap: true, @@ -79,10 +69,6 @@ export default [{ /* Cleanup comments */ cleanup(), - /* Add version number to bundle */ - license({ - banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, - }), babel({ presets: [ [ @@ -100,7 +86,7 @@ export default [{ }), ], output: { - file: './dist/lightning.es5.js', + file: './dist-old/lightning.es5.js', format: 'umd', name: 'lng' } @@ -111,10 +97,6 @@ export default [{ plugins: [ terser(TERSER_CONFIG), - /* Add version number to bundle */ - license({ - banner: `Lightning v<%= pkg.version %>\n\n https://github.com/rdkcentral/Lightning`, - }), babel({ presets: [ [ @@ -132,7 +114,7 @@ export default [{ }), ], output: { - file: './dist/lightning.es5.min.js', + file: './dist-old/lightning.es5.min.js', format: 'umd', name: 'lng', sourcemap: true, diff --git a/tsconfig.json b/tsconfig.json index 2388d6a0..50769246 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,12 @@ { "include": [ - "**/*.d.mts", "**/*.d.ts", "**/*.ts", "**/*.mjs" + "./index.js", + "./index.d.ts", + "./src/**/*.d.mts", + "./src/**/*.d.ts", + "./src/**/*.ts", + "./src/**/*.mjs", + "./test-d/**/*.ts" ], "compilerOptions": { "lib": ["ES2018", "DOM"], diff --git a/vite.config.js b/vite.config.js index 6ff601d2..ec3a0e1b 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,6 +4,7 @@ import { resolve } from 'path' import { defineConfig } from 'vite' import { babel } from '@rollup/plugin-babel'; import { banner } from './banner.vite-plugin'; +import dts from 'vite-plugin-dts'; // @ts-expect-error Ignore esModuleInterop error ts(1259) import cleanup from 'rollup-plugin-cleanup'; // @ts-expect-error Ignore "Consider using --resolveJsonModule" error ts(2732) @@ -15,6 +16,7 @@ const isMinifiedBuild = process.env.BUILD_MINIFY === 'true'; export default defineConfig(() => { return { plugins: [ + dts(), /* Cleanup comments */ cleanup({ comments: 'none', @@ -45,9 +47,9 @@ export default defineConfig(() => { ].join('\n')), ], build: { - sourcemap: isMinifiedBuild, + sourcemap: true, emptyOutDir: false, - outDir: 'dist-vite', + outDir: 'dist', minify: isMinifiedBuild ? 'terser' : false, terserOptions: { keep_classnames: true, @@ -56,14 +58,20 @@ export default defineConfig(() => { lib: { // Could also be a dictionary or array of multiple entry points entry: resolve(__dirname, 'src/lightning.mjs'), - formats: ['umd'], + /** + * @type {import('vite').LibraryFormats[]} + */ + formats: ['umd', .../** @type {[] | ['es']} */ (isEs5Build ? [] : ['es'])], name: 'lng', // the proper extensions will be added - fileName: () => { + fileName: (format) => { let extension = isMinifiedBuild ? '.min.js' : '.js'; if (isEs5Build) { extension = '.es5' + extension; } + if (format === 'es') { + extension = '.esm' + extension; + } return 'lightning' + extension; } }, From feebb0b2ece965ec369a8010ab63f794a7d5e9e2 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 4 Apr 2023 18:41:13 -0400 Subject: [PATCH 17/28] Fix text word-wrapping incorrectly at higher resolutions #470 --- src/textures/TextTextureRenderer.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textures/TextTextureRenderer.mjs b/src/textures/TextTextureRenderer.mjs index 87a07737..59d7374b 100644 --- a/src/textures/TextTextureRenderer.mjs +++ b/src/textures/TextTextureRenderer.mjs @@ -108,7 +108,7 @@ export default class TextTextureRenderer { this.setFontProperties(); // Total width. - let width = w || (2048 / this.getPrecision()); + let width = w || this._stage.getOption('w'); // Inner width. let innerWidth = width - (paddingLeft); From ee401d87470befbe4fba13d5111012ba86497e1e Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Wed, 5 Apr 2023 14:31:45 -0400 Subject: [PATCH 18/28] Fix TextTextureRendererAdvanced word wrapping --- src/textures/TextTextureRendererAdvanced.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textures/TextTextureRendererAdvanced.mjs b/src/textures/TextTextureRendererAdvanced.mjs index 7e12d7af..87d60a23 100644 --- a/src/textures/TextTextureRendererAdvanced.mjs +++ b/src/textures/TextTextureRendererAdvanced.mjs @@ -96,7 +96,7 @@ export default class TextTextureRendererAdvanced { const fontSize = this._settings.fontSize * precision; // const offsetY = this._settings.offsetY === null ? null : (this._settings.offsetY * precision); const lineHeight = this._settings.lineHeight * precision || fontSize; - const w = this._settings.w != 0 ? this._settings.w * precision : 2048 / precision; + const w = this._settings.w != 0 ? this._settings.w * precision : this._stage.getOption('w'); // const h = this._settings.h * precision; const wordWrapWidth = this._settings.wordWrapWidth * precision; const cutSx = this._settings.cutSx * precision; From e9a1714134761bb1a18fc9ba903c6dbde262f50b Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Wed, 5 Apr 2023 18:57:39 -0400 Subject: [PATCH 19/28] Add inspector build, fix up typescript defs, clean up unnecessary things --- package-lock.json | 268 +----------------- package.json | 11 +- rollup.config.js | 150 ---------- scripts/copy-extra-tsd-files.sh | 16 ++ src/lightning.d.mts | 2 +- ...ce.d.ts => lng.components.namespace.d.mts} | 0 src/types/{lng.d.ts => lng.d.mts} | 10 +- ...e.d.ts => lng.shaders.c2d.namespace.d.mts} | 0 ...space.d.ts => lng.shaders.namespace.d.mts} | 2 +- ...pace.d.ts => lng.textures.namespace.d.mts} | 0 ...mespace.d.ts => lng.tools.namespace.d.mts} | 0 ...mespace.d.ts => lng.types.namespace.d.mts} | 0 src/vite-env.d.ts | 2 - vite.config.js | 25 +- 14 files changed, 54 insertions(+), 432 deletions(-) delete mode 100644 rollup.config.js create mode 100755 scripts/copy-extra-tsd-files.sh rename src/types/{lng.components.namespace.d.ts => lng.components.namespace.d.mts} (100%) rename src/types/{lng.d.ts => lng.d.mts} (85%) rename src/types/{lng.shaders.c2d.namespace.d.ts => lng.shaders.c2d.namespace.d.mts} (100%) rename src/types/{lng.shaders.namespace.d.ts => lng.shaders.namespace.d.mts} (98%) rename src/types/{lng.textures.namespace.d.ts => lng.textures.namespace.d.mts} (100%) rename src/types/{lng.tools.namespace.d.ts => lng.tools.namespace.d.mts} (100%) rename src/types/{lng.types.namespace.d.ts => lng.types.namespace.d.mts} (100%) delete mode 100644 src/vite-env.d.ts diff --git a/package-lock.json b/package-lock.json index 600e21c9..5ae4a44e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,18 +14,14 @@ "@babel/plugin-transform-spread": "^7.8.3", "@babel/preset-env": "^7.8.3", "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-terser": "^0.3.0", "@types/node": "^18.14.0", "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^3.10.0", - "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", - "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", - "terser": "^5.16.1", + "terser": "^5.16.8", "tsd": "^0.21.0", "typedoc": "^0.23.10", "vite": "^4.0.4", @@ -1940,37 +1936,6 @@ } } }, - "node_modules/@rollup/plugin-terser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz", - "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/@rollup/pluginutils": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", @@ -3895,31 +3860,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -4217,12 +4157,6 @@ "node": ">=10" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4791,15 +4725,6 @@ "node": ">=8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -5071,16 +4996,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" - } - }, "node_modules/rollup-plugin-cleanup": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", @@ -5094,45 +5009,6 @@ "node": "^10.14.2 || >=12.0.0" } }, - "node_modules/rollup-plugin-terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", - "serialize-javascript": "^4.0.0", - "terser": "^4.6.2" - } - }, - "node_modules/rollup-plugin-terser/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", @@ -5189,15 +5065,6 @@ "semver": "bin/semver.js" } }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5263,12 +5130,6 @@ "node": ">=8" } }, - "node_modules/smob": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", - "dev": true - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -5526,9 +5387,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -7671,28 +7532,6 @@ "@rollup/pluginutils": "^5.0.1" } }, - "@rollup/plugin-terser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.3.0.tgz", - "integrity": "sha512-mYTkNW9KjOscS/3QWU5LfOKsR3/fAAVDaqcAe2TZ7ng6pN46f+C7FOZbITuIW/neA+PhcjoKl7yMyB3XcmA4gw==", - "dev": true, - "requires": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" - }, - "dependencies": { - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - } - } - }, "@rollup/pluginutils": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", @@ -9191,27 +9030,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -9446,12 +9264,6 @@ } } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9893,15 +9705,6 @@ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -10114,16 +9917,6 @@ "fsevents": "~2.3.2" } }, - "rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" - } - }, "rollup-plugin-cleanup": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", @@ -10134,38 +9927,6 @@ "rollup-pluginutils": "^2.8.2" } }, - "rollup-plugin-terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", - "serialize-javascript": "^4.0.0", - "terser": "^4.6.2" - }, - "dependencies": { - "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 - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - } - } - }, "rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", @@ -10205,15 +9966,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10270,12 +10022,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "smob": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -10488,9 +10234,9 @@ "dev": true }, "terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", diff --git a/package.json b/package.json index c5b1d17c..3093714f 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,12 @@ "devtools/**" ], "scripts": { - "build-old": "rollup -c", - "build": "mkdir -p dist && rm -fr dist/* && concurrently -c \"auto\" \"npm:build:lightning\" \"npm:build:lightning.min\" \"npm:build:lightning.es5\" \"npm:build:lightning.es5.min\"", + "build": "mkdir -p dist && rm -fr dist/* && concurrently -c \"auto\" \"npm:build:lightning\" \"npm:build:lightning.min\" \"npm:build:lightning.es5\" \"npm:build:lightning.es5.min\" \"npm:build:lightning-inspect.es5\" && npm run copy-extra-tsd-files", "release": "npm run build && npm publish --access public", "typedoc": "typedoc --tsconfig tsconfig.typedoc.json", "tsd": "tsd", + "copy-extra-tsd-files": "bash ./scripts/copy-extra-tsd-files.sh", + "build:lightning-inspect.es5": "BUILD_INSPECTOR=true BUILD_ES5=true vite build --mode production", "build:lightning": "vite build --mode production", "build:lightning.min": "BUILD_MINIFY=true vite build --mode production", "build:lightning.es5": "BUILD_ES5=true vite build --mode production", @@ -49,18 +50,14 @@ "@babel/plugin-transform-spread": "^7.8.3", "@babel/preset-env": "^7.8.3", "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-terser": "^0.3.0", "@types/node": "^18.14.0", "@vitejs/plugin-legacy": "^3.0.1", "chai": "^4.2.0", "concurrently": "^7.6.0", "mocha": "^6.2.1", - "rollup": "^3.10.0", - "rollup-plugin-babel": "^4.3.3", "rollup-plugin-cleanup": "^3.1.1", - "rollup-plugin-terser": "^5.1.2", "sinon": "^7.5.0", - "terser": "^5.16.1", + "terser": "^5.16.8", "tsd": "^0.21.0", "typedoc": "^0.23.10", "vite": "^4.0.4", diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 6ac98d6f..00000000 --- a/rollup.config.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - * If not stated otherwise in this file or this component's LICENSE file the - * following copyright and licenses apply: - * - * Copyright 2020 Metrological - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import cleanup from 'rollup-plugin-cleanup'; -import { terser } from 'rollup-plugin-terser'; -import babel from 'rollup-plugin-babel'; - -const TERSER_CONFIG = { - keep_classnames: true, - keep_fnames: true, - sourcemap: true, -} - -const CLEANUP_CONFIG = { - comments: 'none', - extensions: ['mjs'] -} - -export default [{ - /** lightning.js */ - input: './src/lightning.mjs', - plugins: [ - - /* Cleanup comments */ - cleanup(CLEANUP_CONFIG), - - ], - output: { - file: './dist-old/lightning.js', - format: 'umd', - name: 'lng' - } -}, -{ - /** lightning.min.js */ - input: './src/lightning.mjs', - plugins: [ - terser(TERSER_CONFIG), - ], - output: { - file: './dist-old/lightning.min.js', - format: 'umd', - name: 'lng', - sourcemap: true, - } - -}, -{ - /** lightning.es5.js */ - input: './src/lightning.mjs', - plugins: [ - - /* Cleanup comments */ - cleanup(), - - babel({ - presets: [ - [ - '@babel/env', - { - targets: { - chrome: '39', - }, - spec: true, - debug: false - }, - ], - ], - plugins: ['@babel/plugin-transform-spread', '@babel/plugin-transform-parameters'], - }), - ], - output: { - file: './dist-old/lightning.es5.js', - format: 'umd', - name: 'lng' - } -}, -{ - /** lightning.es5.min.js */ - input: './src/lightning.mjs', - plugins: [ - terser(TERSER_CONFIG), - - babel({ - presets: [ - [ - '@babel/env', - { - targets: { - chrome: '39', - }, - spec: true, - debug: false - }, - ], - ], - plugins: ['@babel/plugin-transform-spread', '@babel/plugin-transform-parameters'], - }), - ], - output: { - file: './dist-old/lightning.es5.min.js', - format: 'umd', - name: 'lng', - sourcemap: true, - } -}, -{ - /** lightning-inspect.es5.js */ - input: './devtools/lightning-inspect.js', - plugins: [ - - babel({ - presets: [ - [ - '@babel/env', - { - targets: { - chrome: '39', - }, - spec: true, - debug: false - }, - ], - ], - plugins: ['@babel/plugin-transform-spread', '@babel/plugin-transform-parameters'], - }), - ], - output: { - file: './devtools/lightning-inspect.es5.js', - format: 'umd', - name: 'lng' - } -}, -] diff --git a/scripts/copy-extra-tsd-files.sh b/scripts/copy-extra-tsd-files.sh new file mode 100755 index 00000000..7c209270 --- /dev/null +++ b/scripts/copy-extra-tsd-files.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# This script copies the extra manual .d.ts files from the root of the project +# to the dist/ directory. This is necessary because some of the .d.ts files are +# not copied by the `vite-plugin-dts` plugin +# (https://github.com/qmhc/vite-plugin-dts/issues/184) +# All of this may be removed if/when the issue is fixed. + +set -e # Exit with nonzero exit code if anything fails + +# Make sure working directory is the root of the repository +cd "$(dirname "$0")/.." + +# Copy the extra .d.ts files to the dist/ directory +cp -r ./src/types ./dist/src/ +cp ./src/internalTypes.d.mts ./dist/src/ +cp ./src/commonTypes.d.mts ./dist/src/ diff --git a/src/lightning.d.mts b/src/lightning.d.mts index b7c8a917..723cb05b 100644 --- a/src/lightning.d.mts +++ b/src/lightning.d.mts @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as lng from "./types/lng"; +import * as lng from "./types/lng.mjs"; /** * This seeming nonsense helps us export all the types with the same names/structure as diff --git a/src/types/lng.components.namespace.d.ts b/src/types/lng.components.namespace.d.mts similarity index 100% rename from src/types/lng.components.namespace.d.ts rename to src/types/lng.components.namespace.d.mts diff --git a/src/types/lng.d.ts b/src/types/lng.d.mts similarity index 85% rename from src/types/lng.d.ts rename to src/types/lng.d.mts index 0d5d68ef..f1b56914 100644 --- a/src/types/lng.d.ts +++ b/src/types/lng.d.mts @@ -28,11 +28,11 @@ import ElementCore from '../tree/core/ElementCore.mjs'; import ElementTexturizer from '../tree/core/ElementTexturizer.mjs'; import Texture from '../tree/Texture.mjs'; import EventEmitter from '../EventEmitter.mjs'; -import * as shaders from './lng.shaders.namespace'; -import * as textures from './lng.textures.namespace'; -import * as components from './lng.components.namespace'; -import * as tools from './lng.tools.namespace'; -import * as types from './lng.types.namespace'; +import * as shaders from './lng.shaders.namespace.mjs'; +import * as textures from './lng.textures.namespace.mjs'; +import * as components from './lng.components.namespace.mjs'; +import * as tools from './lng.tools.namespace.mjs'; +import * as types from './lng.types.namespace.mjs'; export { Application, diff --git a/src/types/lng.shaders.c2d.namespace.d.ts b/src/types/lng.shaders.c2d.namespace.d.mts similarity index 100% rename from src/types/lng.shaders.c2d.namespace.d.ts rename to src/types/lng.shaders.c2d.namespace.d.mts diff --git a/src/types/lng.shaders.namespace.d.ts b/src/types/lng.shaders.namespace.d.mts similarity index 98% rename from src/types/lng.shaders.namespace.d.ts rename to src/types/lng.shaders.namespace.d.mts index 1163ca02..e9824156 100644 --- a/src/types/lng.shaders.namespace.d.ts +++ b/src/types/lng.shaders.namespace.d.mts @@ -39,7 +39,7 @@ import SpinnerShader from "../renderer/webgl/shaders/SpinnerShader.mjs" import SpinnerShader2 from "../renderer/webgl/shaders/SpinnerShader2.mjs" import VignetteShader from "../renderer/webgl/shaders/VignetteShader.mjs" import WebGLShader from "../renderer/webgl/WebGLShader.mjs" -import * as c2d from "./lng.shaders.c2d.namespace" +import * as c2d from "./lng.shaders.c2d.namespace.mjs" export { diff --git a/src/types/lng.textures.namespace.d.ts b/src/types/lng.textures.namespace.d.mts similarity index 100% rename from src/types/lng.textures.namespace.d.ts rename to src/types/lng.textures.namespace.d.mts diff --git a/src/types/lng.tools.namespace.d.ts b/src/types/lng.tools.namespace.d.mts similarity index 100% rename from src/types/lng.tools.namespace.d.ts rename to src/types/lng.tools.namespace.d.mts diff --git a/src/types/lng.types.namespace.d.ts b/src/types/lng.types.namespace.d.mts similarity index 100% rename from src/types/lng.types.namespace.d.ts rename to src/types/lng.types.namespace.d.mts diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts deleted file mode 100644 index 4f512b22..00000000 --- a/src/vite-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -// This enables Vite's import.meta augmentations and possibly other things? diff --git a/vite.config.js b/vite.config.js index ec3a0e1b..32682cb9 100644 --- a/vite.config.js +++ b/vite.config.js @@ -12,11 +12,26 @@ import packageJson from './package.json'; const isEs5Build = process.env.BUILD_ES5 === 'true'; const isMinifiedBuild = process.env.BUILD_MINIFY === 'true'; +const isInspectorBuild = process.env.BUILD_INSPECTOR === 'true'; + +let outDir = 'dist'; +let entry = resolve(__dirname, 'src/lightning.mjs'); +let outputBase = 'lightning'; +let sourcemap = true; +let useDts = true; + +if (isInspectorBuild) { + outDir = 'devtools'; + entry = resolve(__dirname, 'devtools/lightning-inspect.js'); + outputBase = 'lightning-inspector'; + sourcemap = false; + useDts = false; +} export default defineConfig(() => { return { plugins: [ - dts(), + useDts && dts(), /* Cleanup comments */ cleanup({ comments: 'none', @@ -47,9 +62,9 @@ export default defineConfig(() => { ].join('\n')), ], build: { - sourcemap: true, + sourcemap, emptyOutDir: false, - outDir: 'dist', + outDir, minify: isMinifiedBuild ? 'terser' : false, terserOptions: { keep_classnames: true, @@ -57,7 +72,7 @@ export default defineConfig(() => { }, lib: { // Could also be a dictionary or array of multiple entry points - entry: resolve(__dirname, 'src/lightning.mjs'), + entry, /** * @type {import('vite').LibraryFormats[]} */ @@ -72,7 +87,7 @@ export default defineConfig(() => { if (format === 'es') { extension = '.esm' + extension; } - return 'lightning' + extension; + return outputBase + extension; } }, }, From b4776863e8829bd76ac4e3efc34519dde35484e0 Mon Sep 17 00:00:00 2001 From: jfboeve Date: Thu, 6 Apr 2023 14:28:17 +0200 Subject: [PATCH 20/28] add first / last getters to ts definitions --- src/tree/ObjectList.d.mts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/tree/ObjectList.d.mts b/src/tree/ObjectList.d.mts index 78906566..6a76122c 100644 --- a/src/tree/ObjectList.d.mts +++ b/src/tree/ObjectList.d.mts @@ -148,4 +148,14 @@ export default class ObjectList Date: Thu, 6 Apr 2023 08:33:25 -0500 Subject: [PATCH 21/28] Small fixes --- .gitignore | 5 ++--- banner.vite-plugin.ts | 5 +++++ vite.config.js | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index b622c73f..edea4e63 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,6 @@ jspm_packages .node_repl_history dist -dist-old .idea @@ -49,5 +48,5 @@ dist-old # Type Docs /typedocs -# Dev tools -/devtools \ No newline at end of file +# ES5 version of the Lightning Inspector +/devtools/lightning-inspect.es5.js \ No newline at end of file diff --git a/banner.vite-plugin.ts b/banner.vite-plugin.ts index 191a3b26..73e9d6ac 100644 --- a/banner.vite-plugin.ts +++ b/banner.vite-plugin.ts @@ -1,5 +1,10 @@ import type { Plugin } from 'vite'; +/** + * Simple vite plugin to add a copyright banner to the beginning of each chunk. + * + * @param bannerText The banner text to add to each chunk. + */ export function banner(bannerText: string): Plugin { return { name: 'banner', diff --git a/vite.config.js b/vite.config.js index 32682cb9..36a1de3a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -23,7 +23,7 @@ let useDts = true; if (isInspectorBuild) { outDir = 'devtools'; entry = resolve(__dirname, 'devtools/lightning-inspect.js'); - outputBase = 'lightning-inspector'; + outputBase = 'lightning-inspect'; sourcemap = false; useDts = false; } From c5e8ae5fc5f194b7dd95b968b3f57ffceebf1418 Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Thu, 6 Apr 2023 11:40:30 -0500 Subject: [PATCH 22/28] Implement word wrapping on zero-width-breaking spaces Fixes #450 (or at least enables developers to work around the problem) --- src/textures/TextTextureRenderer.mjs | 17 ++++--- src/textures/TextTextureRendererAdvanced.mjs | 8 +-- src/textures/TextTextureRendererUtils.mjs | 47 +++++++++++++++++ .../TextTextureRendererUtils.test.mjs | 50 ++++++++++++++++++- 4 files changed, 110 insertions(+), 12 deletions(-) diff --git a/src/textures/TextTextureRenderer.mjs b/src/textures/TextTextureRenderer.mjs index 87a07737..a5814da1 100644 --- a/src/textures/TextTextureRenderer.mjs +++ b/src/textures/TextTextureRenderer.mjs @@ -19,7 +19,7 @@ import StageUtils from "../tree/StageUtils.mjs"; import Utils from "../tree/Utils.mjs"; -import { getFontSetting } from "./TextTextureRendererUtils.mjs"; +import { getFontSetting, isZeroWidthSpace, splitWords } from "./TextTextureRendererUtils.mjs"; export default class TextTextureRenderer { @@ -424,10 +424,13 @@ export default class TextTextureRenderer { let resultLines = []; let result = ''; let spaceLeft = wordWrapWidth - indent; - let words = lines[i].split(' '); - for (let j = 0; j < words.length; j++) { - const wordWidth = this.measureText(words[j], letterSpacing); - const wordWidthWithSpace = wordWidth + this.measureText(' ',letterSpacing); + let words = splitWords(lines[i]); + for (let j = 0; j < words.length; j += 2) { + const space = words[j]; + const word = words[j + 1]; + const wordWidth = this.measureText(word, letterSpacing); + const spaceWidth = isZeroWidthSpace(space) ? 0 : this.measureText(space, letterSpacing); + const wordWidthWithSpace = wordWidth + spaceWidth; if (j === 0 || wordWidthWithSpace > spaceLeft) { // Skip printing the newline if it's the first word of the line that is. // greater than the word wrap width. @@ -435,12 +438,12 @@ export default class TextTextureRenderer { resultLines.push(result); result = ''; } - result += words[j]; + result += word; spaceLeft = wordWrapWidth - wordWidth - (j === 0 ? indent : 0); } else { spaceLeft -= wordWidthWithSpace; - result += ' ' + words[j]; + result += space + word; } } diff --git a/src/textures/TextTextureRendererAdvanced.mjs b/src/textures/TextTextureRendererAdvanced.mjs index 7e12d7af..42e5f824 100644 --- a/src/textures/TextTextureRendererAdvanced.mjs +++ b/src/textures/TextTextureRendererAdvanced.mjs @@ -19,7 +19,7 @@ import StageUtils from "../tree/StageUtils.mjs"; import Utils from "../tree/Utils.mjs"; -import { getFontSetting } from "./TextTextureRendererUtils.mjs"; +import { getFontSetting, isSpace } from "./TextTextureRendererUtils.mjs"; export default class TextTextureRendererAdvanced { @@ -250,7 +250,7 @@ export default class TextTextureRendererAdvanced { if (firstWord == '\n') { l.text.shift(); } - if (lastWord == ' ' || lastWord == '\n') { + if (isSpace(lastWord) || lastWord == '\n') { l.text.pop(); } } @@ -280,7 +280,7 @@ export default class TextTextureRendererAdvanced { const spl = suffix.length + 1 let _w = lastLineText.reduce((acc, t) => acc + t.width, 0); - while (_w > renderInfo.width || lastLineText[lastLineText.length - spl].text == ' ') { + while (_w > renderInfo.width || isSpace(lastLineText[lastLineText.length - spl].text)) { lastLineText.splice(lastLineText.length - spl, 1); _w = lastLineText.reduce((acc, t) => acc + t.width, 0); if (lastLineText.length < spl) { @@ -440,7 +440,7 @@ export default class TextTextureRendererAdvanced { } tokenize(text) { - const re =/ |\n||<\/i>||<\/b>||<\/color>/g + const re =/ |\u200B|\n||<\/i>||<\/b>||<\/color>/g const delimeters = text.match(re) || []; const words = text.split(re) || []; diff --git a/src/textures/TextTextureRendererUtils.mjs b/src/textures/TextTextureRendererUtils.mjs index 3e19f714..c56cdd78 100644 --- a/src/textures/TextTextureRendererUtils.mjs +++ b/src/textures/TextTextureRendererUtils.mjs @@ -33,3 +33,50 @@ export function getFontSetting(fontFace, fontStyle, fontSize, precision, default return `${fontStyle} ${fontSize * precision}px ${ffs.join(",")}` } + +/** + * Splits a string into an array of spaces and words. + * + * @remarks + * This method always returns an array with an even length. + * + * - The **even indices** are the group of spaces that occur before the word at the + * next (odd) index. + * - The **odd indices** are the words. + * + * If the string does not begin with a space, the first element of the array will + * be an empty string (""). + * + * @param {string} text + * @returns + */ +export function splitWords(text) { + const regexp = /([ \u200B]+)?([^ \u200B]+)/g; + const arr = []; + let match; + while ((match = regexp.exec(text)) !== null) { + arr.push(match[1] || ''); + arr.push(match[2]); + } + return arr; +} + +/** + * Returns true if the given character is a zero-width space. + * + * @param {string} space + * @returns {boolean} + */ +export function isZeroWidthSpace(space) { + return space === '' || space === '\u200B'; +} + +/** + * Returns true if the given character is a zero-width space or a regular space. + * + * @param {string} space + * @returns {boolean} + */ +export function isSpace(space) { + return isZeroWidthSpace(space) || space === ' '; +} \ No newline at end of file diff --git a/src/textures/TextTextureRendererUtils.test.mjs b/src/textures/TextTextureRendererUtils.test.mjs index 847340bc..7486b277 100644 --- a/src/textures/TextTextureRendererUtils.test.mjs +++ b/src/textures/TextTextureRendererUtils.test.mjs @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { getFontSetting } from './TextTextureRendererUtils.mjs'; +import { getFontSetting, splitWords, isSpace, isZeroWidthSpace } from './TextTextureRendererUtils.mjs'; describe('TextTextureRendererUtils', () => { describe('getFontSetting', () => { @@ -28,4 +28,52 @@ describe('TextTextureRendererUtils', () => { expect(getFontSetting(['serif', 'Arial', null], 'bold', 12, 1, 'Default')).toBe('bold 12px serif,"Arial","Default"'); }); }); + + describe('splitWords', () => { + it('should split on regular spaces', () => { + expect(splitWords('Hello There World')).toEqual(["", "Hello", " ", "There", " ", "World"]); + expect(splitWords('Hello There World')).toEqual(["", "Hello", " ", "There", " ", "World"]); + + }); + it('should split on zero-width spaces', () => { + expect(splitWords('Hello\u200BThere\u200BWorld')).toEqual(["", "Hello", "\u200B", "There", "\u200B", "World"]); + expect(splitWords('Hello\u200B\u200BThere\u200B\u200B\u200BWorld')).toEqual(["", "Hello", "\u200B\u200B", "There", "\u200B\u200B\u200B", "World"]); + }); + it('should split on a combo of spaces and zero-width spaces', () => { + expect(splitWords('Hello\u200B There \u200B World')).toEqual(["", "Hello", "\u200B ", "There", " \u200B ", "World"]); + }); + it('should capture the first group of spaces if the string begins with spaces', () => { + expect(splitWords(' Hello There World')).toEqual([" ", "Hello", " ", "There", " ", "World"]); + expect(splitWords(' \u200BHello There World')).toEqual([" \u200B", "Hello", " ", "There", " ", "World"]); + }); + }); + + describe('isZeroWidthSpace', () => { + it('should return true for empty string', () => { + expect(isZeroWidthSpace('')).toBe(true); + }); + it('should return true for zero-width space', () => { + expect(isZeroWidthSpace('\u200B')).toBe(true); + }); + it('should return false for non-zero-width space', () => { + expect(isZeroWidthSpace(' ')).toBe(false); + expect(isZeroWidthSpace('a')).toBe(false); + }); + }); + + describe('isSpace', () => { + it('should return true for empty string', () => { + expect(isSpace('')).toBe(true); + }); + it('should return true for zero-width space', () => { + expect(isSpace('\u200B')).toBe(true); + }); + it('should return true for regular space', () => { + expect(isSpace(' ')).toBe(true); + }); + it('should return false for non-space', () => { + expect(isSpace('a')).toBe(false); + }); + }); + }); From de8170b11a91f1b17d2f642c1f9f68376e56d0ab Mon Sep 17 00:00:00 2001 From: Frank Weindel Date: Tue, 18 Apr 2023 17:31:22 -0400 Subject: [PATCH 23/28] Add documentation on Zero-Width Spaces for word wrapping non-latin text --- docs/RenderEngine/Textures/Text.md | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/RenderEngine/Textures/Text.md b/docs/RenderEngine/Textures/Text.md index 7ab48a9d..ffe7f4b2 100644 --- a/docs/RenderEngine/Textures/Text.md +++ b/docs/RenderEngine/Textures/Text.md @@ -45,9 +45,51 @@ You can use various properties to control the way in which you want to render te | `letterSpacing` | Integer | 0 | Letter spacing of characters | +## Word Wrap in Non-Latin Based Languages +Enabling the `wordWrap` option causes lines of text that are too long for the +specified `wordWrapWidth` to be broken into multiple lines. Lines are broken +only at word boundaries. In most latin script based languages (i.e. English, +Dutch, French, etc) the space " " character is the primary separator of word +boundaries. +Many non-latin based languages (i.e. Chinese, Japanese, Thai and more) do not use spaces +to separate words. Instead there is an assortment of rules that determine where +word boundaries, for the purpose of line breaking, are allowed. Lightning +currently does not implement these rules as there are many languages and writing +systems to consider when implementing them. However, we do offer a work around +that can be employed in your application as needed. +### Zero-Width Spaces + +Lightning supports line breaking at [Zero-Width Space](https://en.wikipedia.org/wiki/Zero-width_space) +(Unicode: `\u200B`) word boundaries. These characters are like normal spaces but +take up no actual space between visible characers. You can use them in +your text strings and Lightning will line break on them when it needs to. + +You may want to write a function that you funnel all of your application's +text strings into: + +```js +function addZeroWidthSpaces(text) { + // Code that inserts Zero-Width Spaces into text and returns the new text +} + +class ZeroWidthSpaceTextDemo extends lng.Application { + static _template() { + return { + Text: { + text: { + text: addZeroWidthSpaces('こんにちは。初めまして!') + } + } + } + } +} +``` + +See [this GitHub issue](https://github.com/rdkcentral/Lightning/issues/450) for +more information. ## Live Demo From 051c98d55d176f0762b38ebb5b3bebbb0f691de9 Mon Sep 17 00:00:00 2001 From: erikhaandrikman Date: Wed, 19 Apr 2023 19:38:25 +0200 Subject: [PATCH 24/28] Updated dpi and precision config --- docs/RuntimeConfig/index.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/RuntimeConfig/index.md b/docs/RuntimeConfig/index.md index 569909f1..d649b74e 100644 --- a/docs/RuntimeConfig/index.md +++ b/docs/RuntimeConfig/index.md @@ -35,6 +35,7 @@ const App = new MyApp(options); | `w` | Number | 1920 | Stage width in pixels | | `h` | Number | 1080 | Stage height in pixels | | `precision` | Float | 1 | Global stage scaling (see details below) | +| `devicePixelRatio` | Float | 1 | Handling high DPI (see details below) | | `memoryPressure` | Number | 24e6 | Maximum GPU memory usage in pixels (see details below) | | `clearColor` | Float[] | [0,0,0,0] | Background color in ARGB values (0 to 1) | | `defaultFontFace` | String | sans-serif | Font face for text rendering | @@ -53,21 +54,39 @@ const App = new MyApp(options); -## Downscaling +## Global stage scaling > We advise you to always develop your TV App in a **1080p** coordinate system (the Lightning default). -Assume that you have created an App for 1080p quality, so you have used a 1920x1080 coordinate system to position all of the content. However, you have found out that the App needs to be displayed in a 1280x720 resolution. +Assume that you have created an App for 1080p quality, where you've used a 1920x1080 coordinate system to position all of the content. However, you've found out that the App needs to be displayed in a 1280x720 resolution. -You can use the `precision` property to perform a *global rescale* of the coordinate system. For example, if you specify `precision: 2/3`, the 1920 x-position will be mapped to the 1280-output pixel coordinate. +To make this adjustment, you can use the `precision` property to perform a *global rescale* of the coordinate system. For example, if you specify `precision: 2/3`, the 1920 x-position will be mapped to the 1280-output pixel coordinate. This downscaling generally works well and can improve quality (less pixel interpolation) while reducing memory usage. +By setting `precision: 2`, the 1920 x-position will be mapped to a 3840-output pixel coordinate, effectively upscaling the content for 4K resolution. Keep in mind that upscaling may result in reduced performance due to the higher GPU memory usage. -As a result, the text and off-screen textures are rendered at a *lower resolution* by the [Render Engine](../RenderEngine/index.md), which increases quality (less pixel interpolation) and reduces memory usage. +Keep in mind that WebGL rasterizes at pixel boundaries. This means that when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you'll need to set the sizing at a multiple of 3 to ensure proper rendering. +# Handling high pixel density (high DPI) -Downscaling with the `precision` option generally works well. But keep in mind that WebGL rasterizes as *pixel boundaries*, so when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you have to set the sizing at a multiple of 3. +With the increasing number of devices in the market having high pixel densities (DPI), it's important to handle high DPI properly in your Lightning app. Fortunately, you can take advantage of the higher resolution by setting the devicePixelRatio property, which is a minor and generally non-disruptive change. +It's worth noting that canvas elements, like most graphics elements, have two sizes + +- The size they are displayed in the page +- The size of their content + +For a canvas element, the size of the content or drawingBuffer is determined by the width and height attributes of the canvas, while the display size is determined by the CSS attributes applied to the canvas. Setting `devicePixelRatio: 2` will result in the following: + +```js + +``` + +a canvas that has a drawingBuffer of size 3840x2060 pixels but is displayed at a 1920x1080 viewport. + +When viewed on High DPI displays, the browser will automatically upscale the canvas content to ensure that it appears at the correct size on the screen. However, if the devicePixelRatio (DPR) is not set properly, a Lightning application may appear to render at a lower-than-native resolution, which can introduce aliasing. + +It's essential to handle high DPI properly to ensure that your Lightning app looks crisp and clear on high DPI displays ## FontSharp From dc8df1d4f7e51f7c1d2f9200d05a11fc50c5ebd2 Mon Sep 17 00:00:00 2001 From: erikhaandrikman Date: Thu, 20 Apr 2023 10:16:23 +0200 Subject: [PATCH 25/28] Updated stage config docs --- docs/RuntimeConfig/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/RuntimeConfig/index.md b/docs/RuntimeConfig/index.md index d649b74e..2d85faa8 100644 --- a/docs/RuntimeConfig/index.md +++ b/docs/RuntimeConfig/index.md @@ -64,9 +64,9 @@ Assume that you have created an App for 1080p quality, where you've used a 1920x To make this adjustment, you can use the `precision` property to perform a *global rescale* of the coordinate system. For example, if you specify `precision: 2/3`, the 1920 x-position will be mapped to the 1280-output pixel coordinate. This downscaling generally works well and can improve quality (less pixel interpolation) while reducing memory usage. -By setting `precision: 2`, the 1920 x-position will be mapped to a 3840-output pixel coordinate, effectively upscaling the content for 4K resolution. Keep in mind that upscaling may result in reduced performance due to the higher GPU memory usage. +By setting `precision: 2`, the 1920 x-position will be mapped to a 3840-output pixel coordinate, effectively upscaling the content for 4K resolution. Please note that upscaling may result in reduced performance due to the higher GPU memory usage. -Keep in mind that WebGL rasterizes at pixel boundaries. This means that when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you'll need to set the sizing at a multiple of 3 to ensure proper rendering. +Keep in mind thatWebGL rasterizes at pixel boundaries. This means that when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you'll need to set the sizing at a multiple of 3 to ensure proper rendering. # Handling high pixel density (high DPI) From fc0d5a9d4fa825c8e54cc97f30b6403f68d714b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20Aslan?= Date: Thu, 20 Apr 2023 11:09:19 +0200 Subject: [PATCH 26/28] [docs] fixed missing space and changed syntax highlighting js->html --- docs/RuntimeConfig/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/RuntimeConfig/index.md b/docs/RuntimeConfig/index.md index 2d85faa8..63072aa5 100644 --- a/docs/RuntimeConfig/index.md +++ b/docs/RuntimeConfig/index.md @@ -66,7 +66,7 @@ To make this adjustment, you can use the `precision` property to perform a *glob By setting `precision: 2`, the 1920 x-position will be mapped to a 3840-output pixel coordinate, effectively upscaling the content for 4K resolution. Please note that upscaling may result in reduced performance due to the higher GPU memory usage. -Keep in mind thatWebGL rasterizes at pixel boundaries. This means that when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you'll need to set the sizing at a multiple of 3 to ensure proper rendering. +Keep in mind that WebGL rasterizes at pixel boundaries. This means that when it uses a line width of 2 in 1080p quality, it may render at either 2px or 3px in 720p (depending on the rendered pixel offset). If you encounter such problems, you'll need to set the sizing at a multiple of 3 to ensure proper rendering. # Handling high pixel density (high DPI) @@ -78,7 +78,7 @@ It's worth noting that canvas elements, like most graphics elements, have two si For a canvas element, the size of the content or drawingBuffer is determined by the width and height attributes of the canvas, while the display size is determined by the CSS attributes applied to the canvas. Setting `devicePixelRatio: 2` will result in the following: -```js +```html ``` From ca293e7a23b7fd56cbe21f582c572c731dedc397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20Aslan?= Date: Thu, 20 Apr 2023 11:53:33 +0200 Subject: [PATCH 27/28] Updated changelog and package.json for v2.10.0 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93853468..1184b522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## v2.10.0 +*20 apr 2023* + +- Integrated Vite to replace `rollup` bundler and integrated Vitest for unit testing +- Implemented word wrapping support on zero-width breaking spaces (#450) (docs: [Word Wrap in Non-Latin Based Languages](https://lightningjs.io/docs/#/lightning-core-reference/RenderEngine/Textures/Text?id=word-wrap-in-non-latin-based-languages) ) +- Added support for device pixel ratio with an option `devicePixelRatio` (docs: [Global Stage Scaling](https://lightningjs.io/docs/#/lightning-core-reference/RuntimeConfig/index?id=#global-stage-scaling), [Handling high pixel density](https://lightningjs.io/docs/#/lightning-core-reference/RuntimeConfig/index?id=#handling-high-pixel-density-high-dpi) ) +- Fixed issue with text rendering at high precision levels causing incorrect word wrapping (#470) +- Fixed issue with inability to override the id accessor of a Component with string (#456) +- Added first/last getters to TypeScript definitions for ObjectList +- Fixed documentation and TypeScript definitions for TextTexture `fontFace` +- Fixed TypeScript error with getByRef() when using generic type param as Ref value (#444) +- Implemented default loose type configs for TypeScript. + + ## v2.9.0 *16 feb 2023* diff --git a/package-lock.json b/package-lock.json index 5ae4a44e..dedecd0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lightningjs/core", - "version": "2.9.0", + "version": "2.10.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@lightningjs/core", - "version": "2.9.0", + "version": "2.10.0", "license": "Apache-2.0", "devDependencies": { "@babel/core": "^7.8.3", diff --git a/package.json b/package.json index 3093714f..d930debc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "author": "Metrological, Bas van Meurs ", "name": "@lightningjs/core", - "version": "2.9.0", + "version": "2.10.0", "license": "Apache-2.0", "type": "module", "types": "dist/index.d.ts", From bf19a693d9655c3eb0ff329ed261a5693f67249a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20Aslan?= Date: Thu, 20 Apr 2023 12:06:32 +0200 Subject: [PATCH 28/28] fixed changelog for v2.10.0 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1184b522..986a95b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,11 @@ ## v2.10.0 *20 apr 2023* -- Integrated Vite to replace `rollup` bundler and integrated Vitest for unit testing +- Integrated `Vite` to replace `rollup` bundler and integrated `Vitest` for unit testing - Implemented word wrapping support on zero-width breaking spaces (#450) (docs: [Word Wrap in Non-Latin Based Languages](https://lightningjs.io/docs/#/lightning-core-reference/RenderEngine/Textures/Text?id=word-wrap-in-non-latin-based-languages) ) - Added support for device pixel ratio with an option `devicePixelRatio` (docs: [Global Stage Scaling](https://lightningjs.io/docs/#/lightning-core-reference/RuntimeConfig/index?id=#global-stage-scaling), [Handling high pixel density](https://lightningjs.io/docs/#/lightning-core-reference/RuntimeConfig/index?id=#handling-high-pixel-density-high-dpi) ) - Fixed issue with text rendering at high precision levels causing incorrect word wrapping (#470) -- Fixed issue with inability to override the id accessor of a Component with string (#456) +- Fixed issue with inability to override the id accessor of a Component with string accessor (#456) - Added first/last getters to TypeScript definitions for ObjectList - Fixed documentation and TypeScript definitions for TextTexture `fontFace` - Fixed TypeScript error with getByRef() when using generic type param as Ref value (#444)