diff --git a/.changeset/funny-falcons-cover.md b/.changeset/funny-falcons-cover.md new file mode 100644 index 000000000..da1811b82 --- /dev/null +++ b/.changeset/funny-falcons-cover.md @@ -0,0 +1,5 @@ +--- +"@itwin/presentation-core-interop": minor +--- + +Added a new `createECSchemaProvider` overload accepting a `SchemaView` instance (from `@itwin/ecschema-metadata`) that naturally provides synchronous access. diff --git a/.changeset/sync-ec-types-schema-view.md b/.changeset/sync-ec-types-schema-view.md new file mode 100644 index 000000000..8042000f5 --- /dev/null +++ b/.changeset/sync-ec-types-schema-view.md @@ -0,0 +1,14 @@ +--- +"@itwin/presentation-shared": major +"@itwin/presentation-core-interop": major +"@itwin/presentation-hierarchies": major +--- + +`EC` namespace interfaces in `@itwin/presentation-shared` no longer use `Promise` wrappers — once a schema is loaded via the still-async `ECSchemaProvider.getSchema`, all further navigation (`baseClass`, `is()`, `getProperty()`, `getProperties()`, `getDerivedClasses()`, `kindOfQuantity`, `relationshipClass`, `enumeration`, `abstractConstraint`) is synchronous. + +Additional changes: + +- `createECSchemaProvider` in `@itwin/presentation-core-interop` now force-loads all schema items when constructing an `EC.Schema` from `SchemaContext`, so the synchronous contract can be met. +- The `getCustomAttributes()` method has been removed from `EC.Schema`, `EC.Class`, and `EC.Property` and replaced with an `isHidden: boolean` property. `EC.CustomAttributeSet` and `EC.CustomAttribute` types have been removed. +- Added an optional `EC.Property.category` attribute. +- Added a required `EC.RelationshipConstraint.constraintClasses` attribute. diff --git a/apps/performance-tests/src/hierarchies/HideIfNoChildren.test.ts b/apps/performance-tests/src/hierarchies/HideIfNoChildren.test.ts index d91767291..6ac522f59 100644 --- a/apps/performance-tests/src/hierarchies/HideIfNoChildren.test.ts +++ b/apps/performance-tests/src/hierarchies/HideIfNoChildren.test.ts @@ -25,7 +25,7 @@ describe("hide if no children", () => { setup, cleanup, test: async (iModel) => { - const provider = new StatelessHierarchyProvider({ + const provider = await StatelessHierarchyProvider.create({ iModel, getHierarchyFactory: (imodelAccess) => { return createPredicateBasedHierarchyDefinition({ @@ -65,7 +65,7 @@ describe("hide if no children", () => { setup, cleanup, test: async (iModel) => { - const provider = new StatelessHierarchyProvider({ + const provider = await StatelessHierarchyProvider.create({ iModel, getHierarchyFactory: (imodelAccess) => { return createPredicateBasedHierarchyDefinition({ diff --git a/apps/performance-tests/src/hierarchies/ModelsTree.test.ts b/apps/performance-tests/src/hierarchies/ModelsTree.test.ts index 45db658eb..9ccc69393 100644 --- a/apps/performance-tests/src/hierarchies/ModelsTree.test.ts +++ b/apps/performance-tests/src/hierarchies/ModelsTree.test.ts @@ -36,7 +36,7 @@ describe("models tree", () => { setup, cleanup, test: async (iModel) => { - const provider = new StatelessHierarchyProvider({ iModel, getHierarchyFactory }); + const provider = await StatelessHierarchyProvider.create({ iModel, getHierarchyFactory }); const result = await provider.loadHierarchy({ depth: 2 }); expect(result).toBeGreaterThan(0); }, @@ -47,7 +47,7 @@ describe("models tree", () => { setup, cleanup, test: async (iModel) => { - const provider = new StatelessHierarchyProvider({ iModel, getHierarchyFactory }); + const provider = await StatelessHierarchyProvider.create({ iModel, getHierarchyFactory }); const result = await provider.loadHierarchy(); expect(result).toBeGreaterThan(0); }, @@ -57,7 +57,7 @@ describe("models tree", () => { testName: "creates initial filtered view for 50k target items", setup: async () => { const iModel = SnapshotDb.openFile(Datasets.getIModelPath("50k functional 3D elements")); - const imodelAccess = StatelessHierarchyProvider.createIModelAccess(iModel, "unbounded"); + const imodelAccess = await StatelessHierarchyProvider.createIModelAccess(iModel, "unbounded"); const targetItems = new Array(); const query: ECSqlQueryDef = { ecsql: `SELECT CAST(IdToHex(ECInstanceId) AS TEXT) AS ECInstanceId FROM bis.GeometricElement3d`, @@ -81,7 +81,7 @@ describe("models tree", () => { }), }; expect(search.paths).toHaveLength(50000); - const provider = new StatelessHierarchyProvider({ + const provider = await StatelessHierarchyProvider.create({ imodelAccess, getHierarchyFactory: () => new ModelsTreeDefinition({ imodelAccess, idsCache }), search: { paths: await HierarchySearchTree.createFromPathsList(search.paths) }, diff --git a/apps/performance-tests/src/hierarchies/RunHierarchyTest.ts b/apps/performance-tests/src/hierarchies/RunHierarchyTest.ts index 2ecdaeb59..d63248fa0 100644 --- a/apps/performance-tests/src/hierarchies/RunHierarchyTest.ts +++ b/apps/performance-tests/src/hierarchies/RunHierarchyTest.ts @@ -63,7 +63,7 @@ export function runHierarchyTest( }; }, test: async (props) => { - const provider = new StatelessHierarchyProvider({ ...props, rowLimit: "unbounded" }); + const provider = await StatelessHierarchyProvider.create({ ...props, rowLimit: "unbounded" }); const nodeCount = await provider.loadHierarchy(); if (testProps.expectedNodeCount !== undefined) { expect(nodeCount).toBe(testProps.expectedNodeCount); diff --git a/apps/performance-tests/src/hierarchies/Search.test.ts b/apps/performance-tests/src/hierarchies/Search.test.ts index eacef744a..75154bc6c 100644 --- a/apps/performance-tests/src/hierarchies/Search.test.ts +++ b/apps/performance-tests/src/hierarchies/Search.test.ts @@ -124,7 +124,7 @@ describe("search", () => { props.iModel.close(); }, test: async ({ search, ...props }) => { - const provider = new StatelessHierarchyProvider({ + const provider = await StatelessHierarchyProvider.create({ ...props, search: { paths: await HierarchySearchTree.createFromPathsList(search.paths) }, rowLimit: "unbounded", diff --git a/apps/performance-tests/src/hierarchies/StatelessHierarchyProvider.ts b/apps/performance-tests/src/hierarchies/StatelessHierarchyProvider.ts index 3a4a3367c..2ccecea4e 100644 --- a/apps/performance-tests/src/hierarchies/StatelessHierarchyProvider.ts +++ b/apps/performance-tests/src/hierarchies/StatelessHierarchyProvider.ts @@ -15,15 +15,9 @@ import type { HierarchyNode, HierarchyProvider, HierarchySearchTree, + LimitingECSqlQueryExecutor, } from "@itwin/presentation-hierarchies"; -import type { - EC, - ECClassHierarchyInspector, - ECSchemaProvider, - ECSqlQueryDef, - ECSqlQueryExecutor, - ECSqlQueryReaderOptions, -} from "@itwin/presentation-shared"; +import type { ECClassHierarchyInspector, ECSchemaProvider } from "@itwin/presentation-shared"; interface ProviderOptionsBase { rowLimit?: number | "unbounded"; @@ -46,22 +40,12 @@ function log(messageOrCallback: string | (() => string)) { const DEFAULT_ROW_LIMIT = 1000; -export interface IModelAccess { - createQueryReader( - query: ECSqlQueryDef, - config?: ECSqlQueryReaderOptions & { limit?: number | "unbounded" }, - ): ReturnType; - classDerivesFrom(derivedClassFullName: string, candidateBaseClassFullName: string): Promise | boolean; - getSchema(schemaName: string): Promise; - imodelKey: string; -} +export type IModelAccess = ECSchemaProvider & + ECClassHierarchyInspector & + LimitingECSqlQueryExecutor & { imodelKey: string }; export class StatelessHierarchyProvider { - private readonly _provider: HierarchyProvider; - - constructor(private readonly _props: ProviderOptions) { - this._provider = this.createProvider(); - } + private constructor(private readonly _provider: HierarchyProvider) {} public async loadHierarchy(props?: { depth?: number }): Promise { const depth = props?.depth; @@ -86,20 +70,21 @@ export class StatelessHierarchyProvider { }); } - private createProvider() { + public static async create(props: ProviderOptions): Promise { const imodelAccess = - "iModel" in this._props - ? StatelessHierarchyProvider.createIModelAccess(this._props.iModel, this._props.rowLimit) - : this._props.imodelAccess; - return createIModelHierarchyProvider({ + "iModel" in props + ? await StatelessHierarchyProvider.createIModelAccess(props.iModel, props.rowLimit) + : props.imodelAccess; + const hierarchyProvider = createIModelHierarchyProvider({ imodelAccess, - hierarchyDefinition: this._props.getHierarchyFactory(imodelAccess), + hierarchyDefinition: props.getHierarchyFactory(imodelAccess), queryCacheSize: 0, - search: this._props.search ? { paths: this._props.search.paths } : undefined, + search: props.search ? { paths: props.search.paths } : undefined, }); + return new StatelessHierarchyProvider(hierarchyProvider); } - public static createIModelAccess(iModel: IModelDb, rowLimit?: number | "unbounded"): IModelAccess { + public static async createIModelAccess(iModel: IModelDb, rowLimit?: number | "unbounded"): Promise { const schemaProvider = createECSchemaProvider(iModel.schemaContext); const rowLimitToUse = rowLimit ?? DEFAULT_ROW_LIMIT; const imodelAccess = { diff --git a/apps/performance-tests/src/setup.ts b/apps/performance-tests/src/setup.ts index 36685742c..b94aef3d8 100644 --- a/apps/performance-tests/src/setup.ts +++ b/apps/performance-tests/src/setup.ts @@ -17,6 +17,7 @@ beforeAll(async () => { Logger.setLevelDefault(LogLevel.Warning); Logger.setLevel("i18n", LogLevel.Error); Logger.setLevel("SQLite", LogLevel.Error); + Logger.setLevel("ECDb", LogLevel.None); await IModelHost.startup({ profileName: "presentation-performance-tests" }); await Datasets.initialize("./datasets"); diff --git a/packages/core-interop/api/presentation-core-interop.api.md b/packages/core-interop/api/presentation-core-interop.api.md index f58cf6e7f..332aee4ef 100644 --- a/packages/core-interop/api/presentation-core-interop.api.md +++ b/packages/core-interop/api/presentation-core-interop.api.md @@ -16,6 +16,7 @@ import type { QueryRowProxy } from '@itwin/core-common'; import type { Schema } from '@itwin/ecschema-metadata'; import type { SchemaContext } from '@itwin/ecschema-metadata'; import { SchemaKey } from '@itwin/ecschema-metadata'; +import type { SchemaView } from '@itwin/ecschema-metadata'; import type { UnitSystemKey } from '@itwin/core-quantity'; // @public @@ -41,6 +42,9 @@ interface CoreSchemaContext { // @public export function createECSchemaProvider(schemaContext: CoreSchemaContext): ECSchemaProvider; +// @beta +export function createECSchemaProvider(schemaView: PublicSchemaView): ECSchemaProvider; + // @public export function createECSqlQueryExecutor(imodel: CoreECSqlReaderFactory): ECSqlQueryExecutor; @@ -81,6 +85,9 @@ interface ICoreTxnManager { onCommitted: Event_2; } +// @public +type PublicSchemaView = Pick; + // @public export function registerTxnListeners(txns: ICoreTxnManager, onChanged: () => void): () => void; diff --git a/packages/core-interop/api/presentation-core-interop.exports.csv b/packages/core-interop/api/presentation-core-interop.exports.csv index a2d011a07..c54693988 100644 --- a/packages/core-interop/api/presentation-core-interop.exports.csv +++ b/packages/core-interop/api/presentation-core-interop.exports.csv @@ -1,6 +1,7 @@ sep=; Release Tag;API Item Type;API Item Name public;function;createECSchemaProvider +beta;function;createECSchemaProvider public;function;createECSqlQueryExecutor public;function;createIModelKey public;function;createLogger diff --git a/packages/core-interop/package.json b/packages/core-interop/package.json index c705ae52f..38542c381 100644 --- a/packages/core-interop/package.json +++ b/packages/core-interop/package.json @@ -50,11 +50,11 @@ "rxjs": "catalog:rxjs" }, "peerDependencies": { - "@itwin/core-bentley": "^5.0.0", - "@itwin/core-common": "^5.0.0", - "@itwin/core-geometry": "^5.0.0", - "@itwin/core-quantity": "^5.0.0", - "@itwin/ecschema-metadata": "^5.0.0" + "@itwin/core-bentley": "^5.10.1", + "@itwin/core-common": "^5.10.1", + "@itwin/core-geometry": "^5.10.1", + "@itwin/core-quantity": "^5.10.1", + "@itwin/ecschema-metadata": "^5.10.1" }, "devDependencies": { "@itwin/build-tools": "catalog:build-tools", diff --git a/packages/core-interop/src/core-interop/Metadata.ts b/packages/core-interop/src/core-interop/Metadata.ts index 9ad48b66b..78b624236 100644 --- a/packages/core-interop/src/core-interop/Metadata.ts +++ b/packages/core-interop/src/core-interop/Metadata.ts @@ -3,23 +3,33 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { SchemaKey as CoreSchemaKey } from "@itwin/ecschema-metadata"; -import { createECSchema } from "./MetadataInternal.js"; +import { createECSchemaProviderFromSchemaContext } from "./schema-provider/SchemaContextProvider.js"; +import { createECSchemaProviderFromSchemaView } from "./schema-provider/SchemaViewProvider.js"; -import type { Schema as CoreSchema } from "@itwin/ecschema-metadata"; -import type { EC, ECSchemaProvider } from "@itwin/presentation-shared"; +import type { ECSchemaProvider } from "@itwin/presentation-shared"; +import type { CoreSchemaContext } from "./schema-provider/SchemaContextProvider.js"; +import type { PublicSchemaView } from "./schema-provider/SchemaViewProvider.js"; /** - * Defines input for `createECSchemaProvider`. Generally, this is an instance of [SchemaContext](https://www.itwinjs.org/reference/ecschema-metadata/context/schemacontext/) - * class from `@itwin/ecschema-metadata` package. + * Creates an `ECSchemaProvider` for given [SchemaContext](https://www.itwinjs.org/reference/ecschema-metadata/context/schemacontext/). + * + * Usage example: + * + * ```ts + * import { IModelConnection } from "@itwin/core-frontend"; + * import { createECSchemaProvider } from "@itwin/presentation-core-interop"; + * + * const imodel: IModelConnection = getIModel(); + * const schemaProvider = createECSchemaProvider(imodel.schemaContext); + * // the created schema provider may be used in `@itwin/presentation-hierarchies` and other Presentation packages + * ``` + * * @public */ -interface CoreSchemaContext { - getSchema(key: CoreSchemaKey): Promise; -} +export function createECSchemaProvider(schemaContext: CoreSchemaContext): ECSchemaProvider; /** - * Creates an `ECSchemaProvider` for given [SchemaContext](https://www.itwinjs.org/reference/ecschema-metadata/context/schemacontext/). + * Creates an `ECSchemaProvider` for a given [SchemaView](https://www.itwinjs.org/reference/ecschema-metadata/context/schemaview/). * * Usage example: * @@ -28,44 +38,21 @@ interface CoreSchemaContext { * import { createECSchemaProvider } from "@itwin/presentation-core-interop"; * * const imodel: IModelConnection = getIModel(); - * const schemaProvider = createECSchemaProvider(imodel.schemaContext); + * const schemaProvider = createECSchemaProvider(await imodel.getSchemaView()); * // the created schema provider may be used in `@itwin/presentation-hierarchies` and other Presentation packages * ``` * - * @public + * @beta */ -export function createECSchemaProvider(schemaContext: CoreSchemaContext): ECSchemaProvider { - const schemaRequestsCache = new Map>(); - async function getSchemaUnprotected(schemaName: string) { - const coreSchema = await schemaContext.getSchema(new CoreSchemaKey(schemaName)); - return coreSchema ? createECSchema(coreSchema) : undefined; - } - async function getSchemaProtected(schemaName: string, handledExistingSchemaErrors: Set) { - // workaround for https://github.com/iTwin/itwinjs-core/issues/6542 - try { - return await getSchemaUnprotected(schemaName); - } catch (e) { - /* v8 ignore else -- @preserve */ - if (e instanceof Error) { - if (e.message.includes("already exists within this cache") && !handledExistingSchemaErrors.has(schemaName)) { - handledExistingSchemaErrors.add(schemaName); - return getSchemaProtected(schemaName, handledExistingSchemaErrors); - } - if (e.message.includes("schema not found")) { - return undefined; - } - } - throw e; - } +export function createECSchemaProvider(schemaView: PublicSchemaView): ECSchemaProvider; + +export function createECSchemaProvider(input: CoreSchemaContext | PublicSchemaView): ECSchemaProvider { + if (isSchemaView(input)) { + return createECSchemaProviderFromSchemaView(input); } - return { - async getSchema(name) { - let promise = schemaRequestsCache.get(name); - if (!promise) { - promise = getSchemaProtected(name, new Set()); - schemaRequestsCache.set(name, promise); - } - return promise; - }, - }; + return createECSchemaProviderFromSchemaContext(input); +} + +function isSchemaView(input: CoreSchemaContext | PublicSchemaView): input is PublicSchemaView { + return "schemaToken" in input; } diff --git a/packages/core-interop/src/core-interop/MetadataInternal.ts b/packages/core-interop/src/core-interop/MetadataInternal.ts deleted file mode 100644 index 259524f99..000000000 --- a/packages/core-interop/src/core-interop/MetadataInternal.ts +++ /dev/null @@ -1,478 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ - -import { assert } from "@itwin/core-bentley"; -import { ECClass as CoreClass, PrimitiveType, SchemaItemType, StrengthDirection } from "@itwin/ecschema-metadata"; -import { normalizeFullClassName } from "@itwin/presentation-shared"; - -import type { - EntityClass as CoreEntityClass, - Enumeration as CoreEnumeration, - EnumerationArrayProperty as CoreEnumerationArrayProperty, - EnumerationProperty as CoreEnumerationProperty, - KindOfQuantity as CoreKindOfQuantity, - Mixin as CoreMixin, - NavigationProperty as CoreNavigationProperty, - PrimitiveArrayProperty as CorePrimitiveArrayProperty, - PrimitiveProperty as CorePrimitiveProperty, - Property as CoreProperty, - RelationshipClass as CoreRelationshipClass, - RelationshipConstraint as CoreRelationshipConstraint, - Schema as CoreSchema, - SchemaItem as CoreSchemaItem, - StructArrayProperty as CoreStructArrayProperty, - StructClass as CoreStructClass, - StructProperty as CoreStructProperty, - LazyLoadedSchemaItem, -} from "@itwin/ecschema-metadata"; -import type { EC } from "@itwin/presentation-shared"; - -/** @internal */ -export function createECSchema(schema: CoreSchema): EC.Schema { - return { - name: schema.name, - version: schema.schemaKey.version, - async getClass(name) { - const item = await schema.getItem(name, CoreClass); - return item ? createECClass(item, this) : undefined; - }, - async getCustomAttributes() { - return createCustomAttributesSet(schema.customAttributes); - }, - }; -} - -abstract class ECSchemaItemImpl implements EC.SchemaItem { - private _schema: EC.Schema; - protected constructor( - protected _coreSchemaItem: TCoreSchemaItem, - schema?: EC.Schema, - ) { - this._schema = schema ?? createECSchema(this._coreSchemaItem.schema); - } - public get schema() { - return this._schema; - } - public get fullName() { - return normalizeFullClassName(this._coreSchemaItem.fullName); - } - public get name() { - return this._coreSchemaItem.name; - } - public get label() { - return this._coreSchemaItem.label; - } -} - -/** @internal */ -export function createECClass(coreClass: CoreClass, schema?: EC.Schema): EC.Class { - switch (coreClass.schemaItemType) { - case SchemaItemType.EntityClass: - return new ECEntityClassImpl(coreClass as CoreEntityClass, schema); - case SchemaItemType.RelationshipClass: - return new ECRelationshipClassImpl(coreClass as CoreRelationshipClass, schema); - case SchemaItemType.StructClass: - return new ECStructClassImpl(coreClass, schema); - case SchemaItemType.Mixin: - return new ECMixinImpl(coreClass as CoreMixin, schema); - } - throw new Error(`Invalid class type "${coreClass.schemaItemType}" for class ${coreClass.fullName}`); -} - -abstract class ECClassImpl extends ECSchemaItemImpl implements EC.Class { - protected constructor(coreClass: TCoreClass, schema?: EC.Schema) { - super(coreClass, schema); - } - public isEntityClass(): this is EC.EntityClass { - return false; - } - public isRelationshipClass(): this is EC.RelationshipClass { - return false; - } - public isStructClass(): this is EC.StructClass { - return false; - } - public isMixin(): this is EC.Mixin { - return false; - } - public get baseClass(): Promise { - return createFromOptionalLazyLoaded(this._coreSchemaItem.baseClass, (coreBaseClass) => - createECClass(coreBaseClass, this.schema), - ); - } - public async is(classOrClassName: EC.Class | string, schemaName?: string) { - if (typeof classOrClassName === "string") { - return this._coreSchemaItem.is(classOrClassName, schemaName!); - } - return this._coreSchemaItem.is(classOrClassName.name, classOrClassName.schema.name); - } - public async getProperty(name: string): Promise { - const coreProperty = await this._coreSchemaItem.getProperty(name, false); - return coreProperty ? createECProperty(coreProperty, this) : undefined; - } - public async getProperties(): Promise> { - const coreProperties = await this._coreSchemaItem.getProperties(); - const result = new Array(); - for (const coreProperty of coreProperties) { - result.push(createECProperty(coreProperty, this)); - } - return result; - } - public async getDerivedClasses(): Promise { - const coreDerivedClasses = await this._coreSchemaItem.getDerivedClasses(); - return coreDerivedClasses ? coreDerivedClasses.map((coreClass) => createECClass(coreClass, this.schema)) : []; - } - public async getCustomAttributes(): Promise { - return createCustomAttributesSet(this._coreSchemaItem.customAttributes); - } -} - -class ECEntityClassImpl extends ECClassImpl implements EC.EntityClass { - constructor(coreClass: CoreEntityClass, schema?: EC.Schema) { - super(coreClass, schema); - } - public override isEntityClass(): this is EC.EntityClass { - return true; - } -} - -class ECRelationshipClassImpl extends ECClassImpl implements EC.RelationshipClass { - constructor(coreClass: CoreRelationshipClass, schema?: EC.Schema) { - super(coreClass, schema); - } - public override isRelationshipClass(): this is EC.RelationshipClass { - return true; - } - public get direction() { - switch (this._coreSchemaItem.strengthDirection) { - case StrengthDirection.Forward: - return "Forward"; - case StrengthDirection.Backward: - return "Backward"; - } - } - public get source() { - return new ECRelationshipConstraintImpl(this._coreSchemaItem.source, this.schema); - } - public get target() { - return new ECRelationshipConstraintImpl(this._coreSchemaItem.target, this.schema); - } -} - -class ECStructClassImpl extends ECClassImpl implements EC.StructClass { - constructor(coreClass: CoreStructClass, schema?: EC.Schema) { - super(coreClass, schema); - } - public override isStructClass(): this is EC.StructClass { - return true; - } -} - -class ECMixinImpl extends ECClassImpl implements EC.Mixin { - constructor(coreClass: CoreMixin, schema?: EC.Schema) { - super(coreClass, schema); - } - public override isMixin(): this is EC.Mixin { - return true; - } -} - -/** @internal */ -export function createECProperty(coreProperty: CoreProperty, ecClass: EC.Class): EC.Property { - if (coreProperty.isArray()) { - if (coreProperty.isPrimitive()) { - return new ECPrimitivesArrayPropertyImpl(coreProperty, ecClass); - } - if (coreProperty.isEnumeration()) { - return new ECEnumerationArrayPropertyImpl(coreProperty, ecClass); - } - return new ECStructArrayPropertyImpl(coreProperty, ecClass); - } - if (coreProperty.isStruct()) { - return new ECStructPropertyImpl(coreProperty, ecClass); - } - if (coreProperty.isEnumeration()) { - return new ECEnumerationPropertyImpl(coreProperty, ecClass); - } - if (coreProperty.isNavigation()) { - return new ECNavigationPropertyImpl(coreProperty, ecClass); - } - assert(coreProperty.isPrimitive()); - return new ECPrimitivePropertyImpl(coreProperty, ecClass); -} - -abstract class ECPropertyImpl implements EC.Property { - protected constructor( - protected _coreProperty: TCoreProperty, - protected _class: EC.Class, - ) {} - public isArray(): this is EC.ArrayProperty { - return false; - } - public isStruct(): this is EC.StructProperty { - return false; - } - public isPrimitive(): this is EC.PrimitiveProperty { - return false; - } - public isEnumeration(): this is EC.EnumerationProperty { - return false; - } - public isNavigation(): this is EC.NavigationProperty { - return false; - } - public get class() { - return this._class; - } - public get name() { - return this._coreProperty.name; - } - public get label() { - return this._coreProperty.label; - } - public get kindOfQuantity(): Promise { - return createFromOptionalLazyLoaded( - this._coreProperty.kindOfQuantity, - (coreKindOfQuantity) => new ECKindOfQuantityImpl(coreKindOfQuantity), - ); - } - public async getCustomAttributes(): Promise { - return createCustomAttributesSet(this._coreProperty.customAttributes); - } -} - -class ECPrimitivePropertyImpl - extends ECPropertyImpl - implements EC.PrimitiveProperty -{ - constructor(coreProperty: TCoreProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isPrimitive(): this is EC.PrimitiveProperty { - return true; - } - public get extendedTypeName() { - return this._coreProperty.extendedTypeName; - } - public get primitiveType() { - switch (this._coreProperty.primitiveType) { - case PrimitiveType.Binary: - return "Binary"; - case PrimitiveType.Boolean: - return "Boolean"; - case PrimitiveType.DateTime: - return "DateTime"; - case PrimitiveType.Double: - return "Double"; - case PrimitiveType.IGeometry: - return "IGeometry"; - case PrimitiveType.Integer: - return "Integer"; - case PrimitiveType.Long: - return "Long"; - case PrimitiveType.Point2d: - return "Point2d"; - case PrimitiveType.Point3d: - return "Point3d"; - case PrimitiveType.String: - return "String"; - } - throw new Error("Primitive property is not initialized"); - } -} - -class ECNavigationPropertyImpl extends ECPropertyImpl implements EC.NavigationProperty { - constructor(coreProperty: CoreNavigationProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isNavigation(): this is EC.NavigationProperty { - return true; - } - public get relationshipClass() { - return createFromLazyLoaded(this._coreProperty.relationshipClass, (r) => new ECRelationshipClassImpl(r)); - } - public get direction() { - switch (this._coreProperty.direction) { - case StrengthDirection.Backward: - return "Backward"; - case StrengthDirection.Forward: - return "Forward"; - } - } -} - -class ECEnumerationPropertyImpl - extends ECPropertyImpl - implements EC.EnumerationProperty -{ - constructor(coreProperty: TCoreProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isEnumeration(): this is EC.EnumerationProperty { - return true; - } - public get enumeration() { - return createFromOptionalLazyLoaded( - this._coreProperty.enumeration, - (coreEnumeration) => new ECEnumerationImpl(coreEnumeration), - ); - } - public get extendedTypeName() { - return this._coreProperty.extendedTypeName; - } -} - -class ECStructPropertyImpl - extends ECPropertyImpl - implements EC.StructProperty -{ - constructor(coreProperty: TCoreProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isStruct(): this is EC.StructProperty { - return true; - } - public get structClass(): EC.StructClass { - return new ECStructClassImpl(this._coreProperty.structClass); - } -} - -class ECPrimitivesArrayPropertyImpl - extends ECPrimitivePropertyImpl - implements EC.PrimitiveArrayProperty -{ - constructor(coreProperty: CorePrimitiveArrayProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isArray(): this is EC.ArrayProperty { - return true; - } - public get minOccurs() { - return this._coreProperty.minOccurs; - } - public get maxOccurs() { - return this._coreProperty.maxOccurs; - } -} - -class ECEnumerationArrayPropertyImpl - extends ECEnumerationPropertyImpl - implements EC.EnumerationArrayProperty -{ - constructor(coreProperty: CoreEnumerationArrayProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isArray(): this is EC.ArrayProperty { - return true; - } - public get minOccurs() { - return this._coreProperty.minOccurs; - } - public get maxOccurs() { - return this._coreProperty.maxOccurs; - } -} - -class ECStructArrayPropertyImpl - extends ECStructPropertyImpl - implements EC.StructArrayProperty -{ - constructor(coreProperty: CoreStructArrayProperty, c: EC.Class) { - super(coreProperty, c); - } - public override isArray(): this is EC.ArrayProperty { - return true; - } - public get minOccurs() { - return this._coreProperty.minOccurs; - } - public get maxOccurs() { - return this._coreProperty.maxOccurs; - } -} - -async function createFromLazyLoaded( - source: LazyLoadedSchemaItem, - convert: (source: TSource) => TTarget, -): Promise { - return source.then(convert); -} - -async function createFromOptionalLazyLoaded( - source: LazyLoadedSchemaItem | undefined, - convert: (source: TSource) => TTarget, -): Promise { - if (!source) { - return undefined; - } - return source.then(convert); -} - -const EMPTY_MAP: ReadonlyMap = new Map(); -async function createCustomAttributesSet( - coreCustomAttributes: CoreClass["customAttributes"], -): Promise { - if (!coreCustomAttributes) { - return EMPTY_MAP; - } - return { - *[Symbol.iterator]() { - for (const [className, ca] of coreCustomAttributes) { - const normalizedClassName = normalizeFullClassName(className); - yield [normalizedClassName, { ...ca, className: normalizedClassName }]; - } - }, - get(className: EC.FullClassName) { - const normalizedClassName = normalizeFullClassName(className); - const coreCustomAttribute = coreCustomAttributes.get(normalizedClassName); - return coreCustomAttribute ? { ...coreCustomAttribute, className: normalizedClassName } : undefined; - }, - }; -} - -class ECRelationshipConstraintImpl implements EC.RelationshipConstraint { - constructor( - private _coreConstraint: CoreRelationshipConstraint, - private _schema: EC.Schema, - ) {} - public get multiplicity() { - return this._coreConstraint.multiplicity; - } - public get polymorphic() { - return this._coreConstraint.polymorphic; - } - public get abstractConstraint(): Promise { - return createFromOptionalLazyLoaded(this._coreConstraint.abstractConstraint, (coreConstraint) => - createECClass(coreConstraint, this._schema), - ); - } -} - -class ECKindOfQuantityImpl extends ECSchemaItemImpl implements EC.KindOfQuantity { - constructor(coreKindOfQuantity: CoreKindOfQuantity) { - super(coreKindOfQuantity); - } -} - -class ECEnumerationImpl extends ECSchemaItemImpl implements EC.Enumeration { - constructor(coreEnumeration: CoreEnumeration) { - super(coreEnumeration); - } - public get enumerators() { - return this._coreSchemaItem.enumerators.map((coreEnumerator) => ({ ...coreEnumerator })); - } - public get type() { - switch (this._coreSchemaItem.type) { - case PrimitiveType.String: - return "String"; - case PrimitiveType.Integer: - default: - return "Number"; - } - } - public get isStrict() { - return this._coreSchemaItem.isStrict; - } -} diff --git a/packages/core-interop/src/core-interop/schema-provider/SchemaContextProvider.ts b/packages/core-interop/src/core-interop/schema-provider/SchemaContextProvider.ts new file mode 100644 index 000000000..84a59e118 --- /dev/null +++ b/packages/core-interop/src/core-interop/schema-provider/SchemaContextProvider.ts @@ -0,0 +1,635 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { assert } from "@itwin/core-bentley"; +import { + ECClass as CoreClass, + PrimitiveType as CorePrimitiveType, + SchemaItemType as CoreSchemaItemType, + SchemaKey as CoreSchemaKey, + StrengthDirection as CoreStrengthDirection, +} from "@itwin/ecschema-metadata"; +import { normalizeFullClassName, parseFullClassName } from "@itwin/presentation-shared"; + +import type { + EntityClass as CoreEntityClass, + Enumeration as CoreEnumeration, + EnumerationArrayProperty as CoreEnumerationArrayProperty, + EnumerationProperty as CoreEnumerationProperty, + KindOfQuantity as CoreKindOfQuantity, + Mixin as CoreMixin, + NavigationProperty as CoreNavigationProperty, + PrimitiveArrayProperty as CorePrimitiveArrayProperty, + PrimitiveProperty as CorePrimitiveProperty, + Property as CoreProperty, + RelationshipClass as CoreRelationshipClass, + RelationshipConstraint as CoreRelationshipConstraint, + Schema as CoreSchema, + SchemaItem as CoreSchemaItem, + StructArrayProperty as CoreStructArrayProperty, + StructClass as CoreStructClass, + StructProperty as CoreStructProperty, +} from "@itwin/ecschema-metadata"; +import type { EC, ECSchemaProvider } from "@itwin/presentation-shared"; + +// ─── Types ──────────────────────────────────────────────────────────────────── + +/** + * Defines input for `createECSchemaProvider`. Generally, this is an instance of [SchemaContext](https://www.itwinjs.org/reference/ecschema-metadata/context/schemacontext/) + * class from `@itwin/ecschema-metadata` package. + * + * @public + */ +export interface CoreSchemaContext { + getSchema(key: CoreSchemaKey): Promise; +} + +/** Maps a normalized full class name to its direct derived classes within a schema. */ +type DerivedClassesMap = ReadonlyMap; + +// ─── Force-load ─────────────────────────────────────────────────────────────── + +/** + * Awaits all lazy schema items that require async resolution so that they are cached inside the + * `SchemaContext`, allowing the sync sister-methods (`getBaseClassSync`, `isSync`, + * `getKindOfQuantitySync`, etc.) to work immediately afterward. + * + * Returns the only piece of data that has no sync counterpart: a map of normalized full class name + * to its direct derived classes. + */ +async function forceLoadSchemaClasses(coreSchema: CoreSchema): Promise { + const derivedMap = new Map(); + + for (const coreClass of coreSchema.getItems(CoreClass)) { + if (coreClass.baseClass) { + const base = await coreClass.baseClass; + const baseFn = normalizeFullClassName(base.fullName); + if (!derivedMap.has(baseFn)) { + derivedMap.set(baseFn, []); + } + derivedMap.get(baseFn)!.push(coreClass); + } + + for (const prop of coreClass.getPropertiesSync()) { + if (prop.kindOfQuantity) { + await prop.kindOfQuantity; + } + if (prop.isEnumeration() && prop.enumeration) { + await prop.enumeration; + } + if (prop.isNavigation()) { + await prop.relationshipClass; + } + } + + if (coreClass.schemaItemType === CoreSchemaItemType.RelationshipClass) { + const rel = coreClass as CoreRelationshipClass; + if (rel.source.abstractConstraint) { + await rel.source.abstractConstraint; + } + if (rel.target.abstractConstraint) { + await rel.target.abstractConstraint; + } + } + } + + return derivedMap; +} + +// ─── Provider ───────────────────────────────────────────────────────────────── + +export function createECSchemaProviderFromSchemaContext(schemaContext: CoreSchemaContext): ECSchemaProvider { + const schemaRequestsCache = new Map>(); + + async function getSchemaUnprotected(schemaName: string) { + const coreSchema = await schemaContext.getSchema(new CoreSchemaKey(schemaName)); + if (!coreSchema) { + return undefined; + } + const derivedMap = await forceLoadSchemaClasses(coreSchema); + return createECSchema(coreSchema, derivedMap); + } + + async function getSchemaProtected( + schemaName: string, + handledExistingSchemaErrors: Set, + ): Promise { + // workaround for https://github.com/iTwin/itwinjs-core/issues/6542 + try { + return await getSchemaUnprotected(schemaName); + } catch (e) { + /* v8 ignore else -- @preserve */ + if (e instanceof Error) { + if (e.message.includes("already exists within this cache") && !handledExistingSchemaErrors.has(schemaName)) { + handledExistingSchemaErrors.add(schemaName); + return getSchemaProtected(schemaName, handledExistingSchemaErrors); + } + if (e.message.includes("schema not found")) { + return undefined; + } + } + throw e; + } + } + + return { + async getSchema(name) { + let promise = schemaRequestsCache.get(name); + if (!promise) { + promise = getSchemaProtected(name, new Set()); + schemaRequestsCache.set(name, promise); + } + return promise; + }, + }; +} + +// ─── EC.Schema ──────────────────────────────────────────────────────────────── + +export function createECSchema(coreSchema: CoreSchema, derivedClassesMap: DerivedClassesMap): EC.Schema { + return { + name: coreSchema.name, + version: coreSchema.schemaKey.version, + get isHidden() { + const ca = coreSchema.customAttributes?.get("CoreCustomAttributes.HiddenSchema"); + if (!ca) { + return false; + } + return (ca as { ["ShowClasses"]?: boolean }).ShowClasses !== true; + }, + getClass(name) { + const item = coreSchema.getItemSync(name, CoreClass); + if (!item) { + return undefined; + } + return createECClass(item, this, derivedClassesMap); + }, + }; +} + +// ─── EC.Class ──────────────────────────────────────────────────────────────── + +abstract class ECSchemaItemImpl implements EC.SchemaItem { + private _schema: EC.Schema; + protected constructor( + protected _coreSchemaItem: TCoreSchemaItem, + schema?: EC.Schema, + ) { + this._schema = schema ?? createECSchema(this._coreSchemaItem.schema, new Map()); + } + public get schema() { + return this._schema; + } + public get fullName() { + return normalizeFullClassName(this._coreSchemaItem.fullName); + } + public get name() { + return this._coreSchemaItem.name; + } + public get label() { + return this._coreSchemaItem.label; + } +} + +export function createECClass( + coreClass: CoreClass, + schema?: EC.Schema, + derivedClassesMap?: DerivedClassesMap, +): EC.Class { + switch (coreClass.schemaItemType) { + case CoreSchemaItemType.EntityClass: + return new ECEntityClassImpl(coreClass as CoreEntityClass, schema, derivedClassesMap); + case CoreSchemaItemType.RelationshipClass: + return new ECRelationshipClassImpl(coreClass as CoreRelationshipClass, schema, derivedClassesMap); + case CoreSchemaItemType.StructClass: + return new ECStructClassImpl(coreClass, schema, derivedClassesMap); + case CoreSchemaItemType.Mixin: + return new ECMixinImpl(coreClass as CoreMixin, schema, derivedClassesMap); + } + throw new Error(`Invalid class type "${coreClass.schemaItemType}" for class ${coreClass.fullName}`); +} + +abstract class ECClassImpl extends ECSchemaItemImpl implements EC.Class { + protected constructor( + coreClass: TCoreClass, + schema: EC.Schema | undefined, + protected readonly _derivedMap: DerivedClassesMap | undefined, + ) { + super(coreClass, schema); + } + + public isEntityClass(): this is EC.EntityClass { + return false; + } + public isRelationshipClass(): this is EC.RelationshipClass { + return false; + } + public isStructClass(): this is EC.StructClass { + return false; + } + public isMixin(): this is EC.Mixin { + return false; + } + + public get isHidden(): boolean | undefined { + const ca = this._coreSchemaItem.customAttributes?.get("CoreCustomAttributes.HiddenClass"); + if (ca) { + return (ca as { ["Show"]?: boolean }).Show === true ? false : true; + } + if (this.schema.isHidden) { + return true; + } + return undefined; + } + + public get baseClass(): EC.Class | undefined { + const base = this._coreSchemaItem.getBaseClassSync(); + return base ? createECClass(base, this.schema, this._derivedMap) : undefined; + } + + public is(classOrClassName: EC.Class | string, schemaName?: string): boolean { + if (typeof classOrClassName === "string") { + return this._coreSchemaItem.isSync(classOrClassName, schemaName!); + } + const { schemaName: sn, className: cn } = parseFullClassName(classOrClassName.fullName); + return this._coreSchemaItem.isSync(cn, sn); + } + + public getProperty(name: string): EC.Property | undefined { + const coreProperty = this._coreSchemaItem.getPropertySync(name, false); + if (!coreProperty) { + return undefined; + } + return createECProperty(coreProperty, this); + } + + public getProperties(): Array { + const result: EC.Property[] = []; + for (const coreProperty of this._coreSchemaItem.getPropertiesSync()) { + result.push(createECProperty(coreProperty, this)); + } + return result; + } + + public getDerivedClasses(): EC.Class[] { + return (this._derivedMap?.get(this.fullName) ?? []).map((c) => createECClass(c, this.schema, this._derivedMap)); + } +} + +class ECEntityClassImpl extends ECClassImpl implements EC.EntityClass { + constructor(coreClass: CoreEntityClass, schema?: EC.Schema, derivedMap?: DerivedClassesMap) { + super(coreClass, schema, derivedMap); + } + public override isEntityClass(): this is EC.EntityClass { + return true; + } +} + +class ECRelationshipClassImpl extends ECClassImpl implements EC.RelationshipClass { + constructor(coreClass: CoreRelationshipClass, schema?: EC.Schema, derivedMap?: DerivedClassesMap) { + super(coreClass, schema, derivedMap); + } + public override isRelationshipClass(): this is EC.RelationshipClass { + return true; + } + public get direction() { + switch (this._coreSchemaItem.strengthDirection) { + case CoreStrengthDirection.Forward: + return "Forward" as const; + case CoreStrengthDirection.Backward: + return "Backward" as const; + } + } + public get source(): EC.RelationshipConstraint { + return new ECRelationshipConstraintImpl( + this._coreSchemaItem.source, + this._coreSchemaItem.schema, + this.schema, + this._derivedMap, + ); + } + public get target(): EC.RelationshipConstraint { + return new ECRelationshipConstraintImpl( + this._coreSchemaItem.target, + this._coreSchemaItem.schema, + this.schema, + this._derivedMap, + ); + } +} + +class ECStructClassImpl extends ECClassImpl implements EC.StructClass { + constructor(coreClass: CoreStructClass, schema?: EC.Schema, derivedMap?: DerivedClassesMap) { + super(coreClass, schema, derivedMap); + } + public override isStructClass(): this is EC.StructClass { + return true; + } +} + +class ECMixinImpl extends ECClassImpl implements EC.Mixin { + constructor(coreClass: CoreMixin, schema?: EC.Schema, derivedMap?: DerivedClassesMap) { + super(coreClass, schema, derivedMap); + } + public override isMixin(): this is EC.Mixin { + return true; + } +} + +// ─── EC.Property ───────────────────────────────────────────────────────────── + +export function createECProperty(coreProperty: CoreProperty, ecClass: EC.Class): EC.Property { + if (coreProperty.isArray()) { + if (coreProperty.isPrimitive()) { + return new ECPrimitivesArrayPropertyImpl(coreProperty, ecClass); + } + if (coreProperty.isEnumeration()) { + return new ECEnumerationArrayPropertyImpl(coreProperty, ecClass); + } + return new ECStructArrayPropertyImpl(coreProperty, ecClass); + } + if (coreProperty.isStruct()) { + return new ECStructPropertyImpl(coreProperty, ecClass); + } + if (coreProperty.isEnumeration()) { + return new ECEnumerationPropertyImpl(coreProperty, ecClass); + } + if (coreProperty.isNavigation()) { + return new ECNavigationPropertyImpl(coreProperty, ecClass); + } + assert(coreProperty.isPrimitive()); + return new ECPrimitivePropertyImpl(coreProperty, ecClass); +} + +abstract class ECPropertyImpl implements EC.Property { + protected constructor( + protected _coreProperty: TCoreProperty, + protected _class: EC.Class, + ) {} + public isArray(): this is EC.ArrayProperty { + return false; + } + public isStruct(): this is EC.StructProperty { + return false; + } + public isPrimitive(): this is EC.PrimitiveProperty { + return false; + } + public isEnumeration(): this is EC.EnumerationProperty { + return false; + } + public isNavigation(): this is EC.NavigationProperty { + return false; + } + public get class() { + return this._class; + } + public get name() { + return this._coreProperty.name; + } + public get label() { + return this._coreProperty.label; + } + public get isHidden(): boolean { + const ca = this._coreProperty.customAttributes?.get("CoreCustomAttributes.HiddenProperty"); + if (ca) { + return (ca as { ["Show"]?: boolean }).Show === true ? false : true; + } + return false; + } + public get kindOfQuantity(): EC.KindOfQuantity | undefined { + const koq = this._coreProperty.getKindOfQuantitySync(); + return koq ? new ECKindOfQuantityImpl(koq) : undefined; + } +} + +class ECPrimitivePropertyImpl + extends ECPropertyImpl + implements EC.PrimitiveProperty +{ + constructor(coreProperty: TCoreProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isPrimitive(): this is EC.PrimitiveProperty { + return true; + } + public get extendedTypeName() { + return this._coreProperty.extendedTypeName; + } + public get primitiveType() { + switch (this._coreProperty.primitiveType) { + case CorePrimitiveType.Binary: + return "Binary" as const; + case CorePrimitiveType.Boolean: + return "Boolean" as const; + case CorePrimitiveType.DateTime: + return "DateTime" as const; + case CorePrimitiveType.Double: + return "Double" as const; + case CorePrimitiveType.IGeometry: + return "IGeometry" as const; + case CorePrimitiveType.Integer: + return "Integer" as const; + case CorePrimitiveType.Long: + return "Long" as const; + case CorePrimitiveType.Point2d: + return "Point2d" as const; + case CorePrimitiveType.Point3d: + return "Point3d" as const; + case CorePrimitiveType.String: + return "String" as const; + } + throw new Error("Primitive property is not initialized"); + } +} + +class ECNavigationPropertyImpl extends ECPropertyImpl implements EC.NavigationProperty { + constructor(coreProperty: CoreNavigationProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isNavigation(): this is EC.NavigationProperty { + return true; + } + public get relationshipClass(): EC.RelationshipClass { + const relClass = this._coreProperty.getRelationshipClassSync(); + assert(relClass !== undefined, "Navigation property relationship class must be pre-loaded"); + return new ECRelationshipClassImpl(relClass); + } + public get direction() { + switch (this._coreProperty.direction) { + case CoreStrengthDirection.Backward: + return "Backward" as const; + case CoreStrengthDirection.Forward: + return "Forward" as const; + } + } +} + +class ECEnumerationPropertyImpl + extends ECPropertyImpl + implements EC.EnumerationProperty +{ + constructor(coreProperty: TCoreProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isEnumeration(): this is EC.EnumerationProperty { + return true; + } + public get enumeration(): EC.Enumeration | undefined { + const enumRef = this._coreProperty.enumeration; + if (!enumRef) { + return undefined; + } + // After forceLoad, the enumeration is cached in SchemaContext; retrieve it synchronously via the owning schema. + const resolved = this._coreProperty.class.schema.lookupItemSync(enumRef) as CoreEnumeration | undefined; + return resolved ? new ECEnumerationImpl(resolved) : undefined; + } + public get extendedTypeName() { + return this._coreProperty.extendedTypeName; + } +} + +class ECStructPropertyImpl + extends ECPropertyImpl + implements EC.StructProperty +{ + constructor(coreProperty: TCoreProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isStruct(): this is EC.StructProperty { + return true; + } + public get structClass(): EC.StructClass { + return new ECStructClassImpl(this._coreProperty.structClass); + } +} + +class ECPrimitivesArrayPropertyImpl + extends ECPrimitivePropertyImpl + implements EC.PrimitiveArrayProperty +{ + constructor(coreProperty: CorePrimitiveArrayProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isArray(): this is EC.ArrayProperty { + return true; + } + public get minOccurs() { + return this._coreProperty.minOccurs; + } + public get maxOccurs() { + return this._coreProperty.maxOccurs; + } +} + +class ECEnumerationArrayPropertyImpl + extends ECEnumerationPropertyImpl + implements EC.EnumerationArrayProperty +{ + constructor(coreProperty: CoreEnumerationArrayProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isArray(): this is EC.ArrayProperty { + return true; + } + public get minOccurs() { + return this._coreProperty.minOccurs; + } + public get maxOccurs() { + return this._coreProperty.maxOccurs; + } +} + +class ECStructArrayPropertyImpl + extends ECStructPropertyImpl + implements EC.StructArrayProperty +{ + constructor(coreProperty: CoreStructArrayProperty, c: EC.Class) { + super(coreProperty, c); + } + public override isArray(): this is EC.ArrayProperty { + return true; + } + public get minOccurs() { + return this._coreProperty.minOccurs; + } + public get maxOccurs() { + return this._coreProperty.maxOccurs; + } +} + +// ─── EC.RelationshipConstraint ──────────────────────────────────────────────── + +class ECRelationshipConstraintImpl implements EC.RelationshipConstraint { + constructor( + private _coreConstraint: CoreRelationshipConstraint, + private _coreSchema: CoreSchema, + private _schema: EC.Schema, + private _derivedMap: DerivedClassesMap | undefined, + ) {} + public get multiplicity() { + return this._coreConstraint.multiplicity; + } + public get polymorphic() { + return this._coreConstraint.polymorphic; + } + public get constraintClasses() { + return this._coreConstraint.constraintClasses + ? this._coreConstraint.constraintClasses + .map((c) => { + // After forceLoad, the abstract constraint class is cached in SchemaContext; retrieve it synchronously. + const cls = this._coreSchema.lookupItemSync(c, CoreClass); + if (!cls) { + return undefined; + } + return createECClass(cls, this._schema, this._derivedMap); + }) + .filter((c): c is EC.Class => c !== undefined) + : []; + } + public get abstractConstraint(): EC.EntityClass | EC.Mixin | EC.RelationshipClass | undefined { + const ref = this._coreConstraint.abstractConstraint; + if (!ref) { + return undefined; + } + // After forceLoad, the abstract constraint class is cached in SchemaContext; retrieve it synchronously. + const cls = this._coreSchema.lookupItemSync(ref, CoreClass); + if (!cls) { + return undefined; + } + return createECClass(cls, this._schema, this._derivedMap); + } +} + +// ─── EC.KindOfQuantity ──────────────────────────────────────────────────────── + +class ECKindOfQuantityImpl extends ECSchemaItemImpl implements EC.KindOfQuantity { + constructor(coreKindOfQuantity: CoreKindOfQuantity) { + super(coreKindOfQuantity); + } +} + +// ─── EC.Enumeration ────────────────────────────────────────────────────────── + +class ECEnumerationImpl extends ECSchemaItemImpl implements EC.Enumeration { + constructor(coreEnumeration: CoreEnumeration) { + super(coreEnumeration); + } + public get enumerators() { + return this._coreSchemaItem.enumerators.map((coreEnumerator) => ({ ...coreEnumerator })); + } + public get type() { + switch (this._coreSchemaItem.type) { + case CorePrimitiveType.String: + return "String" as const; + case CorePrimitiveType.Integer: + default: + return "Number" as const; + } + } + public get isStrict() { + return this._coreSchemaItem.isStrict; + } +} diff --git a/packages/core-interop/src/core-interop/schema-provider/SchemaViewProvider.ts b/packages/core-interop/src/core-interop/schema-provider/SchemaViewProvider.ts new file mode 100644 index 000000000..e18f2c0a7 --- /dev/null +++ b/packages/core-interop/src/core-interop/schema-provider/SchemaViewProvider.ts @@ -0,0 +1,351 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { SchemaViewPrimitiveType, StrengthDirection } from "@itwin/ecschema-metadata"; +import { normalizeFullClassName } from "@itwin/presentation-shared"; + +import type { SchemaView } from "@itwin/ecschema-metadata"; +import type { EC, ECSchemaProvider } from "@itwin/presentation-shared"; + +/** + * Subset of [SchemaView](https://www.itwinjs.org/reference/ecschema-metadata/context/schemaview/) API surface that + * is `@public` and can be used by `createECSchemaProvider` function. + * + * @public + */ +export type PublicSchemaView = Pick< + SchemaView, + | "schemaToken" + | "isOutdated" + | "schemaCount" + | "classCount" + | "getSchema" + | "getSchemaByAlias" + | "getSchemas" + | "findClass" + | "findEnumeration" + | "findKindOfQuantity" + | "findPropertyCategory" +>; + +export function createECSchemaProviderFromSchemaView(sv: PublicSchemaView): ECSchemaProvider { + return { + async getSchema(name) { + const svSchema = sv.getSchema(name); + return svSchema ? createECSchemaFromSchemaView(svSchema, sv) : undefined; + }, + }; +} + +export function createECSchemaFromSchemaView(svSchema: SchemaView.Schema, sv: PublicSchemaView): EC.Schema { + const ecSchema: EC.Schema = { + name: svSchema.name, + version: { read: svSchema.readVersion, write: svSchema.writeVersion, minor: svSchema.minorVersion }, + isHidden: svSchema.isHidden, + getClass(name) { + const svClass = svSchema.getClass(name); + return svClass ? createECClassFromSchemaView(svClass, sv, ecSchema) : undefined; + }, + }; + return ecSchema; +} + +export function createECClassFromSchemaView( + svClass: SchemaView.Class, + sv: PublicSchemaView, + schema: EC.Schema, +): EC.Class { + const ecClass: EC.Class = { + schema, + fullName: normalizeFullClassName(svClass.fullName), + name: svClass.name, + label: svClass.label, + isHidden: svClass.isHidden, + isEntityClass(): this is EC.EntityClass { + return svClass.isEntity(); + }, + isRelationshipClass(): this is EC.RelationshipClass { + return svClass.isRelationship(); + }, + isStructClass(): this is EC.StructClass { + return svClass.isStruct(); + }, + isMixin(): this is EC.Mixin { + return svClass.isMixin(); + }, + get baseClass(): EC.Class | undefined { + return svClass.baseClass + ? createECClassFromSchemaView(svClass.baseClass, sv, useOrCreateSchema(svClass.baseClass.schema, sv, schema)) + : undefined; + }, + is(classOrClassName: EC.Class | string, schemaName?: string): boolean { + if (typeof classOrClassName === "string") { + return svClass.is(`${schemaName!}.${classOrClassName}`); + } + return svClass.is(classOrClassName.fullName); + }, + getProperty(name: string): EC.Property | undefined { + const svProp = svClass.getProperty(name); + return svProp ? createECPropertyFromSchemaView(svProp, ecClass, sv) : undefined; + }, + getProperties(): EC.Property[] { + return svClass.getProperties().map((p) => createECPropertyFromSchemaView(p, ecClass, sv)); + }, + getDerivedClasses(): EC.Class[] { + return svClass.derivedClasses.map((c) => + createECClassFromSchemaView(c, sv, useOrCreateSchema(c.schema, sv, schema)), + ); + }, + }; + + if (svClass.isRelationship()) { + const ecRel: EC.RelationshipClass = { + ...ecClass, + direction: svClass.strengthDirection === StrengthDirection.Forward ? "Forward" : "Backward", + source: svClass.source + ? createECRelConstraintFromSchemaView(svClass.source, schema, sv) + : createEmptyRelConstraint(), + target: svClass.target + ? createECRelConstraintFromSchemaView(svClass.target, schema, sv) + : createEmptyRelConstraint(), + }; + return ecRel; + } + + return ecClass; +} + +function useOrCreateSchema(svSchema: SchemaView.Schema, sv: PublicSchemaView, useLikelySchema: EC.Schema): EC.Schema { + if (svSchema.name === useLikelySchema.name) { + return useLikelySchema; + } + return createECSchemaFromSchemaView(svSchema, sv); +} + +function createEmptyRelConstraint(): EC.RelationshipConstraint { + return { + multiplicity: { lowerLimit: 0, upperLimit: 0 }, + polymorphic: false, + constraintClasses: [], + abstractConstraint: undefined, + }; +} + +function createECRelConstraintFromSchemaView( + svConstraint: SchemaView.RelConstraint, + schema: EC.Schema, + sv: PublicSchemaView, +): EC.RelationshipConstraint { + return { + multiplicity: { lowerLimit: svConstraint.multiplicityLower, upperLimit: svConstraint.multiplicityUpper }, + polymorphic: svConstraint.polymorphic, + get constraintClasses() { + return svConstraint.constraintClasses.map((c) => + createECClassFromSchemaView(c, sv, useOrCreateSchema(c.schema, sv, schema)), + ); + }, + get abstractConstraint(): EC.EntityClass | EC.Mixin | EC.RelationshipClass | undefined { + const svClass = svConstraint.abstractConstraint; + if (!svClass) { + return undefined; + } + return createECClassFromSchemaView(svClass, sv, useOrCreateSchema(svClass.schema, sv, schema)); + }, + }; +} + +export function createECPropertyFromSchemaView( + svProp: SchemaView.Property, + ecClass: EC.Class, + sv: PublicSchemaView, +): EC.Property { + const base: EC.Property = { + class: ecClass, + name: svProp.name, + label: svProp.label, + isHidden: svProp.isHidden, + get category(): EC.PropertyCategory | undefined { + return svProp.category + ? createECPropertyCategoryFromSchemaView( + svProp.category, + useOrCreateSchema(svProp.category.schema, sv, ecClass.schema), + ) + : undefined; + }, + isArray(): this is EC.ArrayProperty { + return svProp.isArray(); + }, + isStruct(): this is EC.StructProperty { + return false; + }, + isPrimitive(): this is EC.PrimitiveProperty { + return false; + }, + isEnumeration(): this is EC.EnumerationProperty { + return false; + }, + isNavigation(): this is EC.NavigationProperty { + return false; + }, + }; + + if (svProp.isNavigation()) { + return { + ...base, + isNavigation(): this is EC.NavigationProperty { + return true; + }, + get direction() { + return svProp.direction === StrengthDirection.Forward ? ("Forward" as const) : ("Backward" as const); + }, + get relationshipClass(): EC.RelationshipClass { + return createECClassFromSchemaView( + svProp.relationshipClass, + sv, + useOrCreateSchema(svProp.relationshipClass.schema, sv, ecClass.schema), + ) as EC.RelationshipClass; + }, + } satisfies EC.NavigationProperty; + } + + // Check enumeration before primitive (enum is a facet of primitive in CoreSchemaView, but separate in EC) + if (svProp.isEnumeration()) { + const arrayFields = svProp.isArray() + ? { minOccurs: svProp.arrayMinOccurs ?? 0, maxOccurs: svProp.arrayMaxOccurs } + : undefined; + return { + ...base, + ...arrayFields, + isEnumeration(): this is EC.EnumerationProperty { + return true; + }, + isArray(): this is EC.ArrayProperty { + return svProp.isArray(); + }, + get extendedTypeName() { + return svProp.extendedTypeName; + }, + get enumeration(): EC.Enumeration | undefined { + return svProp.enumeration + ? createECEnumerationFromSchemaView( + svProp.enumeration, + useOrCreateSchema(svProp.enumeration.schema, sv, ecClass.schema), + ) + : undefined; + }, + } satisfies EC.EnumerationProperty | EC.EnumerationArrayProperty; + } + + if (svProp.isPrimitive()) { + const arrayFields = svProp.isArray() + ? { minOccurs: svProp.arrayMinOccurs ?? 0, maxOccurs: svProp.arrayMaxOccurs } + : undefined; + return { + ...base, + ...arrayFields, + isPrimitive(): this is EC.PrimitiveProperty { + return true; + }, + isArray(): this is EC.ArrayProperty { + return svProp.isArray(); + }, + get primitiveType() { + return mapSchemaViewPrimitiveType(svProp.primitiveType); + }, + get extendedTypeName() { + return svProp.extendedTypeName; + }, + get kindOfQuantity(): EC.KindOfQuantity | undefined { + return svProp.kindOfQuantity + ? createECKoqFromSchemaView( + svProp.kindOfQuantity, + useOrCreateSchema(svProp.kindOfQuantity.schema, sv, ecClass.schema), + ) + : undefined; + }, + } satisfies EC.PrimitiveProperty | EC.PrimitiveArrayProperty; + } + + if (svProp.isStruct()) { + const arrayFields = svProp.isArray() + ? { minOccurs: svProp.arrayMinOccurs ?? 0, maxOccurs: svProp.arrayMaxOccurs } + : undefined; + return { + ...base, + ...arrayFields, + isStruct(): this is EC.StructProperty { + return true; + }, + isArray(): this is EC.ArrayProperty { + return svProp.isArray(); + }, + get structClass(): EC.StructClass { + return createECClassFromSchemaView( + svProp.structClass, + sv, + useOrCreateSchema(svProp.structClass.schema, sv, ecClass.schema), + ); + }, + } satisfies EC.StructProperty | EC.StructArrayProperty; + } + + throw new Error( + `Unexpected property type for ${svProp.declaringClass ? svProp.declaringClass.fullName : ""}.${svProp.name}`, + ); +} + +function mapSchemaViewPrimitiveType(svType: SchemaViewPrimitiveType): EC.PrimitiveType { + switch (svType) { + case SchemaViewPrimitiveType.Binary: + return "Binary"; + case SchemaViewPrimitiveType.Boolean: + return "Boolean"; + case SchemaViewPrimitiveType.DateTime: + return "DateTime"; + case SchemaViewPrimitiveType.Double: + return "Double"; + case SchemaViewPrimitiveType.IGeometry: + return "IGeometry"; + case SchemaViewPrimitiveType.Integer: + return "Integer"; + case SchemaViewPrimitiveType.Long: + return "Long"; + case SchemaViewPrimitiveType.Point2d: + return "Point2d"; + case SchemaViewPrimitiveType.Point3d: + return "Point3d"; + case SchemaViewPrimitiveType.String: + return "String"; + } + throw new Error(`Uninitialized CoreSchemaView primitive type: ${svType}`); +} + +function createECEnumerationFromSchemaView(svEnum: SchemaView.Enumeration, schema: EC.Schema): EC.Enumeration { + return { + schema, + fullName: normalizeFullClassName(svEnum.fullName), + name: svEnum.name, + label: svEnum.label, + type: svEnum.primitiveType === SchemaViewPrimitiveType.Integer ? "Number" : "String", + isStrict: svEnum.isStrict, + enumerators: [...svEnum.getEnumerators()].map((e) => ({ name: e.name, label: e.label, value: e.value })), + }; +} + +function createECKoqFromSchemaView(svKoq: SchemaView.KindOfQuantity, schema: EC.Schema): EC.KindOfQuantity { + return { schema, fullName: normalizeFullClassName(svKoq.fullName), name: svKoq.name, label: svKoq.label }; +} + +function createECPropertyCategoryFromSchemaView( + svCategory: SchemaView.PropertyCategory, + schema: EC.Schema, +): EC.PropertyCategory { + return { + schema, + fullName: normalizeFullClassName(svCategory.fullName), + name: svCategory.name, + label: svCategory.label, + }; +} diff --git a/packages/core-interop/src/test/Metadata.test.ts b/packages/core-interop/src/test/Metadata.test.ts index 45ab7eea6..716f35291 100644 --- a/packages/core-interop/src/test/Metadata.test.ts +++ b/packages/core-interop/src/test/Metadata.test.ts @@ -3,975 +3,27 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import { assert } from "@itwin/core-bentley"; -import { PrimitiveType, RelationshipMultiplicity, SchemaItemType, StrengthDirection } from "@itwin/ecschema-metadata"; +import { describe, expect, it, vi } from "vitest"; +import { SchemaView } from "@itwin/ecschema-metadata"; import { createECSchemaProvider } from "../core-interop/Metadata.js"; -import { createECClass, createECProperty, createECSchema } from "../core-interop/MetadataInternal.js"; -import type { - ECClass as CoreClass, - EnumerationArrayProperty as CoreEnumerationArrayProperty, - EnumerationProperty as CoreEnumerationProperty, - Enumerator as CoreEnumerator, - NavigationProperty as CoreNavigationProperty, - PrimitiveArrayProperty as CorePrimitiveArrayProperty, - PrimitiveProperty as CorePrimitiveProperty, - Schema as CoreSchema, - StructArrayProperty as CoreStructArrayProperty, - StructProperty as CoreStructProperty, - SchemaKey, -} from "@itwin/ecschema-metadata"; -import type { EC } from "@itwin/presentation-shared"; - -function stubSchema(name: string, version: EC.SchemaVersion = { read: 0, write: 0, minor: 0 }) { - return { name, schemaKey: { version } }; -} +import type { Schema as CoreSchema, SchemaKey } from "@itwin/ecschema-metadata"; describe("createECSchemaProvider", () => { - describe("getSchema", () => { - it("returns schema from schema context", async () => { - const schemaContext = { - getSchema: vi - .fn<(key: SchemaKey) => Promise>() - .mockImplementation(async (key: SchemaKey) => { - if (key.compareByName("x")) { - return stubSchema("y", { read: 1, write: 2, minor: 3 }) as unknown as CoreSchema; - } - return undefined; - }), - }; - - const provider = createECSchemaProvider(schemaContext); - const schema = await provider.getSchema("x"); - assert(schema !== undefined); - - expect(schemaContext.getSchema).toHaveBeenCalledOnce(); - const calledKey = schemaContext.getSchema.mock.calls[0][0]; - expect(calledKey.compareByName("x")).toBe(true); - expect(schema.name).toBe("y"); - expect(schema.version).toEqual({ read: 1, write: 2, minor: 3 }); - expect(typeof schema.getClass === "function").toBe(true); - }); - - it(`returns undefined on "schema not found" error`, async () => { - const schemaContext = { - getSchema: vi.fn<(key: SchemaKey) => Promise>().mockRejectedValue(new Error("schema not found")), - }; - - const provider = createECSchemaProvider(schemaContext); - expect(await provider.getSchema("x")).toBeUndefined(); - }); - - it("re-throws SchemaContext errors", async () => { - const schemaContext = { - getSchema: vi.fn<(key: SchemaKey) => Promise>().mockRejectedValue(new Error("Unknown error")), - }; - - const provider = createECSchemaProvider(schemaContext); - await expect(provider.getSchema("x")).rejects.toThrow(); - expect(schemaContext.getSchema).toHaveBeenCalledOnce(); - }); - - it("returns undefined from schema context", async () => { - const schemaContext = { getSchema: vi.fn().mockResolvedValue(undefined) }; - - const provider = createECSchemaProvider(schemaContext); - const schema = await provider.getSchema("x"); - - expect(schemaContext.getSchema).toHaveBeenCalledOnce(); - const calledKey = schemaContext.getSchema.mock.calls[0][0]; - expect(calledKey.compareByName("x")).toBe(true); - expect(schema).toBeUndefined(); - }); - - it("doesn't repeat requests for the same schema", async () => { - const schemaContext = { - getSchema: vi - .fn<(key: SchemaKey) => Promise>() - .mockResolvedValue(stubSchema("x") as unknown as CoreSchema), - }; - - const provider = createECSchemaProvider(schemaContext); - await Promise.all([provider.getSchema("x"), provider.getSchema("x")]); - - expect(schemaContext.getSchema).toHaveBeenCalledOnce(); - }); - - it("handles duplicate schema in cache error", async () => { - const schemaContext = { - getSchema: vi - .fn<(key: SchemaKey) => Promise>() - .mockRejectedValueOnce(new Error("The schema, x.01.02.03, already exists within this cache")) - .mockResolvedValueOnce(stubSchema("x") as unknown as CoreSchema), - }; - - const provider = createECSchemaProvider(schemaContext); - await provider.getSchema("x"); - - expect(schemaContext.getSchema).toHaveBeenCalledTimes(2); - }); - }); -}); - -describe("createECSchema", () => { - describe("getClass", () => { - it("returns class from core schema", async () => { - const coreSchema = { - ...stubSchema("s"), - getItem: vi - .fn() - .mockResolvedValue({ fullName: "s.c", name: "c", label: "C", schemaItemType: SchemaItemType.EntityClass }), - }; - - const schema = createECSchema(coreSchema as unknown as CoreSchema); - const result = await schema.getClass("c"); - assert(result !== undefined); - - expect(coreSchema.getItem).toHaveBeenCalledExactlyOnceWith("c", expect.any(Function)); - expect(result.schema.name).toBe("s"); - expect(result.fullName).toBe("s.c"); - expect(result.name).toBe("c"); - expect(result.label).toBe("C"); - expect(typeof result.is === "function").toBe(true); - }); - - it("returns undefined from core schema", async () => { - const coreSchema = { ...stubSchema("s"), getItem: vi.fn().mockResolvedValue(undefined) }; - - const schema = createECSchema(coreSchema as unknown as CoreSchema); - const result = await schema.getClass("c"); - - expect(coreSchema.getItem).toHaveBeenCalledExactlyOnceWith("c", expect.any(Function)); - expect(result).toBeUndefined(); - }); - }); - - describe("getCustomAttributes", () => { - it("returns custom attributes from core schema", async () => { - const ca: EC.CustomAttribute = { className: "schema.class", name: "x", label: "y" }; - const coreSchema = { - ...stubSchema("s"), - customAttributes: new Map([["schema.class", ca]]), - } as unknown as CoreSchema; - - const schema = createECSchema(coreSchema); - const result = await schema.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(1); - expect(entries[0]).to.deep.eq(["schema.class", ca]); - expect(result.get("schema.class")).to.deep.eq(ca); - }); - - it("returns empty set when core schema's custom attributes are not defined", async () => { - const coreSchema = { ...stubSchema("s"), customAttributes: undefined } as unknown as CoreSchema; - - const schema = createECSchema(coreSchema); - const result = await schema.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(0); - expect(result.get("schema.class")).to.be.undefined; - }); - - it("returns undefined custom attribute when there are custom attributes but the requested one does not exist", async () => { - const coreSchema = { - ...stubSchema("s"), - customAttributes: new Map([["schema.class", { className: "schema.class", name: "x", label: "y" }]]), - } as unknown as CoreSchema; - const schema = createECSchema(coreSchema); - const result = await schema.getCustomAttributes(); - expect(result.get("schema.other_class")).to.be.undefined; - }); - }); -}); - -describe("createECClass", () => { - const schema: EC.Schema = { - name: "s", - version: { read: 1, write: 0, minor: 0 }, - async getClass() { - return undefined; - }, - async getCustomAttributes() { - return new Map(); - }, - }; - - it("creates class using schema from core class", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - schema: stubSchema("core-schema"), - } as unknown as CoreClass; - const result = createECClass(coreClass); - expect(result.schema.name).toBe("core-schema"); - }); - - it("creates entity class from core class", async () => { - const coreClass = { fullName: "s.c", name: "c", label: "C", schemaItemType: SchemaItemType.EntityClass }; - const result = createECClass(coreClass as unknown as CoreClass, schema); - expect(result.isEntityClass()).toBe(true); - expect(result.isRelationshipClass()).toBe(false); - expect(result.isStructClass()).toBe(false); - expect(result.isMixin()).toBe(false); - expect(result.schema.name).toBe("s"); - expect(result.fullName).toBe("s.c"); - expect(result.name).toBe("c"); - expect(result.label).toBe("C"); - expect(typeof result.is === "function").toBe(true); - }); - - it("creates relationship class from core class", async () => { - const coreClass = { - fullName: "s.c", - name: "c", - label: "C", - schemaItemType: SchemaItemType.RelationshipClass, - } as unknown as CoreClass; - const result = createECClass(coreClass, schema); - expect(result.isEntityClass()).toBe(false); - expect(result.isRelationshipClass()).toBe(true); - expect(result.isStructClass()).toBe(false); - expect(result.isMixin()).toBe(false); - expect(result.schema.name).toBe("s"); - expect(result.fullName).toBe("s.c"); - expect(result.name).toBe("c"); - expect(result.label).toBe("C"); - expect(typeof result.is === "function").toBe(true); - }); - - it("creates struct class from core class", async () => { - const coreClass = { - fullName: "s.c", - name: "c", - label: "C", - schemaItemType: SchemaItemType.StructClass, - } as unknown as CoreClass; - const result = createECClass(coreClass, schema); - expect(result.isEntityClass()).toBe(false); - expect(result.isRelationshipClass()).toBe(false); - expect(result.isStructClass()).toBe(true); - expect(result.isMixin()).toBe(false); - expect(result.schema.name).toBe("s"); - expect(result.fullName).toBe("s.c"); - expect(result.name).toBe("c"); - expect(result.label).toBe("C"); - expect(typeof result.is === "function").toBe(true); - }); - - it("creates mixin from core class", async () => { - const coreClass = { - fullName: "s.c", - name: "c", - label: "C", - schemaItemType: SchemaItemType.Mixin, - } as unknown as CoreClass; - const result = createECClass(coreClass, schema); - expect(result.isEntityClass()).toBe(false); - expect(result.isRelationshipClass()).toBe(false); - expect(result.isStructClass()).toBe(false); - expect(result.isMixin()).toBe(true); - expect(result.schema.name).toBe("s"); - expect(result.fullName).toBe("s.c"); - expect(result.name).toBe("c"); - expect(result.label).toBe("C"); - expect(typeof result.is === "function").toBe(true); - }); - - it("throws when creating class from non-class core schema item", async () => { - const coreClass = { - schemaItemType: SchemaItemType.Constant, - fullName: "s.c", - name: "c", - label: "C", - } as unknown as CoreClass; - expect(() => createECClass(coreClass, schema)).toThrow(); - }); - - describe("baseClass", () => { - it("returns base class", async () => { - const coreBaseClass = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.b", name: "b" }; - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - baseClass: Promise.resolve(coreBaseClass), - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const result = await ecClass.baseClass; - expect(result!.fullName).to.eq("s.b"); - }); - - it("returns undefined if core class has no base", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - baseClass: undefined, - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const result = await ecClass.baseClass; - expect(result).to.be.undefined; - }); - }); - - describe("getDerivedClasses", () => { - it("returns derived classes", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - getDerivedClasses: async () => - Promise.resolve([{ schemaItemType: SchemaItemType.EntityClass, fullName: "s.d", name: "d" }]), - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const result = await ecClass.getDerivedClasses(); - expect(result.length).to.eq(1); - expect(result[0].fullName).to.eq("s.d"); - }); - - it("returns empty list if core class has no derived classes", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - getDerivedClasses: async () => Promise.resolve(undefined), - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const result = await ecClass.getDerivedClasses(); - expect(result.length).to.eq(0); - }); - }); - - describe("is", () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - is: vi.fn().mockResolvedValue(true), + it("dispatches to SchemaContext provider when given a schema context", async () => { + const schemaContext = { + getSchema: vi.fn<(key: SchemaKey) => Promise>().mockResolvedValue(undefined), }; - - beforeEach(() => { - coreClass.is.mockClear(); - }); - - it("handles CoreClass override", async () => { - const class1 = createECClass(coreClass as unknown as CoreClass, schema); - const class2 = createECClass( - { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c2", - name: "c2", - label: "C2", - } as unknown as CoreClass, - schema, - ); - const result = await class1.is(class2); - - expect(coreClass.is).toHaveBeenCalledExactlyOnceWith("c2", "s"); - expect(result).toBe(true); - }); - - it("handles class and schema names override", async () => { - const class1 = createECClass(coreClass as unknown as CoreClass, schema); - const result = await class1.is("a", "b"); - - expect(coreClass.is).toHaveBeenCalledExactlyOnceWith("a", "b"); - expect(result).toBe(true); - }); - }); - - describe("getProperties", () => { - it("returns properties from core class", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - getProperties: vi - .fn() - .mockResolvedValue([ - { - isArray: () => false, - isStruct: () => false, - isEnumeration: () => false, - isNavigation: () => false, - isPrimitive: () => true, - }, - ]), - } as unknown as CoreClass; - const ecClass = createECClass(coreClass, schema); - const properties = await ecClass.getProperties(); - - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(coreClass.getProperties).toHaveBeenCalledOnce(); - expect(properties.length).toBeGreaterThan(0); - }); - }); - - describe("getProperty", () => { - it("returns property from core class", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - getProperty: vi - .fn() - .mockResolvedValue({ - isArray: () => false, - isStruct: () => false, - isEnumeration: () => false, - isNavigation: () => false, - isPrimitive: () => true, - }), - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const prop = await ecClass.getProperty("p"); - - expect(coreClass.getProperty).toHaveBeenCalledExactlyOnceWith("p", false); - expect(prop).toBeDefined(); - }); - - it("returns undefined from core class", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - getProperty: vi.fn().mockResolvedValue(undefined), - }; - const ecClass = createECClass(coreClass as unknown as CoreClass, schema); - const prop = await ecClass.getProperty("p"); - - expect(coreClass.getProperty).toHaveBeenCalledExactlyOnceWith("p", false); - expect(prop).toBeUndefined(); - }); - }); - - describe("getCustomAttributes", () => { - it("returns custom attributes from core class", async () => { - const ca: EC.CustomAttribute = { className: "schema.class", name: "x", label: "y" }; - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - customAttributes: new Map([["schema.class", ca]]), - } as unknown as CoreClass; - const ecClass = createECClass(coreClass, schema); - const result = await ecClass.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(1); - expect(entries[0]).to.deep.eq(["schema.class", ca]); - expect(result.get("schema.class")).to.deep.eq(ca); - }); - - it("returns empty set when core class' custom attributes are not defined", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - customAttributes: undefined, - } as unknown as CoreClass; - const ecClass = createECClass(coreClass, schema); - const result = await ecClass.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(0); - expect(result.get("schema.class")).to.be.undefined; - }); - - it("returns undefined custom attribute when there are custom attributes but the requested one does not exist", async () => { - const coreClass = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "s.c", - name: "c", - label: "C", - customAttributes: new Map([["schema.class", { className: "schema.class", name: "x", label: "y" }]]), - } as unknown as CoreClass; - const ecClass = createECClass(coreClass, schema); - const result = await ecClass.getCustomAttributes(); - expect(result.get("schema.other_class")).to.be.undefined; - }); + const provider = createECSchemaProvider(schemaContext); + await provider.getSchema("test"); + expect(schemaContext.getSchema).toHaveBeenCalledOnce(); }); - describe("Relationship class", () => { - const coreRelationshipClass = { - schemaItemType: SchemaItemType.RelationshipClass, - fullName: "Schema.TestRelationship", - name: "TestRelationship", - label: "Test relationship", - }; - - describe("direction", () => { - it("returns forward direction from core relationship", async () => { - const rel = createECClass( - { ...coreRelationshipClass, strengthDirection: StrengthDirection.Forward } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.direction).toBe("Forward"); - }); - - it("returns backward direction from core relationship", async () => { - const rel = createECClass( - { ...coreRelationshipClass, strengthDirection: StrengthDirection.Backward } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.direction).toBe("Backward"); - }); - }); - - describe("source & target", () => { - it("returns source constraint", () => { - const rel = createECClass( - { ...coreRelationshipClass, source: {} } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.source).toBeDefined(); - }); - - it("returns target constraint", () => { - const rel = createECClass( - { ...coreRelationshipClass, target: {} } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.target).toBeDefined(); - }); - - describe("ECRelationshipConstraint implementation", () => { - it("returns undefined multiplicity from core constraint", () => { - const rel = createECClass( - { ...coreRelationshipClass, source: { multiplicity: undefined } } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.source.multiplicity).toBeUndefined(); - }); - - it("returns multiplicity from core constraint", () => { - const rel = createECClass( - { - ...coreRelationshipClass, - // eslint-disable-next-line @itwin/no-internal - source: { multiplicity: new RelationshipMultiplicity(123, 456) }, - } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.source.multiplicity).toEqual({ lowerLimit: 123, upperLimit: 456 }); - }); - - it("returns polymorphic flag from core constraint", () => { - [ - { in: false, expectation: false }, - { in: true, expectation: true }, - ].forEach((testEntry) => { - const rel = createECClass( - { ...coreRelationshipClass, source: { polymorphic: testEntry.in } } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - expect(rel.source.polymorphic).toBe(testEntry.expectation); - }); - }); - - it("returns abstract constraint from core constraint", async () => { - const coreAbstractConstraint = { - schemaItemType: SchemaItemType.EntityClass, - fullName: "Schema.TestAbstractConstraint", - name: "TestAbstractConstraint", - label: "Test abstract constraint", - } as unknown as CoreClass; - const rel = createECClass( - { - ...coreRelationshipClass, - source: { abstractConstraint: Promise.resolve(coreAbstractConstraint) }, - } as unknown as CoreClass, - schema, - ) as EC.RelationshipClass; - const constraint = (await rel.source.abstractConstraint)!; - expect(constraint.isEntityClass()).toBe(true); - expect(constraint.fullName).toBe(coreAbstractConstraint.fullName); - }); - }); - }); - }); -}); - -describe("createECProperty", () => { - const propertyClass: EC.Class = {} as unknown as EC.Class; - const propertyStub = { - isArray: () => false, - isEnumeration: () => false, - isNavigation: () => false, - isPrimitive: () => false, - isStruct: () => false, - fullName: "", - name: "", - }; - - describe("getCustomAttributes", () => { - it("returns custom attributes from core property", async () => { - const ca: EC.CustomAttribute = { className: "schema.class", name: "x", label: "y" }; - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - customAttributes: new Map([["schema.class", ca]]), - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass); - const result = await property.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(1); - expect(entries[0]).to.deep.eq(["schema.class", ca]); - expect(result.get("schema.class")).to.deep.eq(ca); - }); - - it("returns empty set when core property's custom attributes are not defined", async () => { - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - customAttributes: undefined, - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass); - const result = await property.getCustomAttributes(); - - const entries = [...result]; - expect(entries.length).to.eq(0); - expect(result.get("schema.class")).to.be.undefined; - }); - - it("returns undefined custom attribute when there are custom attributes but the requested one does not exist", async () => { - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - customAttributes: new Map([["schema.class", { className: "schema.class", name: "x", label: "y" }]]), - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass); - const result = await property.getCustomAttributes(); - expect(result.get("schema.other_class")).to.be.undefined; - }); - }); - - describe("Primitive property", () => { - it("creates property from core property", async () => { - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - label: "Test property", - extendedTypeName: "extended", - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(false); - expect(property.isEnumeration()).toBe(false); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(true); - expect(property.isStruct()).toBe(false); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - expect(property.extendedTypeName).toBe(coreProperty.extendedTypeName); - }); - - it("maps primitive types", async () => { - const types: [PrimitiveType, EC.PrimitiveType][] = [ - [PrimitiveType.Binary, "Binary"], - [PrimitiveType.Boolean, "Boolean"], - [PrimitiveType.DateTime, "DateTime"], - [PrimitiveType.Double, "Double"], - [PrimitiveType.IGeometry, "IGeometry"], - [PrimitiveType.Integer, "Integer"], - [PrimitiveType.Long, "Long"], - [PrimitiveType.Point2d, "Point2d"], - [PrimitiveType.Point3d, "Point3d"], - [PrimitiveType.String, "String"], - ]; - types.forEach(([coreType, expectation]) => { - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - primitiveType: coreType, - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; - expect(property.primitiveType).toBe(expectation); - }); - - const uninitializedTypes = [undefined, PrimitiveType.Uninitialized]; - uninitializedTypes.forEach((coreType) => { - const uninitializedProperty = createECProperty( - { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - primitiveType: coreType, - } as unknown as CorePrimitiveProperty, - propertyClass, - ) as EC.PrimitiveProperty; - expect(() => uninitializedProperty.primitiveType).toThrow(); - }); - }); - - it("maps kind of quantity", async () => { - const coreProperty = { - ...propertyStub, - isPrimitive: () => true, - name: "test-property", - kindOfQuantity: Promise.resolve({ fullName: "SchemaName.TestKoq", schema: stubSchema("SchemaName") }), - } as unknown as CorePrimitiveProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; - const koq = (await property.kindOfQuantity)!; - expect(koq.fullName).toBe("SchemaName.TestKoq"); - - expect( - await createECProperty({ ...coreProperty, kindOfQuantity: undefined } as CorePrimitiveProperty, propertyClass) - .kindOfQuantity, - ).toBeUndefined(); - }); - }); - - describe("Navigation property", () => { - it("creates property from core property", async () => { - const coreProperty = { - ...propertyStub, - isNavigation: () => true, - name: "test-property", - label: "Test property", - } as unknown as CoreNavigationProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(false); - expect(property.isEnumeration()).toBe(false); - expect(property.isNavigation()).toBe(true); - expect(property.isPrimitive()).toBe(false); - expect(property.isStruct()).toBe(false); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - }); - - it("maps direction", async () => { - const map = [ - [StrengthDirection.Backward, "Backward"], - [StrengthDirection.Forward, "Forward"], - ]; - map.forEach(([coreDirection, expectation]) => { - const coreProperty = { - ...propertyStub, - isNavigation: () => true, - name: "test-property", - direction: coreDirection, - } as unknown as CoreNavigationProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; - expect(property.direction).toBe(expectation); - }); - }); - - it("returns relationship class", async () => { - const coreProperty = { - ...propertyStub, - isNavigation: () => true, - name: "test-property", - relationshipClass: Promise.resolve({ - fullName: "SchemaName.RelationshipClass", - schema: stubSchema("SchemaName"), - }), - } as unknown as CoreNavigationProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; - const relationshipClass = await property.relationshipClass; - expect(relationshipClass.fullName).toBe("SchemaName.RelationshipClass"); - }); - }); - - describe("Enumeration property", () => { - it("creates property from core property", async () => { - const coreProperty = { - ...propertyStub, - isEnumeration: () => true, - name: "test-property", - label: "Test property", - extendedTypeName: "extended", - } as unknown as CoreEnumerationProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(false); - expect(property.isEnumeration()).toBe(true); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(false); - expect(property.isStruct()).toBe(false); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - expect(property.extendedTypeName).toBe(coreProperty.extendedTypeName); - }); - - it("returns enumeration", async () => { - const coreProperty = { - ...propertyStub, - isEnumeration: () => true, - name: "test-property", - enumeration: Promise.resolve({ schema: stubSchema("SchemaName") }), - } as unknown as CoreEnumerationProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; - expect(await property.enumeration).toBeDefined(); - }); - - describe("ECEnumeration implementation", () => { - const coreEnumeration = { - schema: stubSchema("SchemaName"), - isStrict: false, - type: undefined, - enumerators: new Array>(), - }; - const coreEnumerationProperty = { - ...propertyStub, - isEnumeration: () => true, - name: "test-property", - enumeration: Promise.resolve(coreEnumeration), - } as unknown as CoreEnumerationProperty; - let property: EC.EnumerationProperty; - - beforeEach(async () => { - property = createECProperty(coreEnumerationProperty, propertyClass) as EC.EnumerationProperty; - }); - - it("returns `isStrict` flag", async () => { - coreEnumeration.isStrict = true; - const enumeration = (await property.enumeration)!; - expect(enumeration.isStrict).toBe(true); - }); - - it("maps enumeration type", async () => { - const typesMap = [ - [PrimitiveType.String, "String"], - [PrimitiveType.Integer, "Number"], - [undefined, "Number"], - ]; - const typeStub = vi.spyOn(coreEnumeration as any, "type", "get"); - for (const [coreType, expectation] of typesMap) { - typeStub.mockReturnValue(coreType); - const enumeration = (await property.enumeration)!; - expect(enumeration.type).toBe(expectation); - } - }); - - it("returns enumerators", async () => { - coreEnumeration.enumerators = [ - { name: "1", value: 1, label: "One", description: "Test one" }, - { name: "2", value: 2 }, - ]; - const enumeration = (await property.enumeration)!; - expect(enumeration.enumerators).toEqual(coreEnumeration.enumerators); - }); - }); - }); - - describe("Struct property", () => { - it("creates property from core property", async () => { - const coreProperty = { - ...propertyStub, - isStruct: () => true, - name: "test-property", - label: "Test property", - } as unknown as CoreStructProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.StructProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(false); - expect(property.isEnumeration()).toBe(false); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(false); - expect(property.isStruct()).toBe(true); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - }); - - it("returns struct class", async () => { - const coreProperty = { - ...propertyStub, - isStruct: () => true, - name: "test-property", - structClass: { fullName: "SchemaName.StructClass", schema: stubSchema("SchemaName") }, - } as unknown as CoreStructProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.StructProperty; - expect(property.structClass.fullName).toBe("SchemaName.StructClass"); - }); - }); - - describe("Array property", () => { - it("creates primitive array property from core property", async () => { - const coreProperty = { - ...propertyStub, - isArray: () => true, - isPrimitive: () => true, - name: "test-property", - label: "Test property", - minOccurs: 123, - maxOccurs: 456, - } as unknown as CorePrimitiveArrayProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveArrayProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(true); - expect(property.isEnumeration()).toBe(false); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(true); - expect(property.isStruct()).toBe(false); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - expect(property.minOccurs).toBe(123); - expect(property.maxOccurs).toBe(456); - }); - - it("creates enumeration array property from core property", async () => { - const coreProperty = { - ...propertyStub, - isArray: () => true, - isEnumeration: () => true, - name: "test-property", - label: "Test property", - minOccurs: 123, - maxOccurs: 456, - } as unknown as CoreEnumerationArrayProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationArrayProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(true); - expect(property.isEnumeration()).toBe(true); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(false); - expect(property.isStruct()).toBe(false); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - expect(property.minOccurs).toBe(123); - expect(property.maxOccurs).toBe(456); - }); - - it("creates struct array property from core property", async () => { - const coreProperty = { - ...propertyStub, - isArray: () => true, - isStruct: () => true, - name: "test-property", - label: "Test property", - minOccurs: 123, - maxOccurs: 456, - } as unknown as CoreStructArrayProperty; - const property = createECProperty(coreProperty, propertyClass) as EC.StructArrayProperty; - expect(property.class).toBe(propertyClass); - expect(property.isArray()).toBe(true); - expect(property.isEnumeration()).toBe(false); - expect(property.isNavigation()).toBe(false); - expect(property.isPrimitive()).toBe(false); - expect(property.isStruct()).toBe(true); - expect(property.name).toBe(coreProperty.name); - expect(property.label).toBe(coreProperty.label); - expect(property.minOccurs).toBe(123); - expect(property.maxOccurs).toBe(456); - }); + it("dispatches to SchemaView provider when given a SchemaView instance", async () => { + const sv: SchemaView = Object.create(SchemaView.prototype); + const getSchemaSpy = vi.spyOn(sv, "getSchema").mockReturnValue(undefined); + const provider = createECSchemaProvider(sv); + await provider.getSchema("test"); + expect(getSchemaSpy).toHaveBeenCalledOnce(); }); }); diff --git a/packages/core-interop/src/test/schema-provider/SchemaContextProvider.test.ts b/packages/core-interop/src/test/schema-provider/SchemaContextProvider.test.ts new file mode 100644 index 000000000..a10b6296e --- /dev/null +++ b/packages/core-interop/src/test/schema-provider/SchemaContextProvider.test.ts @@ -0,0 +1,1149 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { assert } from "@itwin/core-bentley"; +import { + ECClass as CoreClass, + PrimitiveType, + RelationshipMultiplicity, + SchemaItemType, + StrengthDirection, +} from "@itwin/ecschema-metadata"; +import { createECSchemaProvider } from "../../core-interop/Metadata.js"; +import { + createECClass, + createECProperty, + createECSchema, +} from "../../core-interop/schema-provider/SchemaContextProvider.js"; + +import type { + EnumerationArrayProperty as CoreEnumerationArrayProperty, + EnumerationProperty as CoreEnumerationProperty, + Enumerator as CoreEnumerator, + NavigationProperty as CoreNavigationProperty, + PrimitiveArrayProperty as CorePrimitiveArrayProperty, + PrimitiveProperty as CorePrimitiveProperty, + Schema as CoreSchema, + StructArrayProperty as CoreStructArrayProperty, + StructProperty as CoreStructProperty, + SchemaKey, +} from "@itwin/ecschema-metadata"; +import type { EC } from "@itwin/presentation-shared"; + +function stubSchema(name: string, version: EC.SchemaVersion = { read: 0, write: 0, minor: 0 }) { + return { name, schemaKey: { version }, getItems: () => [] as CoreClass[], customAttributes: undefined }; +} + +describe("createECSchemaProvider", () => { + describe("SchemaContext path", () => { + it("returns schema from schema context", async () => { + const schemaContext = { + getSchema: vi + .fn<(key: SchemaKey) => Promise>() + .mockImplementation(async (key: SchemaKey) => { + if (key.compareByName("x")) { + return stubSchema("y", { read: 1, write: 2, minor: 3 }) as unknown as CoreSchema; + } + return undefined; + }), + }; + + const provider = createECSchemaProvider(schemaContext); + const schema = await provider.getSchema("x"); + assert(schema !== undefined); + + expect(schemaContext.getSchema).toHaveBeenCalledOnce(); + const calledKey = schemaContext.getSchema.mock.calls[0][0]; + expect(calledKey.compareByName("x")).toBe(true); + expect(schema.name).toBe("y"); + expect(schema.version).toEqual({ read: 1, write: 2, minor: 3 }); + }); + + it(`returns undefined on "schema not found" error`, async () => { + const schemaContext = { + getSchema: vi.fn<(key: SchemaKey) => Promise>().mockRejectedValue(new Error("schema not found")), + }; + + const provider = createECSchemaProvider(schemaContext); + expect(await provider.getSchema("x")).toBeUndefined(); + }); + + it("re-throws SchemaContext errors", async () => { + const schemaContext = { + getSchema: vi.fn<(key: SchemaKey) => Promise>().mockRejectedValue(new Error("Unknown error")), + }; + + const provider = createECSchemaProvider(schemaContext); + await expect(provider.getSchema("x")).rejects.toThrow(); + expect(schemaContext.getSchema).toHaveBeenCalledOnce(); + }); + + it("returns undefined from schema context", async () => { + const schemaContext = { getSchema: vi.fn().mockResolvedValue(undefined) }; + + const provider = createECSchemaProvider(schemaContext); + const schema = await provider.getSchema("x"); + + expect(schemaContext.getSchema).toHaveBeenCalledOnce(); + expect(schema).toBeUndefined(); + }); + + it("doesn't repeat requests for the same schema", async () => { + const schemaContext = { + getSchema: vi + .fn<(key: SchemaKey) => Promise>() + .mockResolvedValue(stubSchema("x") as unknown as CoreSchema), + }; + + const provider = createECSchemaProvider(schemaContext); + await Promise.all([provider.getSchema("x"), provider.getSchema("x")]); + + expect(schemaContext.getSchema).toHaveBeenCalledOnce(); + }); + + it("handles duplicate schema in cache error", async () => { + const schemaContext = { + getSchema: vi + .fn<(key: SchemaKey) => Promise>() + .mockRejectedValueOnce(new Error("The schema, x.01.02.03, already exists within this cache")) + .mockResolvedValueOnce(stubSchema("x") as unknown as CoreSchema), + }; + + const provider = createECSchemaProvider(schemaContext); + await provider.getSchema("x"); + + expect(schemaContext.getSchema).toHaveBeenCalledTimes(2); + }); + + it("force-loads class data (base classes, koq/enum/nav properties, rel constraints)", async () => { + const baseClassGetter = vi.fn().mockResolvedValue({ fullName: "x.Base" }); + const koqGetter = vi.fn().mockResolvedValue({}); + const enumerationGetter = vi.fn().mockResolvedValue({}); + const navRelClassGetter = vi.fn().mockResolvedValue({}); + const sourceConstraintGetter = vi.fn().mockResolvedValue({}); + const targetConstraintGetter = vi.fn().mockResolvedValue({}); + + const schemaContext = { + getSchema: vi + .fn<(key: SchemaKey) => Promise>() + .mockImplementation(async (key: SchemaKey) => { + if (!key.compareByName("x")) { + return undefined; + } + return { + name: "x", + schemaKey: { version: { read: 0, write: 0, minor: 0 } }, + customAttributes: undefined, + getItemSync: () => undefined, + getItems: () => [ + { + schemaItemType: SchemaItemType.EntityClass, + get baseClass() { + return baseClassGetter(); + }, + getPropertiesSync: () => [ + { + get kindOfQuantity() { + return koqGetter(); + }, + isEnumeration: () => false, + isNavigation: () => false, + }, + { + kindOfQuantity: undefined, + isEnumeration: () => true, + get enumeration() { + return enumerationGetter(); + }, + isNavigation: () => false, + }, + { + kindOfQuantity: undefined, + isEnumeration: () => false, + isNavigation: () => true, + get relationshipClass() { + return navRelClassGetter(); + }, + }, + ], + }, + { + schemaItemType: SchemaItemType.EntityClass, + get baseClass() { + return baseClassGetter(); + }, + getPropertiesSync: () => [], + }, + { + schemaItemType: SchemaItemType.RelationshipClass, + baseClass: undefined, + getPropertiesSync: () => [], + source: { + get abstractConstraint() { + return sourceConstraintGetter(); + }, + }, + target: { + get abstractConstraint() { + return targetConstraintGetter(); + }, + }, + }, + { + schemaItemType: SchemaItemType.RelationshipClass, + baseClass: undefined, + getPropertiesSync: () => [], + source: { abstractConstraint: undefined }, + target: { abstractConstraint: undefined }, + }, + ], + } as unknown as CoreSchema; + }), + }; + + const provider = createECSchemaProvider(schemaContext); + await provider.getSchema("x"); + + expect(baseClassGetter).toHaveBeenCalled(); + expect(koqGetter).toHaveBeenCalled(); + expect(enumerationGetter).toHaveBeenCalled(); + expect(navRelClassGetter).toHaveBeenCalled(); + expect(sourceConstraintGetter).toHaveBeenCalled(); + expect(targetConstraintGetter).toHaveBeenCalled(); + }); + }); +}); + +describe("createECSchema", () => { + describe("getClass", () => { + it("returns class from core schema", () => { + const item = { fullName: "s.c", name: "c", label: "C", schemaItemType: SchemaItemType.EntityClass }; + const coreSchema = { ...stubSchema("s"), getItemSync: vi.fn().mockReturnValue(item) }; + + const schema = createECSchema(coreSchema as unknown as CoreSchema, new Map()); + const result = schema.getClass("c"); + assert(result !== undefined); + + expect(coreSchema.getItemSync).toHaveBeenCalledExactlyOnceWith("c", CoreClass); + expect(result.schema.name).toBe("s"); + expect(result.fullName).toBe("s.c"); + expect(result.name).toBe("c"); + expect(result.label).toBe("C"); + expect(typeof result.is === "function").toBe(true); + }); + + it("returns undefined from core schema", () => { + const coreSchema = { ...stubSchema("s"), getItemSync: vi.fn().mockReturnValue(undefined) }; + + const schema = createECSchema(coreSchema as unknown as CoreSchema, new Map()); + const result = schema.getClass("c"); + + expect(coreSchema.getItemSync).toHaveBeenCalledExactlyOnceWith("c", CoreClass); + expect(result).toBeUndefined(); + }); + }); + + describe("isHidden", () => { + it("returns false when schema has no HiddenSchema custom attribute", () => { + const coreSchema = { ...stubSchema("s"), customAttributes: undefined }; + const schema = createECSchema(coreSchema as unknown as CoreSchema, new Map()); + expect(schema.isHidden).toBe(false); + }); + + it("returns true when schema has HiddenSchema custom attribute", () => { + const coreSchema = { ...stubSchema("s"), customAttributes: new Map([["CoreCustomAttributes.HiddenSchema", {}]]) }; + const schema = createECSchema(coreSchema as unknown as CoreSchema, new Map()); + expect(schema.isHidden).toBe(true); + }); + }); +}); + +describe("createECClass", () => { + const schema: EC.Schema = { + name: "s", + version: { read: 1, write: 0, minor: 0 }, + isHidden: false, + getClass() { + return undefined; + }, + }; + + it("creates class using schema from core class", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + label: "C", + schema: stubSchema("core-schema"), + } as unknown as CoreClass; + const result = createECClass(coreClass); + expect(result.schema.name).toBe("core-schema"); + }); + + it("creates entity class from core class", () => { + const coreClass = { fullName: "s.c", name: "c", label: "C", schemaItemType: SchemaItemType.EntityClass }; + const result = createECClass(coreClass as unknown as CoreClass, schema); + expect(result.isEntityClass()).toBe(true); + expect(result.isRelationshipClass()).toBe(false); + expect(result.isStructClass()).toBe(false); + expect(result.isMixin()).toBe(false); + expect(result.schema.name).toBe("s"); + expect(result.fullName).toBe("s.c"); + expect(result.name).toBe("c"); + expect(result.label).toBe("C"); + expect(typeof result.is === "function").toBe(true); + }); + + it("creates relationship class from core class", () => { + const coreClass = { + fullName: "s.c", + name: "c", + label: "C", + schemaItemType: SchemaItemType.RelationshipClass, + } as unknown as CoreClass; + const result = createECClass(coreClass, schema); + expect(result.isEntityClass()).toBe(false); + expect(result.isRelationshipClass()).toBe(true); + expect(result.isStructClass()).toBe(false); + expect(result.isMixin()).toBe(false); + }); + + it("creates struct class from core class", () => { + const coreClass = { + fullName: "s.c", + name: "c", + label: "C", + schemaItemType: SchemaItemType.StructClass, + } as unknown as CoreClass; + const result = createECClass(coreClass, schema); + expect(result.isEntityClass()).toBe(false); + expect(result.isRelationshipClass()).toBe(false); + expect(result.isStructClass()).toBe(true); + expect(result.isMixin()).toBe(false); + }); + + it("creates mixin from core class", () => { + const coreClass = { + fullName: "s.c", + name: "c", + label: "C", + schemaItemType: SchemaItemType.Mixin, + } as unknown as CoreClass; + const result = createECClass(coreClass, schema); + expect(result.isEntityClass()).toBe(false); + expect(result.isRelationshipClass()).toBe(false); + expect(result.isStructClass()).toBe(false); + expect(result.isMixin()).toBe(true); + }); + + it("throws when creating class from non-class core schema item", () => { + const coreClass = { + schemaItemType: SchemaItemType.Constant, + fullName: "s.c", + name: "c", + label: "C", + } as unknown as CoreClass; + expect(() => createECClass(coreClass, schema)).toThrow(); + }); + + describe("isHidden", () => { + it("returns true when class has HiddenClass custom attribute", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + customAttributes: new Map([["CoreCustomAttributes.HiddenClass", {}]]), + schema: { customAttributes: undefined }, + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.isHidden).toBe(true); + }); + + it("returns false when class has HiddenClass attribute with Show=true", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: true }]]), + schema: { customAttributes: undefined }, + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.isHidden).toBe(false); + }); + + it("returns true when schema has HiddenSchema and class has no override", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + customAttributes: undefined, + schema: { ...stubSchema("s"), customAttributes: new Map([["CoreCustomAttributes.HiddenSchema", {}]]) }, + }; + const ecClass = createECClass(coreClass as unknown as CoreClass); + expect(ecClass.isHidden).toBe(true); + }); + + it("returns undefined when no hidden attributes", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + customAttributes: undefined, + schema: { customAttributes: undefined }, + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.isHidden).toBeUndefined(); + }); + }); + + describe("baseClass", () => { + it("returns base class from getBaseClassSync", () => { + const coreBaseClass = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.b", name: "b" }; + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + getBaseClassSync: vi.fn().mockReturnValue(coreBaseClass), + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.baseClass!.fullName).toBe("s.b"); + }); + + it("returns undefined when getBaseClassSync returns undefined", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + getBaseClassSync: vi.fn().mockReturnValue(undefined), + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.baseClass).toBeUndefined(); + }); + }); + + describe("getDerivedClasses", () => { + it("returns derived classes from derivedMap", () => { + const coreDerived = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.d", name: "d" }; + const coreClass = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.c", name: "c" }; + const derivedMap = new Map([["s.c" as const, [coreDerived as unknown as CoreClass]]]); + const ecClass = createECClass(coreClass as unknown as CoreClass, schema, derivedMap); + const result = ecClass.getDerivedClasses(); + expect(result).toHaveLength(1); + expect(result[0].fullName).toBe("s.d"); + }); + + it("returns empty list when no derivedMap", () => { + const coreClass = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.c", name: "c" }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + expect(ecClass.getDerivedClasses()).toHaveLength(0); + }); + }); + + describe("is", () => { + it("delegates to isSync for EC.Class override", () => { + const coreBase = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.b", name: "b" }; + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + isSync: vi.fn().mockReturnValue(true), + }; + const class1 = createECClass(coreClass as unknown as CoreClass, schema); + const class2 = createECClass(coreBase as unknown as CoreClass, schema); + expect(class1.is(class2)).toBe(true); + expect(coreClass.isSync).toHaveBeenCalledWith("b", "s"); + }); + + it("returns false from isSync when class is not in hierarchy", () => { + const coreOther = { schemaItemType: SchemaItemType.EntityClass, fullName: "s.other", name: "other" }; + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + isSync: vi.fn().mockReturnValue(false), + }; + const class1 = createECClass(coreClass as unknown as CoreClass, schema); + const class2 = createECClass(coreOther as unknown as CoreClass, schema); + expect(class1.is(class2)).toBe(false); + }); + + it("handles class and schema name string overload", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + isSync: vi.fn().mockReturnValue(true), + }; + const class1 = createECClass(coreClass as unknown as CoreClass, schema); + expect(class1.is("a", "b")).toBe(true); + expect(coreClass.isSync).toHaveBeenCalledWith("a", "b"); + }); + }); + + describe("getProperties", () => { + it("returns properties using getPropertiesSync", () => { + const mockProp = { + isArray: () => false, + isStruct: () => false, + isEnumeration: () => false, + isNavigation: () => false, + isPrimitive: () => true, + name: "p", + fullName: "s.c.p", + customAttributes: undefined, + getKindOfQuantitySync: () => undefined, + }; + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + getPropertiesSync: vi.fn().mockReturnValue([mockProp]), + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + const properties = ecClass.getProperties(); + + expect(coreClass.getPropertiesSync).toHaveBeenCalledOnce(); + expect(properties.length).toBe(1); + }); + }); + + describe("getProperty", () => { + it("returns property using getPropertySync", () => { + const mockProp = { + isArray: () => false, + isStruct: () => false, + isEnumeration: () => false, + isNavigation: () => false, + isPrimitive: () => true, + name: "p", + fullName: "s.c.p", + customAttributes: undefined, + getKindOfQuantitySync: () => undefined, + }; + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + getPropertySync: vi.fn().mockReturnValue(mockProp), + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + const prop = ecClass.getProperty("p"); + + expect(coreClass.getPropertySync).toHaveBeenCalledExactlyOnceWith("p", false); + expect(prop).toBeDefined(); + }); + + it("returns undefined from core class", () => { + const coreClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "s.c", + name: "c", + getPropertySync: vi.fn().mockReturnValue(undefined), + }; + const ecClass = createECClass(coreClass as unknown as CoreClass, schema); + const prop = ecClass.getProperty("p"); + + expect(coreClass.getPropertySync).toHaveBeenCalledExactlyOnceWith("p", false); + expect(prop).toBeUndefined(); + }); + }); + + describe("Relationship class", () => { + const coreRelationshipClass = { + schemaItemType: SchemaItemType.RelationshipClass, + fullName: "Schema.TestRelationship", + name: "TestRelationship", + label: "Test relationship", + }; + + describe("direction", () => { + it("returns forward direction from core relationship", () => { + const rel = createECClass( + { ...coreRelationshipClass, strengthDirection: StrengthDirection.Forward } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.direction).toBe("Forward"); + }); + + it("returns backward direction from core relationship", () => { + const rel = createECClass( + { ...coreRelationshipClass, strengthDirection: StrengthDirection.Backward } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.direction).toBe("Backward"); + }); + }); + + describe("source & target", () => { + it("returns source constraint", () => { + const rel = createECClass( + { ...coreRelationshipClass, source: {}, schema: { customAttributes: undefined } } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source).toBeDefined(); + }); + + it("returns target constraint", () => { + const rel = createECClass( + { ...coreRelationshipClass, target: {}, schema: { customAttributes: undefined } } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.target).toBeDefined(); + }); + + describe("ECRelationshipConstraint implementation", () => { + it("returns undefined multiplicity from core constraint", () => { + const rel = createECClass( + { + ...coreRelationshipClass, + source: { multiplicity: undefined }, + schema: { customAttributes: undefined }, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.multiplicity).toBeUndefined(); + }); + + it("returns multiplicity from core constraint", () => { + const rel = createECClass( + { + ...coreRelationshipClass, + // eslint-disable-next-line @itwin/no-internal + source: { multiplicity: new RelationshipMultiplicity(123, 456) }, + schema: { customAttributes: undefined }, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.multiplicity).toEqual({ lowerLimit: 123, upperLimit: 456 }); + }); + + it("returns polymorphic flag from core constraint", () => { + [false, true].forEach((isPolymorphic) => { + const rel = createECClass( + { + ...coreRelationshipClass, + source: { polymorphic: isPolymorphic }, + schema: { customAttributes: undefined }, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.polymorphic).toBe(isPolymorphic); + }); + }); + + it("returns abstract constraint via schema lookup", () => { + const coreAbstractConstraint = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "Schema.TestAbstractConstraint", + name: "TestAbstractConstraint", + label: "Test abstract constraint", + }; + const abstractConstraintRef = {}; // simulates LazyLoadedRelationshipConstraintClass (SchemaItemKey) + const coreSchema = { + lookupItemSync: vi.fn().mockReturnValue(coreAbstractConstraint), + customAttributes: undefined, + }; + const rel = createECClass( + { + ...coreRelationshipClass, + source: { abstractConstraint: abstractConstraintRef }, + schema: coreSchema, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + const constraint = rel.source.abstractConstraint!; + expect(constraint.isEntityClass()).toBe(true); + expect(constraint.fullName).toBe("Schema.TestAbstractConstraint"); + expect(coreSchema.lookupItemSync).toHaveBeenCalledWith(abstractConstraintRef, CoreClass); + }); + + it("returns undefined abstract constraint when not set", () => { + const rel = createECClass( + { + ...coreRelationshipClass, + source: { abstractConstraint: undefined }, + schema: { customAttributes: undefined }, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.abstractConstraint).toBeUndefined(); + }); + + it("returns undefined when abstract constraint class cannot be resolved synchronously", () => { + const abstractConstraintRef = {}; + const coreSchema = { lookupItemSync: vi.fn().mockReturnValue(undefined), customAttributes: undefined }; + const rel = createECClass( + { + ...coreRelationshipClass, + source: { abstractConstraint: abstractConstraintRef }, + schema: coreSchema, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.abstractConstraint).toBeUndefined(); + }); + + it("resolves constraint classes synchronously, filtering out unresolved ones", () => { + const coreConstraintClass = { + schemaItemType: SchemaItemType.EntityClass, + fullName: "Schema.TestConstraintClass", + name: "TestConstraintClass", + }; + const resolvedRef = {}; + const unresolvedRef = {}; + const coreSchema = { + lookupItemSync: vi + .fn() + .mockImplementation((ref) => (ref === resolvedRef ? coreConstraintClass : undefined)), + customAttributes: undefined, + }; + const rel = createECClass( + { + ...coreRelationshipClass, + source: { constraintClasses: [resolvedRef, unresolvedRef] }, + schema: coreSchema, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + const classes = rel.source.constraintClasses; + expect(classes.map((c) => c.fullName)).toEqual(["Schema.TestConstraintClass"]); + }); + + it("returns empty array when core constraint has no constraint classes", () => { + const rel = createECClass( + { + ...coreRelationshipClass, + source: { constraintClasses: undefined }, + schema: { customAttributes: undefined }, + } as unknown as CoreClass, + schema, + ) as EC.RelationshipClass; + expect(rel.source.constraintClasses).toEqual([]); + }); + }); + }); + }); +}); + +describe("createECProperty", () => { + const propertyClass: EC.Class = {} as unknown as EC.Class; + const propertyStub = { + isArray: () => false, + isEnumeration: () => false, + isNavigation: () => false, + isPrimitive: () => false, + isStruct: () => false, + fullName: "", + name: "", + customAttributes: undefined, + getKindOfQuantitySync: () => undefined, + }; + + describe("isHidden", () => { + it("returns false when property has no HiddenProperty custom attribute", () => { + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + customAttributes: undefined, + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass); + expect(property.isHidden).toBe(false); + }); + + it("returns true when property has HiddenProperty custom attribute", () => { + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + customAttributes: new Map([["CoreCustomAttributes.HiddenProperty", {}]]), + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass); + expect(property.isHidden).toBe(true); + }); + + it("returns false when property has HiddenProperty CA with Show=true", () => { + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + customAttributes: new Map([["CoreCustomAttributes.HiddenProperty", { ["Show"]: true }]]), + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass); + expect(property.isHidden).toBe(false); + }); + }); + + describe("Primitive property", () => { + it("creates property from core property", () => { + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + label: "Test property", + extendedTypeName: "extended", + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; + expect(property.class).toBe(propertyClass); + expect(property.isArray()).toBe(false); + expect(property.isEnumeration()).toBe(false); + expect(property.isNavigation()).toBe(false); + expect(property.isPrimitive()).toBe(true); + expect(property.isStruct()).toBe(false); + expect(property.name).toBe(coreProperty.name); + expect(property.label).toBe(coreProperty.label); + expect(property.extendedTypeName).toBe(coreProperty.extendedTypeName); + }); + + it("maps primitive types", () => { + const types: [PrimitiveType, EC.PrimitiveType][] = [ + [PrimitiveType.Binary, "Binary"], + [PrimitiveType.Boolean, "Boolean"], + [PrimitiveType.DateTime, "DateTime"], + [PrimitiveType.Double, "Double"], + [PrimitiveType.IGeometry, "IGeometry"], + [PrimitiveType.Integer, "Integer"], + [PrimitiveType.Long, "Long"], + [PrimitiveType.Point2d, "Point2d"], + [PrimitiveType.Point3d, "Point3d"], + [PrimitiveType.String, "String"], + ]; + types.forEach(([coreType, expectation]) => { + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + primitiveType: coreType, + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; + expect(property.primitiveType).toBe(expectation); + }); + + const uninitializedTypes = [undefined, PrimitiveType.Uninitialized]; + uninitializedTypes.forEach((coreType) => { + const uninitializedProperty = createECProperty( + { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + primitiveType: coreType, + } as unknown as CorePrimitiveProperty, + propertyClass, + ) as EC.PrimitiveProperty; + expect(() => uninitializedProperty.primitiveType).toThrow(); + }); + }); + + it("maps kind of quantity from getKindOfQuantitySync", () => { + const coreKoq = { fullName: "SchemaName.TestKoq", name: "TestKoq", schema: stubSchema("SchemaName") }; + const coreProperty = { + ...propertyStub, + isPrimitive: () => true, + name: "test-property", + getKindOfQuantitySync: vi.fn().mockReturnValue(coreKoq), + } as unknown as CorePrimitiveProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveProperty; + const koq = property.kindOfQuantity!; + expect(koq.fullName).toBe("SchemaName.TestKoq"); + + const propertyNoKoq = createECProperty( + { ...propertyStub, isPrimitive: () => true, name: "test-property" } as unknown as CorePrimitiveProperty, + propertyClass, + ) as EC.PrimitiveProperty; + expect(propertyNoKoq.kindOfQuantity).toBeUndefined(); + }); + }); + + describe("Navigation property", () => { + it("creates property from core property", () => { + const coreRelClass = { + schemaItemType: SchemaItemType.RelationshipClass, + fullName: "s.rel", + name: "rel", + schema: stubSchema("s"), + }; + const coreProperty = { + ...propertyStub, + isNavigation: () => true, + name: "test-property", + label: "Test property", + getRelationshipClassSync: vi.fn().mockReturnValue(coreRelClass), + } as unknown as CoreNavigationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; + expect(property.class).toBe(propertyClass); + expect(property.isArray()).toBe(false); + expect(property.isEnumeration()).toBe(false); + expect(property.isNavigation()).toBe(true); + expect(property.isPrimitive()).toBe(false); + expect(property.isStruct()).toBe(false); + expect(property.name).toBe(coreProperty.name); + expect(property.label).toBe(coreProperty.label); + }); + + it("maps direction", () => { + const coreRelClass = { + schemaItemType: SchemaItemType.RelationshipClass, + fullName: "s.rel", + name: "rel", + schema: stubSchema("s"), + }; + const map: [StrengthDirection, string][] = [ + [StrengthDirection.Backward, "Backward"], + [StrengthDirection.Forward, "Forward"], + ]; + map.forEach(([coreDirection, expectation]) => { + const coreProperty = { + ...propertyStub, + isNavigation: () => true, + name: "test-property", + direction: coreDirection, + getRelationshipClassSync: vi.fn().mockReturnValue(coreRelClass), + } as unknown as CoreNavigationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; + expect(property.direction).toBe(expectation); + }); + }); + + it("returns relationship class from getRelationshipClassSync", () => { + const coreRelClass = { + schemaItemType: SchemaItemType.RelationshipClass, + fullName: "SchemaName.RelationshipClass", + name: "RelationshipClass", + schema: stubSchema("SchemaName"), + }; + const coreProperty = { + ...propertyStub, + isNavigation: () => true, + name: "test-property", + direction: StrengthDirection.Forward, + getRelationshipClassSync: vi.fn().mockReturnValue(coreRelClass), + } as unknown as CoreNavigationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.NavigationProperty; + expect(property.relationshipClass.fullName).toBe("SchemaName.RelationshipClass"); + }); + }); + + describe("Enumeration property", () => { + it("creates property from core property", () => { + const coreProperty = { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + label: "Test property", + extendedTypeName: "extended", + enumeration: undefined, + } as unknown as CoreEnumerationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; + expect(property.class).toBe(propertyClass); + expect(property.isArray()).toBe(false); + expect(property.isEnumeration()).toBe(true); + expect(property.isNavigation()).toBe(false); + expect(property.isPrimitive()).toBe(false); + expect(property.isStruct()).toBe(false); + expect(property.name).toBe(coreProperty.name); + expect(property.label).toBe(coreProperty.label); + expect(property.extendedTypeName).toBe(coreProperty.extendedTypeName); + }); + + it("returns undefined enumeration when not set", () => { + const coreProperty = { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + enumeration: undefined, + } as unknown as CoreEnumerationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; + expect(property.enumeration).toBeUndefined(); + }); + + it("returns undefined enumeration when lookupItemSync returns undefined", () => { + const enumRef = {}; + const coreSchema = { lookupItemSync: vi.fn().mockReturnValue(undefined) }; + const coreProperty = { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + enumeration: enumRef, + class: { schema: coreSchema }, + } as unknown as CoreEnumerationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; + expect(property.enumeration).toBeUndefined(); + }); + + it("returns enumeration via schema lookup", () => { + const coreEnumeration = { + schema: stubSchema("SchemaName"), + isStrict: false, + type: undefined, + enumerators: [] as CoreEnumerator[], + fullName: "SchemaName.TestEnum", + name: "TestEnum", + }; + const enumRef = {}; // simulates LazyLoadedEnumeration (SchemaItemKey & Promise) + const coreSchema = { lookupItemSync: vi.fn().mockReturnValue(coreEnumeration) }; + const coreProperty = { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + enumeration: enumRef, + class: { schema: coreSchema }, + } as unknown as CoreEnumerationProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationProperty; + expect(property.enumeration).toBeDefined(); + expect(coreSchema.lookupItemSync).toHaveBeenCalledWith(enumRef); + }); + + describe("ECEnumeration implementation", () => { + const coreEnumeration = { + schema: stubSchema("SchemaName"), + isStrict: false, + type: undefined as PrimitiveType | undefined, + enumerators: new Array>(), + fullName: "SchemaName.TestEnum", + name: "TestEnum", + }; + let property: EC.EnumerationProperty; + + beforeEach(() => { + const enumRef = {}; + const coreSchema = { lookupItemSync: vi.fn().mockReturnValue(coreEnumeration) }; + const coreProperty = { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + enumeration: enumRef, + class: { schema: coreSchema }, + } as unknown as CoreEnumerationProperty; + property = createECProperty(coreProperty, propertyClass); + }); + + it("returns `isStrict` flag", () => { + coreEnumeration.isStrict = true; + expect(property.enumeration!.isStrict).toBe(true); + }); + + it("maps enumeration type", () => { + const typesMap: [PrimitiveType | undefined, string][] = [ + [PrimitiveType.String, "String"], + [PrimitiveType.Integer, "Number"], + [undefined, "Number"], + ]; + for (const [coreType, expectation] of typesMap) { + coreEnumeration.type = coreType; + const enumRef2 = {}; + const coreSchema2 = { lookupItemSync: vi.fn().mockReturnValue(coreEnumeration) }; + const prop = createECProperty( + { + ...propertyStub, + isEnumeration: () => true, + name: "test-property", + enumeration: enumRef2, + class: { schema: coreSchema2 }, + } as unknown as CoreEnumerationProperty, + propertyClass, + ) as EC.EnumerationProperty; + expect(prop.enumeration!.type).toBe(expectation); + } + }); + + it("returns enumerators", () => { + coreEnumeration.enumerators = [ + { name: "1", value: 1, label: "One", description: "Test one" }, + { name: "2", value: 2 }, + ]; + expect(property.enumeration!.enumerators).toEqual(coreEnumeration.enumerators); + }); + }); + }); + + describe("Struct property", () => { + it("creates property from core property", () => { + const coreProperty = { + ...propertyStub, + isStruct: () => true, + name: "test-property", + label: "Test property", + } as unknown as CoreStructProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.StructProperty; + expect(property.class).toBe(propertyClass); + expect(property.isArray()).toBe(false); + expect(property.isEnumeration()).toBe(false); + expect(property.isNavigation()).toBe(false); + expect(property.isPrimitive()).toBe(false); + expect(property.isStruct()).toBe(true); + expect(property.name).toBe(coreProperty.name); + expect(property.label).toBe(coreProperty.label); + }); + + it("returns struct class", () => { + const coreProperty = { + ...propertyStub, + isStruct: () => true, + name: "test-property", + structClass: { fullName: "SchemaName.StructClass", schema: stubSchema("SchemaName") }, + } as unknown as CoreStructProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.StructProperty; + expect(property.structClass.fullName).toBe("SchemaName.StructClass"); + }); + }); + + describe("Array property", () => { + it("creates primitive array property from core property", () => { + const coreProperty = { + ...propertyStub, + isArray: () => true, + isPrimitive: () => true, + name: "test-property", + label: "Test property", + minOccurs: 123, + maxOccurs: 456, + } as unknown as CorePrimitiveArrayProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.PrimitiveArrayProperty; + expect(property.isArray()).toBe(true); + expect(property.isPrimitive()).toBe(true); + expect(property.isEnumeration()).toBe(false); + expect(property.minOccurs).toBe(123); + expect(property.maxOccurs).toBe(456); + }); + + it("creates enumeration array property from core property", () => { + const coreProperty = { + ...propertyStub, + isArray: () => true, + isEnumeration: () => true, + name: "test-property", + label: "Test property", + minOccurs: 123, + maxOccurs: 456, + enumeration: undefined, + } as unknown as CoreEnumerationArrayProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.EnumerationArrayProperty; + expect(property.isArray()).toBe(true); + expect(property.isEnumeration()).toBe(true); + expect(property.isPrimitive()).toBe(false); + expect(property.minOccurs).toBe(123); + expect(property.maxOccurs).toBe(456); + }); + + it("creates struct array property from core property", () => { + const coreProperty = { + ...propertyStub, + isArray: () => true, + isStruct: () => true, + name: "test-property", + label: "Test property", + minOccurs: 123, + maxOccurs: 456, + } as unknown as CoreStructArrayProperty; + const property = createECProperty(coreProperty, propertyClass) as EC.StructArrayProperty; + expect(property.isArray()).toBe(true); + expect(property.isStruct()).toBe(true); + expect(property.isPrimitive()).toBe(false); + expect(property.minOccurs).toBe(123); + expect(property.maxOccurs).toBe(456); + }); + }); +}); diff --git a/packages/core-interop/src/test/schema-provider/SchemaViewProvider.test.ts b/packages/core-interop/src/test/schema-provider/SchemaViewProvider.test.ts new file mode 100644 index 000000000..bba903414 --- /dev/null +++ b/packages/core-interop/src/test/schema-provider/SchemaViewProvider.test.ts @@ -0,0 +1,1007 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { describe, expect, it } from "vitest"; +import { assert } from "@itwin/core-bentley"; +import { SchemaViewPrimitiveType, StrengthDirection } from "@itwin/ecschema-metadata"; +import { + createECPropertyFromSchemaView, + createECSchemaFromSchemaView, + createECSchemaProviderFromSchemaView, +} from "../../core-interop/schema-provider/SchemaViewProvider.js"; + +import type { SchemaView } from "@itwin/ecschema-metadata"; +import type { EC, Props } from "@itwin/presentation-shared"; + +describe("createECSchemaProviderFromSchemaView", () => { + it("returns undefined when schema not found in view", async () => { + const sv = createMockSchemaView(new Map([["TestSchema", { name: "TestSchema", classes: new Map() }]])); + const provider = createECSchemaProviderFromSchemaView(sv); + expect(await provider.getSchema("NonExistentSchema")).toBeUndefined(); + }); + + it("returns schema from schema view", async () => { + const sv = createMockSchemaView( + new Map([ + ["TestSchema", { name: "TestSchema", readVersion: 1, writeVersion: 2, minorVersion: 3, classes: new Map() }], + ]), + ); + const provider = createECSchemaProviderFromSchemaView(sv); + const schema = await provider.getSchema("TestSchema"); + assert(schema !== undefined); + expect(schema.name).toBe("TestSchema"); + expect(schema.version).toEqual({ read: 1, write: 2, minor: 3 }); + expect(schema.isHidden).toBe(false); + }); + + it("returns class from schema view", async () => { + const sv = createMockSchemaView( + new Map([ + [ + "TestSchema", + { name: "TestSchema", classes: new Map([["TestClass", { name: "TestClass", schemaName: "TestSchema" }]]) }, + ], + ]), + ); + const provider = createECSchemaProviderFromSchemaView(sv); + const schema = await provider.getSchema("TestSchema"); + assert(schema !== undefined); + const cls = schema.getClass("TestClass"); + assert(cls !== undefined); + expect(cls.name).toBe("TestClass"); + expect(cls.fullName).toBe("TestSchema.TestClass"); + expect(cls.isEntityClass()).toBe(true); + expect(cls.isHidden).toBeUndefined(); + }); + + it("returns property from schema view class", async () => { + const mockProp = createMockProperty({ + name: "TestProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.String, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + const sv = createMockSchemaView( + new Map([ + [ + "TestSchema", + { + name: "TestSchema", + classes: new Map([ + [ + "TestClass", + { name: "TestClass", schemaName: "TestSchema", properties: new Map([["TestProp", mockProp]]) }, + ], + ]), + }, + ], + ]), + ); + const provider = createECSchemaProviderFromSchemaView(sv); + const schema = await provider.getSchema("TestSchema"); + assert(schema !== undefined); + const cls = schema.getClass("TestClass"); + assert(cls !== undefined); + const prop = cls.getProperty("TestProp"); + assert(prop !== undefined); + expect(prop.name).toBe("TestProp"); + expect(prop.isPrimitive()).toBe(true); + }); +}); + +describe("createECSchemaFromSchemaView", () => { + it("returns true for isHidden when schema is hidden", () => { + const mockSchema = createMockSchema({ name: "HiddenSchema", isHidden: true, classes: new Map() }); + const sv = createMockSchemaView(new Map([["HiddenSchema", { name: "HiddenSchema", isHidden: true }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + expect(ecSchema.isHidden).toBe(true); + }); + + it("returns undefined from getClass for non-existent name", () => { + const mockSchema = createMockSchema({ name: "TestSchema", classes: new Map() }); + const sv = createMockSchemaView(new Map([["TestSchema", { name: "TestSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + expect(ecSchema.getClass("DoesNotExist")).toBeUndefined(); + }); +}); + +describe("createECClassFromSchemaView", () => { + it("creates struct class", () => { + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([["StructClassX", { name: "StructClassX", schemaName: "ClassSchema", type: "struct" }]]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("StructClassX"); + assert(cls !== undefined); + expect(cls.isStructClass()).toBe(true); + expect(cls.isEntityClass()).toBe(false); + expect(cls.isMixin()).toBe(false); + expect(cls.isRelationshipClass()).toBe(false); + }); + + it("creates mixin class", () => { + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([["MixinClassX", { name: "MixinClassX", schemaName: "ClassSchema", type: "mixin" }]]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("MixinClassX"); + assert(cls !== undefined); + expect(cls.isMixin()).toBe(true); + expect(cls.isEntityClass()).toBe(false); + }); + + it("returns isHidden=true for hidden class", () => { + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([["HiddenClassX", { name: "HiddenClassX", schemaName: "ClassSchema", isHidden: true }]]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("HiddenClassX"); + assert(cls !== undefined); + expect(cls.isHidden).toBe(true); + }); + + it("returns base class within the same schema", () => { + const entityAProps: MockClassProps = { name: "EntityA", schemaName: "ClassSchema" }; + const entityBProps: MockClassProps = { + name: "EntityB", + schemaName: "ClassSchema", + baseClass: () => createMockClass(entityAProps), + }; + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([ + ["EntityA", entityAProps], + ["EntityB", entityBProps], + ]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("EntityB"); + assert(cls !== undefined); + const base = cls.baseClass; + assert(base !== undefined); + expect(base.name).toBe("EntityA"); + expect(base.schema.name).toBe("ClassSchema"); + }); + + it("creates schema for base class in a different schema", () => { + const classBProps: MockClassProps = { name: "ClassB", schemaName: "SchemaB" }; + const classAProps: MockClassProps = { + name: "ClassA", + schemaName: "SchemaA", + baseClass: () => createMockClass(classBProps), + }; + + const mockSchemaA = createMockSchema({ name: "SchemaA", classes: new Map([["ClassA", classAProps]]) }); + const mockSchemaB = createMockSchema({ name: "SchemaB", classes: new Map([["ClassB", classBProps]]) }); + + const sv: Props = { + schemaToken: "", + isOutdated: false, + schemaCount: 2, + classCount: 2, + getSchema: (name) => (name === "SchemaA" ? mockSchemaA : name === "SchemaB" ? mockSchemaB : undefined), + getSchemaByAlias: () => undefined, + *getSchemas() { + yield mockSchemaA; + yield mockSchemaB; + }, + findClass: () => undefined, + findEnumeration: () => undefined, + findKindOfQuantity: () => undefined, + findPropertyCategory: () => undefined, + }; + + const ecSchema = createECSchemaFromSchemaView(mockSchemaA, sv); + const classA = ecSchema.getClass("ClassA"); + assert(classA !== undefined); + const base = classA.baseClass; + assert(base !== undefined); + expect(base.name).toBe("ClassB"); + expect(base.schema.name).toBe("SchemaB"); + }); + + it("returns derived classes", () => { + const entityBProps: MockClassProps = { name: "EntityB", schemaName: "ClassSchema" }; + const entityAProps: MockClassProps = { + name: "EntityA", + schemaName: "ClassSchema", + derivedClasses: () => [createMockClass(entityBProps)], + }; + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([ + ["EntityA", entityAProps], + ["EntityB", entityBProps], + ]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("EntityA"); + assert(cls !== undefined); + const derived = cls.getDerivedClasses(); + expect(derived.length).toBe(1); + expect(derived[0].name).toBe("EntityB"); + }); + + it("returns undefined baseClass when class has no base", () => { + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([["EntityA", { name: "EntityA", schemaName: "ClassSchema" }]]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("EntityA"); + assert(cls !== undefined); + expect(cls.baseClass).toBeUndefined(); + }); + + it("evaluates is() with class object", () => { + const entityAProps: MockClassProps = { + name: "EntityA", + schemaName: "ClassSchema", + is: (name) => name === "ClassSchema.EntityA", + }; + const entityBProps: MockClassProps = { + name: "EntityB", + schemaName: "ClassSchema", + is: (name) => name === "ClassSchema.EntityA" || name === "ClassSchema.EntityB", + }; + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([ + ["EntityA", entityAProps], + ["EntityB", entityBProps], + ]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const entityA = ecSchema.getClass("EntityA")!; + const entityB = ecSchema.getClass("EntityB")!; + expect(entityB.is(entityA)).toBe(true); + expect(entityA.is(entityB)).toBe(false); + }); + + it("evaluates is() with className + schemaName", () => { + const entityBProps: MockClassProps = { + name: "EntityB", + schemaName: "ClassSchema", + is: (name) => name === "ClassSchema.EntityA" || name === "ClassSchema.EntityB", + }; + const mockSchema = createMockSchema({ name: "ClassSchema", classes: new Map([["EntityB", entityBProps]]) }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const entityB = ecSchema.getClass("EntityB")!; + expect(entityB.is("EntityA", "ClassSchema")).toBe(true); + expect(entityB.is("EntityB", "ClassSchema")).toBe(true); + expect(entityB.is("StructClassX", "ClassSchema")).toBe(false); + }); + + it("returns undefined from getProperty for non-existent name", () => { + const mockSchema = createMockSchema({ + name: "ClassSchema", + classes: new Map([["EntityA", { name: "EntityA", schemaName: "ClassSchema", properties: new Map() }]]), + }); + const sv = createMockSchemaView(new Map([["ClassSchema", { name: "ClassSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("EntityA")!; + expect(cls.getProperty("NoSuchProp")).toBeUndefined(); + }); + + it("returns all properties via getProperties", () => { + const mockProp = createMockProperty({ + name: "TestProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.String, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + const mockSchema = createMockSchema({ + name: "TestSchema", + classes: new Map([ + ["TestClass", { name: "TestClass", schemaName: "TestSchema", properties: new Map([["TestProp", mockProp]]) }], + ]), + }); + const sv = createMockSchemaView(new Map([["TestSchema", { name: "TestSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("TestClass")!; + const props = cls.getProperties(); + expect(props.length).toBe(1); + expect(props[0].name).toBe("TestProp"); + }); + + describe("Relationship class", () => { + it("returns forward direction", () => { + const relFwdProps: MockClassProps = { + name: "RelFwd", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Forward, + source: undefined, + target: undefined, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelFwd", relFwdProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("RelFwd")! as EC.RelationshipClass; + expect(cls.isRelationshipClass()).toBe(true); + expect(cls.direction).toBe("Forward"); + }); + + it("returns backward direction", () => { + const relBwdProps: MockClassProps = { + name: "RelBwd", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Backward, + source: undefined, + target: undefined, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelBwd", relBwdProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const cls = ecSchema.getClass("RelBwd")! as EC.RelationshipClass; + expect(cls.direction).toBe("Backward"); + }); + + it("creates source/target constraints with abstract constraint", () => { + const entityAProps: MockClassProps = { name: "EntityA", schemaName: "RelSchema" }; + const entityBProps: MockClassProps = { name: "EntityB", schemaName: "RelSchema" }; + const sourceConstraint = { + polymorphic: true, + multiplicityLower: 1, + multiplicityUpper: 1, + get abstractConstraint() { + return createMockClass(entityAProps); + }, + } as unknown as SchemaView.RelConstraint; + const targetConstraint = { + polymorphic: false, + multiplicityLower: 0, + multiplicityUpper: -1, + get abstractConstraint() { + return createMockClass(entityBProps); + }, + } as unknown as SchemaView.RelConstraint; + + const relFwdProps: MockClassProps = { + name: "RelFwd", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Forward, + source: sourceConstraint, + target: targetConstraint, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelFwd", relFwdProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const rel = ecSchema.getClass("RelFwd")! as EC.RelationshipClass; + + const src = rel.source; + expect(src.polymorphic).toBe(true); + expect(src.multiplicity.lowerLimit).toBe(1); + expect(src.multiplicity.upperLimit).toBe(1); + expect(src.abstractConstraint?.name).toBe("EntityA"); + + const tgt = rel.target; + expect(tgt.polymorphic).toBe(false); + expect(tgt.multiplicity.lowerLimit).toBe(0); + expect(tgt.multiplicity.upperLimit).toBe(-1); + expect(tgt.abstractConstraint?.name).toBe("EntityB"); + }); + + it("creates empty constraints when none are set on relationship", () => { + const relBwdProps: MockClassProps = { + name: "RelBwd", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Backward, + source: undefined, + target: undefined, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelBwd", relBwdProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const rel = ecSchema.getClass("RelBwd")! as EC.RelationshipClass; + expect(rel.source.abstractConstraint).toBeUndefined(); + expect(rel.target.abstractConstraint).toBeUndefined(); + }); + + it("returns undefined from abstractConstraint getter when no abstract constraint set on constraint", () => { + const sourceConstraint = { + polymorphic: false, + multiplicityLower: 0, + multiplicityUpper: -1, + get abstractConstraint() { + return undefined; + }, + } as unknown as SchemaView.RelConstraint; + + const relProps: MockClassProps = { + name: "RelNoAbstract", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Forward, + source: sourceConstraint, + target: undefined, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelNoAbstract", relProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const rel = ecSchema.getClass("RelNoAbstract")! as EC.RelationshipClass; + expect(rel.source.abstractConstraint).toBeUndefined(); + }); + + it("returns constraint classes from constraintClasses getter", () => { + const entityAProps: MockClassProps = { name: "EntityA", schemaName: "RelSchema" }; + const entityBProps: MockClassProps = { name: "EntityB", schemaName: "RelSchema" }; + const sourceConstraint = { + polymorphic: true, + multiplicityLower: 1, + multiplicityUpper: 1, + constraintClasses: [createMockClass(entityAProps), createMockClass(entityBProps)], + get abstractConstraint() { + return undefined; + }, + } as unknown as SchemaView.RelConstraint; + const relProps: MockClassProps = { + name: "RelWithConstraints", + schemaName: "RelSchema", + type: "relationship", + strengthDirection: StrengthDirection.Forward, + source: sourceConstraint, + target: undefined, + }; + const mockSchema = createMockSchema({ name: "RelSchema", classes: new Map([["RelWithConstraints", relProps]]) }); + const sv = createMockSchemaView(new Map([["RelSchema", { name: "RelSchema" }]])); + const ecSchema = createECSchemaFromSchemaView(mockSchema, sv); + const rel = ecSchema.getClass("RelWithConstraints")! as EC.RelationshipClass; + const classes = rel.source.constraintClasses; + expect(classes.map((c) => c.name)).toEqual(["EntityA", "EntityB"]); + }); + }); +}); + +describe("createECPropertyFromSchemaView", () => { + const mockSchemaObj = { name: "PropSchema" } as unknown as SchemaView.Schema; + const dummySv = createMockSchemaView(new Map([["PropSchema", { name: "PropSchema" }]])); + const dummyEcSchema: EC.Schema = { + name: "PropSchema", + version: { read: 1, write: 0, minor: 0 }, + isHidden: false, + getClass: () => undefined, + }; + const dummyEcClass = { + schema: dummyEcSchema, + fullName: "PropSchema.MainClass", + name: "MainClass", + label: undefined, + isHidden: undefined, + isEntityClass: () => true, + isRelationshipClass: () => false, + isStructClass: () => false, + isMixin: () => false, + get baseClass() { + return undefined; + }, + is: () => false, + getProperty: () => undefined, + getProperties: () => [], + getDerivedClasses: () => [], + } as unknown as EC.Class; + + describe("Navigation property", () => { + it("creates forward navigation property", () => { + const relClass = createMockClass({ name: "RelClass", schemaName: "PropSchema", type: "relationship" }); + const mockProp = createMockProperty({ + name: "NavFwdProp", + isNavigation: () => true, + direction: StrengthDirection.Forward, + relationshipClass: relClass, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isNavigation()).toBe(true); + expect(prop.isPrimitive()).toBe(false); + expect(prop.isArray()).toBe(false); + expect(prop.isStruct()).toBe(false); + const nav = prop as EC.NavigationProperty; + expect(nav.direction).toBe("Forward"); + expect(nav.relationshipClass.name).toBe("RelClass"); + }); + + it("creates backward navigation property", () => { + const relClass = createMockClass({ name: "RelClass", schemaName: "PropSchema", type: "relationship" }); + const mockProp = createMockProperty({ + name: "NavBwdProp", + isNavigation: () => true, + direction: StrengthDirection.Backward, + relationshipClass: relClass, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + const nav = prop as EC.NavigationProperty; + expect(nav.direction).toBe("Backward"); + }); + }); + + describe("Enumeration property", () => { + it("creates scalar enumeration property", () => { + const mockProp = createMockProperty({ + name: "EnumScalarProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isEnumeration()).toBe(true); + expect(prop.isArray()).toBe(false); + expect(prop.isNavigation()).toBe(false); + expect(prop.kindOfQuantity).toBeUndefined(); + }); + + it("creates enumeration array property with minOccurs/maxOccurs", () => { + const mockProp = createMockProperty({ + name: "EnumArrayProp", + isEnumeration: () => true, + isArray: () => true, + arrayMinOccurs: 1, + arrayMaxOccurs: 5, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isEnumeration()).toBe(true); + expect(prop.isArray()).toBe(true); + const arr = prop as EC.EnumerationArrayProperty; + expect(arr.minOccurs).toBe(1); + expect(arr.maxOccurs).toBe(5); + }); + + it("returns enumeration data", () => { + const mockEnum = { + fullName: "PropSchema:TestEnum", + name: "TestEnum", + label: undefined, + schema: mockSchemaObj, + primitiveType: SchemaViewPrimitiveType.Integer, + isStrict: true, + getEnumerators: () => + [ + { name: "Val1", label: undefined, value: 1 }, + { name: "Val2", label: undefined, value: 2 }, + ][Symbol.iterator](), + } as unknown as SchemaView.Enumeration; + + const mockProp = createMockProperty({ + name: "EnumScalarProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: mockEnum, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.EnumerationProperty; + const en = prop.enumeration; + assert(en !== undefined); + expect(en.name).toBe("TestEnum"); + expect(en.type).toBe("Number"); + expect(en.isStrict).toBe(true); + expect(en.enumerators.length).toBe(2); + expect(en.enumerators[0].name).toBe("Val1"); + expect(en.enumerators[1].name).toBe("Val2"); + expect(en.schema.name).toBe("PropSchema"); + }); + + it("returns extendedTypeName for enumeration property", () => { + const mockProp = createMockProperty({ + name: "EnumKoQProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: "ExtTypeName", + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.EnumerationProperty; + expect(prop.extendedTypeName).toBe("ExtTypeName"); + }); + + it("returns undefined extendedTypeName when not set", () => { + const mockProp = createMockProperty({ + name: "EnumScalarProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.EnumerationProperty; + expect(prop.extendedTypeName).toBeUndefined(); + }); + + it("defaults minOccurs to 0 when arrayMinOccurs is undefined", () => { + const mockProp = createMockProperty({ + name: "FakeEnumArrayProp", + isEnumeration: () => true, + isArray: () => true, + arrayMinOccurs: undefined, + arrayMaxOccurs: 5, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isArray()).toBe(true); + expect((prop as EC.EnumerationArrayProperty).minOccurs).toBe(0); + }); + + it("returns undefined from enumeration getter when svProp.enumeration is null", () => { + const mockProp = createMockProperty({ + name: "FakeEnumNoRefProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: undefined, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.EnumerationProperty; + expect(prop.enumeration).toBeUndefined(); + }); + + it("maps string enumeration type to 'String'", () => { + const mockStringEnum = { + fullName: "PropSchema:StringEnum", + name: "StringEnum", + label: undefined, + schema: mockSchemaObj, + primitiveType: SchemaViewPrimitiveType.String, + isStrict: false, + getEnumerators: () => [][Symbol.iterator](), + } as unknown as SchemaView.Enumeration; + + const mockProp = createMockProperty({ + name: "StringEnumProp", + isEnumeration: () => true, + isArray: () => false, + enumeration: mockStringEnum, + kindOfQuantity: undefined, + extendedTypeName: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.EnumerationProperty; + expect(prop.enumeration?.type).toBe("String"); + }); + }); + + describe("Primitive property", () => { + it("maps all primitive types", () => { + const cases: [string, SchemaViewPrimitiveType, EC.PrimitiveType][] = [ + ["PrimBoolProp", SchemaViewPrimitiveType.Boolean, "Boolean"], + ["PrimBinaryProp", SchemaViewPrimitiveType.Binary, "Binary"], + ["PrimDateTimeProp", SchemaViewPrimitiveType.DateTime, "DateTime"], + ["PrimDoubleProp", SchemaViewPrimitiveType.Double, "Double"], + ["PrimIntProp", SchemaViewPrimitiveType.Integer, "Integer"], + ["PrimLongProp", SchemaViewPrimitiveType.Long, "Long"], + ["PrimPoint2dProp", SchemaViewPrimitiveType.Point2d, "Point2d"], + ["PrimPoint3dProp", SchemaViewPrimitiveType.Point3d, "Point3d"], + ["PrimIGeoProp", SchemaViewPrimitiveType.IGeometry, "IGeometry"], + ["PrimStringProp", SchemaViewPrimitiveType.String, "String"], + ]; + for (const [name, svType, expected] of cases) { + const mockProp = createMockProperty({ + name, + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: svType, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isPrimitive()).toBe(true); + expect(prop.isEnumeration()).toBe(false); + expect((prop as EC.PrimitiveProperty).primitiveType).toBe(expected); + } + }); + + it("creates primitive array property", () => { + const mockProp = createMockProperty({ + name: "PrimArrayProp", + isPrimitive: () => true, + isEnumeration: () => false, + isArray: () => true, + primitiveType: SchemaViewPrimitiveType.Integer, + extendedTypeName: undefined, + kindOfQuantity: undefined, + arrayMinOccurs: undefined, + arrayMaxOccurs: 10, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isPrimitive()).toBe(true); + expect(prop.isArray()).toBe(true); + const arr = prop as EC.PrimitiveArrayProperty; + expect(arr.minOccurs).toBe(0); + expect(arr.maxOccurs).toBe(10); + }); + + it("returns KoQ for primitive property with KoQ", () => { + const mockKoq = { + fullName: "PropSchema:TestKoQ", + name: "TestKoQ", + label: undefined, + schema: mockSchemaObj, + } as unknown as SchemaView.KindOfQuantity; + + const mockProp = createMockProperty({ + name: "PrimKoQProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.Double, + extendedTypeName: "ExtTypeName", + kindOfQuantity: mockKoq, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.PrimitiveProperty; + expect(prop.kindOfQuantity?.name).toBe("TestKoQ"); + }); + + it("returns extendedTypeName for primitive property", () => { + const mockProp = createMockProperty({ + name: "PrimKoQProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.Double, + extendedTypeName: "ExtTypeName", + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.PrimitiveProperty; + expect(prop.extendedTypeName).toBe("ExtTypeName"); + }); + + it("returns undefined KoQ when not set", () => { + const mockProp = createMockProperty({ + name: "PrimBoolProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.Boolean, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv) as EC.PrimitiveProperty; + expect(prop.kindOfQuantity).toBeUndefined(); + }); + + it("returns property category when set", () => { + const mockCategory = { + fullName: "PropSchema:TestCategory", + name: "TestCategory", + label: "Test Category", + schema: mockSchemaObj, + } as unknown as SchemaView.PropertyCategory; + const mockProp = createMockProperty({ + name: "PropWithCategory", + category: mockCategory, + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.String, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + const category = prop.category; + assert(category !== undefined); + expect(category.name).toBe("TestCategory"); + expect(category.label).toBe("Test Category"); + expect(category.fullName).toBe("PropSchema.TestCategory"); + expect(category.schema.name).toBe("PropSchema"); + }); + + it("throws for uninitialized SchemaView primitive type", () => { + const mockProp = createMockProperty({ + name: "UninitializedProp", + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.Uninitialized, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + assert(prop.isPrimitive()); + expect(() => prop.primitiveType).toThrow("Uninitialized CoreSchemaView primitive type"); + }); + }); + + describe("Struct property", () => { + it("creates scalar struct property", () => { + const structClass = createMockClass({ name: "StructClassX", schemaName: "PropSchema", type: "struct" }); + const mockProp = createMockProperty({ + name: "StructScalarProp", + isStruct: () => true, + isArray: () => false, + structClass, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isStruct()).toBe(true); + expect(prop.isArray()).toBe(false); + expect((prop as EC.StructProperty).structClass.name).toBe("StructClassX"); + }); + + it("creates struct array property", () => { + const structClass = createMockClass({ name: "StructClassX", schemaName: "PropSchema", type: "struct" }); + const mockProp = createMockProperty({ + name: "StructArrayProp", + isStruct: () => true, + isArray: () => true, + arrayMinOccurs: undefined, + arrayMaxOccurs: 3, + structClass, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isStruct()).toBe(true); + expect(prop.isArray()).toBe(true); + const arr = prop as EC.StructArrayProperty; + expect(arr.minOccurs).toBe(0); + expect(arr.maxOccurs).toBe(3); + expect(arr.structClass.name).toBe("StructClassX"); + }); + }); + + describe("isHidden", () => { + it("reflects isHidden=true on property", () => { + const mockProp = createMockProperty({ + name: "HiddenProp", + isHidden: true, + isPrimitive: () => true, + isEnumeration: () => false, + primitiveType: SchemaViewPrimitiveType.String, + extendedTypeName: undefined, + kindOfQuantity: undefined, + } as unknown as SchemaView.Property & { name: string }); + + const prop = createECPropertyFromSchemaView(mockProp, dummyEcClass, dummySv); + expect(prop.isHidden).toBe(true); + }); + }); + + describe("unexpected kind", () => { + it("throws with declaringClass name included in message", () => { + const mockClass = { fullName: "TestSchema.TestClass" } as unknown as SchemaView.Class; + const mockProp = createMockProperty({ name: "BadProp", declaringClass: mockClass }); + expect(() => createECPropertyFromSchemaView(mockProp, {} as EC.Class, dummySv)).toThrow("TestSchema.TestClass"); + }); + + it("throws with fallback when declaringClass is undefined", () => { + const mockProp = createMockProperty({ name: "BadProp", declaringClass: undefined }); + expect(() => createECPropertyFromSchemaView(mockProp, {} as EC.Class, dummySv)).toThrow(""); + }); + }); +}); + +interface MockSchemaProps { + name: string; + readVersion?: number; + writeVersion?: number; + minorVersion?: number; + isHidden?: boolean; + classes?: Map; +} + +interface MockClassProps { + name: string; + schemaName: string; + label?: string; + isHidden?: boolean | undefined; + type?: "entity" | "relationship" | "struct" | "mixin"; + baseClass?: () => SchemaView.Class | undefined; + derivedClasses?: () => readonly SchemaView.Class[]; + is?: (classOrName: string) => boolean; + properties?: Map; + strengthDirection?: StrengthDirection; + source?: SchemaView.RelConstraint | undefined; + target?: SchemaView.RelConstraint | undefined; +} + +function createMockSchema(props: MockSchemaProps): SchemaView.Schema { + return { + name: props.name, + readVersion: props.readVersion ?? 1, + writeVersion: props.writeVersion ?? 0, + minorVersion: props.minorVersion ?? 0, + isHidden: props.isHidden ?? false, + getClass(name: string) { + const classProps = props.classes?.get(name); + return classProps ? createMockClass(classProps) : undefined; + }, + } as unknown as SchemaView.Schema; +} + +function createMockClass(props: MockClassProps): SchemaView.Class { + const schema = { name: props.schemaName } as unknown as SchemaView.Schema; + return { + fullName: `${props.schemaName}:${props.name}`, + name: props.name, + label: props.label, + isHidden: props.isHidden, + schema, + isEntity: () => (props.type ?? "entity") === "entity", + isRelationship: () => props.type === "relationship", + isStruct: () => props.type === "struct", + isMixin: () => props.type === "mixin", + get baseClass() { + return props.baseClass ? props.baseClass() : undefined; + }, + get derivedClasses() { + return props.derivedClasses ? props.derivedClasses() : []; + }, + is: (classOrName: string) => (props.is ? props.is(classOrName) : false), + getProperty: (name: string) => props.properties?.get(name) ?? undefined, + getProperties: () => (props.properties ? [...props.properties.values()] : []), + strengthDirection: props.strengthDirection ?? StrengthDirection.Forward, + source: props.source, + target: props.target, + } as unknown as SchemaView.Class; +} + +function createMockSchemaView( + schemas: Map, +): Props { + const builtSchemas = new Map(); + for (const [name, props] of schemas) { + builtSchemas.set(name, createMockSchema(props)); + } + return { + schemaToken: "", + isOutdated: false, + schemaCount: builtSchemas.size, + classCount: 0, + getSchema: (name) => builtSchemas.get(name), + getSchemaByAlias: () => undefined, + getSchemas: () => builtSchemas.values(), + findClass: () => undefined, + findEnumeration: () => undefined, + findKindOfQuantity: () => undefined, + findPropertyCategory: () => undefined, + }; +} + +function createMockProperty(overrides: Partial & { name: string }): SchemaView.Property { + return { + label: undefined, + isHidden: false, + isArray: () => false, + isNavigation: () => false, + isEnumeration: () => false, + isPrimitive: () => false, + isStruct: () => false, + declaringClass: undefined, + ...overrides, + } as unknown as SchemaView.Property; +} diff --git a/packages/hierarchies/src/hierarchies/imodel/NodeSelectQueryFactory.ts b/packages/hierarchies/src/hierarchies/imodel/NodeSelectQueryFactory.ts index 797652083..170d59858 100644 --- a/packages/hierarchies/src/hierarchies/imodel/NodeSelectQueryFactory.ts +++ b/packages/hierarchies/src/hierarchies/imodel/NodeSelectQueryFactory.ts @@ -330,7 +330,7 @@ class NodeSelectQueryFactory { : { from: contentClass.fullName, joins: [], where: [] }; const fromClass = await getClass(this._imodelAccess, normalizeFullClassName(from)); - const hiddenClasses = await getHiddenClassesTree(fromClass); + const hiddenClasses = getHiddenClassesTree(fromClass); const hiddenClassesWhereClause = createWhereClauseForHiddenClasses(hiddenClasses, contentClass.alias); hiddenClassesWhereClause.hideClause && where.push(hiddenClassesWhereClause.hideClause); assert(!hiddenClassesWhereClause.showClause, "`showClause` is expected to always be empty here"); @@ -600,17 +600,17 @@ async function createPropertyGroupSelectors( const selectors = new Array<{ key: string; selector: string }>(); selectors.push({ key: "propertyName", selector: `${createECSqlValueSelector(propertyGroup.propertyName)}` }); - const property = await propertyClass.getProperty(propertyGroup.propertyName); + const property = propertyClass.getProperty(propertyGroup.propertyName); if (!property) { throw new Error(`Property "${propertyGroup.propertyName}" not found in ECClass "${propertyClass.fullName}".`); } if (property.isNavigation()) { - const relationshipClass = await property.relationshipClass; + const relationshipClass = property.relationshipClass; const abstractConstraint = property.direction === "Forward" - ? await relationshipClass.target.abstractConstraint - : await relationshipClass.source.abstractConstraint; + ? relationshipClass.target.abstractConstraint + : relationshipClass.source.abstractConstraint; // TODO: MISSING_COVERAGE /* v8 ignore else -- @preserve */ if (!abstractConstraint) { @@ -695,7 +695,7 @@ async function createWhereClause( if (!propertyClass) { throw new Error(`Class with alias "${sourceAlias}" not found.`); } - const property = await propertyClass.getProperty(rule.propertyName); + const property = propertyClass.getProperty(rule.propertyName); if (!property) { throw new Error(`Property "${rule.propertyName}" not found in ECClass "${propertyClass.fullName}".`); } @@ -890,11 +890,11 @@ interface HiddenClassNode { children: HiddenClassNode[]; } -async function getHiddenClassesTree( +function getHiddenClassesTree( selectClass: EC.Class, selectClassAttribute: "show" | "hide" = "show", -): Promise { - const derivedClasses = await getDirectDerivedClasses(selectClass); +): HiddenClassNode[] { + const derivedClasses = getDirectDerivedClasses(selectClass); const derivedClassSchemas = derivedClasses.reduce( (acc, ecClass) => { @@ -908,44 +908,32 @@ async function getHiddenClassesTree( { set: new Set(), schemas: new Array() }, ).schemas; const hiddenSchemas = new Map(); - await Promise.all( - derivedClassSchemas.map(async (ecSchema) => { - hiddenSchemas.set(ecSchema.name, await getHiddenSchemaAttribute(ecSchema)); - }), - ); - - const tree = ( - await Promise.all( - derivedClasses.map(async (ecClass): Promise => { - const hiddenClassAttr = await getHiddenClassAttribute(ecClass); - const attr = hiddenClassAttr ?? hiddenSchemas.get(ecClass.schema.name); - if (!attr || attr === selectClassAttribute) { - return getHiddenClassesTree(ecClass, selectClassAttribute); - } - return [{ fullName: ecClass.fullName, state: attr, children: await getHiddenClassesTree(ecClass, attr) }]; - }), - ) - ).flat(); - return tree; -} - -async function getDirectDerivedClasses(ecClass: EC.Class): Promise { - const allDerived = await ecClass.getDerivedClasses(); - return (await Promise.all(allDerived.map(async (c) => ({ derived: c, base: await c.baseClass })))) - .filter(({ base }) => base && compareFullClassNames(base.fullName, ecClass.fullName) === 0) - .map(({ derived }) => derived); -} - -async function getHiddenClassAttribute(ecClass: EC.Class): Promise<"hide" | "show" | undefined> { - const customAttributes = await ecClass.getCustomAttributes(); - const hiddenClassAttribute = customAttributes.get("CoreCustomAttributes.HiddenClass"); - return hiddenClassAttribute ? (hiddenClassAttribute.Show ? "show" : "hide") : undefined; + for (const ecSchema of derivedClassSchemas) { + hiddenSchemas.set(ecSchema.name, ecSchema.isHidden ? "hide" : undefined); + } + + return derivedClasses.flatMap((ecClass): HiddenClassNode[] => { + const hiddenClassAttr = (() => { + switch (ecClass.isHidden) { + case true: + return "hide"; + case false: + return "show"; + default: + return undefined; + } + })(); + const attr = hiddenClassAttr ?? hiddenSchemas.get(ecClass.schema.name); + if (!attr || attr === selectClassAttribute) { + return getHiddenClassesTree(ecClass, selectClassAttribute); + } + return [{ fullName: ecClass.fullName, state: attr, children: getHiddenClassesTree(ecClass, attr) }]; + }); } -async function getHiddenSchemaAttribute(ecSchema: EC.Schema): Promise<"hide" | "show" | undefined> { - const customAttributes = await ecSchema.getCustomAttributes(); - const hiddenSchemaAttribute = customAttributes.get("CoreCustomAttributes.HiddenSchema"); - return hiddenSchemaAttribute ? (hiddenSchemaAttribute.ShowClasses ? "show" : "hide") : undefined; +function getDirectDerivedClasses(ecClass: EC.Class): EC.Class[] { + const allDerived = ecClass.getDerivedClasses(); + return allDerived.filter((c) => c.baseClass && compareFullClassNames(c.baseClass.fullName, ecClass.fullName) === 0); } function createWhereClauseForHiddenClasses( diff --git a/packages/hierarchies/src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts b/packages/hierarchies/src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts index a3208c96e..ab822f5e8 100644 --- a/packages/hierarchies/src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts +++ b/packages/hierarchies/src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts @@ -35,7 +35,7 @@ export async function getBaseClassGroupingECClasses( await releaseMainThread(); baseClasses.push(await getClass(schemaProvider, fullName)); } - const sortedClasses = await sortByBaseClass( + const sortedClasses = sortByBaseClass( baseClasses.filter((baseClass) => baseClass.isRelationshipClass() || baseClass.isEntityClass()), ); @@ -118,7 +118,7 @@ async function getGroupingBaseClassNames(nodes: ProcessedInstanceHierarchyNode[] return baseClasses; } -async function sortByBaseClass(classes: EC.Class[]): Promise { +function sortByBaseClass(classes: EC.Class[]): EC.Class[] { if (classes.length === 0) { return classes; } @@ -126,7 +126,7 @@ async function sortByBaseClass(classes: EC.Class[]): Promise { for (let inputIndex = 1; inputIndex < classes.length; ++inputIndex) { let wasAdded = false; for (let outputIndex = output.length - 1; outputIndex >= 0; --outputIndex) { - if (await classes[inputIndex].is(output[outputIndex])) { + if (classes[inputIndex].is(output[outputIndex])) { output.splice(outputIndex + 1, 0, classes[inputIndex]); wasAdded = true; break; diff --git a/packages/hierarchies/src/hierarchies/imodel/operators/grouping/PropertiesGrouping.ts b/packages/hierarchies/src/hierarchies/imodel/operators/grouping/PropertiesGrouping.ts index 2881b8193..30cd998e6 100644 --- a/packages/hierarchies/src/hierarchies/imodel/operators/grouping/PropertiesGrouping.ts +++ b/packages/hierarchies/src/hierarchies/imodel/operators/grouping/PropertiesGrouping.ts @@ -118,7 +118,7 @@ export async function createPropertyGroups( } const currentProperty = byProperties.propertyGroups[handlerGroupingParams.previousPropertiesGroupingInfo.length]; const propertyClass = handlerGroupingParams.ecClass; - const property = await propertyClass.getProperty(currentProperty.propertyName); + const property = propertyClass.getProperty(currentProperty.propertyName); if ( !property?.isNavigation() && @@ -154,7 +154,7 @@ export async function createPropertyGroups( continue; } - const koqName = (await property.kindOfQuantity)?.fullName; + const koqName = property.kindOfQuantity?.fullName; if (currentProperty.ranges) { if (typeof currentProperty.propertyValue === "number") { const propValue = currentProperty.propertyValue; diff --git a/packages/hierarchies/src/test/Utils.ts b/packages/hierarchies/src/test/Utils.ts index 356fb9cae..859ad3dcf 100644 --- a/packages/hierarchies/src/test/Utils.ts +++ b/packages/hierarchies/src/test/Utils.ts @@ -155,7 +155,7 @@ export interface StubClassFuncProps { classLabel?: string; baseClass?: EC.Class & Pick; properties?: EC.Property[]; - customAttributes?: ReadonlyMap; + isHidden?: boolean; } export interface StubRelationshipClassFuncProps extends StubClassFuncProps { source?: EC.RelationshipConstraint; @@ -165,32 +165,27 @@ export interface StubRelationshipClassFuncProps extends StubClassFuncProps { export interface StubbedSchema { name: string; version: EC.SchemaVersion; + isHidden: boolean; getClass: EC.Schema["getClass"]; - getCustomAttributes: EC.Schema["getCustomAttributes"]; } export type TStubClassFunc = (props: StubClassFuncProps) => EC.Class & ECClassExtraMembers; export type TStubEntityClassFunc = (props: StubClassFuncProps) => EC.EntityClass & ECClassExtraMembers; export type TStubRelationshipClassFunc = ( props: StubRelationshipClassFuncProps, ) => EC.RelationshipClass & ECClassExtraMembers; -export type TStubCustomAttributesFunc = (props: { - schemaName: string; - attributes: Map; -}) => void; export function createECSchemaProviderStub() { const schemaStubs = new Map(); const classes = new Dictionary(compareFullClassNames); // className -> class const classHierarchy = new Dictionary(compareFullClassNames); // className -> baseClassName - const customAttributes = new Map>(); // schemaName -> (className -> customAttribute) const getSchemaImpl = (schemaName: string) => { let schemaStub = schemaStubs.get(schemaName); if (!schemaStub) { schemaStub = { name: schemaName, version: { read: 1, write: 0, minor: 0 }, - getClass: async (className) => classes.get(`${schemaName}.${className}`), - getCustomAttributes: async () => customAttributes.get(schemaName) ?? new Map(), + isHidden: false, + getClass: (className) => classes.get(`${schemaName}.${className}`), }; schemaStubs.set(schemaName, schemaStub); } @@ -226,13 +221,13 @@ export function createECSchemaProviderStub() { return `[${props.schemaName}].[${props.className}]`; }, get baseClass() { - return Promise.resolve(props.baseClass); + return props.baseClass; }, addDerivedClass: (derived: EC.Class) => { classHierarchy.set(derived.fullName, `${props.schemaName}.${props.className}`); }, - getDerivedClasses: async () => getDerivedClasses(`${props.schemaName}.${props.className}`), - is: async (targetClassOrClassName: EC.Class | string, schemaName?: string) => { + getDerivedClasses: () => getDerivedClasses(`${props.schemaName}.${props.className}`), + is: (targetClassOrClassName: EC.Class | string, schemaName?: string) => { const myName: EC.FullClassName = `${props.schemaName}.${props.className}`; const targetName: EC.FullClassName = typeof targetClassOrClassName === "string" @@ -243,12 +238,12 @@ export function createECSchemaProviderStub() { getBaseClasses(myName).some((baseClass) => compareFullClassNames(baseClass.fullName, targetName) === 0) ); }, - getCustomAttributes: async () => props.customAttributes ?? new Map(), - async getProperty(this, propertyName: string): Promise { + isHidden: props.isHidden, + getProperty(this, propertyName: string): EC.Property | undefined { const prop = props.properties?.find((p) => p.name.toLocaleLowerCase() === propertyName.toLocaleLowerCase()); return prop ? { ...prop, class: this as unknown as EC.Class } : undefined; }, - async getProperties(this): Promise> { + getProperties(this): Array { return (props.properties ?? []).map((p) => ({ ...p, class: this as unknown as EC.Class })); }, isEntityClass: () => false, @@ -267,8 +262,8 @@ export function createECSchemaProviderStub() { const res = { ...createBaseClassProps(props), direction: props.direction ?? "Forward", - source: props.source ?? { polymorphic: true, abstractConstraint: async () => undefined }, - target: props.target ?? { polymorphic: true, abstractConstraint: async () => undefined }, + source: props.source ?? { polymorphic: true, abstractConstraint: undefined }, + target: props.target ?? { polymorphic: true, abstractConstraint: undefined }, isRelationshipClass: () => true, } as unknown as ReturnType; classes.set(res.fullName, res); @@ -281,20 +276,10 @@ export function createECSchemaProviderStub() { props.baseClass && props.baseClass.addDerivedClass(res); return res; }; - const stubCustomAttribute: TStubCustomAttributesFunc = (props) => { - const schemaCustomAttributes = - customAttributes.get(props.schemaName) ?? new Map(); - customAttributes.set(props.schemaName, schemaCustomAttributes); - for (const [className, attribute] of props.attributes) { - schemaCustomAttributes.set(className, { ...attribute, className }); - } - }; - return { stubEntityClass, stubRelationshipClass, stubOtherClass, - stubCustomAttribute, getSchema: async (name: string) => getSchemaImpl(name), }; } diff --git a/packages/hierarchies/src/test/imodel/NodeSelectQueryFactory.test.ts b/packages/hierarchies/src/test/imodel/NodeSelectQueryFactory.test.ts index 7fd0e31a7..b05f184ed 100644 --- a/packages/hierarchies/src/test/imodel/NodeSelectQueryFactory.test.ts +++ b/packages/hierarchies/src/test/imodel/NodeSelectQueryFactory.test.ts @@ -74,8 +74,8 @@ describe("createNodesQueryClauseFactory", () => { name: "PropertyName", isNavigation: () => true, direction: "Forward", - relationshipClass: Promise.resolve({ target: { abstractConstraint: Promise.resolve(undefined) } }), - } as EC.NavigationProperty, + relationshipClass: { target: { abstractConstraint: undefined } }, + } as unknown as EC.NavigationProperty, ], }); await expect( @@ -167,9 +167,7 @@ describe("createNodesQueryClauseFactory", () => { name: "PropertyName", isNavigation: () => true, direction: "Backward", - relationshipClass: Promise.resolve({ - source: { abstractConstraint: Promise.resolve({ fullName: "testSchema.SourceClass" }) }, - }), + relationshipClass: { source: { abstractConstraint: { fullName: "testSchema.SourceClass" } } }, } as unknown as EC.NavigationProperty, ], }); @@ -1063,12 +1061,14 @@ describe("createNodesQueryClauseFactory", () => { className: "rel", source: { polymorphic: false, - abstractConstraint: Promise.resolve(contentClass), + abstractConstraint: contentClass, + constraintClasses: [contentClass], multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { polymorphic: false, - abstractConstraint: Promise.resolve(propertyClass), + abstractConstraint: propertyClass, + constraintClasses: [propertyClass], multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, }); @@ -1119,12 +1119,14 @@ describe("createNodesQueryClauseFactory", () => { className: "rel", source: { polymorphic: false, - abstractConstraint: Promise.resolve(contentClass), + abstractConstraint: contentClass, + constraintClasses: [contentClass], multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { polymorphic: false, - abstractConstraint: Promise.resolve(propertyClass), + abstractConstraint: propertyClass, + constraintClasses: [propertyClass], multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, }); @@ -1272,7 +1274,7 @@ describe("createNodesQueryClauseFactory", () => { schemaName: "s", className: "y", baseClass: selectClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", {}]]), + isHidden: true, }); const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, @@ -1290,13 +1292,13 @@ describe("createNodesQueryClauseFactory", () => { schemaName: "s", className: "y", baseClass: selectClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: false }]]), + isHidden: true, }); const showClass = imodelAccess.stubEntityClass({ schemaName: "s", className: "z", baseClass: hideClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: true }]]), + isHidden: false, }); const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, @@ -1314,19 +1316,19 @@ describe("createNodesQueryClauseFactory", () => { schemaName: "s", className: "y", baseClass: selectClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: false }]]), + isHidden: true, }); const showClass = imodelAccess.stubEntityClass({ schemaName: "s", className: "z", baseClass: hideClass1, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: true }]]), + isHidden: false, }); const hideClass2 = imodelAccess.stubEntityClass({ schemaName: "s", className: "w", baseClass: showClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: false }]]), + isHidden: true, }); const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, @@ -1341,12 +1343,7 @@ describe("createNodesQueryClauseFactory", () => { it("excludes classes from hidden schemas", async () => { const selectClass = imodelAccess.stubEntityClass({ schemaName: "s1", className: "x" }); const hideClass = imodelAccess.stubEntityClass({ schemaName: "s2", className: "y", baseClass: selectClass }); - imodelAccess.stubCustomAttribute({ - schemaName: "s2", - attributes: new Map([ - ["CoreCustomAttributes.HiddenSchema", { className: "CoreCustomAttributes.HiddenSchema" }], - ]), - }); + (await imodelAccess.getSchema("s2")).isHidden = true; const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, }); @@ -1357,27 +1354,18 @@ describe("createNodesQueryClauseFactory", () => { }); }); - it("overrides class from hidden schema with subclass from visible schema", async () => { - const selectClass = imodelAccess.stubEntityClass({ schemaName: "s1", className: "x" }); - const hideClass = imodelAccess.stubEntityClass({ schemaName: "s2", className: "y", baseClass: selectClass }); - const showClass = imodelAccess.stubEntityClass({ schemaName: "s3", className: "z", baseClass: hideClass }); - imodelAccess.stubCustomAttribute({ - schemaName: "s2", - attributes: new Map([ - [ - "CoreCustomAttributes.HiddenSchema", - { className: "CoreCustomAttributes.HiddenSchema", ["ShowClasses"]: false }, - ], - ]), - }); - imodelAccess.stubCustomAttribute({ - schemaName: "s3", - attributes: new Map([ - [ - "CoreCustomAttributes.HiddenSchema", - { className: "CoreCustomAttributes.HiddenSchema", ["ShowClasses"]: true }, - ], - ]), + it("passes through non-hidden derived class to find hidden descendants", async () => { + const selectClass = imodelAccess.stubEntityClass({ schemaName: "s", className: "x" }); + const neutralClass = imodelAccess.stubEntityClass({ + schemaName: "s", + className: "n", + baseClass: selectClass, + }); + const hideClass = imodelAccess.stubEntityClass({ + schemaName: "s", + className: "y", + baseClass: neutralClass, + isHidden: true, }); const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, @@ -1385,34 +1373,26 @@ describe("createNodesQueryClauseFactory", () => { expect({ ...clauses, where: trimWhitespace(clauses.where) }).toEqual({ from: selectClass.fullName, joins: "", - where: `([content-class].[ECClassId] IS NOT (${hideClass.ecsqlSelector}) OR [content-class].[ECClassId] IS (${showClass.ecsqlSelector}))`, + where: `[content-class].[ECClassId] IS NOT (${hideClass.ecsqlSelector})`, }); }); - it("hidden class attribute takes precedence over hidden schema", async () => { - const selectClass = imodelAccess.stubEntityClass({ schemaName: "s1", className: "x" }); - imodelAccess.stubEntityClass({ - schemaName: "s2", + it("excludes nested hidden classes via outermost hidden ancestor", async () => { + const selectClass = imodelAccess.stubEntityClass({ schemaName: "s", className: "x" }); + const hideClass1 = imodelAccess.stubEntityClass({ + schemaName: "s", className: "y", baseClass: selectClass, - customAttributes: new Map([["CoreCustomAttributes.HiddenClass", { ["Show"]: true }]]), - }); - imodelAccess.stubCustomAttribute({ - schemaName: "s2", - attributes: new Map([ - [ - "CoreCustomAttributes.HiddenSchema", - { className: "CoreCustomAttributes.HiddenSchema", ["ShowClasses"]: false }, - ], - ]), + isHidden: true, }); + imodelAccess.stubEntityClass({ schemaName: "s", className: "z", baseClass: hideClass1, isHidden: true }); const clauses = await factory.createFilterClauses({ contentClass: { fullName: selectClass.fullName, alias: "content-class" }, }); expect({ ...clauses, where: trimWhitespace(clauses.where) }).toEqual({ from: selectClass.fullName, joins: "", - where: "", + where: `[content-class].[ECClassId] IS NOT (${hideClass1.ecsqlSelector})`, }); }); }); @@ -1421,17 +1401,20 @@ describe("createNodesQueryClauseFactory", () => { describe("join", () => { it("creates joins for single-step related instance path", async () => { const sourceClass = imodelAccess.stubEntityClass({ schemaName: "x", className: "y" }); + const targetClass = imodelAccess.stubEntityClass({ schemaName: "x", className: "t" }); imodelAccess.stubRelationshipClass({ schemaName: "x", className: "r", direction: "Forward", source: { - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { - abstractConstraint: Promise.resolve(imodelAccess.stubEntityClass({ schemaName: "x", className: "t" })), + abstractConstraint: targetClass, + constraintClasses: [targetClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, @@ -1474,12 +1457,14 @@ describe("createNodesQueryClauseFactory", () => { className: "r1", direction: "Forward", source: { - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { - abstractConstraint: Promise.resolve(intermediateClass), + abstractConstraint: intermediateClass, + constraintClasses: [intermediateClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, @@ -1489,12 +1474,14 @@ describe("createNodesQueryClauseFactory", () => { className: "r2", direction: "Forward", source: { - abstractConstraint: Promise.resolve(intermediateClass), + abstractConstraint: intermediateClass, + constraintClasses: [intermediateClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { - abstractConstraint: Promise.resolve(targetClass), + abstractConstraint: targetClass, + constraintClasses: [targetClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, @@ -1545,12 +1532,14 @@ describe("createNodesQueryClauseFactory", () => { className: "r1", direction: "Forward", source: { - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { - abstractConstraint: Promise.resolve(targetClass1), + abstractConstraint: targetClass1, + constraintClasses: [targetClass1], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, @@ -1560,12 +1549,14 @@ describe("createNodesQueryClauseFactory", () => { className: "r2", direction: "Forward", source: { - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, target: { - abstractConstraint: Promise.resolve(targetClass2), + abstractConstraint: targetClass2, + constraintClasses: [targetClass2], polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, }, diff --git a/packages/shared/api/presentation-shared.api.md b/packages/shared/api/presentation-shared.api.md index cd9b85346..2551b9439 100644 --- a/packages/shared/api/presentation-shared.api.md +++ b/packages/shared/api/presentation-shared.api.md @@ -156,40 +156,28 @@ export namespace EC { } export interface Class extends SchemaItem { // (undocumented) - baseClass: Promise; + baseClass?: Class; // (undocumented) - getCustomAttributes(): Promise; + getDerivedClasses(): Class[]; // (undocumented) - getDerivedClasses(): Promise; + getProperties(): Array; // (undocumented) - getProperties(): Promise>; + getProperty(name: string): Property | undefined; // (undocumented) - getProperty(name: string): Promise; + is(className: string, schemaName: string): boolean; // (undocumented) - is(className: string, schemaName: string): Promise; - // (undocumented) - is(other: Class): Promise; + is(other: Class): boolean; // (undocumented) isEntityClass(): this is EntityClass; // (undocumented) + isHidden?: boolean; + // (undocumented) isMixin(): this is Mixin; // (undocumented) isRelationshipClass(): this is RelationshipClass; // (undocumented) isStructClass(): this is StructClass; } - export interface CustomAttribute { - // (undocumented) - [propName: string]: any; - // (undocumented) - className: FullClassName; - } - export interface CustomAttributeSet { - // (undocumented) - [Symbol.iterator]: () => IterableIterator<[FullClassName, CustomAttribute]>; - // (undocumented) - get(className: FullClassName): CustomAttribute | undefined; - } export type EntityClass = Class; export interface Enumeration extends SchemaItem { // (undocumented) @@ -202,7 +190,7 @@ export namespace EC { export type EnumerationArrayProperty = EnumerationProperty & ArrayPropertyAttributes; export interface EnumerationProperty extends Property { // (undocumented) - enumeration: Promise; + enumeration?: Enumeration; // (undocumented) extendedTypeName?: string; } @@ -228,7 +216,7 @@ export namespace EC { // (undocumented) direction: "Forward" | "Backward"; // (undocumented) - relationshipClass: Promise; + relationshipClass: RelationshipClass; } export type PrimitiveArrayProperty = PrimitiveProperty & ArrayPropertyAttributes; export interface PrimitiveProperty extends Property { @@ -240,26 +228,29 @@ export namespace EC { export type PrimitiveType = "Binary" | "Boolean" | "DateTime" | "Double" | "Integer" | "Long" | "Point2d" | "Point3d" | "String" | "IGeometry"; export interface Property { // (undocumented) - class: Class; + category?: PropertyCategory; // (undocumented) - getCustomAttributes(): Promise; + class: Class; // (undocumented) isArray(): this is ArrayProperty; // (undocumented) isEnumeration(): this is EnumerationProperty; // (undocumented) + isHidden: boolean; + // (undocumented) isNavigation(): this is NavigationProperty; // (undocumented) isPrimitive(): this is PrimitiveProperty; // (undocumented) isStruct(): this is StructProperty; // (undocumented) - kindOfQuantity: Promise; + kindOfQuantity?: KindOfQuantity; // (undocumented) label?: string; // (undocumented) name: string; } + export type PropertyCategory = SchemaItem; export interface RelationshipClass extends Class { // (undocumented) direction: "Forward" | "Backward"; @@ -270,7 +261,9 @@ export namespace EC { } export interface RelationshipConstraint { // (undocumented) - abstractConstraint: Promise; + abstractConstraint?: EntityClass | Mixin | RelationshipClass; + // (undocumented) + constraintClasses: Class[]; // (undocumented) multiplicity: RelationshipConstraintMultiplicity; // (undocumented) @@ -284,9 +277,9 @@ export namespace EC { } export interface Schema { // (undocumented) - getClass(name: string): Promise; + getClass(name: string): Class | undefined; // (undocumented) - getCustomAttributes(): Promise; + isHidden: boolean; // (undocumented) name: string; version: SchemaVersion; diff --git a/packages/shared/src/shared/Metadata.ts b/packages/shared/src/shared/Metadata.ts index b6866c66a..524606ad0 100644 --- a/packages/shared/src/shared/Metadata.ts +++ b/packages/shared/src/shared/Metadata.ts @@ -52,11 +52,10 @@ export function createCachingECClassHierarchyInspector(props: { const cacheKey = createCacheKey(derivedClassFullName, candidateBaseClassFullName); let result = map.get(cacheKey); if (result === undefined) { - result = Promise.all([ - getClass(props.schemaProvider, derivedClassFullName), - getClass(props.schemaProvider, candidateBaseClassFullName), - ]).then(async ([derivedClass, baseClass]) => { - const resolvedResult = await derivedClass.is(baseClass); + result = getClass(props.schemaProvider, derivedClassFullName).then((derivedClass) => { + const { schemaName: candidateBaseClassSchemaName, className: candidateBaseClassName } = + parseFullClassName(candidateBaseClassFullName); + const resolvedResult = derivedClass.is(candidateBaseClassName, candidateBaseClassSchemaName); map.set(cacheKey, resolvedResult); return resolvedResult; }); @@ -100,8 +99,8 @@ export namespace EC { name: string; /** The schema version. Format: `"read.write.minor"`, comparison order: write > read > minor. */ version: SchemaVersion; - getClass(name: string): Promise; - getCustomAttributes(): Promise; + isHidden: boolean; + getClass(name: string): Class | undefined; } /** @@ -122,17 +121,17 @@ export namespace EC { * @public */ export interface Class extends SchemaItem { - baseClass: Promise; - is(className: string, schemaName: string): Promise; - is(other: Class): Promise; - getProperty(name: string): Promise; - getProperties(): Promise>; + baseClass?: Class; + isHidden?: boolean; + is(className: string, schemaName: string): boolean; + is(other: Class): boolean; + getProperty(name: string): Property | undefined; + getProperties(): Array; isEntityClass(): this is EntityClass; isRelationshipClass(): this is RelationshipClass; isStructClass(): this is StructClass; isMixin(): this is Mixin; - getDerivedClasses(): Promise; - getCustomAttributes(): Promise; + getDerivedClasses(): Class[]; } /** @@ -163,6 +162,13 @@ export namespace EC { */ export type KindOfQuantity = SchemaItem; + /** + * Represents a property category. + * @see https://www.itwinjs.org/reference/ecschema-metadata/metadata/propertycategory/ + * @public + */ + export type PropertyCategory = SchemaItem; + /** * Represents a relationship constraint multiplicity. * @see https://www.itwinjs.org/reference/ecschema-metadata/metadata/relationshipmultiplicity/ @@ -181,7 +187,8 @@ export namespace EC { export interface RelationshipConstraint { multiplicity: RelationshipConstraintMultiplicity; polymorphic: boolean; - abstractConstraint: Promise; + constraintClasses: Class[]; + abstractConstraint?: EntityClass | Mixin | RelationshipClass; } /** @@ -227,15 +234,15 @@ export namespace EC { name: string; class: Class; label?: string; - kindOfQuantity: Promise; + isHidden: boolean; + kindOfQuantity?: KindOfQuantity; + category?: PropertyCategory; isArray(): this is ArrayProperty; isStruct(): this is StructProperty; isPrimitive(): this is PrimitiveProperty; isEnumeration(): this is EnumerationProperty; isNavigation(): this is NavigationProperty; - - getCustomAttributes(): Promise; } /** @@ -288,7 +295,7 @@ export namespace EC { * @public */ export interface EnumerationProperty extends Property { - enumeration: Promise; + enumeration?: Enumeration; extendedTypeName?: string; } @@ -298,7 +305,7 @@ export namespace EC { * @public */ export interface NavigationProperty extends Property { - relationshipClass: Promise; + relationshipClass: RelationshipClass; direction: "Forward" | "Backward"; } @@ -328,26 +335,6 @@ export namespace EC { primitiveType: PrimitiveType; extendedTypeName?: string; } - - /** - * Defines a set of custom attributes that may be applied to a class or property. - * @see https://www.itwinjs.org/reference/ecschema-metadata/metadata/customattribute/ - * @public - */ - export interface CustomAttributeSet { - [Symbol.iterator]: () => IterableIterator<[FullClassName, CustomAttribute]>; - get(className: FullClassName): CustomAttribute | undefined; - } - - /** - * Defines a custom attribute that may be applied to a class or property. - * @see https://www.itwinjs.org/reference/ecschema-metadata/metadata/customattribute/ - * @public - */ - export interface CustomAttribute { - className: FullClassName; - [propName: string]: any; - } } /** @@ -516,7 +503,7 @@ export async function getClass(schemaProvider: ECSchemaProvider, fullClassName: if (!schema) { throw new Error(`Schema "${schemaName}" not found.`); } - const lookupClass = await schema.getClass(className); + const lookupClass = schema.getClass(className); if (!lookupClass) { throw new Error(`Class "${className}" not found in schema "${schemaName}".`); } diff --git a/packages/shared/src/shared/ecsql-snippets/ECSqlJoinSnippets.ts b/packages/shared/src/shared/ecsql-snippets/ECSqlJoinSnippets.ts index c4137d712..2951b3462 100644 --- a/packages/shared/src/shared/ecsql-snippets/ECSqlJoinSnippets.ts +++ b/packages/shared/src/shared/ecsql-snippets/ECSqlJoinSnippets.ts @@ -180,22 +180,22 @@ async function getRelationshipPathStepClasses( async function getNavigationProperty(step: ResolvedRelationshipPathStep): Promise { const source = !step.relationshipReverse ? step.source : step.target; const target = !step.relationshipReverse ? step.target : step.source; - for (const prop of await source.getProperties()) { + for (const prop of source.getProperties()) { /* v8 ignore else -- @preserve */ if ( prop.isNavigation() && prop.direction === "Forward" && - (await prop.relationshipClass).fullName === step.relationship.fullName + prop.relationshipClass.fullName === step.relationship.fullName ) { return prop; } } - for (const prop of await target.getProperties()) { + for (const prop of target.getProperties()) { /* v8 ignore else -- @preserve */ if ( prop.isNavigation() && prop.direction === "Backward" && - (await prop.relationshipClass).fullName === step.relationship.fullName + prop.relationshipClass.fullName === step.relationship.fullName ) { return prop; } diff --git a/packages/shared/src/shared/ecsql-snippets/ECSqlValueSelectorSnippets.ts b/packages/shared/src/shared/ecsql-snippets/ECSqlValueSelectorSnippets.ts index 5be295509..bc4ceb17b 100644 --- a/packages/shared/src/shared/ecsql-snippets/ECSqlValueSelectorSnippets.ts +++ b/packages/shared/src/shared/ecsql-snippets/ECSqlValueSelectorSnippets.ts @@ -67,7 +67,7 @@ export async function createPrimitivePropertyValueSelectorProps({ propertyName: string; }): Promise { const ecClass = await getClass(schemaProvider, propertyClassName); - const property = await ecClass.getProperty(propertyName); + const property = ecClass.getProperty(propertyName); if (!property) { throw new Error(`The property "${propertyName}" not found in class "${propertyClassName}".`); } @@ -106,7 +106,7 @@ export async function createPrimitivePropertyValueSelectorProps({ ...(extendedType ? { extendedType } : /* v8 ignore next */ {}), }; case "Double": - const koqName = (await property.kindOfQuantity)?.fullName; + const koqName = property.kindOfQuantity?.fullName; return { selector: propertySelector, type: "Double", diff --git a/packages/shared/src/shared/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.ts b/packages/shared/src/shared/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.ts index 1a1567948..4ae5f2231 100644 --- a/packages/shared/src/shared/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.ts +++ b/packages/shared/src/shared/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.ts @@ -284,7 +284,7 @@ async function compileValueSpec(spec: InstanceLabelOverrideValueSpecification, c throw new Error(`Class ${relName} is not a relationship class`); } const endpoint = lastStep.direction === "Backward" ? relClass.source : relClass.target; - const constraintClass = await endpoint.abstractConstraint; + const constraintClass = endpoint.abstractConstraint; if (!constraintClass) { return "''"; } @@ -392,7 +392,7 @@ async function toJoinRelationshipPath(props: { throw new Error(`Class ${relationshipName} is not a relationship class`); } const endpoint = relationshipReverse ? relClass.source : relClass.target; - const constraintClass = await endpoint.abstractConstraint; + const constraintClass = endpoint.abstractConstraint; if (!constraintClass) { throw new Error(`Relationship's ${relationshipName} endpoint does not have an abstract constraint`); } diff --git a/packages/shared/src/test/Metadata.test.ts b/packages/shared/src/test/Metadata.test.ts index 1eb4fc97d..2bff879c6 100644 --- a/packages/shared/src/test/Metadata.test.ts +++ b/packages/shared/src/test/Metadata.test.ts @@ -15,12 +15,12 @@ describe("createCachingECClassHierarchyInspector", () => { it("returns `true` when candidate is base class", async () => { schemaProvider.getSchema.mockResolvedValue({ - getClass: async (className: string) => { + getClass: (className: string) => { switch (className) { case "b": - return { fullName: "a.b", is: async () => true }; + return { fullName: "a.b", is: () => true }; case "d": - return { fullName: "c.d", is: async () => false }; + return { fullName: "c.d", is: () => false }; } return undefined; }, @@ -31,12 +31,12 @@ describe("createCachingECClassHierarchyInspector", () => { it("returns `false` when candidate is not base class", async () => { schemaProvider.getSchema.mockResolvedValue({ - getClass: async (className: string) => { + getClass: (className: string) => { switch (className) { case "b": - return { fullName: "a.b", is: async () => false }; + return { fullName: "a.b", is: () => false }; case "d": - return { fullName: "c.d", is: async () => true }; + return { fullName: "c.d", is: () => true }; } return undefined; }, @@ -46,12 +46,12 @@ describe("createCachingECClassHierarchyInspector", () => { }); it("returns the same Promise when called with exact same arguments", async () => { - const getClassStub = vi.fn(async (className: string) => { + const getClassStub = vi.fn((className: string) => { switch (className) { case "b": - return { fullName: "a.b", is: async () => false }; + return { fullName: "a.b", is: () => false }; case "d": - return { fullName: "c.d", is: async () => false }; + return { fullName: "c.d", is: () => false }; } return undefined; }); @@ -62,18 +62,17 @@ describe("createCachingECClassHierarchyInspector", () => { expect(p2).toBeInstanceOf(Promise); expect(p1).toBe(p2); await Promise.all([p1, p2]); - expect(getClassStub).toHaveBeenCalledTimes(2); + expect(getClassStub).toHaveBeenCalledTimes(1); expect(getClassStub).toHaveBeenCalledWith("b"); - expect(getClassStub).toHaveBeenCalledWith("d"); }); it("returns cached non-Promise value when called with exact same arguments after awaiting on the initial call", async () => { - const getClassStub = vi.fn(async (className: string) => { + const getClassStub = vi.fn((className: string) => { switch (className) { case "b": - return { fullName: "a.b", is: async () => false }; + return { fullName: "a.b", is: () => false }; case "d": - return { fullName: "c.d", is: async () => false }; + return { fullName: "c.d", is: () => false }; } return undefined; }); @@ -83,9 +82,8 @@ describe("createCachingECClassHierarchyInspector", () => { const p2 = inspector.classDerivesFrom("a.b", "c.d"); expect(typeof p1).toBe("boolean"); expect(p1).toBe(p2); - expect(getClassStub).toHaveBeenCalledTimes(2); + expect(getClassStub).toHaveBeenCalledTimes(1); expect(getClassStub).toHaveBeenCalledWith("b"); - expect(getClassStub).toHaveBeenCalledWith("d"); }); }); @@ -107,13 +105,13 @@ describe("getClass", () => { }); it("throws when class does not exist", async () => { - schemaProvider.getSchema.mockResolvedValue({ getClass: async () => undefined }); + schemaProvider.getSchema.mockResolvedValue({ getClass: () => undefined }); await expect(getClass(schemaProvider, "x.y")).rejects.toThrow(); }); it("throws when `getClass` call throws", async () => { schemaProvider.getSchema.mockResolvedValue({ - getClass: async () => { + getClass: () => { throw new Error("some error"); }, }); @@ -121,7 +119,7 @@ describe("getClass", () => { }); it("returns class", async () => { - const getClassStub = vi.fn().mockResolvedValue({ fullName: "result class" }); + const getClassStub = vi.fn().mockReturnValue({ fullName: "result class" }); schemaProvider.getSchema.mockResolvedValue({ getClass: getClassStub }); const result = await getClass(schemaProvider, "x.y"); expect(schemaProvider.getSchema).toHaveBeenCalledExactlyOnceWith("x"); diff --git a/packages/shared/src/test/MetadataProviderStub.ts b/packages/shared/src/test/MetadataProviderStub.ts index 75d50b9f2..eedea04ad 100644 --- a/packages/shared/src/test/MetadataProviderStub.ts +++ b/packages/shared/src/test/MetadataProviderStub.ts @@ -14,7 +14,7 @@ export interface StubClassFuncProps { className: string; classLabel?: string; properties?: EC.Property[]; - is?: (fullClassName: EC.FullClassName) => Promise; + is?: (fullClassName: EC.FullClassName) => boolean; } export interface StubRelationshipClassFuncProps extends StubClassFuncProps { source?: EC.RelationshipConstraint; @@ -27,8 +27,8 @@ export type TStubRelationshipClassFunc = (props: StubRelationshipClassFuncProps) interface SchemaStub { name: string; version: EC.SchemaVersion; + isHidden: boolean; getClass: Mock; - getCustomAttributes: Mock; classes: Map; } export function createECSchemaProviderStub() { @@ -45,9 +45,9 @@ export function createECSchemaProviderStub() { schemaStub = { name: schemaName, version: { read: 1, write: 0, minor: 0 }, + isHidden: false, classes: classMap, - getClass: vi.fn(async (className: string) => classMap.get(className)), - getCustomAttributes: vi.fn(), + getClass: vi.fn((className: string) => classMap.get(className)), }; schemaStubs.set(schemaName, schemaStub); } @@ -58,14 +58,15 @@ export function createECSchemaProviderStub() { fullName: `${props.schemaName}.${props.className}`, name: props.className, label: props.classLabel, - getProperty: async (propertyName: string): Promise => { + isHidden: undefined, + getProperty: (propertyName: string): EC.Property | undefined => { if (!props.properties) { return undefined; } return props.properties.find((p) => p.name === propertyName); }, - getProperties: async (): Promise> => props.properties ?? [], - is: vi.fn(async (targetClassOrClassName: EC.Class | string, schemaName?: string) => { + getProperties: (): Array => props.properties ?? [], + is: vi.fn((targetClassOrClassName: EC.Class | string, schemaName?: string) => { if (!props.is) { return false; } @@ -90,8 +91,8 @@ export function createECSchemaProviderStub() { const res = { ...createBaseClassProps(props), direction: props.direction ?? "Forward", - source: props.source ?? { polymorphic: true, abstractConstraint: async () => undefined }, - target: props.target ?? { polymorphic: true, abstractConstraint: async () => undefined }, + source: props.source ?? { polymorphic: true, abstractConstraint: undefined }, + target: props.target ?? { polymorphic: true, abstractConstraint: undefined }, isRelationshipClass: () => true, } as unknown as EC.RelationshipClass; getSchemaStub(props.schemaName).classes.set(props.className, res); diff --git a/packages/shared/src/test/ecsql-snippets/ECSqlJoinSnippets.test.ts b/packages/shared/src/test/ecsql-snippets/ECSqlJoinSnippets.test.ts index 9493b529f..f8a25d288 100644 --- a/packages/shared/src/test/ecsql-snippets/ECSqlJoinSnippets.test.ts +++ b/packages/shared/src/test/ecsql-snippets/ECSqlJoinSnippets.test.ts @@ -3,7 +3,6 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { ResolvablePromise } from "presentation-test-utilities"; import { beforeEach, describe, expect, it } from "vitest"; import { createRelationshipPathJoinClause } from "../../shared/ecsql-snippets/ECSqlJoinSnippets.js"; import { trimWhitespace } from "../../shared/Utils.js"; @@ -685,23 +684,14 @@ describe("createRelationshipPathJoinClause", () => { relationship?: Partial> | string; target?: Partial> | string; }) { - const navigationRelationshipRes = new ResolvablePromise(); - const navigationProperty = { - name: props.navigationPropertyName ?? "navigation-property", - isNavigation: () => true, - direction: props.navigationPropertyDirection, - relationshipClass: navigationRelationshipRes, - } as unknown as EC.NavigationProperty; const sourceClass = schemaProvider.stubEntityClass({ schemaName, className: typeof props.source === "string" ? props.source : "source", - properties: props.navigationPropertyDirection === "Forward" ? [navigationProperty] : [], ...(typeof props.source === "object" ? props.source : undefined), }); const targetClass = schemaProvider.stubEntityClass({ schemaName, className: typeof props.target === "string" ? props.target : "target", - properties: props.navigationPropertyDirection === "Backward" ? [navigationProperty] : [], ...(typeof props.target === "object" ? props.target : undefined), }); const relationship = schemaProvider.stubRelationshipClass({ @@ -711,16 +701,35 @@ describe("createRelationshipPathJoinClause", () => { source: { polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], }, target: { polymorphic: false, multiplicity: { lowerLimit: 0, upperLimit: INT32_MAX }, - abstractConstraint: Promise.resolve(targetClass), + abstractConstraint: targetClass, + constraintClasses: [targetClass], }, ...(typeof props.relationship === "object" ? props.relationship : undefined), }); - await navigationRelationshipRes.resolve(relationship); + const navigationProperty = { + name: props.navigationPropertyName ?? "navigation-property", + isNavigation: () => true, + direction: props.navigationPropertyDirection, + relationshipClass: relationship, + } as unknown as EC.NavigationProperty; + schemaProvider.stubEntityClass({ + schemaName, + className: typeof props.source === "string" ? props.source : "source", + properties: props.navigationPropertyDirection === "Forward" ? [navigationProperty] : [], + ...(typeof props.source === "object" ? props.source : undefined), + }); + schemaProvider.stubEntityClass({ + schemaName, + className: typeof props.target === "string" ? props.target : "target", + properties: props.navigationPropertyDirection === "Backward" ? [navigationProperty] : [], + ...(typeof props.target === "object" ? props.target : undefined), + }); return { sourceClass, targetClass, relationship, navigationProperty }; } @@ -746,12 +755,14 @@ describe("createRelationshipPathJoinClause", () => { direction: "Forward", source: { polymorphic: false, - abstractConstraint: Promise.resolve(sourceClass), + abstractConstraint: sourceClass, + constraintClasses: [sourceClass], multiplicity: { lowerLimit: 0, upperLimit: INT32_MAX }, }, target: { polymorphic: false, - abstractConstraint: Promise.resolve(targetClass), + abstractConstraint: targetClass, + constraintClasses: [targetClass], multiplicity: { lowerLimit: 0, upperLimit: INT32_MAX }, }, }); diff --git a/packages/shared/src/test/ecsql-snippets/ECSqlValueSelectorSnippets.test.ts b/packages/shared/src/test/ecsql-snippets/ECSqlValueSelectorSnippets.test.ts index 56844e06a..04c0fc5f3 100644 --- a/packages/shared/src/test/ecsql-snippets/ECSqlValueSelectorSnippets.test.ts +++ b/packages/shared/src/test/ecsql-snippets/ECSqlValueSelectorSnippets.test.ts @@ -125,7 +125,7 @@ describe("createPrimitivePropertyValueSelectorProps", () => { isPrimitive: () => true, isNavigation: () => false, primitiveType: "Double", - kindOfQuantity: Promise.resolve({ fullName: "TestSchema.TestKindOfQuantity" }), + kindOfQuantity: { fullName: "TestSchema.TestKindOfQuantity" }, extendedTypeName: "TestExtendedType", } as unknown as EC.PrimitiveProperty, ], diff --git a/packages/shared/src/test/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.test.ts b/packages/shared/src/test/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.test.ts index 9b11097cf..0da1bfe0e 100644 --- a/packages/shared/src/test/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.test.ts +++ b/packages/shared/src/test/instance-label-factory-impls/IModelInstanceLabelSelectClauseFactory.test.ts @@ -184,12 +184,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -243,12 +245,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -303,12 +307,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); schemaProvider.stubRelationshipClass({ @@ -317,12 +323,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classC), + abstractConstraint: classC, + constraintClasses: [classC], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -385,12 +393,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -440,12 +450,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -546,12 +558,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, }); const ruleset = makeRuleset([ @@ -582,12 +596,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, }); const ruleset = makeRuleset([ @@ -852,12 +868,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -910,12 +928,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -968,12 +988,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -1022,12 +1044,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); @@ -1087,12 +1111,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, }); schemaProvider.stubRelationshipClass({ @@ -1101,12 +1127,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classB), + abstractConstraint: classB, + constraintClasses: [classB], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(classA), + abstractConstraint: classA, + constraintClasses: [classA], }, }); @@ -1270,12 +1298,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, }); const ruleset = makeRuleset([ @@ -1310,12 +1340,14 @@ describe("createIModelInstanceLabelSelectClauseFactory", () => { source: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, target: { polymorphic: true, multiplicity: { lowerLimit: 0, upperLimit: 1 }, - abstractConstraint: Promise.resolve(undefined), + abstractConstraint: undefined, + constraintClasses: [], }, }); const ruleset = makeRuleset([ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2dbeec7b..02f8d8a6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ catalogs: version: 5.32.0 build-tools: '@itwin/build-tools': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/eslint-plugin': specifier: ^6.1.0 @@ -33,7 +33,7 @@ catalogs: version: 5.10.0 '@types/node': specifier: ^24.13.1 - version: 24.13.2 + version: 24.13.1 '@vitejs/plugin-react': specifier: ^6.0.2 version: 6.0.2 @@ -66,71 +66,71 @@ catalogs: version: 6.0.3 vite: specifier: ^8.0.16 - version: 8.0.16 + version: 8.1.0 vite-plugin-static-copy: specifier: ^4.1.0 version: 4.1.0 itwinjs-core: '@itwin/core-bentley': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-common': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-geometry': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 itwinjs-core-dev: '@itwin/appui-abstract': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-backend': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-bentley': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-common': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-electron': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-frontend': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-geometry': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-i18n': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-orbitgt': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/core-quantity': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/ecschema-metadata': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/ecschema-rpcinterface-common': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/ecschema-rpcinterface-impl': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/express-server': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/presentation-backend': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/presentation-common': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 '@itwin/presentation-frontend': - specifier: ^5.10.0 + specifier: ^5.10.1 version: 5.10.1 itwinui: '@itwin/itwinui-icons-react': @@ -180,7 +180,7 @@ catalogs: version: 0.4.8 '@stratakit/icons': specifier: ^0.3.1 - version: 0.3.1 + version: 0.3.2 '@stratakit/structures': specifier: ^0.5.7 version: 0.5.7 @@ -198,26 +198,26 @@ catalogs: specifier: ^1.0.4 version: 1.0.4 '@vitest/browser-playwright': - specifier: ^4.1.8 - version: 4.1.8 + specifier: ^4.1.9 + version: 4.1.9 '@vitest/coverage-v8': - specifier: ^4.1.8 - version: 4.1.8 + specifier: ^4.1.9 + version: 4.1.9 axe-core: specifier: ^4.11.4 - version: 4.11.4 + version: 4.12.0 deep-equal-in-any-order: specifier: ^2.2.0 version: 2.2.0 happy-dom: specifier: ^20.10.1 - version: 20.10.2 + version: 20.10.6 playwright: specifier: ^1.59.1 - version: 1.59.1 + version: 1.60.0 vitest: - specifier: ^4.1.8 - version: 4.1.8 + specifier: ^4.1.9 + version: 4.1.9 vitest-browser-react: specifier: ^2.2.0 version: 2.2.0 @@ -234,7 +234,7 @@ importers: dependencies: '@changesets/cli': specifier: ^2.31.0 - version: 2.31.0(@types/node@24.13.2) + version: 2.31.0(@types/node@24.13.1) '@stylistic/eslint-plugin': specifier: catalog:build-tools version: 5.10.0(eslint@9.39.4) @@ -252,7 +252,7 @@ importers: version: 9.1.2(eslint@9.39.4) eslint-plugin-unused-imports: specifier: catalog:build-tools - version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4) + version: 4.4.1(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -294,7 +294,7 @@ importers: version: 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/components-react': specifier: catalog:appui version: 5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/core-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -387,7 +387,7 @@ importers: version: 1.0.4 '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@types/object-hash': specifier: ^3.0.6 version: 3.0.6 @@ -414,7 +414,7 @@ importers: version: 5.8.0 happy-dom: specifier: catalog:test-tools - version: 20.10.2 + version: 20.10.6 i18next-http-backend: specifier: ^3.0.6 version: 3.0.6 @@ -447,13 +447,13 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) apps/load-tests/backend: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-backend': specifier: catalog:itwinjs-core-dev version: 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-geometry@5.10.1)(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)))(@opentelemetry/api@1.9.1) @@ -483,7 +483,7 @@ importers: version: 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 eslint: specifier: catalog:build-tools version: 9.39.4 @@ -498,7 +498,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-bentley': specifier: catalog:itwinjs-core-dev version: 5.10.1 @@ -531,10 +531,10 @@ importers: version: 1.3.5 '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 artillery: specifier: 2.0.31 - version: 2.0.31(@types/node@24.13.2) + version: 2.0.31(@types/node@24.13.1) brotli: specifier: ^1.3.3 version: 1.3.3 @@ -558,7 +558,7 @@ importers: version: 1.0.4 '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-backend': specifier: catalog:itwinjs-core-dev version: 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-geometry@5.10.1)(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)))(@opentelemetry/api@1.9.1) @@ -591,7 +591,7 @@ importers: version: link:../../packages/unified-selection '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 as-table: specifier: ^1.0.55 version: 1.0.55 @@ -615,13 +615,13 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) apps/test-app/backend: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-backend': specifier: catalog:itwinjs-core-dev version: 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-geometry@5.10.1)(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)))(@opentelemetry/api@1.9.1) @@ -687,7 +687,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-bentley': specifier: catalog:itwinjs-core-dev version: 5.10.1 @@ -723,10 +723,10 @@ importers: version: 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/appui-react': specifier: catalog:appui - version: 5.32.0(98fb7dbb86d43692508a053a70c5d069) + version: 5.32.0(c3c6c5b8fa18d878b25b0052bade2977) '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/components-react': specifier: catalog:appui version: 5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/core-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -804,13 +804,13 @@ importers: version: link:../../../packages/unified-selection-react '@rolldown/plugin-babel': specifier: catalog:build-tools - version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) '@stratakit/foundations': specifier: catalog:stratakit version: 0.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@stratakit/icons': specifier: catalog:stratakit - version: 0.3.1 + version: 0.3.2 '@stratakit/structures': specifier: catalog:stratakit version: 0.5.7(@types/react@19.2.17)(immer@10.2.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) @@ -822,7 +822,7 @@ importers: version: link:../common '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@types/react': specifier: catalog:react version: 19.2.17 @@ -831,7 +831,7 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: catalog:build-tools - version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) classnames: specifier: catalog:react version: 2.5.1 @@ -873,10 +873,10 @@ importers: version: 6.0.3 vite: specifier: catalog:build-tools - version: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + version: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) vite-plugin-static-copy: specifier: catalog:build-tools - version: 4.1.0(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.0(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/components: dependencies: @@ -919,7 +919,7 @@ importers: version: 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/components-react': specifier: catalog:appui version: 5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/core-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -973,7 +973,7 @@ importers: version: 14.6.1(@testing-library/dom@10.4.1) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@types/react': specifier: catalog:react version: 19.2.17 @@ -982,7 +982,7 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -997,7 +997,7 @@ importers: version: 7.37.5(eslint@9.39.4) happy-dom: specifier: catalog:test-tools - version: 20.10.2 + version: 20.10.6 presentation-test-utilities: specifier: workspace:^ version: link:../test-utilities @@ -1015,7 +1015,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/content: dependencies: @@ -1031,13 +1031,13 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) eslint: specifier: catalog:build-tools version: 9.39.4 @@ -1049,7 +1049,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/core-interop: dependencies: @@ -1062,7 +1062,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/core-bentley': specifier: catalog:itwinjs-core-dev version: 5.10.1 @@ -1083,7 +1083,7 @@ importers: version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -1101,7 +1101,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/hierarchies: dependencies: @@ -1126,7 +1126,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) @@ -1135,10 +1135,10 @@ importers: version: 1.4.2 '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -1156,7 +1156,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/hierarchies-react: dependencies: @@ -1180,7 +1180,7 @@ importers: version: 0.5.7(@types/react@19.2.17)(immer@10.2.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) '@tanstack/react-virtual': specifier: ^3.13.24 - version: 3.13.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 3.14.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: specifier: catalog:react version: 2.5.1 @@ -1199,19 +1199,19 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@rolldown/plugin-babel': specifier: catalog:build-tools - version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) '@stratakit/foundations': specifier: catalog:stratakit version: 0.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@stratakit/icons': specifier: catalog:stratakit - version: 0.3.1 + version: 0.3.2 '@testing-library/dom': specifier: catalog:test-tools version: 10.4.1 @@ -1223,7 +1223,7 @@ importers: version: 14.6.1(@testing-library/dom@10.4.1) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@types/react': specifier: catalog:react version: 19.2.17 @@ -1232,16 +1232,16 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: catalog:build-tools - version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) '@vitest/browser-playwright': specifier: catalog:test-tools - version: 4.1.8(playwright@1.59.1)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8) + version: 4.1.9(playwright@1.60.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9) '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) axe-core: specifier: catalog:test-tools - version: 4.11.4 + version: 4.12.0 babel-plugin-react-compiler: specifier: catalog:build-tools version: 1.0.0 @@ -1256,10 +1256,10 @@ importers: version: 7.1.1(eslint@9.39.4) happy-dom: specifier: catalog:test-tools - version: 20.10.2 + version: 20.10.6 playwright: specifier: catalog:test-tools - version: 1.59.1 + version: 1.60.0 presentation-test-utilities: specifier: workspace:* version: link:../test-utilities @@ -1280,10 +1280,10 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) vitest-browser-react: specifier: catalog:test-tools - version: 2.2.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8) + version: 2.2.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9) packages/models-tree: dependencies: @@ -1299,7 +1299,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) @@ -1323,7 +1323,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) @@ -1335,10 +1335,10 @@ importers: version: 1.9.1 '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -1356,7 +1356,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/shared: dependencies: @@ -1366,16 +1366,16 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) eslint: specifier: catalog:build-tools version: 9.39.4 @@ -1390,7 +1390,7 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/test-utilities: devDependencies: @@ -1411,7 +1411,7 @@ importers: version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 eslint: specifier: catalog:build-tools version: 9.39.4 @@ -1442,16 +1442,16 @@ importers: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) '@types/node': specifier: catalog:build-tools - version: 24.13.2 + version: 24.13.1 '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -1469,13 +1469,13 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages/unified-selection-react: devDependencies: '@itwin/build-tools': specifier: catalog:build-tools - version: 5.10.1(@types/node@24.13.2) + version: 5.10.1(@types/node@24.13.1) '@itwin/eslint-plugin': specifier: catalog:build-tools version: 6.1.0(eslint@9.39.4)(typescript@6.0.3) @@ -1490,7 +1490,7 @@ importers: version: 19.2.17 '@vitest/coverage-v8': specifier: catalog:test-tools - version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) cpx2: specifier: catalog:build-tools version: 7.0.2 @@ -1505,7 +1505,7 @@ importers: version: 7.37.5(eslint@9.39.4) happy-dom: specifier: catalog:test-tools - version: 20.10.2 + version: 20.10.6 react: specifier: catalog:react version: 19.2.7 @@ -1517,25 +1517,41 @@ importers: version: 6.0.3 vitest: specifier: catalog:test-tools - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) packages: - '@ariakit/core@0.4.20': - resolution: {integrity: sha512-DJbUnui0fM+2ZgiWLOMuFOmlWSJDNV3f6tqghIYRTWEm51TN/LoU6uM8og6/g7Nrwl4Uo5l8AoQT9Kkr/i/uRg==} + '@ariakit/components@0.1.2': + resolution: {integrity: sha512-tvh2P0x1cJnoPXnmDEJwdRk3z7x6cTB8ArctcZdAUXlRg9tuwW/rJoBFJMzD5qMI9CDDlQ3Zctx58HvENw4BYw==} - '@ariakit/react-core@0.4.26': - resolution: {integrity: sha512-/Peh1KiVpjj79nCJIa6lEdzSTT9P9FZoy+CxByIFKL3YKdlXmDIIhS1E/tAqKbDq4ODVdynnqmrIDxE5wCoZYw==} + '@ariakit/react-components@0.1.2': + resolution: {integrity: sha512-SM+SPMAVlOZmGAfWNBza+0k9y4mkA5/dJhDoOyhE96cbNARy665uLdwowSJl1JGuFfcZzuzAwGon7f/rYeyfkQ==} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@ariakit/react@0.4.26': - resolution: {integrity: sha512-NcoPrYE4vgwyODAhdpNNuA7ldwODDuFqZl6jORPVDY3l+oRjl/OYwtQyyC3ZhC/4mjntYBYuKKrPJEizLmoxpg==} + '@ariakit/react-store@0.1.2': + resolution: {integrity: sha512-1r1Gn0tqhnOS0LFvHNGzn5/8C5aOANO5vb0Gxh94oR/be4zwCSE2zfQjOjRfpL+BBDhOcProME2+G6UslEJxbg==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@ariakit/react-utils@0.1.2': + resolution: {integrity: sha512-Rnl6D1542Mqu80xK++oUv1JXS0PtNmKXd9nkdud5nyvySiBDTrmPqRW44/D+5GbuZrboreQuY3tPYwKL7a7onQ==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@ariakit/react@0.4.29': + resolution: {integrity: sha512-SLXlsddWHSwfUol4Yi0zULlalNWjzWjpS3zg7B7aaPd64saONQ5ktWf9KMxqBklcpjMLeF2dB9BAHAvpPVdCIQ==} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + '@ariakit/store@0.1.2': + resolution: {integrity: sha512-SS7bV4+a+1q9M9i0WV6DD4P/ypRKlCvII8soo2UMe1yuaxZA/Fc0htHe+EZwjJ6TMLjHfHh2TDSnXyrjC7QImA==} + + '@ariakit/utils@0.1.2': + resolution: {integrity: sha512-lBJhtBWpKjIck/9i7G8cahvaUgLsyGklI/Pjv+VtY9KTzyuzX5GpRbbLKMS/e1qLnFPS4C3CybYB70b1bVcAkw==} + '@artilleryio/int-commons@2.22.0': resolution: {integrity: sha512-zbKXeAQuyVAAhmJJ9vjktNFo+ooS4mWci90btT0ycM69m4rGb6+ncEdaqwVbYOY6IeG/A/Br9wGZialmKkk/yg==} @@ -1568,153 +1584,144 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cloudwatch-logs@3.1053.0': - resolution: {integrity: sha512-M8AVDGPxzYHgJM7YfAefYOd+qAbo3tKs7Sw5S13kaDvk0A6nALtrroUNtvJI+ZXdy4Ys2j5icUYqGp+4PzAZmg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-cloudwatch@3.1053.0': - resolution: {integrity: sha512-Zp3oR2z8lurzIouAK0KiLeJyAW//0HwQX9c3a7C+rXoaKUbw8L9hfKSp2z0HQPIV9UBfFOTIba30ViKdMWFcAg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-cognito-identity@3.1053.0': - resolution: {integrity: sha512-fMwSPTOWcYrKsB1NG1z9uRSLE/GDJR/375tjiAyO6z2UTlpLSuWkfoYx98oMwHaJpqb1fEhtZZQ7o8czblShJQ==} + '@aws-sdk/checksums@3.1000.2': + resolution: {integrity: sha512-PIha+kauTbp6IRmOpYktPTrlfrrSqDVixvhO/EUOFOf62DPX81CaJoHJreuA1m9HYpSKyXf99BKjU1dvJPeUfw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-ec2@3.1053.0': - resolution: {integrity: sha512-8qfMGgfJdIOefogdYcF50yvX6rF9DNxljxh3qHz6CGuZTsXgJUzQ0U51z9mBUdh5YYTkK19o3c6LKuSHtT0MxQ==} + '@aws-sdk/client-cloudwatch-logs@3.1063.0': + resolution: {integrity: sha512-oVYWCAjcK6hq8atqfouNSu0jygOdhMcrH2sZIxNXICLzVD5jeOHD4pgr+W08uwN5Dfzq9iEKR7VFCV6l05Dj1A==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-ecs@3.1053.0': - resolution: {integrity: sha512-ck+m2h7mg52VdbFXKWeIFGWhbU/Ud8BugzlCLR1zF5qGknir3wPWJREnaTdcNDwwrx3zW5kFGKbo4H0nyjRiqA==} + '@aws-sdk/client-cloudwatch@3.1063.0': + resolution: {integrity: sha512-A/PG9D709oSFwutfP5CyATQJzc2IyhicMirByvkLkrj8ezSunB0/+ZRJdPibONolE0P2+kneQqHttanspULpAw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-iam@3.1053.0': - resolution: {integrity: sha512-K8twwQta96O4Y4OUuk97n+SnA5OiPm759uR2Ffbm3a2/vQGMg2BcAQwFV+wwG9hj64+tus02AGH9dyuzRKJnKA==} + '@aws-sdk/client-cognito-identity@3.1063.0': + resolution: {integrity: sha512-fLwNblkowkRyuxdVehlHVOnr/7bBf8Y1UGYdhhpuMPHOQL2QTY6kLcQ+EV1BhTQG1p4ATwaONNJsIk44hxEGMA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-lambda@3.1053.0': - resolution: {integrity: sha512-rIauaabLL/2C/5GYW6r/j4ptULlsTw2D/81leZ0nrjQVu9LSuAUZBJYLJpMsQobhDon4gfkdMIObOxQY1AHhRA==} + '@aws-sdk/client-ec2@3.1063.0': + resolution: {integrity: sha512-RVVqRR6SBQwTHnttHXj/QbUwagA1a86tqJhyDik9/REviSfu7XGJ61RlXmDfyeU76bhv3NJ4mW2EZrhWO2/0hQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1053.0': - resolution: {integrity: sha512-/oGxoB6p1Nqs935Blt+v1o+anSCEf2n3RjIrcLz84i4cn2Gr+Z7JpDdUkG5+74r5ctqEPG7k/phTGbJ9fNKnHg==} + '@aws-sdk/client-ecs@3.1063.0': + resolution: {integrity: sha512-SVVmsVKJpy9cGoKAr6etP2i/MkymCgesZRlaHra3M2dNxTEldYRxQ5sqC3H5qj6qhF8XtWELl3G3loTAN7eJXA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sqs@3.1053.0': - resolution: {integrity: sha512-FxjVXnzWyKcxdeI4j5ON5mGcnlhftNj78p36zSIvcRKGBUZflkly+hstLXIXNI8dHNJYX6ieL/k+dzw5hyBKaw==} + '@aws-sdk/client-iam@3.1063.0': + resolution: {integrity: sha512-5BPya0CvFQvgI4Ru2rzoQ/GQLZ8LevVNXHPNT/q0otms1Yg4rRi2G4/yoN6zmsU3Og4CHSOSuS287zwFVNTlQA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-ssm@3.1053.0': - resolution: {integrity: sha512-LxfEs7UWnGwRMZWtCWhqyUej6eJkszy4rBPjlLrMe/nrZm3RrpDRqCcZkkg4DcIkU6z4kcutX78tePitUhiPtA==} + '@aws-sdk/client-lambda@3.1063.0': + resolution: {integrity: sha512-xn2c+C2/le5Iya243PVsH+s4yhs0Oo5wK+CopVJfhZ2uH6WNEWre+wQ6D/q8FkFZaaPP/cwejVBVUEaMsD98Kw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sts@3.1053.0': - resolution: {integrity: sha512-0lkXV/by8oHnKjScVfWoZsvyalkV3iiMobDYDS/vmtXnmnpHoi2jlo8Jo51vYaqTGPbI1IJ2jtHj5cLsmB7Qkg==} + '@aws-sdk/client-s3@3.1063.0': + resolution: {integrity: sha512-ETn+vvmZVK1MmOZwVBXmWANpmD5iTbzojIqyEIoZ86qo+8oWy35S8QyQNE/ZDI+WHgMU1dS+VSYbpRl1QkEySg==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.974.13': - resolution: {integrity: sha512-+Y5/4tHki0uYgyx8eun146DegRVQBpdKGK5RbV0FTKJPpaKTchvqVxrrRFK6Wk0JksO4iAZKw3eqxGEIwtO98w==} + '@aws-sdk/client-sqs@3.1063.0': + resolution: {integrity: sha512-2Oi4FpC1jJ10gpBDfXw0sMh6GvkYmnkaTo28AnjRUrCRe5JkvEWvDwKKksQM67UtwO5AoomKAqFKVzID1zW/fQ==} engines: {node: '>=20.0.0'} - deprecated: Deprecated due to an error deserialization bug in JSON 1.0 protocol services, see https://github.com/aws/aws-sdk-js-v3/pull/8031. Newer version available. - '@aws-sdk/crc64-nvme@3.972.9': - resolution: {integrity: sha512-P+QGozmXn2mZZI7sDgk+aUm+RTI61MPSFB+Ir2vjEjEbEsE4e7hYtzrDvAUxZy9ko81h53e11+F/GYlvwDkaOQ==} + '@aws-sdk/client-ssm@3.1063.0': + resolution: {integrity: sha512-qLXNofwgCB7/3mhWR9pz/bnNgyvSxjp38SvhTazESrt3mLtX9+kMg8UOKTZol0mvZg209UVIS82xY1JhJDtGpA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.972.36': - resolution: {integrity: sha512-DkibmGSpgUKUwqvbooEnwoU/18pbrneuOcysCwHolC85Q6UXGesZ73Sk00oK/SpWOe+lfjDxq2nMDypJvi2OmQ==} + '@aws-sdk/client-sts@3.1063.0': + resolution: {integrity: sha512-5SZhiVKuufk/dUcfNr6hZymQSTSnh12paXRLq+YS8OmsozpChNG0wHaKH/hXA/mdGwLxgdudqHAHxygbCiwzqQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.39': - resolution: {integrity: sha512-29wX9zpAvEt1vcj0psha+y6ygBHy2V/S72mp6e7q0KARLWXq+pwE/lR6qGkwknQvruh52lXvlqZIga8Hdxkucw==} + '@aws-sdk/core@3.974.18': + resolution: {integrity: sha512-JDYCPI0j7zGrzXTDFsLB346cxss7J/AxH7+O0MzWlqppJBEyB9Qe6TQXRL6iwLUo/xZkNv9KFmBL2hqElmwW0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.41': - resolution: {integrity: sha512-IA3CQTjtJkb6u1H4mE4936c8OPBMa9Jggtwe8U2Mqw/vvb/tZ5Ebd0mcZcX0uKWQhOyYo/+qNIwkV5Xh+FeJJA==} + '@aws-sdk/core@3.974.19': + resolution: {integrity: sha512-SMNfLCU/41xxfFaC5Slwy8V/f1FRhakvyeeMeDeIxqNF0DzhDlXsXnJDELJYke1EtnJbfzfilW7tvulGfxMY6A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.43': - resolution: {integrity: sha512-4mzII+3mZEVXXE1xzrLQrCJL7/r62A63bA6SVzZoNL5rqCJghpf+xgGltVrIBBs0n+mOZBKrQl2tRREtvZ5l6A==} + '@aws-sdk/credential-provider-cognito-identity@3.972.42': + resolution: {integrity: sha512-94W7f8xVsdLEjv3TY8R+beoFL0pIRduiGZdqMfIVMvQfn6q9IA3SgE2mIQluu3VCULn8PopB/gx7Fns8ETn/1Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.43': - resolution: {integrity: sha512-HG7kQCwXtbv3oBV61Ins0oNX8KKyvrMqqRkb6ZiAfQHbMuHaiNaEb2KnpKLPkNpqImSBK82UkVE/kaY6IfWikA==} + '@aws-sdk/credential-provider-env@3.972.44': + resolution: {integrity: sha512-3hKJVrZ7bqXzDAXCQp+OaQ1ASN+vWstaNuEH418wQVl//cRZhqhfR9Bjk1qIWmgUGe8/D3gdO73PgidRj378EQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.44': - resolution: {integrity: sha512-sDaBIT0yrNNIPfvlsiTCmANm07zKju+ipWODjEXgZlsjMeIJR3LVp7RDyAOzUoAsTbDfYKDWp+i5WrFiQP6rmQ==} + '@aws-sdk/credential-provider-http@3.972.46': + resolution: {integrity: sha512-VhwC9pGAZHhiQ2xSViyOPDFqvr9aRxGCAXZtADsUhU3R65nad7y//CwynE6mQnWNR+suRlqE79W36IVayL+m1g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.39': - resolution: {integrity: sha512-2k/amBifLd75eXNwgvPw/2lKYSQ3NhvHQgkVKVjfUq13/eJ3JRtHmznuFenn74OK3sSfp4SMy1YB2w+UVXoKqA==} + '@aws-sdk/credential-provider-ini@3.972.50': + resolution: {integrity: sha512-09Xi6ovxiK42+De/qBGF71sT5F2bWgYM+1fFyDwSOpy1xpsQ5R/naIu7MVDpH6Dic36QNc8dAv4KADtMGK2JYg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.43': - resolution: {integrity: sha512-LPc3+Y4vhH1T4x6CMqwCM6hk5+SRf/Lwmgm8INm95wxTtIRHcMwQUVkDzWu4Iw/RSncxYM2BC01OrYbxOPZvyg==} + '@aws-sdk/credential-provider-login@3.972.49': + resolution: {integrity: sha512-EfJF/1Fh9mI4pZyoheU2RY9xUhTcugIZNkD63+orXMkYj/QXacJNbKVDUK90Yv5hE+aX+rt9J/EZ9Qr3vKOa7g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.43': - resolution: {integrity: sha512-wQtL34lUD/09VXjwAUo2T+I3aEXRDxMB3DKmTJL/Zj0Gi6sLDTrVhae1XVt01yzkquOWajI/sZW72JGDZ1ciTw==} + '@aws-sdk/credential-provider-node@3.972.52': + resolution: {integrity: sha512-7QX+PbyiWBEOVipJq8Nke/TqXT6lAPLE7fvTaopa39/IVWuLfS+Fzdy71sZJONf/mLGgmtj6aU17+REw3+aRrw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-providers@3.1053.0': - resolution: {integrity: sha512-jMzNBhYIIzaKiVOFndhyWSvEIosiU/zSxgcOaGXrHGcwlRXcFgTgZEcOFL504hxg4BdrrAIVdGw55Zk9zMhs7g==} + '@aws-sdk/credential-provider-process@3.972.44': + resolution: {integrity: sha512-V+UUhZpRP7QDRhi+qgBDisM9tUBnYmMje8Bk77A6MZsfeGeGdMsQXmaHP1CDYFcept0o/Rz5g2Y0TMeVlG9dzg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.15': - resolution: {integrity: sha512-O2HDANa+MrvbxpaRVQDiH3T13uAa9AkMjKyZmDygwauAmmvqZ5B0iRmKW+fuVGW6NPXuyXurFgIx69lSvmAWGA==} + '@aws-sdk/credential-provider-sso@3.972.49': + resolution: {integrity: sha512-9QqOYGuh5tZ76OzaT68kwI78AH+5lS/uZGGvkfxb3fc8FzRrIz2jOufNTliEBEeSAwmgK2rWLNsK+IB3zbtNPA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.13': - resolution: {integrity: sha512-sHiqIFg8o2ipT7t40B89Vj0ubSUtY6OSt/+Ee/OXhHch5K4+81zP2+QX8Lkc/nJ2QSmCySxOke7TEbmX69fe2g==} + '@aws-sdk/credential-provider-web-identity@3.972.49': + resolution: {integrity: sha512-IYx1lN38MnnPXv+NBLpuATu0cZakbZ321TAfjW+aVkw7HIJF38YnEwdeEO55MSl3pl7hIX1IvvnD6EmnAzmAJw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.974.21': - resolution: {integrity: sha512-alAu9heyiBK/OmRNXVxq8mmPTgeW2AQ6EYjRsI38kPZa1MZvt2Jh+BlGq7/GG9OVXOaEgD7DlGj/Lzfy5OmuEg==} + '@aws-sdk/credential-providers@3.1063.0': + resolution: {integrity: sha512-ApW861WX8h7wKDKRNj7Dyne7awtq/PHrJVSdr3NsE/rmuFUxSha6BFJJ1H0S1MD7hCqZjYqz2VPPmCXo3IKC9A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.11': - resolution: {integrity: sha512-hkfspNUP4criAH6ton6BGKgnm5dZx+7bUOy1YqlTfejDeUPAM23D81q/IX+hdlS3KUsfwGz5ADTqZWKBEUpf4A==} + '@aws-sdk/middleware-flexible-checksums@3.974.27': + resolution: {integrity: sha512-bZqezPLdllFC4VAeV/f+EIc/hz56ab3TD/+4zNCgOgmG5ZHAE5dMHrX1gtTwdcQXbPr3KR7x3zTC3zuCTE6+ng==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-ec2@3.972.27': - resolution: {integrity: sha512-jOUHykRIV8Ki+004htgSf/IhfHHdvIw7aQ+qaiTA3qa7gSLFCsqm17Sgj/vZcZicNuiIthuURStKmcYeFS/bIg==} + '@aws-sdk/middleware-sdk-ec2@3.972.32': + resolution: {integrity: sha512-pYIQfl8jN0HVuz6iDisD4wxA59MgLLp2mAs6ziPPA4OMGXkQ5eDQgZRU1K7d5b6tFcdTmQTYD+pcqqUpeG5Plw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.42': - resolution: {integrity: sha512-/xNqNGXv9LaxZd25L9VV4pnSOw9OdDNO4rAHamM+h3KQBSITljIH9vk3dveGga1I2j36lQd0rdG3gjNEXvtNew==} + '@aws-sdk/middleware-sdk-s3@3.972.48': + resolution: {integrity: sha512-MRTqx8wD/T3REt6LTT3/yN8rrp6+xIHrbUekkDYJTYWVch70mwtdJBovR4qKJz1jIPlbN+9R/Sn6R04BfsglzA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-sqs@3.972.25': - resolution: {integrity: sha512-xn/GUO23lRdeyDsOUvUpgzOMTKlHt0U4F2L0vCqUzyunKILoWuxspi36hfP7GinIrnIcudI4zLFD5+7fiIP3SA==} + '@aws-sdk/middleware-sdk-sqs@3.972.29': + resolution: {integrity: sha512-huMx6RhC/tF9K82GZpnox8vK26Pt+6QASMrJiyup99ffr+HBT3asD4soa9BuD3WeLd64XYdOeuUjIjqKgVu5gA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.11': - resolution: {integrity: sha512-7PQvGNhtveKlvVqNahqWx5yrwxP7ecwAoB1dYBf8eKwfo2tzzCbNnW+q2nO3N066ktQaB4iBQbDRWtizm+amoQ==} + '@aws-sdk/nested-clients@3.997.17': + resolution: {integrity: sha512-lDRgraoTfKRawUyc176Ow93mrNrOho/x+EoK4C+lKU+vKkHWhNhzvSMVAx0WEJUJoeQxxDN5ZdKMfiGEyNejig==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.11': - resolution: {integrity: sha512-nWXXJ1r/r8N2Gw1pWolRgED38/A9A8DHR2ETWIv220zh4PZHcybbR4hUVWWktmNXTRHzDJwRluapHn0rZxuoqA==} + '@aws-sdk/signature-v4-multi-region@3.996.32': + resolution: {integrity: sha512-llvApLcsWtmRFhG2wT3WIp1CmDeRaIYutqty1ZZXoMzK7TiJ6MOLOimk9eXUS8PwgG4ew4pa4QAbt0lfhn++1w==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.28': - resolution: {integrity: sha512-qs9z5LqXO/CZC2Lg9SGKpoLU8Rhi+m2pFKZqfO9pytX1clc0katqtsDNupJxFy0xT9wsZSPzM2v1y+/H/zfp5Q==} + '@aws-sdk/token-providers@3.1063.0': + resolution: {integrity: sha512-nYDaWWdzjKiDP5xj8k4oUgcYd4WPgzfAOgdU5vJsaqH/07Dfvm7ffisHCFJ+NEl7kUC9JEIUxh0kznvenbo3NQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1052.0': - resolution: {integrity: sha512-QqZNB3so7UIDxZtroc85TQaLVxdZRFm0eWM1CSR2N+b06as9TOrilvrlTZuj3guYlxMs6yLOgGxnklJ5qMYtTw==} + '@aws-sdk/types@3.973.11': + resolution: {integrity: sha512-YjS0qFuECClRh4qhEyW8XagW0fwEPBeZ1cfsW/gU73Kh/ExFILxbzxOfPCmzF/2DwEvhvsHYt0b0qnvStwKYrg==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.9': - resolution: {integrity: sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==} + '@aws-sdk/types@3.973.12': + resolution: {integrity: sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.5': - resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} + '@aws-sdk/util-locate-window@3.965.6': + resolution: {integrity: sha512-ZfHjfwSzeXj+Lg9AK5ZNmeDkXev6V+w2tn1t4kgDdRtUaRCthepTQiFwbD06EF9oNGH4LaLg+Mb6U16Ypv5bSw==} engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.25': - resolution: {integrity: sha512-GH+Kjz4nPKWKHnsiQpnhP1MJdTGIcK4rAka6tzakgjjUkVgNsmPeEbbRAf09SzS1hjGu6duGHCBsxYke0BhHjQ==} + '@aws-sdk/xml-builder@3.972.29': + resolution: {integrity: sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.4': @@ -1737,8 +1744,8 @@ packages: resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} engines: {node: '>=20.0.0'} - '@azure/core-client@1.10.1': - resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} + '@azure/core-client@1.10.2': + resolution: {integrity: sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==} engines: {node: '>=20.0.0'} '@azure/core-http-compat@2.4.0': @@ -1756,8 +1763,8 @@ packages: resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-rest-pipeline@1.23.0': - resolution: {integrity: sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==} + '@azure/core-rest-pipeline@1.24.0': + resolution: {integrity: sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==} engines: {node: '>=20.0.0'} '@azure/core-tracing@1.3.1': @@ -1780,94 +1787,94 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@5.11.0': - resolution: {integrity: sha512-zkGNYS3TwY8lUpPIafAmsFCYZbgFixY9y/LZB9GUg0IILoHTqpN26j5OrkL1AQThh/YdZsawe4iWXfp85lFVxg==} + '@azure/msal-browser@5.12.0': + resolution: {integrity: sha512-eNf2aqx1C6I0yT1GEu5ukblFrmaBXGfe1bivpmlfqvK7giPZvoXLa404C8EfeHVsy6EIryfQuPRzuW1fPxWlHg==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.6.2': - resolution: {integrity: sha512-hQjjsekAjB00cM1EmatWJlzhEoK2Qhz7Rj5gvM6tYf8iL7RM3tkxlpU9fG0+ofkulzg9AEEA6dIEnSmDr5ZqUA==} + '@azure/msal-common@16.7.0': + resolution: {integrity: sha512-Jb8Y7pX6KM42SIT7KWP6YbY3+vLbwB5b5m+tpiiOzMU1QeyelQzs9lO8jv1e7/Uj9r7tg7VjPvW4T0KB1jF3UQ==} engines: {node: '>=0.8.0'} - '@azure/msal-node@5.2.2': - resolution: {integrity: sha512-toS+2AePxqyzb0YOKttDOOiSl3jrkK9aiqIvpurpis0O34QcIS5gToqrgT39p04Dpxw3YoUU0lxJKTpSFFfA6Q==} + '@azure/msal-node@5.2.3': + resolution: {integrity: sha512-YYX4TchEVddVBiybKvKhV9QO/q22jgewP+BVxKG7Uh115voPcviGlypbKERDsqQdAiSTJrwi80gcWFjYKdo8+Q==} engines: {node: '>=20'} - '@azure/storage-blob@12.31.0': - resolution: {integrity: sha512-DBgNv10aCSxopt92DkTDD0o9xScXeBqPKGmR50FPZQaEcH4JLQ+GEOGEDv19V5BMkB7kxr+m4h6il/cCDPvmHg==} + '@azure/storage-blob@12.32.0': + resolution: {integrity: sha512-80LzSNnFQye2LCCBFghAJS6jJQJ7N4bfgZ6qDMgVGRtugZ7TLDKQZ2hczMigmZH3jAcMRdma/IygsC5+0gT7Tw==} engines: {node: '>=20.0.0'} - '@azure/storage-common@12.3.0': - resolution: {integrity: sha512-/OFHhy86aG5Pe8dP5tsp+BuJ25JOAl9yaMU3WZbkeoiFMHFtJ7tu5ili7qEdBXNW9G5lDB19trwyI6V49F/8iQ==} + '@azure/storage-common@12.4.0': + resolution: {integrity: sha512-kNhJKMxQb374KOVt63CZnGIpDcrKNzJeyANLJymxE9mCJSdRGzb+Iv9oSIiCj6tNMLypr530b9ObOiA/5OvwOg==} engines: {node: '>=20.0.0'} - '@azure/storage-queue@12.29.0': - resolution: {integrity: sha512-p02H+TbPQWSI/SQ4CG+luoDvpenM+4837NARmOE4oPNOR5vAq7qRyeX72ffyYL2YLnkcyxETh28/bp/TiVIM+g==} + '@azure/storage-queue@12.30.0': + resolution: {integrity: sha512-204lc/W0nnZy0/JXGXAVsQG9LmRWGVrh28uxkWd6lV5/G/vHlFZOLxiTS5DUdLcnZ+OHhsClRJnMWgHX2X0vdA==} engines: {node: '>=20.0.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} '@babel/generator@8.0.0-rc.3': resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} engines: {node: ^20.19.0 || >=22.12.0} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0-rc.5': - resolution: {integrity: sha512-sN7R8rBvDurfaziNfDEIjIntlazmlkCDGO4SNl2RJ3wRCn+QxspLV7hzYAE8WWVd2joVuT8sUxeePdLp2idI1A==} + '@babel/helper-string-parser@8.0.0-rc.6': + resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@8.0.0-rc.3': resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} engines: {node: ^20.19.0 || >=22.12.0} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -1876,20 +1883,20 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@babel/types@8.0.0-rc.3': @@ -2012,8 +2019,8 @@ packages: '@cspell/dict-aws@4.0.17': resolution: {integrity: sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==} - '@cspell/dict-bash@4.2.2': - resolution: {integrity: sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==} + '@cspell/dict-bash@4.2.3': + resolution: {integrity: sha512-ljUZoKHbDqw5Sx0qpL2qTUlmkmr+vhZH/sCNrNaBZKTbdgiswErSnIF1jRbGmEitJNxHRHWsuZyVgnTGfVO1Yw==} '@cspell/dict-companies@3.2.11': resolution: {integrity: sha512-0cmafbcz2pTHXLd59eLR1gvDvN6aWAOM0+cIL4LLF9GX9yB2iKDNrKsvs4tJRqutoaTdwNFBbV0FYv+6iCtebQ==} @@ -2027,14 +2034,14 @@ packages: '@cspell/dict-csharp@4.0.8': resolution: {integrity: sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==} - '@cspell/dict-css@4.1.1': - resolution: {integrity: sha512-y/Vgo6qY08e1t9OqR56qjoFLBCpi4QfWMf2qzD1l9omRZwvSMQGRPz4x0bxkkkU4oocMAeztjzCsmLew//c/8w==} + '@cspell/dict-css@4.1.2': + resolution: {integrity: sha512-+ylGoKdwZ2sVOCOnU2Eq5wDZx+RaVX3HoKyNHGGsFvhSw6IidQ6tH/mAPKBDofViHJoWCPNlklE0lTr6MDG3QA==} '@cspell/dict-dart@2.3.2': resolution: {integrity: sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==} - '@cspell/dict-data-science@2.0.13': - resolution: {integrity: sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==} + '@cspell/dict-data-science@2.0.14': + resolution: {integrity: sha512-jl6Ds4u5u5JT+yY30pWQpAbdCHfy3lCcNkLbpL/AZKoUaLEoXbaYsps9xQtvD7DyaiXxiLZkdH2yHHXtoFtZyg==} '@cspell/dict-django@4.1.6': resolution: {integrity: sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==} @@ -2051,11 +2058,11 @@ packages: '@cspell/dict-en-common-misspellings@2.1.12': resolution: {integrity: sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==} - '@cspell/dict-en-gb-mit@3.1.22': - resolution: {integrity: sha512-xE5Vg6gGdMkZ1Ep6z9SJMMioGkkT1GbxS5Mm0U3Ey1/H68P0G7cJcyiVr1CARxFbLqKE4QUpoV1o6jz1Z5Yl9Q==} + '@cspell/dict-en-gb-mit@3.1.24': + resolution: {integrity: sha512-Oowb/Uzkh7OmDRdCcETzMc9imEb4IpLlHJXoYjX8A8DS2X/54gqSjI915JFB8hKtFjBko5OM0BLQ+6cZhFEMmQ==} - '@cspell/dict-en_us@4.4.33': - resolution: {integrity: sha512-zWftVqfUStDA37wO1ZNDN1qMJOfcxELa8ucHW8W8wBAZY3TK5Nb6deLogCK/IJi/Qljf30dwwuqqv84Qqle9Tw==} + '@cspell/dict-en_us@4.4.35': + resolution: {integrity: sha512-xWpxBCc/FzzMMo/A+0qwARVaIIhR0Ql8yhhv4rvsvg+GfQF+LG9yzg2GwTM5N2rjvzmM3nKuR9zxFZq2I6fJSg==} '@cspell/dict-filetypes@3.0.18': resolution: {integrity: sha512-yU7RKD/x1IWmDLzWeiItMwgV+6bUcU/af23uS0+uGiFUbsY1qWV/D4rxlAAO6Z7no3J2z8aZOkYIOvUrJq0Rcw==} @@ -2117,10 +2124,10 @@ packages: '@cspell/dict-makefile@1.0.5': resolution: {integrity: sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==} - '@cspell/dict-markdown@2.0.16': - resolution: {integrity: sha512-976RRqKv6cwhrxdFCQP2DdnBVB86BF57oQtPHy4Zbf4jF/i2Oy29MCrxirnOBalS1W6KQeto7NdfDXRAwkK4PQ==} + '@cspell/dict-markdown@2.0.17': + resolution: {integrity: sha512-H8bAxih6U8NOnSPL7R8My+tqjaB4tmnJTjERuz4zYqmf+cH+5xshX3UVgKlwWFcyjsYfv/zEDuRdMctQv1q6HQ==} peerDependencies: - '@cspell/dict-css': ^4.1.1 + '@cspell/dict-css': ^4.1.2 '@cspell/dict-html': ^4.0.15 '@cspell/dict-html-symbol-entities': ^4.0.5 '@cspell/dict-typescript': ^3.2.3 @@ -2131,8 +2138,8 @@ packages: '@cspell/dict-node@5.0.9': resolution: {integrity: sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==} - '@cspell/dict-npm@5.2.38': - resolution: {integrity: sha512-21ucGRPYYhr91C2cDBoMPTrcIOStQv33xOqJB0JLoC5LAs2Sfj9EoPGhGb+gIFVHz6Ia7JQWE2SJsOVFJD1wmg==} + '@cspell/dict-npm@5.2.41': + resolution: {integrity: sha512-To3xsfRmMBYVXtWVEdUgV35M9a/JZ54dSuoY6m6D3uHKKL3I326Wmy4xifZ3PU8MQaWhyEH7zbIcUEtKwTQMcA==} '@cspell/dict-php@4.1.1': resolution: {integrity: sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==} @@ -2143,8 +2150,8 @@ packages: '@cspell/dict-public-licenses@2.0.16': resolution: {integrity: sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==} - '@cspell/dict-python@4.2.26': - resolution: {integrity: sha512-hbjN6BjlSgZOG2dA2DtvYNGBM5Aq0i0dHaZjMOI9K/9vRicVvKbcCiBSSrR3b+jwjhQL5ff7HwG5xFaaci0GQA==} + '@cspell/dict-python@4.2.27': + resolution: {integrity: sha512-Rj6xQgYS4X6ienjgAZF+njA0GRY4oSPouJWv0vfikCTn6EWlfk0V6Dy1HP3Migj1O+IC2NmespgVq+BZNSp8OA==} '@cspell/dict-r@2.1.1': resolution: {integrity: sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==} @@ -2158,8 +2165,8 @@ packages: '@cspell/dict-scala@5.0.9': resolution: {integrity: sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==} - '@cspell/dict-shell@1.1.2': - resolution: {integrity: sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==} + '@cspell/dict-shell@1.2.0': + resolution: {integrity: sha512-PVctvT22lJ49niMiakO8xieY7ELCAzjSqhejWR7bAMb5AZ9F4WDEs+XdGMnoVHWeXq7K5rcepLPmEJb+37zzIw==} '@cspell/dict-software-terms@5.2.2': resolution: {integrity: sha512-0CaYd6TAsKtEoA7tNswm1iptEblTzEe3UG8beG2cpSTHk7afWIVMtJLgXDv0f/Li67Lf3Z1Jf3JeXR7GsJ2TRw==} @@ -2224,12 +2231,21 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@es-joy/jsdoccomment@0.52.0': resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} engines: {node: '>=20.11.0'} @@ -2500,8 +2516,8 @@ packages: resolution: {integrity: sha512-mp1mPYpV0zcbUVIZ2jlewXVhcRalKKrx6GvC2bVVphIgVxLPea7LV0Dz7TXCqTmSQTijOMeBt8+JGbIWsWDVYw==} hasBin: true - '@itwin/cloud-agnostic-core@3.0.5': - resolution: {integrity: sha512-REiRF1z1sVcMiwib2vcaOYxR527C9KJsEoX1AIRC0tA16fqCYnGoNM5Fn376UD6fEQOtyJvXxXgBBCS0qMmfeg==} + '@itwin/cloud-agnostic-core@3.1.1': + resolution: {integrity: sha512-G+iJrbrbcA0fPpl1Z8e5Srl/8E7omXDAiBBDujnhnF43PHxjK9kWBS7ZTFqn5qzGIbmoX7FPe2w7HefA+NToEg==} peerDependencies: inversify: ^7.5.2 reflect-metadata: ^0.2.2 @@ -2534,12 +2550,12 @@ packages: '@opentelemetry/api': optional: true + '@itwin/core-bentley@5.10.0': + resolution: {integrity: sha512-N+OPL3rAbI6zNmlqF/+K58XU9f4reirNWtvt3qUxRRgVV6HSA/DqvigApyPMLA9hQCrxfEPfsjFec/z05WnaBA==} + '@itwin/core-bentley@5.10.1': resolution: {integrity: sha512-wJj+Zzcd3DamN1jVRNtM91PnI0lXbC8IrgpcNlUH9suwUp+91epHPTgJOYq6/VSanNfQRE4Nq7j5h9cfH+X7hg==} - '@itwin/core-bentley@5.9.4': - resolution: {integrity: sha512-0zyHaz8ZmG7USwBZHjSXAvFTkpslO3eSSPS6pNU6I4aKhFTHACXk7p6uXgbY1Xkd74gl3SZn6O0k85Kv4LiTfw==} - '@itwin/core-common@5.10.1': resolution: {integrity: sha512-HRvlOs7l4Xwaz0aNfrsa5zOSSRj/Vn8CA5/3u1ksiJBSOCoZHo9ar3AF9z3CAKcY2rokqYPEnKq3yXa78o3NrA==} peerDependencies: @@ -2668,8 +2684,8 @@ packages: '@stratakit/mui': optional: true - '@itwin/object-storage-azure@3.0.5': - resolution: {integrity: sha512-PSVYU+2ML89qeH11/X01wy8GQiIOhsOR+WpO4paUV3/fkGkcL5Z/hS00U48y21hcRlpvd3k1OLDUWBAVN0soHA==} + '@itwin/object-storage-azure@3.1.1': + resolution: {integrity: sha512-Y0L4XIEwejvxvJFZeKGoO1/hvDvMx2THLXRtOo1fR7lApAq0opC7ae+xLFBTXNvCQ67fYszXabSgAd/iqZcEZw==} peerDependencies: inversify: ^7.5.2 reflect-metadata: ^0.2.2 @@ -2679,8 +2695,8 @@ packages: reflect-metadata: optional: true - '@itwin/object-storage-core@3.0.5': - resolution: {integrity: sha512-T6WKGQ0PM3H4hjpIepLuI1nTeFyTVUjOvZE0emJqhMZGyulQ+5zpwuT9SMSfJXOWSY7pQ+s2Sbdc1ykVvo+MOg==} + '@itwin/object-storage-core@3.1.1': + resolution: {integrity: sha512-xlffHd6ZHZZiqUckUyut9ifGJQcB02Gzg04p8Jj4+aHn3X3eEKT7Ebtmn4AL9jsogGFXCJfoW8cF+EojpnlW8A==} peerDependencies: inversify: ^7.5.2 reflect-metadata: ^0.2.2 @@ -2718,11 +2734,11 @@ packages: '@itwin/ecschema-metadata': 5.10.1 '@itwin/presentation-common': 5.10.1 - '@itwin/presentation-shared@1.2.13': - resolution: {integrity: sha512-nvc0gn+7PVlMbdlMJj+ddIWYthHinR64dsY9Fe6upx8HwbLNb4ANZoWZscWsnfJx0vntwnNBrH7B4webvUYpWw==} + '@itwin/presentation-shared@1.2.15': + resolution: {integrity: sha512-uYsczhgVuPZOOVGkoJjQdGjGO9lcbn4PR705FLISN8uE3P6fYUuf4F0OmgrdKANQxeXm2ttQ5n85pkRKhQGK3Q==} - '@itwin/unified-selection@1.7.4': - resolution: {integrity: sha512-rc4cfrzfE9kxyamAN+iRtgidw1XZYquLszgpwdxI6FLCgOyD8xnLpv2gOnQFZGxF3oDPpv/9Z8eqbm90d0iCBQ==} + '@itwin/unified-selection@1.7.5': + resolution: {integrity: sha512-NR8tzNHyooSm/+7fH+Zq1+88vXUgWH16Qk573DR9EG5uuD9oNktkCQrR0LR4+rnLEgFIKxSzihb2PpJzmLybbQ==} '@itwin/webgl-compatibility@5.10.1': resolution: {integrity: sha512-DLeFoEjHcDoM7NVSqx5Q67W2oWTLvAg6l9rpkiVwF+99jMalMGXOMXhy9uicVM1OcyZzWVNidXZOfKJ4MIUk5g==} @@ -2809,11 +2825,17 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@ngneat/falso@8.0.2': resolution: {integrity: sha512-vhPtuoHoxE5JGWPSPBqEyTXcjI4MAn8GllR+Vs8FfpAQu2sQRd4PJc3e8kc9vdbdhYHx1C9HmbECgtGLK30z4w==} - '@nodable/entities@2.1.0': - resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} + '@nodable/entities@2.1.1': + resolution: {integrity: sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2827,16 +2849,16 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oclif/core@4.11.3': - resolution: {integrity: sha512-gQCSYAtUhJilGKaSaZhqejH9X1dDu+jWQjLmtGOgN/XcKaAEPPSeT2mu1UvlvtPox1/NNRdlBcUa8KRKo2HnJQ==} + '@oclif/core@4.11.4': + resolution: {integrity: sha512-URwiQ5ALx/sJ2iH4vzXEd+H4K6NAI7LRs6Jag3hrgKEpGmaE6alfRC8qjO4GIgb6A3ACaJumqP9twi/M9ywdHQ==} engines: {node: '>=18.0.0'} - '@oclif/plugin-help@6.2.49': - resolution: {integrity: sha512-fEsO0YU7ThtzHE1RGuoHxFu/OGlqxm7PCfFp+U1PS8sde4E0cDqjVDuv78+VKrr45LpC5lWOApj7pm3FNfHrVA==} + '@oclif/plugin-help@6.2.50': + resolution: {integrity: sha512-rNCG4hUm+kPXFbhJfAVk/fZ3OdWJYwBDASlyX8CqOLP0MssjIGl7iEgfZz7TMuZFa+KucupKU5NRSc0KWfPTQA==} engines: {node: '>=18.0.0'} - '@oclif/plugin-not-found@3.2.86': - resolution: {integrity: sha512-BJhJSahwsYayZpo18f0fPTg8tKb9dIvydaz03NCK3eMfmcsT1MmXhXqh1KEV8J7mz0sQ6f0qFEb6BXy490/iUg==} + '@oclif/plugin-not-found@3.2.87': + resolution: {integrity: sha512-lKyZ4INrx5vB14HNWIkM6Vla/4rWVhOA2U7uCAj6gEBg36/KVmwYXxpZ9ckzZS0+jtLE84TVqS8NCYEhQiQojw==} engines: {node: '>=18.0.0'} '@oozcitak/dom@2.0.2': @@ -3117,8 +3139,8 @@ packages: '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} '@oxfmt/binding-android-arm-eabi@0.47.0': resolution: {integrity: sha512-KrMQRdMi/upr81qT4ijK6X6BNp6jqpMY7FwILQnwIy9QLc3qpnhUx5rsCLGzn4ewsCQ0CNAspN2ogmP1GXLyLw==} @@ -3394,8 +3416,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.1.3': + resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -3406,8 +3428,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.1.3': + resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -3418,8 +3440,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.1.3': + resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -3430,8 +3452,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.1.3': + resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -3442,8 +3464,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -3455,8 +3477,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.1.3': + resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3469,8 +3491,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.1.3': + resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3483,8 +3505,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.1.3': + resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] @@ -3497,8 +3519,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.1.3': + resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -3511,8 +3533,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.1.3': + resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3525,8 +3547,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.1.3': + resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3538,8 +3560,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.1.3': + resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -3549,8 +3571,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + '@rolldown/binding-wasm32-wasi@1.1.3': + resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] @@ -3560,8 +3582,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.1.3': + resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -3572,8 +3594,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.1.3': + resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3669,36 +3691,36 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} - '@smithy/core@3.24.4': - resolution: {integrity: sha512-3UNRKEyQyAgVgM0LGlerCLm+ChZWZ1GPfde+jBEW6bm6bSBGU1p0EbblaUV3unbhwvidjLA5Zs3sOs7mnZwvAw==} + '@smithy/core@3.24.6': + resolution: {integrity: sha512-wBXDRup6UU97VKyaiRo8AssnfStPtG0oAAfpq/bC0a1YYau8pM86YB4kM6ccoVi1mS8l/UHbn9oDM+7uozr/ug==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.3.4': - resolution: {integrity: sha512-vKW0MEFRU4Y3MkVZUkpJm+g9qyPGLCXhc0YLggUdSdBB4g7IaSSsCE75P9rBXyWHrXY1UYSQUl8/DwsTR7QciA==} + '@smithy/credential-provider-imds@4.3.8': + resolution: {integrity: sha512-5cAM+KZC02sTqDt6NaLXyu50M/GNMd1eTzDVR8Lb0BBsVtu7RWHo47VPPEEv1vt3Yub6uzr+M5FHC+GtoT0USg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.4.4': - resolution: {integrity: sha512-qM7AUKI4G6d7lNgaZD3lA1tWSolh5r6gcixfTZAPstVURfjIbvreVTPz+994M0yC3HbX4YYhDRgr31Xy3XwWOQ==} + '@smithy/fetch-http-handler@5.4.6': + resolution: {integrity: sha512-FEwEYJ1jlBKdhe9TPzfghEi1bP55ZeEImlDkEa62bBBYzUcnB6RUCyuiS2mqKt6ZVjUbBgcNhzfIctH+Hevx9g==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/middleware-compression@4.4.4': - resolution: {integrity: sha512-UQc9a/VURCccyQkdkvMijXZHqxnzFvSAsvPcl6jz+E3Y1TNiqQr2TIydqFGHIMfZIt3Pc9MPcWloZAbQMNB1cg==} + '@smithy/middleware-compression@4.4.6': + resolution: {integrity: sha512-wZQpnjrGSO2IFxhwWNaeRzHh2swSwRGWaCVgQN9zqYdtP98tcNYyqI7YvPeVTwf9CvQTas7xlmR3NY5L1i32mg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.7.4': - resolution: {integrity: sha512-HIeF+1vrDGzPkkv39Hj2vlHSXHY3p958jd/8ZnePIY6+ZOsQX8coyEUKO5yQu4r0bQIVsbpotVIrXXwyycMStQ==} + '@smithy/node-http-handler@4.7.7': + resolution: {integrity: sha512-ZAFvHXrEk6K180EVhmZVg8GU5pUH5BSFqRs27JW3j1qEFx9YyYwWFx17x/MHcjALYimGAji7qEOlF1++be+G5A==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.4.4': - resolution: {integrity: sha512-e5UtkMvsatzBfbeBZjEOt0k0Z3BEsjTFL/n6fdO5vtBLe67tdy0dX7xw2DU7uZ3acwoHyeCqpU2Fzb7pxwHb6Q==} + '@smithy/signature-v4@5.4.6': + resolution: {integrity: sha512-Ojg4B6oIDlIr1R86xCDJt1zJWnYa0VINmqdjfe9qxWjdRivHalZ3iSlQgVqYbW0MdpFOC5XfHEWsnbmdnpIILQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.14.2': - resolution: {integrity: sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==} + '@smithy/types@4.14.3': + resolution: {integrity: sha512-YupL0ZWmFtJexUN2cHzkvvF/b9pKrtAIfT1o7/oY/Ppu8IYeZ+lDPM5vZdQJaSeA132dJCqojjGC9NhXeF71VQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': @@ -3732,8 +3754,8 @@ packages: react-dom: optional: true - '@stratakit/icons@0.3.1': - resolution: {integrity: sha512-XoknUUozCn82lSHKP7vpqsMkz0H6TWmkciBG6rJirhX3nl+ers7xahFgvwCuEvXDf1MFeD44aGWvmZ9S5+HUug==} + '@stratakit/icons@0.3.2': + resolution: {integrity: sha512-MXwpKADbIYZjDu5Cb29GeleqXp5kSInuAzp/ZMN30bhMxCjVeKufDHFMlf/5xYQuo4ierceDpz9fZt5wyQix+g==} '@stratakit/structures@0.5.7': resolution: {integrity: sha512-yLiWFIrV9838Kc4ulEpVnKOC+hgGDRRQAdYJC8i+dd3qhTIGkrzNzUIIypd0wcdTjdt5n/BeBBZxzLEDsciKuA==} @@ -3747,8 +3769,8 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -3761,8 +3783,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.13.25': - resolution: {integrity: sha512-bmNoqMu6gcAW9JGrKVB0Q1tN1i5RONZF8r1fW0bbE4Oyf3DwEGnzzQJ2OW+Ozg1P4s8PyugkHg2ULZoFQN+cqw==} + '@tanstack/react-virtual@3.14.2': + resolution: {integrity: sha512-IpWnmCLvuymRfeeLNVXIzNEYBFLpd3drVIS91sqV78VTZFyldlChkOocZRCPp1B+Wnk09bcLNme8WaMU/9/9bQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3771,8 +3793,8 @@ packages: resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.15.0': - resolution: {integrity: sha512-0AwPGx0I8QxPYjAxShT/+z+ZOe9u8mW5rsXvivCTjRfRmz9a43+3mRyi4wwlyoUqOC56q/jatKa0Bh9M99BEHQ==} + '@tanstack/virtual-core@3.17.0': + resolution: {integrity: sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -3805,6 +3827,9 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -3869,14 +3894,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.19.19': - resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} + '@types/node@22.19.20': + resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==} - '@types/node@24.12.4': - resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} - - '@types/node@24.13.2': - resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} + '@types/node@24.13.1': + resolution: {integrity: sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==} '@types/object-hash@3.0.6': resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} @@ -3916,67 +3938,67 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.59.4': - resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.4 + '@typescript-eslint/parser': ^8.60.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.4': - resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.4': - resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.4': - resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.4': - resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.4': - resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.4': - resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.4': - resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.4': - resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.4': - resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/ts-http-runtime@0.3.5': - resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} + '@typespec/ts-http-runtime@0.3.6': + resolution: {integrity: sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==} engines: {node: '>=20.0.0'} '@upstash/redis@1.38.0': @@ -3995,31 +4017,31 @@ packages: babel-plugin-react-compiler: optional: true - '@vitest/browser-playwright@4.1.8': - resolution: {integrity: sha512-SR7FqgegaexEg73xvf3ArtygXegagMdXnL0EZMpxrWvvhQxvicD/E8p0ib0J91riPRtQUViyh67Xjw3NqvyhVg==} + '@vitest/browser-playwright@4.1.9': + resolution: {integrity: sha512-Bq1rOGf9waevzG3EOkO/dene6bvKTUsZMVg8S1i+WH3JcMjuXEjiahP9rAqZRELUqjBySOJsvvSWqK/B3wjKQw==} peerDependencies: playwright: '*' - vitest: 4.1.8 + vitest: 4.1.9 - '@vitest/browser@4.1.8': - resolution: {integrity: sha512-u21VzX07HzlJYpFgkxmjEXar/tG2UqWGgyGG/46SrrPc7rSdCTPw5vuowopO9CIqF8UCUQzDFdbVnNpw6N0BfQ==} + '@vitest/browser@4.1.9': + resolution: {integrity: sha512-j1BKtWmPcqpMhmx/L9EPLgAJpCb0zKfwoWLmqBbxaogCXHjOwHFSEoHCBfnGtx93xKQwilZ26m+UOsHqHMkRNg==} peerDependencies: - vitest: 4.1.8 + vitest: 4.1.9 - '@vitest/coverage-v8@4.1.8': - resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} + '@vitest/coverage-v8@4.1.9': + resolution: {integrity: sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==} peerDependencies: - '@vitest/browser': 4.1.8 - vitest: 4.1.8 + '@vitest/browser': 4.1.9 + vitest: 4.1.9 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.8': - resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.8': - resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4029,35 +4051,35 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.8': - resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@4.1.8': - resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.8': - resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.8': - resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@4.1.8': - resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} - '@vue/compiler-core@3.5.34': - resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + '@vue/compiler-core@3.5.35': + resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} - '@vue/compiler-dom@3.5.34': - resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + '@vue/compiler-dom@3.5.35': + resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} - '@vue/compiler-sfc@3.5.34': - resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + '@vue/compiler-sfc@3.5.35': + resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} - '@vue/compiler-ssr@3.5.34': - resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + '@vue/compiler-ssr@3.5.35': + resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} - '@vue/shared@3.5.34': - resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + '@vue/shared@3.5.35': + resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -4155,8 +4177,8 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} - ansis@4.3.0: - resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} anymatch@3.1.3: @@ -4279,8 +4301,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@1.0.0: - resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -4299,12 +4321,12 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.11.4: - resolution: {integrity: sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==} + axe-core@4.12.0: + resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} engines: {node: '>=4'} - axios@1.16.1: - resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + axios@1.17.0: + resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -4327,8 +4349,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.30: - resolution: {integrity: sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==} + baseline-browser-mapping@2.10.34: + resolution: {integrity: sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==} engines: {node: '>=6.0.0'} hasBin: true @@ -4370,11 +4392,11 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} @@ -4460,8 +4482,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001797: + resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -4949,8 +4971,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.4.5: - resolution: {integrity: sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==} + dompurify@3.4.8: + resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==} domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -4995,8 +5017,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.358: - resolution: {integrity: sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==} + electron-to-chromium@1.5.368: + resolution: {integrity: sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==} electron@39.8.10: resolution: {integrity: sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ==} @@ -5033,8 +5055,8 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - enhanced-resolve@5.22.0: - resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} + enhanced-resolve@5.23.0: + resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -5109,8 +5131,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.47.0: - resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -5156,8 +5178,8 @@ packages: eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + eslint-module-utils@2.13.0: + resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -5684,8 +5706,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - happy-dom@20.10.2: - resolution: {integrity: sha512-5p9Sxis3eowDJKqx90QCsgbNA02XXqJ59NOHvD4V6cxp+rP4d/xOyVx7uY3hS8hiUbY1VeiFH8lbJ81AyuDVLQ==} + happy-dom@20.10.6: + resolution: {integrity: sha512-6QD0ilzDDt93tX44y8tbmZdAcdTRYDhUP+Asgi6pC8Pp5IA3cvaZGyoVN/EGtlq9ziT65iPuBBn3ASLr6hCgVw==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -5719,8 +5741,8 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} he@1.2.0: @@ -5790,8 +5812,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.3: - resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} hasBin: true human-signals@5.0.0: @@ -5838,8 +5860,8 @@ packages: immer@10.2.0: resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - immutable@5.1.5: - resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + immutable@5.1.6: + resolution: {integrity: sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -6151,8 +6173,8 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true jsdoc-type-pratt-parser@4.1.0: @@ -6332,8 +6354,8 @@ packages: linkify-it@2.2.0: resolution: {integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} lint-staged@15.5.2: resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} @@ -6423,8 +6445,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.0: - resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6455,8 +6477,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} hasBin: true markdown-link-check@3.14.2: @@ -6700,8 +6722,9 @@ packages: encoding: optional: true - node-releases@2.0.44: - resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} node-source-walk@7.0.2: resolution: {integrity: sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==} @@ -6778,8 +6801,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.2: + resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} + engines: {node: '>=12.20.0'} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -7001,8 +7025,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + pidtree@0.6.1: + resolution: {integrity: sha512-e0F9AOF1JMrCfBsyJOwU9lNvQ0WtXTq0j/4jk0BQ5JSI9VAybPXmDpPRw/2FQ3e5d3ZFN1mLh7jW99m/jjaptw==} engines: {node: '>=0.10'} hasBin: true @@ -7019,11 +7043,21 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} + engines: {node: '>=18'} + hasBin: true + playwright@1.59.1: resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} engines: {node: '>=18'} hasBin: true + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + engines: {node: '>=18'} + hasBin: true + pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} @@ -7077,12 +7111,12 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protobufjs@7.6.1: - resolution: {integrity: sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==} + protobufjs@7.6.2: + resolution: {integrity: sha512-N9EiLovGEQOJSPF26Ij7qUGvahfEnq0eeYZ02aigIedkmz1qZSwjnP9SBITHJuF/6MYbIW4HDN8zdYjsjqJKXQ==} engines: {node: '>=12.0.0'} - protobufjs@8.4.2: - resolution: {integrity: sha512-64rfNzkWOZAIazXzpBFPWq6F9up6gMvTzjE2oWIzApx2N/dqVUEE7+bCn2+40780dFVtKOUab8QfxJ6KJDWbqA==} + protobufjs@8.6.1: + resolution: {integrity: sha512-s4qQPr4pU0W95iYnUInh95skjIg+3aM2sakYsw60QYanU+qWRDY2zQxOAQV6zU7ROJpSNDG9B+VSmk4dqdWWSA==} engines: {node: '>=12.0.0'} protocols@2.0.2: @@ -7184,8 +7218,8 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-redux@9.2.0: - resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} + react-redux@9.3.0: + resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} peerDependencies: '@types/react': ^18.2.25 || ^19 react: ^18.0 || ^19 @@ -7365,8 +7399,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.1.3: + resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7448,8 +7482,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.2: + resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} engines: {node: '>=10'} hasBin: true @@ -7665,12 +7699,12 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -7764,14 +7798,10 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.2: - resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -7908,8 +7938,8 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typedoc-plugin-merge-modules@7.0.0: @@ -7962,14 +7992,11 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.25.0: - resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + undici@7.27.2: + resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} engines: {node: '>=20.18.1'} unicode-trie@2.0.0: @@ -8051,13 +8078,13 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.1.0: + resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -8108,20 +8135,20 @@ packages: '@types/react-dom': optional: true - vitest@4.1.8: - resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.8 - '@vitest/browser-preview': 4.1.8 - '@vitest/browser-webdriverio': 4.1.8 - '@vitest/coverage-istanbul': 4.1.8 - '@vitest/coverage-v8': 4.1.8 - '@vitest/ui': 4.1.8 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -8192,8 +8219,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -8385,8 +8412,8 @@ packages: react: optional: true - zustand@5.0.13: - resolution: {integrity: sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==} + zustand@5.0.14: + resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -8405,22 +8432,48 @@ packages: snapshots: - '@ariakit/core@0.4.20': {} + '@ariakit/components@0.1.2': + dependencies: + '@ariakit/store': 0.1.2 + '@ariakit/utils': 0.1.2 - '@ariakit/react-core@0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@ariakit/react-components@0.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@ariakit/core': 0.4.20 + '@ariakit/components': 0.1.2 + '@ariakit/react-store': 0.1.2(react@19.2.7) + '@ariakit/react-utils': 0.1.2(react@19.2.7) + '@ariakit/store': 0.1.2 + '@ariakit/utils': 0.1.2 '@floating-ui/dom': 1.7.6 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) + + '@ariakit/react-store@0.1.2(react@19.2.7)': + dependencies: + '@ariakit/react-utils': 0.1.2(react@19.2.7) + '@ariakit/store': 0.1.2 + '@ariakit/utils': 0.1.2 + react: 19.2.7 use-sync-external-store: 1.6.0(react@19.2.7) - '@ariakit/react@0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@ariakit/react-utils@0.1.2(react@19.2.7)': dependencies: - '@ariakit/react-core': 0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ariakit/store': 0.1.2 + '@ariakit/utils': 0.1.2 + react: 19.2.7 + + '@ariakit/react@0.4.29(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@ariakit/react-components': 0.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) + '@ariakit/store@0.1.2': + dependencies: + '@ariakit/utils': 0.1.2 + + '@ariakit/utils@0.1.2': {} + '@artilleryio/int-commons@2.22.0': dependencies: async: 2.6.4 @@ -8459,7 +8512,7 @@ snapshots: https-proxy-agent: 5.0.1 lodash: 4.18.1 ms: 2.1.3 - protobufjs: 7.6.1 + protobufjs: 7.6.2 socket.io-client: 4.8.3 socketio-wildcard: 2.0.0 tough-cookie: 5.1.2 @@ -8472,26 +8525,26 @@ snapshots: '@artilleryio/sketches-js@2.1.1': dependencies: - protobufjs: 7.6.1 + protobufjs: 7.6.2 '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.9 + '@aws-sdk/types': 3.973.11 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.9 + '@aws-sdk/types': 3.973.12 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.9 - '@aws-sdk/util-locate-window': 3.965.5 + '@aws-sdk/types': 3.973.12 + '@aws-sdk/util-locate-window': 3.965.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -8500,15 +8553,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.9 - '@aws-sdk/util-locate-window': 3.965.5 + '@aws-sdk/types': 3.973.11 + '@aws-sdk/util-locate-window': 3.965.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.9 + '@aws-sdk/types': 3.973.11 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -8517,401 +8570,382 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.9 + '@aws-sdk/types': 3.973.11 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cloudwatch-logs@3.1053.0': + '@aws-sdk/checksums@3.1000.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 + tslib: 2.8.1 + + '@aws-sdk/client-cloudwatch-logs@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-cloudwatch@3.1053.0': + '@aws-sdk/client-cloudwatch@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/middleware-compression': 4.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/middleware-compression': 4.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.1053.0': + '@aws-sdk/client-cognito-identity@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-ec2@3.1053.0': + '@aws-sdk/client-ec2@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/middleware-sdk-ec2': 3.972.27 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/middleware-sdk-ec2': 3.972.32 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-ecs@3.1053.0': + '@aws-sdk/client-ecs@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-iam@3.1053.0': + '@aws-sdk/client-iam@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-lambda@3.1053.0': + '@aws-sdk/client-lambda@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1053.0': + '@aws-sdk/client-s3@3.1063.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/middleware-bucket-endpoint': 3.972.15 - '@aws-sdk/middleware-expect-continue': 3.972.13 - '@aws-sdk/middleware-flexible-checksums': 3.974.21 - '@aws-sdk/middleware-location-constraint': 3.972.11 - '@aws-sdk/middleware-sdk-s3': 3.972.42 - '@aws-sdk/middleware-ssec': 3.972.11 - '@aws-sdk/signature-v4-multi-region': 3.996.28 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.19 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/middleware-flexible-checksums': 3.974.27 + '@aws-sdk/middleware-sdk-s3': 3.972.48 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-sqs@3.1053.0': + '@aws-sdk/client-sqs@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/middleware-sdk-sqs': 3.972.25 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/middleware-sdk-sqs': 3.972.29 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-ssm@3.1053.0': + '@aws-sdk/client-ssm@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-sts@3.1053.0': + '@aws-sdk/client-sts@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/signature-v4-multi-region': 3.996.28 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/core@3.974.13': + '@aws-sdk/core@3.974.18': dependencies: - '@aws-sdk/types': 3.973.9 - '@aws-sdk/xml-builder': 3.972.25 + '@aws-sdk/types': 3.973.11 + '@aws-sdk/xml-builder': 3.972.29 '@aws/lambda-invoke-store': 0.2.4 - '@smithy/core': 3.24.4 - '@smithy/signature-v4': 5.4.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/crc64-nvme@3.972.9': + '@aws-sdk/core@3.974.19': dependencies: - '@smithy/types': 4.14.2 + '@aws-sdk/types': 3.973.12 + '@aws-sdk/xml-builder': 3.972.29 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/core': 3.24.6 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 + bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.972.36': + '@aws-sdk/credential-provider-cognito-identity@3.972.42': dependencies: - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.39': + '@aws-sdk/credential-provider-env@3.972.44': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.41': + '@aws-sdk/credential-provider-http@3.972.46': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.43': - dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-env': 3.972.39 - '@aws-sdk/credential-provider-http': 3.972.41 - '@aws-sdk/credential-provider-login': 3.972.43 - '@aws-sdk/credential-provider-process': 3.972.39 - '@aws-sdk/credential-provider-sso': 3.972.43 - '@aws-sdk/credential-provider-web-identity': 3.972.43 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/credential-provider-imds': 4.3.4 - '@smithy/types': 4.14.2 + '@aws-sdk/credential-provider-ini@3.972.50': + dependencies: + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-env': 3.972.44 + '@aws-sdk/credential-provider-http': 3.972.46 + '@aws-sdk/credential-provider-login': 3.972.49 + '@aws-sdk/credential-provider-process': 3.972.44 + '@aws-sdk/credential-provider-sso': 3.972.49 + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/credential-provider-imds': 4.3.8 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-login@3.972.43': + '@aws-sdk/credential-provider-login@3.972.49': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.44': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.39 - '@aws-sdk/credential-provider-http': 3.972.41 - '@aws-sdk/credential-provider-ini': 3.972.43 - '@aws-sdk/credential-provider-process': 3.972.39 - '@aws-sdk/credential-provider-sso': 3.972.43 - '@aws-sdk/credential-provider-web-identity': 3.972.43 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/credential-provider-imds': 4.3.4 - '@smithy/types': 4.14.2 + '@aws-sdk/credential-provider-node@3.972.52': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.44 + '@aws-sdk/credential-provider-http': 3.972.46 + '@aws-sdk/credential-provider-ini': 3.972.50 + '@aws-sdk/credential-provider-process': 3.972.44 + '@aws-sdk/credential-provider-sso': 3.972.49 + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/credential-provider-imds': 4.3.8 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.39': + '@aws-sdk/credential-provider-process@3.972.44': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.43': + '@aws-sdk/credential-provider-sso@3.972.49': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/token-providers': 3.1052.0 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/token-providers': 3.1063.0 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.43': + '@aws-sdk/credential-provider-web-identity@3.972.49': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 - tslib: 2.8.1 - - '@aws-sdk/credential-providers@3.1053.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.1053.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/credential-provider-cognito-identity': 3.972.36 - '@aws-sdk/credential-provider-env': 3.972.39 - '@aws-sdk/credential-provider-http': 3.972.41 - '@aws-sdk/credential-provider-ini': 3.972.43 - '@aws-sdk/credential-provider-login': 3.972.43 - '@aws-sdk/credential-provider-node': 3.972.44 - '@aws-sdk/credential-provider-process': 3.972.39 - '@aws-sdk/credential-provider-sso': 3.972.43 - '@aws-sdk/credential-provider-web-identity': 3.972.43 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/credential-provider-imds': 4.3.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.972.15': - dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.972.13': - dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.974.21': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/crc64-nvme': 3.972.9 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/credential-providers@3.1063.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.1063.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-cognito-identity': 3.972.42 + '@aws-sdk/credential-provider-env': 3.972.44 + '@aws-sdk/credential-provider-http': 3.972.46 + '@aws-sdk/credential-provider-ini': 3.972.50 + '@aws-sdk/credential-provider-login': 3.972.49 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/credential-provider-process': 3.972.44 + '@aws-sdk/credential-provider-sso': 3.972.49 + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/credential-provider-imds': 4.3.8 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.11': + '@aws-sdk/middleware-flexible-checksums@3.974.27': dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/types': 4.14.2 + '@aws-sdk/checksums': 3.1000.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-ec2@3.972.27': + '@aws-sdk/middleware-sdk-ec2@3.972.32': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/signature-v4': 5.4.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.42': + '@aws-sdk/middleware-sdk-s3@3.972.48': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/signature-v4-multi-region': 3.996.28 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/signature-v4': 5.4.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.12 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-sqs@3.972.25': + '@aws-sdk/middleware-sdk-sqs@3.972.29': dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.11': + '@aws-sdk/nested-clients@3.997.17': dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/types': 4.14.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.11': + '@aws-sdk/signature-v4-multi-region@3.996.32': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.13 - '@aws-sdk/signature-v4-multi-region': 3.996.28 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/fetch-http-handler': 5.4.4 - '@smithy/node-http-handler': 4.7.4 - '@smithy/types': 4.14.2 + '@aws-sdk/types': 3.973.11 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.28': + '@aws-sdk/token-providers@3.1063.0': dependencies: - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/signature-v4': 5.4.4 - '@smithy/types': 4.14.2 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1052.0': + '@aws-sdk/types@3.973.11': dependencies: - '@aws-sdk/core': 3.974.13 - '@aws-sdk/nested-clients': 3.997.11 - '@aws-sdk/types': 3.973.9 - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/types@3.973.9': + '@aws-sdk/types@3.973.12': dependencies: - '@smithy/types': 4.14.2 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.5': + '@aws-sdk/util-locate-window@3.965.6': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.25': + '@aws-sdk/xml-builder@3.972.29': dependencies: - '@nodable/entities': 2.1.0 - '@smithy/types': 4.14.2 + '@smithy/types': 4.14.3 fast-xml-parser: 5.7.3 tslib: 2.8.1 @@ -8929,10 +8963,10 @@ snapshots: dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 + '@azure/core-client': 1.10.2 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-rest-pipeline': 1.24.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -8945,11 +8979,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/core-client@1.10.1': + '@azure/core-client@1.10.2': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -8957,11 +8991,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/core-http-compat@2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0)': + '@azure/core-http-compat@2.4.0(@azure/core-client@1.10.2)(@azure/core-rest-pipeline@1.24.0)': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-client': 1.10.2 + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-lro@2.7.2': dependencies: @@ -8976,14 +9010,14 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-rest-pipeline@1.23.0': + '@azure/core-rest-pipeline@1.24.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.5 + '@typespec/ts-http-runtime': 0.3.6 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -8995,7 +9029,7 @@ snapshots: '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.5 + '@typespec/ts-http-runtime': 0.3.6 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -9009,13 +9043,13 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-client': 1.10.2 + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.11.0 - '@azure/msal-node': 5.2.2 + '@azure/msal-browser': 5.12.0 + '@azure/msal-node': 5.2.3 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -9023,47 +9057,47 @@ snapshots: '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.5 + '@typespec/ts-http-runtime': 0.3.6 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.11.0': + '@azure/msal-browser@5.12.0': dependencies: - '@azure/msal-common': 16.6.2 + '@azure/msal-common': 16.7.0 - '@azure/msal-common@16.6.2': {} + '@azure/msal-common@16.7.0': {} - '@azure/msal-node@5.2.2': + '@azure/msal-node@5.2.3': dependencies: - '@azure/msal-common': 16.6.2 + '@azure/msal-common': 16.7.0 jsonwebtoken: 9.0.3 - '@azure/storage-blob@12.31.0': + '@azure/storage-blob@12.32.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 - '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0) + '@azure/core-client': 1.10.2 + '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.2)(@azure/core-rest-pipeline@1.24.0) '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.1 '@azure/logger': 1.3.0 - '@azure/storage-common': 12.3.0(@azure/core-client@1.10.1) + '@azure/storage-common': 12.4.0(@azure/core-client@1.10.2) events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/storage-common@12.3.0(@azure/core-client@1.10.1)': + '@azure/storage-common@12.4.0(@azure/core-client@1.10.2)': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0) - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.2)(@azure/core-rest-pipeline@1.24.0) + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -9073,42 +9107,42 @@ snapshots: - '@azure/core-client' - supports-color - '@azure/storage-queue@12.29.0': + '@azure/storage-queue@12.30.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 - '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0) + '@azure/core-client': 1.10.2 + '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.2)(@azure/core-rest-pipeline@1.24.0) '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-rest-pipeline': 1.24.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.1 '@azure/logger': 1.3.0 - '@azure/storage-common': 12.3.0(@azure/core-client@1.10.1) + '@azure/storage-common': 12.4.0(@azure/core-client@1.10.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -9118,10 +9152,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.7': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -9135,83 +9169,83 @@ snapshots: '@types/jsesc': 2.5.1 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-string-parser@8.0.0-rc.5': {} + '@babel/helper-string-parser@8.0.0-rc.6': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-identifier@8.0.0-rc.3': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/parser@7.29.3': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/parser@8.0.0-rc.3': dependencies: '@babel/types': 8.0.0-rc.3 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@babel/types@8.0.0-rc.3': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.5 + '@babel/helper-string-parser': 8.0.0-rc.6 '@babel/helper-validator-identifier': 8.0.0-rc.3 '@bcoe/v8-coverage@1.0.2': {} @@ -9238,7 +9272,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.8.1 + semver: 7.8.2 '@changesets/assemble-release-plan@6.0.10': dependencies: @@ -9247,13 +9281,13 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.8.1 + semver: 7.8.2 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.31.0(@types/node@24.13.2)': + '@changesets/cli@2.31.0(@types/node@24.13.1)': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -9269,7 +9303,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@24.13.2) + '@inquirer/external-editor': 1.0.3(@types/node@24.13.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -9278,7 +9312,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.8.1 + semver: 7.8.2 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -9304,7 +9338,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.8.1 + semver: 7.8.2 '@changesets/get-release-plan@4.0.16': dependencies: @@ -9332,7 +9366,7 @@ snapshots: '@changesets/parse@0.4.3': dependencies: '@changesets/types': 6.1.0 - js-yaml: 4.1.1 + js-yaml: 4.2.0 '@changesets/pre@2.0.2': dependencies: @@ -9364,7 +9398,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.3 + human-id: 4.2.0 prettier: 2.8.8 '@colors/colors@1.5.0': @@ -9375,21 +9409,21 @@ snapshots: '@cspell/dict-ada': 4.1.1 '@cspell/dict-al': 1.1.1 '@cspell/dict-aws': 4.0.17 - '@cspell/dict-bash': 4.2.2 + '@cspell/dict-bash': 4.2.3 '@cspell/dict-companies': 3.2.11 '@cspell/dict-cpp': 7.0.2 '@cspell/dict-cryptocurrencies': 5.0.5 '@cspell/dict-csharp': 4.0.8 - '@cspell/dict-css': 4.1.1 + '@cspell/dict-css': 4.1.2 '@cspell/dict-dart': 2.3.2 - '@cspell/dict-data-science': 2.0.13 + '@cspell/dict-data-science': 2.0.14 '@cspell/dict-django': 4.1.6 '@cspell/dict-docker': 1.1.17 '@cspell/dict-dotnet': 5.0.13 '@cspell/dict-elixir': 4.0.8 '@cspell/dict-en-common-misspellings': 2.1.12 - '@cspell/dict-en-gb-mit': 3.1.22 - '@cspell/dict-en_us': 4.4.33 + '@cspell/dict-en-gb-mit': 3.1.24 + '@cspell/dict-en_us': 4.4.35 '@cspell/dict-filetypes': 3.0.18 '@cspell/dict-flutter': 1.1.1 '@cspell/dict-fonts': 4.0.6 @@ -9410,19 +9444,19 @@ snapshots: '@cspell/dict-lorem-ipsum': 4.0.5 '@cspell/dict-lua': 4.0.8 '@cspell/dict-makefile': 1.0.5 - '@cspell/dict-markdown': 2.0.16(@cspell/dict-css@4.1.1)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.15)(@cspell/dict-typescript@3.2.3) + '@cspell/dict-markdown': 2.0.17(@cspell/dict-css@4.1.2)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.15)(@cspell/dict-typescript@3.2.3) '@cspell/dict-monkeyc': 1.0.12 '@cspell/dict-node': 5.0.9 - '@cspell/dict-npm': 5.2.38 + '@cspell/dict-npm': 5.2.41 '@cspell/dict-php': 4.1.1 '@cspell/dict-powershell': 5.0.15 '@cspell/dict-public-licenses': 2.0.16 - '@cspell/dict-python': 4.2.26 + '@cspell/dict-python': 4.2.27 '@cspell/dict-r': 2.1.1 '@cspell/dict-ruby': 5.1.1 '@cspell/dict-rust': 4.1.2 '@cspell/dict-scala': 5.0.9 - '@cspell/dict-shell': 1.1.2 + '@cspell/dict-shell': 1.2.0 '@cspell/dict-software-terms': 5.2.2 '@cspell/dict-sql': 2.2.1 '@cspell/dict-svelte': 1.0.7 @@ -9458,9 +9492,9 @@ snapshots: '@cspell/dict-aws@4.0.17': {} - '@cspell/dict-bash@4.2.2': + '@cspell/dict-bash@4.2.3': dependencies: - '@cspell/dict-shell': 1.1.2 + '@cspell/dict-shell': 1.2.0 '@cspell/dict-companies@3.2.11': {} @@ -9470,11 +9504,11 @@ snapshots: '@cspell/dict-csharp@4.0.8': {} - '@cspell/dict-css@4.1.1': {} + '@cspell/dict-css@4.1.2': {} '@cspell/dict-dart@2.3.2': {} - '@cspell/dict-data-science@2.0.13': {} + '@cspell/dict-data-science@2.0.14': {} '@cspell/dict-django@4.1.6': {} @@ -9486,9 +9520,9 @@ snapshots: '@cspell/dict-en-common-misspellings@2.1.12': {} - '@cspell/dict-en-gb-mit@3.1.22': {} + '@cspell/dict-en-gb-mit@3.1.24': {} - '@cspell/dict-en_us@4.4.33': {} + '@cspell/dict-en_us@4.4.35': {} '@cspell/dict-filetypes@3.0.18': {} @@ -9530,9 +9564,9 @@ snapshots: '@cspell/dict-makefile@1.0.5': {} - '@cspell/dict-markdown@2.0.16(@cspell/dict-css@4.1.1)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.15)(@cspell/dict-typescript@3.2.3)': + '@cspell/dict-markdown@2.0.17(@cspell/dict-css@4.1.2)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.15)(@cspell/dict-typescript@3.2.3)': dependencies: - '@cspell/dict-css': 4.1.1 + '@cspell/dict-css': 4.1.2 '@cspell/dict-html': 4.0.15 '@cspell/dict-html-symbol-entities': 4.0.5 '@cspell/dict-typescript': 3.2.3 @@ -9541,7 +9575,7 @@ snapshots: '@cspell/dict-node@5.0.9': {} - '@cspell/dict-npm@5.2.38': {} + '@cspell/dict-npm@5.2.41': {} '@cspell/dict-php@4.1.1': {} @@ -9549,9 +9583,9 @@ snapshots: '@cspell/dict-public-licenses@2.0.16': {} - '@cspell/dict-python@4.2.26': + '@cspell/dict-python@4.2.27': dependencies: - '@cspell/dict-data-science': 2.0.13 + '@cspell/dict-data-science': 2.0.14 '@cspell/dict-r@2.1.1': {} @@ -9561,7 +9595,7 @@ snapshots: '@cspell/dict-scala@5.0.9': {} - '@cspell/dict-shell@1.1.2': {} + '@cspell/dict-shell@1.2.0': {} '@cspell/dict-software-terms@5.2.2': {} @@ -9595,7 +9629,7 @@ snapshots: '@datadog/datadog-api-client@1.58.0': dependencies: '@types/buffer-from': 1.1.3 - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/pako': 1.0.7 buffer-from: 1.1.2 cross-fetch: 3.2.0 @@ -9632,20 +9666,36 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@es-joy/jsdoccomment@0.52.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.60.1 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -9681,7 +9731,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.2.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -9738,7 +9788,7 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.6.1 + protobufjs: 7.6.2 yargs: 17.7.2 '@hapi/hoek@9.3.0': {} @@ -9765,128 +9815,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@24.13.2)': + '@inquirer/checkbox@4.3.2(@types/node@24.13.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/confirm@5.1.21(@types/node@24.13.2)': + '@inquirer/confirm@5.1.21(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/core@10.3.2(@types/node@24.13.2)': + '@inquirer/core@10.3.2(@types/node@24.13.1)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.1) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/editor@4.2.23(@types/node@24.13.2)': + '@inquirer/editor@4.2.23(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/external-editor': 1.0.3(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/external-editor': 1.0.3(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/expand@4.0.23(@types/node@24.13.2)': + '@inquirer/expand@4.0.23(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/external-editor@1.0.3(@types/node@24.13.2)': + '@inquirer/external-editor@1.0.3(@types/node@24.13.1)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@24.13.2)': + '@inquirer/input@4.3.1(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/number@3.0.23(@types/node@24.13.2)': + '@inquirer/number@3.0.23(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/password@4.0.23(@types/node@24.13.2)': + '@inquirer/password@4.0.23(@types/node@24.13.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 - - '@inquirer/prompts@7.10.1(@types/node@24.13.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.13.2) - '@inquirer/confirm': 5.1.21(@types/node@24.13.2) - '@inquirer/editor': 4.2.23(@types/node@24.13.2) - '@inquirer/expand': 4.0.23(@types/node@24.13.2) - '@inquirer/input': 4.3.1(@types/node@24.13.2) - '@inquirer/number': 3.0.23(@types/node@24.13.2) - '@inquirer/password': 4.0.23(@types/node@24.13.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.13.2) - '@inquirer/search': 3.2.2(@types/node@24.13.2) - '@inquirer/select': 4.4.2(@types/node@24.13.2) + '@types/node': 24.13.1 + + '@inquirer/prompts@7.10.1(@types/node@24.13.1)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.13.1) + '@inquirer/confirm': 5.1.21(@types/node@24.13.1) + '@inquirer/editor': 4.2.23(@types/node@24.13.1) + '@inquirer/expand': 4.0.23(@types/node@24.13.1) + '@inquirer/input': 4.3.1(@types/node@24.13.1) + '@inquirer/number': 3.0.23(@types/node@24.13.1) + '@inquirer/password': 4.0.23(@types/node@24.13.1) + '@inquirer/rawlist': 4.1.11(@types/node@24.13.1) + '@inquirer/search': 3.2.2(@types/node@24.13.1) + '@inquirer/select': 4.4.2(@types/node@24.13.1) optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/rawlist@4.1.11(@types/node@24.13.2)': + '@inquirer/rawlist@4.1.11(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) + '@inquirer/type': 3.0.10(@types/node@24.13.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/search@3.2.2(@types/node@24.13.2)': + '@inquirer/search@3.2.2(@types/node@24.13.1)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/select@4.4.2(@types/node@24.13.2)': + '@inquirer/select@4.4.2(@types/node@24.13.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.13.2) + '@inquirer/core': 10.3.2(@types/node@24.13.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.13.2) + '@inquirer/type': 3.0.10(@types/node@24.13.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@inquirer/type@3.0.10(@types/node@24.13.2)': + '@inquirer/type@3.0.10(@types/node@24.13.1)': optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 '@isaacs/cliui@8.0.2': dependencies: @@ -9903,7 +9953,7 @@ snapshots: dependencies: '@itwin/core-bentley': 5.10.1 - '@itwin/appui-react@5.32.0(98fb7dbb86d43692508a053a70c5d069)': + '@itwin/appui-react@5.32.0(c3c6c5b8fa18d878b25b0052bade2977)': dependencies: '@itwin/appui-abstract': 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/components-react': 5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/core-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -9923,7 +9973,7 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) react-error-boundary: 5.0.0(react@19.2.7) - react-redux: 9.2.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) react-transition-group: 4.4.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) redux: 5.0.1 rxjs: 7.8.2 @@ -9932,9 +9982,9 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@itwin/build-tools@5.10.1(@types/node@24.13.2)': + '@itwin/build-tools@5.10.1(@types/node@24.13.1)': dependencies: - '@microsoft/api-extractor': 7.58.7(@types/node@24.13.2) + '@microsoft/api-extractor': 7.58.7(@types/node@24.13.1) chalk: 3.0.0 cpx2: 8.0.2 cross-spawn: 7.0.6 @@ -9945,7 +9995,7 @@ snapshots: rimraf: 6.1.3 tree-kill: 1.2.2 typedoc: 0.28.19(typescript@5.6.3) - typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@6.0.3)) + typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.6.3)) typescript: 5.6.3 wtfnode: 0.9.4 yargs: 17.7.2 @@ -9953,7 +10003,7 @@ snapshots: - '@types/node' - supports-color - '@itwin/cloud-agnostic-core@3.0.5': {} + '@itwin/cloud-agnostic-core@3.1.1': {} '@itwin/components-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/core-react@5.32.0(@itwin/appui-abstract@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/core-bentley@5.10.1)(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@itwin/itwinui-react@3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: @@ -9974,19 +10024,19 @@ snapshots: '@itwin/core-backend@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-geometry@5.10.1)(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)))(@opentelemetry/api@1.9.1)': dependencies: - '@azure/storage-blob': 12.31.0 + '@azure/storage-blob': 12.32.0 '@bentley/imodeljs-native': 5.10.34 '@itwin/core-bentley': 5.10.1 '@itwin/core-common': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1) '@itwin/core-geometry': 5.10.1 '@itwin/ecschema-metadata': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)) - '@itwin/object-storage-azure': 3.0.5 + '@itwin/object-storage-azure': 3.1.1 form-data: 4.0.5 fs-extra: 8.1.0 json5: 2.2.3 linebreak: 1.1.0 multiparty: 4.3.0 - semver: 7.8.1 + semver: 7.8.2 touch: 3.1.1 ws: 7.5.11 optionalDependencies: @@ -9999,9 +10049,9 @@ snapshots: - supports-color - utf-8-validate - '@itwin/core-bentley@5.10.1': {} + '@itwin/core-bentley@5.10.0': {} - '@itwin/core-bentley@5.9.4': {} + '@itwin/core-bentley@5.10.1': {} '@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1)': dependencies: @@ -10069,7 +10119,7 @@ snapshots: '@itwin/itwinui-icons-react': 2.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@itwin/itwinui-react': 3.21.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: 2.5.1 - dompurify: 3.4.5 + dompurify: 3.4.8 lodash: 4.18.1 react: 19.2.7 react-autosuggest: 10.1.0(react@19.2.7) @@ -10099,11 +10149,11 @@ snapshots: '@itwin/eslint-plugin@6.1.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 eslint-formatter-visualstudio: 8.40.0 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4) eslint-plugin-jam3: 0.2.3 eslint-plugin-jsdoc: 51.4.1(eslint@9.39.4) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4) @@ -10160,27 +10210,27 @@ snapshots: dependencies: '@floating-ui/react': 0.27.19(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@itwin/itwinui-illustrations-react': 2.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@swc/helpers': 0.5.21 - '@tanstack/react-virtual': 3.13.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@swc/helpers': 0.5.23 + '@tanstack/react-virtual': 3.14.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: 2.5.1 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) react-table: 7.8.0(react@19.2.7) - '@itwin/object-storage-azure@3.0.5': + '@itwin/object-storage-azure@3.1.1': dependencies: '@azure/core-paging': 1.6.2 - '@azure/storage-blob': 12.31.0 - '@itwin/cloud-agnostic-core': 3.0.5 - '@itwin/object-storage-core': 3.0.5 + '@azure/storage-blob': 12.32.0 + '@itwin/cloud-agnostic-core': 3.1.1 + '@itwin/object-storage-core': 3.1.1 transitivePeerDependencies: - debug - supports-color - '@itwin/object-storage-core@3.0.5': + '@itwin/object-storage-core@3.1.1': dependencies: - '@itwin/cloud-agnostic-core': 3.0.5 - axios: 1.16.1 + '@itwin/cloud-agnostic-core': 3.1.1 + axios: 1.17.0 transitivePeerDependencies: - debug - supports-color @@ -10193,11 +10243,11 @@ snapshots: '@itwin/core-quantity': 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/ecschema-metadata': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)) '@itwin/presentation-common': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))) - '@itwin/presentation-shared': 1.2.13 + '@itwin/presentation-shared': 1.2.15 object-hash: 1.3.1 rxjs: 7.8.2 rxjs-for-await: 1.0.0(rxjs@7.8.2) - semver: 7.8.1 + semver: 7.8.2 '@itwin/presentation-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)))': dependencies: @@ -10205,7 +10255,7 @@ snapshots: '@itwin/core-common': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1) '@itwin/core-quantity': 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/ecschema-metadata': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)) - '@itwin/presentation-shared': 1.2.13 + '@itwin/presentation-shared': 1.2.15 '@itwin/presentation-frontend@5.10.1(c3d5548436ac11e36c88d93a4efb17d9)': dependencies: @@ -10215,18 +10265,18 @@ snapshots: '@itwin/core-quantity': 5.10.1(@itwin/core-bentley@5.10.1) '@itwin/ecschema-metadata': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1)) '@itwin/presentation-common': 5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-common@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-geometry@5.10.1))(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))(@itwin/ecschema-metadata@5.10.1(@itwin/core-bentley@5.10.1)(@itwin/core-quantity@5.10.1(@itwin/core-bentley@5.10.1))) - '@itwin/unified-selection': 1.7.4 + '@itwin/unified-selection': 1.7.5 rxjs: 7.8.2 rxjs-for-await: 1.0.0(rxjs@7.8.2) - '@itwin/presentation-shared@1.2.13': + '@itwin/presentation-shared@1.2.15': dependencies: - '@itwin/core-bentley': 5.9.4 + '@itwin/core-bentley': 5.10.0 - '@itwin/unified-selection@1.7.4': + '@itwin/unified-selection@1.7.5': dependencies: - '@itwin/core-bentley': 5.9.4 - '@itwin/presentation-shared': 1.2.13 + '@itwin/core-bentley': 5.10.0 + '@itwin/presentation-shared': 1.2.15 rxjs: 7.8.2 rxjs-for-await: 1.0.0(rxjs@7.8.2) @@ -10299,37 +10349,37 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.33.8(@types/node@24.13.2)': + '@microsoft/api-extractor-model@7.33.8(@types/node@24.13.1)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@24.13.2) + '@rushstack/node-core-library': 5.23.1(@types/node@24.13.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.58.7(@types/node@24.13.2)': + '@microsoft/api-extractor@7.58.7(@types/node@24.13.1)': dependencies: - '@microsoft/api-extractor-model': 7.33.8(@types/node@24.13.2) + '@microsoft/api-extractor-model': 7.33.8(@types/node@24.13.1) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@24.13.2) + '@rushstack/node-core-library': 5.23.1(@types/node@24.13.1) '@rushstack/rig-package': 0.7.3 - '@rushstack/terminal': 0.24.0(@types/node@24.13.2) - '@rushstack/ts-command-line': 5.3.9(@types/node@24.13.2) + '@rushstack/terminal': 0.24.0(@types/node@24.13.1) + '@rushstack/ts-command-line': 5.3.9(@types/node@24.13.1) diff: 8.0.4 minimatch: 10.2.3 resolve: 1.22.12 @@ -10355,12 +10405,19 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@ngneat/falso@8.0.2': dependencies: seedrandom: 3.0.5 uuid: 14.0.0 - '@nodable/entities@2.1.0': {} + '@nodable/entities@2.1.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -10374,7 +10431,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oclif/core@4.11.3': + '@oclif/core@4.11.4': dependencies: ansi-escapes: 4.3.2 ansis: 3.17.0 @@ -10387,22 +10444,22 @@ snapshots: is-wsl: 2.2.0 lilconfig: 3.1.3 minimatch: 10.2.5 - semver: 7.8.1 + semver: 7.8.2 string-width: 4.2.3 supports-color: 8.1.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 - '@oclif/plugin-help@6.2.49': + '@oclif/plugin-help@6.2.50': dependencies: - '@oclif/core': 4.11.3 + '@oclif/core': 4.11.4 - '@oclif/plugin-not-found@3.2.86(@types/node@24.13.2)': + '@oclif/plugin-not-found@3.2.87(@types/node@24.13.1)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@24.13.2) - '@oclif/core': 4.11.3 + '@inquirer/prompts': 7.10.1(@types/node@24.13.1) + '@oclif/core': 4.11.4 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -10678,7 +10735,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.212.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.5.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.1) - protobufjs: 8.4.2 + protobufjs: 8.6.1 '@opentelemetry/otlp-transformer@0.217.0(@opentelemetry/api@1.9.1)': dependencies: @@ -10689,7 +10746,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - protobufjs: 8.4.2 + protobufjs: 8.6.1 '@opentelemetry/propagator-b3@2.7.1(@opentelemetry/api@1.9.1)': dependencies: @@ -10796,7 +10853,7 @@ snapshots: '@oxc-project/types@0.127.0': {} - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.137.0': {} '@oxfmt/binding-android-arm-eabi@0.47.0': optional: true @@ -10966,73 +11023,73 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.1.3': optional: true '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-darwin-arm64@1.1.3': optional: true '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.1.3': optional: true '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-freebsd-x64@1.1.3': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.1.3': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.1.3': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.3': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.1.3': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.1.3': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-musl@1.1.3': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-openharmony-arm64@1.1.3': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': @@ -11042,33 +11099,33 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': + '@rolldown/binding-wasm32-wasi@1.1.3': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.1.3': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.1.3': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))': + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 picomatch: 4.0.4 - rolldown: 1.0.3 + rolldown: 1.1.3 optionalDependencies: - '@babel/runtime': 7.29.2 - vite: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + '@babel/runtime': 7.29.7 + vite: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) '@rolldown/pluginutils@1.0.0-rc.17': {} @@ -11076,7 +11133,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.23.1(@types/node@24.13.2)': + '@rushstack/node-core-library@5.23.1(@types/node@24.13.1)': dependencies: ajv: 8.18.0 ajv-draft-04: 1.0.0(ajv@8.18.0) @@ -11087,28 +11144,28 @@ snapshots: resolve: 1.22.12 semver: 7.7.4 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@rushstack/problem-matcher@0.2.1(@types/node@24.13.2)': + '@rushstack/problem-matcher@0.2.1(@types/node@24.13.1)': optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 '@rushstack/rig-package@0.7.3': dependencies: jju: 1.4.0 resolve: 1.22.12 - '@rushstack/terminal@0.24.0(@types/node@24.13.2)': + '@rushstack/terminal@0.24.0(@types/node@24.13.1)': dependencies: - '@rushstack/node-core-library': 5.23.1(@types/node@24.13.2) - '@rushstack/problem-matcher': 0.2.1(@types/node@24.13.2) + '@rushstack/node-core-library': 5.23.1(@types/node@24.13.1) + '@rushstack/problem-matcher': 0.2.1(@types/node@24.13.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 - '@rushstack/ts-command-line@5.3.9(@types/node@24.13.2)': + '@rushstack/ts-command-line@5.3.9(@types/node@24.13.1)': dependencies: - '@rushstack/terminal': 0.24.0(@types/node@24.13.2) + '@rushstack/terminal': 0.24.0(@types/node@24.13.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -11149,48 +11206,48 @@ snapshots: '@sindresorhus/is@7.2.0': {} - '@smithy/core@3.24.4': + '@smithy/core@3.24.6': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.2 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.3.4': + '@smithy/credential-provider-imds@4.3.8': dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.4.4': + '@smithy/fetch-http-handler@5.4.6': dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/middleware-compression@4.4.4': + '@smithy/middleware-compression@4.4.6': dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 fflate: 0.8.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.7.4': + '@smithy/node-http-handler@4.7.7': dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/signature-v4@5.4.4': + '@smithy/signature-v4@5.4.6': dependencies: - '@smithy/core': 3.24.4 - '@smithy/types': 4.14.2 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/types@4.14.2': + '@smithy/types@4.14.3': dependencies: tslib: 2.8.1 @@ -11210,7 +11267,7 @@ snapshots: '@stratakit/bricks@0.5.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@ariakit/react': 0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ariakit/react': 0.4.29(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@stratakit/foundations': 0.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: 2.5.1 react: 19.2.7 @@ -11219,25 +11276,25 @@ snapshots: '@stratakit/foundations@0.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@ariakit/react': 0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ariakit/react': 0.4.29(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: 2.5.1 react-compiler-runtime: 1.0.0(react@19.2.7) optionalDependencies: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@stratakit/icons@0.3.1': {} + '@stratakit/icons@0.3.2': {} '@stratakit/structures@0.5.7(@types/react@19.2.17)(immer@10.2.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7))': dependencies: - '@ariakit/react': 0.4.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ariakit/react': 0.4.29(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@stratakit/bricks': 0.5.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@stratakit/foundations': 0.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) classnames: 2.5.1 react: 19.2.7 react-compiler-runtime: 1.0.0(react@19.2.7) react-dom: 19.2.7(react@19.2.7) - zustand: 5.0.13(@types/react@19.2.17)(immer@10.2.0)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) + zustand: 5.0.14(@types/react@19.2.17)(immer@10.2.0)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) transitivePeerDependencies: - '@types/react' - immer @@ -11246,14 +11303,14 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.60.1 eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 picomatch: 4.0.4 - '@swc/helpers@0.5.21': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -11267,20 +11324,20 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@tanstack/react-virtual@3.13.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@tanstack/react-virtual@3.14.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@tanstack/virtual-core': 3.15.0 + '@tanstack/virtual-core': 3.17.0 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-core@3.15.0': {} + '@tanstack/virtual-core@3.17.0': {} '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -11290,7 +11347,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) @@ -11309,6 +11366,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -11319,17 +11381,17 @@ snapshots: '@types/brotli@1.3.5': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/buffer-from@1.1.3': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -11339,7 +11401,7 @@ snapshots: '@types/cpx@1.5.5': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/deep-eql@4.0.2': {} @@ -11367,21 +11429,17 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/natural-compare-lite@1.4.2': {} '@types/node@12.20.55': {} - '@types/node@22.19.19': + '@types/node@22.19.20': dependencies: undici-types: 6.21.0 - '@types/node@24.12.4': - dependencies: - undici-types: 7.16.0 - - '@types/node@24.13.2': + '@types/node@24.13.1': dependencies: undici-types: 7.18.2 @@ -11399,7 +11457,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/sizzle@2.3.10': {} @@ -11414,21 +11472,21 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 optional: true - '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11437,54 +11495,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(typescript@5.9.3)': + '@typescript-eslint/project-service@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(typescript@6.0.3)': + '@typescript-eslint/project-service@8.60.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 debug: 4.4.3(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.4': + '@typescript-eslint/scope-manager@8.60.1': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 - '@typescript-eslint/tsconfig-utils@8.59.4(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.59.4(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.4(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.60.1(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -11492,55 +11550,55 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.4': {} + '@typescript-eslint/types@8.60.1': {} - '@typescript-eslint/typescript-estree@8.59.4(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.4(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.60.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 - semver: 7.8.1 - tinyglobby: 0.2.16 + semver: 7.8.2 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.4(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.60.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.4(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.60.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 - semver: 7.8.1 - tinyglobby: 0.2.16 + semver: 7.8.2 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/utils@8.60.1(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) eslint: 9.39.4 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.4': + '@typescript-eslint/visitor-keys@8.60.1': dependencies: - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.60.1 eslint-visitor-keys: 5.0.1 - '@typespec/ts-http-runtime@0.3.5': + '@typespec/ts-http-runtime@0.3.6': dependencies: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -11552,37 +11610,37 @@ snapshots: dependencies: uncrypto: 0.1.3 - '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.1.3)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) babel-plugin-react-compiler: 1.0.0 - '@vitest/browser-playwright@4.1.8(playwright@1.59.1)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser-playwright@4.1.9(playwright@1.60.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9)': dependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) - playwright: 1.59.1 + '@vitest/browser': 4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9) + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) + playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser@4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) - '@vitest/utils': 4.1.8 + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -11590,94 +11648,94 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8)': + '@vitest/coverage-v8@4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.8 - ast-v8-to-istanbul: 1.0.0 + '@vitest/utils': 4.1.9 + ast-v8-to-istanbul: 1.0.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.3 - obug: 2.1.1 + obug: 2.1.2 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) optionalDependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8) + '@vitest/browser': 4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9) - '@vitest/expect@4.1.8': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.8 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.8': + '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.8': + '@vitest/runner@4.1.9': dependencies: - '@vitest/utils': 4.1.8 + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.8': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.8': {} + '@vitest/spy@4.1.9': {} - '@vitest/utils@4.1.8': + '@vitest/utils@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 + '@vitest/pretty-format': 4.1.9 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@vue/compiler-core@3.5.34': + '@vue/compiler-core@3.5.35': dependencies: - '@babel/parser': 7.29.3 - '@vue/shared': 3.5.34 + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.35 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.34': + '@vue/compiler-dom@3.5.35': dependencies: - '@vue/compiler-core': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/compiler-core': 3.5.35 + '@vue/shared': 3.5.35 - '@vue/compiler-sfc@3.5.34': + '@vue/compiler-sfc@3.5.35': dependencies: - '@babel/parser': 7.29.3 - '@vue/compiler-core': 3.5.34 - '@vue/compiler-dom': 3.5.34 - '@vue/compiler-ssr': 3.5.34 - '@vue/shared': 3.5.34 + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.35 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.15 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.34': + '@vue/compiler-ssr@3.5.35': dependencies: - '@vue/compiler-dom': 3.5.34 - '@vue/shared': 3.5.34 + '@vue/compiler-dom': 3.5.35 + '@vue/shared': 3.5.35 - '@vue/shared@3.5.34': {} + '@vue/shared@3.5.35': {} '@yarnpkg/lockfile@1.1.0': {} @@ -11758,7 +11816,7 @@ snapshots: ansis@3.17.0: {} - ansis@4.3.0: {} + ansis@4.3.1: {} anymatch@3.1.3: dependencies: @@ -11901,7 +11959,7 @@ snapshots: artillery-plugin-publish-metrics@2.36.0: dependencies: - '@aws-sdk/client-cloudwatch': 3.1053.0 + '@aws-sdk/client-cloudwatch': 3.1063.0 '@opentelemetry/api': 1.9.1 '@opentelemetry/context-async-hooks': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-metrics-otlp-grpc': 0.212.0(@opentelemetry/api@1.9.1) @@ -11924,7 +11982,7 @@ snapshots: mixpanel: 0.18.1 opentracing: 0.14.7 prom-client: 14.2.0 - semver: 7.8.1 + semver: 7.8.2 uuid: 14.0.0 transitivePeerDependencies: - encoding @@ -11937,28 +11995,28 @@ snapshots: transitivePeerDependencies: - supports-color - artillery@2.0.31(@types/node@24.13.2): + artillery@2.0.31(@types/node@24.13.1): dependencies: '@artilleryio/int-commons': 2.22.0 '@artilleryio/int-core': 2.26.0 - '@aws-sdk/client-cloudwatch': 3.1053.0 - '@aws-sdk/client-cloudwatch-logs': 3.1053.0 - '@aws-sdk/client-ec2': 3.1053.0 - '@aws-sdk/client-ecs': 3.1053.0 - '@aws-sdk/client-iam': 3.1053.0 - '@aws-sdk/client-lambda': 3.1053.0 - '@aws-sdk/client-s3': 3.1053.0 - '@aws-sdk/client-sqs': 3.1053.0 - '@aws-sdk/client-ssm': 3.1053.0 - '@aws-sdk/client-sts': 3.1053.0 - '@aws-sdk/credential-providers': 3.1053.0 + '@aws-sdk/client-cloudwatch': 3.1063.0 + '@aws-sdk/client-cloudwatch-logs': 3.1063.0 + '@aws-sdk/client-ec2': 3.1063.0 + '@aws-sdk/client-ecs': 3.1063.0 + '@aws-sdk/client-iam': 3.1063.0 + '@aws-sdk/client-lambda': 3.1063.0 + '@aws-sdk/client-s3': 3.1063.0 + '@aws-sdk/client-sqs': 3.1063.0 + '@aws-sdk/client-ssm': 3.1063.0 + '@aws-sdk/client-sts': 3.1063.0 + '@aws-sdk/credential-providers': 3.1063.0 '@azure/arm-containerinstance': 9.1.0 '@azure/identity': 4.13.1 - '@azure/storage-blob': 12.31.0 - '@azure/storage-queue': 12.29.0 - '@oclif/core': 4.11.3 - '@oclif/plugin-help': 6.2.49 - '@oclif/plugin-not-found': 3.2.86(@types/node@24.13.2) + '@azure/storage-blob': 12.32.0 + '@azure/storage-queue': 12.30.0 + '@oclif/core': 4.11.4 + '@oclif/plugin-help': 6.2.50 + '@oclif/plugin-not-found': 3.2.87(@types/node@24.13.1) '@upstash/redis': 1.38.0 artillery-engine-playwright: 1.28.0 artillery-plugin-apdex: 1.22.0 @@ -11992,7 +12050,7 @@ snapshots: nanoid: 3.3.12 ora: 4.1.1 rc: 1.2.8 - sqs-consumer: 6.0.2(@aws-sdk/client-sqs@3.1053.0) + sqs-consumer: 6.0.2(@aws-sdk/client-sqs@3.1063.0) tempy: 3.1.0 walk-sync: 0.2.7 yaml-js: 0.3.1 @@ -12023,7 +12081,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@1.0.0: + ast-v8-to-istanbul@1.0.3: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -12043,9 +12101,9 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.11.4: {} + axe-core@4.12.0: {} - axios@1.16.1: + axios@1.17.0: dependencies: follow-redirects: 1.16.0 form-data: 4.0.5 @@ -12059,7 +12117,7 @@ snapshots: babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 balanced-match@1.0.2: {} @@ -12069,7 +12127,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.30: {} + baseline-browser-mapping@2.10.34: {} basic-ftp@5.3.1: {} @@ -12114,12 +12172,12 @@ snapshots: bowser@2.14.1: {} - brace-expansion@1.1.14: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.0: + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 @@ -12139,10 +12197,10 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.30 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.358 - node-releases: 2.0.44 + baseline-browser-mapping: 2.10.34 + caniuse-lite: 1.0.30001797 + electron-to-chromium: 1.5.368 + node-releases: 2.0.47 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -12153,7 +12211,7 @@ snapshots: buffer-image-size@0.6.4: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 bundle-name@4.1.0: dependencies: @@ -12210,7 +12268,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001797: {} chai@6.2.2: {} @@ -12260,7 +12318,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.25.0 + undici: 7.27.2 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -12539,8 +12597,8 @@ snapshots: cspell-lib: 9.8.0 fast-json-stable-stringify: 2.1.0 flatted: 3.4.2 - semver: 7.8.1 - tinyglobby: 0.2.16 + semver: 7.8.2 + tinyglobby: 0.2.17 css-select@5.2.2: dependencies: @@ -12722,7 +12780,7 @@ snapshots: detective-typescript@14.1.2(typescript@5.9.3): dependencies: - '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) ast-module-types: 6.0.2 node-source-walk: 7.0.2 typescript: 5.9.3 @@ -12732,7 +12790,7 @@ snapshots: detective-vue2@2.3.0(typescript@5.9.3): dependencies: '@dependents/detective-less': 5.0.3 - '@vue/compiler-sfc': 3.5.34 + '@vue/compiler-sfc': 3.5.35 detective-es6: 5.0.2 detective-sass: 6.0.2 detective-scss: 5.0.2 @@ -12766,7 +12824,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 csstype: 3.2.3 dom-serializer@2.0.0: @@ -12781,7 +12839,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.4.5: + dompurify@3.4.8: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -12821,12 +12879,12 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.358: {} + electron-to-chromium@1.5.368: {} electron@39.8.10: dependencies: '@electron/get': 2.0.3 - '@types/node': 22.19.19 + '@types/node': 22.19.20 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -12864,7 +12922,7 @@ snapshots: engine.io-parser@5.2.3: {} - enhanced-resolve@5.22.0: + enhanced-resolve@5.23.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -12920,7 +12978,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -12943,15 +13001,15 @@ snapshots: safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} @@ -12987,11 +13045,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 es-to-primitive@1.3.0: dependencies: @@ -12999,7 +13057,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.47.0: {} + es-toolkit@1.49.0: {} es6-error@4.1.1: optional: true @@ -13038,17 +13096,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13059,8 +13117,8 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4) - hasown: 2.0.3 + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4) + hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 @@ -13068,10 +13126,10 @@ snapshots: object.groupby: 1.0.3 object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13094,7 +13152,7 @@ snapshots: espree: 10.4.0 esquery: 1.7.0 parse-imports-exports: 0.2.4 - semver: 7.8.1 + semver: 7.8.2 spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color @@ -13105,12 +13163,12 @@ snapshots: array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.11.4 + axe-core: 4.12.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 eslint: 9.39.4 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.5 @@ -13128,8 +13186,8 @@ snapshots: eslint-plugin-react-hooks@7.1.1(eslint@9.39.4): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 eslint: 9.39.4 hermes-parser: 0.25.1 zod: 4.4.3 @@ -13147,7 +13205,7 @@ snapshots: es-iterator-helpers: 1.3.2 eslint: 9.39.4 estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 @@ -13159,11 +13217,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4): dependencies: eslint: 9.39.4 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) eslint-scope@8.4.0: dependencies: @@ -13350,14 +13408,14 @@ snapshots: fast-xml-parser@5.7.3: dependencies: - '@nodable/entities': 2.1.0 + '@nodable/entities': 2.1.1 fast-xml-builder: 1.2.0 path-expression-matcher: 1.5.0 strnum: 2.3.0 fast-xml-parser@5.8.0: dependencies: - '@nodable/entities': 2.1.0 + '@nodable/entities': 2.1.1 fast-xml-builder: 1.2.0 path-expression-matcher: 1.5.0 strnum: 2.3.0 @@ -13394,7 +13452,7 @@ snapshots: dependencies: app-module-path: 2.2.0 commander: 12.1.0 - enhanced-resolve: 5.22.0 + enhanced-resolve: 5.23.0 module-definition: 6.0.2 module-lookup-amd: 9.1.3 resolve: 1.22.12 @@ -13465,7 +13523,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.3 + hasown: 2.0.4 mime-types: 2.1.35 forwarded@0.2.0: {} @@ -13504,7 +13562,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.3 + hasown: 2.0.4 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -13536,7 +13594,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-own-enumerable-property-symbols@3.0.2: {} @@ -13651,7 +13709,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.8.1 + semver: 7.8.2 serialize-error: 7.0.1 optional: true @@ -13712,9 +13770,9 @@ snapshots: graceful-fs@4.2.11: {} - happy-dom@20.10.2: + happy-dom@20.10.6: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 buffer-image-size: 0.6.4 @@ -13747,7 +13805,7 @@ snapshots: has@1.0.4: {} - hasown@2.0.3: + hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -13838,7 +13896,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@4.1.3: {} + human-id@4.2.0: {} human-signals@5.0.0: {} @@ -13850,7 +13908,7 @@ snapshots: i18next-browser-languagedetector@6.1.8: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 i18next-http-backend@3.0.6: dependencies: @@ -13860,7 +13918,7 @@ snapshots: i18next@21.10.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 iconv-lite@0.4.24: dependencies: @@ -13880,7 +13938,7 @@ snapshots: immer@10.2.0: {} - immutable@5.1.5: {} + immutable@5.1.6: {} import-fresh@3.3.1: dependencies: @@ -13913,7 +13971,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 + hasown: 2.0.4 side-channel: 1.1.0 ip-address@10.2.0: {} @@ -13957,7 +14015,7 @@ snapshots: is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -14028,7 +14086,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-regexp@1.0.0: {} @@ -14069,7 +14127,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 is-unicode-supported@0.1.0: {} @@ -14161,7 +14219,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: + js-yaml@4.2.0: dependencies: argparse: 2.0.1 @@ -14221,7 +14279,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.8.1 + semver: 7.8.2 jsx-ast-utils@3.3.5: dependencies: @@ -14336,7 +14394,7 @@ snapshots: dependencies: uc.micro: 1.0.6 - linkify-it@5.0.0: + linkify-it@5.0.1: dependencies: uc.micro: 2.1.0 @@ -14349,7 +14407,7 @@ snapshots: lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 - pidtree: 0.6.0 + pidtree: 0.6.1 string-argv: 0.3.2 yaml: 2.9.0 transitivePeerDependencies: @@ -14432,7 +14490,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.5.0: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: dependencies: @@ -14452,19 +14510,19 @@ snapshots: magicast@0.5.3: dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.8.1 + semver: 7.8.2 - markdown-it@14.1.1: + markdown-it@14.2.0: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.0 + linkify-it: 5.0.1 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 @@ -14564,15 +14622,15 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.15 minimatch@5.1.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimist@1.2.8: {} @@ -14608,7 +14666,7 @@ snapshots: glob: 10.5.0 he: 1.2.0 is-path-inside: 3.0.3 - js-yaml: 4.1.1 + js-yaml: 4.2.0 log-symbols: 4.1.0 minimatch: 9.0.9 ms: 2.1.3 @@ -14695,11 +14753,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.44: {} + node-releases@2.0.47: {} node-source-walk@7.0.2: dependencies: - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.7 normalize-package-data@2.5.0: dependencies: @@ -14782,7 +14840,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - obug@2.1.1: {} + obug@2.1.2: {} on-finished@2.4.1: dependencies: @@ -14993,7 +15051,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.0 + lru-cache: 11.5.1 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -15016,7 +15074,7 @@ snapshots: pidtree@0.3.1: {} - pidtree@0.6.0: {} + pidtree@0.6.1: {} pify@3.0.0: {} @@ -15024,12 +15082,20 @@ snapshots: playwright-core@1.59.1: {} + playwright-core@1.60.0: {} + playwright@1.59.1: dependencies: playwright-core: 1.59.1 optionalDependencies: fsevents: 2.3.2 + playwright@1.60.0: + dependencies: + playwright-core: 1.60.0 + optionalDependencies: + fsevents: 2.3.2 + pngjs@7.0.0: {} possible-typed-array-names@1.1.0: {} @@ -15093,7 +15159,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - protobufjs@7.6.1: + protobufjs@7.6.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -15105,10 +15171,10 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.1 - '@types/node': 24.12.4 + '@types/node': 24.13.1 long: 5.3.2 - protobufjs@8.4.2: + protobufjs@8.6.1: dependencies: long: 5.3.2 @@ -15201,19 +15267,19 @@ snapshots: react-error-boundary@4.1.2(react@19.2.7): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 19.2.7 react-error-boundary@5.0.0(react@19.2.7): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 19.2.7 react-is@16.13.1: {} react-is@17.0.2: {} - react-redux@9.2.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): + react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.2.7 @@ -15224,7 +15290,7 @@ snapshots: react-resize-detector@12.3.0(react@19.2.7): dependencies: - es-toolkit: 1.47.0 + es-toolkit: 1.49.0 react: 19.2.7 react-table@7.8.0(react@19.2.7): @@ -15237,7 +15303,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -15246,7 +15312,7 @@ snapshots: react-window@1.8.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 memoize-one: 5.2.1 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) @@ -15389,7 +15455,7 @@ snapshots: birpc: 4.0.0 dts-resolver: 2.1.3 get-tsconfig: 4.14.0 - obug: 2.1.1 + obug: 2.1.2 picomatch: 4.0.4 rolldown: 1.0.0-rc.17 optionalDependencies: @@ -15418,26 +15484,26 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 - rolldown@1.0.3: + rolldown@1.1.3: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.137.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm64': 1.1.3 + '@rolldown/binding-darwin-arm64': 1.1.3 + '@rolldown/binding-darwin-x64': 1.1.3 + '@rolldown/binding-freebsd-x64': 1.1.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 + '@rolldown/binding-linux-arm64-gnu': 1.1.3 + '@rolldown/binding-linux-arm64-musl': 1.1.3 + '@rolldown/binding-linux-ppc64-gnu': 1.1.3 + '@rolldown/binding-linux-s390x-gnu': 1.1.3 + '@rolldown/binding-linux-x64-gnu': 1.1.3 + '@rolldown/binding-linux-x64-musl': 1.1.3 + '@rolldown/binding-openharmony-arm64': 1.1.3 + '@rolldown/binding-wasm32-wasi': 1.1.3 + '@rolldown/binding-win32-arm64-msvc': 1.1.3 + '@rolldown/binding-win32-x64-msvc': 1.1.3 rss-parser@3.13.0: dependencies: @@ -15488,12 +15554,12 @@ snapshots: sass-lookup@6.1.2: dependencies: commander: 12.1.0 - enhanced-resolve: 5.22.0 + enhanced-resolve: 5.23.0 sass@1.100.0: dependencies: chokidar: 5.0.0 - immutable: 5.1.5 + immutable: 5.1.6 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -15515,7 +15581,7 @@ snapshots: semver@7.7.4: {} - semver@7.8.1: {} + semver@7.8.2: {} send@0.19.2: dependencies: @@ -15717,9 +15783,9 @@ snapshots: sprintf-js@1.1.3: optional: true - sqs-consumer@6.0.2(@aws-sdk/client-sqs@3.1053.0): + sqs-consumer@6.0.2(@aws-sdk/client-sqs@3.1063.0): dependencies: - '@aws-sdk/client-sqs': 3.1053.0 + '@aws-sdk/client-sqs': 3.1063.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15791,7 +15857,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15800,8 +15866,9 @@ snapshots: es-abstract: 1.24.2 es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15889,12 +15956,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.2: {} - - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + tinyexec@1.2.4: {} tinyglobby@0.2.17: dependencies: @@ -15958,19 +16020,19 @@ snapshots: tsdown@0.21.10(typescript@6.0.3): dependencies: - ansis: 4.3.0 + ansis: 4.3.1 cac: 7.0.0 defu: 6.1.7 empathic: 2.0.1 hookable: 6.1.1 import-without-cache: 0.3.3 - obug: 2.1.1 + obug: 2.1.2 picomatch: 4.0.4 rolldown: 1.0.0-rc.17 rolldown-plugin-dts: 0.23.2(rolldown@1.0.0-rc.17)(typescript@6.0.3) - semver: 7.8.1 - tinyexec: 1.1.2 - tinyglobby: 0.2.16 + semver: 7.8.2 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 unrun: 0.2.39 @@ -16029,7 +16091,7 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -16038,7 +16100,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@6.0.3)): + typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.6.3)): dependencies: typedoc: 0.28.19(typescript@5.6.3) @@ -16046,7 +16108,7 @@ snapshots: dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 - markdown-it: 14.1.1 + markdown-it: 14.2.0 minimatch: 10.2.5 typescript: 5.6.3 yaml: 2.9.0 @@ -16081,11 +16143,9 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} - undici-types@7.18.2: {} - undici@7.25.0: {} + undici@7.27.2: {} unicode-trie@2.0.0: dependencies: @@ -16146,64 +16206,64 @@ snapshots: vary@1.1.2: {} - vite-plugin-static-copy@4.1.0(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)): + vite-plugin-static-copy@4.1.0(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 - tinyglobby: 0.2.16 - vite: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + tinyglobby: 0.2.17 + vite: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) - vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0): + vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.15 - rolldown: 1.0.3 + rolldown: 1.1.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.1 fsevents: 2.3.3 sass: 1.100.0 yaml: 2.9.0 - vitest-browser-react@2.2.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8): + vitest-browser-react@2.2.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.9): dependencies: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.1)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.8 - '@vitest/runner': 4.1.8 - '@vitest/snapshot': 4.1.8 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.1.2 - tinyglobby: 0.2.16 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 24.13.2 - '@vitest/browser-playwright': 4.1.8(playwright@1.59.1)(vite@8.0.16(@types/node@24.13.2)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/coverage-v8': 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) - happy-dom: 20.10.2 + '@types/node': 24.13.1 + '@vitest/browser-playwright': 4.1.9(playwright@1.60.0)(vite@8.1.0(@types/node@24.13.1)(sass@1.100.0)(yaml@2.9.0))(vitest@4.1.9) + '@vitest/coverage-v8': 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9) + happy-dom: 20.10.6 transitivePeerDependencies: - msw @@ -16257,7 +16317,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -16266,7 +16326,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -16310,7 +16370,7 @@ snapshots: git-url-parse: 13.1.1 globby: 11.1.0 jju: 1.4.0 - js-yaml: 4.1.1 + js-yaml: 4.2.0 micromatch: 4.0.8 wrap-ansi@6.2.0: @@ -16367,7 +16427,7 @@ snapshots: '@oozcitak/dom': 2.0.2 '@oozcitak/infra': 2.0.2 '@oozcitak/util': 10.0.0 - js-yaml: 4.1.1 + js-yaml: 4.2.0 xmlbuilder@11.0.1: {} @@ -16423,7 +16483,7 @@ snapshots: immer: 10.2.0 react: 19.2.7 - zustand@5.0.13(@types/react@19.2.17)(immer@10.2.0)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): + zustand@5.0.14(@types/react@19.2.17)(immer@10.2.0)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): optionalDependencies: '@types/react': 19.2.17 immer: 10.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8777789ea..0a9451894 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,7 +23,7 @@ catalogs: '@itwin/core-react': ^5.32.0 '@itwin/imodel-components-react': ^5.32.0 build-tools: - '@itwin/build-tools': ^5.10.0 + '@itwin/build-tools': ^5.10.1 '@itwin/eslint-plugin': ^6.1.0 '@rolldown/plugin-babel': ^0.2.3 '@stylistic/eslint-plugin': ^5.10.0 @@ -42,27 +42,27 @@ catalogs: vite: ^8.0.16 vite-plugin-static-copy: ^4.1.0 itwinjs-core: - '@itwin/core-bentley': ^5.10.0 - '@itwin/core-common': ^5.10.0 - '@itwin/core-geometry': ^5.10.0 + '@itwin/core-bentley': ^5.10.1 + '@itwin/core-common': ^5.10.1 + '@itwin/core-geometry': ^5.10.1 itwinjs-core-dev: - '@itwin/appui-abstract': ^5.10.0 - '@itwin/core-backend': ^5.10.0 - '@itwin/core-bentley': ^5.10.0 - '@itwin/core-common': ^5.10.0 - '@itwin/core-electron': ^5.10.0 - '@itwin/core-frontend': ^5.10.0 - '@itwin/core-geometry': ^5.10.0 - '@itwin/core-i18n': ^5.10.0 - '@itwin/core-orbitgt': ^5.10.0 - '@itwin/core-quantity': ^5.10.0 - '@itwin/ecschema-metadata': ^5.10.0 - '@itwin/ecschema-rpcinterface-common': ^5.10.0 - '@itwin/ecschema-rpcinterface-impl': ^5.10.0 - '@itwin/express-server': ^5.10.0 - '@itwin/presentation-backend': ^5.10.0 - '@itwin/presentation-common': ^5.10.0 - '@itwin/presentation-frontend': ^5.10.0 + '@itwin/appui-abstract': ^5.10.1 + '@itwin/core-backend': ^5.10.1 + '@itwin/core-bentley': ^5.10.1 + '@itwin/core-common': ^5.10.1 + '@itwin/core-electron': ^5.10.1 + '@itwin/core-frontend': ^5.10.1 + '@itwin/core-geometry': ^5.10.1 + '@itwin/core-i18n': ^5.10.1 + '@itwin/core-orbitgt': ^5.10.1 + '@itwin/core-quantity': ^5.10.1 + '@itwin/ecschema-metadata': ^5.10.1 + '@itwin/ecschema-rpcinterface-common': ^5.10.1 + '@itwin/ecschema-rpcinterface-impl': ^5.10.1 + '@itwin/express-server': ^5.10.1 + '@itwin/presentation-backend': ^5.10.1 + '@itwin/presentation-common': ^5.10.1 + '@itwin/presentation-frontend': ^5.10.1 inversify: ~6.0.2 reflect-metadata: ^0.1.14 itwinui: @@ -90,13 +90,13 @@ catalogs: '@testing-library/react': ^16.3.2 '@testing-library/user-event': ^14.6.1 '@types/deep-equal-in-any-order': ^1.0.4 - '@vitest/browser-playwright': ^4.1.8 - '@vitest/coverage-v8': ^4.1.8 + '@vitest/browser-playwright': ^4.1.9 + '@vitest/coverage-v8': ^4.1.9 axe-core: ^4.11.4 deep-equal-in-any-order: ^2.2.0 happy-dom: ^20.10.1 playwright: ^1.59.1 - vitest: ^4.1.8 + vitest: ^4.1.9 vitest-browser-react: ^2.2.0 hoistPattern: