diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4247cf59..9737e639 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -24,6 +24,7 @@ jobs: cache: pnpm - name: Install Dependencies run: pnpm install --frozen-lockfile + - run: pnpm build - name: Lint Addon run: pnpm lint @@ -82,11 +83,11 @@ jobs: run: pnpm test:ember --launch ${{ matrix.browser }} working-directory: test-app - try-scenarios: + test_pre_built_ins: name: ${{ matrix.try-scenario }} runs-on: ubuntu-latest - needs: "test" timeout-minutes: 10 + needs: "lint" strategy: fail-fast: false @@ -98,6 +99,36 @@ jobs: - ember-lts-5.4 - ember-lts-5.8 - ember-lts-5.12 + - ember-lts-6.4 + + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Run Tests + working-directory: test-app + run: >- + node_modules/.bin/ember try:one ${{ matrix.try-scenario }} + --skip-cleanup + + try-scenarios: + name: ${{ matrix.try-scenario }} + runs-on: ubuntu-latest + needs: "test" + timeout-minutes: 10 + + strategy: + fail-fast: false + matrix: + try-scenario: + - native-collections-support + - ember-lts-6.8 - ember-release - ember-beta - ember-canary diff --git a/.gitignore b/.gitignore index 827f9daa..4af9481c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # compiled output dist/ +.log/ # dependencies node_modules/ @@ -14,3 +15,4 @@ node_modules/ npm-debug.log* yarn-error.log .DS_Store +tmp/ diff --git a/addon/.eslintrc.cjs b/addon/.eslintrc.cjs index 883796c7..bd2f3093 100644 --- a/addon/.eslintrc.cjs +++ b/addon/.eslintrc.cjs @@ -112,5 +112,11 @@ module.exports = { 'plugin:prettier/recommended', ], }, + { + files: ['src/-private/*', 'src/-private/new/*'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + }, + }, ], }; diff --git a/addon/.gitignore b/addon/.gitignore index eedd0d83..52c63b33 100644 --- a/addon/.gitignore +++ b/addon/.gitignore @@ -6,7 +6,6 @@ # compiled output dist/ -declarations/ # npm/pnpm/yarn pack output *.tgz diff --git a/addon/declarations/-private/array.d.ts b/addon/declarations/-private/array.d.ts new file mode 100644 index 00000000..a76b567d --- /dev/null +++ b/addon/declarations/-private/array.d.ts @@ -0,0 +1,20 @@ +declare class TrackedArray { + #private; + /** + * Creates an array from an iterable object. + * @param iterable An iterable object to convert to an array. + */ + static from(iterable: Iterable | ArrayLike): TrackedArray; + /** + * Creates an array from an iterable object. + * @param iterable An iterable object to convert to an array. + * @param mapfn A mapping function to call on every element of the array. + * @param thisArg Value of 'this' used to invoke the mapfn. + */ + static from(iterable: Iterable | ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: unknown): TrackedArray; + static of(...arr: T[]): TrackedArray; + constructor(arr?: T[]); +} +interface TrackedArray extends Array { +} +export default TrackedArray; \ No newline at end of file diff --git a/addon/declarations/-private/decorator.d.ts b/addon/declarations/-private/decorator.d.ts new file mode 100644 index 00000000..3cef54be --- /dev/null +++ b/addon/declarations/-private/decorator.d.ts @@ -0,0 +1,10 @@ +import { TrackedMap, TrackedWeakMap } from './map.ts'; +import { TrackedSet, TrackedWeakSet } from './set.ts'; +import TrackedArray from './array.ts'; +export default function tracked(obj: T[] | typeof Array): TrackedArray; +export default function tracked(obj: Set | typeof Set): TrackedSet; +export default function tracked(obj: Map | typeof Map): TrackedMap; +export default function tracked(obj: WeakSet | typeof WeakSet): TrackedWeakSet; +export default function tracked(obj: WeakMap | typeof WeakMap): TrackedWeakMap; +export default function tracked(obj: T | typeof Object): T; +export default function tracked(obj: object, key: string | symbol, desc?: PropertyDescriptor): void; diff --git a/addon/declarations/-private/map.d.ts b/addon/declarations/-private/map.d.ts new file mode 100644 index 00000000..db2dde85 --- /dev/null +++ b/addon/declarations/-private/map.d.ts @@ -0,0 +1,36 @@ +export declare class TrackedMap implements Map { + private collection; + private storages; + private vals; + private readStorageFor; + private dirtyStorageFor; + constructor(); + constructor(entries: readonly (readonly [K, V])[] | null); + constructor(iterable: Iterable); + get(key: K): V | undefined; + has(key: K): boolean; + entries(): MapIterator<[K, V]>; + keys(): MapIterator; + values(): MapIterator; + forEach(fn: (value: V, key: K, map: Map) => void): void; + get size(): number; + [Symbol.iterator](): MapIterator<[K, V]>; + get [Symbol.toStringTag](): string; + set(key: K, value: V): this; + delete(key: K): boolean; + clear(): void; +} +export declare class TrackedWeakMap implements WeakMap { + private storages; + private vals; + private readStorageFor; + private dirtyStorageFor; + constructor(); + constructor(iterable: Iterable); + constructor(entries: readonly [K, V][] | null); + get(key: K): V | undefined; + has(key: K): boolean; + set(key: K, value: V): this; + delete(key: K): boolean; + get [Symbol.toStringTag](): string; +} \ No newline at end of file diff --git a/addon/declarations/-private/object.d.ts b/addon/declarations/-private/object.d.ts new file mode 100644 index 00000000..843e6b9d --- /dev/null +++ b/addon/declarations/-private/object.d.ts @@ -0,0 +1,8 @@ +export interface TrackedObject { + fromEntries(entries: Iterable): { + [k: string]: T; + }; + new >(...args: Record extends T ? [] | [T] : [T]): T; +} +export declare const TrackedObject: TrackedObject; +export default TrackedObject; \ No newline at end of file diff --git a/addon/declarations/-private/set.d.ts b/addon/declarations/-private/set.d.ts new file mode 100644 index 00000000..8715db1b --- /dev/null +++ b/addon/declarations/-private/set.d.ts @@ -0,0 +1,39 @@ +export declare class TrackedSet implements Set { + private collection; + private storages; + private vals; + private storageFor; + private dirtyStorageFor; + constructor(); + constructor(values: readonly T[] | null); + constructor(iterable: Iterable); + has(value: T): boolean; + entries(): SetIterator<[T, T]>; + keys(): SetIterator; + values(): SetIterator; + union(other: ReadonlySetLike): Set; + intersection(other: ReadonlySetLike): Set; + difference(other: ReadonlySetLike): Set; + symmetricDifference(other: ReadonlySetLike): Set; + isSubsetOf(other: ReadonlySetLike): boolean; + isSupersetOf(other: ReadonlySetLike): boolean; + isDisjointFrom(other: ReadonlySetLike): boolean; + forEach(fn: (value1: T, value2: T, set: Set) => void): void; + get size(): number; + [Symbol.iterator](): SetIterator; + get [Symbol.toStringTag](): string; + add(value: T): this; + delete(value: T): boolean; + clear(): void; +} +export declare class TrackedWeakSet implements WeakSet { + private storages; + private vals; + private storageFor; + private dirtyStorageFor; + constructor(values?: readonly T[] | null); + has(value: T): boolean; + add(value: T): this; + delete(value: T): boolean; + get [Symbol.toStringTag](): string; +} \ No newline at end of file diff --git a/addon/declarations/index.d.ts b/addon/declarations/index.d.ts new file mode 100644 index 00000000..18e0af30 --- /dev/null +++ b/addon/declarations/index.d.ts @@ -0,0 +1,5 @@ +export { default as tracked } from './-private/decorator.ts'; +export { default as TrackedArray } from './-private/array.ts'; +export { default as TrackedObject } from './-private/object.ts'; +export { TrackedMap, TrackedWeakMap } from './-private/map.ts'; +export { TrackedSet, TrackedWeakSet } from './-private/set.ts'; \ No newline at end of file diff --git a/addon/package.json b/addon/package.json index 471926d6..da9fdaba 100644 --- a/addon/package.json +++ b/addon/package.json @@ -36,16 +36,14 @@ "dist" ], "scripts": { - "build": "concurrently 'npm:build:*'", - "build:js": "rollup --config", - "build:types": "glint --declaration", + "build": "rollup --config", "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"", "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"", "lint:hbs": "ember-template-lint . --no-error-on-unmatched-pattern", "lint:hbs:fix": "ember-template-lint . --fix --no-error-on-unmatched-pattern", "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", - "lint:types": "glint", + "lint:types": "tsc --noEmit", "prepack": "concurrently 'npm:build:*'", "start": "concurrently 'npm:start:*'", "start:js": "rollup --config --watch --no-watch.clearScreen", @@ -53,7 +51,7 @@ "test": "echo 'A v2 addon does not have tests, run tests in test-app'" }, "dependencies": { - "@embroider/addon-shim": "^1.8.7", + "@embroider/addon-shim": "^1.10.2", "decorator-transforms": "^2.0.0", "ember-tracked-storage-polyfill": "^1.0.0" }, @@ -62,6 +60,7 @@ "@babel/plugin-transform-typescript": "^7.24.4", "@babel/runtime": "^7.26.10", "@embroider/addon-dev": "^4.3.1", + "@embroider/macros": "^1.19.5", "@glint/core": "^1.4.0", "@glint/environment-ember-loose": "^1.4.0", "@glint/environment-ember-template-imports": "^1.4.0", diff --git a/addon/rollup.config.mjs b/addon/rollup.config.mjs index 62f6f90b..03a7623a 100644 --- a/addon/rollup.config.mjs +++ b/addon/rollup.config.mjs @@ -8,60 +8,21 @@ const addon = new Addon({ }); export default { - // This provides defaults that work well alongside `publicEntrypoints` below. - // You can augment this if you need to. output: addon.output(), plugins: [ - // These are the modules that users should be able to import from your - // addon. Anything not listed here may get optimized away. - // By default all your JavaScript modules (**/*.js) will be importable. - // But you are encouraged to tweak this to only cover the modules that make - // up your addon's public API. Also make sure your package.json#exports - // is aligned to the config here. - // See https://github.com/embroider-build/embroider/blob/main/docs/v2-faq.md#how-can-i-define-the-public-exports-of-my-addon - addon.publicEntrypoints(['**/*.js', 'index.js', 'template-registry.js']), - - // These are the modules that should get reexported into the traditional - // "app" tree. Things in here should also be in publicEntrypoints above, but - // not everything in publicEntrypoints necessarily needs to go here. - addon.appReexports([ - 'components/**/*.js', - 'helpers/**/*.js', - 'modifiers/**/*.js', - 'services/**/*.js', - ]), - - // Follow the V2 Addon rules about dependencies. Your code can import from - // `dependencies` and `peerDependencies` as well as standard Ember-provided - // package names. + /** + * NOTE: we have to output every module individually so that we can conditionally import some of them + */ + addon.publicEntrypoints(['index.js', '**/*.js']), addon.dependencies(), - - // This babel config should *not* apply presets or compile away ES modules. - // It exists only to provide development niceties for you, like automatic - // template colocation. - // - // By default, this will load the actual babel config from the file - // babel.config.json. babel({ extensions: ['.js', '.gjs', '.ts', '.gts'], babelHelpers: 'bundled', }), - // Ensure that standalone .hbs files are properly integrated as Javascript. - addon.hbs(), - - // Ensure that .gjs files are properly integrated as Javascript - addon.gjs(), - - // addons are allowed to contain imports of .css files, which we want rollup - // to leave alone and keep in the published output. - addon.keepAssets(['**/*.css']), - - // Remove leftover build artifacts when starting a new build. addon.clean(), - // Copy Readme and License into published package copy({ targets: [ { src: '../README.md', dest: '.' }, diff --git a/addon/src/-private/array.ts b/addon/src/-private/array.ts index d6191a60..5993d188 100644 --- a/addon/src/-private/array.ts +++ b/addon/src/-private/array.ts @@ -1,225 +1,23 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -// Unfortunately, TypeScript's ability to do inference *or* type-checking in a -// `Proxy`'s body is very limited, so we have to use a number of casts `as any` -// to make the internal accesses work. The type safety of these is guaranteed at -// the *call site* instead of within the body: you cannot do `Array.blah` in TS, -// and it will blow up in JS in exactly the same way, so it is safe to assume -// that properties within the getter have the correct type in TS. - import { - type TrackedStorage, - createStorage, - getValue, - setValue, -} from 'ember-tracked-storage-polyfill'; - -const ARRAY_GETTER_METHODS = new Set([ - Symbol.iterator, - 'concat', - 'entries', - 'every', - 'filter', - 'find', - 'findIndex', - 'flat', - 'flatMap', - 'forEach', - 'includes', - 'indexOf', - 'join', - 'keys', - 'lastIndexOf', - 'map', - 'reduce', - 'reduceRight', - 'slice', - 'some', - 'values', -]); + macroCondition, + appEmberSatisfies, + importSync, +} from '@embroider/macros'; -// For these methods, `Array` itself immediately gets the `.length` to return -// after invoking them. -const ARRAY_WRITE_THEN_READ_METHODS = new Set([ - 'fill', - 'push', - 'unshift', -]); +import type TrackedArrayType from './old/array.ts'; -function convertToInt(prop: number | string | symbol): number | null { - if (typeof prop === 'symbol') return null; +export let TrackedArray: typeof TrackedArrayType; +export interface TrackedArray extends Array {} - const num = Number(prop); +/** + * https://rfcs.emberjs.com/id/1068-tracked-collections + */ +if (macroCondition(appEmberSatisfies('^6.8.0-beta.1 || >= 6.8.0'))) { + const module = importSync('./new/array') as any; - if (isNaN(num)) return null; + TrackedArray = module.TrackedArray; +} else { + const module = importSync('./old/array') as any; - return num % 1 === 0 ? num : null; + TrackedArray = module.default; } - -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging -class TrackedArray { - /** - * Creates an array from an iterable object. - * @param iterable An iterable object to convert to an array. - */ - static from(iterable: Iterable | ArrayLike): TrackedArray; - - /** - * Creates an array from an iterable object. - * @param iterable An iterable object to convert to an array. - * @param mapfn A mapping function to call on every element of the array. - * @param thisArg Value of 'this' used to invoke the mapfn. - */ - static from( - iterable: Iterable | ArrayLike, - mapfn: (v: T, k: number) => U, - thisArg?: unknown, - ): TrackedArray; - - static from( - iterable: Iterable | ArrayLike, - mapfn?: (v: T, k: number) => U, - thisArg?: unknown, - ): TrackedArray | TrackedArray { - return mapfn - ? new TrackedArray(Array.from(iterable, mapfn, thisArg)) - : new TrackedArray(Array.from(iterable)); - } - - static of(...arr: T[]): TrackedArray { - return new TrackedArray(arr); - } - - constructor(arr: T[] = []) { - const clone = arr.slice(); - // eslint-disable-next-line @typescript-eslint/no-this-alias - const self = this; - - const boundFns = new Map any>(); - - /** - Flag to track whether we have *just* intercepted a call to `.push()` or - `.unshift()`, since in those cases (and only those cases!) the `Array` - itself checks `.length` to return from the function call. - */ - let nativelyAccessingLengthFromPushOrUnshift = false; - - return new Proxy(clone, { - get(target, prop /*, _receiver */) { - const index = convertToInt(prop); - - if (index !== null) { - self.#readStorageFor(index); - getValue(self.#collection); - - return target[index]; - } - - if (prop === 'length') { - // If we are reading `.length`, it may be a normal user-triggered - // read, or it may be a read triggered by Array itself. In the latter - // case, it is because we have just done `.push()` or `.unshift()`; in - // that case it is safe not to mark this as a *read* operation, since - // calling `.push()` or `.unshift()` cannot otherwise be part of a - // "read" operation safely, and if done during an *existing* read - // (e.g. if the user has already checked `.length` *prior* to this), - // that will still trigger the mutation-after-consumption assertion. - if (nativelyAccessingLengthFromPushOrUnshift) { - nativelyAccessingLengthFromPushOrUnshift = false; - } else { - getValue(self.#collection); - } - - return target[prop]; - } - - // Here, track that we are doing a `.push()` or `.unshift()` by setting - // the flag to `true` so that when the `.length` is read by `Array` (see - // immediately above), it knows not to dirty the collection. - if (ARRAY_WRITE_THEN_READ_METHODS.has(prop)) { - nativelyAccessingLengthFromPushOrUnshift = true; - } - - if (ARRAY_GETTER_METHODS.has(prop)) { - let fn = boundFns.get(prop); - - if (fn === undefined) { - fn = (...args) => { - getValue(self.#collection); - return (target as any)[prop](...args); - }; - - boundFns.set(prop, fn); - } - - return fn; - } - - return (target as any)[prop]; - }, - - set(target, prop, value /*, _receiver */) { - (target as any)[prop] = value; - - const index = convertToInt(prop); - - if (index !== null) { - self.#dirtyStorageFor(index); - self.#dirtyCollection(); - } else if (prop === 'length') { - self.#dirtyCollection(); - } - - return true; - }, - - getPrototypeOf() { - return TrackedArray.prototype; - }, - }) as TrackedArray; - } - - #collection = createStorage(null, () => false); - - #storages = new Map>(); - - #readStorageFor(index: number) { - let storage = this.#storages.get(index); - - if (storage === undefined) { - storage = createStorage(null, () => false); - this.#storages.set(index, storage); - } - - getValue(storage); - } - - #dirtyStorageFor(index: number): void { - const storage = this.#storages.get(index); - - if (storage) { - setValue(storage, null); - } - } - - #dirtyCollection() { - setValue(this.#collection, null); - this.#storages.clear(); - } -} - -// This rule is correct in the general case, but it doesn't understand -// declaration merging, which is how we're using the interface here. This says -// `TrackedArray` acts just like `Array`, but also has the properties -// declared via the `class` declaration above -- but without the cost of a -// subclass, which is much slower that the proxied array behavior. That is: a -// `TrackedArray` *is* an `Array`, just with a proxy in front of accessors and -// setters, rather than a subclass of an `Array` which would be de-optimized by -// the browsers. -// -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface TrackedArray extends Array {} - -export default TrackedArray; - -// Ensure instanceof works correctly -Object.setPrototypeOf(TrackedArray.prototype, Array.prototype); diff --git a/addon/src/-private/decorator.ts b/addon/src/-private/decorator.ts index 63d6db37..c2b52158 100644 --- a/addon/src/-private/decorator.ts +++ b/addon/src/-private/decorator.ts @@ -3,8 +3,8 @@ import { assert } from '@ember/debug'; import { TrackedMap, TrackedWeakMap } from './map.ts'; import { TrackedSet, TrackedWeakSet } from './set.ts'; -import TrackedArray from './array.ts'; -import TrackedObject from './object.ts'; +import { TrackedArray } from './array.ts'; +import { TrackedObject } from './object.ts'; export default function tracked(obj: T[] | typeof Array): TrackedArray; @@ -36,7 +36,7 @@ export default function tracked( desc?: PropertyDescriptor, ): unknown { if (key !== undefined && desc !== undefined) { - return glimmerTracked(obj, key, desc); + return glimmerTracked(obj, key as string, desc); } if (Array.isArray(obj)) { diff --git a/addon/src/-private/map.ts b/addon/src/-private/map.ts index ab30cc97..4df9bb17 100644 --- a/addon/src/-private/map.ts +++ b/addon/src/-private/map.ts @@ -1,207 +1,31 @@ import { - type TrackedStorage, - createStorage, - getValue, - setValue, -} from 'ember-tracked-storage-polyfill'; - -export class TrackedMap implements Map { - private collection = createStorage(null, () => false); - - private storages: Map> = new Map(); - - private vals: Map; - - private readStorageFor(key: K): void { - const { storages } = this; - let storage = storages.get(key); - - if (storage === undefined) { - storage = createStorage(null, () => false); - storages.set(key, storage); - } - - getValue(storage); - } - - private dirtyStorageFor(key: K): void { - const storage = this.storages.get(key); - - if (storage) { - setValue(storage, null); - } - } - - constructor(); - constructor(entries: readonly (readonly [K, V])[] | null); - constructor(iterable: Iterable); - constructor( - existing?: - | readonly (readonly [K, V])[] - | Iterable - | null - | undefined, - ) { - // TypeScript doesn't correctly resolve the overloads for calling the `Map` - // constructor for the no-value constructor. This resolves that. - this.vals = existing ? new Map(existing) : new Map(); - } - - // **** KEY GETTERS **** - get(key: K): V | undefined { - // entangle the storage for the key - this.readStorageFor(key); - - return this.vals.get(key); - } - - has(key: K): boolean { - this.readStorageFor(key); - - return this.vals.has(key); - } - - // **** ALL GETTERS **** - entries() { - getValue(this.collection); - - return this.vals.entries(); - } - - keys() { - getValue(this.collection); - - return this.vals.keys(); - } - - values() { - getValue(this.collection); - - return this.vals.values(); - } - - forEach(fn: (value: V, key: K, map: Map) => void): void { - getValue(this.collection); - - this.vals.forEach(fn); - } - - get size(): number { - getValue(this.collection); - - return this.vals.size; - } - - [Symbol.iterator]() { - getValue(this.collection); - - return this.vals[Symbol.iterator](); - } - - get [Symbol.toStringTag](): string { - return this.vals[Symbol.toStringTag]; - } - - // **** KEY SETTERS **** - set(key: K, value: V): this { - this.dirtyStorageFor(key); - setValue(this.collection, null); - - this.vals.set(key, value); - - return this; - } - - delete(key: K): boolean { - this.dirtyStorageFor(key); - setValue(this.collection, null); - - this.storages.delete(key); - return this.vals.delete(key); - } - - // **** ALL SETTERS **** - clear(): void { - this.storages.forEach((s) => setValue(s, null)); - this.storages.clear(); - - setValue(this.collection, null); - this.vals.clear(); - } + macroCondition, + appEmberSatisfies, + importSync, +} from '@embroider/macros'; + +import type { + TrackedMap as TrackedMapType, + TrackedWeakMap as TrackedWeakMapType, +} from './old/map.ts'; + +export interface TrackedMap extends Map {} +export let TrackedMap: typeof TrackedMapType; + +export interface TrackedWeakMap extends Map {} +export let TrackedWeakMap: typeof TrackedWeakMapType; + +/** + * https://rfcs.emberjs.com/id/1068-tracked-collections + */ +if (macroCondition(appEmberSatisfies('^6.8.0-beta.1 || >= 6.8.0'))) { + const module = importSync('./new/map') as any; + + TrackedMap = module.TrackedMap; + TrackedWeakMap = module.TrackedWeakMap; +} else { + const module = importSync('./old/map') as any; + + TrackedMap = module.TrackedMap; + TrackedWeakMap = module.TrackedWeakMap; } - -// So instanceof works -Object.setPrototypeOf(TrackedMap.prototype, Map.prototype); - -export class TrackedWeakMap - implements WeakMap -{ - private storages: WeakMap> = new WeakMap(); - - private vals: WeakMap; - - private readStorageFor(key: K): void { - const { storages } = this; - let storage = storages.get(key); - - if (storage === undefined) { - storage = createStorage(null, () => false); - storages.set(key, storage); - } - - getValue(storage); - } - - private dirtyStorageFor(key: K): void { - const storage = this.storages.get(key); - - if (storage) { - setValue(storage, null); - } - } - - constructor(); - constructor(iterable: Iterable); - constructor(entries: readonly [K, V][] | null); - constructor( - existing?: readonly [K, V][] | Iterable | null | undefined, - ) { - // TypeScript doesn't correctly resolve the overloads for calling the `Map` - // constructor for the no-value constructor. This resolves that. - this.vals = existing ? new WeakMap(existing) : new WeakMap(); - } - - get(key: K): V | undefined { - this.readStorageFor(key); - - return this.vals.get(key); - } - - has(key: K): boolean { - this.readStorageFor(key); - - return this.vals.has(key); - } - - set(key: K, value: V): this { - this.dirtyStorageFor(key); - - this.vals.set(key, value); - - return this; - } - - delete(key: K): boolean { - this.dirtyStorageFor(key); - - this.storages.delete(key); - return this.vals.delete(key); - } - - get [Symbol.toStringTag](): string { - return this.vals[Symbol.toStringTag]; - } -} - -// So instanceof works -Object.setPrototypeOf(TrackedWeakMap.prototype, WeakMap.prototype); diff --git a/addon/src/-private/new/array.ts b/addon/src/-private/new/array.ts new file mode 100644 index 00000000..3b88314a --- /dev/null +++ b/addon/src/-private/new/array.ts @@ -0,0 +1,65 @@ +import { trackedArray } from '@ember/reactive/collections'; + +// Old TrackedArray dirtied all values on change, regardless of whether the value +// actually changed. +const config = { + equals: () => false, + description: 'TrackedArray from tracked-built-ins', +}; + +export class TrackedArray { + static from(iterable: any, mapfn: any, thisArg?: any) { + return mapfn + ? new TrackedArray(Array.from(iterable, mapfn, thisArg)) + : new TrackedArray(Array.from(iterable)); + } + + static of(...arr: unknown[]) { + return new TrackedArray(arr); + } + constructor(arr: unknown[] = []) { + const reactive = trackedArray(arr, config); + + const boundFns = new WeakMap(); + + function call( + target: object, + receiver: object, + fn: (...args: unknown[]) => unknown, + ) { + let existing = boundFns.get(fn); + + if (!existing) { + existing = (...args: unknown[]) => { + const result = fn.apply(target, args); + + if (result === reactive) { + return receiver; + } + + return result; + }; + boundFns.set(fn, existing); + } + + return existing; + } + + return new Proxy(reactive, { + get(target, prop, receiver) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return call(target, receiver, value); + } + + return value; + }, + getPrototypeOf() { + return TrackedArray.prototype; + }, + }); + } +} +// Ensure instanceof works correctly +Object.setPrototypeOf(TrackedArray.prototype, Array.prototype); diff --git a/addon/src/-private/new/map.ts b/addon/src/-private/new/map.ts new file mode 100644 index 00000000..68b10b08 --- /dev/null +++ b/addon/src/-private/new/map.ts @@ -0,0 +1,54 @@ +import { trackedMap, trackedWeakMap } from '@ember/reactive/collections'; + +const mapConfig = { + equals: () => false, + description: 'TrackedMap from tracked-built-ins', +}; +const weakMapConfig = { + equals: () => false, + description: 'TrackedWeakMap from tracked-built-ins', +}; + +export class TrackedMap { + constructor(existing: any) { + const reactive = trackedMap(existing, mapConfig); + + return new Proxy(reactive, { + get(target, prop) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + getPrototypeOf() { + return TrackedMap.prototype; + }, + }); + } +} + +export class TrackedWeakMap { + constructor(values: any) { + const reactive = trackedWeakMap(values, weakMapConfig); + + return new Proxy(reactive, { + get(target, prop) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + getPrototypeOf() { + return TrackedWeakMap.prototype; + }, + }); + } +} + +// Ensure instanceof works correctly +Object.setPrototypeOf(TrackedMap.prototype, Map.prototype); +Object.setPrototypeOf(TrackedWeakMap.prototype, WeakMap.prototype); diff --git a/addon/src/-private/new/object.ts b/addon/src/-private/new/object.ts new file mode 100644 index 00000000..693452f6 --- /dev/null +++ b/addon/src/-private/new/object.ts @@ -0,0 +1,30 @@ +import { trackedObject } from '@ember/reactive/collections'; + +const config = { + equals: () => false, + description: 'TrackedObject from tracked-built-ins', +}; + +export class TrackedObject { + static fromEntries(entries: any) { + return new TrackedObject(Object.fromEntries(entries)); + } + + constructor(obj = {}) { + const reactive = trackedObject(obj, config); + + return new Proxy(reactive, { + get(target, prop) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + getPrototypeOf() { + return TrackedObject.prototype; + }, + }); + } +} diff --git a/addon/src/-private/new/set.ts b/addon/src/-private/new/set.ts new file mode 100644 index 00000000..25543763 --- /dev/null +++ b/addon/src/-private/new/set.ts @@ -0,0 +1,54 @@ +import { trackedSet, trackedWeakSet } from '@ember/reactive/collections'; + +const setConfig = { + equals: () => false, + description: 'TrackedSet from tracked-built-ins', +}; +const weakSetConfig = { + equals: () => false, + description: 'TrackedWeakSet from tracked-built-ins', +}; + +export class TrackedSet { + constructor(existing: any) { + const reactive = trackedSet(existing, setConfig); + + return new Proxy(reactive, { + get(target, prop) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + getPrototypeOf() { + return TrackedSet.prototype; + }, + }); + } +} + +export class TrackedWeakSet { + constructor(values: any) { + const reactive = trackedWeakSet(values, weakSetConfig); + + return new Proxy(reactive, { + get(target, prop) { + const value = Reflect.get(target, prop, target); + + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + getPrototypeOf() { + return TrackedWeakSet.prototype; + }, + }); + } +} + +// Ensure instanceof works correctly +Object.setPrototypeOf(TrackedSet.prototype, Set.prototype); +Object.setPrototypeOf(TrackedWeakSet.prototype, WeakSet.prototype); diff --git a/addon/src/-private/object.ts b/addon/src/-private/object.ts index 2a7dbad2..761f9482 100644 --- a/addon/src/-private/object.ts +++ b/addon/src/-private/object.ts @@ -1,116 +1,22 @@ import { - createStorage, - getValue, - setValue, -} from 'ember-tracked-storage-polyfill'; + macroCondition, + dependencySatisfies, + importSync, +} from '@embroider/macros'; -class TrackedObjectImplementation { - static fromEntries( - entries: Iterable, - ) { - return new TrackedObject(Object.fromEntries(entries)); - } +import type TrackedObjectType from './old/object.ts'; - constructor(...args: Record extends T ? [] | [T] : [T]); - constructor(obj = {}) { - const proto = Object.getPrototypeOf(obj); - const descs = Object.getOwnPropertyDescriptors(obj); +export let TrackedObject: TrackedObjectType; - const clone = Object.create(proto); +/** + * https://rfcs.emberjs.com/id/1068-tracked-collections + */ +if (macroCondition(dependencySatisfies('ember-source', '>= 6.8.0-beta.1'))) { + const module = importSync('./new/object') as any; - for (const prop in descs) { - Object.defineProperty(clone, prop, descs[prop]!); - } + TrackedObject = module.TrackedObject; +} else { + const module = importSync('./old/object') as any; - // eslint-disable-next-line @typescript-eslint/no-this-alias - const self = this; - - return new Proxy(clone, { - get(target, prop) { - self.#readStorageFor(prop); - - return target[prop]; - }, - - has(target, prop) { - self.#readStorageFor(prop); - - return prop in target; - }, - - ownKeys(target: T) { - getValue(self.#collection); - - return Reflect.ownKeys(target); - }, - - set(target, prop, value) { - target[prop] = value; - - self.#dirtyStorageFor(prop); - self.#dirtyCollection(); - - return true; - }, - - deleteProperty(target, prop) { - if (prop in target) { - delete target[prop]; - self.#dirtyStorageFor(prop); - self.#storages.delete(prop); - self.#dirtyCollection(); - } - - return true; - }, - - getPrototypeOf() { - return TrackedObjectImplementation.prototype; - }, - }); - } - - #storages = new Map(); - - #collection = createStorage(null, () => false); - - #readStorageFor(key: PropertyKey) { - let storage = this.#storages.get(key); - - if (storage === undefined) { - storage = createStorage(null, () => false); - this.#storages.set(key, storage); - } - - getValue(storage); - } - - #dirtyStorageFor(key: PropertyKey) { - const storage = this.#storages.get(key); - - if (storage) { - setValue(storage, null); - } - } - - #dirtyCollection() { - setValue(this.#collection, null); - } -} - -export interface TrackedObject { - fromEntries( - entries: Iterable, - ): { - [k: string]: T; - }; - - new >( - ...args: Record extends T ? [] | [T] : [T] - ): T; + TrackedObject = module.default; } - -export const TrackedObject: TrackedObject = - TrackedObjectImplementation as unknown as TrackedObject; - -export default TrackedObject; diff --git a/addon/src/-private/old/array.ts b/addon/src/-private/old/array.ts new file mode 100644 index 00000000..d6191a60 --- /dev/null +++ b/addon/src/-private/old/array.ts @@ -0,0 +1,225 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// Unfortunately, TypeScript's ability to do inference *or* type-checking in a +// `Proxy`'s body is very limited, so we have to use a number of casts `as any` +// to make the internal accesses work. The type safety of these is guaranteed at +// the *call site* instead of within the body: you cannot do `Array.blah` in TS, +// and it will blow up in JS in exactly the same way, so it is safe to assume +// that properties within the getter have the correct type in TS. + +import { + type TrackedStorage, + createStorage, + getValue, + setValue, +} from 'ember-tracked-storage-polyfill'; + +const ARRAY_GETTER_METHODS = new Set([ + Symbol.iterator, + 'concat', + 'entries', + 'every', + 'filter', + 'find', + 'findIndex', + 'flat', + 'flatMap', + 'forEach', + 'includes', + 'indexOf', + 'join', + 'keys', + 'lastIndexOf', + 'map', + 'reduce', + 'reduceRight', + 'slice', + 'some', + 'values', +]); + +// For these methods, `Array` itself immediately gets the `.length` to return +// after invoking them. +const ARRAY_WRITE_THEN_READ_METHODS = new Set([ + 'fill', + 'push', + 'unshift', +]); + +function convertToInt(prop: number | string | symbol): number | null { + if (typeof prop === 'symbol') return null; + + const num = Number(prop); + + if (isNaN(num)) return null; + + return num % 1 === 0 ? num : null; +} + +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging +class TrackedArray { + /** + * Creates an array from an iterable object. + * @param iterable An iterable object to convert to an array. + */ + static from(iterable: Iterable | ArrayLike): TrackedArray; + + /** + * Creates an array from an iterable object. + * @param iterable An iterable object to convert to an array. + * @param mapfn A mapping function to call on every element of the array. + * @param thisArg Value of 'this' used to invoke the mapfn. + */ + static from( + iterable: Iterable | ArrayLike, + mapfn: (v: T, k: number) => U, + thisArg?: unknown, + ): TrackedArray; + + static from( + iterable: Iterable | ArrayLike, + mapfn?: (v: T, k: number) => U, + thisArg?: unknown, + ): TrackedArray | TrackedArray { + return mapfn + ? new TrackedArray(Array.from(iterable, mapfn, thisArg)) + : new TrackedArray(Array.from(iterable)); + } + + static of(...arr: T[]): TrackedArray { + return new TrackedArray(arr); + } + + constructor(arr: T[] = []) { + const clone = arr.slice(); + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + const boundFns = new Map any>(); + + /** + Flag to track whether we have *just* intercepted a call to `.push()` or + `.unshift()`, since in those cases (and only those cases!) the `Array` + itself checks `.length` to return from the function call. + */ + let nativelyAccessingLengthFromPushOrUnshift = false; + + return new Proxy(clone, { + get(target, prop /*, _receiver */) { + const index = convertToInt(prop); + + if (index !== null) { + self.#readStorageFor(index); + getValue(self.#collection); + + return target[index]; + } + + if (prop === 'length') { + // If we are reading `.length`, it may be a normal user-triggered + // read, or it may be a read triggered by Array itself. In the latter + // case, it is because we have just done `.push()` or `.unshift()`; in + // that case it is safe not to mark this as a *read* operation, since + // calling `.push()` or `.unshift()` cannot otherwise be part of a + // "read" operation safely, and if done during an *existing* read + // (e.g. if the user has already checked `.length` *prior* to this), + // that will still trigger the mutation-after-consumption assertion. + if (nativelyAccessingLengthFromPushOrUnshift) { + nativelyAccessingLengthFromPushOrUnshift = false; + } else { + getValue(self.#collection); + } + + return target[prop]; + } + + // Here, track that we are doing a `.push()` or `.unshift()` by setting + // the flag to `true` so that when the `.length` is read by `Array` (see + // immediately above), it knows not to dirty the collection. + if (ARRAY_WRITE_THEN_READ_METHODS.has(prop)) { + nativelyAccessingLengthFromPushOrUnshift = true; + } + + if (ARRAY_GETTER_METHODS.has(prop)) { + let fn = boundFns.get(prop); + + if (fn === undefined) { + fn = (...args) => { + getValue(self.#collection); + return (target as any)[prop](...args); + }; + + boundFns.set(prop, fn); + } + + return fn; + } + + return (target as any)[prop]; + }, + + set(target, prop, value /*, _receiver */) { + (target as any)[prop] = value; + + const index = convertToInt(prop); + + if (index !== null) { + self.#dirtyStorageFor(index); + self.#dirtyCollection(); + } else if (prop === 'length') { + self.#dirtyCollection(); + } + + return true; + }, + + getPrototypeOf() { + return TrackedArray.prototype; + }, + }) as TrackedArray; + } + + #collection = createStorage(null, () => false); + + #storages = new Map>(); + + #readStorageFor(index: number) { + let storage = this.#storages.get(index); + + if (storage === undefined) { + storage = createStorage(null, () => false); + this.#storages.set(index, storage); + } + + getValue(storage); + } + + #dirtyStorageFor(index: number): void { + const storage = this.#storages.get(index); + + if (storage) { + setValue(storage, null); + } + } + + #dirtyCollection() { + setValue(this.#collection, null); + this.#storages.clear(); + } +} + +// This rule is correct in the general case, but it doesn't understand +// declaration merging, which is how we're using the interface here. This says +// `TrackedArray` acts just like `Array`, but also has the properties +// declared via the `class` declaration above -- but without the cost of a +// subclass, which is much slower that the proxied array behavior. That is: a +// `TrackedArray` *is* an `Array`, just with a proxy in front of accessors and +// setters, rather than a subclass of an `Array` which would be de-optimized by +// the browsers. +// +// eslint-disable-next-line @typescript-eslint/no-empty-interface +interface TrackedArray extends Array {} + +export default TrackedArray; + +// Ensure instanceof works correctly +Object.setPrototypeOf(TrackedArray.prototype, Array.prototype); diff --git a/addon/src/-private/old/map.ts b/addon/src/-private/old/map.ts new file mode 100644 index 00000000..ab30cc97 --- /dev/null +++ b/addon/src/-private/old/map.ts @@ -0,0 +1,207 @@ +import { + type TrackedStorage, + createStorage, + getValue, + setValue, +} from 'ember-tracked-storage-polyfill'; + +export class TrackedMap implements Map { + private collection = createStorage(null, () => false); + + private storages: Map> = new Map(); + + private vals: Map; + + private readStorageFor(key: K): void { + const { storages } = this; + let storage = storages.get(key); + + if (storage === undefined) { + storage = createStorage(null, () => false); + storages.set(key, storage); + } + + getValue(storage); + } + + private dirtyStorageFor(key: K): void { + const storage = this.storages.get(key); + + if (storage) { + setValue(storage, null); + } + } + + constructor(); + constructor(entries: readonly (readonly [K, V])[] | null); + constructor(iterable: Iterable); + constructor( + existing?: + | readonly (readonly [K, V])[] + | Iterable + | null + | undefined, + ) { + // TypeScript doesn't correctly resolve the overloads for calling the `Map` + // constructor for the no-value constructor. This resolves that. + this.vals = existing ? new Map(existing) : new Map(); + } + + // **** KEY GETTERS **** + get(key: K): V | undefined { + // entangle the storage for the key + this.readStorageFor(key); + + return this.vals.get(key); + } + + has(key: K): boolean { + this.readStorageFor(key); + + return this.vals.has(key); + } + + // **** ALL GETTERS **** + entries() { + getValue(this.collection); + + return this.vals.entries(); + } + + keys() { + getValue(this.collection); + + return this.vals.keys(); + } + + values() { + getValue(this.collection); + + return this.vals.values(); + } + + forEach(fn: (value: V, key: K, map: Map) => void): void { + getValue(this.collection); + + this.vals.forEach(fn); + } + + get size(): number { + getValue(this.collection); + + return this.vals.size; + } + + [Symbol.iterator]() { + getValue(this.collection); + + return this.vals[Symbol.iterator](); + } + + get [Symbol.toStringTag](): string { + return this.vals[Symbol.toStringTag]; + } + + // **** KEY SETTERS **** + set(key: K, value: V): this { + this.dirtyStorageFor(key); + setValue(this.collection, null); + + this.vals.set(key, value); + + return this; + } + + delete(key: K): boolean { + this.dirtyStorageFor(key); + setValue(this.collection, null); + + this.storages.delete(key); + return this.vals.delete(key); + } + + // **** ALL SETTERS **** + clear(): void { + this.storages.forEach((s) => setValue(s, null)); + this.storages.clear(); + + setValue(this.collection, null); + this.vals.clear(); + } +} + +// So instanceof works +Object.setPrototypeOf(TrackedMap.prototype, Map.prototype); + +export class TrackedWeakMap + implements WeakMap +{ + private storages: WeakMap> = new WeakMap(); + + private vals: WeakMap; + + private readStorageFor(key: K): void { + const { storages } = this; + let storage = storages.get(key); + + if (storage === undefined) { + storage = createStorage(null, () => false); + storages.set(key, storage); + } + + getValue(storage); + } + + private dirtyStorageFor(key: K): void { + const storage = this.storages.get(key); + + if (storage) { + setValue(storage, null); + } + } + + constructor(); + constructor(iterable: Iterable); + constructor(entries: readonly [K, V][] | null); + constructor( + existing?: readonly [K, V][] | Iterable | null | undefined, + ) { + // TypeScript doesn't correctly resolve the overloads for calling the `Map` + // constructor for the no-value constructor. This resolves that. + this.vals = existing ? new WeakMap(existing) : new WeakMap(); + } + + get(key: K): V | undefined { + this.readStorageFor(key); + + return this.vals.get(key); + } + + has(key: K): boolean { + this.readStorageFor(key); + + return this.vals.has(key); + } + + set(key: K, value: V): this { + this.dirtyStorageFor(key); + + this.vals.set(key, value); + + return this; + } + + delete(key: K): boolean { + this.dirtyStorageFor(key); + + this.storages.delete(key); + return this.vals.delete(key); + } + + get [Symbol.toStringTag](): string { + return this.vals[Symbol.toStringTag]; + } +} + +// So instanceof works +Object.setPrototypeOf(TrackedWeakMap.prototype, WeakMap.prototype); diff --git a/addon/src/-private/old/object.ts b/addon/src/-private/old/object.ts new file mode 100644 index 00000000..2a7dbad2 --- /dev/null +++ b/addon/src/-private/old/object.ts @@ -0,0 +1,116 @@ +import { + createStorage, + getValue, + setValue, +} from 'ember-tracked-storage-polyfill'; + +class TrackedObjectImplementation { + static fromEntries( + entries: Iterable, + ) { + return new TrackedObject(Object.fromEntries(entries)); + } + + constructor(...args: Record extends T ? [] | [T] : [T]); + constructor(obj = {}) { + const proto = Object.getPrototypeOf(obj); + const descs = Object.getOwnPropertyDescriptors(obj); + + const clone = Object.create(proto); + + for (const prop in descs) { + Object.defineProperty(clone, prop, descs[prop]!); + } + + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + return new Proxy(clone, { + get(target, prop) { + self.#readStorageFor(prop); + + return target[prop]; + }, + + has(target, prop) { + self.#readStorageFor(prop); + + return prop in target; + }, + + ownKeys(target: T) { + getValue(self.#collection); + + return Reflect.ownKeys(target); + }, + + set(target, prop, value) { + target[prop] = value; + + self.#dirtyStorageFor(prop); + self.#dirtyCollection(); + + return true; + }, + + deleteProperty(target, prop) { + if (prop in target) { + delete target[prop]; + self.#dirtyStorageFor(prop); + self.#storages.delete(prop); + self.#dirtyCollection(); + } + + return true; + }, + + getPrototypeOf() { + return TrackedObjectImplementation.prototype; + }, + }); + } + + #storages = new Map(); + + #collection = createStorage(null, () => false); + + #readStorageFor(key: PropertyKey) { + let storage = this.#storages.get(key); + + if (storage === undefined) { + storage = createStorage(null, () => false); + this.#storages.set(key, storage); + } + + getValue(storage); + } + + #dirtyStorageFor(key: PropertyKey) { + const storage = this.#storages.get(key); + + if (storage) { + setValue(storage, null); + } + } + + #dirtyCollection() { + setValue(this.#collection, null); + } +} + +export interface TrackedObject { + fromEntries( + entries: Iterable, + ): { + [k: string]: T; + }; + + new >( + ...args: Record extends T ? [] | [T] : [T] + ): T; +} + +export const TrackedObject: TrackedObject = + TrackedObjectImplementation as unknown as TrackedObject; + +export default TrackedObject; diff --git a/addon/src/-private/old/set.ts b/addon/src/-private/old/set.ts new file mode 100644 index 00000000..94047be8 --- /dev/null +++ b/addon/src/-private/old/set.ts @@ -0,0 +1,220 @@ +import { + type TrackedStorage, + createStorage, + getValue, + setValue, +} from 'ember-tracked-storage-polyfill'; + +export class TrackedSet implements Set { + private collection = createStorage(null, () => false); + + private storages: Map> = new Map(); + + private vals: Set; + + private storageFor(key: T): TrackedStorage { + const storages = this.storages; + let storage = storages.get(key); + + if (storage === undefined) { + storage = createStorage(null, () => false); + storages.set(key, storage); + } + + return storage; + } + + private dirtyStorageFor(key: T): void { + const storage = this.storages.get(key); + + if (storage) { + setValue(storage, null); + } + } + + constructor(); + constructor(values: readonly T[] | null); + constructor(iterable: Iterable); + constructor(existing?: readonly T[] | Iterable | null | undefined) { + this.vals = new Set(existing); + } + + // **** KEY GETTERS **** + has(value: T): boolean { + getValue(this.storageFor(value)); + + return this.vals.has(value); + } + + // **** ALL GETTERS **** + entries() { + getValue(this.collection); + + return this.vals.entries(); + } + + keys() { + getValue(this.collection); + + return this.vals.keys(); + } + + values() { + getValue(this.collection); + + return this.vals.values(); + } + + union(other: ReadonlySetLike): Set { + getValue(this.collection); + + return this.vals.union(other); + } + + intersection(other: ReadonlySetLike): Set { + getValue(this.collection); + + return this.vals.intersection(other); + } + + difference(other: ReadonlySetLike): Set { + getValue(this.collection); + + return this.vals.difference(other); + } + + symmetricDifference(other: ReadonlySetLike): Set { + getValue(this.collection); + + return this.vals.symmetricDifference(other); + } + + isSubsetOf(other: ReadonlySetLike): boolean { + getValue(this.collection); + + return this.vals.isSubsetOf(other); + } + + isSupersetOf(other: ReadonlySetLike): boolean { + getValue(this.collection); + + return this.vals.isSupersetOf(other); + } + + isDisjointFrom(other: ReadonlySetLike): boolean { + getValue(this.collection); + + return this.vals.isDisjointFrom(other); + } + + forEach(fn: (value1: T, value2: T, set: Set) => void): void { + getValue(this.collection); + + this.vals.forEach(fn); + } + + get size(): number { + getValue(this.collection); + + return this.vals.size; + } + + [Symbol.iterator]() { + getValue(this.collection); + + return this.vals[Symbol.iterator](); + } + + get [Symbol.toStringTag](): string { + return this.vals[Symbol.toStringTag]; + } + + // **** KEY SETTERS **** + add(value: T): this { + this.dirtyStorageFor(value); + setValue(this.collection, null); + + this.vals.add(value); + + return this; + } + + delete(value: T): boolean { + this.dirtyStorageFor(value); + setValue(this.collection, null); + + this.storages.delete(value); + return this.vals.delete(value); + } + + // **** ALL SETTERS **** + clear(): void { + this.storages.forEach((s) => setValue(s, null)); + setValue(this.collection, null); + + this.storages.clear(); + this.vals.clear(); + } +} + +// So instanceof works +Object.setPrototypeOf(TrackedSet.prototype, Set.prototype); + +export class TrackedWeakSet implements WeakSet { + private storages: WeakMap> = new WeakMap(); + + private vals: WeakSet; + + private storageFor(key: T): TrackedStorage { + const storages = this.storages; + let storage = storages.get(key); + + if (storage === undefined) { + storage = createStorage(null, () => false); + storages.set(key, storage); + } + + return storage; + } + + private dirtyStorageFor(key: T): void { + const storage = this.storages.get(key); + + if (storage) { + setValue(storage, null); + } + } + + constructor(values?: readonly T[] | null) { + this.vals = new WeakSet(values); + } + + has(value: T): boolean { + getValue(this.storageFor(value)); + + return this.vals.has(value); + } + + add(value: T): this { + // Add to vals first to get better error message + this.vals.add(value); + + this.dirtyStorageFor(value); + + return this; + } + + delete(value: T): boolean { + this.dirtyStorageFor(value); + + this.storages.delete(value); + return this.vals.delete(value); + } + + get [Symbol.toStringTag](): string { + return this.vals[Symbol.toStringTag]; + } +} + +// So instanceof works +Object.setPrototypeOf(TrackedWeakSet.prototype, WeakSet.prototype); diff --git a/addon/src/-private/set.ts b/addon/src/-private/set.ts index 94047be8..e3b7e402 100644 --- a/addon/src/-private/set.ts +++ b/addon/src/-private/set.ts @@ -1,220 +1,31 @@ import { - type TrackedStorage, - createStorage, - getValue, - setValue, -} from 'ember-tracked-storage-polyfill'; - -export class TrackedSet implements Set { - private collection = createStorage(null, () => false); - - private storages: Map> = new Map(); - - private vals: Set; - - private storageFor(key: T): TrackedStorage { - const storages = this.storages; - let storage = storages.get(key); - - if (storage === undefined) { - storage = createStorage(null, () => false); - storages.set(key, storage); - } - - return storage; - } - - private dirtyStorageFor(key: T): void { - const storage = this.storages.get(key); - - if (storage) { - setValue(storage, null); - } - } - - constructor(); - constructor(values: readonly T[] | null); - constructor(iterable: Iterable); - constructor(existing?: readonly T[] | Iterable | null | undefined) { - this.vals = new Set(existing); - } - - // **** KEY GETTERS **** - has(value: T): boolean { - getValue(this.storageFor(value)); - - return this.vals.has(value); - } - - // **** ALL GETTERS **** - entries() { - getValue(this.collection); - - return this.vals.entries(); - } - - keys() { - getValue(this.collection); - - return this.vals.keys(); - } - - values() { - getValue(this.collection); - - return this.vals.values(); - } - - union(other: ReadonlySetLike): Set { - getValue(this.collection); - - return this.vals.union(other); - } - - intersection(other: ReadonlySetLike): Set { - getValue(this.collection); - - return this.vals.intersection(other); - } - - difference(other: ReadonlySetLike): Set { - getValue(this.collection); - - return this.vals.difference(other); - } - - symmetricDifference(other: ReadonlySetLike): Set { - getValue(this.collection); - - return this.vals.symmetricDifference(other); - } - - isSubsetOf(other: ReadonlySetLike): boolean { - getValue(this.collection); - - return this.vals.isSubsetOf(other); - } - - isSupersetOf(other: ReadonlySetLike): boolean { - getValue(this.collection); - - return this.vals.isSupersetOf(other); - } - - isDisjointFrom(other: ReadonlySetLike): boolean { - getValue(this.collection); - - return this.vals.isDisjointFrom(other); - } - - forEach(fn: (value1: T, value2: T, set: Set) => void): void { - getValue(this.collection); - - this.vals.forEach(fn); - } - - get size(): number { - getValue(this.collection); - - return this.vals.size; - } - - [Symbol.iterator]() { - getValue(this.collection); - - return this.vals[Symbol.iterator](); - } - - get [Symbol.toStringTag](): string { - return this.vals[Symbol.toStringTag]; - } - - // **** KEY SETTERS **** - add(value: T): this { - this.dirtyStorageFor(value); - setValue(this.collection, null); - - this.vals.add(value); - - return this; - } - - delete(value: T): boolean { - this.dirtyStorageFor(value); - setValue(this.collection, null); - - this.storages.delete(value); - return this.vals.delete(value); - } - - // **** ALL SETTERS **** - clear(): void { - this.storages.forEach((s) => setValue(s, null)); - setValue(this.collection, null); - - this.storages.clear(); - this.vals.clear(); - } -} - -// So instanceof works -Object.setPrototypeOf(TrackedSet.prototype, Set.prototype); - -export class TrackedWeakSet implements WeakSet { - private storages: WeakMap> = new WeakMap(); - - private vals: WeakSet; - - private storageFor(key: T): TrackedStorage { - const storages = this.storages; - let storage = storages.get(key); - - if (storage === undefined) { - storage = createStorage(null, () => false); - storages.set(key, storage); - } - - return storage; - } - - private dirtyStorageFor(key: T): void { - const storage = this.storages.get(key); - - if (storage) { - setValue(storage, null); - } - } - - constructor(values?: readonly T[] | null) { - this.vals = new WeakSet(values); - } - - has(value: T): boolean { - getValue(this.storageFor(value)); - - return this.vals.has(value); - } - - add(value: T): this { - // Add to vals first to get better error message - this.vals.add(value); - - this.dirtyStorageFor(value); - - return this; - } - - delete(value: T): boolean { - this.dirtyStorageFor(value); - - this.storages.delete(value); - return this.vals.delete(value); - } - - get [Symbol.toStringTag](): string { - return this.vals[Symbol.toStringTag]; - } + macroCondition, + appEmberSatisfies, + importSync, +} from '@embroider/macros'; + +import type { + TrackedSet as TrackedSetType, + TrackedWeakSet as TrackedWeakSetType, +} from './old/set.ts'; + +export interface TrackedSet extends Set {} +export let TrackedSet: typeof TrackedSetType; + +export interface TrackedWeakSet extends WeakSet {} +export let TrackedWeakSet: typeof TrackedWeakSetType; + +/** + * https://rfcs.emberjs.com/id/1068-tracked-collections + */ +if (macroCondition(appEmberSatisfies('^6.8.0-beta.1 || >= 6.8.0'))) { + const module = importSync('./new/set') as any; + + TrackedSet = module.TrackedSet; + TrackedWeakSet = module.TrackedWeakSet; +} else { + const module = importSync('./old/set') as any; + + TrackedSet = module.TrackedSet; + TrackedWeakSet = module.TrackedWeakSet; } - -// So instanceof works -Object.setPrototypeOf(TrackedWeakSet.prototype, WeakSet.prototype); diff --git a/addon/src/index.ts b/addon/src/index.ts index de885b7d..c075bf1b 100644 --- a/addon/src/index.ts +++ b/addon/src/index.ts @@ -1,5 +1,5 @@ export { default as tracked } from './-private/decorator.ts'; -export { default as TrackedArray } from './-private/array.ts'; -export { default as TrackedObject } from './-private/object.ts'; +export { TrackedArray } from './-private/array.ts'; +export { TrackedObject } from './-private/object.ts'; export { TrackedMap, TrackedWeakMap } from './-private/map.ts'; export { TrackedSet, TrackedWeakSet } from './-private/set.ts'; diff --git a/addon/src/template-registry.ts b/addon/src/template-registry.ts deleted file mode 100644 index 0758d890..00000000 --- a/addon/src/template-registry.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Easily allow apps, which are not yet using strict mode templates, to consume your Glint types, by importing this file. -// Add all your components, helpers and modifiers to the template registry here, so apps don't have to do this. -// See https://typed-ember.gitbook.io/glint/environments/ember/authoring-addons - -// import type MyComponent from './components/my-component'; - -// Remove this once entries have been added! 👇 -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export default interface Registry { - // MyComponent: typeof MyComponent -} diff --git a/addon/tsconfig.json b/addon/tsconfig.json index 41c1040e..08c8a1fb 100644 --- a/addon/tsconfig.json +++ b/addon/tsconfig.json @@ -5,26 +5,9 @@ "types/**/*", "unpublished-development-types/**/*" ], - "glint": { - "environment": ["ember-loose", "ember-template-imports"] - }, "compilerOptions": { "allowJs": true, "lib": ["ESNext"], - "declarationDir": "declarations", - /** - https://www.typescriptlang.org/tsconfig#noEmit - - We want to emit declarations, so this option must be set to `false`. - @tsconfig/ember sets this to `true`, which is incompatible with our need to set `emitDeclarationOnly`. - @tsconfig/ember is more optimized for apps, which wouldn't emit anything, only type check. - */ - "noEmit": false, - /** - https://www.typescriptlang.org/tsconfig#emitDeclarationOnly - We want to only emit declarations as we use Rollup to emit JavaScript. - */ - "emitDeclarationOnly": true, /** https://www.typescriptlang.org/tsconfig#noEmitOnError @@ -51,6 +34,6 @@ can do the proper transformations on those files. */ "allowImportingTsExtensions": true, - "types": ["../node_modules/ember-source/types/stable"] + "types": ["../test-app/node_modules/ember-source/types/stable"] } } diff --git a/addon/types/glimmer.d.ts b/addon/types/glimmer.d.ts deleted file mode 100644 index 7baab8da..00000000 --- a/addon/types/glimmer.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare module '@glimmer/env' { - export const DEBUG: boolean; -} - -declare module '@glimmer/tracking' { - export function tracked( - target: object, - key: string | symbol, - desc: PropertyDescriptor, - ): PropertyDescriptor; -} diff --git a/addon/unpublished-development-types/index.d.ts b/addon/unpublished-development-types/index.d.ts deleted file mode 100644 index 17935511..00000000 --- a/addon/unpublished-development-types/index.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Add any types here that you need for local development only. -// These will *not* be published as part of your addon, so be careful that your published code does not rely on them! - -import '@glint/environment-ember-loose'; -import '@glint/environment-ember-template-imports'; - -declare module '@glint/environment-ember-loose/registry' { - // Remove this once entries have been added! 👇 - // eslint-disable-next-line @typescript-eslint/no-empty-interface - export default interface Registry { - // Add any registry entries from other addons here that your addon itself uses (in non-strict mode templates) - // See https://typed-ember.gitbook.io/glint/using-glint/ember/using-addons - } -} diff --git a/package.json b/package.json index c88befc1..619d3a89 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "test": "cd test-app && pnpm run test:ember" }, "devDependencies": { - "ember-source": "^6.0.0", "release-plan": "^0.16.0", "typescript": "^5.5.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e43669cf..e368049c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: devDependencies: - ember-source: - specifier: ^6.0.0 - version: 6.9.0(@glimmer/component@2.0.0)(rsvp@4.8.5) release-plan: specifier: ^0.16.0 version: 0.16.0 @@ -21,7 +18,7 @@ importers: addon: dependencies: '@embroider/addon-shim': - specifier: ^1.8.7 + specifier: ^1.10.2 version: 1.10.2 decorator-transforms: specifier: ^2.0.0 @@ -32,7 +29,7 @@ importers: devDependencies: '@babel/core': specifier: ^7.24.4 - version: 7.28.4(supports-color@8.1.1) + version: 7.28.4 '@babel/plugin-transform-typescript': specifier: ^7.24.4 version: 7.28.0(@babel/core@7.28.4) @@ -42,15 +39,18 @@ importers: '@embroider/addon-dev': specifier: ^4.3.1 version: 4.3.1(@glint/template@1.6.1)(rollup@4.52.4) + '@embroider/macros': + specifier: ^1.19.5 + version: 1.19.5(@glint/template@1.6.1) '@glint/core': specifier: ^1.4.0 version: 1.5.2(typescript@5.9.3) '@glint/environment-ember-loose': specifier: ^1.4.0 - version: 1.5.2(@glimmer/component@2.0.0)(@glint/template@1.6.1)(ember-cli-htmlbars@6.3.0)(ember-modifier@4.2.2(@babel/core@7.28.4)) + version: 1.5.2(@glint/template@1.6.1) '@glint/environment-ember-template-imports': specifier: ^1.4.0 - version: 1.5.2(@glint/environment-ember-loose@1.5.2(@glimmer/component@2.0.0)(@glint/template@1.6.1)(ember-cli-htmlbars@6.3.0)(ember-modifier@4.2.2(@babel/core@7.28.4)))(@glint/template@1.6.1) + version: 1.5.2(@glint/environment-ember-loose@1.5.2(@glint/template@1.6.1))(@glint/template@1.6.1) '@glint/template': specifier: ^1.4.0 version: 1.6.1 @@ -92,7 +92,7 @@ importers: version: 17.23.1(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) + version: 5.5.4(@types/eslint@8.56.12)(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) prettier: specifier: ^3.2.5 version: 3.6.2 @@ -122,16 +122,19 @@ importers: version: 4.0.1 '@ember/test-helpers': specifier: ^4.0.4 - version: 4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)) + version: 4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)) '@embroider/compat': - specifier: ^3.7.0 - version: 3.9.1(@embroider/core@3.5.7(@glint/template@1.6.1))(@glint/template@1.6.1) + specifier: ^3.9.2 + version: 3.9.3(@embroider/core@3.5.9(@glint/template@1.6.1))(@glint/template@1.6.1) '@embroider/core': - specifier: ^3.4.19 - version: 3.5.7(@glint/template@1.6.1) + specifier: ^3.5.8 + version: 3.5.9(@glint/template@1.6.1) + '@embroider/macros': + specifier: ^1.19.5 + version: 1.19.5(@glint/template@1.6.1) '@embroider/webpack': - specifier: ^4.0.8 - version: 4.1.1(@embroider/core@3.5.7(@glint/template@1.6.1))(webpack@5.102.0) + specifier: ^4.1.1 + version: 4.1.1(@embroider/core@3.5.9(@glint/template@1.6.1))(webpack@5.102.0) '@glimmer/component': specifier: ^2.0.0 version: 2.0.0 @@ -165,15 +168,18 @@ importers: concurrently: specifier: ^8.2.1 version: 8.2.2 + decorator-transforms: + specifier: ^2.0.0 + version: 2.3.0(@babel/core@7.28.4) ember-auto-import: - specifier: ^2.10.0 + specifier: ^2.11.1 version: 2.11.1(@glint/template@1.6.1)(webpack@5.102.0) ember-cli: - specifier: ~5.4.0 - version: 5.4.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7) + specifier: ~6.7.1 + version: 6.7.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7) ember-cli-app-version: specifier: ^6.0.1 - version: 6.0.1(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)) + version: 6.0.1(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)) ember-cli-babel: specifier: ^8.0.0 version: 8.2.0(@babel/core@7.28.4) @@ -182,7 +188,7 @@ importers: version: 3.0.0 ember-cli-dependency-checker: specifier: ^3.3.2 - version: 3.3.3(ember-cli@5.4.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7)) + version: 3.3.3(ember-cli@6.7.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7)) ember-cli-htmlbars: specifier: ^6.3.0 version: 6.3.0 @@ -203,13 +209,13 @@ importers: version: 4.2.2(@babel/core@7.28.4) ember-qunit: specifier: ^8.0.1 - version: 8.1.1(@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)))(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0))(qunit@2.24.1) + version: 8.1.1(@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)))(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5))(qunit@2.24.1) ember-resolver: specifier: ^11.0.1 - version: 11.0.1(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)) + version: 11.0.1(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)) ember-source: - specifier: ~5.4.0 - version: 5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0) + specifier: ~6.8.0-beta.1 + version: 6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5) ember-source-channel-url: specifier: ^3.0.0 version: 3.0.0(encoding@0.1.13) @@ -217,8 +223,8 @@ importers: specifier: ^5.11.2 version: 5.13.0 ember-try: - specifier: ^2.0.0 - version: 2.0.0(encoding@0.1.13) + specifier: ^4.0.0 + version: 4.0.0(encoding@0.1.13) eslint: specifier: ^8.49.0 version: 8.57.1 @@ -915,6 +921,18 @@ packages: '@ember-data/rfc395-data@0.0.4': resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==} + '@ember-tooling/blueprint-blueprint@0.0.2': + resolution: {integrity: sha512-W0Ulvny2PT+80qy2X9wSlNTobgfobI3cNfxoDgIlEr1f5ifyUg6rydyErl9RUupPxfsvuya6ss9TV6y86+qOjA==} + + '@ember-tooling/blueprint-model@0.0.2': + resolution: {integrity: sha512-mZ6GZQE3zNfldN0qpZ8qAwCKH2fog60af72yppQueraYqRgL1SSd46An7sxRb1ur60+xlCMZAlj3086Fk1cKuQ==} + + '@ember-tooling/classic-build-addon-blueprint@6.7.1': + resolution: {integrity: sha512-WICdxgfmazYtDE+vak7jgJ04saxlUcpYPN6i7fXP8UpN+VEx4hQ4nFgm1Mw+EPVdQkkm1dziX4eKlCBqAaxxcQ==} + + '@ember-tooling/classic-build-app-blueprint@6.7.2': + resolution: {integrity: sha512-VLyBxd7aMkKqLFFhEmAgw/3l+McRWOlLnWUYDZjdxwrF8AAwOyLHgiP9AoGydPHGbKF5L40DkJDjWe+1T+5VWQ==} + '@ember/edition-utils@1.2.0': resolution: {integrity: sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog==} @@ -948,17 +966,21 @@ packages: peerDependencies: '@embroider/core': ^3.5.7 - '@embroider/compat@3.9.1': - resolution: {integrity: sha512-bFG1XZWC388OV0/tlCmzwEYX7i+G4sQCyTGFIz657r1ouQiCaCu6vFDNsumfwYZw/ixqJSUowbbvSucPwWHi4g==} + '@embroider/compat@3.9.3': + resolution: {integrity: sha512-Q/LQogLx00RNAobvah8SPqbEvQkZ0aBiyvIpKPE+ljCZOIVubcaIiq7OGtwmoH0GkhS72MsTfRzgYw+aKYYK/w==} engines: {node: 12.* || 14.* || >= 16} hasBin: true peerDependencies: - '@embroider/core': ^3.5.7 + '@embroider/core': ^3.5.9 '@embroider/core@3.5.7': resolution: {integrity: sha512-0oytko2+iaYS31TG9Axj7Py0e0FAccUhu9J1h7ldEnQegK+Eu5+OINU0dYQgt0ijp6f2yF4+o3J7u9CJCLZ1gw==} engines: {node: 12.* || 14.* || >= 16} + '@embroider/core@3.5.9': + resolution: {integrity: sha512-e6ChqCI2I4/UMnnGRS6be2pY3ssJDXfjrF1dtLt2e6l4EM2IIlT1ndtPAYUGSYSO9JB5WxNpO8Wirj88mVh97Q==} + engines: {node: 12.* || 14.* || >= 16} + '@embroider/hbs-loader@3.0.4': resolution: {integrity: sha512-k7ZWqOzZGQHyCciaPs87K5/nlaFOtXbLaRhjrBpSZJafXxbu21tYQWDjsQG5sfNhmX+izjQeZ/7fcimpG08edg==} engines: {node: 12.* || 14.* || >= 16} @@ -992,6 +1014,10 @@ packages: resolution: {integrity: sha512-8PJBsa37GD++SAfHf8rcJzlwDwuAQCBo0fr+eGxg9l8XhBXsTnE/7706dM4OqWew9XNqRXn39wfIGHZoBpjNMw==} engines: {node: 12.* || 14.* || >= 16} + '@embroider/shared-internals@2.9.2': + resolution: {integrity: sha512-d96ub/WkS1Gx6dRDxZ0mCRPwFAHIMlMr2iti6uTYxTFzC85Wgt6j7bYr6ppkEuwEwKQVyzKRT0kTsJz6P74caQ==} + engines: {node: 12.* || 14.* || >= 16} + '@embroider/shared-internals@3.0.1': resolution: {integrity: sha512-d7RQwDwqqHo7YvjE9t1rtIrCCYtbSoO0uRq2ikVhRh4hGS5OojZNu2ZtS0Wqrg+V72CRtMFr/hibTvHNsRM2Lg==} engines: {node: 12.* || 14.* || >= 16} @@ -1024,9 +1050,6 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@glimmer/compiler@0.84.3': - resolution: {integrity: sha512-cj9sGlnvExP9httxY6ZMivJRGulyaZ31DddCYB5h6LxupR4Nk2d1nAJCWPLsvuQJ8qR+eYw0y9aiY/VeT0krpQ==} - '@glimmer/compiler@0.94.11': resolution: {integrity: sha512-t9eyLZIFsiwAib8Zyfu67yBep5Vn2bd5DScIE2hharPE/OKKI7cpQYi6BzQhSGYEBVU82ITd/2TLvJ1K8eIahA==} engines: {node: '>= 18.0.0'} @@ -1035,15 +1058,9 @@ packages: resolution: {integrity: sha512-eATSzBOUm0MZ9+YfJx7Y5p3gbwnaeMzLSSsCDn1ihDtUOIm5YYEV0ee0G7tXt/uKxowt8tXYn/EMbI9OlRF0CA==} engines: {node: '>= 18'} - '@glimmer/destroyable@0.84.3': - resolution: {integrity: sha512-4tUw5UR4ntuySPvbcWyCMRjqxMJMV1GewjU3zGq22XvuBVFfq2K9WmuYV9H9FHg8X0MgDwcus+LjxrVSel39Sw==} - '@glimmer/destroyable@0.94.8': resolution: {integrity: sha512-IWNz34Q5IYnh20M/3xVv9jIdCATQyaO+8sdUSyUqiz1bAblW5vTXUNXn3uFzGF+CnP6ZSgPxHN/c1sNMAh+lAA==} - '@glimmer/encoder@0.84.3': - resolution: {integrity: sha512-T99YQDhNC/1rOFgiz8k4uzgzQsQ+r1my+WVXRv26o0r+/yOnKYndrb6WH/E9d+XtBIZbm1yCSm2BMFYelR0Nrg==} - '@glimmer/encoder@0.93.8': resolution: {integrity: sha512-G7ZbC+T+rn7UliG8Y3cn7SIACh7K5HgCxgFhJxU15HtmTUObs52mVR1SyhUBsbs86JHlCqaGguKE1WqP1jt+2g==} @@ -1062,36 +1079,18 @@ packages: '@glimmer/interfaces@0.94.6': resolution: {integrity: sha512-sp/1WePvB/8O+jrcUHwjboNPTKrdGicuHKA9T/lh0vkYK2qM5Xz4i25lQMQ38tEMiw7KixrjHiTUiaXRld+IwA==} - '@glimmer/low-level@0.78.2': - resolution: {integrity: sha512-0S6TWOOd0fzLLysw1pWZN0TgasaHmYs1Sjz9Til1mTByIXU1S+1rhdyr2veSQPO/aRjPuEQyKXZQHvx23Zax6w==} - - '@glimmer/manager@0.84.3': - resolution: {integrity: sha512-FtcwvrQ3HWlGRGChwlXiisMeKf9+XcCkMwVrrO0cxQavT01tIHx40OFtPOhXKGbgXGtRKcJI8XR41aK9t2kvyg==} - '@glimmer/manager@0.94.10': resolution: {integrity: sha512-Hqi92t6vtVg4nSRGWTvCJ+0Vg3iF1tiTG9RLzuUtZac7DIAzuQAxjhGbtu82miT+liCqU+MFmB3nkfNH0Zz74g==} - '@glimmer/node@0.84.3': - resolution: {integrity: sha512-QXlZjr7X6DDTJ3wiYQIHv2Pq/5sdGeTTW15+U+IosjZuQgvwCPJaeXC2CU8yqgA33yHgMgJpkdvLnPUCPrrhwg==} - '@glimmer/node@0.94.10': resolution: {integrity: sha512-8kw6K+RoKhjfprMO059M7x5yRZRK7WGLzD2056/G+65wV7gnJVDuh4qQirekaagjtskz6OdRBVWrSmrbICWtzQ==} - '@glimmer/opcode-compiler@0.84.3': - resolution: {integrity: sha512-flUuikKLFL9cekJUA10gJxMRCDjUPb61R3UCl1u69TGN0Nm7FTsMhOsVDtJLeeiAROtPx+NvasPw/6UB1rrdyg==} - '@glimmer/opcode-compiler@0.94.10': resolution: {integrity: sha512-KYsaODjkgtpUzMR1chyI0IRcvo4ewnjW8Dy+5833+OIG7rx6INl7HvKtooLzjHv+uJOZ74fd/s/0XfaY6eNEww==} - '@glimmer/owner@0.84.3': - resolution: {integrity: sha512-ZwA0rU4V8m0z4ncXtWD2QEU6eh61wkKKQUThahPYhfB+JYceVM6Grx7uWeiAxc2v3ncpvbYqIGdnICXDMloxAA==} - '@glimmer/owner@0.93.4': resolution: {integrity: sha512-xoclaVdCF4JH/yx8dHplCj6XFAa7ggwc7cyeOthRvTNGsp/J/CNKHT6NEkdERBYqy6tvg5GoONvWFdm8Wd5Uig==} - '@glimmer/program@0.84.3': - resolution: {integrity: sha512-D8z1lP8NEMyzT8gByFsZpmbRThZvGLS0Tl5AngaDbI2FqlcpEV0ujvLTzzgecd9QQ1k3Cd60dTgy/2N2CI82SA==} - '@glimmer/program@0.94.10': resolution: {integrity: sha512-a5rpsvBwrcAn0boV4ONy+dHr8tWSTvLAPTR1T1KxF0OBHRVciCAfBPRFemVO6Q3H117At9ifn3uoevtQ6H0M+Q==} @@ -1101,9 +1100,6 @@ packages: '@glimmer/reference@0.94.9': resolution: {integrity: sha512-qlgTYxgEOpgxuyb13u2qwqhibpfktlk08F+nfwuNxtuhodsItBi3YxjFMPrVP0zOjTnhUObR8OYtMsD5WFOddA==} - '@glimmer/runtime@0.84.3': - resolution: {integrity: sha512-LzlJbPDCUH/wjsgJ5kRImvOkqAImSyVRW37t34n/1Qd3v7ZoI8xVQg92lS+2kHZe030sT49ZwKkEIeVZiBreBw==} - '@glimmer/runtime@0.94.11': resolution: {integrity: sha512-96PqfxnkEW8k8dMydDmaXgijD7yvtIfjMkHoJ7ljUmE1icZ7jj6f+UIZ0LThpXMzkKaBe1xEapjr91Ldsvmqbg==} @@ -1131,22 +1127,13 @@ packages: '@glimmer/validator@0.95.0': resolution: {integrity: sha512-xF3K5voKeRqhONztfMHDd2wHDYD6UUI9pFPd+RMGtW6DXYv31G0zUm2pGsOwQ9dyNeE6khaXy7e3FtNjDrSmvQ==} - '@glimmer/vm-babel-plugins@0.84.3': - resolution: {integrity: sha512-fucWuuN7Q9QFB0ODd+PCltcTkmH4fLqYyXGArrfLt/TYN8gLv0yo00mPwFOSY7MWti/MUx88xd20/PycvYtg8w==} - '@glimmer/vm-babel-plugins@0.93.5': resolution: {integrity: sha512-xwVRgDjuadOB9qV1jyTKBrUgE/cpmixD/wIYnFf4+hNJRD39urteKRPw98xJSAt7Bw/6y5B8zsgwFS18Nknlrg==} engines: {node: '>=18.18.0'} - '@glimmer/vm@0.84.3': - resolution: {integrity: sha512-3mBWvQLEbB8We2EwdmuALMT3zQEcE13ItfLJ0wxlSO2uj1uegeHat++mli8RMxeYNqex27DC+VuhHeWVve6Ngg==} - '@glimmer/vm@0.94.8': resolution: {integrity: sha512-0E8BVNRE/1qlK9OQRUmGlQXwWmoco7vL3yIyLZpTWhbv22C1zEcM826wQT3ioaoUQSlvRsKKH6IEEUal2d3wxQ==} - '@glimmer/wire-format@0.84.3': - resolution: {integrity: sha512-aZVfQhqv4k7tTo2vwjy+b4mAxKt7cHH75JR3zAeCilimApa+yYTYUyY73NDNSUVbelgAlQ5s6vTiMSQ55WwVow==} - '@glimmer/wire-format@0.94.8': resolution: {integrity: sha512-A+Cp5m6vZMAEu0Kg/YwU2dJZXyYxVJs2zI57d3CP6NctmX7FsT8WjViiRUmt5abVmMmRH5b8BUovqY6GSMAdrw==} @@ -1391,17 +1378,17 @@ packages: resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} - '@pnpm/constants@7.1.1': - resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} - engines: {node: '>=16.14'} + '@pnpm/constants@1001.3.1': + resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} + engines: {node: '>=18.12'} - '@pnpm/error@5.0.3': - resolution: {integrity: sha512-ONJU5cUeoeJSy50qOYsMZQHTA/9QKmGgh1ATfEpCLgtbdwqUiwD9MxHNeXUYYI/pocBCz6r1ZCFqiQvO+8SUKA==} - engines: {node: '>=16.14'} + '@pnpm/error@1000.0.5': + resolution: {integrity: sha512-GjH0TPjbVNrPnl/BAGoFuBLJ2sFfXNKbS33lll/Ehe9yw0fyc8Kdw7kO9if37yQqn6vaa4dAHKkPllum7f/IPQ==} + engines: {node: '>=18.12'} - '@pnpm/find-workspace-dir@6.0.3': - resolution: {integrity: sha512-0iJnNkS4T8lJE4ldOhRERgER1o59iHA1nMlvpUI5lxNC9SUruH6peRUOlP4/rNcDg+UQ9u0rt5loYOnWKCojtw==} - engines: {node: '>=16.14'} + '@pnpm/find-workspace-dir@1000.1.3': + resolution: {integrity: sha512-4rdu8GPY9TeQwsYp5D2My74dC3dSVS3tghAvisG80ybK4lqa0gvlrglaSTBxogJbxqHRw/NjI/liEtb3+SD+Bw==} + engines: {node: '>=18.12'} '@pnpm/network.ca-file@1.0.2': resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} @@ -2186,10 +2173,6 @@ packages: resolution: {integrity: sha512-n+ktQ3JeyWrpRutSyPn2PsHeH+A94SVm+iUoogzf9VUqpP47FfWem24gpQXhn+p6+x5/BpuFJXMLXWt7ZoYAKA==} engines: {node: '>= 12.*'} - babel-plugin-filter-imports@4.0.0: - resolution: {integrity: sha512-jDLlxI8QnfKd7PtieH6pl4tZJzymzfCDCPGdTq/grgbiYAikwDPp/oL0IlFJn0HQjLpcLkyYhPKkUVneRESw5w==} - engines: {node: '>=8'} - babel-plugin-htmlbars-inline-precompile@5.3.1: resolution: {integrity: sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA==} engines: {node: 10.* || >= 12.*} @@ -2219,6 +2202,9 @@ packages: babel-plugin-syntax-dynamic-import@6.18.0: resolution: {integrity: sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==} + babel-remove-types@1.0.2: + resolution: {integrity: sha512-X2lmGht7sGkDgpBIaTmr8b/0aXKkMeHeJ5W0HgOdMp1KHyE3PHySHYfbYrfkVoISQsHppNv9yA+pDwhWqaxBSA==} + babylon@6.18.0: resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} hasBin: true @@ -2317,10 +2303,6 @@ packages: peerDependencies: '@babel/core': ^7.17.9 - broccoli-builder@0.18.14: - resolution: {integrity: sha512-YoUHeKnPi4xIGZ2XDVN9oHNA9k3xF5f5vlA+1wvrxIIDXqQU97gp2FxVAF503Zxdtt0C5CRB5n+47k2hlkaBzA==} - engines: {node: '>= 0.10.0'} - broccoli-caching-writer@2.3.1: resolution: {integrity: sha512-lfoDx98VaU8tG4mUXCxKdKyw2Lr+iSIGUjCgV83KC2zRC07SzYTGuSsMqpXFiOQlOGuoJxG3NRoyniBa1BWOqA==} @@ -2379,10 +2361,6 @@ packages: broccoli-node-api@1.7.0: resolution: {integrity: sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw==} - broccoli-node-info@1.1.0: - resolution: {integrity: sha512-DUohSZCdfXli/3iN6SmxPbck1OVG8xCkrLx47R25his06xVc1ZmmrOsrThiM8BsCWirwyocODiYJqNP5W2Hg1A==} - engines: {node: '>= 0.10.0'} - broccoli-node-info@2.2.0: resolution: {integrity: sha512-VabSGRpKIzpmC+r+tJueCE5h8k6vON7EIMMWu6d/FyPdtijwLQ7QvzShEw+m3mHoDzUaj/kiZsDYrS8X2adsBg==} engines: {node: 8.* || >= 10.*} @@ -2911,6 +2889,9 @@ packages: content-tag@2.0.3: resolution: {integrity: sha512-htLIdtfhhKW2fHlFLnZH7GFzHSdSpHhDLrWVswkNiiPMZ5uXq5JfrGboQKFhNQuAAFF8VNB2EYUj3MsdJrKKpg==} + content-tag@3.1.3: + resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==} + content-tag@4.0.0: resolution: {integrity: sha512-qqJiY9nueYAI396MOmfOk+w/0KL6ERKxANQcSKcR0CrNTc38yT//b73l+WHr9brZx57bFHNaW7a/6Yll0bn95w==} @@ -3162,16 +3143,16 @@ packages: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -3272,10 +3253,6 @@ packages: ember-cli-is-package-missing@1.0.0: resolution: {integrity: sha512-9hEoZj6Au5onlSDdcoBqYEPT8ehlYntZPxH8pBKV0GO7LNel88otSAQsCfXvbi2eKE+MaSeLG/gNaCI5UdWm9g==} - ember-cli-lodash-subset@2.0.1: - resolution: {integrity: sha512-QkLGcYv1WRK35g4MWu/uIeJ5Suk2eJXKtZ+8s+qE7C9INmpCPyPxzaqZABquYzcWNzIdw6kYwz3NWAFdKYFxwg==} - engines: {node: ^4.5 || 6.* || >= 7.*} - ember-cli-normalize-entity-name@1.0.0: resolution: {integrity: sha512-rF4P1rW2P1gVX1ynZYPmuIf7TnAFDiJmIUFI1Xz16VYykUAyiOCme0Y22LeZq8rTzwBMiwBwoE3RO4GYWehXZA==} @@ -3320,9 +3297,9 @@ packages: resolution: {integrity: sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q==} engines: {node: 10.* || >= 12.*} - ember-cli@5.4.2: - resolution: {integrity: sha512-EeeiTHo+rtat+YRv01q64Wmo+MRZETcZ7bPKBU14h9gSqSU0bHj57KGKsaQ+av8sOUojwWSqp+GQfOtwuWDgYA==} - engines: {node: '>= 18'} + ember-cli@6.7.2: + resolution: {integrity: sha512-e5TpmLPApKcNaYiJ6bUyLO2D4eDY0yDV0gydTHPWVxm/Y03HdVoAtdlP6a0gHeVB8TrVVYISetNf/WB8k8aKOQ==} + engines: {node: '>= 20.11'} hasBin: true ember-eslint-parser@0.5.11: @@ -3370,14 +3347,8 @@ packages: engines: {node: 10.* || 12.* || >= 14} hasBin: true - ember-source@5.4.1: - resolution: {integrity: sha512-9nDumNOxODPHUDE0s/mDelOnpB416PrngeG88Gxha3NLbjR2sgQV3K6KQ/w8sCaTGB3qVXNZSi+RqLPO+d74Ig==} - engines: {node: '>= 16.*'} - peerDependencies: - '@glimmer/component': ^1.1.2 - - ember-source@6.9.0: - resolution: {integrity: sha512-d/P2/z5Y82/EEn95JRkwYy/JckZTCAgfZZC3dhWWzzXt5ZGHbHbAhole0c4wuUyYz42thM6isJa3C97b/1PdcA==} + ember-source@6.8.2: + resolution: {integrity: sha512-z2ukdKj+97fmo6DqIajKcPFVFwxEIiHzcENmDQVMGlPUR9O7jtENOST7RS3xAiHdCdFoYKRuf7+g2GvNW/7hLw==} engines: {node: '>= 18.*'} peerDependencies: '@glimmer/component': '>= 1.1.2' @@ -3409,9 +3380,9 @@ packages: resolution: {integrity: sha512-jAv7fqYJK7QYYekPc/8Nr7KOqDpv/asqM6F8xcRnbmf9UrD35BkSffY63qUuiD9e0aR5qiMNBIQzH8f65rGDqw==} engines: {node: 10.* || 12.* || >= 14} - ember-try@2.0.0: - resolution: {integrity: sha512-2N7Vic45sbAegA5fhdfDjVbEVS4r+ze+tTQs2/wkY+8fC5yAGHfCM5ocyoTfBN5m7EhznC3AyMsOy4hLPzHFSQ==} - engines: {node: 10.* || 12.* || >= 14.*} + ember-try@4.0.0: + resolution: {integrity: sha512-gWG1k8+hio1rndJXxzIYhayL7ITof3ebkZ7HwFzFDaz3NARb8MjcVloKj1PFCheu8ZbY8iP8QTRPqb+J+N+Izg==} + engines: {node: '>= 18'} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3455,8 +3426,8 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} entities@6.0.1: @@ -3507,6 +3478,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.42.0: + resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3807,6 +3781,15 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -3975,6 +3958,9 @@ packages: fs-extra@5.0.0: resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==} + fs-extra@6.0.1: + resolution: {integrity: sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4087,8 +4073,8 @@ packages: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} - git-hooks-list@1.0.3: - resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} + git-hooks-list@3.2.0: + resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} git-repo-info@2.1.1: resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} @@ -4162,10 +4148,6 @@ packages: globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@10.0.0: - resolution: {integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==} - engines: {node: '>=8'} - globby@10.0.1: resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} engines: {node: '>=8'} @@ -4298,10 +4280,6 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - hosted-git-info@6.1.3: - resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hosted-git-info@8.1.0: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} @@ -4612,10 +4590,6 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4884,8 +4858,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@4.0.1: - resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} livereload-js@3.4.1: resolution: {integrity: sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==} @@ -4999,10 +4973,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -5045,8 +5015,8 @@ packages: peerDependencies: markdown-it: '>= 13.0.0' - markdown-it@13.0.2: - resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true matcher-collection@1.1.2: @@ -5072,8 +5042,8 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -5354,10 +5324,6 @@ packages: resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} engines: {node: ^18.17.0 || >=20.5.0} - npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-package-arg@12.0.2: resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5789,10 +5755,6 @@ packages: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} engines: {node: '>= 0.6'} - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5837,6 +5799,10 @@ packages: pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -6385,8 +6351,8 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@1.57.0: - resolution: {integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==} + sort-package-json@2.15.1: + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} hasBin: true source-map-js@1.2.1: @@ -6657,6 +6623,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + temp@0.9.4: resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} engines: {node: '>=6.0.0'} @@ -6719,6 +6689,10 @@ packages: tiny-lr@2.0.0: resolution: {integrity: sha512-f6nh0VMRvhGx4KCeK1lQ/jaL0Zdb5WdR+Jk8q9OSUQnaSDxAEGH1fgqLZ+cMl5EW3F2MGnCsalBO1IsnnogW1Q==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -6876,8 +6850,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -6999,10 +6973,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validate-npm-package-name@6.0.2: resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -7159,6 +7129,9 @@ packages: workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -7280,6 +7253,26 @@ snapshots: '@babel/compat-data@7.28.4': {} + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/core@7.28.4(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.27.1 @@ -7302,7 +7295,7 @@ snapshots: '@babel/eslint-parser@7.28.4(@babel/core@7.28.4)(eslint@8.57.1)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.1 eslint-visitor-keys: 2.1.0 @@ -7328,6 +7321,19 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7343,11 +7349,22 @@ snapshots: '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7361,6 +7378,13 @@ snapshots: '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-member-expression-to-functions@7.27.1(supports-color@8.1.1)': dependencies: '@babel/traverse': 7.28.4(supports-color@8.1.1) @@ -7368,6 +7392,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.27.1(supports-color@8.1.1)': dependencies: '@babel/traverse': 7.28.4(supports-color@8.1.1) @@ -7375,6 +7406,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7390,6 +7430,15 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7399,6 +7448,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7408,6 +7466,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1(supports-color@8.1.1)': dependencies: '@babel/traverse': 7.28.4(supports-color@8.1.1) @@ -7421,6 +7486,14 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-wrap-function@7.28.3(supports-color@8.1.1)': dependencies: '@babel/template': 7.27.2 @@ -7438,6 +7511,14 @@ snapshots: dependencies: '@babel/types': 7.28.4 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7448,14 +7529,23 @@ snapshots: '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7465,6 +7555,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7475,16 +7573,16 @@ snapshots: '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: @@ -7492,21 +7590,21 @@ snapshots: '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) transitivePeerDependencies: @@ -7514,7 +7612,7 @@ snapshots: '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.4)': @@ -7524,34 +7622,43 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: @@ -7562,6 +7669,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7573,13 +7689,21 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: @@ -7589,6 +7713,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7597,6 +7729,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7611,10 +7755,18 @@ snapshots: '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7625,25 +7777,33 @@ snapshots: '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: @@ -7655,13 +7815,21 @@ snapshots: '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: @@ -7671,6 +7839,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7682,33 +7859,33 @@ snapshots: '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) @@ -7716,16 +7893,50 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.28.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7736,25 +7947,36 @@ snapshots: '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7766,6 +7988,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7776,9 +8006,17 @@ snapshots: '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7789,8 +8027,16 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: @@ -7800,6 +8046,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7811,42 +8066,50 @@ snapshots: '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4)(supports-color@8.1.1) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4)(supports-color@8.1.1) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4)(supports-color@8.1.1) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -7857,26 +8120,26 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color @@ -7889,24 +8152,24 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 @@ -7915,6 +8178,82 @@ snapshots: core-js: 2.6.12 regenerator-runtime: 0.13.11 + '@babel/preset-env@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.45.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/preset-env@7.28.3(@babel/core@7.28.4)(supports-color@8.1.1)': dependencies: '@babel/compat-data': 7.28.4 @@ -7993,7 +8332,7 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.28.4 esutils: 2.0.3 @@ -8010,6 +8349,18 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/traverse@7.28.4(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.27.1 @@ -8072,6 +8423,42 @@ snapshots: '@ember-data/rfc395-data@0.0.4': {} + '@ember-tooling/blueprint-blueprint@0.0.2': {} + + '@ember-tooling/blueprint-model@0.0.2': + dependencies: + chalk: 4.1.2 + diff: 7.0.0 + isbinaryfile: 5.0.6 + lodash: 4.17.21 + promise.hash.helper: 1.0.8 + quick-temp: 0.1.8 + silent-error: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@ember-tooling/classic-build-addon-blueprint@6.7.1': + dependencies: + '@ember-tooling/blueprint-model': 0.0.2 + chalk: 4.1.2 + ember-cli-normalize-entity-name: 1.0.0 + ember-cli-string-utils: 1.1.0 + fs-extra: 11.3.2 + lodash: 4.17.21 + silent-error: 1.1.1 + sort-package-json: 2.15.1 + walk-sync: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@ember-tooling/classic-build-app-blueprint@6.7.2': + dependencies: + '@ember-tooling/blueprint-model': 0.0.2 + chalk: 4.1.2 + ember-cli-string-utils: 1.1.0 + transitivePeerDependencies: + - supports-color + '@ember/edition-utils@1.2.0': {} '@ember/optional-features@2.2.0': @@ -8087,7 +8474,7 @@ snapshots: '@ember/string@4.0.1': {} - '@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0))': + '@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5))': dependencies: '@ember/test-waiters': 4.1.1(@glint/template@1.6.1) '@embroider/addon-shim': 1.10.2 @@ -8095,7 +8482,7 @@ snapshots: '@simple-dom/interface': 1.4.0 decorator-transforms: 2.3.0(@babel/core@7.28.4) dom-element-descriptors: 0.5.1 - ember-source: 5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0) + ember-source: 6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5) transitivePeerDependencies: - '@babel/core' - '@glint/template' @@ -8137,16 +8524,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/babel-loader-9@3.1.2(@embroider/core@3.5.7(@glint/template@1.6.1))(supports-color@8.1.1)(webpack@5.102.0)': + '@embroider/babel-loader-9@3.1.2(@embroider/core@3.5.9(@glint/template@1.6.1))(supports-color@8.1.1)(webpack@5.102.0)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) - '@embroider/core': 3.5.7(@glint/template@1.6.1) + '@embroider/core': 3.5.9(@glint/template@1.6.1) babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.102.0) transitivePeerDependencies: - supports-color - webpack - '@embroider/compat@3.9.1(@embroider/core@3.5.7(@glint/template@1.6.1))(@glint/template@1.6.1)': + '@embroider/compat@3.9.3(@embroider/core@3.5.9(@glint/template@1.6.1))(@glint/template@1.6.1)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4(supports-color@8.1.1) @@ -8157,8 +8544,8 @@ snapshots: '@babel/preset-env': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) '@babel/runtime': 7.28.4 '@babel/traverse': 7.28.4(supports-color@8.1.1) - '@embroider/core': 3.5.7(@glint/template@1.6.1) - '@embroider/macros': 1.16.13(@glint/template@1.6.1) + '@embroider/core': 3.5.9(@glint/template@1.6.1) + '@embroider/macros': 1.19.5(@glint/template@1.6.1) '@types/babel__code-frame': 7.0.6 '@types/yargs': 17.0.33 assert-never: 1.4.0 @@ -8184,9 +8571,9 @@ snapshots: jsdom: 25.0.1(supports-color@8.1.1) lodash: 4.17.21 pkg-up: 3.1.0 - resolve: 1.22.10 + resolve: 1.22.11 resolve-package-path: 4.0.3 - semver: 7.7.2 + semver: 7.7.3 symlink-or-copy: 1.3.1 tree-sync: 2.1.0 typescript-memoize: 1.1.1 @@ -8200,12 +8587,46 @@ snapshots: - utf-8-validate '@embroider/core@3.5.7(@glint/template@1.6.1)': + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@embroider/macros': 1.16.13(@glint/template@1.6.1) + '@embroider/shared-internals': 2.9.1 + assert-never: 1.4.0 + babel-plugin-ember-template-compilation: 2.3.0 + broccoli-node-api: 1.7.0 + broccoli-persistent-filter: 3.1.3 + broccoli-plugin: 4.0.7 + broccoli-source: 3.0.1 + debug: 4.4.3 + fast-sourcemap-concat: 2.1.1 + filesize: 10.1.6 + fs-extra: 9.1.0 + fs-tree-diff: 2.0.1 + handlebars: 4.7.8 + js-string-escape: 1.0.1 + jsdom: 25.0.1 + lodash: 4.17.21 + resolve: 1.22.10 + resolve-package-path: 4.0.3 + semver: 7.7.2 + typescript-memoize: 1.1.1 + walk-sync: 3.0.0 + transitivePeerDependencies: + - '@glint/template' + - bufferutil + - canvas + - supports-color + - utf-8-validate + + '@embroider/core@3.5.9(@glint/template@1.6.1)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) '@babel/parser': 7.28.4 '@babel/traverse': 7.28.4(supports-color@8.1.1) - '@embroider/macros': 1.16.13(@glint/template@1.6.1) - '@embroider/shared-internals': 2.9.1(supports-color@8.1.1) + '@embroider/macros': 1.19.5(@glint/template@1.6.1) + '@embroider/shared-internals': 2.9.2 assert-never: 1.4.0 babel-plugin-ember-template-compilation: 2.3.0 broccoli-node-api: 1.7.0 @@ -8221,9 +8642,9 @@ snapshots: js-string-escape: 1.0.1 jsdom: 25.0.1(supports-color@8.1.1) lodash: 4.17.21 - resolve: 1.22.10 + resolve: 1.22.11 resolve-package-path: 4.0.3 - semver: 7.7.2 + semver: 7.7.3 typescript-memoize: 1.1.1 walk-sync: 3.0.0 transitivePeerDependencies: @@ -8233,9 +8654,9 @@ snapshots: - supports-color - utf-8-validate - '@embroider/hbs-loader@3.0.4(@embroider/core@3.5.7(@glint/template@1.6.1))(webpack@5.102.0)': + '@embroider/hbs-loader@3.0.4(@embroider/core@3.5.9(@glint/template@1.6.1))(webpack@5.102.0)': dependencies: - '@embroider/core': 3.5.7(@glint/template@1.6.1) + '@embroider/core': 3.5.9(@glint/template@1.6.1) webpack: 5.102.0 '@embroider/macros@1.16.13(@glint/template@1.6.1)': @@ -8271,7 +8692,24 @@ snapshots: '@embroider/shared-internals@2.9.0': dependencies: babel-import-util: 2.1.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 + ember-rfc176-data: 0.3.18 + fs-extra: 9.1.0 + is-subdir: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + minimatch: 3.1.2 + pkg-entry-points: 1.1.1 + resolve-package-path: 4.0.3 + semver: 7.7.3 + typescript-memoize: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@embroider/shared-internals@2.9.1': + dependencies: + babel-import-util: 2.1.1 + debug: 4.4.3 ember-rfc176-data: 0.3.18 fs-extra: 9.1.0 is-subdir: 1.2.0 @@ -8297,7 +8735,24 @@ snapshots: minimatch: 3.1.2 pkg-entry-points: 1.1.1 resolve-package-path: 4.0.3 - semver: 7.7.2 + semver: 7.7.3 + typescript-memoize: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@embroider/shared-internals@2.9.2': + dependencies: + babel-import-util: 2.1.1 + debug: 4.4.3(supports-color@8.1.1) + ember-rfc176-data: 0.3.18 + fs-extra: 9.1.0 + is-subdir: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + minimatch: 3.1.2 + pkg-entry-points: 1.1.1 + resolve-package-path: 4.0.3 + semver: 7.7.3 typescript-memoize: 1.1.1 transitivePeerDependencies: - supports-color @@ -8305,7 +8760,7 @@ snapshots: '@embroider/shared-internals@3.0.1': dependencies: babel-import-util: 3.0.1 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 ember-rfc176-data: 0.3.18 fs-extra: 9.1.0 is-subdir: 1.2.0 @@ -8320,13 +8775,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/webpack@4.1.1(@embroider/core@3.5.7(@glint/template@1.6.1))(webpack@5.102.0)': + '@embroider/webpack@4.1.1(@embroider/core@3.5.9(@glint/template@1.6.1))(webpack@5.102.0)': dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) '@babel/preset-env': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) - '@embroider/babel-loader-9': 3.1.2(@embroider/core@3.5.7(@glint/template@1.6.1))(supports-color@8.1.1)(webpack@5.102.0) - '@embroider/core': 3.5.7(@glint/template@1.6.1) - '@embroider/hbs-loader': 3.0.4(@embroider/core@3.5.7(@glint/template@1.6.1))(webpack@5.102.0) + '@embroider/babel-loader-9': 3.1.2(@embroider/core@3.5.9(@glint/template@1.6.1))(supports-color@8.1.1)(webpack@5.102.0) + '@embroider/core': 3.5.9(@glint/template@1.6.1) + '@embroider/hbs-loader': 3.0.4(@embroider/core@3.5.9(@glint/template@1.6.1))(webpack@5.102.0) '@embroider/shared-internals': 2.9.1(supports-color@8.1.1) '@types/supports-color': 8.1.3 assert-never: 1.4.0 @@ -8339,7 +8794,7 @@ snapshots: jsdom: 25.0.1(supports-color@8.1.1) lodash: 4.17.21 mini-css-extract-plugin: 2.9.4(webpack@5.102.0) - semver: 7.7.2 + semver: 7.7.3 source-map-url: 0.4.1 style-loader: 2.0.0(webpack@5.102.0) supports-color: 8.1.1 @@ -8361,7 +8816,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -8376,14 +8831,6 @@ snapshots: '@gar/promisify@1.1.3': {} - '@glimmer/compiler@0.84.3': - dependencies: - '@glimmer/interfaces': 0.84.3 - '@glimmer/syntax': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/wire-format': 0.84.3 - '@simple-dom/interface': 1.4.0 - '@glimmer/compiler@0.94.11': dependencies: '@glimmer/interfaces': 0.94.6 @@ -8398,24 +8845,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@glimmer/destroyable@0.84.3': - dependencies: - '@glimmer/env': 0.1.7 - '@glimmer/global-context': 0.84.3 - '@glimmer/interfaces': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/destroyable@0.94.8': dependencies: '@glimmer/global-context': 0.93.4 '@glimmer/interfaces': 0.94.6 - '@glimmer/encoder@0.84.3': - dependencies: - '@glimmer/env': 0.1.7 - '@glimmer/interfaces': 0.84.3 - '@glimmer/vm': 0.84.3 - '@glimmer/encoder@0.93.8': dependencies: '@glimmer/interfaces': 0.94.6 @@ -8438,18 +8872,6 @@ snapshots: '@simple-dom/interface': 1.4.0 type-fest: 4.41.0 - '@glimmer/low-level@0.78.2': {} - - '@glimmer/manager@0.84.3': - dependencies: - '@glimmer/destroyable': 0.84.3 - '@glimmer/env': 0.1.7 - '@glimmer/global-context': 0.84.3 - '@glimmer/interfaces': 0.84.3 - '@glimmer/reference': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/validator': 0.84.3 - '@glimmer/manager@0.94.10': dependencies: '@glimmer/destroyable': 0.94.8 @@ -8460,14 +8882,6 @@ snapshots: '@glimmer/validator': 0.95.0 '@glimmer/vm': 0.94.8 - '@glimmer/node@0.84.3': - dependencies: - '@glimmer/interfaces': 0.84.3 - '@glimmer/runtime': 0.84.3 - '@glimmer/util': 0.84.3 - '@simple-dom/document': 1.4.0 - '@simple-dom/interface': 1.4.0 - '@glimmer/node@0.94.10': dependencies: '@glimmer/interfaces': 0.94.6 @@ -8475,16 +8889,6 @@ snapshots: '@glimmer/util': 0.94.8 '@simple-dom/document': 1.4.0 - '@glimmer/opcode-compiler@0.84.3': - dependencies: - '@glimmer/encoder': 0.84.3 - '@glimmer/env': 0.1.7 - '@glimmer/interfaces': 0.84.3 - '@glimmer/reference': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/vm': 0.84.3 - '@glimmer/wire-format': 0.84.3 - '@glimmer/opcode-compiler@0.94.10': dependencies: '@glimmer/encoder': 0.93.8 @@ -8494,21 +8898,8 @@ snapshots: '@glimmer/vm': 0.94.8 '@glimmer/wire-format': 0.94.8 - '@glimmer/owner@0.84.3': - dependencies: - '@glimmer/util': 0.84.3 - '@glimmer/owner@0.93.4': {} - '@glimmer/program@0.84.3': - dependencies: - '@glimmer/encoder': 0.84.3 - '@glimmer/env': 0.1.7 - '@glimmer/interfaces': 0.84.3 - '@glimmer/manager': 0.84.3 - '@glimmer/opcode-compiler': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/program@0.94.10': dependencies: '@glimmer/interfaces': 0.94.6 @@ -8533,22 +8924,6 @@ snapshots: '@glimmer/util': 0.94.8 '@glimmer/validator': 0.95.0 - '@glimmer/runtime@0.84.3': - dependencies: - '@glimmer/destroyable': 0.84.3 - '@glimmer/env': 0.1.7 - '@glimmer/global-context': 0.84.3 - '@glimmer/interfaces': 0.84.3 - '@glimmer/low-level': 0.78.2 - '@glimmer/owner': 0.84.3 - '@glimmer/program': 0.84.3 - '@glimmer/reference': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/validator': 0.84.3 - '@glimmer/vm': 0.84.3 - '@glimmer/wire-format': 0.84.3 - '@simple-dom/interface': 1.4.0 - '@glimmer/runtime@0.94.11': dependencies: '@glimmer/destroyable': 0.94.8 @@ -8604,32 +8979,16 @@ snapshots: '@glimmer/global-context': 0.93.4 '@glimmer/interfaces': 0.94.6 - '@glimmer/vm-babel-plugins@0.84.3(@babel/core@7.28.4)': - dependencies: - babel-plugin-debug-macros: 0.3.4(@babel/core@7.28.4) - transitivePeerDependencies: - - '@babel/core' - '@glimmer/vm-babel-plugins@0.93.5(@babel/core@7.28.4)': dependencies: babel-plugin-debug-macros: 0.3.4(@babel/core@7.28.4) transitivePeerDependencies: - '@babel/core' - '@glimmer/vm@0.84.3': - dependencies: - '@glimmer/interfaces': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/vm@0.94.8': dependencies: '@glimmer/interfaces': 0.94.6 - '@glimmer/wire-format@0.84.3': - dependencies: - '@glimmer/interfaces': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/wire-format@0.94.8': dependencies: '@glimmer/interfaces': 0.94.6 @@ -8657,9 +9016,13 @@ snapshots: ember-cli-htmlbars: 6.3.0 ember-modifier: 4.2.2(@babel/core@7.28.4) - '@glint/environment-ember-template-imports@1.5.2(@glint/environment-ember-loose@1.5.2(@glimmer/component@2.0.0)(@glint/template@1.6.1)(ember-cli-htmlbars@6.3.0)(ember-modifier@4.2.2(@babel/core@7.28.4)))(@glint/template@1.6.1)': + '@glint/environment-ember-loose@1.5.2(@glint/template@1.6.1)': + dependencies: + '@glint/template': 1.6.1 + + '@glint/environment-ember-template-imports@1.5.2(@glint/environment-ember-loose@1.5.2(@glint/template@1.6.1))(@glint/template@1.6.1)': dependencies: - '@glint/environment-ember-loose': 1.5.2(@glimmer/component@2.0.0)(@glint/template@1.6.1)(ember-cli-htmlbars@6.3.0)(ember-modifier@4.2.2(@babel/core@7.28.4)) + '@glint/environment-ember-loose': 1.5.2(@glint/template@1.6.1) '@glint/template': 1.6.1 content-tag: 2.0.3 @@ -8672,7 +9035,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8880,15 +9243,15 @@ snapshots: '@pnpm/config.env-replace@1.1.0': {} - '@pnpm/constants@7.1.1': {} + '@pnpm/constants@1001.3.1': {} - '@pnpm/error@5.0.3': + '@pnpm/error@1000.0.5': dependencies: - '@pnpm/constants': 7.1.1 + '@pnpm/constants': 1001.3.1 - '@pnpm/find-workspace-dir@6.0.3': + '@pnpm/find-workspace-dir@1000.1.3': dependencies: - '@pnpm/error': 5.0.3 + '@pnpm/error': 1000.0.5 find-up: 5.0.0 '@pnpm/network.ca-file@1.0.2': @@ -8903,8 +9266,8 @@ snapshots: '@rollup/plugin-babel@6.0.4(@babel/core@7.28.4)(rollup@4.52.4)': dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 5.3.0(rollup@4.52.4) optionalDependencies: rollup: 4.52.4 @@ -9210,7 +9573,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 eslint: 8.57.1 optionalDependencies: typescript: 5.9.3 @@ -9247,7 +9610,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: @@ -9277,7 +9640,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -9625,7 +9988,7 @@ snapshots: async-disk-cache@2.1.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 heimdalljs: 0.2.6 istextorbinary: 2.6.0 mkdirp: 0.5.6 @@ -9686,7 +10049,7 @@ snapshots: babel-plugin-debug-macros@0.3.4(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 semver: 5.7.2 babel-plugin-ember-data-packages-polyfill@0.1.2: @@ -9707,11 +10070,6 @@ snapshots: '@glimmer/syntax': 0.95.0 babel-import-util: 3.0.1 - babel-plugin-filter-imports@4.0.0: - dependencies: - '@babel/types': 7.28.4 - lodash: 4.17.21 - babel-plugin-htmlbars-inline-precompile@5.3.1: dependencies: babel-plugin-ember-modules-api-polyfill: 3.5.0 @@ -9736,6 +10094,15 @@ snapshots: reselect: 4.1.8 resolve: 1.22.10 + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4): + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4)(supports-color@8.1.1): dependencies: '@babel/compat-data': 7.28.4 @@ -9745,6 +10112,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + core-js-compat: 3.45.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4)(supports-color@8.1.1): dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -9753,6 +10128,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4)(supports-color@8.1.1): dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) @@ -9762,6 +10144,15 @@ snapshots: babel-plugin-syntax-dynamic-import@6.18.0: {} + babel-remove-types@1.0.2: + dependencies: + '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + prettier: 2.8.8 + transitivePeerDependencies: + - supports-color + babylon@6.18.0: {} backbone@1.6.1: @@ -9887,7 +10278,7 @@ snapshots: broccoli-babel-transpiler@7.8.1: dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/polyfill': 7.12.1 broccoli-funnel: 2.0.2 broccoli-merge-trees: 3.0.2 @@ -9916,18 +10307,6 @@ snapshots: transitivePeerDependencies: - supports-color - broccoli-builder@0.18.14: - dependencies: - broccoli-node-info: 1.1.0 - heimdalljs: 0.2.6 - promise-map-series: 0.2.3 - quick-temp: 0.1.8 - rimraf: 2.7.1 - rsvp: 3.6.2 - silent-error: 1.1.1 - transitivePeerDependencies: - - supports-color - broccoli-caching-writer@2.3.1: dependencies: broccoli-kitchen-sink-helpers: 0.2.9 @@ -10035,7 +10414,7 @@ snapshots: dependencies: array-equal: 1.0.2 broccoli-plugin: 4.0.7 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 fs-tree-diff: 2.0.1 heimdalljs: 0.2.6 minimatch: 3.1.2 @@ -10076,8 +10455,6 @@ snapshots: broccoli-node-api@1.7.0: {} - broccoli-node-info@1.1.0: {} - broccoli-node-info@2.2.0: {} broccoli-output-wrapper@3.2.5: @@ -10202,7 +10579,7 @@ snapshots: broccoli-persistent-filter: 2.3.1 broccoli-plugin: 2.1.0 chalk: 2.4.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 ensure-posix-path: 1.1.1 fs-extra: 8.1.0 minimatch: 3.1.2 @@ -10606,6 +10983,8 @@ snapshots: content-tag@2.0.3: {} + content-tag@3.1.3: {} + content-tag@4.0.0: {} content-type@1.0.5: {} @@ -10679,7 +11058,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 - semver: 7.7.2 + semver: 7.7.3 webpack: 5.102.0 css-tree@1.1.3: @@ -10751,6 +11130,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -10839,11 +11222,11 @@ snapshots: detect-file@1.0.0: {} - detect-indent@6.1.0: {} + detect-indent@7.0.2: {} - detect-newline@3.1.0: {} + detect-newline@4.0.1: {} - diff@5.2.0: {} + diff@7.0.0: {} dir-glob@3.0.1: dependencies: @@ -10932,10 +11315,10 @@ snapshots: - supports-color - webpack - ember-cli-app-version@6.0.1(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)): + ember-cli-app-version@6.0.1(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)): dependencies: ember-cli-babel: 7.26.11 - ember-source: 5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0) + ember-source: 6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5) git-repo-info: 2.1.1 transitivePeerDependencies: - supports-color @@ -10944,17 +11327,17 @@ snapshots: ember-cli-babel@7.26.11: dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.4) '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.4) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.4) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.28.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.28.4) '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) '@babel/polyfill': 7.12.1 - '@babel/preset-env': 7.28.3(@babel/core@7.28.4)(supports-color@8.1.1) + '@babel/preset-env': 7.28.3(@babel/core@7.28.4) '@babel/runtime': 7.12.18 amd-name-resolver: 1.3.1 babel-plugin-debug-macros: 0.3.4(@babel/core@7.28.4) @@ -11018,10 +11401,10 @@ snapshots: transitivePeerDependencies: - supports-color - ember-cli-dependency-checker@3.3.3(ember-cli@5.4.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7)): + ember-cli-dependency-checker@3.3.3(ember-cli@6.7.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7)): dependencies: chalk: 2.4.2 - ember-cli: 5.4.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7) + ember-cli: 6.7.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7) find-yarn-workspace-root: 2.0.0 is-git-url: 1.0.0 resolve: 1.22.10 @@ -11076,8 +11459,6 @@ snapshots: ember-cli-is-package-missing@1.0.0: {} - ember-cli-lodash-subset@2.0.1: {} - ember-cli-normalize-entity-name@1.0.0: dependencies: silent-error: 1.1.1 @@ -11159,11 +11540,15 @@ snapshots: transitivePeerDependencies: - supports-color - ember-cli@5.4.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7): + ember-cli@6.7.2(@types/node@24.7.0)(handlebars@4.7.8)(underscore@1.13.7): dependencies: - '@pnpm/find-workspace-dir': 6.0.3 + '@ember-tooling/blueprint-blueprint': 0.0.2 + '@ember-tooling/blueprint-model': 0.0.2 + '@ember-tooling/classic-build-addon-blueprint': 6.7.1 + '@ember-tooling/classic-build-app-blueprint': 6.7.2 + '@pnpm/find-workspace-dir': 1000.1.3 + babel-remove-types: 1.0.2 broccoli: 3.5.2 - broccoli-builder: 0.18.14 broccoli-concat: 4.2.5 broccoli-config-loader: 1.0.1 broccoli-config-replace: 1.1.2 @@ -11178,16 +11563,16 @@ snapshots: calculate-cache-key-for-tree: 2.0.0 capture-exit: 2.0.0 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.3.1 clean-base-url: 1.0.0 compression: 1.8.1 configstore: 5.0.1 console-ui: 3.1.2 + content-tag: 3.1.3 core-object: 3.1.5 dag-map: 2.0.2 - diff: 5.2.0 + diff: 7.0.0 ember-cli-is-package-missing: 1.0.0 - ember-cli-lodash-subset: 2.0.1 ember-cli-normalize-entity-name: 1.0.0 ember-cli-preprocess-registry: 5.0.1 ember-cli-string-utils: 1.1.0 @@ -11215,26 +11600,25 @@ snapshots: is-language-code: 3.1.0 isbinaryfile: 5.0.6 lodash: 4.17.21 - markdown-it: 13.0.2 - markdown-it-terminal: 0.4.0(markdown-it@13.0.2) + markdown-it: 14.1.0 + markdown-it-terminal: 0.4.0(markdown-it@14.1.0) minimatch: 7.4.6 morgan: 1.10.1 nopt: 3.0.6 - npm-package-arg: 10.1.0 + npm-package-arg: 12.0.2 os-locale: 5.0.0 p-defer: 3.0.0 portfinder: 1.0.38 promise-map-series: 0.3.0 promise.hash.helper: 1.0.8 quick-temp: 0.1.8 - remove-types: 1.0.0 resolve: 1.22.11 resolve-package-path: 4.0.3 safe-stable-stringify: 2.5.0 sane: 5.0.1 semver: 7.7.3 silent-error: 1.1.1 - sort-package-json: 1.57.0 + sort-package-json: 2.15.1 symlink-or-copy: 1.3.1 temp: 0.9.4 testem: 3.16.0(handlebars@4.7.8)(underscore@1.13.7) @@ -11242,7 +11626,7 @@ snapshots: tree-sync: 2.1.0 walk-sync: 3.0.0 watch-detector: 1.0.2 - workerpool: 6.5.1 + workerpool: 9.3.4 yam: 1.0.0 transitivePeerDependencies: - '@types/node' @@ -11304,7 +11688,7 @@ snapshots: ember-eslint-parser@0.5.11(@babel/core@7.28.4)(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 '@babel/eslint-parser': 7.28.4(@babel/core@7.28.4)(eslint@8.57.1) '@glimmer/syntax': 0.95.0 '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) @@ -11337,24 +11721,24 @@ snapshots: - '@babel/core' - supports-color - ember-qunit@8.1.1(@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)))(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0))(qunit@2.24.1): + ember-qunit@8.1.1(@ember/test-helpers@4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)))(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5))(qunit@2.24.1): dependencies: - '@ember/test-helpers': 4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)) + '@ember/test-helpers': 4.0.5(@babel/core@7.28.4)(@glint/template@1.6.1)(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)) '@embroider/addon-shim': 1.10.2 '@embroider/macros': 1.19.5(@glint/template@1.6.1) ember-cli-test-loader: 3.1.0 - ember-source: 5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0) + ember-source: 6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5) qunit: 2.24.1 qunit-theme-ember: 1.0.0 transitivePeerDependencies: - '@glint/template' - supports-color - ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0)): + ember-resolver@11.0.1(ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5)): dependencies: ember-cli-babel: 7.26.11 optionalDependencies: - ember-source: 5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0) + ember-source: 6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5) transitivePeerDependencies: - supports-color @@ -11374,62 +11758,7 @@ snapshots: transitivePeerDependencies: - encoding - ember-source@5.4.1(@babel/core@7.28.4)(@glimmer/component@2.0.0)(@glint/template@1.6.1)(rsvp@4.8.5)(webpack@5.102.0): - dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) - '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4) - '@ember/edition-utils': 1.2.0 - '@glimmer/compiler': 0.84.3 - '@glimmer/component': 2.0.0 - '@glimmer/destroyable': 0.84.3 - '@glimmer/env': 0.1.7 - '@glimmer/global-context': 0.84.3 - '@glimmer/interfaces': 0.84.3 - '@glimmer/manager': 0.84.3 - '@glimmer/node': 0.84.3 - '@glimmer/opcode-compiler': 0.84.3 - '@glimmer/owner': 0.84.3 - '@glimmer/program': 0.84.3 - '@glimmer/reference': 0.84.3 - '@glimmer/runtime': 0.84.3 - '@glimmer/syntax': 0.84.3 - '@glimmer/util': 0.84.3 - '@glimmer/validator': 0.84.3 - '@glimmer/vm-babel-plugins': 0.84.3(@babel/core@7.28.4) - '@simple-dom/interface': 1.4.0 - babel-plugin-debug-macros: 0.3.4(@babel/core@7.28.4) - babel-plugin-filter-imports: 4.0.0 - backburner.js: 2.8.0 - broccoli-concat: 4.2.5 - broccoli-debug: 0.6.5 - broccoli-file-creator: 2.1.1 - broccoli-funnel: 3.0.8 - broccoli-merge-trees: 4.2.0 - chalk: 4.1.2 - ember-auto-import: 2.11.1(@glint/template@1.6.1)(webpack@5.102.0) - ember-cli-babel: 7.26.11 - ember-cli-get-component-path-option: 1.0.0 - ember-cli-is-package-missing: 1.0.0 - ember-cli-normalize-entity-name: 1.0.0 - ember-cli-path-utils: 1.0.0 - ember-cli-string-utils: 1.1.0 - ember-cli-typescript-blueprint-polyfill: 0.1.0 - ember-cli-version-checker: 5.1.2 - ember-router-generator: 2.0.0 - inflection: 2.0.1 - resolve: 1.22.11 - route-recognizer: 0.3.4 - router_js: 8.0.6(route-recognizer@0.3.4)(rsvp@4.8.5) - semver: 7.7.3 - silent-error: 1.1.1 - transitivePeerDependencies: - - '@babel/core' - - '@glint/template' - - rsvp - - supports-color - - webpack - - ember-source@6.9.0(@glimmer/component@2.0.0)(rsvp@4.8.5): + ember-source@6.8.2(@glimmer/component@2.0.0)(rsvp@4.8.5): dependencies: '@babel/core': 7.28.4(supports-color@8.1.1) '@ember/edition-utils': 1.2.0 @@ -11569,17 +11898,19 @@ snapshots: transitivePeerDependencies: - encoding - ember-try@2.0.0(encoding@0.1.13): + ember-try@4.0.0(encoding@0.1.13): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - core-object: 3.1.5 debug: 4.4.3(supports-color@8.1.1) ember-try-config: 4.0.0(encoding@0.1.13) + es-toolkit: 1.42.0 execa: 4.1.0 - fs-extra: 9.1.0 + fs-extra: 6.0.1 resolve: 1.22.11 rimraf: 3.0.2 + semver: 7.7.3 + temp-dir: 2.0.0 walk-sync: 2.2.0 transitivePeerDependencies: - encoding @@ -11631,7 +11962,7 @@ snapshots: entities@2.2.0: {} - entities@3.0.1: {} + entities@4.5.0: {} entities@6.0.1: {} @@ -11731,6 +12062,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.42.0: {} + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -11872,6 +12205,16 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-prettier@5.5.4(@types/eslint@8.56.12)(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): + dependencies: + eslint: 8.57.1 + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + '@types/eslint': 8.56.12 + eslint-config-prettier: 9.1.2(eslint@8.57.1) + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): dependencies: eslint: 8.57.1 @@ -11921,7 +12264,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -12174,6 +12517,10 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -12397,6 +12744,12 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@6.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -12545,7 +12898,7 @@ snapshots: get-value@2.0.6: {} - git-hooks-list@1.0.3: {} + git-hooks-list@3.2.0: {} git-repo-info@2.1.1: {} @@ -12652,17 +13005,6 @@ snapshots: globalyzer@0.1.0: {} - globby@10.0.0: - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - glob: 7.2.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@10.0.1: dependencies: '@types/glob': 7.2.0 @@ -12834,10 +13176,6 @@ snapshots: dependencies: lru-cache: 6.0.0 - hosted-git-info@6.1.3: - dependencies: - lru-cache: 7.18.3 - hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 @@ -12875,6 +13213,13 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: agent-base: 7.1.4 @@ -12897,6 +13242,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.4 @@ -13158,8 +13510,6 @@ snapshots: is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} - is-plain-obj@4.1.0: {} is-plain-object@2.0.4: @@ -13294,6 +13644,34 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@25.0.1: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + form-data: 4.0.4 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.22 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsdom@25.0.1(supports-color@8.1.1): dependencies: cssstyle: 4.6.0 @@ -13418,9 +13796,9 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-it@4.0.1: + linkify-it@5.0.0: dependencies: - uc.micro: 1.0.6 + uc.micro: 2.1.0 livereload-js@3.4.1: {} @@ -13523,8 +13901,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -13577,21 +13953,22 @@ snapshots: dependencies: object-visit: 1.0.1 - markdown-it-terminal@0.4.0(markdown-it@13.0.2): + markdown-it-terminal@0.4.0(markdown-it@14.1.0): dependencies: ansi-styles: 3.2.1 cardinal: 1.0.0 cli-table: 0.3.11 lodash.merge: 4.6.2 - markdown-it: 13.0.2 + markdown-it: 14.1.0 - markdown-it@13.0.2: + markdown-it@14.1.0: dependencies: argparse: 2.0.1 - entities: 3.0.1 - linkify-it: 4.0.1 - mdurl: 1.0.1 - uc.micro: 1.0.6 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 matcher-collection@1.1.2: dependencies: @@ -13612,7 +13989,7 @@ snapshots: mdn-data@2.12.2: {} - mdurl@1.0.1: {} + mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -13901,18 +14278,11 @@ snapshots: npm-normalize-package-bin@4.0.0: {} - npm-package-arg@10.1.0: - dependencies: - hosted-git-info: 6.1.3 - proc-log: 3.0.0 - semver: 7.7.3 - validate-npm-package-name: 5.0.1 - npm-package-arg@12.0.2: dependencies: hosted-git-info: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 6.0.2 npm-pick-manifest@10.0.0: @@ -14295,7 +14665,7 @@ snapshots: prettier-plugin-ember-template-tag@2.1.0(prettier@3.6.2): dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 content-tag: 4.0.0 prettier: 3.6.2 transitivePeerDependencies: @@ -14313,8 +14683,6 @@ snapshots: private@0.1.8: {} - proc-log@3.0.0: {} - proc-log@5.0.0: {} progress@2.0.3: {} @@ -14352,6 +14720,8 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@2.3.1: {} qs@6.13.0: @@ -15031,14 +15401,16 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@1.57.0: + sort-package-json@2.15.1: dependencies: - detect-indent: 6.1.0 - detect-newline: 3.1.0 - git-hooks-list: 1.0.3 - globby: 10.0.0 - is-plain-obj: 2.1.0 + detect-indent: 7.0.2 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.2.0 + is-plain-obj: 4.1.0 + semver: 7.7.3 sort-object-keys: 1.1.3 + tinyglobby: 0.2.15 source-map-js@1.2.1: {} @@ -15325,7 +15697,7 @@ snapshots: sync-disk-cache@2.1.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 heimdalljs: 0.2.6 mkdirp: 0.5.6 rimraf: 3.0.2 @@ -15362,6 +15734,8 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + temp-dir@2.0.0: {} + temp@0.9.4: dependencies: mkdirp: 0.5.6 @@ -15511,6 +15885,11 @@ snapshots: transitivePeerDependencies: - supports-color + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tldts-core@6.1.86: {} tldts@6.1.86: @@ -15676,7 +16055,7 @@ snapshots: typescript@5.9.3: {} - uc.micro@1.0.6: {} + uc.micro@2.1.0: {} uglify-js@3.19.3: optional: true @@ -15779,8 +16158,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} - validate-npm-package-name@6.0.2: {} validate-peer-dependencies@1.2.0: @@ -15987,7 +16364,7 @@ snapshots: workerpool@3.1.2: dependencies: - '@babel/core': 7.28.4(supports-color@8.1.1) + '@babel/core': 7.28.4 object-assign: 4.1.1 rsvp: 4.8.5 transitivePeerDependencies: @@ -15995,6 +16372,8 @@ snapshots: workerpool@6.5.1: {} + workerpool@9.3.4: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 diff --git a/test-app/app/app.ts b/test-app/app/app.ts index 1ba93424..a851fafe 100644 --- a/test-app/app/app.ts +++ b/test-app/app/app.ts @@ -1,3 +1,4 @@ +import 'decorator-transforms/globals'; import Application from '@ember/application'; import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; diff --git a/test-app/config/ember-try.js b/test-app/config/ember-try.js index c6c2acee..2b21a27e 100644 --- a/test-app/config/ember-try.js +++ b/test-app/config/ember-try.js @@ -69,6 +69,30 @@ module.exports = async function () { }, }, }, + { + name: 'ember-lts-6.4', + npm: { + devDependencies: { + 'ember-source': '~6.4.0', + }, + }, + }, + { + name: 'native-collections-support', + npm: { + devDependencies: { + 'ember-source': '~6.8.0-beta.1', + }, + }, + }, + { + name: 'ember-lts-6.8', + npm: { + devDependencies: { + 'ember-source': '~6.8.0', + }, + }, + }, { name: 'ember-release', npm: { diff --git a/test-app/ember-cli-build.js b/test-app/ember-cli-build.js index 69eefb8e..d44322f3 100644 --- a/test-app/ember-cli-build.js +++ b/test-app/ember-cli-build.js @@ -4,11 +4,20 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); module.exports = function (defaults) { const app = new EmberApp(defaults, { - 'ember-cli-babel': { enableTypeScriptTransform: true }, + 'ember-cli-babel': { + enableTypeScriptTransform: true, + disableDecoratorTransforms: true, + }, autoImport: { forbidEval: true, watchDependencies: ['tracked-built-ins'], }, + babel: { + plugins: [ + // add the new transform. + require.resolve('decorator-transforms'), + ], + }, // Add options here }); @@ -22,9 +31,7 @@ module.exports = function (defaults) { return require('@embroider/compat').compatBuild(app, Webpack, { staticAddonTestSupportTrees: true, staticAddonTrees: true, - staticHelpers: true, - staticModifiers: true, - staticComponents: true, + staticInvokables: true, staticEmberSource: true, packageRules: [ { @@ -41,5 +48,10 @@ module.exports = function (defaults) { package: 'qunit', }, ], + packagerOptions: { + webpackConfig: { + devtool: 'source-map', + }, + }, }); }; diff --git a/test-app/package.json b/test-app/package.json index 376d7568..0a2e6da1 100644 --- a/test-app/package.json +++ b/test-app/package.json @@ -30,9 +30,10 @@ "@ember/optional-features": "^2.0.0", "@ember/string": "^4.0.0", "@ember/test-helpers": "^4.0.4", - "@embroider/compat": "^3.7.0", - "@embroider/core": "^3.4.19", - "@embroider/webpack": "^4.0.8", + "@embroider/compat": "^3.9.2", + "@embroider/core": "^3.5.8", + "@embroider/macros": "^1.19.5", + "@embroider/webpack": "^4.1.1", "@glimmer/component": "^2.0.0", "@glimmer/tracking": "^1.1.2", "@glint/environment-ember-loose": "^1.1.0", @@ -44,8 +45,9 @@ "@typescript-eslint/parser": "^5.26.0", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.1", - "ember-auto-import": "^2.10.0", - "ember-cli": "~5.4.0", + "decorator-transforms": "^2.0.0", + "ember-auto-import": "^2.11.1", + "ember-cli": "~6.7.1", "ember-cli-app-version": "^6.0.1", "ember-cli-babel": "^8.0.0", "ember-cli-clean-css": "^3.0.0", @@ -58,10 +60,10 @@ "ember-modifier": "^4.1.0", "ember-qunit": "^8.0.1", "ember-resolver": "^11.0.1", - "ember-source": "~5.4.0", + "ember-source": "~6.8.0-beta.1", "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^5.11.2", - "ember-try": "^2.0.0", + "ember-try": "^4.0.0", "eslint": "^8.49.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-ember": "^11.11.1", @@ -81,7 +83,7 @@ "webpack": "^5.94.0" }, "engines": { - "node": "16.* || >= 18" + "node": ">= 18" }, "volta": { "extends": "../package.json"