diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd24f623f..eec627112 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,13 +2,14 @@ name: CI on: pull_request: - branches: [ "main" ] + branches: [ "main", "itwinjs-v5" ] workflow_dispatch: jobs: check-change-files: + if: github.bas_ref == 'main' runs-on: ubuntu-latest - name: Check change files + name: Check change files steps: - name: Checkout @@ -21,10 +22,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 cache: 'pnpm' - name: Install dependencies @@ -48,10 +49,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 cache: 'pnpm' - id: set-matrix @@ -104,10 +105,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 cache: 'pnpm' - name: Force dependency resolution @@ -161,6 +162,7 @@ jobs: CORE_VERSION: ${{ matrix.version }} - name: Lint + if: github.ref == 'refs/heads/main' run: pnpm run lint - name: Build diff --git a/.github/workflows/extract-api.yaml b/.github/workflows/extract-api.yaml index 4058aa5b1..7f0de64ed 100644 --- a/.github/workflows/extract-api.yaml +++ b/.github/workflows/extract-api.yaml @@ -35,10 +35,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 cache: 'pnpm' - name: Pnpm install diff --git a/.github/workflows/release-dev.yml b/.github/workflows/release-dev.yml index 4f712efbb..893907ac0 100644 --- a/.github/workflows/release-dev.yml +++ b/.github/workflows/release-dev.yml @@ -31,10 +31,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 registry-url: https://registry.npmjs.org/ - name: Install dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6bf973a53..74c9e8c5a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,10 +19,10 @@ jobs: with: version: 9.14.2 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v3 with: - node-version: 20.18.1 + node-version: 22.12.0 registry-url: https://registry.npmjs.org/ - name: Install dependencies diff --git a/.husky/pre-commit b/.husky/pre-commit index d4a43dd13..af5adff9d 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -npm run pre-commit +lint-staged \ No newline at end of file diff --git a/change/@itwin-imodel-transformer-6aca5427-b509-472e-8478-7883e75f326f.json b/change/@itwin-imodel-transformer-6aca5427-b509-472e-8478-7883e75f326f.json new file mode 100644 index 000000000..df8305faf --- /dev/null +++ b/change/@itwin-imodel-transformer-6aca5427-b509-472e-8478-7883e75f326f.json @@ -0,0 +1,7 @@ +{ + "type": "major", + "comment": "Upgrade to iTwin.js 5.0.", + "packageName": "@itwin/imodel-transformer", + "email": "22944042+pmconne@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/common/api/imodel-transformer.api.md b/common/api/imodel-transformer.api.md index c02af0f9d..44fe701af 100644 --- a/common/api/imodel-transformer.api.md +++ b/common/api/imodel-transformer.api.md @@ -21,6 +21,7 @@ import { EntityProps } from '@itwin/core-common'; import { EntityReference } from '@itwin/core-common'; import { ExternalSourceAspect } from '@itwin/core-backend'; import { ExternalSourceAspectProps } from '@itwin/core-common'; +import { FontFamilyDescriptor } from '@itwin/core-common'; import { FontProps } from '@itwin/core-common'; import { Helmert2DWithZOffset } from '@itwin/core-common'; import { Id64Arg } from '@itwin/core-bentley'; @@ -149,6 +150,8 @@ export class IModelExporter { exportCodeSpecByName(codeSpecName: string): Promise; exportCodeSpecs(): Promise; exportElement(elementId: Id64String): Promise; + exportFontByFontFamilyDescriptor(fontFamily: FontFamilyDescriptor): Promise; + exportFontByFontProps(fontProps: FontProps): Promise; exportFontByName(fontName: string): Promise; exportFontByNumber(fontNumber: number): Promise; exportFonts(): Promise; @@ -162,7 +165,7 @@ export class IModelExporter { initialize(options: ExporterInitOptions): Promise; progressInterval: number; registerHandler(handler: IModelExportHandler): void; - shouldExportElement(element: Element_2): boolean; + shouldExportElement(element: Element_2): Promise; readonly sourceDb: IModelDb; get sourceDbChanges(): ChangedInstanceIds | undefined; visitElements: boolean; @@ -174,57 +177,57 @@ export class IModelExporter { // @beta export abstract class IModelExportHandler { - onDeleteElement(_elementId: Id64String): void; - onDeleteModel(_modelId: Id64String): void; - onDeleteRelationship(_relInstanceId: Id64String): void; - onExportCodeSpec(_codeSpec: CodeSpec, _isUpdate: boolean | undefined): void; - onExportElement(_element: Element_2, _isUpdate: boolean | undefined): void; - onExportElementMultiAspects(_aspects: ElementMultiAspect[]): void; - onExportElementUniqueAspect(_aspect: ElementUniqueAspect, _isUpdate: boolean | undefined): void; - onExportFont(_font: FontProps, _isUpdate: boolean | undefined): void; - onExportModel(_model: Model, _isUpdate: boolean | undefined): void; - onExportRelationship(_relationship: Relationship, _isUpdate: boolean | undefined): void; + onDeleteElement(_elementId: Id64String): Promise; + onDeleteModel(_modelId: Id64String): Promise; + onDeleteRelationship(_relInstanceId: Id64String): Promise; + onExportCodeSpec(_codeSpec: CodeSpec, _isUpdate: boolean | undefined): Promise; + onExportElement(_element: Element_2, _isUpdate: boolean | undefined): Promise; + onExportElementMultiAspects(_aspects: ElementMultiAspect[]): Promise; + onExportElementUniqueAspect(_aspect: ElementUniqueAspect, _isUpdate: boolean | undefined): Promise; + onExportFont(_font: FontProps, _isUpdate: boolean | undefined): Promise; + onExportModel(_model: Model, _isUpdate: boolean | undefined): Promise; + onExportRelationship(_relationship: Relationship, _isUpdate: boolean | undefined): Promise; onExportSchema(_schema: Schema): Promise; onProgress(): Promise; - onSkipElement(_elementId: Id64String): void; + onSkipElement(_elementId: Id64String): Promise; // @internal preExportElement(_element: Element_2): Promise; - shouldExportCodeSpec(_codeSpec: CodeSpec): boolean; - shouldExportElement(_element: Element_2): boolean; - shouldExportElementAspect(_aspect: ElementAspect): boolean; - shouldExportRelationship(_relationship: Relationship): boolean; - shouldExportSchema(_schemaKey: SchemaKey): boolean; + shouldExportCodeSpec(_codeSpec: CodeSpec): Promise; + shouldExportElement(_element: Element_2): Promise; + shouldExportElementAspect(_aspect: ElementAspect): Promise; + shouldExportRelationship(_relationship: Relationship): Promise; + shouldExportSchema(_schemaKey: SchemaKey): Promise; } // @beta export class IModelImporter { constructor(targetDb: IModelDb, options?: IModelImportOptions); computeProjectExtents(): void; - deleteElement(elementId: Id64String): void; - deleteModel(modelId: Id64String): void; - deleteRelationship(relationshipProps: RelationshipPropsForDelete): void; + deleteElement(elementId: Id64String): Promise; + deleteModel(modelId: Id64String): Promise; + deleteRelationship(relationshipProps: RelationshipPropsForDelete): Promise; readonly doNotUpdateElementIds: Set; finalize(): void; - importElement(elementProps: ElementProps): Id64String; + importElement(elementProps: ElementProps): Promise; importElementMultiAspects(aspectPropsArray: ElementAspectProps[], - filterFunc?: (a: ElementMultiAspect) => boolean): Id64String[]; - importElementUniqueAspect(aspectProps: ElementAspectProps): Id64String; - importModel(modelProps: ModelProps): void; - importRelationship(relationshipProps: RelationshipProps): Id64String; + filterFunc?: (a: ElementMultiAspect) => boolean): Promise; + importElementUniqueAspect(aspectProps: ElementAspectProps): Promise; + importModel(modelProps: ModelProps): Promise; + importRelationship(relationshipProps: RelationshipProps): Promise; markElementToUpdateDuringPreserveIds(elementId: Id64String): void; - protected onDeleteElement(elementId: Id64String): void; - protected onDeleteElementAspect(targetElementAspect: ElementAspect): void; - protected onDeleteModel(modelId: Id64String): void; - protected onDeleteRelationship(relationshipProps: RelationshipPropsForDelete): void; - protected onInsertElement(elementProps: ElementProps): Id64String; - protected onInsertElementAspect(aspectProps: ElementAspectProps): Id64String; - protected onInsertModel(modelProps: ModelProps): Id64String; - protected onInsertRelationship(relationshipProps: RelationshipProps): Id64String; - protected onProgress(): void; - protected onUpdateElement(elementProps: ElementProps): void; - protected onUpdateElementAspect(aspectProps: ElementAspectProps): void; - protected onUpdateModel(modelProps: ModelProps): void; - protected onUpdateRelationship(relationshipProps: RelationshipProps): void; + protected onDeleteElement(elementId: Id64String): Promise; + protected onDeleteElementAspect(targetElementAspect: ElementAspect): Promise; + protected onDeleteModel(modelId: Id64String): Promise; + protected onDeleteRelationship(relationshipProps: RelationshipPropsForDelete): Promise; + protected onInsertElement(elementProps: ElementProps): Promise; + protected onInsertElementAspect(aspectProps: ElementAspectProps): Promise; + protected onInsertModel(modelProps: ModelProps): Promise; + protected onInsertRelationship(relationshipProps: RelationshipProps): Promise; + protected onProgress(): Promise; + protected onUpdateElement(elementProps: ElementProps): Promise; + protected onUpdateElementAspect(aspectProps: ElementAspectProps): Promise; + protected onUpdateModel(modelProps: ModelProps): Promise; + protected onUpdateRelationship(relationshipProps: RelationshipProps): Promise; optimizeGeometry(options: OptimizeGeometryOptions): void; readonly options: Required; progressInterval: number; @@ -233,6 +236,7 @@ export class IModelImporter { // @beta export interface IModelImportOptions { + acquireElementLocks?: boolean; autoExtendProjectExtents?: boolean | { excludeOutliers: boolean; }; @@ -250,18 +254,14 @@ export class IModelTransformer extends IModelExportHandler { calculateTransformFromHelmertTransforms(): Transform | undefined; combineElements(sourceElementIds: Id64Array, targetElementId: Id64String): void; // (undocumented) - protected completePartiallyCommittedAspects(): void; + protected completePartiallyCommittedAspects(): Promise; // (undocumented) - protected completePartiallyCommittedElements(): void; + protected completePartiallyCommittedElements(): Promise; readonly context: IModelCloneContext; // (undocumented) static convertHelmertToTransform(helmert: Helmert2DWithZOffset | undefined): Transform; - // @deprecated - detectElementDeletes(): Promise; - // @deprecated - detectRelationshipDeletes(): Promise; static determineSyncType(sourceDb: IModelDb, targetDb: IModelDb, - targetScopeElementId: Id64String): "forward" | "reverse"; + targetScopeElementId: Id64String): Promise<"forward" | "reverse">; dispose(): void; protected _elementsWithExplicitlyTrackedProvenance: Set; readonly exporter: IModelExporter; @@ -272,11 +272,17 @@ export class IModelTransformer extends IModelExportHandler { isReverseSynchronization: boolean; fn: (sourceElementId: Id64String, targetElementId: Id64String) => void; skipPropagateChangesToRootElements: boolean; - }): void; - protected get hasDefinitionContainerDeletionFeature(): boolean; + }): Promise; + // (undocumented) + getIsForwardSynchronization(): Promise; + // (undocumented) + getIsReverseSynchronization(): Promise; + getProvenanceDb(): Promise; + getProvenanceSourceDb(): Promise; + protected getSynchronizationVersion(): Promise; protected hasElementChanged(sourceElement: Element_2): boolean; readonly importer: IModelImporter; - initElementProvenance(sourceElementId: Id64String, targetElementId: Id64String): ExternalSourceAspectProps; + initElementProvenance(sourceElementId: Id64String, targetElementId: Id64String): Promise; static initElementProvenanceOptions(sourceElementId: Id64String, targetElementId: Id64String, args: { sourceDb: IModelDb; targetDb: IModelDb; @@ -291,27 +297,23 @@ export class IModelTransformer extends IModelExportHandler { isReverseSynchronization: boolean; targetScopeElementId: Id64String; forceOldRelationshipProvenanceMethod: boolean; - }): ExternalSourceAspectProps; - protected initScopeProvenance(): void; - // (undocumented) - get isForwardSynchronization(): boolean; - // (undocumented) - get isReverseSynchronization(): boolean; + }): Promise; + protected initScopeProvenance(): Promise; // (undocumented) static noEsaSyncDirectionErrorMessage: string; - onDeleteElement(sourceElementId: Id64String): void; - onDeleteModel(sourceModelId: Id64String): void; - onDeleteRelationship(sourceRelInstanceId: Id64String): void; - onExportCodeSpec(sourceCodeSpec: CodeSpec): void; - onExportElement(sourceElement: Element_2): void; - onExportElementMultiAspects(sourceAspects: ElementMultiAspect[]): void; - onExportElementUniqueAspect(sourceAspect: ElementUniqueAspect): void; - onExportFont(font: FontProps, _isUpdate: boolean | undefined): void; - onExportModel(sourceModel: Model): void; - onExportRelationship(sourceRelationship: Relationship): void; + onDeleteElement(sourceElementId: Id64String): Promise; + onDeleteModel(sourceModelId: Id64String): Promise; + onDeleteRelationship(sourceRelInstanceId: Id64String): Promise; + onExportCodeSpec(sourceCodeSpec: CodeSpec): Promise; + onExportElement(sourceElement: Element_2): Promise; + onExportElementMultiAspects(sourceAspects: ElementMultiAspect[]): Promise; + onExportElementUniqueAspect(sourceAspect: ElementUniqueAspect): Promise; + onExportFont(font: FontProps, _isUpdate: boolean | undefined): Promise; + onExportModel(sourceModel: Model): Promise; + onExportRelationship(sourceRelationship: Relationship): Promise; onExportSchema(schema: ECSchemaMetaData.Schema): Promise; - onTransformElement(sourceElement: Element_2): ElementProps; - protected onTransformElementAspect(sourceElementAspect: ElementAspect): ElementAspectProps; + onTransformElement(sourceElement: Element_2): Promise; + protected onTransformElementAspect(sourceElementAspect: ElementAspect): Promise; onTransformModel(sourceModel: Model, targetModeledElementId: Id64String): ModelProps; protected onTransformRelationship(sourceRelationship: Relationship): RelationshipProps; // (undocumented) @@ -331,36 +333,34 @@ export class IModelTransformer extends IModelExportHandler { processRelationships(baseRelClassFullName: string): Promise; processSchemas(): Promise; processSubject(sourceSubjectId: Id64String, targetSubjectId: Id64String): Promise; - get provenanceDb(): IModelDb; static get provenanceElementAspectClasses(): (typeof Entity)[]; static get provenanceElementClasses(): (typeof Entity)[]; - get provenanceSourceDb(): IModelDb; - static queryScopeExternalSourceAspect(dbToQuery: IModelDb, aspectProps: ExternalSourceAspectProps): { + static queryScopeExternalSourceAspect(dbToQuery: IModelDb, aspectProps: ExternalSourceAspectProps): Promise<{ aspectId: Id64String; version?: string; jsonProperties?: string; - } | undefined; + } | undefined>; protected _schemaExportDir: string; - protected shouldDetectDeletes(): boolean; - shouldExportCodeSpec(_sourceCodeSpec: CodeSpec): boolean; - shouldExportElement(_sourceElement: Element_2): boolean; + protected shouldDetectDeletes(): Promise; + shouldExportCodeSpec(_sourceCodeSpec: CodeSpec): Promise; + shouldExportElement(_sourceElement: Element_2): Promise; // (undocumented) - shouldExportElementAspect(aspect: ElementAspect): boolean; - shouldExportRelationship(_sourceRelationship: Relationship): boolean; - shouldExportSchema(schemaKey: ECSchemaMetaData.SchemaKey): boolean; + shouldExportElementAspect(aspect: ElementAspect): Promise; + shouldExportRelationship(_sourceRelationship: Relationship): Promise; + shouldExportSchema(schemaKey: ECSchemaMetaData.SchemaKey): Promise; readonly sourceDb: IModelDb; - protected get synchronizationVersion(): ChangesetIndexAndId; readonly targetDb: IModelDb; get targetScopeElementId(): Id64String; // (undocumented) - protected tryGetProvenanceScopeAspect(): ExternalSourceAspect | undefined; - updateSynchronizationVersion({ initializeReverseSyncVersion, }?: { + protected tryGetProvenanceScopeAspect(): Promise; + updateSynchronizationVersion(input?: { initializeReverseSyncVersion?: boolean | undefined; - }): void; + }): Promise; } // @beta export interface IModelTransformOptions { + acquireElementLocks?: boolean; argsForProcessChanges?: ProcessChangesOptions; branchRelationshipDataBehavior?: "unsafe-migrate" | "reject"; cloneUsingBinaryGeometry?: boolean; @@ -440,21 +440,23 @@ export interface TargetScopeProvenanceJsonProps { // @beta export class TemplateModelCloner extends IModelTransformer { constructor(sourceDb: IModelDb, targetDb?: IModelDb); - onTransformElement(sourceElement: Element_2): ElementProps; + onTransformElement(sourceElement: Element_2): Promise; placeTemplate2d(sourceTemplateModelId: Id64String, targetModelId: Id64String, placement: Placement2d): Promise>; placeTemplate3d(sourceTemplateModelId: Id64String, targetModelId: Id64String, placement: Placement3d): Promise>; } // @public export enum TransformerLoggerCategory { + // (undocumented) + ECReferenceTypesCache = "imodel-transformer.ECReferenceTypesCache", // @beta - IModelCloneContext = "core-backend.IModelCloneContext", + IModelCloneContext = "imodel-transformer.IModelCloneContext", // @beta - IModelExporter = "core-backend.IModelExporter", + IModelExporter = "imodel-transformer.IModelExporter", // @beta - IModelImporter = "core-backend.IModelImporter", + IModelImporter = "imodel-transformer.IModelImporter", // @beta - IModelTransformer = "core-backend.IModelTransformer" + IModelTransformer = "imodel-transformer.IModelTransformer" } // (No @packageDocumentation comment for this package) diff --git a/eslint.config.js b/eslint.config.js index 080332023..a0d1212f5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,110 +3,113 @@ const iTwinPlugin = require("@itwin/eslint-plugin"); const prettier = require("eslint-config-prettier/prettier"); module.exports = [ - { - files: ["**/*.ts"], - ...iTwinPlugin.configs.iTwinjsRecommendedConfig, + { + files: ["**/*.ts"], + ...iTwinPlugin.configs.iTwinjsRecommendedConfig, + }, + { + files: ["**/*.ts"], + rules: { + "@itwin/no-internal": [ + "warn", + { + tag: ["internal"], + }, + ], + "@typescript-eslint/naming-convention": [ + ...itwinjsRecommended.rules["@typescript-eslint/naming-convention"], + { + selector: "objectLiteralProperty", + format: null, + leadingUnderscore: "allowSingleOrDouble", + }, + ], + "@typescript-eslint/indent": ["off"], + "@typescript-eslint/dot-notation": [ + "error", + { + allowProtectedClassPropertyAccess: true, + allowPrivateClassPropertyAccess: true, + }, + ], + /** The following set of rules were manually turned off by using the output of 'npx eslint-config-prettier ./src/IModelTransformer.ts' + * which shows conflicting or unnecessary rules when using eslint + prettier. + */ + "@typescript-eslint/member-delimiter-style": ["off"], + "@typescript-eslint/no-extra-semi": ["off"], + "@typescript-eslint/semi": ["off"], + "@typescript-eslint/space-before-function-paren": ["off"], + "@typescript-eslint/type-annotation-spacing": ["off"], + "eol-last": ["off"], + "max-statements-per-line": ["off"], + "new-parens": ["off"], + "no-multiple-empty-lines": ["off"], + "no-trailing-spaces": ["off"], + "nonblock-statement-body-position": ["off"], + "quote-props": ["off"], + "arrow-parens": ["off"], + "brace-style": ["off"], + "comma-dangle": ["off"], + /** https://github.com/prettier/eslint-config-prettier#special-rules */ + quotes: [ + "error", + "double", + { avoidEscape: true, allowTemplateLiterals: false }, + ], }, - { - files: ["**/*.ts"], - rules: { - "@itwin/no-internal": [ - "warn", - { - tag: ["internal"], - }, - ], - "@typescript-eslint/naming-convention": [ - ...itwinjsRecommended.rules["@typescript-eslint/naming-convention"], - { - selector: "objectLiteralProperty", - format: null, - leadingUnderscore: "allowSingleOrDouble", - }, - ], - "@typescript-eslint/indent": ["off"], - "@typescript-eslint/dot-notation": [ - "error", - { - allowProtectedClassPropertyAccess: true, - allowPrivateClassPropertyAccess: true, - }, - ], - /** The following set of rules were manually turned off by using the output of 'npx eslint-config-prettier ./src/IModelTransformer.ts' - * which shows conflicting or unnecessary rules when using eslint + prettier. - */ - "@typescript-eslint/member-delimiter-style": ["off"], - "@typescript-eslint/no-extra-semi": ["off"], - "@typescript-eslint/semi": ["off"], - "@typescript-eslint/space-before-function-paren": ["off"], - "@typescript-eslint/type-annotation-spacing": ["off"], - "eol-last": ["off"], - "max-statements-per-line": ["off"], - "new-parens": ["off"], - "no-multiple-empty-lines": ["off"], - "no-trailing-spaces": ["off"], - "nonblock-statement-body-position": ["off"], - "quote-props": ["off"], - "arrow-parens": ["off"], - "brace-style": ["off"], - "comma-dangle": ["off"], - /** https://github.com/prettier/eslint-config-prettier#special-rules */ - "@typescript-eslint/quotes": [ - "error", "double", { "avoidEscape": true, "allowTemplateLiterals": false } - ] - }, + }, + { + files: ["**/*.ts"], + ...prettier, + }, + { + files: ["packages/transformer/**/*.ts"], + rules: { + "@typescript-eslint/no-unsafe-enum-comparison": "off", }, - { - files: ["**/*.ts"], - ...prettier, + languageOptions: { + parserOptions: { + project: "packages/transformer/tsconfig.json", + tsconfigRootDir: __dirname, + }, + sourceType: "commonjs", }, - { - files: ["packages/transformer/**/*.ts"], - rules: { - "@typescript-eslint/no-unsafe-enum-comparison": "off", + }, + { + files: ["packages/transformer/src/test/**/*.ts"], + rules: { + "@itwin/no-internal-barrel-imports": "off", + "@typescript-eslint/no-non-null-assertion": "off", + }, + }, + { + files: ["packages/performance-tests/**/*.ts"], + rules: { + "@typescript-eslint/naming-convention": [ + ...itwinjsRecommended.rules["@typescript-eslint/naming-convention"], + { + selector: ["objectLiteralProperty", "typeProperty"], + format: null, + leadingUnderscore: "allowSingleOrDouble", }, - languageOptions: { - parserOptions: { - project: "packages/transformer/tsconfig.json", - tsconfigRootDir: __dirname - }, - sourceType: "commonjs", - } + ], }, - { - files: ["packages/transformer/src/test/**/*.ts"], - rules: { - "@itwin/no-internal-barrel-imports": "off" - } + languageOptions: { + parserOptions: { + project: "packages/performance-tests/tsconfig.json", + tsconfigRootDir: __dirname, + }, + sourceType: "commonjs", }, - { - files: ["packages/performance-tests/**/*.ts"], - rules: { - "@typescript-eslint/naming-convention": [ - ...itwinjsRecommended.rules["@typescript-eslint/naming-convention"], - { - selector: ["objectLiteralProperty", "typeProperty"], - format: null, - leadingUnderscore: "allowSingleOrDouble", - }, - ], - }, - languageOptions: { - parserOptions: { - project: "packages/performance-tests/tsconfig.json", - tsconfigRootDir: __dirname - }, - sourceType: "commonjs", - } + }, + { + files: ["packages/test-app/**/*.ts"], + languageOptions: { + parserOptions: { + project: "packages/test-app/tsconfig.json", + tsconfigRootDir: __dirname, + }, + sourceType: "commonjs", }, - { - files: ["packages/test-app/**/*.ts"], - languageOptions: { - parserOptions: { - project: "packages/test-app/tsconfig.json", - tsconfigRootDir: __dirname - }, - sourceType: "commonjs", - } - } + }, ]; diff --git a/package.json b/package.json index 42a564394..fd7b8afd4 100644 --- a/package.json +++ b/package.json @@ -21,15 +21,15 @@ "publish-packages": "beachball publish", "publish-packages-dev": "beachball publish --config beachball.config.dev.js --keep-change-files", "pre-commit": "lint-staged", - "prepare": "husky install" + "prepare": "husky" }, "license": "MIT", "devDependencies": { - "beachball": "^2.33.3", - "fast-glob": "^3.2.12", - "husky": "^8.0.3", + "beachball": "^2.55.1", + "fast-glob": "^3.3.3", + "husky": "^9.1.7", "lint-staged": "^16.2.7", - "prettier": "^3.1.1" + "prettier": "^3.6.2" }, "lint-staged": { "*.{ts,html}": [ diff --git a/packages/performance-scripts/package.json b/packages/performance-scripts/package.json index 16eb55c22..351305e53 100644 --- a/packages/performance-scripts/package.json +++ b/packages/performance-scripts/package.json @@ -19,9 +19,9 @@ "author": "Bentley Systems, Inc.", "license": "MIT", "devDependencies": { - "@itwin/build-tools": "^4.10.6", - "@itwin/core-backend": "^4.3.5", - "@types/node": "^18.11.5", - "typescript": "~5.3.3" + "@itwin/build-tools": "^5.9.1", + "@itwin/core-backend": "^5.9.1", + "@types/node": "^22", + "typescript": "~5.6.2" } -} +} \ No newline at end of file diff --git a/packages/performance-tests/package.json b/packages/performance-tests/package.json index 42f8b6356..4ccfd430a 100644 --- a/packages/performance-tests/package.json +++ b/packages/performance-tests/package.json @@ -5,7 +5,6 @@ "version": "0.1.0", "scripts": { "build": "tsc 1>&2", - "build:ci": "npm run -s build", "clean": "rimraf lib", "lint": "eslint \"./test/**/*.ts\" 1>&2", "test": "mocha --delay --timeout 300000 --require ts-node/register test/**/*.test.ts", @@ -15,16 +14,18 @@ }, "repository": {}, "dependencies": { - "@itwin/core-backend": "^4.10.12", - "@itwin/core-bentley": "^4.10.12", - "@itwin/core-common": "^4.10.12", - "@itwin/core-geometry": "^4.10.12", - "@itwin/core-quantity": "^4.10.12", + "@itwin/core-backend": "^5.9.1", + "@itwin/core-bentley": "^5.9.1", + "@itwin/core-common": "^5.9.1", + "@itwin/core-geometry": "^5.9.1", + "@itwin/core-quantity": "^5.9.1", "@itwin/imodel-transformer": "workspace:*", - "@itwin/ecschema-metadata": "4.3.5", - "@itwin/imodels-access-backend": "^4.1.4", - "@itwin/imodels-client-authoring": "4.4.0", - "@itwin/node-cli-authorization": "~0.9.0", + "@itwin/ecschema-metadata": "^5.9.1", + "@itwin/imodels-access-backend": "^6.0.1", + "@itwin/imodels-client-authoring": "^6.0.1", + "@itwin/imodels-access-common": "^6.0.1", + "@itwin/object-storage-azure": "^3.0.4", + "@itwin/node-cli-authorization": "^3.0.1", "@itwin/perf-tools": "^4.10.12", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", @@ -32,23 +33,23 @@ "yargs": "^16.0.0" }, "devDependencies": { - "@itwin/build-tools": "^4.10.6", - "@itwin/eslint-plugin": "^4.0.2", - "@itwin/oidc-signin-tool": "^4.3.2", - "@itwin/itwins-client": "^1.2.1", + "@itwin/build-tools": "^5.9.1", + "@itwin/eslint-plugin": "^5.2.1", + "@itwin/oidc-signin-tool": "^5.0.0", + "@itwin/itwins-client": "^1.6.1", "@types/chai": "^4.1.4", "@types/fs-extra": "^4.0.7", "@types/mocha": "^8.2.2", - "@types/node": "14.14.31", + "@types/node": "^22", "@types/yargs": "^12.0.5", "chai": "^4.3.6", - "eslint": "^8.36.0", + "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", "prettier": "^3.1.1", "mocha": "^10.0.0", "rimraf": "^3.0.2", "ts-node": "^10.7.0", - "typescript": "~5.3.3" + "typescript": "~5.6.2" }, "eslintConfig": { "plugins": [ @@ -59,4 +60,4 @@ "project": "./tsconfig.json" } } -} +} \ No newline at end of file diff --git a/packages/performance-tests/test/TestContext.ts b/packages/performance-tests/test/TestContext.ts index aada3769c..5e58e5bb4 100644 --- a/packages/performance-tests/test/TestContext.ts +++ b/packages/performance-tests/test/TestContext.ts @@ -8,12 +8,11 @@ import { IModelHost, RequestNewBriefcaseArg, } from "@itwin/core-backend"; +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; import { Logger } from "@itwin/core-bentley"; import { IModelVersion, LocalBriefcaseProps } from "@itwin/core-common"; -import { - AccessTokenAdapter, - BackendIModelsAccess, -} from "@itwin/imodels-access-backend"; +import { BackendIModelsAccess } from "@itwin/imodels-access-backend"; +import { AccessTokenAdapter } from "@itwin/imodels-access-common"; import assert from "assert"; import { generateTestIModel } from "./iModelUtils"; @@ -44,15 +43,20 @@ export function getTShirtSizeFromName(name: string): TShirtSize { export async function* getTestIModels(filter: (iModel: TestIModel) => boolean) { assert(IModelHost.authorizationClient !== undefined); // eslint-disable-next-line @typescript-eslint/dot-notation, @itwin/no-internal - const hubClient = (IModelHost.hubAccess as BackendIModelsAccess)[ + const hubClient = (IModelHost[_hubAccess] as BackendIModelsAccess)[ "_iModelsClient" ]; for (const iTwinId of testITwinIds) { const iModels = hubClient.iModels.getMinimalList({ - authorization: AccessTokenAdapter.toAuthorizationCallback( - await IModelHost.authorizationClient.getAccessToken() - ), + authorization: AccessTokenAdapter.toAuthorizationCallback(async () => { + const authClient = IModelHost.authorizationClient; + if (!authClient) { + throw new Error("Authorization client is not initialized"); + } + const authTok = await authClient.getAccessToken(); + return authTok; + }), urlParams: { iTwinId }, }); @@ -94,7 +98,7 @@ export async function downloadBriefcase( const asOf = briefcaseArg.asOf ?? IModelVersion.latest().toJSON(); // eslint-disable-next-line @itwin/no-internal - const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ + const changeset = await IModelHost[_hubAccess].getChangesetFromVersion({ ...briefcaseArg, version: IModelVersion.fromJSON(asOf), }); diff --git a/packages/performance-tests/test/TransformerRegression.test.ts b/packages/performance-tests/test/TransformerRegression.test.ts index 20e781a3c..36e9f6250 100644 --- a/packages/performance-tests/test/TransformerRegression.test.ts +++ b/packages/performance-tests/test/TransformerRegression.test.ts @@ -17,7 +17,7 @@ import { IModelHost, IModelHostConfiguration, } from "@itwin/core-backend"; -import { DbResult, Logger, LogLevel } from "@itwin/core-bentley"; +import { Logger, LogLevel } from "@itwin/core-bentley"; import { IModelsClient } from "@itwin/imodels-client-authoring"; import { NodeCliAuthorizationClient } from "@itwin/node-cli-authorization"; import { Reporter } from "@itwin/perf-tools"; @@ -25,6 +25,10 @@ import { ReporterInfo } from "./ReporterUtils"; import { TestBrowserAuthorizationClient } from "@itwin/oidc-signin-tool"; import { TestTransformerModule } from "./TestTransformerModule"; import { TransformerLoggerCategory } from "@itwin/imodel-transformer"; +import { + AzureClientStorage, + BlockBlobClientWrapperFactory, +} from "@itwin/object-storage-azure"; import { filterIModels, initOutputFile, @@ -142,6 +146,7 @@ const setupTestData = async () => { api: { baseUrl: `https://${process.env.IMJS_URL_PREFIX}api.bentley.com/imodels`, }, + cloudStorage: new AzureClientStorage(new BlockBlobClientWrapperFactory()), }); // eslint-disable-next-line @itwin/no-internal hostConfig.hubAccess = new BackendIModelsAccess(hubClient); @@ -176,20 +181,14 @@ async function runRegressionTests() { fileName: sourceFileName, readonly: true, }); - // eslint-disable-next-line deprecation/deprecation - const fedGuidSaturation = sourceDb.withStatement( - ` - SELECT - CAST(SUM(hasGuid) AS DOUBLE)/COUNT(*) ratio - FROM ( - SELECT IIF(FederationGuid IS NOT NULL, 1, 0) AS hasGuid, - 1 AS [total] FROM bis.Element - )`, - (stmt) => { - assert(stmt.step() === DbResult.BE_SQLITE_ROW); - return stmt.getValue(0).getDouble(); - } + const fedGuidReader = sourceDb.createQueryReader( + "SELECT CAST(SUM(IIF(FederationGuid IS NOT NULL, 1, 0)) AS DOUBLE)/COUNT(*) AS ratio FROM bis.Element", + undefined, + { usePrimaryConn: true } ); + const fedGuidSaturation = (await fedGuidReader.step()) + ? (fedGuidReader.current[0] as number) + : 0; Logger.logInfo( loggerCategory, `Federation Guid Saturation '${fedGuidSaturation}'` diff --git a/packages/performance-tests/test/cases/identity-transformer.ts b/packages/performance-tests/test/cases/identity-transformer.ts index ab6b03678..89c652a9e 100644 --- a/packages/performance-tests/test/cases/identity-transformer.ts +++ b/packages/performance-tests/test/cases/identity-transformer.ts @@ -49,8 +49,7 @@ export default async function identityTransformer(context: TestCaseContext) { const schemaDumpDir = fs.mkdtempSync( path.join(os.tmpdir(), "identity-test-schemas-dump-") ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - sourceDb.nativeDb.exportSchemas(schemaDumpDir); + sourceDb.exportSchemas(schemaDumpDir); Logger.logInfo(loggerCategory, `dumped schemas to: ${schemaDumpDir}`); throw err; } finally { diff --git a/packages/performance-tests/test/cases/prepare-fork.ts b/packages/performance-tests/test/cases/prepare-fork.ts index bdb6147b4..854a2e7c6 100644 --- a/packages/performance-tests/test/cases/prepare-fork.ts +++ b/packages/performance-tests/test/cases/prepare-fork.ts @@ -51,8 +51,7 @@ export default async function prepareFork(context: TestCaseContext) { const schemaDumpDir = fs.mkdtempSync( path.join(os.tmpdir(), "fork-test-schemas-dump-") ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - sourceDb.nativeDb.exportSchemas(schemaDumpDir); + sourceDb.exportSchemas(schemaDumpDir); Logger.logInfo(loggerCategory, `dumped schemas to: ${schemaDumpDir}`); throw err; } finally { diff --git a/packages/performance-tests/test/iModelUtils.ts b/packages/performance-tests/test/iModelUtils.ts index e83ff963f..d894d17f1 100644 --- a/packages/performance-tests/test/iModelUtils.ts +++ b/packages/performance-tests/test/iModelUtils.ts @@ -7,14 +7,13 @@ import * as path from "path"; import { ElementGroupsMembers, IModelDb, - IModelHost, PhysicalModel, PhysicalObject, SpatialCategory, StandaloneDb, } from "@itwin/core-backend"; import { Guid, OpenMode } from "@itwin/core-bentley"; -import { BriefcaseIdValue, Code } from "@itwin/core-common"; +import { Code } from "@itwin/core-common"; import { initOutputFile } from "./TestUtils"; import { Point3d, YawPitchRollAngles } from "@itwin/core-geometry"; import { IModelTransformerTestUtils } from "@itwin/imodel-transformer/lib/cjs/test/IModelTransformerUtils"; @@ -31,16 +30,7 @@ export interface IModelParams { // TODO: dedup with other packages // for testing purposes only, based on SetToStandalone.ts, force a snapshot to mimic a standalone iModel export function setToStandalone(iModelPath: string) { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const nativeDb = new IModelHost.platform.DgnDb(); - nativeDb.openIModel(iModelPath, OpenMode.ReadWrite); - nativeDb.setITwinId(Guid.empty); // empty iTwinId means "standalone" - nativeDb.saveChanges(); // save change to iTwinId - nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId - nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned); // standalone iModels should always have BriefcaseId unassigned - nativeDb.saveLocalValue("StandaloneEdit", JSON.stringify({ txns: true })); - nativeDb.saveChanges(); // save change to briefcaseId - nativeDb.closeFile(); + StandaloneDb.convertToStandalone(iModelPath); } export function generateTestIModel(iModelParam: IModelParams): TestIModel { diff --git a/packages/performance-tests/test/rawInserts.ts b/packages/performance-tests/test/rawInserts.ts index 658d0abb1..e91b7c1d3 100644 --- a/packages/performance-tests/test/rawInserts.ts +++ b/packages/performance-tests/test/rawInserts.ts @@ -2,12 +2,10 @@ * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { ChangesetFileProps } from "@itwin/core-common"; import { // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementGroupsMembers, - IModelDb, SnapshotDb, StandaloneDb, } from "@itwin/core-backend"; @@ -19,7 +17,6 @@ import { TestIModel } from "./TestContext"; import { generateTestIModel } from "./iModelUtils"; import { initOutputFile, timed } from "./TestUtils"; import assert from "assert"; -import fs from "fs"; import path from "path"; const loggerCategory = "Raw Inserts"; @@ -70,41 +67,6 @@ export default async function rawInserts( sourceDb.saveChanges(); - Logger.logInfo( - loggerCategory, - "Done. Starting changeset application of same content" - ); - - const changeset1 = createChangeset(sourceDb); - const changesetDbPath = initOutputFile("RawInsertsApply.bim", outputDir); - if (fs.existsSync(changesetDbPath)) fs.unlinkSync(changesetDbPath); - const changesetDb = StandaloneDb.createEmpty(changesetDbPath, { - rootSubject: { name: "RawInsertsApply" }, - }); - - const [applyChangeSetTimer] = timed(() => { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - changesetDb.nativeDb.applyChangeset(changeset1); - }); - - reporter.addEntry( - "populate by applying changeset", - iModelName, - "time elapsed (seconds)", - applyChangeSetTimer?.elapsedSeconds ?? -1, - { - "Element Count": IModelTransformerTestUtils.count( - sourceDb, - Element.classFullName - ), - "Relationship Count": IModelTransformerTestUtils.count( - sourceDb, - ElementGroupsMembers.classFullName - ), - "Branch Name": branchName, - } - ); - Logger.logInfo( loggerCategory, "Done. Starting with-provenance transformation of same content" @@ -179,23 +141,6 @@ export default async function rawInserts( ); sourceDb.close(); - changesetDb.close(); targetDb.close(); targetNoProvDb.close(); } - -// stolen from itwinjs-core: core/backend/src/test/changesets/ChangeMerging.test.ts -function createChangeset(imodel: IModelDb): ChangesetFileProps { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const changeset = imodel.nativeDb.startCreateChangeset(); - - // completeCreateChangeset deletes the file that startCreateChangeSet created. - // We make a copy of it now, before it does that. - const csFileName = path.join(outputDir, `${changeset.id}.changeset`); - fs.copyFileSync(changeset.pathname, csFileName); - changeset.pathname = csFileName; - - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - imodel.nativeDb.completeCreateChangeset({ index: 0 }); - return changeset as any; // FIXME: bad peer deps -} diff --git a/packages/performance-tests/test/transformers/NativeTransformer.ts b/packages/performance-tests/test/transformers/NativeTransformer.ts index 02665392e..ea4820dac 100644 --- a/packages/performance-tests/test/transformers/NativeTransformer.ts +++ b/packages/performance-tests/test/transformers/NativeTransformer.ts @@ -33,11 +33,13 @@ class ProgressTransformer extends IModelTransformer { if (this._count % 1000 === 0) Logger.logInfo(loggerCategory, `exported ${this._count} entities`); } - public override onExportElement(sourceElement: Element): void { + public override async onExportElement(sourceElement: Element): Promise { this._increment(); return super.onExportElement(sourceElement); } - public override onExportRelationship(sourceRelationship: Relationship): void { + public override async onExportRelationship( + sourceRelationship: Relationship + ): Promise { this._increment(); return super.onExportRelationship(sourceRelationship); } @@ -82,7 +84,7 @@ const nativeTransformerTestModule: TestTransformerModule = { code: Code.createEmpty(), repository: new ExternalSourceIsInRepository(masterLinkRepoId), connectorName: "iModel Transformer", - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports connectorVersion: require("@itwin/imodel-transformer/package.json") .version, } as ExternalSourceProps); diff --git a/packages/test-app/config/rush-project.json b/packages/test-app/config/rush-project.json deleted file mode 100644 index 10683a57d..000000000 --- a/packages/test-app/config/rush-project.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush-project.schema.json", - "operationSettings": [ - { "operationName": "build", "outputFolderNames": ["lib"] }, - { "operationName": "build:ci", "outputFolderNames": ["lib"] } - ] -} diff --git a/packages/test-app/package.json b/packages/test-app/package.json index d76fc7b36..e4cecac8b 100644 --- a/packages/test-app/package.json +++ b/packages/test-app/package.json @@ -6,7 +6,6 @@ "version": "0.1.0", "scripts": { "build": "tsc 1>&2", - "build:ci": "npm run -s build", "clean": "rimraf lib .rush/temp/package-deps*.json", "cover": "", "docs": "", @@ -19,35 +18,38 @@ }, "repository": {}, "dependencies": { - "@itwin/core-backend": "^4.10.12", - "@itwin/core-bentley": "^4.10.12", - "@itwin/core-common": "^4.10.12", - "@itwin/core-geometry": "^4.10.12", - "@itwin/imodels-access-backend": "^2.2.1", - "@itwin/imodels-client-authoring": "2.3.0", + "@itwin/core-backend": "^5.9.1", + "@itwin/core-bentley": "^5.9.1", + "@itwin/core-common": "^5.9.1", + "@itwin/core-geometry": "^5.9.1", + "@itwin/imodels-access-backend": "^6.0.2", + "@itwin/imodels-client-authoring": "^6.0.2", + "@itwin/imodels-access-common": "^6.0.2", + "@itwin/imodels-client-management": "^6.0.2", "@itwin/imodel-transformer": "workspace:*", - "@itwin/node-cli-authorization": "~0.9.0", + "@itwin/object-storage-azure": "^3.0.4", + "@itwin/node-cli-authorization": "^3.0.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "fs-extra": "^8.1.0", "yargs": "^17.7.2" }, "devDependencies": { - "@itwin/build-tools": "^4.10.6", - "@itwin/eslint-plugin": "4.0.2", + "@itwin/build-tools": "^5.9.1", + "@itwin/eslint-plugin": "^5.2.1", "@itwin/projects-client": "^0.6.0", "@types/chai": "4.3.1", "@types/fs-extra": "^4.0.12", "@types/mocha": "^8.2.3", - "@types/node": "^18.16.14", + "@types/node": "^22", "@types/yargs": "17.0.19", "cross-env": "^5.2.1", - "eslint": "^8.36.0", + "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", "prettier": "^3.1.1", "mocha": "^10.2.0", "rimraf": "^3.0.2", "source-map-support": "^0.5.21", - "typescript": "^5.3.3" + "typescript": "^5.6.2" } } \ No newline at end of file diff --git a/packages/test-app/src/ElementUtils.ts b/packages/test-app/src/ElementUtils.ts index f597272c5..5ecc77b25 100644 --- a/packages/test-app/src/ElementUtils.ts +++ b/packages/test-app/src/ElementUtils.ts @@ -3,13 +3,12 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { DbResult, Id64Array, Id64Set, Id64String } from "@itwin/core-bentley"; +import { Id64Array, Id64Set, Id64String } from "@itwin/core-bentley"; import { Category, CategorySelector, DisplayStyle, DisplayStyle3d, - ECSqlStatement, ExternalSourceAspect, GeometricModel3d, IModelDb, @@ -20,26 +19,27 @@ import { SubCategory, ViewDefinition, } from "@itwin/core-backend"; -import { IModel } from "@itwin/core-common"; +import { IModel, QueryBinder } from "@itwin/core-common"; export namespace ElementUtils { - function queryElementIds(iModelDb: IModelDb, classFullName: string): Id64Set { + async function queryElementIds( + iModelDb: IModelDb, + classFullName: string + ): Promise { const elementIds = new Set(); - // eslint-disable-next-line deprecation/deprecation - iModelDb.withPreparedStatement( - `SELECT ECInstanceId FROM ${classFullName}`, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement) => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - elementIds.add(statement.getValue(0).getId()); - } - } - ); + const sql = `SELECT ECInstanceId FROM ${classFullName}`; + for await (const row of iModelDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + elementIds.add(row.id); + } return elementIds; } - export function validateModelSelectors(iModelDb: IModelDb): void { - const modelSelectorIds = queryElementIds( + export async function validateModelSelectors( + iModelDb: IModelDb + ): Promise { + const modelSelectorIds = await queryElementIds( iModelDb, ModelSelector.classFullName ); @@ -59,8 +59,10 @@ export namespace ElementUtils { }); } - export function validateCategorySelectors(iModelDb: IModelDb): void { - const categorySelectorIds = queryElementIds( + export async function validateCategorySelectors( + iModelDb: IModelDb + ): Promise { + const categorySelectorIds = await queryElementIds( iModelDb, CategorySelector.classFullName ); @@ -80,8 +82,10 @@ export namespace ElementUtils { }); } - export function validateDisplayStyles(iModelDb: IModelDb): void { - const displayStyleIds = queryElementIds( + export async function validateDisplayStyles( + iModelDb: IModelDb + ): Promise { + const displayStyleIds = await queryElementIds( iModelDb, DisplayStyle.classFullName ); @@ -108,17 +112,21 @@ export namespace ElementUtils { } } - export function queryProvenanceScopeIds(iModelDb: IModelDb): Id64Set { + export async function queryProvenanceScopeIds( + iModelDb: IModelDb + ): Promise { const elementIds = new Set(); if (iModelDb.containsClass(ExternalSourceAspect.classFullName)) { - const sql = `SELECT Element.Id FROM ${ExternalSourceAspect.classFullName} WHERE Kind=:kind`; - // eslint-disable-next-line deprecation/deprecation - iModelDb.withPreparedStatement(sql, (statement: ECSqlStatement) => { - statement.bindString("kind", ExternalSourceAspect.Kind.Scope); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - elementIds.add(statement.getValue(0).getId()); - } - }); + const sql = `SELECT Element.Id FROM ${ExternalSourceAspect.classFullName} WHERE Kind=kind`; + const bindings = new QueryBinder().bindString( + "kind", + ExternalSourceAspect.Kind.Scope + ); + for await (const row of iModelDb.createQueryReader(sql, bindings, { + usePrimaryConn: true, + })) { + elementIds.add(row.id); + } } return elementIds; } @@ -129,11 +137,10 @@ export namespace ElementUtils { * @param makeDefault If `true` make the inserted ViewDefinition the default view. * @returns The Id of the ViewDefinition that was found or inserted. */ - export function insertViewDefinition( + export async function insertViewDefinition( iModelDb: IModelDb, - name: string, - makeDefault?: boolean - ): Id64String { + name: string + ): Promise { const definitionModelId = IModel.dictionaryId; const viewCode = ViewDefinition.createCode( iModelDb, @@ -146,13 +153,13 @@ export namespace ElementUtils { iModelDb, definitionModelId, name, - queryModelIds(iModelDb, SpatialModel.classFullName) + await queryModelIds(iModelDb, SpatialModel.classFullName) ); const categorySelectorId = CategorySelector.insert( iModelDb, definitionModelId, name, - querySpatialCategoryIds(iModelDb) + await querySpatialCategoryIds(iModelDb) ); const displayStyleId = DisplayStyle3d.insert( iModelDb, @@ -168,39 +175,35 @@ export namespace ElementUtils { displayStyleId, iModelDb.projectExtents ); - if (makeDefault) { - // eslint-disable-next-line deprecation/deprecation - iModelDb.views.setDefaultViewId(viewId); - } iModelDb.saveChanges("Inserted ViewDefinition"); } return viewId; } - function queryModelIds( + async function queryModelIds( iModelDb: IModelDb, modelClassFullName: string - ): Id64Array { + ): Promise { const modelIds: Id64Array = []; const sql = `SELECT ECInstanceId FROM ${modelClassFullName} WHERE IsTemplate=false`; - // eslint-disable-next-line deprecation/deprecation - iModelDb.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - modelIds.push(statement.getValue(0).getId()); - } - }); + for await (const row of iModelDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + modelIds.push(row.id); + } return modelIds; } - function querySpatialCategoryIds(iModelDb: IModelDb): Id64Array { + async function querySpatialCategoryIds( + iModelDb: IModelDb + ): Promise { const categoryIds: Id64Array = []; const sql = `SELECT ECInstanceId FROM ${SpatialCategory.classFullName}`; - // eslint-disable-next-line deprecation/deprecation - iModelDb.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - categoryIds.push(statement.getValue(0).getId()); - } - }); + for await (const row of iModelDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + categoryIds.push(row.id); + } return categoryIds; } } diff --git a/packages/test-app/src/IModelHubUtils.ts b/packages/test-app/src/IModelHubUtils.ts index ab6da6db5..feff79e71 100644 --- a/packages/test-app/src/IModelHubUtils.ts +++ b/packages/test-app/src/IModelHubUtils.ts @@ -7,23 +7,24 @@ import { AccessToken, GuidString, Logger } from "@itwin/core-bentley"; import * as assert from "assert"; import { NodeCliAuthorizationClient } from "@itwin/node-cli-authorization"; -import { - AccessTokenAdapter, - BackendIModelsAccess, -} from "@itwin/imodels-access-backend"; +import { BackendIModelsAccess } from "@itwin/imodels-access-backend"; +import { AccessTokenAdapter } from "@itwin/imodels-access-common"; +import type { NamedVersion } from "@itwin/imodels-client-management"; import { BriefcaseDb, BriefcaseManager, IModelHost, RequestNewBriefcaseArg, } from "@itwin/core-backend"; +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; import { BriefcaseIdValue, ChangesetId, ChangesetIndex, ChangesetProps, } from "@itwin/core-common"; -import { IModelsClient, NamedVersion } from "@itwin/imodels-client-authoring"; +import { IModelsClient } from "@itwin/imodels-client-authoring"; +import { AzureClientStorage, BlockBlobClientWrapperFactory } from "@itwin/object-storage-azure"; import { loggerCategory } from "./Transformer"; export class IModelTransformerTestAppHost { @@ -36,6 +37,7 @@ export class IModelTransformerTestAppHost { process.env.IMJS_URL_PREFIX ?? "" }api.bentley.com/imodels`, }, + cloudStorage: new AzureClientStorage(new BlockBlobClientWrapperFactory()), }); const hubAccess = new BackendIModelsAccess( IModelTransformerTestAppHost.iModelClient @@ -80,7 +82,7 @@ export namespace IModelHubUtils { iModelName: string ): Promise { // eslint-disable-next-line @itwin/no-internal - return IModelHost.hubAccess.queryIModelByName({ + return IModelHost[_hubAccess].queryIModelByName({ accessToken, iTwinId, iModelName, @@ -98,7 +100,7 @@ export namespace IModelHubUtils { return ( // eslint-disable-next-line @itwin/no-internal ( - await IModelHost.hubAccess.queryChangeset({ + await IModelHost[_hubAccess].queryChangeset({ accessToken, iModelId, changeset: { index: changesetIndex }, @@ -116,7 +118,7 @@ export namespace IModelHubUtils { changesetId: ChangesetId ): Promise { return ( - await IModelHost.hubAccess.queryChangeset({ + await IModelHost[_hubAccess].queryChangeset({ accessToken, iModelId, changeset: { id: changesetId }, @@ -130,7 +132,7 @@ export namespace IModelHubUtils { iModelId: GuidString, func: (c: ChangesetProps) => void ): Promise { - const changesets = await IModelHost.hubAccess.queryChangesets({ + const changesets = await IModelHost[_hubAccess].queryChangesets({ accessToken, iModelId, }); diff --git a/packages/test-app/src/Main.ts b/packages/test-app/src/Main.ts index 497ac4481..89d51e061 100644 --- a/packages/test-app/src/Main.ts +++ b/packages/test-app/src/Main.ts @@ -6,7 +6,7 @@ import * as path from "path"; import * as fs from "fs"; import * as Yargs from "yargs"; -import { assert, Guid, Logger, LogLevel, OpenMode } from "@itwin/core-bentley"; +import { assert, Guid, Logger, LogLevel } from "@itwin/core-bentley"; import { ProjectsAccessClient } from "@itwin/projects-client"; import { BriefcaseDb, @@ -16,6 +16,7 @@ import { SnapshotDb, StandaloneDb, } from "@itwin/core-backend"; +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; import { BriefcaseIdValue, ChangesetId, @@ -23,7 +24,7 @@ import { IModelVersion, } from "@itwin/core-common"; import { TransformerLoggerCategory } from "@itwin/imodel-transformer"; -import { NamedVersion } from "@itwin/imodels-client-authoring"; +import { NamedVersion } from "@itwin/imodels-client-management"; import { ElementUtils } from "./ElementUtils"; import { IModelHubUtils, IModelTransformerTestAppHost } from "./IModelHubUtils"; // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -411,9 +412,9 @@ void (async () => { if (args.validation) { // validate that there are no issues with the sourceDb to ensure that IModelTransformer is starting from a consistent state - ElementUtils.validateCategorySelectors(sourceDb); - ElementUtils.validateModelSelectors(sourceDb); - ElementUtils.validateDisplayStyles(sourceDb); + await ElementUtils.validateCategorySelectors(sourceDb); + await ElementUtils.validateModelSelectors(sourceDb); + await ElementUtils.validateDisplayStyles(sourceDb); } if (args.targetITwinId) { @@ -438,7 +439,7 @@ void (async () => { args.targetIModelName ); if (args.clean && undefined !== targetIModelId) { - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ accessToken: await acquireAccessToken(), iTwinId: targetITwinId, iModelId: targetIModelId, @@ -447,7 +448,7 @@ void (async () => { } if (undefined === targetIModelId) { // create target iModel if it doesn't yet exist or was just cleaned/deleted above - targetIModelId = await IModelHost.hubAccess.createNewIModel({ + targetIModelId = await IModelHost[_hubAccess].createNewIModel({ accessToken: await acquireAccessToken(), iTwinId: targetITwinId, iModelName: args.targetIModelName, @@ -496,24 +497,8 @@ void (async () => { if (args.targetStandaloneDestination) { fs.copyFileSync(fileName, args.targetStandaloneDestination); - function setToStandalone(iModelPath: string) { - /* eslint-disable deprecation/deprecation */ - const nativeDb = new IModelHost.platform.DgnDb(); - nativeDb.openIModel(iModelPath, OpenMode.ReadWrite); - nativeDb.setITwinId(Guid.empty); // empty iTwinId means "standalone" - nativeDb.saveChanges(); // save change to iTwinId - nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId - nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned); // standalone iModels should always have BriefcaseId unassigned - nativeDb.saveLocalValue( - "StandaloneEdit", - JSON.stringify({ txns: true }) - ); - nativeDb.saveChanges(); // save change to briefcaseId - nativeDb.closeFile(); - } - /* eslint-enable deprecation/deprecation */ targetDb.close(); - setToStandalone(args.targetStandaloneDestination); + StandaloneDb.convertToStandalone(args.targetStandaloneDestination); await StandaloneDb.upgradeSchemas({ fileName }); targetDb = StandaloneDb.openFile(args.targetStandaloneDestination); } @@ -540,7 +525,8 @@ void (async () => { } if (args.logProvenanceScopes) { - const sourceScopeIds = ElementUtils.queryProvenanceScopeIds(sourceDb); + const sourceScopeIds = + await ElementUtils.queryProvenanceScopeIds(sourceDb); if (sourceScopeIds.size === 0) { Logger.logInfo(loggerCategory, "Source Provenance Scope: Not Found"); } else { @@ -553,7 +539,8 @@ void (async () => { ) ); } - const targetScopeIds = ElementUtils.queryProvenanceScopeIds(targetDb); + const targetScopeIds = + await ElementUtils.queryProvenanceScopeIds(targetDb); if (targetScopeIds.size === 0) { Logger.logInfo(loggerCategory, "Target Provenance Scope: Not Found"); } else { @@ -615,14 +602,14 @@ void (async () => { } if (args.exportViewDefinition) { - ElementUtils.insertViewDefinition(targetDb, "Default", true); + await ElementUtils.insertViewDefinition(targetDb, "Default"); } if (args.validation) { // validate that there are no issues with the targetDb after transformation - ElementUtils.validateCategorySelectors(targetDb); - ElementUtils.validateModelSelectors(targetDb); - ElementUtils.validateDisplayStyles(targetDb); + await ElementUtils.validateCategorySelectors(targetDb); + await ElementUtils.validateModelSelectors(targetDb); + await ElementUtils.validateDisplayStyles(targetDb); } } catch (error: any) { process.stdout.write(`${error.message}\n${error.stack}`); diff --git a/packages/test-app/src/Transformer.ts b/packages/test-app/src/Transformer.ts index 0d557facc..7836c3d6e 100644 --- a/packages/test-app/src/Transformer.ts +++ b/packages/test-app/src/Transformer.ts @@ -5,7 +5,6 @@ import { assert, - DbResult, Id64, Id64Array, Id64Set, @@ -17,7 +16,6 @@ import { CategorySelector, DisplayStyle, DisplayStyle3d, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementRefersToElements, @@ -38,7 +36,7 @@ import { IModelTransformer, IModelTransformOptions, } from "@itwin/imodel-transformer"; -import { ElementProps, IModel } from "@itwin/core-common"; +import { ElementProps, IModel, QueryBinder } from "@itwin/core-common"; export const loggerCategory = "imodel-transformer"; @@ -67,12 +65,13 @@ export class Transformer extends IModelTransformer { ): Promise { // might need to inject RequestContext for schemaExport. const transformer = new Transformer(sourceDb, targetDb, options); + await transformer.initializeTransformer(); await transformer.processSchemas(); await transformer.saveChanges("processSchemas"); await transformer.process(); await transformer.saveChanges("processAll"); if (options?.deleteUnusedGeometryParts) { - transformer.deleteUnusedGeometryParts(); + await transformer.deleteUnusedGeometryParts(); await transformer.saveChanges("deleteUnusedGeometryParts"); } transformer.dispose(); @@ -95,12 +94,13 @@ export class Transformer extends IModelTransformer { startChangeset: { id: sourceStartChangesetId }, }, }); + await transformer.initializeTransformer(); await transformer.processSchemas(); await transformer.saveChanges("processSchemas"); await transformer.process(); await transformer.saveChanges("processChanges"); if (options?.deleteUnusedGeometryParts) { - transformer.deleteUnusedGeometryParts(); + await transformer.deleteUnusedGeometryParts(); await transformer.saveChanges("deleteUnusedGeometryParts"); } transformer.dispose(); @@ -119,7 +119,7 @@ export class Transformer extends IModelTransformer { options?: TransformerOptions ): Promise { class IsolateElementsTransformer extends Transformer { - public override shouldExportElement(sourceElement: Element) { + public override async shouldExportElement(sourceElement: Element) { if ( !includeChildren && (isolatedElementIds.some((id) => sourceElement.parent?.id === id) || @@ -134,18 +134,21 @@ export class Transformer extends IModelTransformer { targetDb, options ); + await transformer.initializeTransformer(); await transformer.processSchemas(); await transformer.saveChanges("processSchemas"); for (const id of isolatedElementIds) await transformer.processElement(id); await transformer.saveChanges("process isolated elements"); if (options?.deleteUnusedGeometryParts) { - transformer.deleteUnusedGeometryParts(); + await transformer.deleteUnusedGeometryParts(); await transformer.saveChanges("deleteUnusedGeometryParts"); } transformer.logElapsedTime(); return transformer; } + private _transformerOptions?: TransformerOptions; + private constructor( sourceDb: IModelDb, targetDb: IModelDb, @@ -159,6 +162,8 @@ export class Transformer extends IModelTransformer { options ); + this._transformerOptions = options; + Logger.logInfo(loggerCategory, `sourceDb=${this.sourceDb.pathName}`); Logger.logInfo(loggerCategory, `targetDb=${this.targetDb.pathName}`); this.logChangeTrackingMemoryUsed(); @@ -213,40 +218,46 @@ export class Transformer extends IModelTransformer { } } } - if (options?.excludeSubCategories) { - this.excludeSubCategories(options.excludeSubCategories); + } + + /** Async initialization that must be called after construction */ + private async initializeTransformer(): Promise { + if (this._transformerOptions?.excludeSubCategories) { + await this.excludeSubCategories( + this._transformerOptions.excludeSubCategories + ); } - if (options?.excludeCategories) { - this.excludeCategories(options.excludeCategories); + if (this._transformerOptions?.excludeCategories) { + await this.excludeCategories(this._transformerOptions.excludeCategories); } // query for and log the number of source Elements that will be processed - // eslint-disable-next-line deprecation/deprecation - this._numSourceElements = this.sourceDb.withPreparedStatement( - `SELECT COUNT(*) FROM ${Element.classFullName}`, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): number => { - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getInteger() - : 0; - } - ); + const elemCountResult = await this.sourceDb + .createQueryReader( + `SELECT COUNT(*) FROM ${Element.classFullName}`, + undefined, + { usePrimaryConn: true } + ) + .next(); + this._numSourceElements = elemCountResult.done + ? 0 + : (elemCountResult.value[0] as number); Logger.logInfo( loggerCategory, `numSourceElements=${this._numSourceElements}` ); // query for and log the number of source Relationships that will be processed - // eslint-disable-next-line deprecation/deprecation - this._numSourceRelationships = this.sourceDb.withPreparedStatement( - `SELECT COUNT(*) FROM ${ElementRefersToElements.classFullName}`, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): number => { - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getInteger() - : 0; - } - ); + const relCountResult = await this.sourceDb + .createQueryReader( + `SELECT COUNT(*) FROM ${ElementRefersToElements.classFullName}`, + undefined, + { usePrimaryConn: true } + ) + .next(); + this._numSourceRelationships = relCountResult.done + ? 0 + : (relCountResult.value[0] as number); Logger.logInfo( loggerCategory, `numSourceRelationships=${this._numSourceRelationships}` @@ -257,20 +268,18 @@ export class Transformer extends IModelTransformer { * @param subCategoryNames Array of SubCategory names to exclude * @note This sample code assumes that you want to exclude all SubCategories of a given name regardless of parent Category */ - private excludeSubCategories(subCategoryNames: string[]): void { - const sql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE CodeValue=:subCategoryName`; + private async excludeSubCategories( + subCategoryNames: string[] + ): Promise { for (const subCategoryName of subCategoryNames) { - // eslint-disable-next-line deprecation/deprecation - this.sourceDb.withPreparedStatement( + const sql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE CodeValue=?`; + for await (const row of this.sourceDb.createQueryReader( sql, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): void => { - statement.bindString("subCategoryName", subCategoryName); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - this.excludeSubCategory(statement.getValue(0).getId()); - } - } - ); + QueryBinder.from([subCategoryName]), + { usePrimaryConn: true } + )) { + this.excludeSubCategory(row.id); + } } } @@ -294,68 +303,54 @@ export class Transformer extends IModelTransformer { * @param CategoryNames Array of Category names to exclude * @note This sample code assumes that you want to exclude all Categories of a given name regardless of the containing model (that scopes the CodeValue). */ - private excludeCategories(categoryNames: string[]): void { - const sql = `SELECT ECInstanceId FROM ${Category.classFullName} WHERE CodeValue=:categoryName`; + private async excludeCategories(categoryNames: string[]): Promise { for (const categoryName of categoryNames) { - // eslint-disable-next-line deprecation/deprecation - this.sourceDb.withPreparedStatement( + const sql = `SELECT ECInstanceId FROM ${Category.classFullName} WHERE CodeValue=?`; + for await (const row of this.sourceDb.createQueryReader( sql, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): void => { - statement.bindString("categoryName", categoryName); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const categoryId = statement.getValue(0).getId(); - this.exporter.excludeElementsInCategory(categoryId); // exclude elements in this category - this.exporter.excludeElement(categoryId); // exclude the category element itself - } - } - ); + QueryBinder.from([categoryName]), + { usePrimaryConn: true } + )) { + const categoryId = row.id; + this.exporter.excludeElementsInCategory(categoryId); // exclude elements in this category + this.exporter.excludeElement(categoryId); // exclude the category element itself + } } } /** Excludes categories not referenced by the specified Id64Set. */ private excludeCategoriesExcept(categoryIds: Id64Set): void { - const sql = `SELECT ECInstanceId FROM ${SpatialCategory.classFullName}`; - // eslint-disable-next-line deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const categoryId = statement.getValue(0).getId(); - if (!categoryIds.has(categoryId)) { - this.exporter.excludeElementsInCategory(categoryId); // exclude elements in this category - this.exporter.excludeElement(categoryId); // exclude the category element itself - } - } + const allCategoryIds = this.sourceDb.queryEntityIds({ + from: SpatialCategory.classFullName, + }); + for (const categoryId of allCategoryIds) { + if (!categoryIds.has(categoryId)) { + this.exporter.excludeElementsInCategory(categoryId); // exclude elements in this category + this.exporter.excludeElement(categoryId); // exclude the category element itself } - ); + } } /** Excludes models not referenced by the specified Id64Set. * @note This really excludes the *modeled element* (which also excludes the model) since we don't want *modeled elements* without a sub-model. */ private excludeModelsExcept(modelIds: Id64Set): void { - const sql = `SELECT ECInstanceId FROM ${GeometricModel3d.classFullName}`; - // eslint-disable-next-line deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const modelId = statement.getValue(0).getId(); - if (!modelIds.has(modelId)) { - this.exporter.excludeElement(modelId); // exclude the category element itself - } - } + const allModelIds = this.sourceDb.queryEntityIds({ + from: GeometricModel3d.classFullName, + }); + for (const modelId of allModelIds) { + if (!modelIds.has(modelId)) { + this.exporter.excludeElement(modelId); // exclude the modeled element itself } - ); + } } /** Override that counts elements processed and optionally remaps PhysicalPartitions. * @note Override of IModelExportHandler.shouldExportElement */ - public override shouldExportElement(sourceElement: Element): boolean { + public override async shouldExportElement( + sourceElement: Element + ): Promise { if (this._numSourceElementsProcessed < this._numSourceElements) { // with deferred element processing, the number processed can be more than the total ++this._numSourceElementsProcessed; @@ -371,16 +366,18 @@ export class Transformer extends IModelTransformer { } /** This override of IModelTransformer.onTransformElement exists for debugging purposes */ - public override onTransformElement(sourceElement: Element): ElementProps { + public override async onTransformElement( + sourceElement: Element + ): Promise { // if (sourceElement.id === "0x0" || sourceElement.getDisplayLabel() === "xxx") { // use logging to find something unique about the problem element // Logger.logInfo(progressLoggerCategory, "Found problem element"); // set breakpoint here // } return super.onTransformElement(sourceElement); } - public override shouldExportRelationship( + public override async shouldExportRelationship( relationship: Relationship - ): boolean { + ): Promise { if (this._numSourceRelationshipsProcessed < this._numSourceRelationships) { ++this._numSourceRelationshipsProcessed; } @@ -436,9 +433,8 @@ export class Transformer extends IModelTransformer { } public logChangeTrackingMemoryUsed(): void { - if (this.targetDb.isBriefcase) { - // eslint-disable-next-line deprecation/deprecation - const bytesUsed = this.targetDb.nativeDb.getChangeTrackingMemoryUsed(); // can't call this internal method unless targetDb has change tracking enabled + if (this.targetDb.isBriefcaseDb()) { + const bytesUsed = this.targetDb.txns.getChangeTrackingMemoryUsed(); const mbUsed = Math.round((bytesUsed * 100) / (1024 * 1024)) / 100; Logger.logInfo( loggerCategory, @@ -447,19 +443,14 @@ export class Transformer extends IModelTransformer { } } - private deleteUnusedGeometryParts(): void { + private async deleteUnusedGeometryParts(): Promise { const geometryPartIds: Id64Array = []; const sql = `SELECT ECInstanceId FROM ${GeometryPart.classFullName}`; - // eslint-disable-next-line deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - geometryPartIds.push(statement.getValue(0).getId()); - } - } - ); + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + geometryPartIds.push(row.id); + } this.targetDb.elements.deleteDefinitionElements(geometryPartIds); // will delete only if unused } } diff --git a/packages/test-app/src/test/Transformer.test.ts b/packages/test-app/src/test/Transformer.test.ts index a1787ce29..1f23b8511 100644 --- a/packages/test-app/src/test/Transformer.test.ts +++ b/packages/test-app/src/test/Transformer.test.ts @@ -7,7 +7,6 @@ import { assert } from "chai"; import * as path from "path"; import { Category, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, GeometricElement2d, @@ -21,8 +20,13 @@ import { SpatialCategory, SpatialElement, } from "@itwin/core-backend"; -import { DbResult, Logger, LogLevel } from "@itwin/core-bentley"; -import { Code, PhysicalElementProps, QueryBinder } from "@itwin/core-common"; +import { Logger, LogLevel } from "@itwin/core-bentley"; +import { + Code, + PhysicalElementProps, + QueryBinder, + QueryRowFormat, +} from "@itwin/core-common"; import { TransformerLoggerCategory } from "@itwin/imodel-transformer"; // eslint-disable-next-line @typescript-eslint/no-redeclare import { loggerCategory, Transformer } from "../Transformer"; @@ -70,17 +74,16 @@ describe("imodel-transformer", () => { return outputFileName; } - function count(iModelDb: IModelDb, classFullName: string): number { - // eslint-disable-next-line deprecation/deprecation - return iModelDb.withPreparedStatement( - `SELECT COUNT(*) FROM ${classFullName}`, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement): number => { - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getInteger() - : 0; - } - ); + async function count( + iModelDb: IModelDb, + classFullName: string + ): Promise { + const result = await iModelDb + .createQueryReader(`SELECT COUNT(*) FROM ${classFullName}`, undefined, { + usePrimaryConn: true, + }) + .next(); + return result.done ? 0 : (result.value[0] as number); } it("should should simplify Element geometry in the target iModel", async () => { @@ -95,9 +98,12 @@ describe("imodel-transformer", () => { await Transformer.transformAll(sourceDb, targetDb, { simplifyElementGeometry: true, }); - const numSourceElements = count(sourceDb, Element.classFullName); + const numSourceElements = await count(sourceDb, Element.classFullName); assert.isAtLeast(numSourceElements, 50); - assert.equal(count(targetDb, Element.classFullName), numSourceElements); + assert.equal( + await count(targetDb, Element.classFullName), + numSourceElements + ); targetDb.close(); }); @@ -113,17 +119,17 @@ describe("imodel-transformer", () => { await Transformer.transformAll(sourceDb, targetDb, { combinePhysicalModels: true, }); - const numSourceSpatialElements = count( + const numSourceSpatialElements = await count( sourceDb, SpatialElement.classFullName ); assert.isAtLeast(numSourceSpatialElements, 6); assert.equal( - count(targetDb, SpatialElement.classFullName), + await count(targetDb, SpatialElement.classFullName), numSourceSpatialElements ); - assert.equal(count(targetDb, PhysicalPartition.classFullName), 1); - assert.isAtLeast(count(sourceDb, PhysicalPartition.classFullName), 2); + assert.equal(await count(targetDb, PhysicalPartition.classFullName), 1); + assert.isAtLeast(await count(sourceDb, PhysicalPartition.classFullName), 2); targetDb.close(); }); @@ -152,10 +158,10 @@ describe("imodel-transformer", () => { GeometricElement3d.classFullName, ].map(async (className) => { const queryResult = await db - // eslint-disable-next-line deprecation/deprecation - .query( + .createQueryReader( `SELECT COUNT(*) FROM ${className} e JOIN bis.Category c ON e.category.id=c.ECInstanceId WHERE c.CodeValue=:category`, - QueryBinder.from({ category: testCategory }) + QueryBinder.from({ category: testCategory }), + { usePrimaryConn: true } ) .next(); const value = queryResult.value[0]; @@ -284,13 +290,12 @@ describe("imodel-transformer", () => { async function getStructInstances( db: IModelDb ): Promise { - let result: any = [{}]; - // eslint-disable-next-line deprecation/deprecation - db.withPreparedStatement( + const result = db.createQueryReader( "SELECT MyProp, MyArray FROM test.TestElement LIMIT 1", - (stmtResult) => (result = stmtResult) + undefined, + { usePrimaryConn: true, rowFormat: QueryRowFormat.UseJsPropertyNames } ); - return [...result][0]; + return (await result.step()) ? result.current.toRow() : {}; } assert.deepEqual(await getStructInstances(newSchemaSourceDb), elementProps); @@ -364,13 +369,12 @@ describe("imodel-transformer", () => { async function getStructValue( db: IModelDb ): Promise { - let result: any = [{}]; - // eslint-disable-next-line deprecation/deprecation - db.withPreparedStatement( + const result = db.createQueryReader( "SELECT MyProp, MyStruct FROM test.TestElement LIMIT 1", - (stmtResult) => (result = stmtResult) + undefined, + { usePrimaryConn: true, rowFormat: QueryRowFormat.UseJsPropertyNames } ); - return [...result][0]; + return (await result.step()) ? result.current.toRow() : {}; } assert.deepEqual(await getStructValue(newSchemaSourceDb), elementProps); diff --git a/packages/transformer/package.json b/packages/transformer/package.json index fac9d27e0..6b0a4e240 100644 --- a/packages/transformer/package.json +++ b/packages/transformer/package.json @@ -1,16 +1,15 @@ { "name": "@itwin/imodel-transformer", - "version": "1.2.1-dev.1", + "version": "2.0.0-dev.12", "description": "API for exporting an iModel's parts and also importing them into another iModel", "main": "lib/cjs/imodel-transformer.js", "typings": "lib/cjs/imodel-transformer", "license": "MIT", "engines": { - "node": "^18.0.0" + "node": "^22.12.0" }, "scripts": { - "build": "npm run -s build:cjs && npm run -s copy:test-assets", - "build:ci": "npm run -s build", + "build": "npm run -s build:cjs && npm run -s copy:test-assets && npm run -s extract-api", "build:cjs": "tsc 1>&2 --outDir lib/cjs", "clean": "rimraf lib", "docs": "npm run -s docs:extract && npm run -s docs:reference && npm run -s docs:changelog", @@ -54,52 +53,53 @@ "You can find a script to see the latest @itwin/imodel-transformer version for your iTwin.js version in the README" ], "peerDependencies": { - "@itwin/core-backend": "^4.3.5", - "@itwin/core-bentley": "^4.3.5", - "@itwin/core-common": "^4.3.5", - "@itwin/core-geometry": "^4.3.5", - "@itwin/core-quantity": "^4.3.5", - "@itwin/ecschema-metadata": "^4.3.5" + "@itwin/core-backend": "^5.9.1", + "@itwin/core-bentley": "^5.9.1", + "@itwin/core-common": "^5.9.1", + "@itwin/core-geometry": "^5.9.1", + "@itwin/core-quantity": "^5.9.1", + "@itwin/ecschema-metadata": "^5.9.1" }, "//devDependencies": [ "NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install", "NOTE: All tools used by scripts in this package must be listed as devDependencies" ], "devDependencies": { - "@itwin/build-tools": "^4.10.12", - "@itwin/core-backend": "^4.10.12", - "@itwin/core-bentley": "^4.10.12", - "@itwin/core-common": "^4.10.12", - "@itwin/core-geometry": "^4.10.12", - "@itwin/core-quantity": "^4.10.12", - "@itwin/ecschema-metadata": "^4.10.12", - "@itwin/ecschema-locaters": "^4.10.12", - "@itwin/eslint-plugin": "^4.0.2", - "@types/chai": "4.3.1", - "@types/chai-as-promised": "^7.1.5", + "@itwin/build-tools": "^5.9.1", + "@itwin/core-backend": "^5.9.1", + "@itwin/core-bentley": "^5.9.1", + "@itwin/core-common": "^5.9.1", + "@itwin/core-geometry": "^5.9.1", + "@itwin/core-quantity": "^5.9.1", + "@itwin/ecschema-locaters": "^5.9.1", + "@itwin/ecschema-metadata": "^5.9.1", + "@itwin/eslint-plugin": "^5.2.1", + "@types/chai": "^4.3.20", + "@types/chai-as-promised": "^7.1.8", "@types/mocha": "^8.2.3", - "@types/node": "^18.16.14", - "@types/node-fetch": "2.6.11", - "@types/semver": "7.3.10", + "@types/node": "^22.18.8", + "@types/node-fetch": "^2.6.13", + "@types/semver": "^7.7.1", "@types/sinon": "^9.0.11", - "chai": "^4.3.7", - "chai-as-promised": "^7.1.1", + "@typescript-eslint/parser": "^8.45.0", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", "cpx2": "^3.0.2", "cross-env": "^5.2.1", - "eslint": "^8.36.0", - "eslint-config-prettier": "^9.1.0", - "prettier": "^3.1.1", - "js-base64": "^3.7.5", - "mocha": "^10.2.0", + "eslint": "^9.36.0", + "eslint-config-prettier": "^9.1.2", + "js-base64": "^3.7.8", + "mocha": "^10.8.2", "npm-run-all": "^4.1.5", "nyc": "^15.1.0", + "prettier": "^3.6.2", "rimraf": "^3.0.2", "sinon": "^9.2.4", "source-map-support": "^0.5.21", - "typescript": "^5.3.3" + "typescript": "^5.9.3" }, "dependencies": { - "semver": "^7.5.1" + "semver": "^7.7.2" }, "nyc": { "extends": "./node_modules/@itwin/build-tools/.nycrc" diff --git a/packages/transformer/src/BigMap.ts b/packages/transformer/src/BigMap.ts index cd8e6ab6d..3ca0f0361 100644 --- a/packages/transformer/src/BigMap.ts +++ b/packages/transformer/src/BigMap.ts @@ -86,7 +86,7 @@ export class BigMap implements Map { return this; } - public [Symbol.iterator](): IterableIterator<[Id64String, V]> { + public [Symbol.iterator](): MapIterator<[Id64String, V]> { return this.entries(); } @@ -94,21 +94,21 @@ export class BigMap implements Map { return "BigMap"; } - public *entries(): IterableIterator<[Id64String, V]> { + public *entries(): MapIterator<[Id64String, V]> { const maps = Object.values(this._maps); for (const map of maps) { for (const [key, value] of map.entries()) yield [key, value]; } } - public *keys(): IterableIterator { + public *keys(): MapIterator { const maps = Object.values(this._maps); for (const map of maps) { for (const key of map.keys()) yield key; } } - public *values(): IterableIterator { + public *values(): MapIterator { const maps = Object.values(this._maps); for (const map of maps) { for (const value of map.values()) yield value; diff --git a/packages/transformer/src/BranchProvenanceInitializer.ts b/packages/transformer/src/BranchProvenanceInitializer.ts index a17178873..83c2dd49b 100644 --- a/packages/transformer/src/BranchProvenanceInitializer.ts +++ b/packages/transformer/src/BranchProvenanceInitializer.ts @@ -63,7 +63,6 @@ export async function initializeBranchProvenance( if (args.createFedGuidsForMaster) { // FIXME: Consider enforcing that the master and branch dbs passed as part of ProvenanceInitArgs to this function // are identical. https://github.com/iTwin/imodel-transformer/issues/138 - /* eslint-disable deprecation/deprecation */ args.master.withSqliteStatement( ` UPDATE bis_Element @@ -72,10 +71,7 @@ export async function initializeBranchProvenance( `, // eslint-disable-next-line @itwin/no-internal (s) => - assert( - s.step() === DbResult.BE_SQLITE_DONE, - args.branch.nativeDb.getLastError() - ) + assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError()) ); const masterPath = args.master.pathName; const reopenMaster = makeDbReopener(args.master); @@ -84,10 +80,7 @@ export async function initializeBranchProvenance( `ATTACH DATABASE '${pathToFileURL(`${masterPath}`)}?mode=ro' AS master`, // eslint-disable-next-line @itwin/no-internal (s) => - assert( - s.step() === DbResult.BE_SQLITE_DONE, - args.branch.nativeDb.getLastError() - ) + assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError()) ); args.branch.withSqliteStatement( ` @@ -100,10 +93,7 @@ export async function initializeBranchProvenance( // eslint-disable-next-line @itwin/no-internal (s) => - assert( - s.step() === DbResult.BE_SQLITE_DONE, - args.branch.nativeDb.getLastError() - ) + assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError()) ); args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this) args.branch.saveChanges(); @@ -112,16 +102,12 @@ export async function initializeBranchProvenance( if (res !== DbResult.BE_SQLITE_DONE) Logger.logTrace( "initializeBranchProvenance", - `Error detaching db (we will close anyway): ${args.branch.nativeDb.getLastError()}` + `Error detaching db (we will close anyway): ${args.branch.getLastError()}` ); // this is the case until native side changes // eslint-disable-next-line @itwin/no-internal - assert( - res === DbResult.BE_SQLITE_ERROR, - args.branch.nativeDb.getLastError() - ); + assert(res === DbResult.BE_SQLITE_ERROR, args.branch.getLastError()); }); - /* eslint-enable deprecation/deprecation */ args.branch.performCheckpoint(); const reopenBranch = makeDbReopener(args.branch); @@ -153,25 +139,25 @@ export async function initializeBranchProvenance( model: IModelDb.rootSubjectId, code: Code.createEmpty(), repository: new ExternalSourceIsInRepository(masterRepoLinkId), - /* eslint-disable @typescript-eslint/no-var-requires */ + /* eslint-disable @typescript-eslint/no-require-imports */ connectorName: require("../../package.json").name, connectorVersion: require("../../package.json").version, - /* eslint-enable @typescript-eslint/no-var-requires */ + /* eslint-enable @typescript-eslint/no-require-imports */ } as ExternalSourceProps); - const fedGuidLessElemsSql = ` + const fedGuidlessElemsSql = ` SELECT ECInstanceId AS id FROM Bis.Element WHERE FederationGuid IS NULL AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */ `; const elemReader = args.branch.createQueryReader( - fedGuidLessElemsSql, + fedGuidlessElemsSql, undefined, { usePrimaryConn: true } ); - while (await elemReader.step()) { - const id: string = elemReader.current.toRow().id; + for await (const row of elemReader) { + const id: string = row.id; const aspectProps = IModelTransformer.initElementProvenanceOptions(id, id, { isReverseSynchronization: false, targetScopeElementId: masterExternalSourceId, @@ -181,7 +167,7 @@ export async function initializeBranchProvenance( args.branch.elements.insertAspect(aspectProps); } - const fedGuidLessRelsSql = ` + const fedGuidlessRelsSql = ` SELECT erte.ECInstanceId as id FROM Bis.ElementRefersToElements erte JOIN bis.Element se @@ -191,23 +177,20 @@ export async function initializeBranchProvenance( WHERE se.FederationGuid IS NULL OR te.FederationGuid IS NULL`; const relReader = args.branch.createQueryReader( - fedGuidLessRelsSql, + fedGuidlessRelsSql, undefined, { usePrimaryConn: true } ); - while (await relReader.step()) { - const id: string = relReader.current.toRow().id; - const aspectProps = IModelTransformer.initRelationshipProvenanceOptions( - id, - id, - { + for await (const row of relReader) { + const id: string = row.id; + const aspectProps = + await IModelTransformer.initRelationshipProvenanceOptions(id, id, { isReverseSynchronization: false, targetScopeElementId: masterExternalSourceId, sourceDb: args.master, targetDb: args.branch, forceOldRelationshipProvenanceMethod: false, - } - ); + }); args.branch.elements.insertAspect(aspectProps); } diff --git a/packages/transformer/src/DetachedExportElementAspectsStrategy.ts b/packages/transformer/src/DetachedExportElementAspectsStrategy.ts index d7d1bf8f3..4384ffb92 100644 --- a/packages/transformer/src/DetachedExportElementAspectsStrategy.ts +++ b/packages/transformer/src/DetachedExportElementAspectsStrategy.ts @@ -38,7 +38,10 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt this.aspectChanges === undefined || isInsertChange || isUpdateChange; if (doExport) { const isKnownUpdate = this.aspectChanges ? isUpdateChange : undefined; - this.handler.onExportElementUniqueAspect(uniqueAspect, isKnownUpdate); + await this.handler.onExportElementUniqueAspect( + uniqueAspect, + isKnownUpdate + ); await this.handler.trackProgress(); } } @@ -57,7 +60,9 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt if ( batchedElementMultiAspects[0].element.id !== multiAspect.element.id ) { - this.handler.onExportElementMultiAspects(batchedElementMultiAspects); + await this.handler.onExportElementMultiAspects( + batchedElementMultiAspects + ); await this.handler.trackProgress(); batchedElementMultiAspects = []; } @@ -68,7 +73,9 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt if (batchedElementMultiAspects.length > 0) { // aspects that are left in the array have not been exported - this.handler.onExportElementMultiAspects(batchedElementMultiAspects); + await this.handler.onExportElementMultiAspects( + batchedElementMultiAspects + ); await this.handler.trackProgress(); } } @@ -78,7 +85,7 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt exportAspect: (aspect: T) => Promise ) { for await (const aspect of this.queryAspects(baseAspectClass)) { - if (!this.shouldExportElementAspect(aspect)) { + if (!(await this.shouldExportElementAspect(aspect))) { continue; } @@ -105,7 +112,8 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt new QueryBinder().bindString( "baseClassName", baseElementAspectClassFullName - ) + ), + { usePrimaryConn: true } ); const aspectClassesAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectClassesQueryReader); @@ -125,7 +133,7 @@ export class DetachedExportElementAspectsStrategy extends ExportElementAspectsSt const aspectQueryReader = this.sourceDb.createQueryReader( getAspectPropsSql, new QueryBinder().bindId("classId", classId), - { rowFormat: QueryRowFormat.UseJsPropertyNames } + { rowFormat: QueryRowFormat.UseJsPropertyNames, usePrimaryConn: true } ); const aspectAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectQueryReader); diff --git a/packages/transformer/src/ECReferenceTypesCache.ts b/packages/transformer/src/ECReferenceTypesCache.ts index cf6d9ebbe..b332a515c 100644 --- a/packages/transformer/src/ECReferenceTypesCache.ts +++ b/packages/transformer/src/ECReferenceTypesCache.ts @@ -6,12 +6,8 @@ * @module iModels */ -import { DbResult, TupleKeyedMap } from "@itwin/core-bentley"; -import { - ConcreteEntityTypes, - IModelError, - RelTypeInfo, -} from "@itwin/core-common"; +import { Logger, TupleKeyedMap } from "@itwin/core-bentley"; +import { ConcreteEntityTypes, RelTypeInfo } from "@itwin/core-common"; import { ECClass, Mixin, @@ -19,11 +15,11 @@ import { RelationshipConstraint, Schema, SchemaKey, - SchemaLoader, StrengthDirection, } from "@itwin/ecschema-metadata"; import * as assert from "assert"; import { IModelDb } from "@itwin/core-backend"; +import { TransformerLoggerCategory } from "./TransformerLoggerCategory"; /** The context for transforming a *source* Element to a *target* Element and remapping internal identifiers to the target iModel. * @internal @@ -54,6 +50,11 @@ export class ECReferenceTypesCache { >(); private _initedSchemas = new Map(); + // Performance optimization caches + private _rootBisClassCache = new Map(); + private _relationshipInfoCache = new Map(); + private _constraintClassCache = new Map(); + private static bisRootClassToRefType: Record< string, ConcreteEntityTypes | undefined @@ -70,6 +71,12 @@ export class ECReferenceTypesCache { }; private async getRootBisClass(ecclass: ECClass) { + const cacheKey = ecclass.fullName; + const cached = this._rootBisClassCache.get(cacheKey); + if (cached) { + return cached; + } + let bisRootForConstraint: ECClass = ecclass; await ecclass.traverseBaseClasses((baseClass) => { // The depth first traversal will descend all the way to the root class before making any lateral traversal @@ -93,12 +100,20 @@ export class ECReferenceTypesCache { await bisRootForConstraint.appliesTo ); } + + this._rootBisClassCache.set(cacheKey, bisRootForConstraint); return bisRootForConstraint; } private async getAbstractConstraintClass( constraint: RelationshipConstraint ): Promise { + const cacheKey = `${constraint.fullName}_${constraint.constraintClasses?.[0]?.fullName || "abstract"}`; + const cached = this._constraintClassCache.get(cacheKey); + if (cached) { + return cached; + } + // constraint classes must share a base so we can get the root from any of them, just use the first const ecclass = await (constraint.constraintClasses?.[0] || constraint.abstractConstraint); @@ -106,41 +121,59 @@ export class ECReferenceTypesCache { ecclass !== undefined, "At least one constraint class or an abstract constraint must have been defined, the constraint is not valid" ); + + this._constraintClassCache.set(cacheKey, ecclass); return ecclass; } /** initialize from an imodel with metadata */ public async initAllSchemasInIModel(imodel: IModelDb): Promise { - const schemaLoader = new SchemaLoader((name: string) => - imodel.getSchemaProps(name) - ); - // Issue for `createQueryReader` reported: https://github.com/iTwin/itwinjs-core/issues/7984 - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await imodel.withPreparedStatement( - ` + let schemaCount = 0; + + const initStartTime = performance.now(); + + const query = ` WITH RECURSIVE refs(SchemaId) AS ( SELECT ECInstanceId FROM ECDbMeta.ECSchemaDef WHERE Name='BisCore' - UNION ALL + UNION SELECT sr.SourceECInstanceId FROM ECDbMeta.SchemaHasSchemaReferences sr JOIN refs ON sr.TargetECInstanceId = refs.SchemaId ) - SELECT s.Name + SELECT s.Name as name FROM refs JOIN ECDbMeta.ECSchemaDef s ON refs.SchemaId=s.ECInstanceId -- ensure schema dependency order - ORDER BY ECInstanceId - `, - async (stmt) => { - let status: DbResult; - while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) { - const schemaName = stmt.getValue(0).getString(); - const schema = schemaLoader.getSchema(schemaName); - await this.considerInitSchema(schema); - } - if (status !== DbResult.BE_SQLITE_DONE) - throw new IModelError(status, "unexpected query failure"); + ORDER BY s.ECInstanceId + `; + + for await (const row of imodel.createQueryReader(query, undefined, { + usePrimaryConn: true, + })) { + const schemaName = row.name; + const startTime = performance.now(); + Logger.logTrace( + TransformerLoggerCategory.ECReferenceTypesCache, + `Loading schema: ${schemaName}` + ); + const schemaItemKey = new SchemaKey(schemaName); + const schema = await imodel.schemaContext.getSchema(schemaItemKey); + if (!schema) { + throw new Error(`Failed to load schema: ${schemaName}`); } + await this.considerInitSchema(schema); + const endTime = performance.now(); + Logger.logTrace( + TransformerLoggerCategory.ECReferenceTypesCache, + `Completed schema: ${schemaName} in ${(endTime - startTime).toFixed(2)}ms` + ); + schemaCount++; + } + + const initEndTime = performance.now(); + Logger.logTrace( + TransformerLoggerCategory.ECReferenceTypesCache, + `Completed ${schemaCount} schemas in ${(initEndTime - initStartTime).toFixed(2)}ms` ); } @@ -158,34 +191,92 @@ export class ECReferenceTypesCache { } private async initSchema(schema: Schema): Promise { - for (const ecclass of schema.getClasses()) { - for (const prop of await ecclass.getProperties()) { - if (!prop.isNavigation()) continue; - const relClass = await prop.relationshipClass; - const relInfo = await this.relInfoFromRelClass(relClass); - if (relInfo === undefined) continue; - const navPropRefType = - prop.direction === StrengthDirection.Forward - ? relInfo.target - : relInfo.source; - this._propQualifierToRefType.set( - [ - schema.name.toLowerCase(), - ecclass.name.toLowerCase(), - prop.name.toLowerCase(), - ], - navPropRefType + Logger.logInfo( + TransformerLoggerCategory.ECReferenceTypesCache, + `Init Schema: ${schema.name}` + ); + const schemaNameLower = schema.name.toLowerCase(); + + // Pre-collect all items to reduce iterator overhead + const allItems = Array.from(schema.getItems()); + const ecClasses: ECClass[] = []; + const relationshipClasses: RelationshipClass[] = []; + + // Single pass through items with type checking + for (const item of allItems) { + // eslint-disable-next-line @itwin/no-internal + if (!ECClass.isECClass(item)) continue; + ecClasses.push(item); + if (item instanceof RelationshipClass) { + relationshipClasses.push(item); + } + } + + // Process relationship classes in parallel and populate global cache + const relInfoPromises = relationshipClasses.map(async (relClass) => { + const relInfo = await this.relInfoFromRelClass(relClass); + this._relationshipInfoCache.set(relClass.fullName, relInfo); + if (relInfo) { + this._relClassNameEndToRefTypes.set( + [schemaNameLower, relClass.name.toLowerCase()], + relInfo ); } + return relInfo; + }); + + // Wait for all relationship info to be cached + await Promise.all(relInfoPromises); + + // Process navigation properties with optimized batching + const propertyBatchSize = 25; + for (let i = 0; i < ecClasses.length; i += propertyBatchSize) { + const classBatch = ecClasses.slice(i, i + propertyBatchSize); + + const classPromises = classBatch.map(async (ecclass) => { + const properties = await ecclass.getProperties(); + if (!properties) return; + + const classNameLower = ecclass.name.toLowerCase(); - if (ecclass instanceof RelationshipClass) { - const relInfo = await this.relInfoFromRelClass(ecclass); - if (relInfo) - this._relClassNameEndToRefTypes.set( - [schema.name.toLowerCase(), ecclass.name.toLowerCase()], - relInfo + // Efficiently filter navigation properties + const navProps = Array.from(properties).filter((prop) => + prop.isNavigation() + ); + if (navProps.length === 0) return; + + const navPropPromises = navProps.map(async (prop) => { + const relClass = await prop.relationshipClass; + + // Use cached relation info + let relInfo = this._relationshipInfoCache.get(relClass.fullName); + if ( + relInfo === undefined && + !this._relationshipInfoCache.has(relClass.fullName) + ) { + relInfo = await this.relInfoFromRelClass(relClass); + this._relationshipInfoCache.set(relClass.fullName, relInfo); + } + + if (relInfo === undefined) return; + + const navPropRefType = + prop.direction === StrengthDirection.Forward + ? // eslint-disable-next-line @itwin/no-internal + relInfo.target + : // eslint-disable-next-line @itwin/no-internal + relInfo.source; + + this._propQualifierToRefType.set( + [schemaNameLower, classNameLower, prop.name.toLowerCase()], + navPropRefType ); - } + }); + + await Promise.all(navPropPromises); + }); + + await Promise.all(classPromises); } this._initedSchemas.set(schema.name, schema.schemaKey); @@ -278,5 +369,9 @@ export class ECReferenceTypesCache { public clear() { this._initedSchemas.clear(); this._propQualifierToRefType.clear(); + this._relClassNameEndToRefTypes.clear(); + this._rootBisClassCache.clear(); + this._relationshipInfoCache.clear(); + this._constraintClassCache.clear(); } } diff --git a/packages/transformer/src/ElementCascadingDeleter.ts b/packages/transformer/src/ElementCascadingDeleter.ts index 9c82c222e..f645ad4c1 100644 --- a/packages/transformer/src/ElementCascadingDeleter.ts +++ b/packages/transformer/src/ElementCascadingDeleter.ts @@ -10,7 +10,8 @@ import { ElementTreeWalkerScope, IModelDb, } from "@itwin/core-backend"; -import { DbResult, Id64String } from "@itwin/core-bentley"; +import { Id64String } from "@itwin/core-bentley"; +import { QueryBinder } from "@itwin/core-common"; /** Deletes an element tree and code scope references starting with the specified top element. The top element is also deleted. Uses ElementCascadeDeleter. * @param iModel The iModel @@ -53,21 +54,24 @@ export class ElementCascadingDeleter extends ElementTreeDeleter { scope: ElementTreeWalkerScope ) { const newScope = new ElementTreeWalkerScope(scope, element); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this._iModel.withPreparedStatement( - ` + const query = ` SELECT ECInstanceId FROM bis.Element - WHERE CodeScope.id=? + WHERE CodeScope.id=:scopeId AND Parent.id IS NULL - `, - (stmt) => { - stmt.bindId(1, element); - while (stmt.step() === DbResult.BE_SQLITE_ROW) { - const elementId = stmt.getValue(0).getId(); + `; + + const params = new QueryBinder().bindId("scopeId", element); + + this.txn.iModel.withQueryReader( + query, + (reader) => { + for (const row of reader) { + const elementId = row[0] as Id64String; this.processElementTree(elementId, newScope); } - } + }, + params ); } } diff --git a/packages/transformer/src/EntityUnifier.ts b/packages/transformer/src/EntityUnifier.ts index 6ca0c5ba5..5f197c3ef 100644 --- a/packages/transformer/src/EntityUnifier.ts +++ b/packages/transformer/src/EntityUnifier.ts @@ -11,9 +11,8 @@ import * as assert from "assert"; import { ConcreteEntityTypes, - DbResult, EntityReference, - IModelError, + QueryBinder, } from "@itwin/core-common"; import { ConcreteEntity, @@ -26,6 +25,7 @@ import { Relationship, } from "@itwin/core-backend"; import { Id64 } from "@itwin/core-bentley"; +import { _instanceKeyCache } from "@itwin/core-backend/lib/cjs/internal/Symbols"; /** @internal */ export namespace EntityUnifier { @@ -55,7 +55,7 @@ export namespace EntityUnifier { ); } - export function exists( + export async function exists( db: IModelDb, arg: { entity: ConcreteEntity } | { entityReference: EntityReference } ) { @@ -65,21 +65,14 @@ export namespace EntityUnifier { : [undefined, arg.entity.id]; const classFullName = "entityReference" in arg - ? ConcreteEntityTypes.toBisCoreRootClassFullName(type!) + ? // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-non-null-assertion + ConcreteEntityTypes.toBisCoreRootClassFullName(type!) : `[${arg.entity.schemaName}].[${arg.entity.className}]`; if (id === undefined || Id64.isInvalid(id)) return false; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - `SELECT 1 FROM ${classFullName} WHERE ECInstanceId=?`, - (stmt) => { - stmt.bindId(1, id); - const matchesResult = stmt.step(); - if (matchesResult === DbResult.BE_SQLITE_ROW) return true; - if (matchesResult === DbResult.BE_SQLITE_DONE) return false; - else throw new IModelError(matchesResult, "query failed"); - } - ); + const query = `SELECT 1 FROM ${classFullName} WHERE ECInstanceId=:id`; + const params = new QueryBinder().bindId("id", id); + return db.withQueryReader(query, (reader) => reader.step(), params); } } diff --git a/packages/transformer/src/ExportElementAspectsStrategy.ts b/packages/transformer/src/ExportElementAspectsStrategy.ts index 6a5784c2b..bc041f34c 100644 --- a/packages/transformer/src/ExportElementAspectsStrategy.ts +++ b/packages/transformer/src/ExportElementAspectsStrategy.ts @@ -20,12 +20,14 @@ const loggerCategory = TransformerLoggerCategory.IModelExporter; * @internal */ export interface ElementAspectsHandler { - shouldExportElementAspect(aspect: ElementAspect): boolean; + shouldExportElementAspect(aspect: ElementAspect): Promise; onExportElementUniqueAspect( uniqueAspect: ElementUniqueAspect, isUpdate?: boolean | undefined - ): void; - onExportElementMultiAspects(multiAspects: ElementMultiAspect[]): void; + ): Promise; + onExportElementMultiAspects( + multiAspects: ElementMultiAspect[] + ): Promise; trackProgress: () => Promise; } @@ -56,7 +58,9 @@ export abstract class ExportElementAspectsStrategy { ): Promise; public abstract exportAllElementAspects(): Promise; - protected shouldExportElementAspect(aspect: ElementAspect): boolean { + protected async shouldExportElementAspect( + aspect: ElementAspect + ): Promise { for (const excludedElementAspectClass of this ._excludedElementAspectClasses) { if (aspect instanceof excludedElementAspectClass) { diff --git a/packages/transformer/src/ExportElementAspectsWithElementsStrategy.ts b/packages/transformer/src/ExportElementAspectsWithElementsStrategy.ts index 53812fb39..09df1f141 100644 --- a/packages/transformer/src/ExportElementAspectsWithElementsStrategy.ts +++ b/packages/transformer/src/ExportElementAspectsWithElementsStrategy.ts @@ -16,46 +16,45 @@ export class ExportElementAspectsWithElementsStrategy extends ExportElementAspec public override async exportElementAspectsForElement( elementId: Id64String ): Promise { - const _uniqueAspects = await Promise.all( - this.sourceDb.elements - ._queryAspects( - elementId, - ElementUniqueAspect.classFullName, - this.excludedElementAspectClassFullNames - ) - .filter((a) => this.shouldExportElementAspect(a)) - .map(async (uniqueAspect: ElementUniqueAspect) => { - const isInsertChange = - this.aspectChanges?.insertIds.has(uniqueAspect.id) ?? false; - const isUpdateChange = - this.aspectChanges?.updateIds.has(uniqueAspect.id) ?? false; - const doExport = - this.aspectChanges === undefined || - isInsertChange || - isUpdateChange; - if (doExport) { - const isKnownUpdate = this.aspectChanges - ? isUpdateChange - : undefined; - this.handler.onExportElementUniqueAspect( - uniqueAspect, - isKnownUpdate - ); - await this.handler.trackProgress(); - } - }) + const allUniqueAspects = this.sourceDb.elements._queryAspects( + elementId, + ElementUniqueAspect.classFullName, + this.excludedElementAspectClassFullNames ); + for (const uniqueAspect of allUniqueAspects) { + if (!(await this.shouldExportElementAspect(uniqueAspect))) { + continue; + } + const isInsertChange = + this.aspectChanges?.insertIds.has(uniqueAspect.id) ?? false; + const isUpdateChange = + this.aspectChanges?.updateIds.has(uniqueAspect.id) ?? false; + const doExport = + this.aspectChanges === undefined || isInsertChange || isUpdateChange; + if (doExport) { + const isKnownUpdate = this.aspectChanges ? isUpdateChange : undefined; + await this.handler.onExportElementUniqueAspect( + uniqueAspect, + isKnownUpdate + ); + await this.handler.trackProgress(); + } + } - const multiAspects = this.sourceDb.elements - ._queryAspects( - elementId, - ElementMultiAspect.classFullName, - this.excludedElementAspectClassFullNames - ) - .filter((a) => this.shouldExportElementAspect(a)); + const allMultiAspects = this.sourceDb.elements._queryAspects( + elementId, + ElementMultiAspect.classFullName, + this.excludedElementAspectClassFullNames + ); + const multiAspects: ElementMultiAspect[] = []; + for (const aspect of allMultiAspects) { + if (await this.shouldExportElementAspect(aspect)) { + multiAspects.push(aspect); + } + } if (multiAspects.length > 0) { - this.handler.onExportElementMultiAspects(multiAspects); + await this.handler.onExportElementMultiAspects(multiAspects); return this.handler.trackProgress(); } } diff --git a/packages/transformer/src/IModelCloneContext.ts b/packages/transformer/src/IModelCloneContext.ts index 4d2b3c207..569e094bd 100644 --- a/packages/transformer/src/IModelCloneContext.ts +++ b/packages/transformer/src/IModelCloneContext.ts @@ -6,18 +6,17 @@ * @module iModels */ import * as assert from "assert"; -import { DbResult, Id64, Id64String, Logger } from "@itwin/core-bentley"; +import { Id64, Id64String, Logger } from "@itwin/core-bentley"; import { Code, CodeScopeSpec, ConcreteEntityTypes, + ECJsNames, ElementAspectProps, ElementProps, EntityReference, IModel, - IModelError, - PrimitiveTypeCode, - PropertyMetaData, + QueryBinder, RelatedElement, RelatedElementProps, } from "@itwin/core-common"; @@ -32,6 +31,7 @@ import { import { ECReferenceTypesCache } from "./ECReferenceTypesCache"; import { EntityUnifier } from "./EntityUnifier"; import { TransformerLoggerCategory } from "./TransformerLoggerCategory"; +import { Property } from "@itwin/ecschema-metadata"; const loggerCategory: string = TransformerLoggerCategory.IModelCloneContext; @@ -50,25 +50,23 @@ export class IModelCloneContext extends IModelElementCloneContext { /** Clone the specified source Element into ElementProps for the target iModel. * @internal */ - public override cloneElement( + public override async cloneElement( sourceElement: Element, cloneOptions?: IModelJsNative.CloneElementOptions - ): ElementProps { + ): Promise { const targetElementProps: ElementProps = this[ "_nativeContext" ].cloneElement(sourceElement.id, cloneOptions); // Ensure that all NavigationProperties in targetElementProps have a defined value so "clearing" changes will be part of the JSON used for update - sourceElement.forEachProperty( - (propertyName: string, meta: PropertyMetaData) => { - if ( - meta.isNavigation && - undefined === (sourceElement as any)[propertyName] - ) { - (targetElementProps as any)[propertyName] = RelatedElement.none; - } - }, - false - ); // exclude custom because C++ has already handled them + sourceElement.forEach((name: string, property: Property) => { + if ( + property.isNavigation() && + undefined === (sourceElement as any)[ECJsNames.toJsName(name)] + ) { + (targetElementProps as any)[ECJsNames.toJsName(name)] = + RelatedElement.none; + } + }, false); // exclude custom because C++ has already handled them if (this.isBetweenIModels) { // The native C++ cloneElement strips off federationGuid, want to put it back if transformation is between iModels targetElementProps.federationGuid = sourceElement.federationGuid; @@ -96,7 +94,7 @@ export class IModelCloneContext extends IModelElementCloneContext { const jsClass = this.sourceDb.getJsClass( sourceElement.classFullName ); - jsClass["onCloned"](this, sourceElement.toJSON(), targetElementProps); + await jsClass["onCloned"](this, sourceElement.toJSON(), targetElementProps); return targetElementProps; } @@ -123,7 +121,9 @@ export class IModelCloneContext extends IModelElementCloneContext { /** Look up a target [EntityReference]($bentley) from a source [EntityReference]($bentley) * @returns the target CodeSpecId or a [EntityReference]($bentley) containing [Id64.invalid]($bentley) if a mapping is not found. */ - public findTargetEntityId(sourceEntityId: EntityReference): EntityReference { + public async findTargetEntityId( + sourceEntityId: EntityReference + ): Promise { const [type, rawId] = EntityReferences.split(sourceEntityId); if (Id64.isValid(rawId)) { switch (type) { @@ -146,7 +146,9 @@ export class IModelCloneContext extends IModelElementCloneContext { // Check if the model exists, `findTargetElementId` may have worked because the element exists when the model doesn't. // That can occur in the transformer since a submodeled element is imported before its submodel. if ( - EntityUnifier.exists(this.targetDb, { entityReference: targetId }) + await EntityUnifier.exists(this.targetDb, { + entityReference: targetId, + }) ) return targetId; break; @@ -171,9 +173,7 @@ export class IModelCloneContext extends IModelElementCloneContext { ELSE 'error' END `; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const relInSource = this.sourceDb.withPreparedStatement( - ` + const sql = ` SELECT SourceECInstanceId, TargetECInstanceId, @@ -183,31 +183,30 @@ export class IModelCloneContext extends IModelElementCloneContext { (${makeGetConcreteEntityTypeSql("TargetECClassId")}) AS TargetType FROM BisCore:ElementRefersToElements WHERE ECInstanceId=? - `, - (stmt) => { - stmt.bindId(1, rawId); - let status: DbResult; - while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) { - const sourceId = stmt.getValue(0).getId(); - const targetId = stmt.getValue(1).getId(); - const sourceType = stmt.getValue(2).getString() as - | ConcreteEntityTypes - | "error"; - const targetType = stmt.getValue(3).getString() as - | ConcreteEntityTypes - | "error"; - if (sourceType === "error" || targetType === "error") - throw Error("relationship end had unknown root class"); - return { - sourceId: `${sourceType}${sourceId}`, - targetId: `${targetType}${targetId}`, - } as const; - } - if (status !== DbResult.BE_SQLITE_DONE) - throw new IModelError(status, "unexpected query failure"); - return undefined; + `; + const params = new QueryBinder().bindId(1, rawId); + const reader = this.sourceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + const relInSource = await (async () => { + if (await reader.step()) { + const sourceId = reader.current[0]; + const targetId = reader.current[1]; + const sourceType = reader.current[2] as + | ConcreteEntityTypes + | "error"; + const targetType = reader.current[3] as + | ConcreteEntityTypes + | "error"; + if (sourceType === "error" || targetType === "error") + throw Error("relationship end had unknown root class"); + return { + sourceId: `${sourceType}${sourceId}`, + targetId: `${targetType}${targetId}`, + } as const; } - ); + return undefined; + })(); if (relInSource === undefined) break; // just in case prevent recursion if ( @@ -218,8 +217,8 @@ export class IModelCloneContext extends IModelElementCloneContext { "link table relationship end was resolved to itself. This should be impossible" ); const relInTarget = { - sourceId: this.findTargetEntityId(relInSource.sourceId), - targetId: this.findTargetEntityId(relInSource.targetId), + sourceId: await this.findTargetEntityId(relInSource.sourceId), + targetId: await this.findTargetEntityId(relInSource.targetId), }; // return a null if ( @@ -227,25 +226,29 @@ export class IModelCloneContext extends IModelElementCloneContext { !EntityReferences.isValid(relInTarget.targetId) ) break; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const relInTargetId = this.targetDb.withPreparedStatement( - ` + const relInTargetSql = ` SELECT ECInstanceId FROM BisCore:ElementRefersToElements WHERE SourceECInstanceId=? AND TargetECInstanceId=? - `, - (stmt) => { - stmt.bindId(1, EntityReferences.toId64(relInTarget.sourceId)); - stmt.bindId(2, EntityReferences.toId64(relInTarget.targetId)); - const status: DbResult = stmt.step(); - if (status === DbResult.BE_SQLITE_ROW) - return stmt.getValue(0).getId(); - if (status !== DbResult.BE_SQLITE_DONE) - throw new IModelError(status, "unexpected query failure"); - return Id64.invalid; - } + `; + const relInTargetParams = new QueryBinder(); + relInTargetParams.bindId( + 1, + EntityReferences.toId64(relInTarget.sourceId) + ); + relInTargetParams.bindId( + 2, + EntityReferences.toId64(relInTarget.targetId) ); + const relInTargetResult = await this.targetDb + .createQueryReader(relInTargetSql, relInTargetParams, { + usePrimaryConn: true, + }) + .next(); + const relInTargetId = relInTargetResult.done + ? Id64.invalid + : relInTargetResult.value.id; return `r${relInTargetId}`; } } @@ -256,44 +259,50 @@ export class IModelCloneContext extends IModelElementCloneContext { /** Clone the specified source Element into ElementProps for the target iModel. * @internal */ - public cloneElementAspect( + public async cloneElementAspect( sourceElementAspect: ElementAspect - ): ElementAspectProps { + ): Promise { const targetElementAspectProps: ElementAspectProps = sourceElementAspect.toJSON(); targetElementAspectProps.id = undefined; - sourceElementAspect.forEachProperty((propertyName, propertyMetaData) => { - if (propertyMetaData.isNavigation) { + const targetEntityIds: Promise[] = []; + sourceElementAspect.forEach((ecName, property) => { + const name = ECJsNames.toJsName(ecName); + if (property.isNavigation()) { const sourceNavProp: RelatedElementProps | undefined = - sourceElementAspect.asAny[propertyName]; + sourceElementAspect.asAny[name]; if (sourceNavProp?.id) { const navPropRefType = this._refTypesCache.getNavPropRefType( sourceElementAspect.schemaName, sourceElementAspect.className, - propertyName + name ); assert( navPropRefType !== undefined, - `nav prop ref type for '${propertyName}' was not in the cache, this is a bug.` + `nav prop ref type for '${name}' was not in the cache, this is a bug.` ); - const targetEntityReference = this.findTargetEntityId( - EntityReferences.fromEntityType(sourceNavProp.id, navPropRefType) + targetEntityIds.push( + this.findTargetEntityId( + EntityReferences.fromEntityType(sourceNavProp.id, navPropRefType) + ).then((targetEntityReference) => { + const targetEntityId = EntityReferences.toId64( + targetEntityReference + ); + // spread the property in case toJSON did not deep-clone + (targetElementAspectProps as any)[name] = { + ...(targetElementAspectProps as any)[name], + id: targetEntityId, + }; + }) ); - const targetEntityId = EntityReferences.toId64(targetEntityReference); - // spread the property in case toJSON did not deep-clone - (targetElementAspectProps as any)[propertyName] = { - ...(targetElementAspectProps as any)[propertyName], - id: targetEntityId, - }; } - } else if ( - PrimitiveTypeCode.Long === propertyMetaData.primitiveType && - "Id" === propertyMetaData.extendedType - ) { - (targetElementAspectProps as any)[propertyName] = - this.findTargetElementId(sourceElementAspect.asAny[propertyName]); + } else if (property.isPrimitive() && "Id" === property.extendedTypeName) { + (targetElementAspectProps as any)[name] = this.findTargetElementId( + sourceElementAspect.asAny[name] + ); } }); + await Promise.all(targetEntityIds); return targetElementAspectProps; } } diff --git a/packages/transformer/src/IModelExporter.ts b/packages/transformer/src/IModelExporter.ts index 434355786..9d22005a1 100644 --- a/packages/transformer/src/IModelExporter.ts +++ b/packages/transformer/src/IModelExporter.ts @@ -12,7 +12,6 @@ import { ChangedECInstance, ChangesetECAdaptor, DefinitionModel, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementAspect, @@ -21,7 +20,6 @@ import { ElementUniqueAspect, GeometricElement, IModelDb, - IModelHost, IModelJsNative, Model, PartialECChangeUnifier, @@ -32,7 +30,6 @@ import { } from "@itwin/core-backend"; import { assert, - DbResult, Id64, Id64Arg, Id64Set, @@ -44,17 +41,14 @@ import { import { ChangesetFileProps, CodeSpec, + FontFamilyDescriptor, + FontId, FontProps, IModel, IModelError, QueryBinder, } from "@itwin/core-common"; -import { - ECVersion, - Schema, - SchemaKey, - SchemaLoader, -} from "@itwin/ecschema-metadata"; +import { ECVersion, Schema, SchemaKey } from "@itwin/ecschema-metadata"; import { TransformerLoggerCategory } from "./TransformerLoggerCategory"; import * as nodeAssert from "assert"; import { @@ -111,6 +105,7 @@ export type ExportChangesOptions = { * @default the current changeset of the sourceDb, if undefined */ | { startChangeset: { id?: string; index?: number } } + // eslint-disable-next-line @typescript-eslint/no-empty-object-type | {} ); @@ -124,7 +119,7 @@ export abstract class IModelExportHandler { /** If `true` is returned, then the CodeSpec will be exported. * @note This method can optionally be overridden to exclude an individual CodeSpec from the export. The base implementation always returns `true`. */ - public shouldExportCodeSpec(_codeSpec: CodeSpec): boolean { + public async shouldExportCodeSpec(_codeSpec: CodeSpec): Promise { return true; } @@ -133,49 +128,55 @@ export abstract class IModelExportHandler { * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportCodeSpec( + public async onExportCodeSpec( _codeSpec: CodeSpec, _isUpdate: boolean | undefined - ): void {} + ): Promise {} /** Called when a font should be exported. * @param font The font to export * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportFont(_font: FontProps, _isUpdate: boolean | undefined): void {} + public async onExportFont( + _font: FontProps, + _isUpdate: boolean | undefined + ): Promise {} /** Called when a model should be exported. * @param model The model to export * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportModel(_model: Model, _isUpdate: boolean | undefined): void {} + public async onExportModel( + _model: Model, + _isUpdate: boolean | undefined + ): Promise {} /** Called when a model should be deleted. */ - public onDeleteModel(_modelId: Id64String): void {} + public async onDeleteModel(_modelId: Id64String): Promise {} /** If `true` is returned, then the element will be exported. * @note This method can optionally be overridden to exclude an individual Element (and its children and ElementAspects) from the export. The base implementation always returns `true`. */ - public shouldExportElement(_element: Element): boolean { + public async shouldExportElement(_element: Element): Promise { return true; } /** Called when element is skipped instead of exported. * @note When an element is skipped, exporter will not export any of its child elements. Because of this, [[onSkipElement]] will not be invoked for any children of a "skipped" element. */ - public onSkipElement(_elementId: Id64String): void {} + public async onSkipElement(_elementId: Id64String): Promise {} /** Called when an element should be exported. * @param element The element to export * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportElement( + public async onExportElement( _element: Element, _isUpdate: boolean | undefined - ): void {} + ): Promise {} /** * Do any asynchronous actions before exporting an element @@ -186,12 +187,14 @@ export abstract class IModelExportHandler { public async preExportElement(_element: Element): Promise {} /** Called when an element should be deleted. */ - public onDeleteElement(_elementId: Id64String): void {} + public async onDeleteElement(_elementId: Id64String): Promise {} /** If `true` is returned, then the ElementAspect will be exported. * @note This method can optionally be overridden to exclude an individual ElementAspect from the export. The base implementation always returns `true`. */ - public shouldExportElementAspect(_aspect: ElementAspect): boolean { + public async shouldExportElementAspect( + _aspect: ElementAspect + ): Promise { return true; } @@ -200,20 +203,24 @@ export abstract class IModelExportHandler { * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportElementUniqueAspect( + public async onExportElementUniqueAspect( _aspect: ElementUniqueAspect, _isUpdate: boolean | undefined - ): void {} + ): Promise {} /** Called when ElementMultiAspects should be exported. * @note This should be overridden to actually do the export. */ - public onExportElementMultiAspects(_aspects: ElementMultiAspect[]): void {} + public async onExportElementMultiAspects( + _aspects: ElementMultiAspect[] + ): Promise {} /** If `true` is returned, then the relationship will be exported. * @note This method can optionally be overridden to exclude an individual CodeSpec from the export. The base implementation always returns `true`. */ - public shouldExportRelationship(_relationship: Relationship): boolean { + public async shouldExportRelationship( + _relationship: Relationship + ): Promise { return true; } @@ -222,18 +229,20 @@ export abstract class IModelExportHandler { * @param isUpdate If defined, then `true` indicates an UPDATE operation while `false` indicates an INSERT operation. If not defined, then INSERT vs. UPDATE is not known. * @note This should be overridden to actually do the export. */ - public onExportRelationship( + public async onExportRelationship( _relationship: Relationship, _isUpdate: boolean | undefined - ): void {} + ): Promise {} /** Called when a relationship should be deleted. */ - public onDeleteRelationship(_relInstanceId: Id64String): void {} + public async onDeleteRelationship( + _relInstanceId: Id64String + ): Promise {} /** If `true` is returned, then the schema will be exported. * @note This method can optionally be overridden to exclude an individual schema from the export. The base implementation always returns `true`. */ - public shouldExportSchema(_schemaKey: SchemaKey): boolean { + public async shouldExportSchema(_schemaKey: SchemaKey): Promise { return true; } @@ -341,11 +350,11 @@ export class IModelExporter { this._exportElementAspectsStrategy = new elementAspectsStrategy( this.sourceDb, { - onExportElementMultiAspects: (aspects) => + onExportElementMultiAspects: async (aspects) => this.handler.onExportElementMultiAspects(aspects), - onExportElementUniqueAspect: (aspect, isUpdate) => + onExportElementUniqueAspect: async (aspect, isUpdate) => this.handler.onExportElementUniqueAspect(aspect, isUpdate), - shouldExportElementAspect: (aspect) => + shouldExportElementAspect: async (aspect) => this.handler.shouldExportElementAspect(aspect), trackProgress: async () => this.trackProgress(), } @@ -474,7 +483,7 @@ export class IModelExporter { if (this.visitElements) { // must delete models first since they have a constraint on the submodeling element which may also be deleted for (const modelId of this._sourceDbChanges.model.deleteIds) { - this.handler.onDeleteModel(modelId); + await this.handler.onDeleteModel(modelId); } for (const elementId of this._sourceDbChanges.element.deleteIds) { // We don't know how the handler wants to handle deletions, and we don't have enough information @@ -484,7 +493,7 @@ export class IModelExporter { // In the future, the handler may be responsible for doing the work of finding out which elements were cascade deleted, // and returning them for the exporter to use to avoid double-deleting with error ignoring try { - this.handler.onDeleteElement(elementId); + await this.handler.onDeleteElement(elementId); } catch (err: unknown) { const isMissingErr = err instanceof IModelError && @@ -497,7 +506,7 @@ export class IModelExporter { if (this.visitRelationships) { for (const relInstanceId of this._sourceDbChanges.relationship .deleteIds) { - this.handler.onDeleteRelationship(relInstanceId); + await this.handler.onDeleteRelationship(relInstanceId); } } @@ -514,7 +523,6 @@ export class IModelExporter { * @note This must be called separately from [[exportAll]] or [[exportChanges]]. */ public async exportSchemas(): Promise { - /* eslint-disable @typescript-eslint/indent */ const sql = ` SELECT s.Name, s.VersionMajor, s.VersionWrite, s.VersionMinor FROM ECDbMeta.ECSchemaDef s @@ -527,34 +535,31 @@ export class IModelExporter { } ORDER BY ECInstanceId `; - /* eslint-enable @typescript-eslint/indent */ - const schemaNamesToExport: string[] = []; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement(sql, (statement: ECSqlStatement) => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const schemaName = statement.getValue(0).getString(); - const versionMajor = statement.getValue(1).getInteger(); - const versionWrite = statement.getValue(2).getInteger(); - const versionMinor = statement.getValue(3).getInteger(); - const schemaKey = new SchemaKey( - schemaName, - new ECVersion(versionMajor, versionWrite, versionMinor) - ); - if (this.handler.shouldExportSchema(schemaKey)) { - schemaNamesToExport.push(schemaName); - } + const schemaKeysToExport: SchemaKey[] = []; + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + const schemaName = row[0]; + const versionMajor = row[1]; + const versionWrite = row[2]; + const versionMinor = row[3]; + const schemaKey = new SchemaKey( + schemaName, + new ECVersion(versionMajor, versionWrite, versionMinor) + ); + if (await this.handler.shouldExportSchema(schemaKey)) { + schemaKeysToExport.push(schemaKey); } - }); - - if (schemaNamesToExport.length === 0) return; + } + if (schemaKeysToExport.length === 0) return; - const schemaLoader = new SchemaLoader((name: string) => - this.sourceDb.getSchemaProps(name) - ); await Promise.all( - schemaNamesToExport.map(async (schemaName) => { - const schema = schemaLoader.getSchema(schemaName); - Logger.logTrace(loggerCategory, `exportSchema(${schemaName})`); + schemaKeysToExport.map(async (schemaKey) => { + const schema = await this.sourceDb.schemaContext.getSchema(schemaKey); + if (!schema) { + throw new Error(`Failed to load schema: ${schemaKey.name}`); + } + Logger.logTrace(loggerCategory, `exportSchema(${schemaKey.name})`); return this.handler.onExportSchema(schema); }) ); @@ -571,17 +576,11 @@ export class IModelExporter { public async exportCodeSpecs(): Promise { Logger.logTrace(loggerCategory, "exportCodeSpecs()"); const sql = "SELECT Name FROM BisCore:CodeSpec ORDER BY ECInstanceId"; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement): Promise => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const codeSpecName: string = statement.getValue(0).getString(); - await this.exportCodeSpecByName(codeSpecName); - } - } - ); + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + await this.exportCodeSpecByName(row[0]); + } } /** Export a single CodeSpec from the source iModel. @@ -606,12 +605,12 @@ export class IModelExporter { return; } // CodeSpec has passed standard exclusion rules, now give handler a chance to accept/reject export - if (this.handler.shouldExportCodeSpec(codeSpec)) { + if (await this.handler.shouldExportCodeSpec(codeSpec)) { Logger.logTrace( loggerCategory, `exportCodeSpec(${codeSpecName})${this.getChangeOpSuffix(isUpdate)}` ); - this.handler.onExportCodeSpec(codeSpec, isUpdate); + await this.handler.onExportCodeSpec(codeSpec, isUpdate); return this.trackProgress(); } } @@ -629,19 +628,51 @@ export class IModelExporter { */ public async exportFonts(): Promise { Logger.logTrace(loggerCategory, "exportFonts()"); - for (const font of this.sourceDb.fontMap.fonts.values()) { - await this.exportFontByNumber(font.id); + for (const font of this.sourceDb.fonts.queryMappedFamilies()) { + await this.exportFontByFontProps(font); } } /** Export a single font from the source iModel. - * @note This method is called from [[exportChanges]] and [[exportAll]], so it only needs to be called directly when exporting a subset of an iModel. + * @note multiple fonts can have the same font name, if a font with a specific type is needed use exportFontByFontFamilyDescriptor. + * If not this will only export the first font with this type in the db. */ public async exportFontByName(fontName: string): Promise { Logger.logTrace(loggerCategory, `exportFontByName(${fontName})`); - const font: FontProps | undefined = this.sourceDb.fontMap.getFont(fontName); - if (undefined !== font) { - await this.exportFontByNumber(font.id); + const fontId: FontId | undefined = this.sourceDb.fonts.findId({ + name: fontName, + }); + if (undefined !== fontId) { + await this.exportFontByNumber(fontId); + } + } + + /** Export a single font from the source iModel. + * @note This method is called from [[exportChanges]] and [[exportAll]], so it only needs to be called directly when exporting a subset of an iModel. + */ + public async exportFontByFontProps(fontProps: FontProps): Promise { + Logger.logTrace( + loggerCategory, + `exportFontByFamily(${fontProps.name}, ${fontProps.type})` + ); + await this.handler.onExportFont(fontProps, true); + return this.trackProgress(); + } + + /** Export a single font from the source iModel. + * @note This method is called from [[exportChanges]] and [[exportAll]], so it only needs to be called directly when exporting a subset of an iModel. + */ + public async exportFontByFontFamilyDescriptor( + fontFamily: FontFamilyDescriptor + ): Promise { + Logger.logTrace( + loggerCategory, + `exportFontByFamilyDescriptor(${fontFamily.name}, ${fontFamily.type})` + ); + const fontId: FontId | undefined = + await this.sourceDb.fonts.acquireId(fontFamily); + if (undefined !== fontId) { + await this.exportFontByFontProps({ ...fontFamily, id: fontId }); } } @@ -654,13 +685,11 @@ export class IModelExporter { * It is very rare and even problematic for the font table to reach a large size, so it is not a bottleneck in transforming changes. * See https://github.com/iTwin/imodel-transformer/pull/135 for removed code. */ - const isUpdate = true; Logger.logTrace(loggerCategory, `exportFontById(${fontNumber})`); - const font: FontProps | undefined = - this.sourceDb.fontMap.getFont(fontNumber); + const font: FontFamilyDescriptor | undefined = + this.sourceDb.fonts.findDescriptor(fontNumber); if (undefined !== font) { - this.handler.onExportFont(font, isUpdate); - return this.trackProgress(); + await this.exportFontByFontFamilyDescriptor(font); } } @@ -678,7 +707,7 @@ export class IModelExporter { wantBRepData: this.wantGeometry, }); Logger.logTrace(loggerCategory, `exportModel(${modeledElementId})`); - if (this.shouldExportElement(modeledElement)) { + if (await this.shouldExportElement(modeledElement)) { await this.exportModelContainer(model); if (this.visitElements) { await this.exportModelContents(modeledElementId); @@ -700,7 +729,7 @@ export class IModelExporter { return; // not in changeset, don't export } } - this.handler.onExportModel(model, isUpdate); + await this.handler.onExportModel(model, isUpdate); return this.trackProgress(); } @@ -745,21 +774,16 @@ export class IModelExporter { } else { sql = `SELECT ECInstanceId FROM ${elementClassFullName} WHERE Parent.Id IS NULL AND Model.Id=:modelId ORDER BY ECInstanceId`; } - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement): Promise => { - statement.bindId("modelId", modelId); - if (skipRootSubject) { - statement.bindId("rootSubjectId", IModel.rootSubjectId); - } - while (DbResult.BE_SQLITE_ROW === statement.step()) { - await this.exportElement(statement.getValue(0).getId()); - await this._yieldManager.allowYield(); - } - } - ); + const params = new QueryBinder().bindId("modelId", modelId); + if (skipRootSubject) { + params.bindId("rootSubjectId", IModel.rootSubjectId); + } + for await (const row of this.sourceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + await this.exportElement(row.id); + await this._yieldManager.allowYield(); + } } /** Export the sub-models directly below the specified model. @@ -770,23 +794,18 @@ export class IModelExporter { const definitionModelIds: Id64String[] = []; const otherModelIds: Id64String[] = []; const sql = `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ParentModel.Id=:parentModelId ORDER BY ECInstanceId`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - statement.bindId("parentModelId", parentModelId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const modelId: Id64String = statement.getValue(0).getId(); - const model: Model = this.sourceDb.models.getModel(modelId); - if (model instanceof DefinitionModel) { - definitionModelIds.push(modelId); - } else { - otherModelIds.push(modelId); - } - } + const params = new QueryBinder().bindId("parentModelId", parentModelId); + for await (const row of this.sourceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + const modelId: Id64String = row.id; + const model: Model = this.sourceDb.models.getModel(modelId); + if (model instanceof DefinitionModel) { + definitionModelIds.push(modelId); + } else { + otherModelIds.push(modelId); } - ); + } // export DefinitionModels before other types of Models for (const definitionModelId of definitionModelIds) { await this.exportModel(definitionModelId); @@ -800,7 +819,7 @@ export class IModelExporter { * This considers the standard IModelExporter exclusion rules plus calls [IModelExportHandler.shouldExportElement]($transformer) for any custom exclusion rules. * @note This method is called from within [[exportChanges]] and [[exportAll]], so usually does not need to be called directly. */ - public shouldExportElement(element: Element): boolean { + public async shouldExportElement(element: Element): Promise { if (this._excludedElementIds.has(element.id)) { Logger.logInfo(loggerCategory, `Excluded element ${element.id} by Id`); return false; @@ -852,7 +871,7 @@ export class IModelExporter { // Return early if the elementId is already in the excludedElementIds, that way we don't need to load the element from the db. if (this._excludedElementIds.has(elementId)) { Logger.logInfo(loggerCategory, `Excluded element ${elementId} by Id`); - this.handler.onSkipElement(elementId); + await this.handler.onSkipElement(elementId); return; } @@ -875,16 +894,16 @@ export class IModelExporter { }, "${element.getDisplayLabel()}")${this.getChangeOpSuffix(isUpdate)}` ); // the order and `await`ing of calls beyond here is depended upon by the IModelTransformer for a current bug workaround - if (this.shouldExportElement(element)) { + if (await this.shouldExportElement(element)) { await this.handler.preExportElement(element); - this.handler.onExportElement(element, isUpdate); + await this.handler.onExportElement(element, isUpdate); await this.trackProgress(); await this._exportElementAspectsStrategy.exportElementAspectsForElement( elementId ); return this.exportChildElements(elementId); } else { - this.handler.onSkipElement(element.id); + await this.handler.onSkipElement(element.id); } } @@ -932,25 +951,18 @@ export class IModelExporter { loggerCategory, `exportRelationships(${baseRelClassFullName})` ); - const sql = `SELECT r.ECInstanceId, r.ECClassId FROM ${baseRelClassFullName} r + const sql = `SELECT r.ECInstanceId, ec_className(r.ECClassId, 's.c') as className FROM ${baseRelClassFullName} r JOIN bis.Element s ON s.ECInstanceId = r.SourceECInstanceId JOIN bis.Element t ON t.ECInstanceId = r.TargetECInstanceId WHERE s.ECInstanceId IS NOT NULL AND t.ECInstanceId IS NOT NULL`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement): Promise => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const relationshipId = statement.getValue(0).getId(); - const relationshipClass = statement - .getValue(1) - .getClassNameForClassId(); - await this.exportRelationship(relationshipClass, relationshipId); // must call exportRelationship using the actual classFullName, not baseRelClassFullName - await this._yieldManager.allowYield(); - } - } - ); + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + const relationshipId = row.id; + const relationshipClass = row.className; + await this.exportRelationship(relationshipClass, relationshipId); // must call exportRelationship using the actual classFullName, not baseRelClassFullName + await this._yieldManager.allowYield(); + } } /** Export a relationship from the source iModel. */ @@ -997,8 +1009,8 @@ export class IModelExporter { } } // relationship has passed standard exclusion rules, now give handler a chance to accept/reject export - if (this.handler.shouldExportRelationship(relationship)) { - this.handler.onExportRelationship(relationship, isUpdate); + if (await this.handler.shouldExportRelationship(relationship)) { + await this.handler.onExportRelationship(relationship, isUpdate); await this.trackProgress(); } } @@ -1093,7 +1105,9 @@ export class ChangedInstanceIds { baseClass: string ) => { for await (const row of this._db.createQueryReader( - `SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (${baseClass})` + `SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (${baseClass})`, + undefined, + { usePrimaryConn: true } )) { setToModify.add(row.ECInstanceId); } @@ -1300,7 +1314,9 @@ export class ChangedInstanceIds { SELECT parentId FROM hierarchy where parentId is not null `; const parentModelIds = new Set(); - for await (const row of this._db.createQueryReader(ecQuery, params)) { + for await (const row of this._db.createQueryReader(ecQuery, params, { + usePrimaryConn: true, + })) { // Transformer handles update as insert when element does not exist in target. // Which means that in scenario where child and parent model are filtered out from target, // and child element is inserted trough custom change, its parent model will be marked as updated. @@ -1323,7 +1339,9 @@ export class ChangedInstanceIds { OR InVirtualSet(:elementIds, SourceECInstanceId)`; const queryBinder = new QueryBinder().bindIdSet("elementIds", elementIds); - const queryReader = this._db.createQueryReader(ecQuery, queryBinder); + const queryReader = this._db.createQueryReader(ecQuery, queryBinder, { + usePrimaryConn: true, + }); for await (const row of queryReader) { this.handleChange(this.relationship, "Inserted", row.ECInstanceId); @@ -1337,7 +1355,9 @@ export class ChangedInstanceIds { ]) { const ecQuery = `Select ECInstanceId from ${aspectClassName} where InVirtualSet(:elementIds, Element.Id)`; const queryBinder = new QueryBinder().bindIdSet("elementIds", elementIds); - const queryReader = this._db.createQueryReader(ecQuery, queryBinder); + const queryReader = this._db.createQueryReader(ecQuery, queryBinder, { + usePrimaryConn: true, + }); for await (const row of queryReader) { this.addCustomAspectChange("Inserted", row.toArray()[0]); } @@ -1388,7 +1408,7 @@ export class ChangedInstanceIds { [ startChangeset.index ?? ( - await IModelHost.hubAccess.queryChangeset({ + await BriefcaseManager.queryChangeset({ iModelId, changeset: { id: startChangeset.id ?? opts.iModel.changeset.id, @@ -1397,7 +1417,7 @@ export class ChangedInstanceIds { ).index, opts.iModel.changeset.index ?? ( - await IModelHost.hubAccess.queryChangeset({ + await BriefcaseManager.queryChangeset({ iModelId, changeset: { id: opts.iModel.changeset.id }, }) @@ -1412,7 +1432,7 @@ export class ChangedInstanceIds { ? ( await Promise.all( changesetRanges.map(async ([first, end]) => - IModelHost.hubAccess.downloadChangesets({ + BriefcaseManager.downloadChangesets({ iModelId, range: { first, end }, targetDir: BriefcaseManager.getChangeSetsPath(iModelId), @@ -1435,7 +1455,7 @@ export class ChangedInstanceIds { disableSchemaCheck: true, }); const csAdaptor = new ChangesetECAdaptor(csReader); - const ecChangeUnifier = new PartialECChangeUnifier(); + const ecChangeUnifier = new PartialECChangeUnifier(opts.iModel); while (csAdaptor.step()) { ecChangeUnifier.appendFrom(csAdaptor); } diff --git a/packages/transformer/src/IModelImporter.ts b/packages/transformer/src/IModelImporter.ts index a858b8c73..ddb3661b4 100644 --- a/packages/transformer/src/IModelImporter.ts +++ b/packages/transformer/src/IModelImporter.ts @@ -15,14 +15,13 @@ import { import { AxisAlignedBox3d, Base64EncodedString, + ECJsNames, ElementAspectProps, ElementProps, EntityProps, IModel, IModelError, ModelProps, - PrimitiveTypeCode, - PropertyMetaData, RelatedElement, SubCategoryProps, } from "@itwin/core-common"; @@ -40,6 +39,7 @@ import { import type { RelationshipPropsForDelete } from "./IModelTransformer"; import * as assert from "assert"; import { deleteElementTreeCascade } from "./ElementCascadingDeleter"; +import { Property, PropertyType } from "@itwin/ecschema-metadata"; const loggerCategory: string = TransformerLoggerCategory.IModelImporter; @@ -75,6 +75,11 @@ export interface IModelImportOptions { * @default true */ skipPropagateChangesToRootElements?: boolean; + /** + * Acquire locks on elements during import + * @default false + */ + acquireElementLocks?: boolean; } /** Base class for importing data into an iModel. @@ -152,6 +157,7 @@ export class IModelImporter { simplifyElementGeometry: options?.simplifyElementGeometry ?? false, skipPropagateChangesToRootElements: options?.skipPropagateChangesToRootElements ?? true, + acquireElementLocks: options?.acquireElementLocks ?? false, }; this._duplicateCodeValueMap = new Map(); } @@ -180,7 +186,7 @@ export class IModelImporter { } /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */ - public importModel(modelProps: ModelProps): void { + public async importModel(modelProps: ModelProps): Promise { if (undefined === modelProps.id || !Id64.isValidId64(modelProps.id)) throw new IModelError( IModelStatus.InvalidId, @@ -197,7 +203,7 @@ export class IModelImporter { try { const model = this.targetDb.models.getModel(modelProps.id); // throws IModelError.NotFound if model does not exist if (hasEntityChanged(model, modelProps, this._modelPropertiesToIgnore)) { - this.onUpdateModel(modelProps); + await this.onUpdateModel(modelProps); } } catch (error) { // catch NotFound error and insertModel @@ -205,7 +211,7 @@ export class IModelImporter { error instanceof IModelError && error.errorNumber === IModelStatus.NotFound ) { - this.onInsertModel(modelProps); + await this.onInsertModel(modelProps); return; } throw error; @@ -215,14 +221,14 @@ export class IModelImporter { /** Create a new Model from the specified ModelProps and insert it into the target iModel. * @note A subclass may override this method to customize insert behavior but should call `super.onInsertModel`. */ - protected onInsertModel(modelProps: ModelProps): Id64String { + protected async onInsertModel(modelProps: ModelProps): Promise { try { const modelId: Id64String = this.targetDb.models.insertModel(modelProps); Logger.logInfo( loggerCategory, `Inserted ${this.formatModelForLogger(modelProps)}` ); - this.trackProgress(); + await this.trackProgress(); return modelId; } catch (error) { if (!this.targetDb.containsClass(modelProps.classFullName)) { @@ -237,17 +243,21 @@ export class IModelImporter { /** Update an existing Model in the target iModel from the specified ModelProps. * @note A subclass may override this method to customize update behavior but should call `super.onUpdateModel`. */ - protected onUpdateModel(modelProps: ModelProps): void { + protected async onUpdateModel(modelProps: ModelProps): Promise { + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ exclusive: modelProps.id }); + } this.targetDb.models.updateModel(modelProps); Logger.logInfo( loggerCategory, `Updated ${this.formatModelForLogger(modelProps)}` ); - this.trackProgress(); + await this.trackProgress(); } /** Format a Model for the Logger. */ private formatModelForLogger(modelProps: ModelProps): string { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return `${modelProps.classFullName} [${modelProps.id!}]`; } @@ -255,19 +265,20 @@ export class IModelImporter { * Tries to update an element with the specified element properties. * If a duplicate code error occurs, it assigns a new unique code value and retries the update */ - private tryUpdateElement(elemProps: ElementProps) { + private async tryUpdateElement(elemProps: ElementProps) { try { - this.onUpdateElement(elemProps); + await this.onUpdateElement(elemProps); } catch (err) { if ((err as IModelError).errorNumber === IModelStatus.DuplicateCode) { assert( elemProps.code.value !== undefined, "NULL code values are always considered unique and cannot clash" ); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this._duplicateCodeValueMap.set(elemProps.id!, elemProps.code.value); // Using NULL code values as an alternative is not valid because definition elements cannot have NULL code values. elemProps.code.value = Guid.createValue(); - this.onUpdateElement(elemProps); + await this.onUpdateElement(elemProps); } else { throw err; } @@ -275,7 +286,7 @@ export class IModelImporter { } /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */ - public importElement(elementProps: ElementProps): Id64String { + public async importElement(elementProps: ElementProps): Promise { if ( undefined !== elementProps.id && this.doNotUpdateElement(elementProps.id) @@ -303,33 +314,38 @@ export class IModelImporter { (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) || this._rootElementIds.has(elementProps.id) ) { - this.onUpdateElement(elementProps); + await this.onUpdateElement(elementProps); } else { if (this._elementsToUpdateDuringPreserveIds.has(elementProps.id)) { - this.tryUpdateElement(elementProps); + await this.tryUpdateElement(elementProps); this._elementsToUpdateDuringPreserveIds.delete(elementProps.id); } else { - this.onInsertElement(elementProps); + await this.onInsertElement(elementProps); } } } else { if (undefined !== elementProps.id) { - this.tryUpdateElement(elementProps); + await this.tryUpdateElement(elementProps); } else { - this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement + elementProps.id = await this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement } } - return elementProps.id!; + return elementProps.id; } /** Create a new Element from the specified ElementProps and insert it into the target iModel. * @returns The Id of the newly inserted Element. * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElement`. */ - protected onInsertElement(elementProps: ElementProps): Id64String { - /* eslint-disable deprecation/deprecation */ + protected async onInsertElement( + elementProps: ElementProps + ): Promise { try { - const elementId = this.targetDb.nativeDb.insertElement(elementProps, { + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ shared: elementProps.model }); + } + + const elementId = this.targetDb.elements.insertElement(elementProps, { forceUseId: this.options.preserveElementIdsForFiltering, }); // set the id like [IModelDb.insertElement]($backend), does, the raw nativeDb method does not @@ -338,9 +354,9 @@ export class IModelImporter { loggerCategory, `Inserted ${this.formatElementForLogger(elementProps)}` ); - this.trackProgress(); + await this.trackProgress(); if (this.options.simplifyElementGeometry) { - this.targetDb.nativeDb.simplifyElementGeometry({ + this.targetDb.simplifyElementGeometry({ id: elementId, convertBReps: true, }); @@ -360,25 +376,26 @@ export class IModelImporter { } throw error; // throw original error } - /* eslint-enable deprecation/deprecation */ } /** Update an existing Element in the target iModel from the specified ElementProps. * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElement`. */ - protected onUpdateElement(elementProps: ElementProps): void { + protected async onUpdateElement(elementProps: ElementProps): Promise { if (!elementProps.id) { throw new IModelError(IModelStatus.InvalidId, "ElementId not provided"); } + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ exclusive: elementProps.id }); + } this.targetDb.elements.updateElement(elementProps); Logger.logInfo( loggerCategory, `Updated ${this.formatElementForLogger(elementProps)}` ); - this.trackProgress(); + await this.trackProgress(); if (this.options.simplifyElementGeometry) { - /* eslint-disable-next-line deprecation/deprecation */ - this.targetDb.nativeDb.simplifyElementGeometry({ + this.targetDb.simplifyElementGeometry({ id: elementProps.id, convertBReps: true, }); @@ -395,17 +412,29 @@ export class IModelImporter { * Will delete special elements like definition elements and subjects. * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElement`. */ - protected onDeleteElement(elementId: Id64String): void { + protected async onDeleteElement(elementId: Id64String): Promise { + // Check if element exists before acquiring lock or deleting. + // Element may already be deleted via cascade from a parent deletion. + if (this.targetDb.elements.tryGetElement(elementId) === undefined) { + Logger.logInfo( + loggerCategory, + `Skipping delete of element ${elementId} - already deleted` + ); + return; + } + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ exclusive: elementId }); + } deleteElementTreeCascade(this.targetDb, elementId); Logger.logInfo( loggerCategory, `Deleted element ${elementId} and its descendants` ); - this.trackProgress(); + await this.trackProgress(); } /** Delete the specified Element from the target iModel. */ - public deleteElement(elementId: Id64String): void { + public async deleteElement(elementId: Id64String): Promise { if (this.doNotUpdateElement(elementId)) { Logger.logInfo( loggerCategory, @@ -413,21 +442,33 @@ export class IModelImporter { ); return; } - this.onDeleteElement(elementId); + await this.onDeleteElement(elementId); } /** Delete the specified Model from the target iModel. * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteModel`. */ - protected onDeleteModel(modelId: Id64String): void { + protected async onDeleteModel(modelId: Id64String): Promise { + // Check if model exists before acquiring lock or deleting. + // Model may already be deleted via cascade from a parent deletion. + if (this.targetDb.models.tryGetModel(modelId) === undefined) { + Logger.logInfo( + loggerCategory, + `Skipping delete of model ${modelId} - already deleted` + ); + return; + } + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ exclusive: modelId }); + } this.targetDb.models.deleteModel(modelId); Logger.logInfo(loggerCategory, `Deleted model ${modelId}`); - this.trackProgress(); + await this.trackProgress(); } /** Delete the specified Model from the target iModel. */ - public deleteModel(modelId: Id64String): void { - this.onDeleteModel(modelId); + public async deleteModel(modelId: Id64String): Promise { + await this.onDeleteModel(modelId); } /** Format an Element for the Logger. */ @@ -441,9 +482,9 @@ export class IModelImporter { } /** Import an ElementUniqueAspect into the target iModel. */ - public importElementUniqueAspect( + public async importElementUniqueAspect( aspectProps: ElementAspectProps - ): Id64String { + ): Promise { const aspects: ElementAspect[] = this.targetDb.elements.getAspects( aspectProps.element.id, aspectProps.classFullName @@ -452,7 +493,7 @@ export class IModelImporter { return this.onInsertElementAspect(aspectProps); } else if (hasEntityChanged(aspects[0], aspectProps)) { aspectProps.id = aspects[0].id; - this.onUpdateElementAspect(aspectProps); + await this.onUpdateElementAspect(aspectProps); } return aspects[0].id; } @@ -463,11 +504,11 @@ export class IModelImporter { * @note For insert vs. update reasons, it is important to process all ElementMultiAspects owned by an Element at once since we don't have aspect-specific provenance. * @returns the array of ids of the resulting ElementMultiAspects, in the same order of the aspectPropsArray parameter */ - public importElementMultiAspects( + public async importElementMultiAspects( aspectPropsArray: ElementAspectProps[], /** caller must use this to enforce any aspects added by IModelTransformer are not considered for update */ filterFunc: (a: ElementMultiAspect) => boolean = () => true - ): Id64String[] { + ): Promise { const result = new Array( aspectPropsArray.length ).fill(undefined); @@ -484,7 +525,7 @@ export class IModelImporter { }); // Handle ElementMultiAspects in groups by class - aspectClassFullNames.forEach((aspectClassFullName: string) => { + for (const aspectClassFullName of aspectClassFullNames) { const proposedAspects = aspectPropsArray .map((props, index) => ({ props, index })) .filter(({ props }) => aspectClassFullName === props.classFullName); @@ -495,52 +536,61 @@ export class IModelImporter { .filter(({ props }) => filterFunc(props)); if (proposedAspects.length >= currentAspects.length) { - proposedAspects.forEach(({ props, index: resultIndex }, index) => { + for (let index = 0; index < proposedAspects.length; index++) { + const { props, index: resultIndex } = proposedAspects[index]; let id: Id64String; if (index < currentAspects.length) { id = currentAspects[index].props.id; props.id = id; if (hasEntityChanged(currentAspects[index].props, props)) { - this.onUpdateElementAspect(props); + await this.onUpdateElementAspect(props); } id = props.id; } else { - id = this.onInsertElementAspect(props); + id = await this.onInsertElementAspect(props); } result[resultIndex] = id; - }); + } } else { - currentAspects.forEach(({ props, index: resultIndex }, index) => { + for (let index = 0; index < currentAspects.length; index++) { + const { props, index: resultIndex } = currentAspects[index]; let id: Id64String; if (index < proposedAspects.length) { id = props.id; proposedAspects[index].props.id = id; if (hasEntityChanged(props, proposedAspects[index].props)) { - this.onUpdateElementAspect(proposedAspects[index].props); + await this.onUpdateElementAspect(proposedAspects[index].props); } result[resultIndex] = id; } else { - this.onDeleteElementAspect(props); + await this.onDeleteElementAspect(props); } - }); + } } - }); + } - assert(result.every((r) => typeof r !== undefined)); - return result as Id64String[]; + assert(result.every((r) => r !== undefined)); + return result; } /** Insert the ElementAspect into the target iModel. * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElementAspect`. */ - protected onInsertElementAspect(aspectProps: ElementAspectProps): Id64String { + protected async onInsertElementAspect( + aspectProps: ElementAspectProps + ): Promise { try { + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } const id = this.targetDb.elements.insertAspect(aspectProps); Logger.logInfo( loggerCategory, `Inserted ${this.formatElementAspectForLogger(aspectProps)}` ); - this.trackProgress(); + await this.trackProgress(); return id; } catch (error) { if (!this.targetDb.containsClass(aspectProps.classFullName)) { @@ -555,25 +605,39 @@ export class IModelImporter { /** Update the ElementAspect within the target iModel. * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElementAspect`. */ - protected onUpdateElementAspect(aspectProps: ElementAspectProps): void { + protected async onUpdateElementAspect( + aspectProps: ElementAspectProps + ): Promise { + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } this.targetDb.elements.updateAspect(aspectProps); Logger.logInfo( loggerCategory, `Updated ${this.formatElementAspectForLogger(aspectProps)}` ); - this.trackProgress(); + await this.trackProgress(); } /** Delete the specified ElementAspect from the target iModel. * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElementAspect`. */ - protected onDeleteElementAspect(targetElementAspect: ElementAspect): void { + protected async onDeleteElementAspect( + targetElementAspect: ElementAspect + ): Promise { + if (this.options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ + exclusive: targetElementAspect.element.id, + }); + } this.targetDb.elements.deleteAspect(targetElementAspect.id); Logger.logInfo( loggerCategory, `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}` ); - this.trackProgress(); + await this.trackProgress(); } /** Format an ElementAspect for the Logger. */ @@ -586,7 +650,9 @@ export class IModelImporter { /** Import the specified RelationshipProps (either as an insert or an update) into the target iModel. * @returns The instance Id of the inserted or updated Relationship. */ - public importRelationship(relationshipProps: RelationshipProps): Id64String { + public async importRelationship( + relationshipProps: RelationshipProps + ): Promise { if ( undefined === relationshipProps.sourceId || !Id64.isValidId64(relationshipProps.sourceId) @@ -621,7 +687,7 @@ export class IModelImporter { // if relationship found, update it relationshipProps.id = relationship.id; if (hasEntityChanged(relationship, relationshipProps)) { - this.onUpdateRelationship(relationshipProps); + await this.onUpdateRelationship(relationshipProps); } return relationshipProps.id; } else { @@ -633,9 +699,9 @@ export class IModelImporter { * @returns The instance Id of the newly inserted relationship. * @note A subclass may override this method to customize insert behavior but should call `super.onInsertRelationship`. */ - protected onInsertRelationship( + protected async onInsertRelationship( relationshipProps: RelationshipProps - ): Id64String { + ): Promise { try { const targetRelInstanceId: Id64String = this.targetDb.relationships.insertInstance(relationshipProps); @@ -643,7 +709,7 @@ export class IModelImporter { loggerCategory, `Inserted ${this.formatRelationshipForLogger(relationshipProps)}` ); - this.trackProgress(); + await this.trackProgress(); return targetRelInstanceId; } catch (error) { if (!this.targetDb.containsClass(relationshipProps.classFullName)) { @@ -658,7 +724,9 @@ export class IModelImporter { /** Update an existing Relationship in the target iModel from the specified RelationshipProps. * @note A subclass may override this method to customize update behavior but should call `super.onUpdateRelationship`. */ - protected onUpdateRelationship(relationshipProps: RelationshipProps): void { + protected async onUpdateRelationship( + relationshipProps: RelationshipProps + ): Promise { if (!relationshipProps.id) { throw new IModelError( IModelStatus.InvalidId, @@ -670,13 +738,13 @@ export class IModelImporter { loggerCategory, `Updated ${this.formatRelationshipForLogger(relationshipProps)}` ); - this.trackProgress(); + await this.trackProgress(); } /** Delete the specified Relationship from the target iModel. */ - protected onDeleteRelationship( + protected async onDeleteRelationship( relationshipProps: RelationshipPropsForDelete - ): void { + ): Promise { // Only passing in what deleteInstance actually uses, full relationshipProps is not necessary. this.targetDb.relationships.deleteInstance({ id: relationshipProps.id, @@ -686,14 +754,14 @@ export class IModelImporter { loggerCategory, `Deleted relationship ${relationshipProps.classFullName} id=${relationshipProps.id}` ); - this.trackProgress(); + await this.trackProgress(); } /** Delete the specified Relationship from the target iModel. */ - public deleteRelationship( + public async deleteRelationship( relationshipProps: RelationshipPropsForDelete - ): void { - this.onDeleteRelationship(relationshipProps); + ): Promise { + await this.onDeleteRelationship(relationshipProps); } /** Format a Relationship for the Logger. */ @@ -702,17 +770,17 @@ export class IModelImporter { } /** Tracks incremental progress */ - private trackProgress(): void { + private async trackProgress(): Promise { this._progressCounter++; if (0 === this._progressCounter % this.progressInterval) { - this.onProgress(); + await this.onProgress(); } } /** This method is called when IModelImporter has made incremental progress based on the [[progressInterval]] setting. * @note A subclass may override this method to report custom progress but should call `super.onProgress`. */ - protected onProgress(): void {} + protected async onProgress(): Promise {} /** Optionally compute the projectExtents for the target iModel depending on the options for this IModelImporter. * @note This method is automatically called from [IModelTransformer.process]($transformer). @@ -744,9 +812,14 @@ export class IModelImporter { typeof this.options.autoExtendProjectExtents === "object" ? this.options.autoExtendProjectExtents.excludeOutliers : false; - const newProjectExtents: AxisAlignedBox3d = excludeOutliers - ? computedProjectExtents.extents - : computedProjectExtents.extentsWithOutliers!; + // If excludeOutliers is true, use the extents without outliers. + // Otherwise prefer extentsWithOutliers, but fall back to extents if it's undefined or a null range. + const extentsWithOutliers = computedProjectExtents.extentsWithOutliers; + const useExtentsWithOutliers = + !excludeOutliers && extentsWithOutliers && !extentsWithOutliers.isNull; + const newProjectExtents = useExtentsWithOutliers + ? extentsWithOutliers + : computedProjectExtents.extents; if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) { this.targetDb.updateProjectExtents(newProjectExtents); Logger.logInfo( @@ -795,8 +868,7 @@ export class IModelImporter { */ public optimizeGeometry(options: OptimizeGeometryOptions): void { if (options.inlineUniqueGeometryParts) { - /* eslint-disable-next-line deprecation/deprecation */ - const result = this.targetDb.nativeDb.inlineGeometryPartReferences(); + const result = this.targetDb.inlineGeometryParts(); Logger.logInfo( loggerCategory, `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.` @@ -836,30 +908,28 @@ export function hasEntityChanged( namesToIgnore?: Set ): boolean { let changed: boolean = false; - entity.forEachProperty( - (propertyName: string, propertyMeta: PropertyMetaData) => { - if (!changed) { - if (namesToIgnore && namesToIgnore.has(propertyName)) { - // skip - } else if (PrimitiveTypeCode.Binary === propertyMeta.primitiveType) { - changed = hasBinaryValueChanged( - entity.asAny[propertyName], - (entityProps as any)[propertyName] - ); - } else if (propertyMeta.isNavigation) { - changed = hasNavigationValueChanged( - entity.asAny[propertyName], - (entityProps as any)[propertyName] - ); - } else { - changed = hasValueChanged( - entity.asAny[propertyName], - (entityProps as any)[propertyName] - ); - } + entity.forEach((propertyName: string, property: Property) => { + if (!changed) { + if (namesToIgnore && namesToIgnore.has(propertyName)) { + // skip + } else if (PropertyType.Binary === property.propertyType) { + changed = hasBinaryValueChanged( + entity.asAny[ECJsNames.toJsName(propertyName)], + (entityProps as any)[ECJsNames.toJsName(propertyName)] + ); + } else if (property.isNavigation()) { + changed = hasNavigationValueChanged( + entity.asAny[ECJsNames.toJsName(propertyName)], + (entityProps as any)[ECJsNames.toJsName(propertyName)] + ); + } else { + changed = hasValueChanged( + entity.asAny[ECJsNames.toJsName(propertyName)], + (entityProps as any)[ECJsNames.toJsName(propertyName)] + ); } } - ); + }); return changed; } diff --git a/packages/transformer/src/IModelTransformer.ts b/packages/transformer/src/IModelTransformer.ts index 5a8905fd2..86dbf85c4 100644 --- a/packages/transformer/src/IModelTransformer.ts +++ b/packages/transformer/src/IModelTransformer.ts @@ -10,7 +10,6 @@ import * as Semver from "semver"; import * as nodeAssert from "assert"; import { assert, - DbResult, Guid, GuidString, Id64, @@ -31,8 +30,8 @@ import { Transform, Vector3d, } from "@itwin/core-geometry"; -import * as coreBackendPkgJson from "@itwin/core-backend/package.json"; import { + BriefcaseDb, BriefcaseManager, ChangedECInstance, ChangesetECAdaptor, @@ -43,7 +42,6 @@ import { DefinitionModel, DefinitionPartition, ECSchemaXmlContext, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementAspect, @@ -82,6 +80,7 @@ import { CodeProps, CodeSpec, ConcreteEntityTypes, + ECJsNames, ElementAspectProps, ElementProps, EntityReference, @@ -95,8 +94,6 @@ import { ModelProps, Placement2d, Placement3d, - PrimitiveTypeCode, - PropertyMetaData, QueryBinder, RelatedElement, SourceAndTarget, @@ -114,6 +111,7 @@ import { TransformerLoggerCategory } from "./TransformerLoggerCategory"; import { IModelCloneContext } from "./IModelCloneContext"; import { EntityUnifier } from "./EntityUnifier"; import { rangesFromRangeAndSkipped } from "./Algo"; +import { Property } from "@itwin/ecschema-metadata"; const loggerCategory: string = TransformerLoggerCategory.IModelTransformer; @@ -256,6 +254,12 @@ export interface IModelTransformOptions { * @default false */ tryAlignGeolocation?: boolean; + + /** + * Acquire locks on elements during import + * @default false + */ + acquireElementLocks?: boolean; } /** @@ -424,9 +428,6 @@ export class IModelTransformer extends IModelExportHandler { "targetScopeElementId" | "danglingReferencesBehavior" >; - /** @see hasDefinitionContainerDeletionFeature */ - private _hasDefinitionContainerDeletionFeature?: boolean; - /** * A private variable meant to be set by tests which have an outdated way of setting up transforms. In all synchronizations today we expect to find an ESA in the branch db which describes the master -> branch relationship. * The exception to this is the first transform aka the provenance initializing transform which requires that the master imodel and the branch imodel are identical at the time of provenance initialization. @@ -443,17 +444,18 @@ export class IModelTransformer extends IModelExportHandler { * @param dbToQuery db to run the query on for scope external source * @param aspectProps aspectProps to search for @see ExternalSourceAspectProps */ - public static queryScopeExternalSourceAspect( + public static async queryScopeExternalSourceAspect( dbToQuery: IModelDb, aspectProps: ExternalSourceAspectProps - ): + ): Promise< | { aspectId: Id64String; version?: string; /** stringified json */ jsonProperties?: string; } - | undefined { + | undefined + > { const sql = ` SELECT ECInstanceId, Version, JsonProperties FROM ${ExternalSourceAspect.classFullName} @@ -463,25 +465,26 @@ export class IModelTransformer extends IModelExportHandler { AND Identifier=:identifier LIMIT 1 `; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return dbToQuery.withPreparedStatement(sql, (statement: ECSqlStatement) => { - statement.bindId("elementId", aspectProps.element.id); - if (aspectProps.scope === undefined) return undefined; // return instead of binding an invalid id - statement.bindId("scopeId", aspectProps.scope.id); - statement.bindString("kind", aspectProps.kind); - statement.bindString("identifier", aspectProps.identifier); - if (DbResult.BE_SQLITE_ROW !== statement.step()) return undefined; - const aspectId = statement.getValue(0).getId(); - const versionValue = statement.getValue(1); - const version = versionValue.isNull - ? undefined - : versionValue.getString(); - const jsonPropsValue = statement.getValue(2); - const jsonProperties = jsonPropsValue.isNull - ? undefined - : jsonPropsValue.getString(); - return { aspectId, version, jsonProperties }; - }); + + if (aspectProps.scope === undefined) return undefined; + + const params = new QueryBinder() + .bindId("elementId", aspectProps.element.id) + .bindId("scopeId", aspectProps.scope.id) + .bindString("kind", aspectProps.kind) + .bindString("identifier", aspectProps.identifier); + + return dbToQuery.withQueryReader( + sql, + (reader) => { + if (!reader.step()) return undefined; + const aspectId = reader.current[0] as Id64String; + const version = reader.current[1] as string | undefined; + const jsonProperties = reader.current[2] as string | undefined; + return { aspectId, version, jsonProperties }; + }, + params + ); } /** @@ -491,12 +494,12 @@ export class IModelTransformer extends IModelExportHandler { * @throws if no scoping ESA can be found in either the sourceDb or targetDb which describes a master branch relationship between the two databases. * @returns "forward" or "reverse" */ - public static determineSyncType( + public static async determineSyncType( sourceDb: IModelDb, targetDb: IModelDb, /** @see [[IModelTransformOptions.targetScopeElementId]] */ targetScopeElementId: Id64String - ): "forward" | "reverse" { + ): Promise<"forward" | "reverse"> { const aspectProps = { id: undefined as string | undefined, version: undefined as string | undefined, @@ -511,7 +514,7 @@ export class IModelTransformer extends IModelExportHandler { jsonProperties: undefined as TargetScopeProvenanceJsonProps | undefined, }; /** First check if the targetDb is the branch (branch is the @see provenanceDb) */ - const esaPropsFromTargetDb = this.queryScopeExternalSourceAspect( + const esaPropsFromTargetDb = await this.queryScopeExternalSourceAspect( targetDb, aspectProps ); @@ -521,7 +524,7 @@ export class IModelTransformer extends IModelExportHandler { // Now check if the sourceDb is the branch aspectProps.identifier = targetDb.iModelId; - const esaPropsFromSourceDb = this.queryScopeExternalSourceAspect( + const esaPropsFromSourceDb = await this.queryScopeExternalSourceAspect( sourceDb, aspectProps ); @@ -532,7 +535,7 @@ export class IModelTransformer extends IModelExportHandler { throw new Error(this.noEsaSyncDirectionErrorMessage); } - private determineSyncType(): SyncType { + private async determineSyncType(): Promise { if (this._isProvenanceInitTransform) { return "forward"; } @@ -540,7 +543,7 @@ export class IModelTransformer extends IModelExportHandler { return "not-sync"; } try { - return IModelTransformer.determineSyncType( + return await IModelTransformer.determineSyncType( this.sourceDb, this.targetDb, this.targetScopeElementId @@ -557,13 +560,15 @@ export class IModelTransformer extends IModelExportHandler { } } - public get isReverseSynchronization(): boolean { - if (this._syncType === undefined) this._syncType = this.determineSyncType(); + public async getIsReverseSynchronization(): Promise { + if (this._syncType === undefined) + this._syncType = await this.determineSyncType(); return this._syncType === "reverse"; } - public get isForwardSynchronization(): boolean { - if (this._syncType === undefined) this._syncType = this.determineSyncType(); + public async getIsForwardSynchronization(): Promise { + if (this._syncType === undefined) + this._syncType = await this.determineSyncType(); return this._syncType === "forward"; } @@ -608,7 +613,6 @@ export class IModelTransformer extends IModelExportHandler { cloneUsingBinaryGeometry: options?.cloneUsingBinaryGeometry ?? true, targetScopeElementId: options?.targetScopeElementId ?? IModel.rootSubjectId, - // eslint-disable-next-line deprecation/deprecation danglingReferencesBehavior: options?.danglingReferencesBehavior ?? "reject", branchRelationshipDataBehavior: @@ -616,6 +620,7 @@ export class IModelTransformer extends IModelExportHandler { skipPropagateChangesToRootElements: options?.skipPropagateChangesToRootElements ?? true, tryAlignGeolocation: options?.tryAlignGeolocation ?? false, + acquireElementLocks: options?.acquireElementLocks ?? false, }; // check if authorization client is defined if (IModelHost.authorizationClient === undefined) { @@ -655,12 +660,25 @@ export class IModelTransformer extends IModelExportHandler { this._options.preserveElementIdsForFiltering, skipPropagateChangesToRootElements: this._options.skipPropagateChangesToRootElements, + acquireElementLocks: this._options.acquireElementLocks, }); } else { this.importer = target; this.validateSharedOptionsMatch(); } this.targetDb = this.importer.targetDb; + + // Validate acquireElementLocks option - only valid for BriefcaseDb targets + if ( + this._options.acquireElementLocks && + !(this.targetDb instanceof BriefcaseDb) + ) { + throw new IModelError( + IModelStatus.BadArg, + "acquireElementLocks option requires targetDb to be a BriefcaseDb" + ); + } + // create the IModelCloneContext, it must be initialized later this.context = new IModelCloneContext(this.sourceDb, this.targetDb); @@ -733,7 +751,7 @@ export class IModelTransformer extends IModelExportHandler { /** Dispose any native resources associated with this IModelTransformer. */ public dispose(): void { Logger.logTrace(loggerCategory, "dispose()"); - this.context.dispose(); + this.context[Symbol.dispose](); } /** Log current settings that affect IModelTransformer's behavior. */ @@ -793,15 +811,19 @@ export class IModelTransformer extends IModelExportHandler { /** Return the IModelDb where IModelTransformer will store its provenance. * @note This will be [[targetDb]] except when it is a reverse synchronization. In that case it be [[sourceDb]]. */ - public get provenanceDb(): IModelDb { - return this.isReverseSynchronization ? this.sourceDb : this.targetDb; + public async getProvenanceDb(): Promise { + return (await this.getIsReverseSynchronization()) + ? this.sourceDb + : this.targetDb; } /** Return the IModelDb where IModelTransformer looks for entities referred to by stored provenance. * @note This will be [[sourceDb]] except when it is a reverse synchronization. In that case it be [[targetDb]]. */ - public get provenanceSourceDb(): IModelDb { - return this.isReverseSynchronization ? this.targetDb : this.sourceDb; + public async getProvenanceSourceDb(): Promise { + return (await this.getIsReverseSynchronization()) + ? this.targetDb + : this.sourceDb; } /** Create an ExternalSourceAspectProps in a standard way for an Element in an iModel --> iModel transformation. */ @@ -839,7 +861,7 @@ export class IModelTransformer extends IModelExportHandler { return aspectProps; } - public static initRelationshipProvenanceOptions( + public static async initRelationshipProvenanceOptions( sourceRelInstanceId: Id64String, targetRelInstanceId: Id64String, args: { @@ -849,7 +871,7 @@ export class IModelTransformer extends IModelExportHandler { targetScopeElementId: Id64String; forceOldRelationshipProvenanceMethod: boolean; } - ): ExternalSourceAspectProps { + ): Promise { const provenanceDb = args.isReverseSynchronization ? args.sourceDb : args.targetDb; @@ -860,15 +882,17 @@ export class IModelTransformer extends IModelExportHandler { ? sourceRelInstanceId : targetRelInstanceId; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const elementId = provenanceDb.withPreparedStatement( - "SELECT SourceECInstanceId FROM bis.ElementRefersToElements WHERE ECInstanceId=?", - (stmt) => { - stmt.bindId(1, provenanceRelInstanceId); - nodeAssert(stmt.step() === DbResult.BE_SQLITE_ROW); - return stmt.getValue(0).getId(); - } + const sql = + "SELECT SourceECInstanceId FROM bis.ElementRefersToElements WHERE ECInstanceId=?"; + const params = new QueryBinder().bindId(1, provenanceRelInstanceId); + const reader = provenanceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + nodeAssert( + await reader.step(), + "relationship provenance query returned no rows" ); + const elementId = reader.current[0]; const jsonProperties = args.forceOldRelationshipProvenanceMethod ? { targetRelInstanceId } @@ -898,15 +922,15 @@ export class IModelTransformer extends IModelExportHandler { private _forceOldRelationshipProvenanceMethod = false; /** Create an ExternalSourceAspectProps in a standard way for an Element in an iModel --> iModel transformation. */ - public initElementProvenance( + public async initElementProvenance( sourceElementId: Id64String, targetElementId: Id64String - ): ExternalSourceAspectProps { + ): Promise { return IModelTransformer.initElementProvenanceOptions( sourceElementId, targetElementId, { - isReverseSynchronization: this.isReverseSynchronization, + isReverseSynchronization: await this.getIsReverseSynchronization(), targetScopeElementId: this.targetScopeElementId, sourceDb: this.sourceDb, targetDb: this.targetDb, @@ -919,17 +943,17 @@ export class IModelTransformer extends IModelExportHandler { * The `identifier` property of the ExternalSourceAspect will be the ECInstanceId of the relationship in the master iModel. * The ECInstanceId of the relationship in the branch iModel will be stored in the JsonProperties of the ExternalSourceAspect. */ - private initRelationshipProvenance( + private async initRelationshipProvenance( sourceRelationship: Relationship, targetRelInstanceId: Id64String - ): ExternalSourceAspectProps { + ): Promise { return IModelTransformer.initRelationshipProvenanceOptions( sourceRelationship.id, targetRelInstanceId, { sourceDb: this.sourceDb, targetDb: this.targetDb, - isReverseSynchronization: this.isReverseSynchronization, + isReverseSynchronization: await this.getIsReverseSynchronization(), targetScopeElementId: this.targetScopeElementId, forceOldRelationshipProvenanceMethod: this._forceOldRelationshipProvenanceMethod, @@ -958,20 +982,6 @@ export class IModelTransformer extends IModelExportHandler { private _cachedSynchronizationVersion: ChangesetIndexAndId | undefined = undefined; - /** - * As of itwinjs 4.6.0, definitionContainers are now deleted as if they were DefinitionPartitions as opposed to Definitions. - * This variable being true will be used to special case the deletion of DefinitionContainers the same way DefinitionPartitions are deleted. - */ - protected get hasDefinitionContainerDeletionFeature(): boolean { - if (this._hasDefinitionContainerDeletionFeature === undefined) { - this._hasDefinitionContainerDeletionFeature = Semver.satisfies( - coreBackendPkgJson.version, - "^4.6.0" - ); - } - return this._hasDefinitionContainerDeletionFeature; - } - /** * We cache the synchronization version to avoid querying the target scoping ESA multiple times. * If the target scoping ESA is ever updated we need to clear any potentially cached sync version otherwise we will get stale values. @@ -988,14 +998,14 @@ export class IModelTransformer extends IModelExportHandler { * @note empty string and -1 for changeset and index if it was transformed before federation guid update (pre 1.x) and @see [[IModelTransformOptions.branchRelationshipDataBehavior]] === "unsafe-migrate". * @throws if the version is not found in a preexisting scope aspect and @see [[IModelTransformOptions.branchRelationshipDataBehavior]] !== "unsafe-migrate" */ - protected get synchronizationVersion(): ChangesetIndexAndId { + protected async getSynchronizationVersion(): Promise { if (this._cachedSynchronizationVersion === undefined) { - const provenanceScopeAspect = this.tryGetProvenanceScopeAspect(); + const provenanceScopeAspect = await this.tryGetProvenanceScopeAspect(); if (!provenanceScopeAspect) { return { index: -1, id: "" }; // first synchronization. } - const version = this.isReverseSynchronization + const version = (await this.getIsReverseSynchronization()) ? ( JSON.parse( provenanceScopeAspect.jsonProperties ?? "{}" @@ -1024,19 +1034,24 @@ export class IModelTransformer extends IModelExportHandler { * @returns provenance scope aspect if it exists in the provenanceDb. * Provenance scope aspect is created and inserted into provenanceDb when [[initScopeProvenance]] is invoked. */ - protected tryGetProvenanceScopeAspect(): ExternalSourceAspect | undefined { + protected async tryGetProvenanceScopeAspect(): Promise< + ExternalSourceAspect | undefined + > { const scopeProvenanceAspectProps = - IModelTransformer.queryScopeExternalSourceAspect(this.provenanceDb, { - id: undefined, - classFullName: ExternalSourceAspect.classFullName, - scope: { id: IModel.rootSubjectId }, - kind: ExternalSourceAspect.Kind.Scope, - element: { id: this.targetScopeElementId ?? IModel.rootSubjectId }, - identifier: this.provenanceSourceDb.iModelId, - }); + await IModelTransformer.queryScopeExternalSourceAspect( + await this.getProvenanceDb(), + { + id: undefined, + classFullName: ExternalSourceAspect.classFullName, + scope: { id: IModel.rootSubjectId }, + kind: ExternalSourceAspect.Kind.Scope, + element: { id: this.targetScopeElementId ?? IModel.rootSubjectId }, + identifier: (await this.getProvenanceSourceDb()).iModelId, + } + ); return scopeProvenanceAspectProps !== undefined - ? (this.provenanceDb.elements.getAspect( + ? ((await this.getProvenanceDb()).elements.getAspect( scopeProvenanceAspectProps.aspectId ) as ExternalSourceAspect) : undefined; @@ -1048,7 +1063,9 @@ export class IModelTransformer extends IModelExportHandler { * @returns the last synced version (changesetId) on the target scope's external source aspect, * if this was a [BriefcaseDb]($backend) */ - protected initScopeProvenance(): void { + protected async initScopeProvenance(): Promise { + const provenanceDb = await this.getProvenanceDb(); + const sourceProvenanceDb = await this.getProvenanceSourceDb(); const aspectProps = { id: undefined as string | undefined, version: undefined as string | undefined, @@ -1058,15 +1075,16 @@ export class IModelTransformer extends IModelExportHandler { relClassName: ElementOwnsExternalSourceAspects.classFullName, }, scope: { id: IModel.rootSubjectId }, // the root Subject scopes scope elements - identifier: this.provenanceSourceDb.iModelId, + identifier: sourceProvenanceDb.iModelId, kind: ExternalSourceAspect.Kind.Scope, jsonProperties: undefined as TargetScopeProvenanceJsonProps | undefined, }; - const foundEsaProps = IModelTransformer.queryScopeExternalSourceAspect( - this.provenanceDb, - aspectProps - ); // this query includes "identifier" + const foundEsaProps = + await IModelTransformer.queryScopeExternalSourceAspect( + provenanceDb, + aspectProps + ); // this query includes "identifier" if (foundEsaProps === undefined) { aspectProps.version = ""; // empty since never before transformed. Will be updated in [[finalizeTransformation]] @@ -1086,17 +1104,14 @@ export class IModelTransformer extends IModelExportHandler { LIMIT 1 `; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const hasConflictingScope = this.provenanceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): boolean => { - statement.bindId("elementId", aspectProps.element.id); - statement.bindId("scopeId", aspectProps.scope.id); // this scope.id can never be invalid, we create it above - statement.bindString("kind", aspectProps.kind); - return DbResult.BE_SQLITE_ROW === statement.step(); - } - ); + const params = new QueryBinder(); + params.bindId("elementId", aspectProps.element.id); + params.bindId("scopeId", aspectProps.scope.id); // this scope.id can never be invalid, we create it above + params.bindString("kind", aspectProps.kind); + const reader = provenanceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + const hasConflictingScope = await reader.step(); if (hasConflictingScope) { throw new IModelError( @@ -1105,7 +1120,12 @@ export class IModelTransformer extends IModelExportHandler { ); } if (!this._options.noProvenance) { - const id = this.provenanceDb.elements.insertAspect({ + if (this._options.acquireElementLocks) { + await provenanceDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } + const id = provenanceDb.elements.insertAspect({ ...aspectProps, jsonProperties: JSON.stringify(aspectProps.jsonProperties) as any, }); @@ -1128,7 +1148,12 @@ export class IModelTransformer extends IModelExportHandler { "Unsafe migrate made a change to the target scope's external source aspect. Updating aspect in database.", { oldProps, newProps: aspectProps } ); - this.provenanceDb.elements.updateAspect({ + if (this._options.acquireElementLocks) { + await provenanceDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } + provenanceDb.elements.updateAspect({ ...aspectProps, jsonProperties: JSON.stringify(aspectProps.jsonProperties) as any, }); @@ -1217,14 +1242,14 @@ export class IModelTransformer extends IModelExportHandler { * @note provenance is done by federation guids where possible * @note this may execute on each element more than once! Only use in cases where that is handled */ - public static forEachTrackedElement(args: { + public static async forEachTrackedElement(args: { provenanceSourceDb: IModelDb; provenanceDb: IModelDb; targetScopeElementId: Id64String; isReverseSynchronization: boolean; fn: (sourceElementId: Id64String, targetElementId: Id64String) => void; skipPropagateChangesToRootElements: boolean; - }): void { + }): Promise { if (args.provenanceDb === args.provenanceSourceDb) return; if (!args.provenanceDb.containsClass(ExternalSourceAspect.classFullName)) { @@ -1258,53 +1283,49 @@ export class IModelTransformer extends IModelExportHandler { // we could get the intersection of fed guids in one query, not sure if it would be faster // OR we could do a raw sqlite query... - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - sourceDb.withStatement(elementIdByFedGuidQuery, (sourceStmt) => - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withStatement(elementIdByFedGuidQuery, (targetStmt) => { - if (sourceStmt.step() !== DbResult.BE_SQLITE_ROW) return; - let sourceRow = sourceStmt.getRow() as { - federationGuid?: GuidString; - id: Id64String; - }; - if (targetStmt.step() !== DbResult.BE_SQLITE_ROW) return; - let targetRow = targetStmt.getRow() as { - federationGuid?: GuidString; - id: Id64String; - }; - - // NOTE: these comparisons rely upon the lowercase of the guid, - // and the fact that '0' < '9' < a' < 'f' in ascii/utf8 - while (true) { - const currSourceRow = sourceRow, - currTargetRow = targetRow; - if ( - currSourceRow.federationGuid !== undefined && - currTargetRow.federationGuid !== undefined && - currSourceRow.federationGuid === currTargetRow.federationGuid - ) { - // data flow direction is always sourceDb -> targetDb and it does not depend on where the explicit element provenance is stored - args.fn(sourceRow.id, targetRow.id); - } - if ( - currTargetRow.federationGuid === undefined || - (currSourceRow.federationGuid !== undefined && - currSourceRow.federationGuid >= currTargetRow.federationGuid) - ) { - if (targetStmt.step() !== DbResult.BE_SQLITE_ROW) return; - targetRow = targetStmt.getRow(); - } - if ( - currSourceRow.federationGuid === undefined || - (currTargetRow.federationGuid !== undefined && - currSourceRow.federationGuid <= currTargetRow.federationGuid) - ) { - if (sourceStmt.step() !== DbResult.BE_SQLITE_ROW) return; - sourceRow = sourceStmt.getRow(); - } - } - }) + const sourceReader = sourceDb.createQueryReader( + elementIdByFedGuidQuery, + undefined, + { usePrimaryConn: true } + ); + const targetReader = targetDb.createQueryReader( + elementIdByFedGuidQuery, + undefined, + { usePrimaryConn: true } ); + let hasSourceRow = await sourceReader.step(); + let hasTargetRow = await targetReader.step(); + while (hasSourceRow && hasTargetRow) { + const sourceFedGuid = sourceReader.current.federationGuid as + | GuidString + | undefined; + const targetFedGuid = targetReader.current.federationGuid as + | GuidString + | undefined; + if ( + sourceFedGuid !== undefined && + targetFedGuid !== undefined && + sourceFedGuid === targetFedGuid + ) { + // data flow direction is always sourceDb -> targetDb and it does not depend on where the explicit element provenance is stored + args.fn( + sourceReader.current.id as Id64String, + targetReader.current.id as Id64String + ); + } + if ( + targetFedGuid === undefined || + (sourceFedGuid !== undefined && sourceFedGuid >= targetFedGuid) + ) { + hasTargetRow = await targetReader.step(); + } + if ( + sourceFedGuid === undefined || + (targetFedGuid !== undefined && sourceFedGuid <= targetFedGuid) + ) { + hasSourceRow = await sourceReader.step(); + } + } // query for provenanceDb const provenanceAspectsQuery = ` @@ -1318,37 +1339,37 @@ export class IModelTransformer extends IModelExportHandler { // victims of the old provenance method that have both fedguids and an inserted aspect. // But this is a private function with one known caller where that doesn't matter - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - args.provenanceDb.withPreparedStatement( + const runFnInDataFlowDirection = ( + sourceId: Id64String, + targetId: Id64String + ) => + args.isReverseSynchronization + ? args.fn(sourceId, targetId) + : args.fn(targetId, sourceId); + const params = new QueryBinder(); + params.bindId("scopeId", args.targetScopeElementId); + params.bindString("kind", ExternalSourceAspect.Kind.Element); + const provenanceReader = args.provenanceDb.createQueryReader( provenanceAspectsQuery, - (stmt): void => { - const runFnInDataFlowDirection = ( - sourceId: Id64String, - targetId: Id64String - ) => - args.isReverseSynchronization - ? args.fn(sourceId, targetId) - : args.fn(targetId, sourceId); - stmt.bindId("scopeId", args.targetScopeElementId); - stmt.bindString("kind", ExternalSourceAspect.Kind.Element); - while (DbResult.BE_SQLITE_ROW === stmt.step()) { - // ExternalSourceAspect.Identifier is of type string - const aspectIdentifier: Id64String = stmt.getValue(0).getString(); - const elementId: Id64String = stmt.getValue(1).getId(); - runFnInDataFlowDirection(elementId, aspectIdentifier); - } - } + params, + { usePrimaryConn: true } ); + for await (const row of provenanceReader) { + // ExternalSourceAspect.Identifier is of type string + const aspectIdentifier: Id64String = row[0]; + const elementId: Id64String = row.id; + runFnInDataFlowDirection(elementId, aspectIdentifier); + } } - private forEachTrackedElement( + private async forEachTrackedElement( fn: (sourceElementId: Id64String, targetElementId: Id64String) => void - ): void { + ): Promise { return IModelTransformer.forEachTrackedElement({ - provenanceSourceDb: this.provenanceSourceDb, - provenanceDb: this.provenanceDb, + provenanceSourceDb: await this.getProvenanceSourceDb(), + provenanceDb: await this.getProvenanceDb(), targetScopeElementId: this.targetScopeElementId, - isReverseSynchronization: this.isReverseSynchronization, + isReverseSynchronization: await this.getIsReverseSynchronization(), fn, skipPropagateChangesToRootElements: this._options.skipPropagateChangesToRootElements ?? true, @@ -1362,27 +1383,30 @@ export class IModelTransformer extends IModelExportHandler { * @param entityInProvenanceSourceId * @returns the elementId that the ESA is stored on, esa.Element.Id */ - private _queryProvenanceForElement( + private async _queryProvenanceForElement( entityInProvenanceSourceId: Id64String - ): Id64String | undefined { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return this.provenanceDb.withPreparedStatement( - ` + ): Promise { + const sql = ` SELECT esa.Element.Id FROM Bis.ExternalSourceAspect esa WHERE esa.Kind=? AND esa.Scope.Id=? AND esa.Identifier=? - `, - (stmt) => { - stmt.bindString(1, ExternalSourceAspect.Kind.Element); - stmt.bindId(2, this.targetScopeElementId); - stmt.bindString(3, entityInProvenanceSourceId); - if (stmt.step() === DbResult.BE_SQLITE_ROW) - return stmt.getValue(0).getId(); - else return undefined; + `; + const params = new QueryBinder(); + params.bindString(1, ExternalSourceAspect.Kind.Element); + params.bindId(2, this.targetScopeElementId); + params.bindString(3, entityInProvenanceSourceId); + const result = (await this.getProvenanceDb()).createQueryReader( + sql, + params, + { + usePrimaryConn: true, } ); + if (await result.step()) { + return result.current.id; + } else return undefined; } /** @@ -1392,56 +1416,60 @@ export class IModelTransformer extends IModelExportHandler { * @param entityInProvenanceSourceId * @returns */ - private _queryProvenanceForRelationship( + private async _queryProvenanceForRelationship( entityInProvenanceSourceId: Id64String, sourceRelInfo: { classFullName: string; sourceId: Id64String; targetId: Id64String; } - ): + ): Promise< | { aspectId: Id64String; /** if undefined, the relationship could not be found, perhaps it was deleted */ relationshipId: Id64String | undefined; } - | undefined { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return this.provenanceDb.withPreparedStatement( - ` - SELECT - ECInstanceId, - JSON_EXTRACT(JsonProperties, '$.targetRelInstanceId'), - JSON_EXTRACT(JsonProperties, '$.provenanceRelInstanceId') - FROM Bis.ExternalSourceAspect - WHERE Kind=? - AND Scope.Id=? - AND Identifier=? - `, - (stmt) => { - stmt.bindString(1, ExternalSourceAspect.Kind.Relationship); - stmt.bindId(2, this.targetScopeElementId); - stmt.bindString(3, entityInProvenanceSourceId); - if (stmt.step() !== DbResult.BE_SQLITE_ROW) return undefined; - - const aspectId = stmt.getValue(0).getId(); - const provenanceRelInstIdVal = stmt.getValue(2); - const provenanceRelInstanceId = !provenanceRelInstIdVal.isNull - ? provenanceRelInstIdVal.getString() - : this._queryTargetRelId(sourceRelInfo); - return { - aspectId, - relationshipId: provenanceRelInstanceId, - }; + | undefined + > { + const sql = ` + SELECT + ECInstanceId, + JSON_EXTRACT(JsonProperties, '$.provenanceRelInstanceId') AS provenanceRelInstId + FROM Bis.ExternalSourceAspect + WHERE Kind=? + AND Scope.Id=? + AND Identifier=? + `; + const params = new QueryBinder(); + params.bindString(1, ExternalSourceAspect.Kind.Relationship); + params.bindId(2, this.targetScopeElementId); + params.bindString(3, entityInProvenanceSourceId); + const result = (await this.getProvenanceDb()).createQueryReader( + sql, + params, + { + usePrimaryConn: true, } ); + if (await result.step()) { + const aspectId = result.current.id; + const provenanceRelInstId = result.current.provenanceRelInstId; + const provenanceRelInstanceId = + provenanceRelInstId !== undefined + ? (provenanceRelInstId as string) + : await this._queryTargetRelId(sourceRelInfo); + return { + aspectId, + relationshipId: provenanceRelInstanceId, + }; + } else return undefined; } - private _queryTargetRelId(sourceRelInfo: { + private async _queryTargetRelId(sourceRelInfo: { classFullName: string; sourceId: Id64String; targetId: Id64String; - }): Id64String | undefined { + }): Promise { const targetRelInfo = { sourceId: this.context.findTargetElementId(sourceRelInfo.sourceId), targetId: this.context.findTargetElementId(sourceRelInfo.targetId), @@ -1451,35 +1479,35 @@ export class IModelTransformer extends IModelExportHandler { targetRelInfo.targetId === undefined ) return undefined; // couldn't find an element, rel is invalid or deleted - - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return this.targetDb.withPreparedStatement( - ` - SELECT ECInstanceId - FROM bis.ElementRefersToElements - WHERE SourceECInstanceId=? - AND TargetECInstanceId=? - AND ECClassId=? - `, - (stmt) => { - stmt.bindId(1, targetRelInfo.sourceId); - stmt.bindId(2, targetRelInfo.targetId); - stmt.bindId( - 3, - this._targetClassNameToClassId(sourceRelInfo.classFullName) - ); - if (stmt.step() !== DbResult.BE_SQLITE_ROW) return undefined; - return stmt.getValue(0).getId(); - } + const sql = ` + select ecinstanceid + from bis.elementreferstoelements + where sourceecinstanceid=? + and targetecinstanceid=? + and ecclassid=? + `; + const params = new QueryBinder(); + params.bindId(1, targetRelInfo.sourceId); + params.bindId(2, targetRelInfo.targetId); + params.bindId( + 3, + await this._targetClassNameToClassId(sourceRelInfo.classFullName) ); + const result = this.targetDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + if (await result.step()) return result.current.id; + else return undefined; } private _targetClassNameToClassIdCache = new Map(); - private _targetClassNameToClassId(classFullName: string): Id64String { + private async _targetClassNameToClassId( + classFullName: string + ): Promise { let classId = this._targetClassNameToClassIdCache.get(classFullName); if (classId === undefined) { - classId = this._getRelClassId(this.targetDb, classFullName); + classId = await this._getRelClassId(this.targetDb, classFullName); this._targetClassNameToClassIdCache.set(classFullName, classId); } return classId; @@ -1487,112 +1515,54 @@ export class IModelTransformer extends IModelExportHandler { // NOTE: this doesn't handle remapped element classes, // but is only used for relationships rn - private _getRelClassId(db: IModelDb, classFullName: string): Id64String { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - ` + private async _getRelClassId( + db: IModelDb, + classFullName: string + ): Promise { + const sql = ` SELECT c.ECInstanceId FROM ECDbMeta.ECClassDef c JOIN ECDbMeta.ECSchemaDef s ON c.Schema.Id=s.ECInstanceId WHERE s.Name=? AND c.Name=? - `, - (stmt) => { - const [schemaName, className] = - classFullName.indexOf(".") !== -1 - ? classFullName.split(".") - : classFullName.split(":"); - stmt.bindString(1, schemaName); - stmt.bindString(2, className); - if (stmt.step() === DbResult.BE_SQLITE_ROW) - return stmt.getValue(0).getId(); - assert(false, "relationship was not found"); - } - ); - } - - private _queryElemIdByFedGuid( - db: IModelDb, - fedGuid: GuidString - ): Id64String | undefined { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - "SELECT ECInstanceId FROM Bis.Element WHERE FederationGuid=?", - (stmt) => { - stmt.bindGuid(1, fedGuid); - if (stmt.step() === DbResult.BE_SQLITE_ROW) - return stmt.getValue(0).getId(); - else return undefined; - } - ); + `; + const params = new QueryBinder(); + const [schemaName, className] = + classFullName.indexOf(".") !== -1 + ? classFullName.split(".") + : classFullName.split(":"); + params.bindString(1, schemaName); + params.bindString(2, className); + const result = db.createQueryReader(sql, params, { usePrimaryConn: true }); + if (await result.step()) return result.current.id; + assert(false, "relationship was not found"); } /** Returns `true` if *brute force* delete detections should be run. * @note This is only called if [[IModelTransformOptions.forceExternalSourceAspectProvenance]] option is true * @note Not relevant for [[process]] when [[IModelTransformOptions.argsForProcessChanges]] are provided and change history is known. */ - protected shouldDetectDeletes(): boolean { + protected async shouldDetectDeletes(): Promise { nodeAssert(this._syncType !== undefined); return this._syncType === "not-sync"; } - /** - * Detect Element deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against Elements - * in the source iModel. - * @deprecated in 1.x. Do not use this. // FIXME: how to better explain this? - * This method is only called during [[process]] when [[IModelTransformOptions.argsForProcessChanges]] is undefined and the option - * [[IModelTransformOptions.forceExternalSourceAspectProvenance]] is enabled. It is not - * necessary when calling [[process]] with [[IModelTransformOptions.argsForProcessChanges]] defined, since changeset information is sufficient. - * @note you do not need to call this directly unless processing a subset of an iModel. - * @throws [[IModelError]] If the required provenance information is not available to detect deletes. - */ - public async detectElementDeletes(): Promise { - const sql = ` - SELECT Identifier, Element.Id - FROM BisCore.ExternalSourceAspect - WHERE Scope.Id=:scopeId - AND Kind=:kind - `; - - nodeAssert( - !this.isReverseSynchronization, - "synchronizations with processChanges already detect element deletes, don't call detectElementDeletes" - ); - - // Reported issue: https://github.com/iTwin/itwinjs-core/issues/7989 - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.provenanceDb.withPreparedStatement(sql, (stmt) => { - stmt.bindId("scopeId", this.targetScopeElementId); - stmt.bindString("kind", ExternalSourceAspect.Kind.Element); - while (DbResult.BE_SQLITE_ROW === stmt.step()) { - // ExternalSourceAspect.Identifier is of type string - const aspectIdentifier = stmt.getValue(0).getString(); - if (!Id64.isValidId64(aspectIdentifier)) { - continue; - } - const targetElemId = stmt.getValue(1).getId(); - const wasDeletedInSource = !EntityUnifier.exists(this.sourceDb, { - entityReference: `e${aspectIdentifier}`, - }); - if (wasDeletedInSource) this.importer.deleteElement(targetElemId); - } - }); - } - /** Transform the specified sourceElement into ElementProps for the target iModel. * @param sourceElement The Element from the source iModel to transform. * @returns ElementProps for the target iModel. * @note A subclass can override this method to provide custom transform behavior. * @note This can be called more than once for an element in arbitrary order, so it should not have side-effects. */ - public onTransformElement(sourceElement: Element): ElementProps { + public async onTransformElement( + sourceElement: Element + ): Promise { Logger.logTrace( loggerCategory, `onTransformElement(${ sourceElement.id }) "${sourceElement.getDisplayLabel()}"` ); - const targetElementProps: ElementProps = this.context.cloneElement( + const targetElementProps: ElementProps = await this.context.cloneElement( sourceElement, { binaryGeometry: this._options.cloneUsingBinaryGeometry } ); @@ -1804,7 +1774,7 @@ export class IModelTransformer extends IModelExportHandler { ); } - protected completePartiallyCommittedElements() { + protected async completePartiallyCommittedElements() { for (const sourceElementId of this._partiallyCommittedElementIds) { const sourceElement = this.sourceDb.elements.getElement({ id: sourceElementId, @@ -1818,12 +1788,12 @@ export class IModelTransformer extends IModelExportHandler { ); } - const targetProps = this.onTransformElement(sourceElement); + const targetProps = await this.onTransformElement(sourceElement); this.targetDb.elements.updateElement({ ...targetProps, id: targetId }); } } - protected completePartiallyCommittedAspects() { + protected async completePartiallyCommittedAspects() { for (const sourceAspectId of this._partiallyCommittedAspectIds) { const sourceAspect = this.sourceDb.elements.getAspect(sourceAspectId); const targetAspectId = this.context.findTargetAspectId(sourceAspectId); @@ -1832,7 +1802,13 @@ export class IModelTransformer extends IModelExportHandler { `source-target aspect mapping not found for aspect "${sourceAspectId}" when completing partially committed aspects. This is a bug.` ); } - const targetAspectProps = this.onTransformElementAspect(sourceAspect); + const targetAspectProps = + await this.onTransformElementAspect(sourceAspect); + if (this._options.acquireElementLocks) { + await this.targetDb.locks.acquireLocks({ + exclusive: targetAspectProps.element.id, + }); + } this.targetDb.elements.updateAspect({ ...targetAspectProps, id: targetAspectId, @@ -1840,7 +1816,7 @@ export class IModelTransformer extends IModelExportHandler { } } - private doAllReferencesExistInTarget(entity: ConcreteEntity) { + private async doAllReferencesExistInTarget(entity: ConcreteEntity) { let allReferencesExist = true; for (const referenceId of entity.getReferenceIds()) { const referencedEntityId = EntityReferences.toId64(referenceId); @@ -1854,7 +1830,9 @@ export class IModelTransformer extends IModelExportHandler { if ( allReferencesExist && - !EntityReferences.isValid(this.context.findTargetEntityId(referenceId)) + !EntityReferences.isValid( + await this.context.findTargetEntityId(referenceId) + ) ) { // if we care about references existing then we cannot return early and must check all other references. if (this._options.danglingReferencesBehavior === "ignore") { @@ -1864,17 +1842,17 @@ export class IModelTransformer extends IModelExportHandler { } if (this._options.danglingReferencesBehavior === "reject") { - this.assertReferenceExistsInSource(referenceId, entity); + await this.assertReferenceExistsInSource(referenceId, entity); } } return allReferencesExist; } - private assertReferenceExistsInSource( + private async assertReferenceExistsInSource( referenceId: EntityReference, entity: ConcreteEntity ) { - const referencedExistsInSource = EntityUnifier.exists(this.sourceDb, { + const referencedExistsInSource = await EntityUnifier.exists(this.sourceDb, { entityReference: referenceId, }); if (!referencedExistsInSource) { @@ -1919,7 +1897,9 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.shouldExportElement]($transformer) that is called to determine if an element should be exported from the source iModel. * @note Reaching this point means that the element has passed the standard exclusion checks in IModelExporter. */ - public override shouldExportElement(_sourceElement: Element): boolean { + public override async shouldExportElement( + _sourceElement: Element + ): Promise { return true; } @@ -1986,7 +1966,7 @@ export class IModelTransformer extends IModelExportHandler { if (unresolvedReferences.length > 0) { for (const reference of unresolvedReferences) { - const processState = this.getElemTransformState(reference); + const processState = await this.getElemTransformState(reference); // must export element first if (processState.needsElemImport) await this.exporter.exportElement(reference); @@ -1996,27 +1976,27 @@ export class IModelTransformer extends IModelExportHandler { } } - private getElemTransformState(elementId: Id64String) { - const dbHasModel = (db: IModelDb, id: Id64String) => { + private async getElemTransformState(elementId: Id64String) { + const dbHasModel = async (db: IModelDb, id: Id64String) => { const maybeModelId = EntityReferences.fromEntityType( id, ConcreteEntityTypes.Model ); return EntityUnifier.exists(db, { entityReference: maybeModelId }); }; - const isSubModeled = dbHasModel(this.sourceDb, elementId); + const isSubModeled = await dbHasModel(this.sourceDb, elementId); const idOfElemInTarget = this.context.findTargetElementId(elementId); const isElemInTarget = Id64.invalid !== idOfElemInTarget; const needsModelImport = isSubModeled && - (!isElemInTarget || !dbHasModel(this.targetDb, idOfElemInTarget)); + (!isElemInTarget || !(await dbHasModel(this.targetDb, idOfElemInTarget))); return { needsElemImport: !isElemInTarget, needsModelImport }; } /** Override of [IModelExportHandler.onExportElement]($transformer) that imports an element into the target iModel when it is exported from the source iModel. * This override calls [[onTransformElement]] and then [IModelImporter.importElement]($transformer) to update the target iModel. */ - public override onExportElement(sourceElement: Element): void { + public override async onExportElement(sourceElement: Element): Promise { let targetElementId: Id64String = Id64.invalid; let targetElementProps: ElementProps; if (this._options.wasSourceIModelCopiedToTarget) { @@ -2025,7 +2005,7 @@ export class IModelTransformer extends IModelExportHandler { this.targetDb.elements.getElementProps(targetElementId); } else { targetElementId = this.context.findTargetElementId(sourceElement.id); - targetElementProps = this.onTransformElement(sourceElement); + targetElementProps = await this.onTransformElement(sourceElement); } // if an existing remapping was not yet found, check by FederationGuid @@ -2035,8 +2015,7 @@ export class IModelTransformer extends IModelExportHandler { sourceElement.federationGuid !== undefined ) { targetElementId = - this._queryElemIdByFedGuid( - this.targetDb, + this.targetDb.elements.getIdFromFederationGuid( sourceElement.federationGuid ) ?? Id64.invalid; if (Id64.isValid(targetElementId)) @@ -2051,7 +2030,8 @@ export class IModelTransformer extends IModelExportHandler { // respond the same way to undefined code value as the @see Code class, but don't use that class because it trims // whitespace from the value, and there are iModels out there with untrimmed whitespace that we ought not to trim targetElementProps.code.value = targetElementProps.code.value ?? ""; - const maybeTargetElementId = this.targetDb.elements.queryElementIdByCode( + const maybeTargetElementId = await this.queryElementIdByCode( + this.targetDb, targetElementProps.code as Required ); if (undefined !== maybeTargetElementId) { @@ -2077,7 +2057,7 @@ export class IModelTransformer extends IModelExportHandler { return; } - if (!this.doAllReferencesExistInTarget(sourceElement)) { + if (!(await this.doAllReferencesExistInTarget(sourceElement))) { this._partiallyCommittedElementIds.add(sourceElement.id); } @@ -2114,9 +2094,16 @@ export class IModelTransformer extends IModelExportHandler { } if (!this._options.wasSourceIModelCopiedToTarget) { - this.importer.importElement(targetElementProps); // don't need to import if iModel was copied + await this.importer.importElement(targetElementProps); // don't need to import if iModel was copied + } + + if (targetElementProps.id === undefined) { + throw new IModelError( + IModelStatus.BadElement, + "targetElementProps.id should be assigned by importElement" + ); } - this.context.remapElement(sourceElement.id, targetElementProps.id!); // targetElementProps.id assigned by importElement + this.context.remapElement(sourceElement.id, targetElementProps.id); // the transformer does not currently 'split' or 'join' any elements, therefore, it does not // insert external source aspects because federation guids are sufficient for this. @@ -2125,6 +2112,7 @@ export class IModelTransformer extends IModelExportHandler { // physical consolidation is an example of a 'joining' transform // FIXME: verify at finalization time that we don't lose provenance on new elements // FIXME: make public and improve `initElementProvenance` API for usage by consolidators + const provenanceDb = await this.getProvenanceDb(); if (!this._options.noProvenance) { let provenance: | Parameters[0] @@ -2134,20 +2122,31 @@ export class IModelTransformer extends IModelExportHandler { ? undefined : sourceElement.federationGuid; if (!provenance) { - const aspectProps = this.initElementProvenance( + const aspectProps = await this.initElementProvenance( sourceElement.id, - targetElementProps.id! + targetElementProps.id ); - const foundEsaProps = IModelTransformer.queryScopeExternalSourceAspect( - this.provenanceDb, - aspectProps - ); - if (foundEsaProps === undefined) - aspectProps.id = this.provenanceDb.elements.insertAspect(aspectProps); - else { + const foundEsaProps = + await IModelTransformer.queryScopeExternalSourceAspect( + provenanceDb, + aspectProps + ); + if (foundEsaProps === undefined) { + if (this._options.acquireElementLocks) { + await provenanceDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } + aspectProps.id = provenanceDb.elements.insertAspect(aspectProps); + } else { // Since initElementProvenance sets a property 'version' on the aspectProps that we wish to persist in the provenanceDb, only grab the id from the foundEsaProps. aspectProps.id = foundEsaProps.aspectId; - this.provenanceDb.elements.updateAspect(aspectProps); + if (this._options.acquireElementLocks) { + await provenanceDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } + provenanceDb.elements.updateAspect(aspectProps); } provenance = aspectProps as MarkRequired< @@ -2159,21 +2158,48 @@ export class IModelTransformer extends IModelExportHandler { } } + // In iTwin js 5.x Elements.queryElementIdByCode() uses Code class to query id: + // https://github.com/iTwin/itwinjs-core/blob/master/core/backend/src/IModelDb.ts#L2779 + // Code class constructor trims white spaces from code value. + // Custom implementation of queryElementIdByCode() was added to support querying elements with code values that have trailing whitespaces. + // It mimicks 4.x implementation: https://github.com/iTwin/itwinjs-core/blob/9c8b394ec3878a39764be81f928fd8b0b9115d31/core/backend/src/IModelDb.ts#L1882 + private async queryElementIdByCode( + iModel: IModelDb, + code: Required + ): Promise { + if (Id64.isInvalid(code.spec)) throw new Error("Invalid CodeSpec"); + + if (code.value === undefined) throw new Error("Invalid Code"); + + const query = + "SELECT ECInstanceId FROM BisCore:Element WHERE CodeSpec.Id=? AND CodeScope.Id=? AND CodeValue=?"; + const queryBinder = new QueryBinder() + .bindId(1, code.spec) + .bindId(2, Id64.fromString(code.scope)) + .bindString(3, code.value); + const queryReader = iModel.createQueryReader(query, queryBinder, { + usePrimaryConn: true, + }); + return (await queryReader.step()) ? queryReader.current[0] : undefined; + } + /** Override of [IModelExportHandler.onDeleteElement]($transformer) that is called when [IModelExporter]($transformer) detects that an Element has been deleted from the source iModel. * This override propagates the delete to the target iModel via [IModelImporter.deleteElement]($transformer). */ - public override onDeleteElement(sourceElementId: Id64String): void { + public override async onDeleteElement( + sourceElementId: Id64String + ): Promise { const targetElementId: Id64String = this.context.findTargetElementId(sourceElementId); if (Id64.isValidId64(targetElementId)) { - this.importer.deleteElement(targetElementId); + await this.importer.deleteElement(targetElementId); } } /** Override of [IModelExportHandler.onExportModel]($transformer) that is called when a Model should be exported from the source iModel. * This override calls [[onTransformModel]] and then [IModelImporter.importModel]($transformer) to update the target iModel. */ - public override onExportModel(sourceModel: Model): void { + public override async onExportModel(sourceModel: Model): Promise { if ( this._options.skipPropagateChangesToRootElements && IModel.repositoryModelId === sourceModel.id @@ -2191,11 +2217,13 @@ export class IModelTransformer extends IModelExportHandler { sourceModel, targetModeledElementId ); - this.importer.importModel(targetModelProps); + await this.importer.importModel(targetModelProps); } /** Override of [IModelExportHandler.onDeleteModel]($transformer) that is called when [IModelExporter]($transformer) detects that a [Model]($backend) has been deleted from the source iModel. */ - public override onDeleteModel(sourceModelId: Id64String): void { + public override async onDeleteModel( + sourceModelId: Id64String + ): Promise { // It is possible and apparently occasionally sensical to delete a model without deleting its underlying element. // - If only the model is deleted, [[initFromExternalSourceAspects]] will have already remapped the underlying element since it still exists. // - If both were deleted, [[remapDeletedSourceEntities]] will find and remap the deleted element making this operation valid @@ -2204,9 +2232,7 @@ export class IModelTransformer extends IModelExportHandler { if (!Id64.isValidId64(targetModelId)) return; - let sql: string; - if (this.hasDefinitionContainerDeletionFeature) { - sql = ` + const sql = ` SELECT 1 FROM bis.DefinitionPartition WHERE ECInstanceId=:targetModelId @@ -2215,31 +2241,14 @@ export class IModelTransformer extends IModelExportHandler { FROM bis.DefinitionContainer WHERE ECInstanceId=:targetModelId `; - } else { - sql = ` - SELECT 1 - FROM bis.DefinitionPartition - WHERE ECInstanceId=:targetModelId - `; - } if (this.exporter.sourceDbChanges?.element.deleteIds.has(sourceModelId)) { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const isDefinitionPartition = this.targetDb.withPreparedStatement( - sql, - (stmt) => { - stmt.bindId("targetModelId", targetModelId); - const val: DbResult = stmt.step(); - switch (val) { - case DbResult.BE_SQLITE_ROW: - return true; - case DbResult.BE_SQLITE_DONE: - return false; - default: - assert(false, `unexpected db result: '${JSON.stringify(stmt)}'`); - } - } - ); + const params = new QueryBinder().bindId("targetModelId", targetModelId); + const reader = this.targetDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + const isDefinitionPartition = await reader.step(); + if (isDefinitionPartition) { // Skipping model deletion because model's partition will also be deleted. // It expects that model will be present and will fail if it's missing. @@ -2249,7 +2258,7 @@ export class IModelTransformer extends IModelExportHandler { } try { - this.importer.deleteModel(targetModelId); + await this.importer.deleteModel(targetModelId); } catch (error) { const isDeletionProhibitedErr = error instanceof IModelError && @@ -2309,47 +2318,38 @@ export class IModelTransformer extends IModelExportHandler { await this.initialize(); // import DefinitionModels first const childDefinitionPartitionSql = `SELECT ECInstanceId FROM ${DefinitionPartition.classFullName} WHERE Parent.Id=:subjectId`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( + const params = new QueryBinder().bindId("subjectId", sourceSubjectId); + for await (const row of this.sourceDb.createQueryReader( childDefinitionPartitionSql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement) => { - statement.bindId("subjectId", sourceSubjectId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - await this.processModel(statement.getValue(0).getId()); - } - } - ); + params, + { usePrimaryConn: true } + )) { + await this.processModel(row.id); + } + // import other partitions next const childPartitionSql = `SELECT ECInstanceId FROM ${InformationPartitionElement.classFullName} WHERE Parent.Id=:subjectId`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( + for await (const row of this.sourceDb.createQueryReader( childPartitionSql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement) => { - statement.bindId("subjectId", sourceSubjectId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const modelId: Id64String = statement.getValue(0).getId(); - const model: Model = this.sourceDb.models.getModel(modelId); - if (!(model instanceof DefinitionModel)) { - await this.processModel(modelId); - } - } + params, + { usePrimaryConn: true } + )) { + const modelId: Id64String = row.id; + const model: Model = this.sourceDb.models.getModel(modelId); + if (!(model instanceof DefinitionModel)) { + await this.processModel(modelId); } - ); + } + // recurse into child Subjects const childSubjectSql = `SELECT ECInstanceId FROM ${Subject.classFullName} WHERE Parent.Id=:subjectId`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.sourceDb.withPreparedStatement( + for await (const row of this.sourceDb.createQueryReader( childSubjectSql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement) => { - statement.bindId("subjectId", sourceSubjectId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - await this.processSubjectSubModels(statement.getValue(0).getId()); - } - } - ); + params, + { usePrimaryConn: true } + )) { + await this.processSubjectSubModels(row.id); + } } /** Transform the specified sourceModel into ModelProps for the target iModel. @@ -2369,8 +2369,14 @@ export class IModelTransformer extends IModelExportHandler { id: targetModeledElementId, }; targetModelProps.id = targetModeledElementId; + if (targetModelProps.parentModel === undefined) { + throw new IModelError( + IModelStatus.BadElement, + "targetElementProps must have a defined parentModel" + ); + } targetModelProps.parentModel = this.context.findTargetElementId( - targetModelProps.parentModel! + targetModelProps.parentModel ); return targetModelProps; } @@ -2393,7 +2399,7 @@ export class IModelTransformer extends IModelExportHandler { * Note that typically, the reverseSyncVersion is saved as the last changeset merged from the branch into master. * Setting initializeReverseSyncVersion to true during a forward transformation could overwrite this correct reverseSyncVersion and should only be done during the first transformation between a master and branch iModel. */ - public updateSynchronizationVersion({ + public async updateSynchronizationVersion({ initializeReverseSyncVersion = false, } = {}) { const shouldSkipSyncVersionUpdate = @@ -2406,7 +2412,7 @@ export class IModelTransformer extends IModelExportHandler { const sourceVersion = `${this.sourceDb.changeset.id};${this.sourceDb.changeset.index}`; const targetVersion = `${this.targetDb.changeset.id};${this.targetDb.changeset.index}`; - if (this.isReverseSynchronization) { + if (await this.getIsReverseSynchronization()) { const oldVersion = this._targetScopeProvenanceProps.jsonProperties.reverseSyncVersion; @@ -2444,6 +2450,8 @@ export class IModelTransformer extends IModelExportHandler { "updateSynchronizationVersion was called without change history" ); + // Store in a local variable, so typescript knows it's defined (due to the assert above) + const startingChangesetIndices = this._startingChangesetIndices; const jsonProps = this._targetScopeProvenanceProps.jsonProperties; Logger.logTrace( @@ -2464,7 +2472,7 @@ export class IModelTransformer extends IModelExportHandler { let syncChangesetsToClearKey; let syncChangesetsToUpdateKey; - if (this.isReverseSynchronization) { + if (await this.getIsReverseSynchronization()) { syncChangesetsToClearKey = pendingReverseSyncChangesetIndicesKey; syncChangesetsToUpdateKey = pendingSyncChangesetIndicesKey; } else { @@ -2477,7 +2485,7 @@ export class IModelTransformer extends IModelExportHandler { // just marked this changeset as a synchronization to ignore, and the user can add other // stuff to it which would break future synchronizations for ( - let i = this._startingChangesetIndices.target + 1; + let i = startingChangesetIndices.target + 1; i <= this.targetDb.changeset.index + 1; i++ ) @@ -2486,17 +2494,17 @@ export class IModelTransformer extends IModelExportHandler { jsonProps[syncChangesetsToClearKey] = jsonProps[ syncChangesetsToClearKey ].filter((csIndex) => { - return csIndex > this._startingChangesetIndices!.source; + return csIndex > startingChangesetIndices.source; }); // if reverse sync then we may have received provenance changes which should be marked as sync changes - if (this.isReverseSynchronization) { + if (await this.getIsReverseSynchronization()) { nodeAssert( this.sourceDb.changeset.index !== undefined, "changeset didn't exist" ); for ( - let i = this._startingChangesetIndices.source + 1; + let i = startingChangesetIndices.source + 1; i <= this.sourceDb.changeset.index + 1; i++ ) @@ -2512,8 +2520,15 @@ export class IModelTransformer extends IModelExportHandler { `new pendingSyncChanges: ${jsonProps.pendingSyncChangesetIndices}` ); } + if (this._options.acquireElementLocks) { + await ( + await this.getProvenanceDb() + ).locks.acquireLocks({ + exclusive: this._targetScopeProvenanceProps.element.id, + }); + } - this.provenanceDb.elements.updateAspect({ + (await this.getProvenanceDb()).elements.updateAspect({ ...this._targetScopeProvenanceProps, jsonProperties: JSON.stringify( this._targetScopeProvenanceProps.jsonProperties @@ -2523,9 +2538,9 @@ export class IModelTransformer extends IModelExportHandler { } // FIXME: is this necessary when manually using low level transform APIs? (document if so) - private finalizeTransformation() { + private async finalizeTransformation() { this.importer.finalize(); - this.updateSynchronizationVersion({ + await this.updateSynchronizationVersion({ initializeReverseSyncVersion: this._isProvenanceInitTransform, }); @@ -2558,30 +2573,32 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.shouldExportRelationship]($transformer) that is called to determine if a [Relationship]($backend) should be exported. * @note Reaching this point means that the relationship has passed the standard exclusion checks in [IModelExporter]($transformer). */ - public override shouldExportRelationship( + public override async shouldExportRelationship( _sourceRelationship: Relationship - ): boolean { + ): Promise { return true; } /** Override of [IModelExportHandler.onExportRelationship]($transformer) that imports a relationship into the target iModel when it is exported from the source iModel. * This override calls [[onTransformRelationship]] and then [IModelImporter.importRelationship]($transformer) to update the target iModel. */ - public override onExportRelationship(sourceRelationship: Relationship): void { - const sourceFedGuid = queryElemFedGuid( - this.sourceDb, + public override async onExportRelationship( + sourceRelationship: Relationship + ): Promise { + const sourceFedGuid = this.sourceDb.elements.getFederationGuidFromId( sourceRelationship.sourceId ); - const targetFedGuid = queryElemFedGuid( - this.sourceDb, + const targetFedGuid = this.sourceDb.elements.getFederationGuidFromId( sourceRelationship.targetId ); + const targetRelationshipProps = this.onTransformRelationship(sourceRelationship); - const targetRelationshipInstanceId = this.importer.importRelationship( + const targetRelationshipInstanceId = await this.importer.importRelationship( targetRelationshipProps ); + const provenanceDb = await this.getProvenanceDb(); if ( !this._options.noProvenance && Id64.isValid(targetRelationshipInstanceId) @@ -2592,17 +2609,23 @@ export class IModelTransformer extends IModelExportHandler { ? sourceFedGuid && targetFedGuid && `${sourceFedGuid}/${targetFedGuid}` : undefined; if (!provenance) { - const aspectProps = this.initRelationshipProvenance( + const aspectProps = await this.initRelationshipProvenance( sourceRelationship, targetRelationshipInstanceId ); - const foundEsaProps = IModelTransformer.queryScopeExternalSourceAspect( - this.provenanceDb, - aspectProps - ); + const foundEsaProps = + await IModelTransformer.queryScopeExternalSourceAspect( + provenanceDb, + aspectProps + ); // onExportRelationship doesn't need to call updateAspect if esaProps were found, because relationship provenance doesn't have the same concept of a version as element provenance (which uses last mod time on the elements). if (undefined === foundEsaProps) { - aspectProps.id = this.provenanceDb.elements.insertAspect(aspectProps); + if (this._options.acquireElementLocks) { + await provenanceDb.locks.acquireLocks({ + exclusive: aspectProps.element.id, + }); + } + aspectProps.id = provenanceDb.elements.insertAspect(aspectProps); } provenance = aspectProps as MarkRequired< ExternalSourceAspectProps, @@ -2616,7 +2639,9 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.onDeleteRelationship]($transformer) that is called when [IModelExporter]($transformer) detects that a [Relationship]($backend) has been deleted from the source iModel. * This override propagates the delete to the target iModel via [IModelImporter.deleteRelationship]($transformer). */ - public override onDeleteRelationship(sourceRelInstanceId: Id64String): void { + public override async onDeleteRelationship( + sourceRelInstanceId: Id64String + ): Promise { nodeAssert( this._deletedSourceRelationshipData, "should be defined at initialization by now" @@ -2640,7 +2665,7 @@ export class IModelTransformer extends IModelExportHandler { targetId: deletedRelData.targetIdInTarget, } as SourceAndTarget)?.id; if (id) { - this.importer.deleteRelationship({ + await this.importer.deleteRelationship({ id, classFullName: deletedRelData.classFullName, }); @@ -2648,7 +2673,7 @@ export class IModelTransformer extends IModelExportHandler { if (deletedRelData.provenanceAspectId) { try { - this.provenanceDb.elements.deleteAspect( + (await this.getProvenanceDb()).elements.deleteAspect( deletedRelData.provenanceAspectId ); } catch (error: any) { @@ -2661,65 +2686,6 @@ export class IModelTransformer extends IModelExportHandler { private _yieldManager = new YieldManager(); - /** Detect Relationship deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against relationships in the source iModel. - * @deprecated in 1.x. Don't use this anymore - * @see [[process]] with [[IModelTransformOptions.argsForProcessChanges]] provided. - * @note This method is called from [[process]] when [[IModelTransformOptions.argsForProcessChanges]] are undefined, so it only needs to be called directly when processing a subset of an iModel. - * @throws [[IModelError]] If the required provenance information is not available to detect deletes. - */ - public async detectRelationshipDeletes(): Promise { - if (this.isReverseSynchronization) { - throw new IModelError( - IModelStatus.BadRequest, - "Cannot detect deletes when isReverseSynchronization=true" - ); - } - const aspectDeleteIds: Id64String[] = []; - const sql = ` - SELECT ECInstanceId, Identifier, JsonProperties - FROM ${ExternalSourceAspect.classFullName} aspect - WHERE aspect.Scope.Id=:scopeId - AND aspect.Kind=:kind - `; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - await this.targetDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - async (statement: ECSqlStatement) => { - statement.bindId("scopeId", this.targetScopeElementId); - statement.bindString("kind", ExternalSourceAspect.Kind.Relationship); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const sourceRelInstanceId: Id64String = Id64.fromJSON( - statement.getValue(1).getString() - ); - if ( - undefined === - this.sourceDb.relationships.tryGetInstanceProps( - ElementRefersToElements.classFullName, - sourceRelInstanceId - ) - ) { - // this function exists only to support some in-imodel transformations, which must - // use the old (external source aspect) provenance method anyway so we don't need to support - // new provenance - const json: any = JSON.parse(statement.getValue(2).getString()); - const targetRelInstanceId = - json.targetRelInstanceId ?? json.provenanceRelInstanceId; - if (targetRelInstanceId) { - this.importer.deleteRelationship({ - id: targetRelInstanceId, - classFullName: ElementRefersToElements.classFullName, - }); - } - aspectDeleteIds.push(statement.getValue(0).getId()); - } - await this._yieldManager.allowYield(); - } - } - ); - this.targetDb.elements.deleteAspect(aspectDeleteIds); - } - /** Transform the specified sourceRelationship into RelationshipProps for the target iModel. * @param sourceRelationship The Relationship from the source iModel to be transformed. * @returns RelationshipProps for the target iModel. @@ -2737,23 +2703,20 @@ export class IModelTransformer extends IModelExportHandler { sourceRelationship.targetId ); // TODO: move to cloneRelationship in IModelCloneContext - sourceRelationship.forEachProperty( - (propertyName: string, propertyMetaData: PropertyMetaData) => { - if ( - PrimitiveTypeCode.Long === propertyMetaData.primitiveType && - "Id" === propertyMetaData.extendedType - ) { - (targetRelationshipProps as any)[propertyName] = - this.context.findTargetElementId( - sourceRelationship.asAny[propertyName] - ); - } + sourceRelationship.forEach((propertyName: string, property: Property) => { + if (property.isPrimitive() && "Id" === property.extendedTypeName) { + (targetRelationshipProps as any)[ECJsNames.toJsName(propertyName)] = + this.context.findTargetElementId( + sourceRelationship.asAny[ECJsNames.toJsName(propertyName)] + ); } - ); + }); return targetRelationshipProps; } - public override shouldExportElementAspect(aspect: ElementAspect) { + public override async shouldExportElementAspect( + aspect: ElementAspect + ): Promise { // This override is needed to ensure that aspects are not exported if their element is not exported. // This is needed in case DetachedExportElementAspectsStrategy is used. return this.context.findTargetElementId(aspect.element.id) !== Id64.invalid; @@ -2762,14 +2725,15 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.onExportElementUniqueAspect]($transformer) that imports an ElementUniqueAspect into the target iModel when it is exported from the source iModel. * This override calls [[onTransformElementAspect]] and then [IModelImporter.importElementUniqueAspect]($transformer) to update the target iModel. */ - public override onExportElementUniqueAspect( + public override async onExportElementUniqueAspect( sourceAspect: ElementUniqueAspect - ): void { - const targetAspectProps = this.onTransformElementAspect(sourceAspect); - if (!this.doAllReferencesExistInTarget(sourceAspect)) { + ): Promise { + const targetAspectProps = await this.onTransformElementAspect(sourceAspect); + if (!(await this.doAllReferencesExistInTarget(sourceAspect))) { this._partiallyCommittedAspectIds.add(sourceAspect.id); } - const targetId = this.importer.importElementUniqueAspect(targetAspectProps); + const targetId = + await this.importer.importElementUniqueAspect(targetAspectProps); this.context.remapElementAspect(sourceAspect.id, targetId); } @@ -2777,21 +2741,21 @@ export class IModelTransformer extends IModelExportHandler { * This override calls [[onTransformElementAspect]] for each ElementMultiAspect and then [IModelImporter.importElementMultiAspects]($transformer) to update the target iModel. * @note ElementMultiAspects are handled as a group to make it easier to differentiate between insert, update, and delete. */ - public override onExportElementMultiAspects( + public override async onExportElementMultiAspects( sourceAspects: ElementMultiAspect[] - ): void { + ): Promise { // Transform source ElementMultiAspects into target ElementAspectProps - const targetAspectPropsArray = sourceAspects.map((srcA) => + const targetAspectPropsArray = sourceAspects.map(async (srcA) => this.onTransformElementAspect(srcA) ); - sourceAspects.forEach((a) => { - if (!this.doAllReferencesExistInTarget(a)) { + for (const a of sourceAspects) { + if (!(await this.doAllReferencesExistInTarget(a))) { this._partiallyCommittedAspectIds.add(a.id); } - }); + } // const targetAspectsToImport = targetAspectPropsArray.filter((targetAspect, i) => hasEntityChanged(sourceAspects[i], targetAspect)); - const targetIds = this.importer.importElementMultiAspects( - targetAspectPropsArray, + const targetIds = await this.importer.importElementMultiAspects( + await Promise.all(targetAspectPropsArray), (a) => { const isExternalSourceAspectFromTransformer = a instanceof ExternalSourceAspect && @@ -2812,11 +2776,11 @@ export class IModelTransformer extends IModelExportHandler { * @returns ElementAspectProps for the target iModel. * @note A subclass can override this method to provide custom transform behavior. */ - protected onTransformElementAspect( + protected async onTransformElementAspect( sourceElementAspect: ElementAspect - ): ElementAspectProps { + ): Promise { const targetElementAspectProps = - this.context.cloneElementAspect(sourceElementAspect); + await this.context.cloneElementAspect(sourceElementAspect); return targetElementAspectProps; } @@ -2829,9 +2793,9 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.shouldExportSchema]($transformer) that is called to determine if a schema should be exported * @note the default behavior doesn't import schemas older than those already in the target */ - public override shouldExportSchema( + public override async shouldExportSchema( schemaKey: ECSchemaMetaData.SchemaKey - ): boolean { + ): Promise { const versionInTarget = this.targetDb.querySchemaVersion(schemaKey.name); if (versionInTarget === undefined) return true; return Semver.gt( @@ -2878,12 +2842,11 @@ export class IModelTransformer extends IModelExportHandler { ); this._longNamedSchemasMap.set(schema.name, schemaFileName); } - /* eslint-disable-next-line deprecation/deprecation */ - this.sourceDb.nativeDb.exportSchema( - schema.name, - this._schemaExportDir, - schemaFileName - ); + this.sourceDb.exportSchema({ + schemaName: schema.name, + outputDirectory: this._schemaExportDir, + outputFileName: schemaFileName, + }); return { schemaPath: path.join(this._schemaExportDir, schemaFileName) }; } @@ -2935,10 +2898,10 @@ export class IModelTransformer extends IModelExportHandler { } /** Override of [IModelExportHandler.onExportFont]($transformer) that imports a font into the target iModel when it is exported from the source iModel. */ - public override onExportFont( + public override async onExportFont( font: FontProps, _isUpdate: boolean | undefined - ): void { + ): Promise { this.context.importFont(font.id); } @@ -2961,12 +2924,16 @@ export class IModelTransformer extends IModelExportHandler { /** Override of [IModelExportHandler.shouldExportCodeSpec]($transformer) that is called to determine if a CodeSpec should be exported from the source iModel. * @note Reaching this point means that the CodeSpec has passed the standard exclusion checks in [IModelExporter]($transformer). */ - public override shouldExportCodeSpec(_sourceCodeSpec: CodeSpec): boolean { + public override async shouldExportCodeSpec( + _sourceCodeSpec: CodeSpec + ): Promise { return true; } /** Override of [IModelExportHandler.onExportCodeSpec]($transformer) that imports a CodeSpec into the target iModel when it is exported from the source iModel. */ - public override onExportCodeSpec(sourceCodeSpec: CodeSpec): void { + public override async onExportCodeSpec( + sourceCodeSpec: CodeSpec + ): Promise { this.context.importCodeSpec(sourceCodeSpec.id); } @@ -2981,8 +2948,8 @@ export class IModelTransformer extends IModelExportHandler { this.context.remapElement(sourceSubjectId, targetSubjectId); await this.processChildElements(sourceSubjectId); await this.processSubjectSubModels(sourceSubjectId); - this.completePartiallyCommittedElements(); - this.completePartiallyCommittedAspects(); + await this.completePartiallyCommittedElements(); + await this.completePartiallyCommittedAspects(); } /** state to prevent reinitialization, @see [[initialize]] */ @@ -3000,14 +2967,14 @@ export class IModelTransformer extends IModelExportHandler { public async initialize(): Promise { if (this._initialized) return; - this.initScopeProvenance(); + await this.initScopeProvenance(); await this._tryInitChangesetData(this._options.argsForProcessChanges); await this.context.initialize(); // need exporter initialized to do remapdeletedsourceentities. await this.exporter.initialize( - this.getExportInitOpts(this._options.argsForProcessChanges ?? {}) + await this.getExportInitOpts(this._options.argsForProcessChanges ?? {}) ); // Exporter must be initialized prior to processing changesets in order to properly handle entity recreations (an entity delete followed by an insert of that same entity). @@ -3023,7 +2990,7 @@ export class IModelTransformer extends IModelExportHandler { * @returns void */ private async processChangesets(): Promise { - this.forEachTrackedElement( + await this.forEachTrackedElement( (sourceElementId: Id64String, targetElementId: Id64String) => { this.context.remapElement(sourceElementId, targetElementId); } @@ -3044,13 +3011,17 @@ export class IModelTransformer extends IModelExportHandler { const relationshipECClassIdsToSkip = new Set(); for await (const row of this.sourceDb.createQueryReader( - "SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (BisCore.ElementDrivesElement)" + "SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (BisCore.ElementDrivesElement)", + undefined, + { usePrimaryConn: true } )) { relationshipECClassIdsToSkip.add(row.ECInstanceId); } const relationshipECClassIds = new Set(); for await (const row of this.sourceDb.createQueryReader( - "SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (BisCore.ElementRefersToElements)" + "SELECT ECInstanceId FROM ECDbMeta.ECClassDef where ECInstanceId IS (BisCore.ElementRefersToElements)", + undefined, + { usePrimaryConn: true } )) { relationshipECClassIds.add(row.ECInstanceId); } @@ -3086,7 +3057,7 @@ export class IModelTransformer extends IModelExportHandler { disableSchemaCheck: true, }); const csAdaptor = new ChangesetECAdaptor(csReader); - const ecChangeUnifier = new PartialECChangeUnifier(); + const ecChangeUnifier = new PartialECChangeUnifier(this.sourceDb); while (csAdaptor.step()) { ecChangeUnifier.appendFrom(csAdaptor); } @@ -3173,7 +3144,8 @@ export class IModelTransformer extends IModelExportHandler { // we need a connected iModel with changes to remap elements with deletions const notConnectedModel = this.sourceDb.iTwinId === undefined; const noChanges = - this.synchronizationVersion.index === this.sourceDb.changeset.index && + (await this.getSynchronizationVersion()).index === + this.sourceDb.changeset.index && (this.exporter.sourceDbChanges === undefined || !this.exporter.sourceDbChanges.hasChanges); if (notConnectedModel || noChanges) return; @@ -3182,7 +3154,8 @@ export class IModelTransformer extends IModelExportHandler { * if our ChangedECInstance is in the provenanceDb, then we can use the ids we find in the ChangedECInstance to query for ESAs. * This is because the ESAs are stored on an element Id thats present in the provenanceDb. */ - const changeDataInProvenanceDb = this.sourceDb === this.provenanceDb; + const changeDataInProvenanceDb = + this.sourceDb === (await this.getProvenanceDb()); const getTargetIdFromSourceId = async (id: Id64String) => { let identifierValue: string | undefined; @@ -3201,7 +3174,8 @@ export class IModelTransformer extends IModelExportHandler { this.targetScopeElementId, ExternalSourceAspect.Kind.Element, id, - ]) + ]), + { usePrimaryConn: true } )) { identifierValue = row.Identifier; } @@ -3217,7 +3191,8 @@ export class IModelTransformer extends IModelExportHandler { // Check for targetId using sourceId's fedguid if we didn't find an esa. if (fedGuid) { - const targetId = this._queryElemIdByFedGuid(this.targetDb, fedGuid); + const targetId = + this.targetDb.elements.getIdFromFederationGuid(fedGuid); return targetId; } return undefined; @@ -3236,13 +3211,13 @@ export class IModelTransformer extends IModelExportHandler { targetIdOfRelationshipInSource ); if (sourceIdOfRelationshipInTarget && targetIdOfRelationshipInTarget) { - this._deletedSourceRelationshipData!.set(changedInstanceId, { + this._deletedSourceRelationshipData?.set(changedInstanceId, { classFullName: classFullName ?? "", sourceIdInTarget: sourceIdOfRelationshipInTarget, targetIdInTarget: targetIdOfRelationshipInTarget, }); - } else if (this.sourceDb === this.provenanceSourceDb) { - const relProvenance = this._queryProvenanceForRelationship( + } else if (this.sourceDb === (await this.getProvenanceSourceDb())) { + const relProvenance = await this._queryProvenanceForRelationship( changedInstanceId, { classFullName: classFullName ?? "", @@ -3251,7 +3226,7 @@ export class IModelTransformer extends IModelExportHandler { } ); if (relProvenance && relProvenance.relationshipId) - this._deletedSourceRelationshipData!.set(changedInstanceId, { + this._deletedSourceRelationshipData?.set(changedInstanceId, { classFullName: classFullName ?? "", relId: relProvenance.relationshipId, provenanceAspectId: relProvenance.aspectId, @@ -3259,22 +3234,33 @@ export class IModelTransformer extends IModelExportHandler { } } else { let targetId = await getTargetIdFromSourceId(changedInstanceId); - if (targetId === undefined && this.sourceDb === this.provenanceSourceDb) { - targetId = this._queryProvenanceForElement(changedInstanceId); + if ( + targetId === undefined && + this.sourceDb === (await this.getProvenanceSourceDb()) + ) { + targetId = await this._queryProvenanceForElement(changedInstanceId); } // since we are processing one changeset at a time, we can see local source deletes // of entities that were never synced and can be safely ignored const deletionNotInTarget = !targetId; if (deletionNotInTarget) return; - this.context.remapElement(changedInstanceId, targetId!); + + if (targetId === undefined) { + throw new IModelError( + IModelStatus.BadElement, + "targetId should be acquired from source id or element provenance" + ); + } + + this.context.remapElement(changedInstanceId, targetId); // If an entity insert and an entity delete both point to the same entity in target iModel, that means that entity was recreated. // In such case an entity update will be triggered and we no longer need to delete the entity. - if (alreadyImportedElementInserts.has(targetId!)) { + if (alreadyImportedElementInserts.has(targetId)) { this.exporter.sourceDbChanges?.element.deleteIds.delete( changedInstanceId ); } - if (alreadyImportedModelInserts.has(targetId!)) { + if (alreadyImportedModelInserts.has(targetId)) { this.exporter.sourceDbChanges?.model.deleteIds.delete( changedInstanceId ); @@ -3292,8 +3278,8 @@ export class IModelTransformer extends IModelExportHandler { return; } - const noChanges = - this.synchronizationVersion.index === this.sourceDb.changeset.index; + const syncVersion = await this.getSynchronizationVersion(); + const noChanges = syncVersion.index === this.sourceDb.changeset.index; if (noChanges) { this._sourceChangeDataState = "no-changes"; this._csFileProps = []; @@ -3305,41 +3291,35 @@ export class IModelTransformer extends IModelExportHandler { // NOTE: that we do NOT download the changesummary for the last transformed version, we want // to ignore those already processed changes const startChangesetIndexOrId = - startChangeset?.index ?? - startChangeset?.id ?? - this.synchronizationVersion.index + 1; + startChangeset?.index ?? startChangeset?.id ?? syncVersion.index + 1; const endChangesetId = this.sourceDb.changeset.id; const [startChangesetIndex, endChangesetIndex] = await Promise.all( [startChangesetIndexOrId, endChangesetId].map(async (indexOrId) => typeof indexOrId === "number" ? indexOrId - : IModelHost.hubAccess - .queryChangeset({ - iModelId: this.sourceDb.iModelId, - // eslint-disable-next-line deprecation/deprecation - changeset: { id: indexOrId }, - }) - .then((changeset) => changeset.index) + : BriefcaseManager.queryChangeset({ + iModelId: this.sourceDb.iModelId, + changeset: { id: indexOrId }, + }).then((changeset) => changeset.index) ) ); - const missingChangesets = - startChangesetIndex > this.synchronizationVersion.index + 1; + const missingChangesets = startChangesetIndex > syncVersion.index + 1; if ( !this._options.argsForProcessChanges ?.ignoreMissingChangesetsInSynchronizations && - startChangesetIndex !== this.synchronizationVersion.index + 1 && - this.synchronizationVersion.index !== -1 + startChangesetIndex !== syncVersion.index + 1 && + syncVersion.index !== -1 ) { throw Error( `synchronization is ${missingChangesets ? "missing changesets" : ""},` + " startChangesetId should be" + " exactly the first changeset *after* the previous synchronization to not miss data." + ` You specified '${startChangesetIndexOrId}' which is changeset #${startChangesetIndex}` + - ` but the previous synchronization for this targetScopeElement was '${this.synchronizationVersion.id}'` + - ` which is changeset #${this.synchronizationVersion.index}. The transformer expected` + - ` #${this.synchronizationVersion.index + 1}.` + ` but the previous synchronization for this targetScopeElem ${syncVersion.id}'` + + ` which is changeset #${syncVersion.index}. The transformer expected` + + ` #${syncVersion.index + 1}.` ); } @@ -3348,7 +3328,7 @@ export class IModelTransformer extends IModelExportHandler { "_targetScopeProvenanceProps should be set by now" ); - const changesetsToSkip = this.isReverseSynchronization + const changesetsToSkip = (await this.getIsReverseSynchronization()) ? this._targetScopeProvenanceProps.jsonProperties .pendingReverseSyncChangesetIndices : this._targetScopeProvenanceProps.jsonProperties @@ -3365,7 +3345,7 @@ export class IModelTransformer extends IModelExportHandler { const csFileProps: ChangesetFileProps[] = []; for (const [first, end] of this._changesetRanges) { // TODO: should the first changeset in a reverse sync really be included even though its 'initialized branch provenance'? The answer is no, its a bug that needs to be fixed. - const fileProps = await IModelHost.hubAccess.downloadChangesets({ + const fileProps = await BriefcaseManager.downloadChangesets({ iModelId: this.sourceDb.iModelId, targetDir: BriefcaseManager.getChangeSetsPath(this.sourceDb.iModelId), range: { first, end }, @@ -3407,9 +3387,29 @@ export class IModelTransformer extends IModelExportHandler { this.logSettings(); - return this._options.argsForProcessChanges !== undefined - ? this.processChanges(this._options.argsForProcessChanges) - : this.processAll(); + try { + return this._options.argsForProcessChanges !== undefined + ? await this.processChanges(this._options.argsForProcessChanges) + : await this.processAll(); + } catch (error) { + // If acquireElementLocks is enabled, clean up locks on failure. + // Constructor validates that targetDb is a BriefcaseDb when this option is set. + if (this._options.acquireElementLocks) { + try { + const briefcaseDb = this.targetDb as BriefcaseDb; + if (briefcaseDb.txns.hasUnsavedChanges) { + briefcaseDb.abandonChanges(); + await briefcaseDb.locks.abandonLocksForCurrentUnsavedTxn(); + } + } catch (cleanupError) { + Logger.logWarning( + loggerCategory, + `Failed to cleanup locks after transformation error: ${String(cleanupError)}` + ); + } + } + throw error; + } } /** Export everything from the source iModel and import the transformed entities into the target iModel. @@ -3431,27 +3431,27 @@ export class IModelTransformer extends IModelExportHandler { } else { await this.exporter.exportModel(IModel.repositoryModelId); } - this.completePartiallyCommittedElements(); + await this.completePartiallyCommittedElements(); await this.exporter["exportAllAspects"](); // eslint-disable-line @typescript-eslint/dot-notation - this.completePartiallyCommittedAspects(); + await this.completePartiallyCommittedAspects(); await this.exporter.exportRelationships( ElementRefersToElements.classFullName ); if ( this._options.forceExternalSourceAspectProvenance && - this.shouldDetectDeletes() + (await this.shouldDetectDeletes()) ) { - // eslint-disable-next-line deprecation/deprecation - await this.detectElementDeletes(); - // eslint-disable-next-line deprecation/deprecation - await this.detectRelationshipDeletes(); + Logger.logWarning( + loggerCategory, + "This workflows was deprecated in v1 and is no longer supported" + ); } if (this._options.optimizeGeometry) this.importer.optimizeGeometry(this._options.optimizeGeometry); this.importer.computeProjectExtents(); - this.finalizeTransformation(); + await this.finalizeTransformation(); } /** previous provenance, either a federation guid, a `${sourceFedGuid}/${targetFedGuid}` pair, or required aspect props */ @@ -3486,15 +3486,15 @@ export class IModelTransformer extends IModelExportHandler { */ private async processChanges(options: ProcessChangesOptions): Promise { // must wait for initialization of synchronization provenance data - await this.exporter.exportChanges(this.getExportInitOpts(options)); - this.completePartiallyCommittedElements(); - this.completePartiallyCommittedAspects(); + await this.exporter.exportChanges(await this.getExportInitOpts(options)); + await this.completePartiallyCommittedElements(); + await this.completePartiallyCommittedAspects(); if (this._options.optimizeGeometry) this.importer.optimizeGeometry(this._options.optimizeGeometry); this.importer.computeProjectExtents(); - this.finalizeTransformation(); + await this.finalizeTransformation(); const defaultSaveTargetChanges = () => { this.targetDb.saveChanges(); @@ -3506,7 +3506,9 @@ export class IModelTransformer extends IModelExportHandler { /** Changeset data must be initialized in order to build correct changeOptions. * Call [[IModelTransformer.initialize]] for initialization of synchronization provenance data */ - private getExportInitOpts(opts: ExportChangesOptions): ExporterInitOptions { + private async getExportInitOpts( + opts: ExportChangesOptions + ): Promise { if (!this._options.argsForProcessChanges) return {}; const startChangeset = "startChangeset" in opts ? opts.startChangeset : undefined; @@ -3521,7 +3523,7 @@ export class IModelTransformer extends IModelExportHandler { ? { startChangeset } : { startChangeset: { - index: this.synchronizationVersion.index + 1, + index: (await this.getSynchronizationVersion()).index + 1, }, }), }; @@ -3622,12 +3624,16 @@ export class TemplateModelCloner extends IModelTransformer { } /** Cloning from a template requires this override of onTransformElement. */ - public override onTransformElement(sourceElement: Element): ElementProps { + public override async onTransformElement( + sourceElement: Element + ): Promise { const referenceIds = sourceElement.getReferenceIds(); - referenceIds.forEach((referenceId) => { + for (const referenceId of referenceIds) { // TODO: consider going through all definition elements at once and remapping them to themselves if ( - !EntityReferences.isValid(this.context.findTargetEntityId(referenceId)) + !EntityReferences.isValid( + await this.context.findTargetEntityId(referenceId) + ) ) { if (this.context.isBetweenIModels) { throw new IModelError( @@ -3653,9 +3659,9 @@ export class TemplateModelCloner extends IModelTransformer { } } } - }); + } - const targetElementProps: ElementProps = super.onTransformElement( + const targetElementProps: ElementProps = await super.onTransformElement( sourceElement ); targetElementProps.federationGuid = Guid.createValue(); // clone from template should create a new federationGuid @@ -3672,25 +3678,7 @@ export class TemplateModelCloner extends IModelTransformer { (targetElementProps as GeometricElementProps).placement = placement; } } - this._sourceIdToTargetIdMap!.set(sourceElement.id, Id64.invalid); // keep track of (source) elementIds from the template model, but the target hasn't been inserted yet + this._sourceIdToTargetIdMap?.set(sourceElement.id, Id64.invalid); // keep track of (source) elementIds from the template model, but the target hasn't been inserted yet return targetElementProps; } } - -function queryElemFedGuid(db: IModelDb, elemId: Id64String) { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - ` - SELECT FederationGuid - FROM bis.Element - WHERE ECInstanceId=? - `, - (stmt) => { - stmt.bindId(1, elemId); - assert(stmt.step() === DbResult.BE_SQLITE_ROW); - const result = stmt.getValue(0).getGuid(); - assert(stmt.step() === DbResult.BE_SQLITE_DONE); - return result; - } - ); -} diff --git a/packages/transformer/src/TransformerLoggerCategory.ts b/packages/transformer/src/TransformerLoggerCategory.ts index 324f8b1e5..c3bff548b 100644 --- a/packages/transformer/src/TransformerLoggerCategory.ts +++ b/packages/transformer/src/TransformerLoggerCategory.ts @@ -7,7 +7,7 @@ */ /** Logger categories used by this package - * @note All logger categories in this package start with the `core-backend` prefix. + * @note All logger categories in this package start with the `imodel-transformer` prefix. * @see [Logger]($bentley) * @public */ @@ -15,20 +15,22 @@ export enum TransformerLoggerCategory { /** The logger category used by the [IModelExporter]($transformer) class. * @beta */ - IModelExporter = "core-backend.IModelExporter", + IModelExporter = "imodel-transformer.IModelExporter", /** The logger category used by the [IModelImporter]($transformer) class. * @beta */ - IModelImporter = "core-backend.IModelImporter", + IModelImporter = "imodel-transformer.IModelImporter", /** The logger category used by the [IModelTransformer]($transformer) class. * @beta */ - IModelTransformer = "core-backend.IModelTransformer", + IModelTransformer = "imodel-transformer.IModelTransformer", /** The logger category used by the [IModelCloneContext]($transformer) class. * @beta */ - IModelCloneContext = "core-backend.IModelCloneContext", + IModelCloneContext = "imodel-transformer.IModelCloneContext", + + ECReferenceTypesCache = "imodel-transformer.ECReferenceTypesCache", } diff --git a/packages/transformer/src/imodel-transformer.ts b/packages/transformer/src/imodel-transformer.ts index 7b451065e..582ae4f2e 100644 --- a/packages/transformer/src/imodel-transformer.ts +++ b/packages/transformer/src/imodel-transformer.ts @@ -16,7 +16,7 @@ const { version: ourVersion, name: ourName, peerDependencies, - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports } = require("../../package.json"); const ourITwinCoreBackendDepRange = peerDependencies["@itwin/core-backend"]; @@ -47,7 +47,7 @@ if ( if (process.env[suggestEnvVarName]) { // let's not import https except in this case - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports const https = require("https") as typeof import("https"); https.get(`https://registry.npmjs.org/${ourName}`, async (resp) => { const chunks: string[] = []; diff --git a/packages/transformer/src/test/IModelTransformerUtils.ts b/packages/transformer/src/test/IModelTransformerUtils.ts index ea4988586..f49ad9764 100644 --- a/packages/transformer/src/test/IModelTransformerUtils.ts +++ b/packages/transformer/src/test/IModelTransformerUtils.ts @@ -9,14 +9,13 @@ import * as fs from "fs"; import * as inspector from "inspector"; import { CompressedId64Set, - DbResult, Guid, Id64, Id64Set, Id64String, Mutable, } from "@itwin/core-bentley"; -import { Schema } from "@itwin/ecschema-metadata"; +import { Property, RelationshipClass, Schema } from "@itwin/ecschema-metadata"; import { Point3d, Transform, YawPitchRollAngles } from "@itwin/core-geometry"; import { AuxCoordSystem, @@ -26,7 +25,6 @@ import { DisplayStyle3d, DrawingCategory, DrawingGraphicRepresentsElement, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementAspect, @@ -37,7 +35,6 @@ import { FunctionalSchema, GeometricElement3d, GeometryPart, - HubMock, IModelDb, IModelJsFs, InformationPartitionElement, @@ -59,7 +56,9 @@ import { SubCategory, Subject, Texture, + ViewDefinition2d, } from "@itwin/core-backend"; +import { HubMock } from "@itwin/core-backend/lib/cjs/internal/HubMock"; import * as TestUtils from "./TestUtils"; import { Base64EncodedString, @@ -72,7 +71,6 @@ import { DisplayStyle3dSettingsProps, ElementAspectProps, ElementProps, - EntityMetaData, FontProps, GeometricElement3dProps, GeometryStreamIterator, @@ -81,6 +79,7 @@ import { ModelSelectorProps, PhysicalElementProps, Placement3d, + QueryBinder, QueryRowFormat, SkyBoxImageProps, SkyBoxImageType, @@ -512,28 +511,33 @@ const aliasedProperties: Record | undefined> = * get all properties, including those of bases and mixins from metadata, * and aliases some properties where the name differs in JS land from the ec property */ -function getAllElemMetaDataProperties(elem: Element) { +function getAllElemMetaDataProperties( + elem: Element +): Record | undefined { function getAllClassMetaDataProperties( className: string, - metadata: EntityMetaData - ) { - const allProperties = { ...metadata?.properties }; - for (const baseName of metadata?.baseClasses ?? []) { - const base = elem.iModel.getMetaData(baseName); - Object.assign( - allProperties, - getAllClassMetaDataProperties(baseName, base) + entity: Entity + ): Record { + const metaData = entity.getMetaDataSync(); + const allProperties = { ...metaData.getPropertiesSync() }; + entity.forEach((name, property) => { + const base = elem.iModel.schemaContext.getSchemaItemSync( + property.class.fullName ); - } + if (base !== undefined && base instanceof Entity) { + Object.assign(allProperties, getAllClassMetaDataProperties(name, base)); + } + }); Object.assign(allProperties, aliasedProperties[className.toLowerCase()]); return allProperties; } - const classMetaData = elem.getClassMetaData(); - if (!classMetaData) return undefined; + const classMetaData = elem.getMetaDataSync(); + if (!classMetaData || classMetaData instanceof RelationshipClass) + return undefined; - return getAllClassMetaDataProperties(elem.classFullName, classMetaData); + return getAllClassMetaDataProperties(elem.classFullName, elem); } /** @@ -598,19 +602,17 @@ export async function assertIdentityTransformation( remapper.findTargetCodeSpecId, remapper.findTargetAspectId, ]; - /* eslint-disable-next-line deprecation/deprecation */ - expect(sourceDb.nativeDb.hasUnsavedChanges()).to.be.false; - /* eslint-disable-next-line deprecation/deprecation */ - expect(targetDb.nativeDb.hasUnsavedChanges()).to.be.false; const sourceToTargetElemsMap = new Map(); const targetToSourceElemsMap = new Map(); const targetElemIds = new Set(); - // eslint-disable-next-line deprecation/deprecation - for await (const [sourceElemId] of sourceDb.query( - "SELECT ECInstanceId FROM bis.Element" + for await (const row of sourceDb.createQueryReader( + "SELECT ECInstanceId FROM bis.Element", + undefined, + { usePrimaryConn: true } )) { + const sourceElemId = row.id; const targetElemId = remapElem(sourceElemId); const sourceElem = sourceDb.elements.getElement({ id: sourceElemId, @@ -638,29 +640,29 @@ export async function assertIdentityTransformation( (ignoreFedGuidsOnAlwaysPresentElementIds && alwaysPresentElementIds.has(sourceElemId)))) || propName === "jsonProperties"); - if (prop.isNavigation) { + if (prop.isNavigation()) { expect(sourceElem.classFullName).to.equal(targetElem.classFullName); // some custom handled classes make it difficult to inspect the element props directly with the metadata prop name // so we query the prop instead of the checking for the property on the element const sql = `SELECT [${propName}].Id from [${sourceElem.schemaName}].[${sourceElem.className}] WHERE ECInstanceId=:id`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const relationTargetInSourceId = sourceDb.withPreparedStatement( - sql, - (stmt) => { - stmt.bindId("id", sourceElemId); - stmt.step(); - return stmt.getValue(0).getId() ?? Id64.invalid; - } - ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const relationTargetInTargetId = targetDb.withPreparedStatement( - sql, - (stmt) => { - stmt.bindId("id", targetElemId); - expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW); - return stmt.getValue(0).getId() ?? Id64.invalid; - } - ); + const sourceParams = new QueryBinder().bindId("id", sourceElemId); + const sourceReader = sourceDb.createQueryReader(sql, sourceParams, { + usePrimaryConn: true, + }); + + const relationTargetInSourceId = (await sourceReader.step()) + ? sourceReader.current.id + : Id64.invalid; + + const targetParams = new QueryBinder().bindId("id", targetElemId); + const targetReader = targetDb.createQueryReader(sql, targetParams, { + usePrimaryConn: true, + }); + + const relationTargetInTargetId = (await targetReader.step()) + ? targetReader.current.id + : Id64.invalid; + const mappedRelationTargetInTargetId = ( propName === "codeSpec" ? remapCodeSpec : remapElem )(relationTargetInSourceId); @@ -779,10 +781,12 @@ export async function assertIdentityTransformation( } } - // eslint-disable-next-line deprecation/deprecation - for await (const [targetElemId] of targetDb.query( - "SELECT ECInstanceId FROM bis.Element" + for await (const row of targetDb.createQueryReader( + "SELECT ECInstanceId FROM bis.Element", + undefined, + { usePrimaryConn: true } )) { + const targetElemId = row.id; if (!targetElemIds.has(targetElemId)) { const targetElem = targetDb.elements.getElement(targetElemId); targetToSourceElemsMap.set(targetElem, undefined); @@ -833,11 +837,12 @@ export async function assertIdentityTransformation( const sourceToTargetModelsMap = new Map(); const targetToSourceModelsMap = new Map(); const targetModelIds = new Set(); - - // eslint-disable-next-line deprecation/deprecation - for await (const [sourceModelId] of sourceDb.query( - "SELECT ECInstanceId FROM bis.Model" + for await (const row of sourceDb.createQueryReader( + "SELECT ECInstanceId FROM bis.Model", + undefined, + { usePrimaryConn: true } )) { + const sourceModelId = row.id; const targetModelId = remapElem(sourceModelId); const sourceModel = sourceDb.models.getModel(sourceModelId); const targetModel = targetDb.models.tryGetModel(targetModelId); @@ -857,10 +862,12 @@ export async function assertIdentityTransformation( } } - // eslint-disable-next-line deprecation/deprecation - for await (const [targetModelId] of targetDb.query( - "SELECT ECInstanceId FROM bis.Model" + for await (const row of targetDb.createQueryReader( + "SELECT ECInstanceId FROM bis.Model", + undefined, + { usePrimaryConn: true } )) { + const targetModelId = row.id; if (!targetModelIds.has(targetModelId)) { const targetModel = targetDb.models.getModel(targetModelId); targetToSourceModelsMap.set(targetModel, undefined); @@ -886,24 +893,35 @@ export async function assertIdentityTransformation( const makeRelationKey = (rel: any) => `${rel.SourceECInstanceId}\x00${rel.TargetECInstanceId}`; - const query: Parameters = [ - "SELECT * FROM bis.ElementRefersToElements", - undefined, - { rowFormat: QueryRowFormat.UseECSqlPropertyNames }, - ]; + const query = { + ecsql: "SELECT * FROM bis.ElementRefersToElements", + params: undefined, + config: { + rowFormat: QueryRowFormat.UseECSqlPropertyNames, + usePrimaryConn: true, + }, + }; + const sourceRelationships = new Map(); - // eslint-disable-next-line deprecation/deprecation - for await (const row of sourceDb.query(...query)) { - sourceRelationships.set(makeRelationKey(row), row); + for await (const row of sourceDb.createQueryReader( + query.ecsql, + query.params, + query.config + )) { + const rowAsObject = row.toRow(); + sourceRelationships.set(makeRelationKey(row), rowAsObject); } const targetRelationshipsToFind = new Map(); - // eslint-disable-next-line deprecation/deprecation - for await (const row of targetDb.query(...query)) { - targetRelationshipsToFind.set(makeRelationKey(row), row); + for await (const row of targetDb.createQueryReader( + query.ecsql, + query.params, + query.config + )) { + const rowAsObject = row.toRow(); + targetRelationshipsToFind.set(makeRelationKey(row), rowAsObject); } - /* eslint-disable @typescript-eslint/naming-convention */ for (const relInSource of sourceRelationships.values()) { const isOnlyInSource = onlyInSourceElements.has(relInSource.SourceECInstanceId) && @@ -919,15 +937,13 @@ export async function assertIdentityTransformation( TargetECInstanceId: relTargetInTarget, }); const relInTarget = targetRelationshipsToFind.get(relInTargetKey); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const relClassName = sourceDb.withPreparedStatement( - "SELECT Name FROM meta.ECClassDef WHERE ECInstanceId=?", - (s) => { - s.bindId(1, relInSource.ECClassId); - s.step(); - return s.getValue(0).getString(); - } - ); + const sql = "SELECT Name FROM meta.ECClassDef WHERE ECInstanceId=?"; + const params = new QueryBinder().bindId(1, relInSource.ECClassId); + const reader = sourceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + await reader.step(); + const relClassName = reader.current[0]; expect( relInTarget, `rel ${relClassName}:${relInSource.SourceECInstanceId}->${relInSource.TargetECInstanceId} was missing` @@ -940,6 +956,7 @@ export async function assertIdentityTransformation( ECInstanceId: _4, SourceECClassId: _5, TargetECClassId: _6, + MemberPriority: _7, ...rel }: any) => rel; expect(makeRelInvariant(relInSource)).to.deep.equal( @@ -1016,8 +1033,6 @@ export class TransformerExtensiveTestScenario extends TestUtils.ExtensiveTestSce assert.isFalse(targetDb.codeSpecs.hasName("SourceCodeSpec")); assert.isFalse(targetDb.codeSpecs.hasName("ExtraCodeSpec")); - // Font - assert.exists(targetDb.fontMap.getFont("Arial")); // Subject const subjectId: Id64String = targetDb.elements.queryElementIdByCode( Subject.createCode(targetDb, IModel.rootSubjectId, targetSubjectName) @@ -1230,7 +1245,7 @@ export class TransformerExtensiveTestScenario extends TestUtils.ExtensiveTestSce ); assert.isDefined(physicalObject1.geom); let index1 = 0; - for (const entry of new GeometryStreamIterator(physicalObject1.geom!)) { + for (const entry of new GeometryStreamIterator(physicalObject1.geom)) { if (0 === index1) { assert.equal(entry.primitive.type, "geometryQuery"); assert.equal(entry.geomParams.subCategoryId, subCategoryId); @@ -1567,8 +1582,10 @@ export class IModelTransformer3d extends IModelTransformer { this._transform3d = transform3d; } /** Override transformElement to apply a 3d transform to all GeometricElement3d instances. */ - public override onTransformElement(sourceElement: Element): ElementProps { - const targetElementProps: ElementProps = super.onTransformElement( + public override async onTransformElement( + sourceElement: Element + ): Promise { + const targetElementProps: ElementProps = await super.onTransformElement( sourceElement ); if (sourceElement instanceof GeometricElement3d) { @@ -1603,7 +1620,9 @@ export class PhysicalModelConsolidator extends IModelTransformer { this.importer.doNotUpdateElementIds.add(targetModelId); } /** Override shouldExportElement to remap PhysicalPartition instances. */ - public override shouldExportElement(sourceElement: Element): boolean { + public override async shouldExportElement( + sourceElement: Element + ): Promise { if (sourceElement instanceof PhysicalPartition) { this.combineElements([sourceElement.id], this._targetModelId); // NOTE: must allow export to continue so the PhysicalModel sub-modeling the PhysicalPartition is processed @@ -1619,7 +1638,30 @@ export class FilterByViewTransformer extends IModelTransformer { private readonly _exportCategorySelectorId: Id64String; private readonly _exportDisplayStyleId: Id64String; private readonly _exportModelIds: Id64Set; - public constructor( + + /** Static factory method for async initialization */ + public static async create( + sourceDb: IModelDb, + targetDb: IModelDb, + exportViewDefinitionId: Id64String + ): Promise { + const transformer = new FilterByViewTransformer( + sourceDb, + targetDb, + exportViewDefinitionId + ); + const exportCategorySelector = + sourceDb.elements.getElement( + transformer._exportCategorySelectorId, + CategorySelector + ); + await transformer.excludeCategoriesExcept( + Id64.toIdSet(exportCategorySelector.categories) + ); + return transformer; + } + + private constructor( sourceDb: IModelDb, targetDb: IModelDb, exportViewDefinitionId: Id64String @@ -1634,14 +1676,6 @@ export class FilterByViewTransformer extends IModelTransformer { this._exportCategorySelectorId = exportViewDefinition.categorySelectorId; this._exportModelSelectorId = exportViewDefinition.modelSelectorId; this._exportDisplayStyleId = exportViewDefinition.displayStyleId; - const exportCategorySelector = - sourceDb.elements.getElement( - exportViewDefinition.categorySelectorId, - CategorySelector - ); - this.excludeCategoriesExcept( - Id64.toIdSet(exportCategorySelector.categories) - ); const exportModelSelector = sourceDb.elements.getElement( exportViewDefinition.modelSelectorId, ModelSelector @@ -1649,24 +1683,24 @@ export class FilterByViewTransformer extends IModelTransformer { this._exportModelIds = Id64.toIdSet(exportModelSelector.models); } /** Excludes categories not referenced by the export view's CategorySelector */ - private excludeCategoriesExcept(exportCategoryIds: Id64Set): void { + private async excludeCategoriesExcept( + exportCategoryIds: Id64Set + ): Promise { const sql = `SELECT ECInstanceId FROM ${SpatialCategory.classFullName}`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const categoryId = statement.getValue(0).getId(); - if (!exportCategoryIds.has(categoryId)) { - this.exporter.excludeElementsInCategory(categoryId); - } - } + const reader = this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + }); + for await (const row of reader) { + const categoryId = row[0] as Id64String; + if (!exportCategoryIds.has(categoryId)) { + this.exporter.excludeElementsInCategory(categoryId); } - ); + } } /** Override of IModelTransformer.shouldExportElement that excludes other ViewDefinition-related elements that are not associated with the *export* ViewDefinition. */ - public override shouldExportElement(sourceElement: Element): boolean { + public override async shouldExportElement( + sourceElement: Element + ): Promise { if (sourceElement instanceof PhysicalPartition) { return this._exportModelIds.has(sourceElement.id); } else if (sourceElement instanceof SpatialViewDefinition) { @@ -1687,7 +1721,17 @@ export class FilterByViewTransformer extends IModelTransformer { * and records transformation data in the iModel itself. */ export class TestIModelTransformer extends IModelTransformer { - public constructor( + public static async create( + source: IModelDb | IModelExporter, + target: IModelDb | IModelImporter, + options?: IModelTransformOptions + ): Promise { + const transformer = new TestIModelTransformer(source, target, options); + await transformer.initSubCategoryFilters(); + return transformer; + } + + private constructor( source: IModelDb | IModelExporter, target: IModelDb | IModelImporter, options?: IModelTransformOptions @@ -1697,7 +1741,6 @@ export class TestIModelTransformer extends IModelTransformer { this.initCodeSpecRemapping(); this.initCategoryRemapping(); this.initClassRemapping(); - this.initSubCategoryFilters(); } /** Initialize some sample exclusion rules for testing */ @@ -1782,37 +1825,42 @@ export class TestIModelTransformer extends IModelTransformer { } /** */ - private initSubCategoryFilters(): void { + private async initSubCategoryFilters(): Promise { assert.isFalse(this.context.hasSubCategoryFilter); const sql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE CodeValue=:codeValue`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - statement.bindString("codeValue", "FilteredSubCategory"); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const subCategoryId = statement.getValue(0).getId(); - assert.isFalse(this.context.isSubCategoryFiltered(subCategoryId)); - this.context.filterSubCategory(subCategoryId); - this.exporter.excludeElement(subCategoryId); - assert.isTrue(this.context.isSubCategoryFiltered(subCategoryId)); - } - } + const params = new QueryBinder().bindString( + "codeValue", + "FilteredSubCategory" ); + const reader = this.sourceDb.createQueryReader(sql, params, { + usePrimaryConn: true, + }); + for await (const row of reader) { + const subCategoryId = row[0] as Id64String; + assert.isFalse(this.context.isSubCategoryFiltered(subCategoryId)); + this.context.filterSubCategory(subCategoryId); + this.exporter.excludeElement(subCategoryId); + assert.isTrue(this.context.isSubCategoryFiltered(subCategoryId)); + } assert.isTrue(this.context.hasSubCategoryFilter); } /** Override shouldExportElement to exclude all elements from the Functional schema. */ - public override shouldExportElement(sourceElement: Element): boolean { + public override async shouldExportElement( + sourceElement: Element + ): Promise { return sourceElement.classFullName.startsWith(FunctionalSchema.schemaName) ? false : super.shouldExportElement(sourceElement); } /** Override transformElement to make sure that all target Elements have a FederationGuid */ - public override onTransformElement(sourceElement: Element): ElementProps { - const targetElementProps: any = super.onTransformElement(sourceElement); + public override async onTransformElement( + sourceElement: Element + ): Promise { + const targetElementProps: any = await super.onTransformElement( + sourceElement + ); if (!targetElementProps.federationGuid) { targetElementProps.federationGuid = Guid.createValue(); } @@ -1840,10 +1888,10 @@ export class TestIModelTransformer extends IModelTransformer { } /** Override transformElementAspect to remap Source*Aspect --> Target*Aspect */ - public override onTransformElementAspect( + public override async onTransformElementAspect( sourceElementAspect: ElementAspect - ): ElementAspectProps { - const targetElementAspectProps: any = super.onTransformElementAspect( + ): Promise { + const targetElementAspectProps: any = await super.onTransformElementAspect( sourceElementAspect ); if ( @@ -1917,9 +1965,9 @@ export class AspectTrackingTransformer extends IModelTransformer { ElementMultiAspect[] >(); - public override onExportElementMultiAspects( + public override async onExportElementMultiAspects( sourceAspects: ElementMultiAspect[] - ): void { + ): Promise { const elementId = sourceAspects[0].element.id; assert( !this.exportedAspectIdsByElement.has(elementId), @@ -1946,7 +1994,7 @@ export class AssertOrderTransformer extends IModelTransformer { return `The elements [${this._exportOrderQueue}] remain`; } - public override onExportElement(elem: Element) { + public override async onExportElement(elem: Element) { if (elem.id === this._exportOrderQueue[0]) this._exportOrderQueue.shift(); // pop the front // we just popped the queue if it was expected, so it shouldn't be there the order was correct (and there are no duplicates) const currentExportWasNotInExpectedOrder = this._exportOrderQueue.includes( @@ -1986,65 +2034,83 @@ export class CountingIModelImporter extends IModelImporter { public constructor(targetDb: IModelDb, options?: IModelImportOptions) { super(targetDb, options); } - protected override onInsertModel(modelProps: ModelProps): Id64String { + protected override async onInsertModel( + modelProps: ModelProps + ): Promise { this.numModelsInserted++; return super.onInsertModel(modelProps); } - protected override onUpdateModel(modelProps: ModelProps): void { + protected override async onUpdateModel( + modelProps: ModelProps + ): Promise { this.numModelsUpdated++; - super.onUpdateModel(modelProps); + await super.onUpdateModel(modelProps); } - protected override onInsertElement(elementProps: ElementProps): Id64String { + protected override async onInsertElement( + elementProps: ElementProps + ): Promise { this.numElementsInserted++; return super.onInsertElement(elementProps); } - protected override onUpdateElement(elementProps: ElementProps): void { + protected override async onUpdateElement( + elementProps: ElementProps + ): Promise { this.numElementsUpdated++; - super.onUpdateElement(elementProps); + await super.onUpdateElement(elementProps); } - protected override onDeleteElement(elementId: Id64String): void { + protected override async onDeleteElement( + elementId: Id64String + ): Promise { this.numElementsExplicitlyDeleted++; - super.onDeleteElement(elementId); + await super.onDeleteElement(elementId); } - protected override onInsertElementAspect( + protected override async onInsertElementAspect( aspectProps: ElementAspectProps - ): Id64String { + ): Promise { this.numElementAspectsInserted++; return super.onInsertElementAspect(aspectProps); } - protected override onUpdateElementAspect( + protected override async onUpdateElementAspect( aspectProps: ElementAspectProps - ): void { + ): Promise { this.numElementAspectsUpdated++; - super.onUpdateElementAspect(aspectProps); + await super.onUpdateElementAspect(aspectProps); } - protected override onInsertRelationship( + protected override async onInsertRelationship( relationshipProps: RelationshipProps - ): Id64String { + ): Promise { this.numRelationshipsInserted++; return super.onInsertRelationship(relationshipProps); } - protected override onUpdateRelationship( + protected override async onUpdateRelationship( relationshipProps: RelationshipProps - ): void { + ): Promise { this.numRelationshipsUpdated++; - super.onUpdateRelationship(relationshipProps); + await super.onUpdateRelationship(relationshipProps); } - protected override onDeleteRelationship( + protected override async onDeleteRelationship( relationshipProps: RelationshipPropsForDelete - ): void { + ): Promise { this.numRelationshipsDeleted++; - super.onDeleteRelationship(relationshipProps); + await super.onDeleteRelationship(relationshipProps); } } /** Specialization of IModelImporter that creates an InformationRecordElement for each PhysicalElement that it imports. */ export class RecordingIModelImporter extends CountingIModelImporter { + /** Cache mapping PhysicalPartition IDs to their corresponding record partition IDs */ + private _recordPartitionIdByPhysicalPartitionId = new Map< + Id64String, + Id64String + >(); + public constructor(targetDb: IModelDb, options?: IModelImportOptions) { super(targetDb, options); } - protected override onInsertModel(modelProps: ModelProps): Id64String { - const modelId: Id64String = super.onInsertModel(modelProps); + protected override async onInsertModel( + modelProps: ModelProps + ): Promise { + const modelId: Id64String = await super.onInsertModel(modelProps); const model: Model = this.targetDb.models.getModel(modelId); if (model instanceof PhysicalModel) { const modeledElement: Element = this.targetDb.elements.getElement( @@ -2063,63 +2129,58 @@ export class RecordingIModelImporter extends CountingIModelImporter { sourceId: modeledElement.id, targetId: recordPartitionId, }); + // Cache the mapping to avoid needing to query later + this._recordPartitionIdByPhysicalPartitionId.set( + modelId, + recordPartitionId + ); } } return modelId; } - protected override onInsertElement(elementProps: ElementProps): Id64String { - const elementId: Id64String = super.onInsertElement(elementProps); + protected override async onInsertElement( + elementProps: ElementProps + ): Promise { + // during insertion it is possible that elements are inserted with partial. Account for that so that operations below don't throw. + this.accountForPartialViewDefinition2d(elementProps); + const elementId: Id64String = await super.onInsertElement(elementProps); const element: Element = this.targetDb.elements.getElement(elementId); if (element instanceof PhysicalElement) { - const recordPartitionId: Id64String = this.getRecordPartitionId( - element.model - ); - if (Id64.isValidId64(recordPartitionId)) { + const recordPartitionId = + this._recordPartitionIdByPhysicalPartitionId.get(element.model); + if (recordPartitionId && Id64.isValidId64(recordPartitionId)) { this.insertAuditRecord("Insert", recordPartitionId, element); } } return elementId; } - protected override onUpdateElement(elementProps: ElementProps): void { - super.onUpdateElement(elementProps); + protected override async onUpdateElement( + elementProps: ElementProps + ): Promise { + await super.onUpdateElement(elementProps); const element: Element = this.targetDb.elements.getElement( elementProps.id! ); if (element instanceof PhysicalElement) { - const recordPartitionId: Id64String = this.getRecordPartitionId( - element.model - ); - if (Id64.isValidId64(recordPartitionId)) { + const recordPartitionId = + this._recordPartitionIdByPhysicalPartitionId.get(element.model); + if (recordPartitionId && Id64.isValidId64(recordPartitionId)) { this.insertAuditRecord("Update", recordPartitionId, element); } } } - protected override onDeleteElement(elementId: Id64String): void { + protected override async onDeleteElement( + elementId: Id64String + ): Promise { const element: Element = this.targetDb.elements.getElement(elementId); if (element instanceof PhysicalElement) { - const recordPartitionId: Id64String = this.getRecordPartitionId( - element.model - ); - if (Id64.isValidId64(recordPartitionId)) { + const recordPartitionId = + this._recordPartitionIdByPhysicalPartitionId.get(element.model); + if (recordPartitionId && Id64.isValidId64(recordPartitionId)) { this.insertAuditRecord("Delete", recordPartitionId, element); } } - super.onDeleteElement(elementId); // delete element after AuditRecord is inserted - } - private getRecordPartitionId(physicalPartitionId: Id64String): Id64String { - const sql = - "SELECT TargetECInstanceId FROM ExtensiveTestScenarioTarget:PhysicalPartitionIsTrackedByRecords WHERE SourceECInstanceId=:physicalPartitionId"; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return this.targetDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): Id64String => { - statement.bindId("physicalPartitionId", physicalPartitionId); - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getId() - : Id64.invalid; - } - ); + await super.onDeleteElement(elementId); // delete element after AuditRecord is inserted } private insertAuditRecord( operation: string, @@ -2136,6 +2197,17 @@ export class RecordingIModelImporter extends CountingIModelImporter { }; return this.targetDb.elements.insertElement(auditRecord); } + private accountForPartialViewDefinition2d(elementProps: ElementProps): void { + const view2d = elementProps as unknown as ViewDefinition2d; + // if the ViewDefinition2d has a baseModelId, it should be a valid Id64String otherwise insert/get operations will fail. + // if the element referenced by baseModelId is not yet inserted in the target iModel this condition is possible. + // Transformer code in this case marks this element as partial and in the end will reconcile and update the element with a valid baseModelId before the entire process is done. + // Reference to reconciliation: https://github.com/iTwin/imodel-transformer/blob/6a2dabe4a55d70814682723839850a3186af7d3d/packages/transformer/src/IModelTransformer.ts#L1602 + // The baseModelId assigned here is a placeholder that will be replaced with the actual baseModelId when the reconciliation happens. + if (view2d.baseModelId && !Id64.isValidId64(view2d.baseModelId)) { + view2d.baseModelId = "0x1"; + } + } } /** In addition to recording transformation processes with information record elements, also collects @@ -2143,10 +2215,10 @@ export class RecordingIModelImporter extends CountingIModelImporter { */ export class AspectTrackingImporter extends IModelImporter { public importedAspectIdsByElement = new Map(); - public override importElementMultiAspects( + public override async importElementMultiAspects( ...args: Parameters ) { - const resultTargetIds = super.importElementMultiAspects(...args); + const resultTargetIds = await super.importElementMultiAspects(...args); const [aspectsProps] = args; const elementId = aspectsProps[0].element.id; assert( @@ -2182,7 +2254,6 @@ export class IModelToTextFileExporter extends IModelExportHandler { ...args: Parameters ): Promise { this._shouldIndent = false; - // eslint-disable-next-line deprecation/deprecation return this.exporter.exportChanges(...args); } private writeLine(line: string, indentLevel: number = 0): void { @@ -2227,44 +2298,44 @@ export class IModelToTextFileExporter extends IModelExportHandler { this.writeLine(`[Schema] ${schema.name}`); return super.onExportSchema(schema); } - public override onExportCodeSpec( + public override async onExportCodeSpec( codeSpec: CodeSpec, isUpdate: boolean | undefined - ): void { + ): Promise { this.writeLine( `[CodeSpec] ${codeSpec.id}, ${codeSpec.name}${this.formatOperationName( isUpdate )}` ); - super.onExportCodeSpec(codeSpec, isUpdate); + await super.onExportCodeSpec(codeSpec, isUpdate); } - public override onExportFont( + public override async onExportFont( font: FontProps, isUpdate: boolean | undefined - ): void { + ): Promise { if (this._firstFont) { this.writeSeparator(); this._firstFont = false; } this.writeLine(`[Font] ${font.id}, ${font.name}`); - super.onExportFont(font, isUpdate); + await super.onExportFont(font, isUpdate); } - public override onExportModel( + public override async onExportModel( model: Model, isUpdate: boolean | undefined - ): void { + ): Promise { this.writeSeparator(); this.writeLine( `[Model] ${model.classFullName}, ${model.id}, ${ model.name }${this.formatOperationName(isUpdate)}` ); - super.onExportModel(model, isUpdate); + await super.onExportModel(model, isUpdate); } - public override onExportElement( + public override async onExportElement( element: Element, isUpdate: boolean | undefined - ): void { + ): Promise { const indentLevel: number = this.getIndentLevelForElement(element); this.writeLine( `[Element] ${element.classFullName}, ${ @@ -2272,16 +2343,16 @@ export class IModelToTextFileExporter extends IModelExportHandler { }, ${element.getDisplayLabel()}${this.formatOperationName(isUpdate)}`, indentLevel ); - super.onExportElement(element, isUpdate); + await super.onExportElement(element, isUpdate); } - public override onDeleteElement(elementId: Id64String): void { + public override async onDeleteElement(elementId: Id64String): Promise { this.writeLine(`[Element] ${elementId}, DELETE`); - super.onDeleteElement(elementId); + await super.onDeleteElement(elementId); } - public override onExportElementUniqueAspect( + public override async onExportElementUniqueAspect( aspect: ElementUniqueAspect, isUpdate: boolean | undefined - ): void { + ): Promise { const indentLevel: number = this.getIndentLevelForElementAspect(aspect); this.writeLine( `[Aspect] ${aspect.classFullName}, ${aspect.id}${this.formatOperationName( @@ -2289,11 +2360,11 @@ export class IModelToTextFileExporter extends IModelExportHandler { )}`, indentLevel ); - super.onExportElementUniqueAspect(aspect, isUpdate); + await super.onExportElementUniqueAspect(aspect, isUpdate); } - public override onExportElementMultiAspects( + public override async onExportElementMultiAspects( aspects: ElementMultiAspect[] - ): void { + ): Promise { const indentLevel: number = this.getIndentLevelForElementAspect(aspects[0]); for (const aspect of aspects) { this.writeLine( @@ -2301,12 +2372,12 @@ export class IModelToTextFileExporter extends IModelExportHandler { indentLevel ); } - super.onExportElementMultiAspects(aspects); + await super.onExportElementMultiAspects(aspects); } - public override onExportRelationship( + public override async onExportRelationship( relationship: Relationship, isUpdate: boolean | undefined - ): void { + ): Promise { if (this._firstRelationship) { this.writeSeparator(); this._firstRelationship = false; @@ -2316,11 +2387,13 @@ export class IModelToTextFileExporter extends IModelExportHandler { relationship.id }${this.formatOperationName(isUpdate)}` ); - super.onExportRelationship(relationship, isUpdate); + await super.onExportRelationship(relationship, isUpdate); } - public override onDeleteRelationship(relInstanceId: Id64String): void { + public override async onDeleteRelationship( + relInstanceId: Id64String + ): Promise { this.writeLine(`[Relationship] ${relInstanceId}, DELETE`); - super.onDeleteRelationship(relInstanceId); + await super.onDeleteRelationship(relInstanceId); } } @@ -2402,44 +2475,44 @@ export class ClassCounter extends IModelExportHandler { }); IModelJsFs.appendFileSync(this.outputFileName, "\n"); } - public override onExportModel( + public override async onExportModel( model: Model, isUpdate: boolean | undefined - ): void { + ): Promise { this.incrementClassCount(this._modelClassCounts, model.classFullName); - super.onExportModel(model, isUpdate); + await super.onExportModel(model, isUpdate); } - public override onExportElement( + public override async onExportElement( element: Element, isUpdate: boolean | undefined - ): void { + ): Promise { this.incrementClassCount(this._elementClassCounts, element.classFullName); - super.onExportElement(element, isUpdate); + await super.onExportElement(element, isUpdate); } - public override onExportElementUniqueAspect( + public override async onExportElementUniqueAspect( aspect: ElementUniqueAspect, isUpdate: boolean | undefined - ): void { + ): Promise { this.incrementClassCount(this._aspectClassCounts, aspect.classFullName); - super.onExportElementUniqueAspect(aspect, isUpdate); + await super.onExportElementUniqueAspect(aspect, isUpdate); } - public override onExportElementMultiAspects( + public override async onExportElementMultiAspects( aspects: ElementMultiAspect[] - ): void { + ): Promise { for (const aspect of aspects) { this.incrementClassCount(this._aspectClassCounts, aspect.classFullName); } - super.onExportElementMultiAspects(aspects); + await super.onExportElementMultiAspects(aspects); } - public override onExportRelationship( + public override async onExportRelationship( relationship: Relationship, isUpdate: boolean | undefined - ): void { + ): Promise { this.incrementClassCount( this._relationshipClassCounts, relationship.classFullName ); - super.onExportRelationship(relationship, isUpdate); + await super.onExportRelationship(relationship, isUpdate); } } diff --git a/packages/transformer/src/test/TestUtils/IModelTestUtils.ts b/packages/transformer/src/test/TestUtils/IModelTestUtils.ts index 280063eca..47bf1ffde 100644 --- a/packages/transformer/src/test/TestUtils/IModelTestUtils.ts +++ b/packages/transformer/src/test/TestUtils/IModelTestUtils.ts @@ -79,6 +79,7 @@ import { BriefcaseDb, BriefcaseManager, CategorySelector, + CheckpointManager, CheckpointProps, ClassRegistry, DefinitionModel, @@ -86,6 +87,7 @@ import { DisplayStyle2d, DisplayStyle3d, DocumentListModel, + DownloadRequest, Drawing, DrawingCategory, DrawingGraphic, @@ -108,7 +110,6 @@ import { FunctionalSchema, GeometryPart, GroupModel, - HubMock, IModelDb, IModelHost, IModelJsFs, @@ -136,9 +137,11 @@ import { Subject, SubjectOwnsPartitionElements, Texture, - V1CheckpointManager, + V2CheckpointManager, ViewDefinition, } from "@itwin/core-backend"; +import { HubMock } from "@itwin/core-backend/lib/cjs/internal/HubMock"; +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; import { DownloadAndOpenArgs, RpcBriefcaseUtility, @@ -239,7 +242,7 @@ export enum TestUserType { SuperManager, } -/** A wrapper around the BackendHubAccess API through IModelHost.hubAccess. +/** A wrapper around the BackendHubAccess API through IModelHost[_hubAccess]. * * All methods in this class should be usable with any BackendHubAccess implementation (i.e. HubMock and IModelHubBackend). */ @@ -262,13 +265,13 @@ export class HubWrappers { this.hubMock.isValid, "Must use HubMock for tests that modify iModels" ); - let iModelId = await IModelHost.hubAccess.queryIModelByName({ + let iModelId = await IModelHost[_hubAccess].queryIModelByName({ accessToken, iTwinId, iModelName, }); if (!iModelId) - iModelId = await IModelHost.hubAccess.createNewIModel({ + iModelId = await IModelHost[_hubAccess].createNewIModel({ accessToken, iTwinId, iModelName, @@ -287,16 +290,16 @@ export class HubWrappers { this.hubMock.isValid, "Must use HubMock for tests that modify iModels" ); - const deleteIModel = await IModelHost.hubAccess.queryIModelByName(arg); + const deleteIModel = await IModelHost[_hubAccess].queryIModelByName(arg); if (undefined !== deleteIModel) - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ accessToken: arg.accessToken, iTwinId: arg.iTwinId, iModelId: deleteIModel, }); // Create a new iModel - return IModelHost.hubAccess.createNewIModel({ + return IModelHost[_hubAccess].createNewIModel({ description: `Description for ${arg.iModelName}`, ...arg, }); @@ -308,14 +311,18 @@ export class HubWrappers { iTwinId: string, iModelName: string ): Promise { - const iModelId = await IModelHost.hubAccess.queryIModelByName({ + const iModelId = await IModelHost[_hubAccess].queryIModelByName({ accessToken, iTwinId, iModelName, }); if (undefined === iModelId) return; - await IModelHost.hubAccess.deleteIModel({ accessToken, iTwinId, iModelId }); + await IModelHost[_hubAccess].deleteIModel({ + accessToken, + iTwinId, + iModelId, + }); } /** Push an iModel to the Hub */ @@ -328,14 +335,14 @@ export class HubWrappers { ): Promise { // Delete any existing iModels with the same name as the required iModel const locIModelName = iModelName || path.basename(pathname, ".bim"); - const iModelId = await IModelHost.hubAccess.queryIModelByName({ + const iModelId = await IModelHost[_hubAccess].queryIModelByName({ accessToken, iTwinId, iModelName: locIModelName, }); if (iModelId) { if (!overwrite) return iModelId; - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ accessToken, iTwinId, iModelId, @@ -343,7 +350,7 @@ export class HubWrappers { } // Upload a new iModel - return IModelHost.hubAccess.createNewIModel({ + return IModelHost[_hubAccess].createNewIModel({ accessToken, iTwinId, iModelName: locIModelName, @@ -372,7 +379,7 @@ export class HubWrappers { tokenProps: { iTwinId: args.iTwinId, iModelId: args.iModelId, - changeset: await IModelHost.hubAccess.getChangesetFromVersion({ + changeset: await IModelHost[_hubAccess].getChangesetFromVersion({ accessToken: args.accessToken, version: IModelVersion.fromJSON(args.asOf), iModelId: args.iModelId, @@ -396,11 +403,10 @@ export class HubWrappers { ); while (true) { try { - return (await RpcBriefcaseUtility.open(openArgs)) as BriefcaseDb; // eslint-disable-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated + return (await RpcBriefcaseUtility.open(openArgs)) as BriefcaseDb; } catch (error) { - if (!(error instanceof RpcPendingResponse)) - // eslint-disable-line deprecation/deprecation - throw error; + if (!(error instanceof RpcPendingResponse)) throw error; } } } @@ -418,17 +424,34 @@ export class HubWrappers { iTwinId: args.iTwinId, iModelId: args.iModelId, accessToken: args.accessToken, - changeset: await IModelHost.hubAccess.getChangesetFromVersion({ + changeset: await IModelHost[_hubAccess].getChangesetFromVersion({ accessToken: args.accessToken, version: IModelVersion.fromJSON(args.asOf), iModelId: args.iModelId, }), }; - return V1CheckpointManager.getCheckpointDb({ - checkpoint, - localFile: V1CheckpointManager.getFileName(checkpoint), - }); + const folder = path.join( + V2CheckpointManager.getFolder(), + checkpoint.iModelId + ); + const filename = path.join( + folder, + `${checkpoint.changeset.id === "" ? "first" : checkpoint.changeset.id}.bim` + ); + const request: DownloadRequest = { checkpoint, localFile: filename }; + let db = SnapshotDb.tryFindByKey( + CheckpointManager.getKey(request.checkpoint) + ); + if (undefined !== db) return db; + db = IModelTestUtils.tryOpenLocalFile(request); + if (db) return db; + await V2CheckpointManager.downloadCheckpoint(request); + await CheckpointManager.updateToRequestedVersion(request); + return IModelTestUtils.openCheckpoint( + request.localFile, + request.checkpoint + ); } /** Opens the specific Checkpoint iModel, `SyncMode.FixedVersion`, through the same workflow the IModelReadRpc.getConnectionProps method will use. Replicates the way a frontend would open the iModel. */ @@ -440,12 +463,12 @@ export class HubWrappers { ): Promise { if (undefined === args.asOf) args.asOf = IModelVersion.latest().toJSON(); - const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ + const changeset = await IModelHost[_hubAccess].getChangesetFromVersion({ accessToken: args.accessToken, version: IModelVersion.fromJSON(args.asOf), iModelId: args.iModelId, }); - const openArgs: DownloadAndOpenArgs = { + const openArgs = { tokenProps: { iTwinId: args.iTwinId, iModelId: args.iModelId, @@ -458,17 +481,15 @@ export class HubWrappers { applicationVersion: "", sessionId: "", }, - syncMode: SyncMode.FixedVersion, + syncMode: SyncMode.FixedVersion as const, forceDownload: args.deleteFirst, }; while (true) { try { - return await RpcBriefcaseUtility.open(openArgs); // eslint-disable-line deprecation/deprecation + return await RpcBriefcaseUtility.open(openArgs); } catch (error) { - if (!(error instanceof RpcPendingResponse)) - // eslint-disable-line deprecation/deprecation - throw error; + if (!(error instanceof RpcPendingResponse)) throw error; } } } @@ -482,7 +503,7 @@ export class HubWrappers { onReachThreshold: () => void = () => {}, acquireThreshold: number = 16 ): Promise { - const briefcases = await IModelHost.hubAccess.getMyBriefcaseIds({ + const briefcases = await IModelHost[_hubAccess].getMyBriefcaseIds({ accessToken, iModelId, }); @@ -492,7 +513,7 @@ export class HubWrappers { const promises: Promise[] = []; briefcases.forEach((briefcaseId) => { promises.push( - IModelHost.hubAccess.releaseBriefcase({ + IModelHost[_hubAccess].releaseBriefcase({ accessToken, iModelId, briefcaseId, @@ -537,6 +558,28 @@ export class IModelTestUtils { return `${baseName} - ${Guid.createValue()}`; } + public static openCheckpoint( + fileName: LocalFileName, + checkpoint: CheckpointProps + ) { + const snapshot = SnapshotDb.openFile(fileName, { + key: CheckpointManager.getKey(checkpoint), + }); + (snapshot as any)._iTwinId = checkpoint.iTwinId; + return snapshot; + } + + /** try to open an existing local file to satisfy a download request */ + public static tryOpenLocalFile( + request: DownloadRequest + ): SnapshotDb | undefined { + const checkpoint = request.checkpoint; + if (CheckpointManager.verifyCheckpoint(checkpoint, request.localFile)) + return this.openCheckpoint(request.localFile, checkpoint); + + return undefined; + } + /** Prepare for an output file by: * - Resolving the output file name under the known test output directory * - Making directories as necessary @@ -862,7 +905,7 @@ export class IModelTestUtils { ecsql: string, bindings?: any[] | object ): any[] { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated return db.withPreparedStatement(ecsql, (stmt) => { if (bindings) stmt.bindValues(bindings); @@ -893,13 +936,6 @@ export class IModelTestUtils { return subj; } - /** Flushes the Txns in the TxnTable - this allows importing of schemas */ - public static flushTxns(iModelDb: IModelDb): boolean { - /* eslint-disable-next-line deprecation/deprecation */ - iModelDb.nativeDb.deleteAllTxns(); - return true; - } - public static querySubjectId( iModelDb: IModelDb, subjectCodeValue: string @@ -1121,10 +1157,10 @@ export class IModelTestUtils { iModelDb: IModelDb, userLabel: string ): Id64String { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated return iModelDb.withPreparedStatement( `SELECT ECInstanceId FROM ${Element.classFullName} WHERE UserLabel=:userLabel`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): Id64String => { statement.bindString("userLabel", userLabel); return DbResult.BE_SQLITE_ROW === statement.step() @@ -1200,10 +1236,10 @@ export class IModelTestUtils { iModelDb: IModelDb, codeValue: string ): Id64String { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated return iModelDb.withPreparedStatement( `SELECT ECInstanceId FROM ${Element.classFullName} WHERE CodeValue=:codeValue`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): Id64String => { statement.bindString("codeValue", codeValue); return DbResult.BE_SQLITE_ROW === statement.step() @@ -1217,10 +1253,10 @@ export class IModelTestUtils { iModelDb: IModelDb, codeValue: string ): Id64String { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated return iModelDb.withPreparedStatement( `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ModeledElement.Id in (Select ECInstanceId from Bis.Element where CodeValue=:codeValue)`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): Id64String => { statement.bindString("codeValue", codeValue); return DbResult.BE_SQLITE_ROW === statement.step() @@ -1274,10 +1310,10 @@ export class IModelTestUtils { } IModelJsFs.appendFileSync(outputFileName, `${iModelDb.pathName}\n`); IModelJsFs.appendFileSync(outputFileName, "\n=== CodeSpecs ===\n"); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( "SELECT ECInstanceId,Name FROM BisCore:CodeSpec ORDER BY ECInstanceId", - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { while (DbResult.BE_SQLITE_ROW === statement.step()) { const codeSpecId = statement.getValue(0).getId(); @@ -1290,10 +1326,10 @@ export class IModelTestUtils { } ); IModelJsFs.appendFileSync(outputFileName, "\n=== Schemas ===\n"); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( "SELECT Name FROM ECDbMeta.ECSchemaDef ORDER BY ECInstanceId", - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { while (DbResult.BE_SQLITE_ROW === statement.step()) { const schemaName: string = statement.getValue(0).getString(); @@ -1302,10 +1338,10 @@ export class IModelTestUtils { } ); IModelJsFs.appendFileSync(outputFileName, "\n=== Models ===\n"); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( `SELECT ECInstanceId FROM ${Model.classFullName} ORDER BY ECInstanceId`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { while (DbResult.BE_SQLITE_ROW === statement.step()) { const modelId = statement.getValue(0).getId(); @@ -1318,10 +1354,10 @@ export class IModelTestUtils { } ); IModelJsFs.appendFileSync(outputFileName, "\n=== ViewDefinitions ===\n"); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( `SELECT ECInstanceId FROM ${ViewDefinition.classFullName} ORDER BY ECInstanceId`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { while (DbResult.BE_SQLITE_ROW === statement.step()) { const viewDefinitionId = statement.getValue(0).getId(); @@ -1335,10 +1371,10 @@ export class IModelTestUtils { } ); IModelJsFs.appendFileSync(outputFileName, "\n=== Elements ===\n"); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( `SELECT COUNT(*) FROM ${Element.classFullName}`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { if (DbResult.BE_SQLITE_ROW === statement.step()) { const count: number = statement.getValue(0).getInteger(); @@ -1349,10 +1385,10 @@ export class IModelTestUtils { } } ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( `SELECT COUNT(*) FROM ${PhysicalObject.classFullName}`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { if (DbResult.BE_SQLITE_ROW === statement.step()) { const count: number = statement.getValue(0).getInteger(); @@ -1363,10 +1399,10 @@ export class IModelTestUtils { } } ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated iModelDb.withPreparedStatement( `SELECT COUNT(*) FROM ${GeometryPart.classFullName}`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): void => { if (DbResult.BE_SQLITE_ROW === statement.step()) { const count: number = statement.getValue(0).getInteger(); @@ -1385,12 +1421,12 @@ export class IModelTestUtils { classFullName: string, whereClause?: string ): number { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated return iModelDb.withPreparedStatement( `SELECT COUNT(*) FROM ${classFullName}${ whereClause ? ` WHERE ${whereClause}` : "" }`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation + // eslint-disable-next-line @itwin/no-internal, @typescript-eslint/no-deprecated (statement: ECSqlStatement): number => { return DbResult.BE_SQLITE_ROW === statement.step() ? statement.getValue(0).getInteger() @@ -1427,10 +1463,6 @@ export class ExtensiveTestScenario { } public static populateDb(sourceDb: IModelDb): void { - // make sure Arial is in the font table - sourceDb.addNewFont("Arial"); - assert.exists(sourceDb.fontMap.getFont("Arial")); - // Initialize project extents const projectExtents = new Range3d(-1000, -1000, -1000, 1000, 1000, 1000); sourceDb.updateProjectExtents(projectExtents); @@ -1876,7 +1908,7 @@ export class ExtensiveTestScenario { displayStyle3d.settings.addExcludedElements(physicalObjectId1); displayStyle3d.settings.setPlanProjectionSettings( spatialLocationModelId, - new PlanProjectionSettings({ elevation: 10.0 }) + PlanProjectionSettings.fromJSON({ elevation: 10.0 }) ); displayStyle3d.settings.environment = Environment.fromJSON({ sky: { @@ -1900,8 +1932,6 @@ export class ExtensiveTestScenario { StandardViewIndex.Iso ); assert.isTrue(Id64.isValidId64(viewId)); - // eslint-disable-next-line deprecation/deprecation - sourceDb.views.setDefaultViewId(viewId); const drawingViewRange = new Range2d(0, 0, 100, 100); const drawingViewId = DrawingViewDefinition.insert( sourceDb, diff --git a/packages/transformer/src/test/TestUtils/TestChangeSetUtility.ts b/packages/transformer/src/test/TestUtils/TestChangeSetUtility.ts index 70ac45e54..69d6e99fa 100644 --- a/packages/transformer/src/test/TestUtils/TestChangeSetUtility.ts +++ b/packages/transformer/src/test/TestUtils/TestChangeSetUtility.ts @@ -5,12 +5,9 @@ import { AccessToken, GuidString } from "@itwin/core-bentley"; import { ColorDef, IModel, SubCategoryAppearance } from "@itwin/core-common"; -import { - BriefcaseDb, - HubMock, - IModelHost, - SpatialCategory, -} from "@itwin/core-backend"; +import { BriefcaseDb, IModelHost, SpatialCategory } from "@itwin/core-backend"; +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; +import { HubMock } from "@itwin/core-backend/lib/cjs/internal/HubMock"; import { HubWrappers, IModelTestUtils } from "./IModelTestUtils"; /** Test utility to push an iModel and ChangeSets */ @@ -118,7 +115,7 @@ export class TestChangeSetUtility { this._accessToken, this._iModel ); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ accessToken: this._accessToken, iTwinId: this.iTwinId, iModelId: this.iModelId, diff --git a/packages/transformer/src/test/TestUtils/TimelineTestUtil.ts b/packages/transformer/src/test/TestUtils/TimelineTestUtil.ts index aa3c881b4..f68bba175 100644 --- a/packages/transformer/src/test/TestUtils/TimelineTestUtil.ts +++ b/packages/transformer/src/test/TestUtils/TimelineTestUtil.ts @@ -13,7 +13,7 @@ import { PhysicalPartition, SpatialCategory, } from "@itwin/core-backend"; - +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; import { ChangesetIdWithIndex, Code, @@ -44,20 +44,22 @@ const saveAndPushChanges = async ( export const deleted = Symbol("DELETED"); // NOTE: this is not done optimally -export function getIModelState(db: IModelDb): TimelineIModelElemState { +export async function getIModelState( + db: IModelDb +): Promise { const result = {} as TimelineIModelElemState; - - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const elemIds = db.withPreparedStatement( - ` + const elemIds = []; + const sql = ` SELECT ECInstanceId FROM Bis.Element WHERE ECInstanceId>${IModelDb.dictionaryId} -- ignore the known required elements set in 'populateTimelineSeed' AND CodeValue NOT IN ('SpatialCategory', 'PhysicalModel') - `, - (s) => [...s].map((row) => row.id) - ); + `; + const reader = db.createQueryReader(sql, undefined, { usePrimaryConn: true }); + for await (const row of reader) { + elemIds.push(row.id); + } for (const elemId of elemIds) { const elem = db.elements.getElement(elemId); @@ -72,20 +74,22 @@ export function getIModelState(db: IModelDb): TimelineIModelElemState { : elem.toJSON(); } - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const supportedRelIds = db.withPreparedStatement( - ` - SELECT erte.ECInstanceId, erte.ECClassId, - se.ECInstanceId AS SourceId, se.UserLabel AS SourceUserLabel, - te.ECInstanceId AS TargetId, te.UserLabel AS TargetUserLabel + const supportedRelIds = []; + const supportedRelIdsSql = ` + SELECT erte.ECInstanceId AS id, ec_classname(erte.ECClassId, 's.c') AS className, + se.ECInstanceId AS sourceId, se.UserLabel AS sourceUserLabel, + te.ECInstanceId AS targetId, te.UserLabel AS targetUserLabel FROM Bis.ElementRefersToElements erte JOIN Bis.Element se ON se.ECInstanceId=erte.SourceECInstanceId JOIN Bis.Element te ON te.ECInstanceId=erte.TargetECInstanceId - `, - (s) => [...s] - ); + `; + for await (const row of db.createQueryReader(supportedRelIdsSql, undefined, { + usePrimaryConn: true, + })) { + supportedRelIds.push(row.toRow()); + } for (const { id, @@ -136,12 +140,13 @@ export function populateTimelineSeed( db.performCheckpoint(); } -export function assertElemState( +export async function assertElemState( db: IModelDb, state: TimelineIModelElemStateDelta, { subset = false } = {} -): void { - expect(getIModelState(db)).to.deep.subsetEqual(state, { +): Promise { + const imodelState = await getIModelState(db); + expect(imodelState).to.deep.subsetEqual(state, { useSubsetEquality: subset, }); } @@ -320,7 +325,6 @@ export async function runTimeline( const trackedIModels = new Map(); const masterOfBranch = new Map(); - /* eslint-disable @typescript-eslint/indent */ const timelineStates = new Map< number, { @@ -328,7 +332,6 @@ export async function runTimeline( changesets: { [iModelName: string]: ChangesetIdWithIndex }; } >(); - /* eslint-enable @typescript-eslint/indent */ function printChangelogs() { const rows = [...timelineStates.values()].map((state) => @@ -416,7 +419,7 @@ export async function runTimeline( undefined; seed?.db.performCheckpoint(); // make sure WAL is flushed before we use this as a file seed - const newIModelId = await IModelHost.hubAccess.createNewIModel({ + const newIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: newIModelName, version0: seed?.db.pathName, @@ -473,7 +476,7 @@ export async function runTimeline( newTrackedIModel.db.close(); newTrackedIModel.db = await BriefcaseDb.open({ fileName }); } - newTrackedIModel.state = getIModelState(newIModelDb); + newTrackedIModel.state = await getIModelState(newIModelDb); } else maintainObjects( newIModelDb, @@ -487,7 +490,7 @@ export async function runTimeline( } if (seed) { - assertElemState(newIModelDb, seed.state); + await assertElemState(newIModelDb, seed.state); } } @@ -512,7 +515,7 @@ export async function runTimeline( let targetStateBefore: TimelineIModelElemState | undefined; if (process.env.TRANSFORMER_BRANCH_TEST_DEBUG) - targetStateBefore = getIModelState(target.db); + targetStateBefore = await getIModelState(target.db); const syncer = new IModelTransformer(source.db, target.db, { ...transformerOpts, @@ -560,7 +563,7 @@ export async function runTimeline( /* eslint-enable no-console */ } - target.state = getIModelState(target.db); // update the tracking state + target.state = await getIModelState(target.db); // update the tracking state if (!expectThrow) { if (!isForwardSync) @@ -579,7 +582,7 @@ export async function runTimeline( alreadySeenIModel.db.close(); alreadySeenIModel.db = await BriefcaseDb.open({ fileName }); } - alreadySeenIModel.state = getIModelState(alreadySeenIModel.db); + alreadySeenIModel.state = await getIModelState(alreadySeenIModel.db); stateMsg = `${iModelName} becomes: ${JSON.stringify( alreadySeenIModel.state @@ -620,7 +623,7 @@ export async function runTimeline( tearDown: async () => { for (const [, state] of trackedIModels) { state.db.close(); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: state.id, }); diff --git a/packages/transformer/src/test/standalone/BranchProvenanceInitializer.test.ts b/packages/transformer/src/test/standalone/BranchProvenanceInitializer.test.ts index 01d097337..60498585c 100644 --- a/packages/transformer/src/test/standalone/BranchProvenanceInitializer.test.ts +++ b/packages/transformer/src/test/standalone/BranchProvenanceInitializer.test.ts @@ -9,7 +9,6 @@ import { ExternalSourceAspect, ExternalSourceIsInRepository, IModelDb, - IModelHost, PhysicalModel, PhysicalObject, RepositoryLink, @@ -26,7 +25,6 @@ import { IModelTransformerTestUtils, } from "../IModelTransformerUtils"; import { - BriefcaseIdValue, Code, ExternalSourceProps, RepositoryLinkProps, @@ -391,9 +389,9 @@ async function classicalTransformerBranchInit( model: IModelDb.rootSubjectId, code: Code.createEmpty(), repository: new ExternalSourceIsInRepository(masterLinkRepoId), - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports connectorName: require("../../../../package.json").name, - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports connectorVersion: require("../../../../package.json").version, }) .insert(); @@ -422,14 +420,5 @@ async function classicalTransformerBranchInit( } function setToStandalone(iModelName: string) { - // eslint-disable-next-line deprecation/deprecation - const nativeDb = new IModelHost.platform.DgnDb(); - nativeDb.openIModel(iModelName, OpenMode.ReadWrite); - nativeDb.setITwinId(Guid.empty); // empty iTwinId means "standalone" - nativeDb.saveChanges(); // save change to iTwinId - nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId - nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned); // standalone iModels should always have BriefcaseId unassigned - nativeDb.saveLocalValue("StandaloneEdit", JSON.stringify({ txns: true })); - nativeDb.saveChanges(); // save change to briefcaseId - nativeDb.closeFile(); + StandaloneDb.convertToStandalone(iModelName); } diff --git a/packages/transformer/src/test/standalone/Catalog.test.ts b/packages/transformer/src/test/standalone/Catalog.test.ts index cfe07a993..2051a34d7 100644 --- a/packages/transformer/src/test/standalone/Catalog.test.ts +++ b/packages/transformer/src/test/standalone/Catalog.test.ts @@ -15,7 +15,6 @@ import { DrawingCategory, DrawingGraphic, DrawingModel, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementOwnsChildElements, @@ -39,7 +38,6 @@ import { import { IModelTestUtils } from "../TestUtils/IModelTestUtils"; import { KnownTestLocations as BackendKnownTestLocations } from "../TestUtils/KnownTestLocations"; import { - DbResult, Id64, Id64Set, Id64String, @@ -56,6 +54,7 @@ import { PhysicalElementProps, Placement2d, Placement3d, + QueryBinder, RepositoryLinkProps, SubCategoryAppearance, } from "@itwin/core-common"; @@ -605,19 +604,19 @@ async function createTestCatalog(dbFile: string): Promise { /** Mock how Component Center would index a catalog by writing out the hierarchy of the catalog as a markdown file. * @note A real implementation for Component Center would probably write the relevant data out to JSON instead. */ -function indexCatalog(db: IModelDb, outputFile: string): void { +async function indexCatalog(db: IModelDb, outputFile: string): Promise { IModelJsFs.writeFileSync(outputFile, `# ${db.rootSubject.name}\n`); if (db.rootSubject.description) { IModelJsFs.appendFileSync(outputFile, `${db.rootSubject.description}\n`); } - const containerIds = queryContainerIds(db); + const containerIds = await queryContainerIds(db); for (const containerId of containerIds) { const container = db.elements.getElement( containerId, DefinitionContainer ); IModelJsFs.appendFileSync(outputFile, `## ${container.code.value}\n`); - const templateRecipeIds = queryTemplateRecipeIds(db, containerId); + const templateRecipeIds = await queryTemplateRecipeIds(db, containerId); if (templateRecipeIds.size > 0) { IModelJsFs.appendFileSync(outputFile, "### TemplateRecipes\n"); for (const templateRecipeId of templateRecipeIds) { @@ -629,7 +628,10 @@ function indexCatalog(db: IModelDb, outputFile: string): void { outputFile, `#### ${templateRecipe.code.value}\n` ); - const typeDefinitionIds = queryTypeDefinitionIds(db, templateRecipeId); + const typeDefinitionIds = await queryTypeDefinitionIds( + db, + templateRecipeId + ); for (const typeDefinitionId of typeDefinitionIds) { const typeDefinition = db.elements.getElement( typeDefinitionId, @@ -643,7 +645,7 @@ function indexCatalog(db: IModelDb, outputFile: string): void { } } } - const groupIds = queryDefinitionGroupIds(db, containerId); + const groupIds = await queryDefinitionGroupIds(db, containerId); if (groupIds.size > 0) { IModelJsFs.appendFileSync(outputFile, "### DefinitionGroups\n"); for (const groupId of groupIds) { @@ -652,7 +654,7 @@ function indexCatalog(db: IModelDb, outputFile: string): void { DefinitionGroup ); IModelJsFs.appendFileSync(outputFile, `#### ${group.code.value}\n`); - const memberIds = queryDefinitionGroupMemberIds(db, groupId); + const memberIds = await queryDefinitionGroupMemberIds(db, groupId); for (const memberId of memberIds) { const templateRecipe = db.elements.getElement( @@ -728,52 +730,49 @@ function createContainerCode(codeSpecId: Id64String, codeValue: string): Code { /** Query for catalog-related DefinitionContainers. * @note The convention is to insert the catalog DefinitionContainer elements into the DictionaryModel, so this method only looks there. */ -function queryContainerIds(db: IModelDb): Id64Set { +async function queryContainerIds(db: IModelDb): Promise { const sql = `SELECT ECInstanceId FROM ${DefinitionContainer.classFullName} WHERE Model.Id=:modelId`; const containerIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindId("modelId", IModel.dictionaryId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - containerIds.add(statement.getValue(0).getId()); - } - }); + const params = new QueryBinder().bindId("modelId", IModel.dictionaryId); + for await (const row of db.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + containerIds.add(row.id); + } return containerIds; } /** Query for DefinitionGroups within a DefinitionContainer. * @note This is one way of grouping related TemplateRecipes together */ -function queryDefinitionGroupIds( +async function queryDefinitionGroupIds( db: IModelDb, containerId: Id64String -): Id64Set { +): Promise { const sql = `SELECT ECInstanceId FROM ${DefinitionGroup.classFullName} WHERE Model.Id=:modelId`; const groupIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindId("modelId", containerId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - groupIds.add(statement.getValue(0).getId()); - } - }); + const params = new QueryBinder().bindId("modelId", containerId); + for await (const row of db.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + groupIds.add(row.id); + } return groupIds; } /** Query for the members of a DefinitionGroup. */ -function queryDefinitionGroupMemberIds( +async function queryDefinitionGroupMemberIds( db: IModelDb, groupId: Id64String -): Id64Set { +): Promise { const sql = `SELECT TargetECInstanceId FROM ${DefinitionGroupGroupsDefinitions.classFullName} WHERE SourceECInstanceId=:groupId`; const memberIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindId("groupId", groupId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - memberIds.add(statement.getValue(0).getId()); - } - }); + const params = new QueryBinder().bindId("groupId", groupId); + for await (const row of db.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + memberIds.add(row[0] as Id64String); + } return memberIds; } @@ -827,77 +826,60 @@ function queryEquipmentTypeId( } /** Query for all TypeDefinitions that reference a particular template recipe. */ -function queryTypeDefinitionIds( +async function queryTypeDefinitionIds( db: IModelDb, templateRecipeId: Id64String -): Id64Set { +): Promise { const sql = `SELECT ECInstanceId FROM ${TypeDefinitionElement.classFullName} WHERE Recipe.Id=:templateRecipeId`; const typeDefinitionIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindId("templateRecipeId", templateRecipeId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - typeDefinitionIds.add(statement.getValue(0).getId()); - } - }); + const params = new QueryBinder().bindId("templateRecipeId", templateRecipeId); + for await (const row of db.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + typeDefinitionIds.add(row.id); + } return typeDefinitionIds; } /** Query for all template recipes in a particular model/container. */ -function queryTemplateRecipeIds( +async function queryTemplateRecipeIds( db: IModelDb, containerId: Id64String -): Id64Set { +): Promise { const sql = `SELECT ECInstanceId FROM ${RecipeDefinitionElement.classFullName} WHERE Model.Id=:modelId`; const templateRecipeIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindId("modelId", containerId); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - templateRecipeIds.add(statement.getValue(0).getId()); - } - }); + const params = new QueryBinder().bindId("modelId", containerId); + for await (const row of db.createQueryReader(sql, params, { + usePrimaryConn: true, + })) { + templateRecipeIds.add(row.id); + } return templateRecipeIds; } /** This mocks the concept of finding important/lead elements in the template recipe sub-model. * @note This is important for establishing relationships after placing cloned instances. */ -function queryEquipmentId( +async function queryEquipmentId( db: IModelDb, templateModelId: Id64String -): Id64String | undefined { +): Promise { const sql = "SELECT ECInstanceId FROM TestDomain:Equipment WHERE Model.Id=:modelId LIMIT 1"; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): Id64String | undefined => { - statement.bindId("modelId", templateModelId); - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getId() - : undefined; - } - ); + const params = new QueryBinder().bindId("modelId", templateModelId); + const reader = db.createQueryReader(sql, params, { usePrimaryConn: true }); + return (await reader.step()) ? reader.current.id : undefined; } -function countElementsInModel( +async function countElementsInModel( db: IModelDb, classFullName: string, modelId: Id64String -): number { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return db.withPreparedStatement( - `SELECT COUNT(*) FROM ${classFullName} WHERE Model.Id=:modelId`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): number => { - statement.bindId("modelId", modelId); - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getInteger() - : 0; - } - ); +): Promise { + const sql = `SELECT COUNT(*) FROM ${classFullName} WHERE Model.Id=:modelId`; + const params = new QueryBinder().bindId("modelId", modelId); + const reader = db.createQueryReader(sql, params, { usePrimaryConn: true }); + return (await reader.step()) ? reader.current[0] : 0; } /** Create a RepositoryLink for the catalog that will scope the provenance for elements imported from the catalog. */ @@ -976,7 +958,7 @@ class CatalogImporter extends IModelTransformer { } public async importDefinitionContainers(): Promise { - const containerIds = queryContainerIds(this.sourceDb); + const containerIds = await queryContainerIds(this.sourceDb); for (const containerId of containerIds) { await this.importDefinitionContainer(containerId); } @@ -1005,17 +987,17 @@ class CatalogImporter extends IModelTransformer { }); targetContainerId = this.targetDb.elements.queryElementIdByCode(targetContainerCode); - } catch (error) { + } catch { // catch NotFound error and continue } if (undefined === targetContainerId) { - this._remapSpatialCategories(); - this._remapDrawingCategories(); + await this._remapSpatialCategories(); + await this._remapDrawingCategories(); await this.exporter.exportElement(sourceContainerId); return this.exporter.exportModel(sourceContainerId); } } - private _remapSpatialCategories(): void { + private async _remapSpatialCategories(): Promise { if ( undefined === this._targetSpatialCategories || this._targetSpatialCategories.size === 0 @@ -1023,25 +1005,20 @@ class CatalogImporter extends IModelTransformer { return; } const sql = `SELECT ECInstanceId,CodeValue FROM ${SpatialCategory.classFullName}`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const sourceCategoryId = statement.getValue(0).getId(); - const sourceCategoryName = statement.getValue(1).getString(); - if (this._targetSpatialCategories!.has(sourceCategoryName)) { - const targetCategoryId = - this._targetSpatialCategories!.get(sourceCategoryName)!; - this.context.remapElement(sourceCategoryId, targetCategoryId); - this.importer.doNotUpdateElementIds.add(targetCategoryId); - } - } + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + const sourceCategoryId = row.id; + const sourceCategoryName = row[1]; + if (this._targetSpatialCategories.has(sourceCategoryName)) { + const targetCategoryId = + this._targetSpatialCategories.get(sourceCategoryName)!; + this.context.remapElement(sourceCategoryId, targetCategoryId); + this.importer.doNotUpdateElementIds.add(targetCategoryId); } - ); + } } - private _remapDrawingCategories(): void { + private async _remapDrawingCategories(): Promise { if ( undefined === this._targetDrawingCategories || this._targetDrawingCategories.size === 0 @@ -1049,23 +1026,18 @@ class CatalogImporter extends IModelTransformer { return; } const sql = `SELECT ECInstanceId,CodeValue FROM ${DrawingCategory.classFullName}`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - this.sourceDb.withPreparedStatement( - sql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const sourceCategoryId = statement.getValue(0).getId(); - const sourceCategoryName = statement.getValue(1).getString(); - if (this._targetDrawingCategories!.has(sourceCategoryName)) { - const targetCategoryId = - this._targetDrawingCategories!.get(sourceCategoryName)!; - this.context.remapElement(sourceCategoryId, targetCategoryId); - this.importer.doNotUpdateElementIds.add(targetCategoryId); - } - } + for await (const row of this.sourceDb.createQueryReader(sql, undefined, { + usePrimaryConn: true, + })) { + const sourceCategoryId = row.id; + const sourceCategoryName = row[1]; + if (this._targetDrawingCategories.has(sourceCategoryName)) { + const targetCategoryId = + this._targetDrawingCategories.get(sourceCategoryName)!; + this.context.remapElement(sourceCategoryId, targetCategoryId); + this.importer.doNotUpdateElementIds.add(targetCategoryId); } - ); + } } } @@ -1110,15 +1082,15 @@ describe("Catalog", () => { it("should index catalog", async () => { const acmeCatalogDb = SnapshotDb.openFile(acmeCatalogDbFile); - indexCatalog(acmeCatalogDb, `${acmeCatalogDb.pathName}.md`); + await indexCatalog(acmeCatalogDb, `${acmeCatalogDb.pathName}.md`); acmeCatalogDb.close(); const bestCatalogDb = SnapshotDb.openFile(bestCatalogDbFile); - indexCatalog(bestCatalogDb, `${bestCatalogDb.pathName}.md`); + await indexCatalog(bestCatalogDb, `${bestCatalogDb.pathName}.md`); bestCatalogDb.close(); const testCatalogDb = SnapshotDb.openFile(testCatalogDbFile); - indexCatalog(testCatalogDb, `${testCatalogDb.pathName}.md`); + await indexCatalog(testCatalogDb, `${testCatalogDb.pathName}.md`); testCatalogDb.close(); }); @@ -1167,7 +1139,7 @@ describe("Catalog", () => { { // import ACME Equipment catalog const catalogDb = SnapshotDb.openFile(acmeCatalogDbFile); - const catalogContainerIds = queryContainerIds(catalogDb); + const catalogContainerIds = await queryContainerIds(catalogDb); assert.equal(catalogContainerIds.size, 1); // expected value from createAcmeCatalog const catalogContainer = catalogDb.elements.getElement( @@ -1185,6 +1157,8 @@ describe("Catalog", () => { path.basename(acmeCatalogDbFile), acmeCatalogDbFile ); + + iModelDb.saveChanges(); const catalogImporter = await CatalogImporter.create( catalogDb, iModelDb, @@ -1237,7 +1211,7 @@ describe("Catalog", () => { queryEquipmentTypeId(iModelDb, importedContainerId, "A-301")! ) ); - const templateRecipeIds = queryTemplateRecipeIds( + const templateRecipeIds = await queryTemplateRecipeIds( iModelDb, importedContainerId ); @@ -1248,7 +1222,7 @@ describe("Catalog", () => { // import Best Equipment catalog const catalogDb = SnapshotDb.openFile(bestCatalogDbFile); assert.equal( - countElementsInModel( + await countElementsInModel( catalogDb, DefinitionContainer.classFullName, IModel.dictionaryId @@ -1256,17 +1230,18 @@ describe("Catalog", () => { 2 ); // expected value from createBestCatalog const catalogContainerSql = `SELECT ECInstanceId FROM ${DefinitionContainer.classFullName} WHERE CodeValue=:containerName LIMIT 1`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const catalogContainerId = catalogDb.withPreparedStatement( - catalogContainerSql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): Id64String => { - statement.bindString("containerName", "Best Product Line B"); - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getId() - : Id64.invalid; - } + const params = new QueryBinder().bindString( + "containerName", + "Best Product Line B" ); + const reader = catalogDb.createQueryReader(catalogContainerSql, params, { + usePrimaryConn: true, + }); + let catalogContainerId = Id64.invalid; + for await (const row of reader) { + catalogContainerId = row[0] as Id64String; + break; + } const catalogContainer = catalogDb.elements.getElement( catalogContainerId, @@ -1281,6 +1256,8 @@ describe("Catalog", () => { path.basename(bestCatalogDbFile), bestCatalogDbFile ); + + iModelDb.saveChanges(); const catalogImporter = await CatalogImporter.create( catalogDb, iModelDb, @@ -1328,7 +1305,7 @@ describe("Catalog", () => { queryEquipmentTypeId(iModelDb, importedContainerId, "B-304")! ) ); - const templateRecipeIds = queryTemplateRecipeIds( + const templateRecipeIds = await queryTemplateRecipeIds( iModelDb, importedContainerId ); @@ -1339,7 +1316,7 @@ describe("Catalog", () => { { // import test catalog const catalogDb = SnapshotDb.openFile(testCatalogDbFile); - const catalogContainerIds = queryContainerIds(catalogDb); + const catalogContainerIds = await queryContainerIds(catalogDb); assert.equal(catalogContainerIds.size, 1); // expected value from createTestCatalog const catalogContainer = catalogDb.elements.getElement( @@ -1357,7 +1334,8 @@ describe("Catalog", () => { path.basename(testCatalogDbFile), testCatalogDbFile ); - const catalogTemplateRecipeIds = queryTemplateRecipeIds( + iModelDb.saveChanges(); + const catalogTemplateRecipeIds = await queryTemplateRecipeIds( catalogDb, catalogContainer.id ); @@ -1398,14 +1376,14 @@ describe("Catalog", () => { testContainerId, DefinitionModel ); - const importedTemplateRecipeIds = queryTemplateRecipeIds( + const importedTemplateRecipeIds = await queryTemplateRecipeIds( iModelDb, testContainerId ); assert.equal(importedTemplateRecipeIds.size, 2); // excluded the "Cylinder" TemplateRecipe } - const importedContainerIds = queryContainerIds(iModelDb); + const importedContainerIds = await queryContainerIds(iModelDb); assert.equal( importedContainerIds.size, 3, @@ -1416,16 +1394,13 @@ describe("Catalog", () => { const componentPlacer = new TemplateModelCloner(iModelDb); const physicalTypeSql = `SELECT ECInstanceId FROM ${PhysicalType.classFullName}`; const physicalTypeIds = new Set(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - iModelDb.withPreparedStatement( + for await (const row of iModelDb.createQueryReader( physicalTypeSql, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): void => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - physicalTypeIds.add(statement.getValue(0).getId()); - } - } - ); + undefined, + { usePrimaryConn: true } + )) { + physicalTypeIds.add(row[0] as Id64String); + } let x = 0; for (const physicalTypeId of physicalTypeIds) { x += 5; @@ -1448,7 +1423,7 @@ describe("Catalog", () => { physicalModelId, placement ); - const templateEquipmentId = queryEquipmentId( + const templateEquipmentId = await queryEquipmentId( iModelDb, physicalType.recipe.id ); @@ -1537,7 +1512,11 @@ describe("Catalog", () => { Point2d.create(30, 30), ]; assert.equal( - countElementsInModel(iModelDb, DrawingGraphic.classFullName, drawingId), + await countElementsInModel( + iModelDb, + DrawingGraphic.classFullName, + drawingId + ), 0 ); for (const location of drawingGraphicLocations) { @@ -1549,7 +1528,11 @@ describe("Catalog", () => { ); } assert.equal( - countElementsInModel(iModelDb, DrawingGraphic.classFullName, drawingId), + await countElementsInModel( + iModelDb, + DrawingGraphic.classFullName, + drawingId + ), drawingGraphicLocations.length ); @@ -1580,7 +1563,7 @@ describe("Catalog", () => { await cloner.process(); cloner.dispose(); - const containerIds = queryContainerIds(targetDb); + const containerIds = await queryContainerIds(targetDb); assert.equal(containerIds.size, 1); containerIds.forEach((containerId) => { // assert that the cloned target contains the expected elements diff --git a/packages/transformer/src/test/standalone/ChangedInstanceIds.test.ts b/packages/transformer/src/test/standalone/ChangedInstanceIds.test.ts index 1410ac647..cb7e4d8f4 100644 --- a/packages/transformer/src/test/standalone/ChangedInstanceIds.test.ts +++ b/packages/transformer/src/test/standalone/ChangedInstanceIds.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import path = require("path"); +import * as path from "node:path"; import { KnownTestLocations } from "../TestUtils"; import { DocumentListModel, diff --git a/packages/transformer/src/test/standalone/ECReferenceTypesCache.test.ts b/packages/transformer/src/test/standalone/ECReferenceTypesCache.test.ts index 49619d3fc..83dd92436 100644 --- a/packages/transformer/src/test/standalone/ECReferenceTypesCache.test.ts +++ b/packages/transformer/src/test/standalone/ECReferenceTypesCache.test.ts @@ -11,7 +11,12 @@ import { Relationship, SnapshotDb } from "@itwin/core-backend"; import { IModelTestUtils } from "../TestUtils/IModelTestUtils"; import { KnownTestLocations as BackendTestsKnownLocations } from "../TestUtils/KnownTestLocations"; import * as Semver from "semver"; -import { Schema, SchemaItemType, SchemaLoader } from "@itwin/ecschema-metadata"; +import { + ECClass, + Schema, + SchemaItemType, + SchemaLoader, +} from "@itwin/ecschema-metadata"; import * as sinon from "sinon"; import { version as iTwinCoreBackendVersion } from "@itwin/core-backend/package.json"; @@ -57,7 +62,8 @@ describe("ECReferenceTypesCache", () => { testIModel.getSchemaProps(name) ); const schema = schemaLoader.getSchema("BisCore"); - for (const ecclass of schema.getClasses()) { + for (const ecclass of schema.getItems()) { + if (!ECClass.isECClass(ecclass)) continue; const unsupportedClassNames = [ "CodeSpec", "ElementDrivesElement", @@ -167,9 +173,14 @@ describe("ECReferenceTypesCache", () => { assert(bisVersionInSeed !== undefined); assert(Semver.gt(bisVersionInEmpty, bisVersionInSeed)); - expect(() => testIModel.getMetaData("BisCore:RenderTimeline")).not.to.throw; - expect(() => emptyWithBrandNewBiscore.getMetaData("BisCore:RenderTimeline")) - .to.throw; + expect(() => + testIModel.schemaContext.getSchemaItemSync("BisCore:RenderTimeline") + ).not.to.throw; + expect(() => + emptyWithBrandNewBiscore.schemaContext.getSchemaItemSync( + "BisCore:RenderTimeline" + ) + ).to.throw; await thisTestRefCache.initAllSchemasInIModel(testIModel); expect( @@ -228,9 +239,14 @@ describe("ECReferenceTypesCache", () => { assert(Semver.eq(bisVersionInEmpty1, bisVersionInEmpty2)); assert(Semver.gt(bisVersionInEmpty1, bisVersionInSeed)); - expect(() => testIModel.getMetaData("BisCore:RenderTimeline")).not.to.throw; - expect(() => emptyWithBrandNewBiscore.getMetaData("BisCore:RenderTimeline")) - .to.throw; + expect(() => + testIModel.schemaContext.getSchemaItemSync("BisCore:RenderTimeline") + ).not.to.throw; + expect(() => + emptyWithBrandNewBiscore.schemaContext.getSchemaItemSync( + "BisCore:RenderTimeline" + ) + ).to.throw; const initSchemaSpy = sinon.spy( thisTestRefCache, diff --git a/packages/transformer/src/test/standalone/GeoLocationTransform.test.ts b/packages/transformer/src/test/standalone/GeoLocationTransform.test.ts index bc9740586..986a17183 100644 --- a/packages/transformer/src/test/standalone/GeoLocationTransform.test.ts +++ b/packages/transformer/src/test/standalone/GeoLocationTransform.test.ts @@ -39,7 +39,7 @@ import { IModelTransformOptions, } from "../../IModelTransformer"; import { expect } from "chai"; -import sinon = require("sinon"); +import * as sinon from "sinon"; import { Logger } from "@itwin/core-bentley"; import { TransformerLoggerCategory } from "../../TransformerLoggerCategory"; diff --git a/packages/transformer/src/test/standalone/IModelCloneContext.test.ts b/packages/transformer/src/test/standalone/IModelCloneContext.test.ts index 35e417d2b..2175283e0 100644 --- a/packages/transformer/src/test/standalone/IModelCloneContext.test.ts +++ b/packages/transformer/src/test/standalone/IModelCloneContext.test.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { - ECSqlStatement, ElementRefersToElements, EntityReferences, GraphicalElement3dRepresentsElement, @@ -14,7 +13,7 @@ import { SnapshotDb, SpatialCategory, } from "@itwin/core-backend"; -import { DbResult, Id64, Id64String } from "@itwin/core-bentley"; +import { Id64, Id64String } from "@itwin/core-bentley"; import { Code, ConcreteEntityTypes, @@ -108,6 +107,10 @@ describe("IModelCloneContext", () => { relationshipsProps.forEach((props) => sourceDb.relationships.insertInstance(props) ); + + // Save changes to source DB to ensure relationships are persisted + sourceDb.saveChanges(); + // Target IModelDb const targetDbFile = IModelTransformerTestUtils.prepareOutputFile( "IModelTransformer", @@ -127,16 +130,13 @@ describe("IModelCloneContext", () => { JOIN bis.Element t ON t.ECInstanceId = r.TargetECInstanceId WHERE s.ECInstanceId IS NOT NULL AND t.ECInstanceId IS NOT NULL`; const sourceRelationshipIds: Id64String[] = []; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - sourceDb.withPreparedStatement(sql, (statement: ECSqlStatement) => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - sourceRelationshipIds.push(statement.getValue(0).getId()); - } - }); + for await (const row of sourceDb.createQueryReader(sql)) { + sourceRelationshipIds.push(row.id); + } let atLeastOneRelIdMissMatches = false; - sourceRelationshipIds.forEach((sourceRelId) => { + for (const sourceRelId of sourceRelationshipIds) { const targetRelId = EntityReferences.toId64( - transformer.context.findTargetEntityId( + await transformer.context.findTargetEntityId( EntityReferences.fromEntityType( sourceRelId, ConcreteEntityTypes.Relationship @@ -152,7 +152,7 @@ describe("IModelCloneContext", () => { if (!atLeastOneRelIdMissMatches) atLeastOneRelIdMissMatches = targetRelId !== sourceRelId; - }); + } /** * If this fails, then relationship ids match, and we don't really know if sourceDb and targetDb relationship ids differ. * It doesn't mean that functionality fails by itself. diff --git a/packages/transformer/src/test/standalone/IModelExporter.test.ts b/packages/transformer/src/test/standalone/IModelExporter.test.ts index c90b148ae..169e62fff 100644 --- a/packages/transformer/src/test/standalone/IModelExporter.test.ts +++ b/packages/transformer/src/test/standalone/IModelExporter.test.ts @@ -89,7 +89,7 @@ describe("IModelExporter", () => { }); class TestFlatImportHandler extends IModelExportHandler { - public override onExportElement(elem: Element): void { + public override async onExportElement(elem: Element): Promise { if (elem instanceof GeometryPart) flatTargetDb.elements.insertElement(elem.toJSON()); } @@ -182,11 +182,12 @@ describe("IModelExporter", () => { ); sourceDb.saveChanges(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const sourceRelationships = sourceDb.withStatement( - "SELECT ECInstanceId FROM bis.ElementRefersToElements", - (stmt) => [...stmt] - ); + const sourceRelationships = []; + for await (const row of sourceDb.createQueryReader( + "SELECT ECInstanceId FROM bis.ElementRefersToElements" + )) { + sourceRelationships.push(row); + } expect(sourceRelationships.length).to.be.equal(4); const targetDbFile = IModelTransformerTestUtils.prepareOutputFile( @@ -202,11 +203,12 @@ describe("IModelExporter", () => { exporter.exportRelationships(ElementRefersToElements.classFullName) ).to.eventually.be.fulfilled; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const targetRelationships = targetDb.withStatement( - "SELECT ECInstanceId FROM bis.ElementRefersToElements", - (stmt) => [...stmt] - ); + const targetRelationships = []; + for await (const row of targetDb.createQueryReader( + "SELECT ECInstanceId FROM bis.ElementRefersToElements" + )) { + targetRelationships.push(row); + } expect( targetRelationships.length, "TargetDb should not contain any invalid relationships" diff --git a/packages/transformer/src/test/standalone/IModelTransformer.test.ts b/packages/transformer/src/test/standalone/IModelTransformer.test.ts index 6f81cfe40..a8584773e 100644 --- a/packages/transformer/src/test/standalone/IModelTransformer.test.ts +++ b/packages/transformer/src/test/standalone/IModelTransformer.test.ts @@ -17,7 +17,6 @@ import { DrawingCategory, DrawingGraphic, DrawingModel, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementMultiAspect, @@ -35,7 +34,6 @@ import { Graphic3d, IModelDb, IModelElementCloneContext, - IModelHost, IModelJsFs, InformationRecordModel, InformationRecordPartition, @@ -76,7 +74,6 @@ import { } from "@itwin/core-bentley"; import { AxisAlignedBox3d, - BriefcaseIdValue, Code, CodeScopeSpec, CodeSpec, @@ -100,6 +97,7 @@ import { PhysicalElementProps, Placement3d, ProfileOptions, + QueryBinder, QueryRowFormat, RelatedElement, RelationshipProps, @@ -227,15 +225,15 @@ describe("IModelTransformer", () => { await TransformerExtensiveTestScenario.prepareTargetDb(targetDb); targetDb.saveChanges(); - const numSourceUniqueAspects = count( + const numSourceUniqueAspects = await count( sourceDb, ElementUniqueAspect.classFullName ); - const numSourceMultiAspects = count( + const numSourceMultiAspects = await count( sourceDb, ElementMultiAspect.classFullName ); - const numSourceRelationships = count( + const numSourceRelationships = await count( sourceDb, ElementRefersToElements.classFullName ); @@ -258,11 +256,16 @@ describe("IModelTransformer", () => { "==============" ); const targetImporter = new RecordingIModelImporter(targetDb); - const transformer = new TestIModelTransformer(sourceDb, targetImporter, { - forceExternalSourceAspectProvenance: true, - }); + const transformer = await TestIModelTransformer.create( + sourceDb, + targetImporter, + { + forceExternalSourceAspectProvenance: true, + } + ); assert.isTrue(transformer.context.isBetweenIModels); await transformer.process(); + targetDb.saveChanges(); assert.isAtLeast(targetImporter.numModelsInserted, 1); assert.equal(targetImporter.numModelsUpdated, 0); assert.isAtLeast(targetImporter.numElementsInserted, 1); @@ -273,33 +276,35 @@ describe("IModelTransformer", () => { assert.isAtLeast(targetImporter.numRelationshipsInserted, 1); assert.equal(targetImporter.numRelationshipsUpdated, 0); assert.isAtLeast( - count(targetDb, ElementRefersToElements.classFullName), + await count(targetDb, ElementRefersToElements.classFullName), 1 ); assert.isAtLeast( - count(targetDb, InformationRecordPartition.classFullName), + await count(targetDb, InformationRecordPartition.classFullName), 1 ); assert.isAtLeast( - count(targetDb, InformationRecordModel.classFullName), + await count(targetDb, InformationRecordModel.classFullName), 1 ); assert.isAtLeast( - count( + await count( targetDb, "ExtensiveTestScenarioTarget:PhysicalPartitionIsTrackedByRecords" ), 1 ); assert.isAtLeast( - count(targetDb, "ExtensiveTestScenarioTarget:AuditRecord"), + await count(targetDb, "ExtensiveTestScenarioTarget:AuditRecord"), 1 ); assert.equal( 3, - count(targetDb, "ExtensiveTestScenarioTarget:TargetInformationRecord") + await count( + targetDb, + "ExtensiveTestScenarioTarget:TargetInformationRecord" + ) ); - targetDb.saveChanges(); TransformerExtensiveTestScenario.assertTargetDbContents( sourceDb, targetDb, @@ -309,20 +314,20 @@ describe("IModelTransformer", () => { transformer.dispose(); } - const numTargetElements = count(targetDb, Element.classFullName); - const numTargetUniqueAspects = count( + const numTargetElements = await count(targetDb, Element.classFullName); + const numTargetUniqueAspects = await count( targetDb, ElementUniqueAspect.classFullName ); - const numTargetMultiAspects = count( + const numTargetMultiAspects = await count( targetDb, ElementMultiAspect.classFullName ); - const numTargetExternalSourceAspects = count( + const numTargetExternalSourceAspects = await count( targetDb, ExternalSourceAspect.classFullName ); - const numTargetRelationships = count( + const numTargetRelationships = await count( targetDb, ElementRefersToElements.classFullName ); @@ -372,9 +377,13 @@ describe("IModelTransformer", () => { "=================" ); const targetImporter = new RecordingIModelImporter(targetDb); - const transformer = new TestIModelTransformer(sourceDb, targetImporter, { - forceExternalSourceAspectProvenance: true, - }); + const transformer = await TestIModelTransformer.create( + sourceDb, + targetImporter, + { + forceExternalSourceAspectProvenance: true, + } + ); await transformer.process(); assert.equal(targetImporter.numModelsInserted, 0); assert.equal(targetImporter.numModelsUpdated, 0); @@ -390,80 +399,25 @@ describe("IModelTransformer", () => { // assert.equal(numTargetElements, count(targetDb, Element.classFullName), "Second import should not add elements"); assert.equal( numTargetExternalSourceAspects, - count(targetDb, ExternalSourceAspect.classFullName), + await count(targetDb, ExternalSourceAspect.classFullName), "Second import should not add aspects" ); assert.equal( numTargetRelationships, - count(targetDb, ElementRefersToElements.classFullName), + await count(targetDb, ElementRefersToElements.classFullName), "Second import should not add relationships" ); assert.equal( 3, - count(sourceDb, "ExtensiveTestScenario:SourceInformationRecord") + await count(sourceDb, "ExtensiveTestScenario:SourceInformationRecord") ); assert.equal( 3, - count(targetDb, "ExtensiveTestScenarioTarget:TargetInformationRecord") - ); - transformer.dispose(); - } - - if (true) { - // update source db, then import again - TransformerExtensiveTestScenario.updateDb(sourceDb); - sourceDb.saveChanges(); - Logger.logInfo(TransformerLoggerCategory.IModelTransformer, ""); - Logger.logInfo( - TransformerLoggerCategory.IModelTransformer, - "===============================" - ); - Logger.logInfo( - TransformerLoggerCategory.IModelTransformer, - "Reimport after sourceDb update" - ); - Logger.logInfo( - TransformerLoggerCategory.IModelTransformer, - "===============================" - ); - const targetImporter = new RecordingIModelImporter(targetDb); - const transformer = new TestIModelTransformer(sourceDb, targetImporter, { - forceExternalSourceAspectProvenance: true, - }); - await transformer.process(); - assert.equal(targetImporter.numModelsInserted, 0); - assert.equal(targetImporter.numModelsUpdated, 0); - assert.equal(targetImporter.numElementsInserted, 1); - assert.equal(targetImporter.numElementsUpdated, 33); - /** - * There are 5 elements deleted in TransformerExtensiveTestScenario.updateDb, but only 4 detected. - * This is because PhysicalObject6's code is scoped to PhysicalObject5. When PhysicalObject5 is deleted, PhysicalObject6 is also deleted in the superclasses - * of the RecordingIModelImporter and therefore can't be detected by the RecordingIModelImporter. - * The deletion of PhysicalObject6 is asserted in [[TransformerExtensiveTestScenario.assertUpdatesInDb]] when assertDeletes is true. - */ - assert.equal(targetImporter.numElementsExplicitlyDeleted, 4); - assert.equal(targetImporter.numElementAspectsInserted, 0); - assert.equal(targetImporter.numElementAspectsUpdated, 2); - assert.equal(targetImporter.numRelationshipsInserted, 2); - assert.equal(targetImporter.numRelationshipsUpdated, 1); - - assert.equal(targetImporter.numRelationshipsDeleted, 1); - targetDb.saveChanges(); - TransformerExtensiveTestScenario.assertUpdatesInDb(targetDb, true); - - assert.equal( - numTargetRelationships + - targetImporter.numRelationshipsInserted - - targetImporter.numRelationshipsDeleted, - count(targetDb, ElementRefersToElements.classFullName) + await count( + targetDb, + "ExtensiveTestScenarioTarget:TargetInformationRecord" + ) ); - // We deleted one of the 3 SourceInformationRecords in TransformerExtensiveTestScenario.updateDb, so expect to find 2 now. - expect( - count(targetDb, "ExtensiveTestScenarioTarget:TargetInformationRecord") - ).to.equal(2); - expect( - count(sourceDb, "ExtensiveTestScenario:SourceInformationRecord") - ).to.equal(2); transformer.dispose(); } @@ -491,19 +445,22 @@ describe("IModelTransformer", () => { createClassViews: true, }); - const numMasterElements = count(masterDb, Element.classFullName); - const numMasterRelationships = count( + const numMasterElements = await count(masterDb, Element.classFullName); + const numMasterRelationships = await count( masterDb, ElementRefersToElements.classFullName ); assert.isAtLeast(numMasterElements, 12); assert.isAtLeast(numMasterRelationships, 1); - assert.equal(numMasterElements, count(branchDb, Element.classFullName)); + assert.equal( + numMasterElements, + await count(branchDb, Element.classFullName) + ); assert.equal( numMasterRelationships, - count(branchDb, ElementRefersToElements.classFullName) + await count(branchDb, ElementRefersToElements.classFullName) ); - assert.equal(0, count(branchDb, ExternalSourceAspect.classFullName)); + assert.equal(0, await count(branchDb, ExternalSourceAspect.classFullName)); // Ensure that master to branch synchronization did not add any new Elements or Relationships, but did add ExternalSourceAspects const masterToBranchTransformer = new IModelTransformer( @@ -514,32 +471,35 @@ describe("IModelTransformer", () => { await masterToBranchTransformer.process(); masterToBranchTransformer.dispose(); branchDb.saveChanges(); - assert.equal(numMasterElements, count(branchDb, Element.classFullName)); + assert.equal( + numMasterElements, + await count(branchDb, Element.classFullName) + ); assert.equal( numMasterRelationships, - count(branchDb, ElementRefersToElements.classFullName) + await count(branchDb, ElementRefersToElements.classFullName) ); - assert.equal(count(branchDb, ExternalSourceAspect.classFullName), 1); // provenance aspect added for target scope element + assert.equal(await count(branchDb, ExternalSourceAspect.classFullName), 1); // provenance aspect added for target scope element // Confirm that provenance (captured in ExternalSourceAspects) was set correctly const sql = `SELECT aspect.Identifier,aspect.Element.Id FROM ${ExternalSourceAspect.classFullName} aspect WHERE aspect.Kind=:kind`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - branchDb.withPreparedStatement(sql, (statement: ECSqlStatement): void => { - statement.bindString("kind", ExternalSourceAspect.Kind.Element); - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const masterElementId = statement.getValue(0).getString(); // ExternalSourceAspect.Identifier is of type string - const branchElementId = statement.getValue(1).getId(); - assert.equal(masterElementId, branchElementId); - } - }); + const params = new QueryBinder().bindString( + "kind", + ExternalSourceAspect.Kind.Element + ); + for await (const row of branchDb.createQueryReader(sql, params)) { + const masterElementId = row[0]; + const branchElementId = row[1]; + assert.equal(masterElementId, branchElementId); + } // Make changes to simulate working on the branch TransformerExtensiveTestScenario.updateDb(branchDb); TransformerExtensiveTestScenario.assertUpdatesInDb(branchDb); branchDb.saveChanges(); - const numBranchElements = count(branchDb, Element.classFullName); - const numBranchRelationships = count( + const numBranchElements = await count(branchDb, Element.classFullName); + const numBranchRelationships = await count( branchDb, ElementRefersToElements.classFullName ); @@ -556,28 +516,27 @@ describe("IModelTransformer", () => { branchToMasterTransformer.dispose(); masterDb.saveChanges(); TransformerExtensiveTestScenario.assertUpdatesInDb(masterDb, false); - assert.equal(numBranchElements, count(masterDb, Element.classFullName) - 5); // processAll cannot detect deletes when isReverseSynchronization=true + assert.equal( + numBranchElements, + (await count(masterDb, Element.classFullName)) - 5 + ); // processAll cannot detect deletes when isReverseSynchronization=true assert.equal( numBranchRelationships, - count(masterDb, ElementRefersToElements.classFullName) - 1 + (await count(masterDb, ElementRefersToElements.classFullName)) - 1 ); // processAll cannot detect deletes when isReverseSynchronization=true - assert.equal(0, count(masterDb, ExternalSourceAspect.classFullName)); + assert.equal(0, await count(masterDb, ExternalSourceAspect.classFullName)); masterDb.close(); branchDb.close(); }); - function count(iModelDb: IModelDb, classFullName: string): number { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return iModelDb.withPreparedStatement( - `SELECT COUNT(*) FROM ${classFullName}`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement): number => { - return DbResult.BE_SQLITE_ROW === statement.step() - ? statement.getValue(0).getInteger() - : 0; - } - ); + async function count( + iModelDb: IModelDb, + classFullName: string + ): Promise { + const sql = `SELECT COUNT(*) FROM ${classFullName}`; + const reader = iModelDb.createQueryReader(sql); + return (await reader.step()) ? reader.current[0] : 0; } it("should import everything below a Subject", async () => { @@ -613,7 +572,7 @@ describe("IModelTransformer", () => { assert.isTrue(Id64.isValidId64(targetSubjectId)); targetDb.saveChanges(); // Import from beneath source Subject into target Subject - const transformer = new TestIModelTransformer(sourceDb, targetDb); + const transformer = await TestIModelTransformer.create(sourceDb, targetDb); await transformer.processFonts(); await transformer.processSubject(sourceSubjectId, targetSubjectId); await transformer.processRelationships( @@ -641,7 +600,7 @@ describe("IModelTransformer", () => { "CompatibilityTestSeed.bim" ); const sourceDb = SnapshotDb.openFile(sourceFileName); - const numSourceElements = count(sourceDb, Element.classFullName); + const numSourceElements = await count(sourceDb, Element.classFullName); assert.exists(sourceDb); assert.isAtLeast(numSourceElements, 12); // create target iModel @@ -667,8 +626,9 @@ describe("IModelTransformer", () => { const transformer = new IModelTransformer(sourceDb, targetDb); await transformer.processSchemas(); await transformer.process(); + targetDb.saveChanges(); transformer.dispose(); - const numTargetElements = count(targetDb, Element.classFullName); + const numTargetElements = await count(targetDb, Element.classFullName); assert.isAtLeast(numTargetElements, numSourceElements); assert.deepEqual(sourceDb.ecefLocation, targetDb.ecefLocation); // clean up @@ -753,7 +713,7 @@ describe("IModelTransformer", () => { targetDb.saveChanges(); // verify target contents - assert.equal(1, count(sourceDb, RepositoryLink.classFullName)); + assert.equal(1, await count(sourceDb, RepositoryLink.classFullName)); const targetRepositoryId = targetDb.elements.queryElementIdByCode( LinkElement.createCode(targetDb, IModel.repositoryModelId, "master.dgn") )!; @@ -871,6 +831,8 @@ describe("IModelTransformer", () => { sourceDb.models.getModel(sourceModelId); const sourceModelExtents: AxisAlignedBox3d = sourceModel.queryExtents(); assert.deepEqual(sourceModelExtents, new Range3d(1, 0, 0, 10, 9, 1)); + + sourceDb.saveChanges(); // create target iModel const targetDbFile: string = IModelTransformerTestUtils.prepareOutputFile( "IModelTransformer", @@ -950,9 +912,9 @@ describe("IModelTransformer", () => { }; const sourceElementId21 = sourceDb.elements.insertElement(elementProps21); sourceDb.saveChanges(); - assert.equal(count(sourceDb, PhysicalPartition.classFullName), 2); - assert.equal(count(sourceDb, PhysicalModel.classFullName), 2); - assert.equal(count(sourceDb, PhysicalObject.classFullName), 2); + assert.equal(await count(sourceDb, PhysicalPartition.classFullName), 2); + assert.equal(await count(sourceDb, PhysicalModel.classFullName), 2); + assert.equal(await count(sourceDb, PhysicalObject.classFullName), 2); const targetDbFile: string = IModelTransformerTestUtils.prepareOutputFile( "IModelTransformer", @@ -991,9 +953,9 @@ describe("IModelTransformer", () => { "PhysicalModel-Combined", "Original CodeValue should be retained" ); - assert.equal(count(targetDb, PhysicalPartition.classFullName), 1); - assert.equal(count(targetDb, PhysicalModel.classFullName), 1); - assert.equal(count(targetDb, PhysicalObject.classFullName), 2); + assert.equal(await count(targetDb, PhysicalPartition.classFullName), 1); + assert.equal(await count(targetDb, PhysicalModel.classFullName), 1); + assert.equal(await count(targetDb, PhysicalObject.classFullName), 2); transformer.dispose(); sourceDb.close(); @@ -1397,7 +1359,7 @@ describe("IModelTransformer", () => { Subject.createCode(iModelA, IModel.rootSubjectId, "Context") ); assert.isDefined(excludedId); - iModelExporterA.excludeElement(excludedId!); + iModelExporterA.excludeElement(excludedId); const subjectId: Id64String = IModelTransformerTestUtils.querySubjectId( iModelShared, @@ -1441,7 +1403,7 @@ describe("IModelTransformer", () => { // Collect actual ids assert.isDefined(unresolvedElementMessage); - const actualIds = unresolvedElementMessage! + const actualIds = unresolvedElementMessage .split(messageStart)[1] .split(messageEnd)[0] .split(","); @@ -1514,7 +1476,7 @@ describe("IModelTransformer", () => { assert.throws(() => cloneContext.remapCodeSpec("SourceNotFound", "TargetNotFound") ); - cloneContext.dispose(); + cloneContext[Symbol.dispose](); iModelDb.close(); }); @@ -1583,22 +1545,22 @@ describe("IModelTransformer", () => { this.iModelExporter = new IModelExporter(iModelDb); this.iModelExporter.registerHandler(this); } - public override onExportModel( + public override async onExportModel( _model: Model, _isUpdate: boolean | undefined - ): void { + ): Promise { ++this.modelCount; } - public override onExportElement( + public override async onExportElement( _element: Element, _isUpdate: boolean | undefined - ): void { + ): Promise { assert.fail("Should not visit element when visitElements=false"); } - public override onExportRelationship( + public override async onExportRelationship( _relationship: Relationship, _isUpdate: boolean | undefined - ): void { + ): Promise { assert.fail( "Should not visit relationship when visitRelationship=false" ); @@ -1793,7 +1755,7 @@ describe("IModelTransformer", () => { }); targetDb.updateProjectExtents(sourceDb.projectExtents); - const transformer = new FilterByViewTransformer( + const transformer = await FilterByViewTransformer.create( sourceDb, targetDb, exportViewId @@ -2179,16 +2141,7 @@ describe("IModelTransformer", () => { // for testing purposes only, based on SetToStandalone.ts, force a snapshot to mimic a standalone iModel function setToStandalone(iModelName: string) { - // eslint-disable-next-line deprecation/deprecation - const nativeDb = new IModelHost.platform.DgnDb(); - nativeDb.openIModel(iModelName, OpenMode.ReadWrite); - nativeDb.setITwinId(Guid.empty); // empty iTwinId means "standalone" - nativeDb.saveChanges(); // save change to iTwinId - nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId - nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned); // standalone iModels should always have BriefcaseId unassigned - nativeDb.saveLocalValue("StandaloneEdit", JSON.stringify({ txns: true })); - nativeDb.saveChanges(); // save change to briefcaseId - nativeDb.closeFile(); + StandaloneDb.convertToStandalone(iModelName); } it("biscore update is valid", async () => { @@ -2259,10 +2212,13 @@ describe("IModelTransformer", () => { "0xe", // id of realityDataSourcesModel ]); const result: Record = {}; - // eslint-disable-next-line deprecation/deprecation - for await (const row of db.query("SELECT * FROM bis.Element", undefined, { - rowFormat: QueryRowFormat.UseJsPropertyNames, - })) { + for await (const row of db.createQueryReader( + "SELECT * FROM bis.Element", + undefined, + { + rowFormat: QueryRowFormat.UseJsPropertyNames, + } + )) { if (!filterPredicate || filterPredicate(db.elements.getElement(row.id))) { const { lastMod: _lastMod, ...invariantPortion } = row; if (ignoreFedGuidElementIds.has(row.id)) @@ -2279,15 +2235,14 @@ describe("IModelTransformer", () => { filterPredicate?: (rel: { sourceId: string; targetId: string }) => boolean ): Promise<{ sourceId: Id64String; targetId: Id64String }[]> { const result = []; - // eslint-disable-next-line deprecation/deprecation - for await (const row of db.query( + for await (const row of db.createQueryReader( "SELECT * FROM bis.ElementRefersToElements", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames } )) { - if (!filterPredicate || filterPredicate(row)) { - const { id: _id, ...invariantPortion } = row; - result.push(invariantPortion); + const { sourceId, targetId } = row; + if (!filterPredicate || filterPredicate({ sourceId, targetId })) { + result.push({ sourceId, targetId }); } } return result; @@ -2444,11 +2399,15 @@ describe("IModelTransformer", () => { } class FilterCategoryTransformer extends IModelTransformer { - public override shouldExportElement(elem: Element): boolean { + public override async shouldExportElement( + elem: Element + ): Promise { if (!filterCategoryTransformationPredicate(elem)) return false; return super.shouldExportElement(elem); } - public override shouldExportRelationship(rel: Relationship): boolean { + public override async shouldExportRelationship( + rel: Relationship + ): Promise { if (!filterRelationshipsToChangeIds(rel)) return false; return super.shouldExportRelationship(rel); } @@ -2965,8 +2924,7 @@ describe("IModelTransformer", () => { // insert an unrelated element that uses same id as subject1 // insertElement public api does not support forceUseId option - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const targetSubjectId3 = targetDb.nativeDb.insertElement( + const targetSubjectId3 = targetDb.elements.insertElement( newPropsForSubject3, { forceUseId: true } ); @@ -3190,23 +3148,25 @@ describe("IModelTransformer", () => { targetDb.saveChanges(); - const targetExternalSourceAspects = new Array(); - const targetMyUniqueAspects = new Array(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withStatement("SELECT * FROM bis.ExternalSourceAspect", (stmt) => - targetExternalSourceAspects.push(...stmt) - ); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withStatement("SELECT * FROM TestSchema1.MyUniqueAspect", (stmt) => - targetMyUniqueAspects.push(...stmt) - ); + const targetExternalSourceAspects: any[] = []; + const targetMyUniqueAspects: any[] = []; + for await (const row of targetDb.createQueryReader( + "SELECT * FROM bis.ExternalSourceAspect" + )) { + targetExternalSourceAspects.push(row.toRow()); + } + for await (const row of targetDb.createQueryReader( + "SELECT * FROM TestSchema1.MyUniqueAspect" + )) { + targetMyUniqueAspects.push(row.toRow()); + } expect(targetMyUniqueAspects).to.have.lengthOf(1); - expect(targetMyUniqueAspects[0].myProp1).to.equal( + expect(targetMyUniqueAspects[0].MyProp1).to.equal( uniqueAspectProps.myProp1 ); expect(targetExternalSourceAspects).to.have.lengthOf(1); - expect(targetExternalSourceAspects[0].identifier).to.equal( + expect(targetExternalSourceAspects[0].Identifier).to.equal( multiAspectProps.identifier ); @@ -3271,6 +3231,8 @@ describe("IModelTransformer", () => { code: Code.createEmpty(), } as ElementProps); + sourceDb.saveChanges(); + const targetDbPath = IModelTransformerTestUtils.prepareOutputFile( "IModelTransformer", "GeneratedNavPropReferences-Target.bim" @@ -3310,19 +3272,22 @@ describe("IModelTransformer", () => { targetDb.saveChanges(); - function getNavPropContent(db: IModelDb) { - let results = new Array<{ id: Id64String; navProp: RelatedElement }>(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement( - "SELECT ECInstanceId, navProp FROM TestGeneratedClasses.TestElementWithNavProp", - (stmt) => { - results = [...stmt]; - } - ); + async function getNavPropContent(db: IModelDb) { + const results: Array<{ id: Id64String; navProp: RelatedElement }> = []; + for await (const row of db.createQueryReader( + "SELECT ECInstanceId, navProp FROM TestGeneratedClasses.TestElementWithNavProp" + )) { + // eslint-disable-next-line @typescript-eslint/naming-convention + const navPropRaw = row[1] as { Id: Id64String }; + results.push({ + id: row[0] as Id64String, + navProp: RelatedElement.fromJSON({ id: navPropRaw.Id })!, + }); + } return results; } - for (const navPropHolderInSource of getNavPropContent(sourceDb)) { + for (const navPropHolderInSource of await getNavPropContent(sourceDb)) { const navPropHolderInTargetId = transformer.context.findTargetElementId( navPropHolderInSource.id ); @@ -3342,8 +3307,8 @@ describe("IModelTransformer", () => { expect((navPropHolderInTarget as any)?.navProp?.id).not.to.be.undefined; } - expect(getNavPropContent(sourceDb)).to.have.length(1); - expect(getNavPropContent(targetDb)).to.have.length(1); + expect(await getNavPropContent(sourceDb)).to.have.length(1); + expect(await getNavPropContent(targetDb)).to.have.length(1); sourceDb.close(); targetDb.close(); @@ -3490,11 +3455,12 @@ describe("IModelTransformer", () => { targetDb.saveChanges(); - const targetRelationships = new Array(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withStatement("SELECT * FROM ts1.MyElemRefersToElem", (stmt) => - targetRelationships.push(...stmt) - ); + const targetRelationships: any[] = []; + for await (const row of targetDb.createQueryReader( + "SELECT * FROM ts1.MyElemRefersToElem" + )) { + targetRelationships.push(row.toRow()); + } expect(targetRelationships).to.have.lengthOf(1); expect(targetRelationships[0].prop).to.equal(relProps.prop); @@ -4006,8 +3972,6 @@ describe("IModelTransformer", () => { { sourceDb: newDb, targetSeed: oldDb, doUpgrade: false }, ] as const; - /* eslint-disable @typescript-eslint/indent */ - /* eslint-disable @typescript-eslint/indent */ for (const sourceDb of sourceDbs) for (const targetSeed of targetSeeds) for (const doUpgrade of doUpgradeVariants) { @@ -4115,7 +4079,7 @@ describe("IModelTransformer", () => { initialCodeValue: string ) => db.withSqliteStatement( - `UPDATE bis_Element SET CodeValue='${initialCodeValue}\xa0' WHERE CodeValue='${initialCodeValue}'`, + `UPDATE bis_Element SET CodeValue='${initialCodeValue}${nbsp}' WHERE CodeValue='${initialCodeValue}'`, (s) => { let result: DbResult; while ((result = s.step()) === DbResult.BE_SQLITE_ROW) {} @@ -4143,22 +4107,20 @@ describe("IModelTransformer", () => { ); }; - const getCodeValEcSql = ( + const getCodeValEcSql = async ( db: IModelDb, args: { initialVal: string; expected: string; expectedMatchCount: number } ) => { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withStatement( + let rows = 0; + for await (const row of db.createQueryReader( `SELECT CodeValue FROM bis.Element WHERE CodeValue LIKE '${args.initialVal}%'`, - (stmt) => { - let rows = 0; - for (const { codeValue } of stmt) { - rows++; - expect(codeValue).to.equal(args.expected); - } - expect(rows).to.equal(args.expectedMatchCount); - } - ); + undefined, + { usePrimaryConn: true } + )) { + rows++; + expect(row.codeValue).to.equal(args.expected); + } + expect(rows).to.equal(args.expectedMatchCount); }; // eslint-disable-next-line @typescript-eslint/no-shadow @@ -4169,12 +4131,12 @@ describe("IModelTransformer", () => { ] as const) { getCodeValRawSqlite(sourceDb, { initialVal, - expected: `${initialVal}\xa0`, + expected: `${initialVal}${nbsp}`, expectedMatchCount, }); - getCodeValEcSql(sourceDb, { + await getCodeValEcSql(sourceDb, { initialVal, - expected: `${initialVal}\xa0`, + expected: `${initialVal}${nbsp}`, expectedMatchCount, }); } @@ -4191,12 +4153,12 @@ describe("IModelTransformer", () => { ] as const) { getCodeValRawSqlite(sourceDb, { initialVal, - expected: `${initialVal}\xa0`, + expected: `${initialVal}${nbsp}`, expectedMatchCount, }); - getCodeValEcSql(sourceDb, { + await getCodeValEcSql(sourceDb, { initialVal, - expected: `${initialVal}\xa0`, + expected: `${initialVal}${nbsp}`, expectedMatchCount, }); } @@ -4240,20 +4202,17 @@ describe("IModelTransformer", () => { ["PhysicalModel", 1], ["PhysicalObject", 1], ] as const) { - // some versions of itwin.js do not have a code path for the transformer to preserve bad codes - const inITwinJsVersionWithExactCodeFeature = Semver.satisfies( - coreBackendPkgJson.version, - "^3.0.0 || ^4.1.1" - ); - const expected = inITwinJsVersionWithExactCodeFeature - ? `${initialVal}\xa0` - : initialVal; + const expected = `${initialVal}${nbsp}`; getCodeValRawSqlite(targetDb, { initialVal, expected, expectedMatchCount, }); - getCodeValEcSql(targetDb, { initialVal, expected, expectedMatchCount }); + await getCodeValEcSql(targetDb, { + initialVal, + expected, + expectedMatchCount, + }); } transformer.dispose(); @@ -4365,190 +4324,6 @@ describe("IModelTransformer", () => { targetDb.close(); }); - it("detect element deletes works on children", async () => { - const sourceDbFile: string = IModelTransformerTestUtils.prepareOutputFile( - "IModelTransformer", - "DetectElemDeletesChildren.bim" - ); - const sourceDb = SnapshotDb.createEmpty(sourceDbFile, { - rootSubject: { name: "DetectElemDeletes" }, - }); - const model = PhysicalModel.insert( - sourceDb, - IModelDb.rootSubjectId, - "Model 1" - ); - const category = SpatialCategory.insert( - sourceDb, - IModel.dictionaryId, - "TestCategory", - {} - ); - const obj = new PhysicalObject( - { - code: Code.createEmpty(), - model, - category, - classFullName: PhysicalObject.classFullName, - }, - sourceDb - ); - obj.insert(); - - sourceDb.saveChanges(); - - const targetDbFile = IModelTransformerTestUtils.prepareOutputFile( - "IModelTransformer", - "DetectElemDeletesChildrenTarget.bim" - ); - const targetDb = SnapshotDb.createEmpty(targetDbFile, { - rootSubject: { name: "Combined Model" }, - }); - - const transformer = new IModelTransformer(sourceDb, targetDb, { - forceExternalSourceAspectProvenance: true, - }); - await expect(transformer.process()).not.to.be.rejected; - targetDb.saveChanges(); - const modelInTarget = transformer.context.findTargetElementId(model); - const objInTarget = transformer.context.findTargetElementId(obj.id); - - // delete from source for detectElementDeletes to handle - sourceDb.elements.deleteElement(obj.id); - sourceDb.models.deleteModel(model); - sourceDb.elements.deleteElement(model); - - expect(sourceDb.models.tryGetModel(model)).to.be.undefined; - expect(sourceDb.elements.tryGetElement(model)).to.be.undefined; - expect(sourceDb.elements.tryGetElement(obj)).to.be.undefined; - - sourceDb.saveChanges(); - - await expect(transformer.process()).not.to.be.rejected; - targetDb.saveChanges(); - - expect(sourceDb.models.tryGetModel(modelInTarget)).to.be.undefined; - expect(targetDb.elements.tryGetElement(modelInTarget)).to.be.undefined; - expect(targetDb.elements.tryGetElement(objInTarget)).to.be.undefined; - - transformer.dispose(); - sourceDb.close(); - targetDb.close(); - }); - - it("detect elements deletes skips elements where Identifier is not id", async () => { - const sourceDbFile = IModelTransformerTestUtils.prepareOutputFile( - "IModelTransformer", - "SourceProvenance.bim" - ); - const sourceDb = SnapshotDb.createEmpty(sourceDbFile, { - rootSubject: { name: "Source Provenance Test" }, - }); - const sourceRepositoryId = IModelTransformerTestUtils.insertRepositoryLink( - sourceDb, - "master.dgn", - "https://test.bentley.com/folder/master.dgn", - "DGN" - ); - const sourceExternalSourceId = - IModelTransformerTestUtils.insertExternalSource( - sourceDb, - sourceRepositoryId, - "Default Model" - ); - const sourceCategoryId = SpatialCategory.insert( - sourceDb, - IModel.dictionaryId, - "SpatialCategory", - { color: ColorDef.green.toJSON() } - ); - const sourceModelId = PhysicalModel.insert( - sourceDb, - IModel.rootSubjectId, - "Physical" - ); - const sourcePhysicalObjectsToSkip = new Set(); - for (const x of [1, 2, 3]) { - const physicalObjectProps: PhysicalElementProps = { - classFullName: PhysicalObject.classFullName, - model: sourceModelId, - category: sourceCategoryId, - code: Code.createEmpty(), - }; - const physicalObjectId = - sourceDb.elements.insertElement(physicalObjectProps); - sourcePhysicalObjectsToSkip.add(physicalObjectId); - const externalSourceAspects: ExternalSourceAspectProps = { - classFullName: ExternalSourceAspect.classFullName, - element: { - id: physicalObjectId, - relClassName: ElementOwnsExternalSourceAspects.classFullName, - }, - scope: { id: "0x1" }, - source: { id: sourceExternalSourceId }, - identifier: `notID${x}`, - kind: ExternalSourceAspect.Kind.Element, - }; - sourceDb.elements.insertAspect(externalSourceAspects); - } - - const objectProps: PhysicalElementProps = { - classFullName: PhysicalObject.classFullName, - model: sourceModelId, - category: sourceCategoryId, - code: Code.createEmpty(), - }; - const physicalObjectToDelete = sourceDb.elements.insertElement(objectProps); - const aspectProps: ExternalSourceAspectProps = { - classFullName: ExternalSourceAspect.classFullName, - element: { - id: physicalObjectToDelete, - relClassName: ElementOwnsExternalSourceAspects.classFullName, - }, - scope: { id: "0x1" }, - source: { id: sourceExternalSourceId }, - identifier: "0x333", - kind: ExternalSourceAspect.Kind.Element, - }; - - sourceDb.elements.insertAspect(aspectProps); - sourceDb.saveChanges(); - - // create target iModel - const targetDbFile: string = IModelTransformerTestUtils.prepareOutputFile( - "IModelTransformer", - "SourceProvenance-Target.bim" - ); - const targetDb = SnapshotDb.createEmpty(targetDbFile, { - rootSubject: { name: "Source Provenance Test (Target)" }, - }); - - // clone - const transformer = new IModelTransformer(sourceDb, targetDb, { - includeSourceProvenance: true, - forceExternalSourceAspectProvenance: true, - }); - await transformer.process(); - targetDb.saveChanges(); - - // verify target contents - for (const sourceElementId of sourcePhysicalObjectsToSkip) { - const targetElementId = - transformer.context.findTargetElementId(sourceElementId); - expect(targetDb.elements.tryGetElement(targetElementId)).to.be.not - .undefined; - } - const deletedElement = transformer.context.findTargetElementId( - physicalObjectToDelete - ); - expect(targetDb.elements.tryGetElement(deletedElement)).to.be.undefined; - - // clean up - transformer.dispose(); - sourceDb.close(); - targetDb.close(); - }); - it("handles long schema names and references to them", async function () { const longSchema1Name = `ThisSchemaIs${"Long".repeat(100)}`; assert(Buffer.from(longSchema1Name).byteLength > 255); @@ -4741,7 +4516,9 @@ describe("IModelTransformer", () => { class SkipElementTransformer extends IModelTransformer { public skippedElement = Id64.invalid; - public override shouldExportElement(sourceElement: Element): boolean { + public override async shouldExportElement( + sourceElement: Element + ): Promise { return this.skippedElement !== sourceElement.id; } } @@ -4751,15 +4528,11 @@ describe("IModelTransformer", () => { await transformer.processSchemas(); await transformer.process(); targetDb.saveChanges(); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withPreparedStatement( - "SELECT ReferencedElement.Id FROM CustomSchema:CustomPhysicalElement WHERE UserLabel LIKE '%Referencer%'", - (statement) => { - while (DbResult.BE_SQLITE_ROW === statement.step()) { - assert(statement.getValue(0).isNull); - } - } - ); + const sql = + "SELECT ReferencedElement.Id FROM CustomSchema:CustomPhysicalElement WHERE UserLabel LIKE '%Referencer%'"; + for await (const row of targetDb.createQueryReader(sql)) { + assert(row[0] === null || row[0] === undefined); + } }); it("should transform all aspects when detachedAspectProcessing is turned on", async () => { @@ -4819,7 +4592,7 @@ describe("IModelTransformer", () => { targetDb.saveChanges(); // assert - const numSourceSubjectIds = count(sourceDb, Subject.classFullName); + const numSourceSubjectIds = await count(sourceDb, Subject.classFullName); const elementIds = targetDb.queryEntityIds({ from: Subject.classFullName }); expect(elementIds.size).to.be.equal(numSourceSubjectIds); @@ -5256,21 +5029,17 @@ describe("IModelTransformer", () => { await transformer.process(); targetDb.saveChanges(); - const getTestViewElements = (imodelDb: IModelDb) => { - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - return imodelDb.withPreparedStatement( - "SELECT * FROM TestGeneratedClassesNew.TestView", - (statement) => { - const viewElements = []; - while (DbResult.BE_SQLITE_ROW === statement.step()) { - viewElements.push(statement.getRow()); - } - return viewElements; - } - ); + const getTestViewElements = async (imodelDb: IModelDb) => { + const viewElements = []; + for await (const row of imodelDb.createQueryReader( + "SELECT * FROM TestGeneratedClassesNew.TestView" + )) { + viewElements.push(row.toRow()); + } + return viewElements; }; - const sourceViews = getTestViewElements(sourceDb); - const targetViews = getTestViewElements(targetDb); + const sourceViews = await getTestViewElements(sourceDb); + const targetViews = await getTestViewElements(targetDb); expect(sourceViews.length).to.equal(targetViews.length).and.to.equal(2); expect(sourceViews[0]).to.deep.equal(targetViews[0]); diff --git a/packages/transformer/src/test/standalone/IModelTransformerHub.test.ts b/packages/transformer/src/test/standalone/IModelTransformerHub.test.ts index 8f78cab62..7ba1ed001 100644 --- a/packages/transformer/src/test/standalone/IModelTransformerHub.test.ts +++ b/packages/transformer/src/test/standalone/IModelTransformerHub.test.ts @@ -20,7 +20,6 @@ import { DocumentListModel, Drawing, DrawingModel, - ECSqlStatement, // eslint-disable-next-line @typescript-eslint/no-redeclare Element, ElementGroupsMembers, @@ -30,7 +29,6 @@ import { ExternalSourceAspect, GenericSchema, GeometricModel, - HubMock, IModelDb, IModelHost, IModelJsFs, @@ -46,7 +44,8 @@ import { SubjectOwnsPartitionElements, SubjectOwnsSubjects, } from "@itwin/core-backend"; - +import { _hubAccess } from "@itwin/core-backend/lib/cjs/internal/Symbols"; +import { HubMock } from "@itwin/core-backend/lib/cjs/internal/HubMock"; import * as TestUtils from "../TestUtils"; import { AccessToken, @@ -154,7 +153,8 @@ describe("IModelTransformerHub", () => { const createPopulatedIModelHubIModel = async ( iModelName: string, - prepareIModel?: (iModel: SnapshotDb) => void | Promise + prepareIModel?: (iModel: SnapshotDb) => void | Promise, + noLocks: boolean = true ): Promise => { // Create and push seed of IModel const seedFileName = path.join(outputDir, `${iModelName}.bim`); @@ -169,12 +169,12 @@ describe("IModelTransformerHub", () => { seedDb.saveChanges(); seedDb.close(); - const iModelId = await IModelHost.hubAccess.createNewIModel({ + const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName, description: "source", version0: seedFileName, - noLocks: true, + noLocks: noLocks ? true : undefined, }); return iModelId; }; @@ -277,7 +277,7 @@ describe("IModelTransformerHub", () => { targetBriefcase ); await transformer2.process(); - transformer2.updateSynchronizationVersion({ + await transformer2.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); const scopingEsa2 = transformer2["_targetScopeProvenanceProps"]; @@ -300,11 +300,11 @@ describe("IModelTransformerHub", () => { }); } finally { try { - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -399,11 +399,15 @@ describe("IModelTransformerHub", () => { assert.equal(sourceDbChanges.relationship.updateIds.size, 0); assert.equal(sourceDbChanges.relationship.deleteIds.size, 0); - const transformer = new TestIModelTransformer(sourceDb, targetDb, { - argsForProcessChanges: { - startChangeset: { id: sourceDb.changeset.id }, - }, - }); + const transformer = await TestIModelTransformer.create( + sourceDb, + targetDb, + { + argsForProcessChanges: { + startChangeset: { id: sourceDb.changeset.id }, + }, + } + ); transformer["_allowNoScopingESA"] = true; await transformer.process(); transformer.dispose(); @@ -476,7 +480,7 @@ describe("IModelTransformerHub", () => { ElementRefersToElements.classFullName ); const targetImporter = new CountingIModelImporter(targetDb); - const transformer = new TestIModelTransformer( + const transformer = await TestIModelTransformer.create( sourceDb, targetImporter, { argsForProcessChanges: {} } @@ -507,8 +511,7 @@ describe("IModelTransformerHub", () => { "Second import should not add relationships" ); targetDb.saveChanges(); - // eslint-disable-next-line deprecation/deprecation - assert.isFalse(targetDb.nativeDb.hasPendingTxns()); + assert.isFalse(targetDb.txns.hasPendingTxns); await targetDb.pushChanges({ accessToken, description: "Should not actually push because there are no changes", @@ -562,9 +565,13 @@ describe("IModelTransformerHub", () => { assert.equal(sourceDbChanges.codeSpec.deleteIds.size, 0); assert.equal(sourceDbChanges.aspect.deleteIds.size, 0); - const transformer = new TestIModelTransformer(sourceDb, targetDb, { - argsForProcessChanges: {}, - }); + const transformer = await TestIModelTransformer.create( + sourceDb, + targetDb, + { + argsForProcessChanges: {}, + } + ); await transformer.process(); transformer.dispose(); targetDb.saveChanges(); @@ -609,12 +616,12 @@ describe("IModelTransformerHub", () => { assert.equal(targetDbChanges.codeSpec.deleteIds.size, 0); } - const sourceIModelChangeSets = await IModelHost.hubAccess.queryChangesets( - { accessToken, iModelId: sourceIModelId } - ); - const targetIModelChangeSets = await IModelHost.hubAccess.queryChangesets( - { accessToken, iModelId: targetIModelId } - ); + const sourceIModelChangeSets = await IModelHost[ + _hubAccess + ].queryChangesets({ accessToken, iModelId: sourceIModelId }); + const targetIModelChangeSets = await IModelHost[ + _hubAccess + ].queryChangesets({ accessToken, iModelId: targetIModelId }); assert.equal(sourceIModelChangeSets.length, 2); assert.equal(targetIModelChangeSets.length, 2); @@ -622,11 +629,290 @@ describe("IModelTransformerHub", () => { await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, targetDb); } finally { try { - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ + iTwinId, + iModelId: sourceIModelId, + }); + await IModelHost[_hubAccess].deleteIModel({ + iTwinId, + iModelId: targetIModelId, + }); + } catch (err) { + // eslint-disable-next-line no-console + console.log("can't destroy", err); + } + } + }); + + it("Transform source iModel to target iModel with locks", async () => { + const sourceIModelId = await createPopulatedIModelHubIModel( + "TransformerSourceWithLocks", + async (sourceSeedDb) => { + await TestUtils.ExtensiveTestScenario.prepareDb(sourceSeedDb); + }, + false // noLocks = false, so locks are required + ); + + const targetIModelId = await createPopulatedIModelHubIModel( + "TransformerTargetWithLocks", + async (targetSeedDb) => { + await TransformerExtensiveTestScenario.prepareTargetDb(targetSeedDb); + }, + false // noLocks = false, so locks are required + ); + + try { + const sourceDb = await HubWrappers.downloadAndOpenBriefcase({ + accessToken, + iTwinId, + iModelId: sourceIModelId, + }); + const targetDb = await HubWrappers.downloadAndOpenBriefcase({ + accessToken, + iTwinId, + iModelId: targetIModelId, + }); + + // Acquire locks on source before populating (needed since noLocks=false) + await sourceDb.locks.acquireLocks({ + exclusive: IModel.rootSubjectId, + }); + + // Populate source and push + TestUtils.ExtensiveTestScenario.populateDb(sourceDb); + + // Insert a physical model that we'll delete later to test onDeleteModel + const tempModelId = PhysicalModel.insert( + sourceDb, + IModel.rootSubjectId, + "TempModelToDelete" + ); + // Capture federation GUID for later verification + const tempModelFedGuid = + sourceDb.elements.getElement(tempModelId).federationGuid; + assert.isDefined(tempModelFedGuid); + + sourceDb.saveChanges(); + await sourceDb.pushChanges({ + accessToken, + description: "Populate source", + }); + + // Use acquireElementLocks option so transformer acquires locks automatically on target + const transformer = await TestIModelTransformer.create( + sourceDb, + targetDb, + { + acquireElementLocks: true, + argsForProcessChanges: { + startChangeset: { id: sourceDb.changeset.id }, + }, + } + ); + transformer["_allowNoScopingESA"] = true; + await transformer.process(); + transformer.dispose(); + targetDb.saveChanges(); + await targetDb.pushChanges({ accessToken, description: "Import #1" }); + + // Verify transformation was successful + TransformerExtensiveTestScenario.assertTargetDbContents( + sourceDb, + targetDb + ); + + // Verify temp model exists in target after first transform (using fed guid) + const targetTempModelElement = targetDb.elements.tryGetElement({ + federationGuid: tempModelFedGuid, + }); + assert.isDefined(targetTempModelElement); + const targetTempModelId = targetTempModelElement.id; + + // Now delete an element and the temp model from source to test onDeleteElement and onDeleteModel + // Find a physical object to delete (tests onDeleteElement) + const physicalObjectId = sourceDb + .queryEntityIds({ + from: PhysicalObject.classFullName, + limit: 1, + }) + .values() + .next().value!; + assert.isTrue(Id64.isValidId64(physicalObjectId)); + + // Save federation GUID before deleting so we can verify deletion in target + const physicalObjectFedGuid = + sourceDb.elements.getElement(physicalObjectId).federationGuid; + assert.isDefined(physicalObjectFedGuid); + + // Acquire locks for the elements we're about to delete + await sourceDb.locks.acquireLocks({ + exclusive: [physicalObjectId, tempModelId], + }); + + // Delete the physical object (element) + sourceDb.elements.deleteElement(physicalObjectId); + + // Delete the temp model and its partition element to test onDeleteModel + // Must delete model first, then the partition element + sourceDb.models.deleteModel(tempModelId); + sourceDb.elements.deleteElement(tempModelId); + + sourceDb.saveChanges(); + await sourceDb.pushChanges({ + accessToken, + description: "Delete element and model", + }); + + // Run another transform to propagate deletions + const transformer2 = await TestIModelTransformer.create( + sourceDb, + targetDb, + { + acquireElementLocks: true, + argsForProcessChanges: {}, + } + ); + await transformer2.process(); + transformer2.dispose(); + targetDb.saveChanges(); + await targetDb.pushChanges({ + accessToken, + description: "Import #2 - deletions", + }); + + // Verify deletions propagated to target + // The physical object should be deleted (using fed guid) + const targetPhysicalObjectAfterDelete = targetDb.elements.tryGetElement({ + federationGuid: physicalObjectFedGuid, + }); + assert.isUndefined(targetPhysicalObjectAfterDelete); + + // The temp model should be deleted from target (check using tryGetModel) + const targetTempModelAfterDelete = + targetDb.models.tryGetModel(targetTempModelId); + assert.isUndefined(targetTempModelAfterDelete); + + await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, sourceDb); + await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, targetDb); + } finally { + try { + await IModelHost[_hubAccess].deleteIModel({ + iTwinId, + iModelId: sourceIModelId, + }); + await IModelHost[_hubAccess].deleteIModel({ + iTwinId, + iModelId: targetIModelId, + }); + } catch (err) { + // eslint-disable-next-line no-console + console.log("can't destroy", err); + } + } + }); + + it("should release locks acquired during transformation when transformation fails", async () => { + const sourceIModelId = await createPopulatedIModelHubIModel( + "TransformerSourceLockCleanup", + async (sourceSeedDb) => { + // Just need a few elements to trigger the failing transformer + const categoryId = SpatialCategory.insert( + sourceSeedDb, + IModel.dictionaryId, + "TestCategory", + { color: ColorDef.green.toJSON() } + ); + const modelId = PhysicalModel.insert( + sourceSeedDb, + IModel.rootSubjectId, + "TestModel" + ); + for (let i = 0; i < 10; i++) { + const props: PhysicalElementProps = { + classFullName: PhysicalObject.classFullName, + model: modelId, + category: categoryId, + code: Code.createEmpty(), + userLabel: `Element${i}`, + }; + sourceSeedDb.elements.insertElement(props); + } + }, + false // noLocks = false, so locks are required + ); + + const targetIModelId = await createPopulatedIModelHubIModel( + "TransformerTargetLockCleanup", + undefined, + false // noLocks = false, so locks are required + ); + + try { + const sourceDb = await HubWrappers.downloadAndOpenBriefcase({ + accessToken, + iTwinId, + iModelId: sourceIModelId, + }); + const targetDb = await HubWrappers.downloadAndOpenBriefcase({ + accessToken, + iTwinId, + iModelId: targetIModelId, + }); + + // Acquire and PUSH a lock on target before transformation. + // This lock should be retained even if the transformation fails. + await targetDb.locks.acquireLocks({ exclusive: IModel.rootSubjectId }); + const rootSubject = targetDb.elements.getElement(IModel.rootSubjectId); + rootSubject.setJsonProperty("preTransformLock", true); + rootSubject.update(); + targetDb.saveChanges(); + await targetDb.pushChanges({ + accessToken, + description: "Pre-transform lock", + retainLocks: true, + }); + + assert.isTrue(targetDb.locks.holdsExclusiveLock(IModel.rootSubjectId)); + + // Transformer that fails after processing a few elements + class FailingTransformer extends IModelTransformer { + private _count = 0; + public override async onExportElement(el: Element): Promise { + if (++this._count > 5) throw new Error("Deliberate failure"); + await super.onExportElement(el); + } + } + + // Run transformation - expect it to fail + await expect( + (async () => { + const transformer = new FailingTransformer(sourceDb, targetDb, { + acquireElementLocks: true, + }); + transformer["_allowNoScopingESA"] = true; + await transformer.process(); + transformer.dispose(); + })() + ).to.be.rejectedWith("Deliberate failure"); + + // Pre-transformation lock should still be held + assert.isTrue( + targetDb.locks.holdsExclusiveLock(IModel.rootSubjectId), + "Pre-transformation lock should still be held" + ); + + // Unsaved changes should have been abandoned during cleanup + assert.isFalse(targetDb.txns.hasUnsavedChanges); + + await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, sourceDb); + await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, targetDb); + } finally { + try { + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -822,39 +1108,32 @@ describe("IModelTransformerHub", () => { await transformer.process(); transformer.dispose(); - const sql = `SELECT ECInstanceId, Model.Id FROM ${PhysicalObject.classFullName}`; - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - targetDb.withPreparedStatement(sql, (statement: ECSqlStatement) => { - let objectCounter = 0; - while (DbResult.BE_SQLITE_ROW === statement.step()) { - const targetElementId = statement.getValue(0).getId(); - const targetElement = targetDb.elements.getElement({ - id: targetElementId, - wantGeometry: true, - }); - assert.exists(targetElement.geom); - assert.isFalse(targetElement.calculateRange3d().isNull); - const targetElementModelId = statement.getValue(1).getId(); - assert.equal(targetModelId, targetElementModelId); - ++objectCounter; - } - assert.equal(185, objectCounter); - }); + const sql = `SELECT ECInstanceId, Model.Id AS modelId FROM ${PhysicalObject.classFullName}`; + let objectCounter = 0; + for await (const row of targetDb.createQueryReader(sql)) { + const targetElementId = row.id; + const targetElement = targetDb.elements.getElement({ + id: targetElementId, + wantGeometry: true, + }); + assert.exists(targetElement.geom); + assert.isFalse(targetElement.calculateRange3d().isNull); + const targetElementModelId = row.modelId; + assert.equal(targetModelId, targetElementModelId); + ++objectCounter; + } + assert.equal(185, objectCounter); assert.equal(1, count(targetDb, PhysicalModel.classFullName)); - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - const modelId = targetDb.withPreparedStatement( - `SELECT ECInstanceId, isPrivate FROM ${PhysicalModel.classFullName}`, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (statement: ECSqlStatement) => { - if (DbResult.BE_SQLITE_ROW === statement.step()) { - const isPrivate = statement.getValue(1).getBoolean(); - assert.isFalse(isPrivate); - return statement.getValue(0).getId(); - } - return Id64.invalid; - } - ); + let modelId = Id64.invalid; + const modelReader = targetDb.createQueryReader( + `SELECT ECInstanceId, isPrivate FROM ${PhysicalModel.classFullName}` + ); + if (await modelReader.step()) { + const isPrivate = modelReader.current.isPrivate; + assert.isFalse(isPrivate); + modelId = modelReader.current.id; + } assert.isTrue(Id64.isValidId64(modelId)); const physicalPartition = @@ -875,11 +1154,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -937,14 +1216,13 @@ describe("IModelTransformerHub", () => { seedBisCoreVersion !== updatedBisCoreVersion; // push sourceDb schema changes - /* eslint-disable deprecation/deprecation */ assert.equal( - sourceDb.nativeDb.hasPendingTxns(), + sourceDb.txns.hasPendingTxns, expectedHasPendingTxns, "Expect importSchemas to have saved changes" ); assert.isFalse( - sourceDb.nativeDb.hasUnsavedChanges(), + sourceDb.txns.hasUnsavedChanges, "Expect no unsaved changes after importSchemas" ); await sourceDb.pushChanges({ @@ -958,14 +1236,13 @@ describe("IModelTransformerHub", () => { GenericSchema.schemaFilePath, ]); assert.isFalse( - sourceDb.nativeDb.hasPendingTxns(), + sourceDb.txns.hasPendingTxns, "Expect importSchemas to be a no-op" ); assert.isFalse( - sourceDb.nativeDb.hasUnsavedChanges(), + sourceDb.txns.hasUnsavedChanges, "Expect importSchemas to be a no-op" ); - /* eslint-enable deprecation/deprecation */ sourceDb.saveChanges(); // will be no changes to save in this case await sourceDb.pushChanges({ accessToken, @@ -1028,11 +1305,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -1052,8 +1329,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); const masterSeed: TimelineIModelState = { @@ -1148,8 +1424,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); const noFedGuidElemIds = masterSeedDb.queryEntityIds({ from: "Bis.Element", @@ -1265,8 +1540,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); const noFedGuidElemIds = masterSeedDb.queryEntityIds({ from: "Bis.Element", @@ -1421,8 +1695,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); // 20 will be deleted, so it's important to know remapping deleted elements still works if there is no fedguid @@ -1516,8 +1789,8 @@ describe("IModelTransformerHub", () => { { branch1: { 21: deleted, 30: 1 } }, { master: { sync: ["branch1"] } }, // first master<-branch1 reverse sync { - assert({ master, branch1 }) { - assertElemState(master.db, { + async assert({ master, branch1 }) { + await assertElemState(master.db, { // relationship props are a lot to type out so let's grab those from the branch ...branch1.state, // double check deletions propagated by sync @@ -1529,8 +1802,8 @@ describe("IModelTransformerHub", () => { }, { branch2: { sync: ["master"] } }, // first master->branch2 forward sync { - assert({ master, branch2 }) { - assertElemState(branch2.db, master.state); + async assert({ master, branch2 }) { + await assertElemState(branch2.db, master.state); }, }, { branch2: { 7: 1, 8: 1 } }, @@ -1538,7 +1811,7 @@ describe("IModelTransformerHub", () => { { master: { 7: 2, 9: 1 } }, { master: { sync: ["branch2"] } }, // first master<-branch2 reverse sync { - assert({ master, branch1, branch2 }) { + async assert({ master, branch1, branch2 }) { for (const { db } of [master, branch1, branch2]) { const elem1Id = IModelTestUtils.queryByUserLabel(db, "1"); expect(db.elements.getElement(elem1Id).federationGuid).to.be @@ -1591,7 +1864,7 @@ describe("IModelTransformerHub", () => { } // branch2 won the conflict since it is the synchronization source - assertElemState(master.db, { 7: 1 }, { subset: true }); + await assertElemState(master.db, { 7: 1 }, { subset: true }); }, }, { master: { 6: 2 } }, @@ -1619,7 +1892,7 @@ describe("IModelTransformerHub", () => { }, { branch1: { sync: ["master"] } }, // first master->branch1 forward sync { - assert({ branch1 }) { + async assert({ branch1 }) { for (const rel of expectedRelationships) { expect( branch1.db.relationships.tryGetInstance( @@ -1655,7 +1928,7 @@ describe("IModelTransformerHub", () => { ).to.be.true; expect(srcElemAspects.length).to.lessThanOrEqual(1); } - assertElemState(branch1.db, { 7: 1 }, { subset: true }); + await assertElemState(branch1.db, { 7: 1 }, { subset: true }); }, }, // 7 originally came from branch2. Modify it. @@ -1665,9 +1938,9 @@ describe("IModelTransformerHub", () => { // Forward sync master to branch2 with the change to 7. { branch2: { sync: ["master"] } }, { - assert({ master, branch1, branch2 }) { + async assert({ master, branch1, branch2 }) { for (const imodel of [master, branch1, branch2]) { - assertElemState(imodel.db, { 7: 10 }, { subset: true }); + await assertElemState(imodel.db, { 7: 10 }, { subset: true }); } }, }, @@ -1681,7 +1954,7 @@ describe("IModelTransformerHub", () => { // create empty iModel meant to contain replayed master history const replayedIModelName = "Replayed"; - const replayedIModelId = await IModelHost.hubAccess.createNewIModel({ + const replayedIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: replayedIModelName, description: "blank", @@ -1700,7 +1973,9 @@ describe("IModelTransformerHub", () => { const master = trackedIModels.get("master"); assert(master); - const masterDbChangesets = await IModelHost.hubAccess.downloadChangesets({ + const masterDbChangesets = await IModelHost[ + _hubAccess + ].downloadChangesets({ accessToken, iModelId: master.id, targetDir: BriefcaseManager.getChangeSetsPath(master.id), @@ -1775,15 +2050,16 @@ describe("IModelTransformerHub", () => { replayTransformer.dispose(); } sourceDb.close(); - assertElemState(replayedDb, master.state); // should have same ending state as masterDb + await assertElemState(replayedDb, master.state); // should have same ending state as masterDb // make sure there are no deletes in the replay history (all elements that were eventually deleted from masterDb were excluded) - const replayedDbChangesets = - await IModelHost.hubAccess.downloadChangesets({ - accessToken, - iModelId: replayedIModelId, - targetDir: BriefcaseManager.getChangeSetsPath(replayedIModelId), - }); + const replayedDbChangesets = await IModelHost[ + _hubAccess + ].downloadChangesets({ + accessToken, + iModelId: replayedIModelId, + targetDir: BriefcaseManager.getChangeSetsPath(replayedIModelId), + }); assert.isAtLeast(replayedDbChangesets.length, masterDbChangesets.length); // replayedDb will have more changesets when seed contains elements const replayedDeletedElementIds = new Set(); for (const replayedDbChangeset of replayedDbChangesets) { @@ -1809,7 +2085,7 @@ describe("IModelTransformerHub", () => { } finally { await tearDown(); replayedDb.close(); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: replayedIModelId, }); @@ -1916,7 +2192,9 @@ describe("IModelTransformerHub", () => { expect(modelSelectorUpdate2.models).to.have.length(2); // test extracted changed ids - const sourceDbChangesets = await IModelHost.hubAccess.downloadChangesets({ + const sourceDbChangesets = await IModelHost[ + _hubAccess + ].downloadChangesets({ accessToken, iModelId: sourceIModelId, targetDir: BriefcaseManager.getChangeSetsPath(sourceIModelId), @@ -1939,7 +2217,9 @@ describe("IModelTransformerHub", () => { let didExportModelSelector = false, didImportModelSelector = false; class IModelImporterInjected extends IModelImporter { - public override importElement(sourceElement: ElementProps): Id64String { + public override async importElement( + sourceElement: ElementProps + ): Promise { if (sourceElement.id === modelSelectorId) didImportModelSelector = true; return super.importElement(sourceElement); @@ -1985,11 +2265,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -2065,19 +2345,10 @@ describe("IModelTransformerHub", () => { await transformer.process(); const elementCodeValueMap = new Map(); - // eslint-disable-next-line deprecation/deprecation - targetDb.withStatement( - `SELECT ECInstanceId, CodeValue FROM ${Element.classFullName} WHERE ECInstanceId NOT IN (0x1, 0x10, 0xe)`, - // eslint-disable-next-line deprecation/deprecation - (statement: ECSqlStatement) => { - while (statement.step() === DbResult.BE_SQLITE_ROW) { - elementCodeValueMap.set( - statement.getValue(0).getId(), - statement.getValue(1).getString() - ); - } - } - ); + const sql = `SELECT ECInstanceId, CodeValue FROM ${Element.classFullName} WHERE ECInstanceId NOT IN (0x1, 0x10, 0xe)`; + for await (const row of targetDb.createQueryReader(sql)) { + elementCodeValueMap.set(row[0], row[1]); + } // make sure provenance was tracked for all elements expect(count(sourceDb, Element.classFullName)).to.equal(4 + 3); // 2 Subjects, 2 PhysicalPartitions + 0x1, 0x10, 0xe @@ -2100,11 +2371,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -2162,7 +2433,7 @@ describe("IModelTransformerHub", () => { seedDb.saveChanges(); seedDb.close(); - const sourceIModelId = await IModelHost.hubAccess.createNewIModel({ + const sourceIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: "TransformerSource", description: "source", @@ -2181,7 +2452,7 @@ describe("IModelTransformerHub", () => { sourceDb.performCheckpoint(); // so we can use as a seed // forking target - const targetIModelId = await IModelHost.hubAccess.createNewIModel({ + const targetIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: "TransformerTarget", description: "target", @@ -2272,8 +2543,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); const masterSeed: TimelineIModelState = { // HACK: we know this will only be used for seeding via its path and performCheckpoint @@ -2391,7 +2661,7 @@ describe("IModelTransformerHub", () => { let targetIModelId: string | undefined; try { - sourceIModelId = await IModelHost.hubAccess.createNewIModel({ + sourceIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: "TransformerSource", description: "source", @@ -2422,7 +2692,7 @@ describe("IModelTransformerHub", () => { sourceDb.performCheckpoint(); // so we can use as a seed // forking target - targetIModelId = await IModelHost.hubAccess.createNewIModel({ + targetIModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: "TransformerTarget", description: "target", @@ -2506,12 +2776,12 @@ describe("IModelTransformerHub", () => { try { // delete iModel briefcases if (sourceIModelId) - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); if (targetIModelId) - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -2725,7 +2995,9 @@ describe("IModelTransformerHub", () => { .undefined; // expected extracted changed ids - const branchDbChangesets = await IModelHost.hubAccess.downloadChangesets({ + const branchDbChangesets = await IModelHost[ + _hubAccess + ].downloadChangesets({ accessToken, iModelId: branchIModelId, targetDir: BriefcaseManager.getChangeSetsPath(branchIModelId), @@ -2824,12 +3096,12 @@ describe("IModelTransformerHub", () => { await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, branchDb); } finally { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: masterIModelId, }); if (branchIModelId) { - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: branchIModelId, }); @@ -2870,7 +3142,7 @@ describe("IModelTransformerHub", () => { startChangeset: branchAt2Changeset, }, }); - const queryChangeset = sinon.spy(HubMock, "queryChangeset"); + const queryChangeset = sinon.spy(BriefcaseManager, "queryChangeset"); await syncer.process(); expect( queryChangeset.alwaysCalledWith({ @@ -2974,11 +3246,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -3190,11 +3462,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -3319,11 +3591,11 @@ describe("IModelTransformerHub", () => { } finally { try { // delete iModel briefcases - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -3440,11 +3712,11 @@ describe("IModelTransformerHub", () => { expect(aspectAddedAfterFirstTransformation).to.not.be.undefined; }); } finally { - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: sourceIModelId, }); - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: targetIModelId, }); @@ -3503,6 +3775,7 @@ describe("IModelTransformerHub", () => { master: { manualUpdate(db) { const notDeleted = db.elements.deleteDefinitionElements([ + // @ts-expect-error using spatialViewDef before its defined spatialViewDef.id, displayStyle.id, ]); @@ -3549,8 +3822,7 @@ describe("IModelTransformerHub", () => { const masterSeedDb = SnapshotDb.createEmpty(masterSeedFileName, { rootSubject: { name: masterIModelName }, }); - // eslint-disable-next-line deprecation/deprecation - masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue + // masterSeedDb.nativeDb.setITwinId(iTwinId); // workaround for "ContextId was not properly setup in the checkpoint" issue populateTimelineSeed(masterSeedDb, masterSeedState); const noFedGuidElemIds = masterSeedDb.queryEntityIds({ @@ -3739,7 +4011,6 @@ describe("IModelTransformerHub", () => { { master: { 1: 1, 2: 2, 3: 1 } }, { branch: { branch: "master" } }, { branch: { 1: 2, 4: 1 } }, - // eslint-disable-next-line @typescript-eslint/no-shadow { assert({ master, branch }) { const scopeProvenanceCandidates = branch.db.elements @@ -3863,7 +4134,6 @@ describe("IModelTransformerHub", () => { { branch: { branch: "master" } }, { branch: { 1: 2, 4: 1 } }, { branch: { 5: 1 } }, - // eslint-disable-next-line @typescript-eslint/no-shadow { assert({ master, branch }) { const scopeProvenanceCandidates = branch.db.elements @@ -3914,13 +4184,13 @@ describe("IModelTransformerHub", () => { }, }, { - assert({ master, branch }) { + async assert({ master, branch }) { // Assert that we skipped the changeset: { branch: { 1: 2, 4: 1 } } during our reverse sync. const expectedState = { 1: 1, 2: 2, 3: 1, 5: 1 }; expect(master.state).to.deep.equal(expectedState); expect(branch.state).to.deep.equal({ ...expectedState, 1: 2, 4: 1 }); - assertElemState(master.db, expectedState); - assertElemState(branch.db, { ...expectedState, 1: 2, 4: 1 }); + await assertElemState(master.db, expectedState); + await assertElemState(branch.db, { ...expectedState, 1: 2, 4: 1 }); }, }, // repeat all above for forward sync scenario! @@ -3967,14 +4237,14 @@ describe("IModelTransformerHub", () => { }, }, { - assert({ master, branch }) { + async assert({ master, branch }) { // Assert that we skipped the changeset: { master: { 2: 4, 6: 1, } }, during our forward sync.. making it so those properties didn't make it to the branch. const expectedMasterState = { 1: 1, 2: 4, 3: 1, 5: 1, 6: 1, 7: 1 }; const expectedBranchState = { 1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 7: 1 }; expect(master.state).to.deep.equal(expectedMasterState); expect(branch.state).to.deep.equal(expectedBranchState); - assertElemState(master.db, expectedMasterState); - assertElemState(branch.db, expectedBranchState); + await assertElemState(master.db, expectedMasterState); + await assertElemState(branch.db, expectedBranchState); }, }, ]; @@ -4096,7 +4366,6 @@ describe("IModelTransformerHub", () => { { master: { 1: 1, 2: 2, 3: 1 } }, { branch: { branch: "master" } }, { branch: { 1: 2, 4: 1 } }, - // eslint-disable-next-line @typescript-eslint/no-shadow { assert({ master, branch }) { const scopeProvenanceCandidates = branch.db.elements @@ -4204,26 +4473,25 @@ describe("IModelTransformerHub", () => { ], }, }, - // eslint-disable-next-line @typescript-eslint/no-shadow { - assert({ master, branch }) { + async assert({ master, branch }) { expect(master.db.changeset.index).to.equal(3); expect(branch.db.changeset.index).to.equal(8); expect(count(master.db, ExternalSourceAspect.classFullName)).to.equal( 0 ); - - const externalAspectCounts = (db: IModelDb) => - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - db.withPreparedStatement( - ` + const sql = ` SELECT e.ECInstanceId as elementId, COUNT(*) as aspectCount FROM bis.ExternalSourceAspect esa JOIN bis.Element e ON e.ECInstanceId=esa.Element.Id GROUP BY e.ECInstanceId - `, - // eslint-disable-next-line @itwin/no-internal, deprecation/deprecation - (s: ECSqlStatement) => [...s] - ); + `; + const externalAspectCounts = async (db: IModelDb) => { + const results = []; + for await (const row of db.createQueryReader(sql)) { + results.push(row.toRow()); + } + return results; + }; expect(count(branch.db, "bis.ExternalSourceAspect")).to.be.equal( count(master.db, "bis.Element") + 1 @@ -4232,7 +4500,7 @@ describe("IModelTransformerHub", () => { count(master.db, "bis.Element") ); - externalAspectCounts(branch.db).forEach((value) => { + (await externalAspectCounts(branch.db)).forEach((value) => { const { elementId, aspectCount } = value; if (elementId === targetScopeElementId) expect(aspectCount).to.equal(2); @@ -4268,12 +4536,12 @@ describe("IModelTransformerHub", () => { { branch: { 5: 1 } }, { master: { sync: ["branch"] } }, { - assert({ master, branch }) { + async assert({ master, branch }) { const expectedState = { 1: 2, 2: 2, 3: 1, 4: 1, 5: 1 }; expect(master.state).to.deep.equal(expectedState); expect(branch.state).to.deep.equal(expectedState); - assertElemState(master.db, expectedState); - assertElemState(branch.db, expectedState); + await assertElemState(master.db, expectedState); + await assertElemState(branch.db, expectedState); }, }, ]; @@ -4298,7 +4566,6 @@ describe("IModelTransformerHub", () => { { master: { 1: 1 } }, { branch: { branch: "master" } }, { branch: { 1: 2, 4: 1 } }, - // eslint-disable-next-line @typescript-eslint/no-shadow { branch: { manualUpdate(branch) { @@ -4352,7 +4619,6 @@ describe("IModelTransformerHub", () => { }, }, { master: { sync: ["branch"] } }, - // eslint-disable-next-line @typescript-eslint/no-shadow { assert({ master, branch }) { const dictionaryModelMaster = master.db.models.getModel( @@ -4521,12 +4787,12 @@ describe("IModelTransformerHub", () => { { branch: { 5: 1 } }, { master: { sync: ["branch"] } }, { - assert({ master, branch }) { + async assert({ master, branch }) { const expectedState = { 1: 2, 2: 2, 3: 1, 4: 1, 5: 1 }; expect(master.state).to.deep.equal(expectedState); expect(branch.state).to.deep.equal(expectedState); - assertElemState(master.db, expectedState); - assertElemState(branch.db, expectedState); + await assertElemState(master.db, expectedState); + await assertElemState(branch.db, expectedState); }, }, ]; @@ -4835,8 +5101,14 @@ describe("IModelTransformerHub", () => { const categoryB = iModel.db.elements.getElement( SpatialCategory.createCode(iModel.db, IModel.dictionaryId, "B") ); - expect(categoryA.userLabel).to.equal("B"); - expect(categoryB.userLabel).to.equal("A"); + expect(categoryA.userLabel).to.equal( + "B", + `categoryA.userlabel mismatch in ${iModel.db.name}` + ); + expect(categoryB.userLabel).to.equal( + "A", + `categoryB.userlabel mismatch in ${iModel.db.name}` + ); } }, }, @@ -4971,7 +5243,7 @@ describe("IModelTransformerHub", () => { async function closeAndDeleteBriefcase(iModel: BriefcaseDb) { await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel); // eslint-disable-next-line @itwin/no-internal - await IModelHost.hubAccess.deleteIModel({ + await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId: iModel.iModelId, }); @@ -5085,7 +5357,7 @@ describe("IModelTransformerHub", () => { let transformer = new CustomChangesTransformer(sourceDb, targetDb, false); transformer.exporter.excludeElement(documentListModel); await transformer.process(); - transformer.updateSynchronizationVersion({ + await transformer.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); await pushChanges(targetDb, "Transformation 1: Process All"); @@ -5310,7 +5582,7 @@ describe("IModelTransformerHub", () => { // Exclude all drawings transformer.exporter.excludeElement(parentDrawing1.id!); await transformer.process(); - transformer.updateSynchronizationVersion({ + await transformer.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); await pushChanges(targetDb, "Transformation 1: Process All"); @@ -5505,7 +5777,7 @@ describe("IModelTransformerHub", () => { // will exclude 'PM2' transformer.exporter.excludeElement(physicalModel2Id); await transformer.process(); - transformer.updateSynchronizationVersion({ + await transformer.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); await pushChanges(targetDb, "Transformation 1: Process All"); @@ -5671,7 +5943,7 @@ describe("IModelTransformerHub", () => { // === Transformation 1: Run `process all` transformation === let transformer = new CustomChangesTransformer(sourceDb, targetDb, false); await transformer.process(); - transformer.updateSynchronizationVersion({ + await transformer.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); await pushChanges(targetDb, "Transformation 1: Process All"); @@ -5767,7 +6039,7 @@ describe("IModelTransformerHub", () => { // === Transformation 1: Run `process all` transformation === let transformer = new CustomChangesTransformer(sourceDb, targetDb, false); await transformer.process(); - transformer.updateSynchronizationVersion({ + await transformer.updateSynchronizationVersion({ initializeReverseSyncVersion: true, }); await pushChanges(targetDb, "Transformation 1: Process All"); diff --git a/packages/transformer/src/test/standalone/QueryProjectExtents.test.ts b/packages/transformer/src/test/standalone/QueryProjectExtents.test.ts new file mode 100644 index 000000000..f3784f817 --- /dev/null +++ b/packages/transformer/src/test/standalone/QueryProjectExtents.test.ts @@ -0,0 +1,103 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +/* eslint-disable @itwin/no-internal */ + +import { expect } from "chai"; +import * as path from "path"; +import "./TransformerTestStartup"; // calls startup/shutdown IModelHost before/after all tests +import { + BriefcaseDb, + BriefcaseManager, + IModelJsFs, + Subject, +} from "@itwin/core-backend"; +import { HubMock } from "@itwin/core-backend/lib/cjs/internal/HubMock"; +import { IModel } from "@itwin/core-common"; +import { GuidString, Logger } from "@itwin/core-bentley"; +import { KnownTestLocations } from "../TestUtils/KnownTestLocations"; +import { IModelImporter } from "../../IModelImporter"; + +/** + * This test reproduces the issue described in: + * https://github.com/iTwin/itwinjs-core/issues/9176 + * + * When an iModel has no geometry, computeProjectExtents returns a "null" range + * with values like [1e+200, 1e+200, 1e+200] for low and [-1e+200, -1e+200, -1e+200] for high. + * This causes issues when the transformer uses these extents. + */ +describe("computeProjectExtents with no geometry", () => { + const outputDir = path.join( + KnownTestLocations.outputDir, + "QueryProjectExtents" + ); + let iTwinId: GuidString; + + before(() => { + HubMock.startup("QueryProjectExtents", KnownTestLocations.outputDir); + iTwinId = HubMock.iTwinId; + IModelJsFs.recursiveMkDirSync(outputDir); + }); + + after(() => { + HubMock.shutdown(); + }); + + /** + * Helper to create an iModel with no geometric elements + */ + async function createEmptyIModel(name: string): Promise { + const iModelId = await HubMock.createNewIModel({ + iModelName: name, + iTwinId, + }); + const briefcaseProps = await BriefcaseManager.downloadBriefcase({ + accessToken: "test token", + iTwinId, + iModelId, + }); + const iModelDb = await BriefcaseDb.open({ + fileName: briefcaseProps.fileName, + }); + return iModelDb; + } + + it("should use IModelImporter.computeProjectExtents and verify the issue", async () => { + const iModelDb = await createEmptyIModel("ImporterExtentsTest"); + + try { + // Acquire locks and insert a subject (non-geometric element) + await iModelDb.locks.acquireLocks({ + shared: [IModel.repositoryModelId], + exclusive: [IModel.repositoryModelId], + }); + Subject.insert(iModelDb, IModel.rootSubjectId, "TestSubject"); + iModelDb.saveChanges("Added subject"); + + const originalExtents = iModelDb.projectExtents.clone(); + Logger.logInfo( + "QueryProjectExtents.test", + `Original projectExtents=${JSON.stringify(originalExtents)}` + ); + + // Create an importer with autoExtendProjectExtents enabled (default behavior when not excluding outliers) + const importer = new IModelImporter(iModelDb, { + autoExtendProjectExtents: true, + }); + + // This will compute and update project extents using the same logic as the transformer + importer.computeProjectExtents(); + + const updatedExtents = iModelDb.projectExtents; + + expect( + !updatedExtents.isNull, + "Project extents should not become null, but instead keep default extents" + ).to.be.true; + } finally { + iModelDb.close(); + } + }); +}); diff --git a/packages/transformer/src/test/standalone/TransformerPerf.test.ts b/packages/transformer/src/test/standalone/TransformerPerf.test.ts new file mode 100644 index 000000000..fb92eaf94 --- /dev/null +++ b/packages/transformer/src/test/standalone/TransformerPerf.test.ts @@ -0,0 +1,365 @@ +/* eslint-disable no-console */ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +/** + * Performance tests for IModelTransformer. + * + * These tests are skipped by default. To run them, remove the `.skip` modifier + * from individual tests or the entire describe block. Useful for: + * - Profiling transformation performance + * - Comparing performance before/after changes + * - Identifying performance regressions + */ + +import { assert } from "chai"; +import { + Code, + ColorDef, + GeometryStreamBuilder, + GeometryStreamProps, + IModel, + PhysicalElementProps, + Placement3d, +} from "@itwin/core-common"; +import { + Box, + Point3d, + Range3d, + YawPitchRollAngles, +} from "@itwin/core-geometry"; +import { + IModelHost, + IModelJsFs, + PhysicalModel, + PhysicalObject, + SnapshotDb, + SpatialCategory, + StandaloneDb, +} from "@itwin/core-backend"; +import * as coreBackendPkgJson from "@itwin/core-backend/package.json"; +import { IModelTransformer } from "../../IModelTransformer"; +import { IModelTransformerTestUtils } from "../IModelTransformerUtils"; + +import "./TransformerTestStartup"; // calls startup/shutdown IModelHost before/after all tests +import * as path from "path"; + +const coreBackendVersion = coreBackendPkgJson.version; + +const NUM_ELEMENTS = 10000; + +function initOutputFile(filename: string): string { + const outputDirName = path.join(__dirname, "output"); + if (!IModelJsFs.existsSync(outputDirName)) { + IModelJsFs.mkdirSync(outputDirName); + } + const outputFileName = path.join(outputDirName, filename); + if (IModelJsFs.existsSync(outputFileName)) { + IModelJsFs.removeSync(outputFileName); + } + return outputFileName; +} + +function createBoxGeometry(): GeometryStreamProps { + const builder = new GeometryStreamBuilder(); + const box = Box.createRange( + Range3d.create(Point3d.createZero(), new Point3d(1, 1, 1)), + true + ); + if (box) { + builder.appendGeometry(box); + } + return builder.geometryStream; +} + +interface SourceResult { + db: StandaloneDb; + insertDuration: number; +} + +async function createSourceWithElements( + numElements: number +): Promise { + const sourceFileName = initOutputFile("perftest_source.bim"); + + const sourceDb = StandaloneDb.createEmpty(sourceFileName, { + rootSubject: { name: "PerfTest Source" }, + }); + + // Create a SpatialCategory + const categoryId = SpatialCategory.insert( + sourceDb, + IModel.dictionaryId, + "TestCategory", + { color: ColorDef.blue.toJSON() } + ); + + // Create a PhysicalModel + const physicalModelId = PhysicalModel.insert( + sourceDb, + IModel.rootSubjectId, + "TestPhysicalModel" + ); + + // Insert elements with geometry + const geometry = createBoxGeometry(); + + console.log(`Inserting ${numElements} elements into source iModel...`); + const insertStartTime = performance.now(); + + for (let i = 0; i < numElements; i++) { + const elementProps: PhysicalElementProps = { + classFullName: "Generic:PhysicalObject", + model: physicalModelId, + category: categoryId, + code: Code.createEmpty(), + userLabel: `TestElement_${i}`, + geom: geometry, + placement: { + origin: new Point3d(i * 2, 0, 0), + angles: YawPitchRollAngles.createDegrees(0, 0, 0), + }, + }; + sourceDb.elements.insertElement(elementProps); + } + + const insertEndTime = performance.now(); + const insertDuration = insertEndTime - insertStartTime; + + sourceDb.saveChanges("Inserted test elements"); + + return { db: sourceDb, insertDuration }; +} + +function createEmptyTarget(): StandaloneDb { + const targetFileName = initOutputFile("perftest_target.bim"); + + const targetDb = StandaloneDb.createEmpty(targetFileName, { + rootSubject: { name: "PerfTest Target" }, + }); + + return targetDb; +} + +function printResults(results: { + elementCount: number; + insertionMs: number; + schemaMs: number; + processMs: number; +}): void { + const separator = "==========================================="; + const avgPerElement = results.processMs / results.elementCount; + + console.log(separator); + console.log(` Results: core-backend ${coreBackendPkgJson.version}`); + console.log(separator); + console.log(` Elements: ${results.elementCount}`); + console.log(` Element insertion: ${results.insertionMs.toFixed(2)} ms`); + console.log(` Schema processing: ${results.schemaMs.toFixed(2)} ms`); + console.log(` process() duration: ${results.processMs.toFixed(2)} ms`); + console.log(` Avg per element: ${avgPerElement.toFixed(4)} ms`); + console.log(separator); +} + +describe.skip("IModelTransformer Performance Tests", () => { + it("should transform 10k elements", async function () { + this.timeout(120000); // 2 minutes for large element count + + const elementCount = 10000; + + // Create source iModel + const sourceDbFile = IModelTransformerTestUtils.prepareOutputFile( + "IModelTransformer", + "Source10kElements.bim" + ); + const sourceDb = SnapshotDb.createEmpty(sourceDbFile, { + rootSubject: { name: "Source 10k Elements Test" }, + }); + + // Set up category and model + const categoryId = SpatialCategory.insert( + sourceDb, + IModel.dictionaryId, + "TestCategory", + { color: ColorDef.green.toJSON() } + ); + const modelId = PhysicalModel.insert( + sourceDb, + IModel.rootSubjectId, + "TestPhysicalModel" + ); + + // Insert 10k elements + const geom = IModelTransformerTestUtils.createBox(Point3d.create(1, 1, 1)); + const insertStartTime = performance.now(); + for (let i = 0; i < elementCount; i++) { + const physicalObjectProps: PhysicalElementProps = { + classFullName: PhysicalObject.classFullName, + model: modelId, + category: categoryId, + code: Code.createEmpty(), + userLabel: `Element-${i}`, + geom, + placement: Placement3d.fromJSON({ + origin: { x: i % 100, y: Math.floor(i / 100), z: 0 }, + angles: {}, + }), + }; + sourceDb.elements.insertElement(physicalObjectProps); + } + const insertEndTime = performance.now(); + sourceDb.saveChanges(); + + // Verify source element count + let sourceCount = 0; + for await (const _row of sourceDb.createQueryReader( + `SELECT COUNT(*) FROM ${PhysicalObject.classFullName}` + )) { + sourceCount = _row[0] as number; + } + assert.equal(sourceCount, elementCount, "Source should have 10k elements"); + + // Create empty target iModel + const targetDbFile = IModelTransformerTestUtils.prepareOutputFile( + "IModelTransformer", + "Target10kElements.bim" + ); + const targetDb = SnapshotDb.createEmpty(targetDbFile, { + rootSubject: { name: "Target 10k Elements Test" }, + }); + + // Transform + const transformer = new IModelTransformer(sourceDb, targetDb, { + loadSourceGeometry: true, + noProvenance: true, + }); + + const schemasStartTime = performance.now(); + await transformer.processSchemas(); + const schemasEndTime = performance.now(); + + const startTime = performance.now(); + await transformer.process(); + const endTime = performance.now(); + targetDb.saveChanges(); + + printResults({ + elementCount, + insertionMs: insertEndTime - insertStartTime, + schemaMs: schemasEndTime - schemasStartTime, + processMs: endTime - startTime, + }); + + // Verify target element count + let targetCount = 0; + for await (const _row of targetDb.createQueryReader( + `SELECT COUNT(*) FROM ${PhysicalObject.classFullName}` + )) { + targetCount = _row[0] as number; + } + assert.equal(targetCount, elementCount, "Target should have 10k elements"); + + // Cleanup + transformer.dispose(); + sourceDb.close(); + targetDb.close(); + }); + + it("should transform 10k elements (extended?)", async function () { + console.log("==========================================="); + console.log(" iModel Transformer Performance Test"); + console.log(` Elements: ${NUM_ELEMENTS}`); + console.log("===========================================\n"); + + let hostOptions = {}; + if (coreBackendVersion === "5.6.1") + hostOptions = { disableThinnedNativeInstanceWorkflow: true }; + + await IModelHost.startup(hostOptions); + + try { + // Create source iModel with elements + const { db: sourceDb, insertDuration } = + await createSourceWithElements(NUM_ELEMENTS); + console.log(`Source iModel created: ${sourceDb.pathName}`); + + // Create empty target iModel + const targetDb = createEmptyTarget(); + console.log(`Target iModel created: ${targetDb.pathName}`); + + // Create transformer + const transformer = new IModelTransformer(sourceDb, targetDb, { + loadSourceGeometry: true, + noProvenance: true, + }); + + // Time schema processing + console.log("Processing schemas..."); + + // Start CPU profiling for schemas + // const schemaSession = new inspector.Session(); + // schemaSession.connect(); + // await schemaSession.post("Profiler.enable"); + // await schemaSession.post("Profiler.start"); + + const schemaStartTime = performance.now(); + await transformer.processSchemas(); + const schemaEndTime = performance.now(); + const schemaDuration = schemaEndTime - schemaStartTime; + + // Stop CPU profiling and save + // const { profile: schemaProfile } = await schemaSession.post("Profiler.stop"); + // const schemaProfilePath = path.join(__dirname, "output", `10kElemProcessSchemas${coreTransformerVersion}-${coreBackendVersion}.cpuprofile`); + // fs.writeFileSync(schemaProfilePath, JSON.stringify(schemaProfile)); + // console.log(`Schema CPU profile saved to: ${schemaProfilePath}`); + // schemaSession.disconnect(); + + // Time the transformation process + console.log("Running transformer.process()..."); + + // Start CPU profiling + // const session = new inspector.Session(); + // session.connect(); + // await session.post("Profiler.enable"); + // await session.post("Profiler.start"); + + const processStartTime = performance.now(); + await transformer.process(); + const processEndTime = performance.now(); + const processDuration = processEndTime - processStartTime; + + // // Stop CPU profiling and save + // const { profile } = await session.post("Profiler.stop"); + // const profilePath = path.join(__dirname, "output", `10kElemTransform${coreTransformerVersion}-${coreBackendVersion}.cpuprofile`); + // fs.writeFileSync(profilePath, JSON.stringify(profile)); + // console.log(`CPU profile saved to: ${profilePath}`); + // session.disconnect(); + + // Cleanup + transformer.dispose(); + targetDb.saveChanges("Transformation complete"); + + sourceDb.close(); + targetDb.close(); + + console.log("\n==========================================="); + console.log(` Results: core-backend: ${coreBackendVersion}`); + console.log("==========================================="); + console.log(` Elements: ${NUM_ELEMENTS}`); + console.log(` Element insertion: ${insertDuration.toFixed(2)} ms`); + console.log(` Schema processing: ${schemaDuration.toFixed(2)} ms`); + console.log(` process() duration: ${processDuration.toFixed(2)} ms`); + console.log( + ` Avg per element: ${(processDuration / NUM_ELEMENTS).toFixed(4)} ms` + ); + console.log("==========================================="); + } catch (error) { + console.error("Error during performance test:", error); + throw error; + } finally { + await IModelHost.shutdown(); + } + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2cdb85149..da04e8c36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,71 +12,77 @@ importers: .: devDependencies: beachball: - specifier: ^2.33.3 - version: 2.43.1(typescript@5.6.3) + specifier: ^2.55.1 + version: 2.56.0(typescript@5.9.3) fast-glob: - specifier: ^3.2.12 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 husky: - specifier: ^8.0.3 - version: 8.0.3 + specifier: ^9.1.7 + version: 9.1.7 lint-staged: specifier: ^16.2.7 - version: 16.2.7 + version: 16.4.0 prettier: - specifier: ^3.1.1 - version: 3.2.5 + specifier: ^3.6.2 + version: 3.6.2 packages/performance-scripts: devDependencies: '@itwin/build-tools': - specifier: ^4.10.6 - version: 4.10.6(@types/node@18.19.31) + specifier: ^5.9.1 + version: 5.9.1(@types/node@22.18.12) '@itwin/core-backend': - specifier: ^4.3.5 - version: 4.3.5(@itwin/core-bentley@4.3.5)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) '@types/node': - specifier: ^18.11.5 - version: 18.19.31 + specifier: ^22 + version: 22.18.12 typescript: - specifier: ~5.3.3 - version: 5.3.3 + specifier: ~5.6.2 + version: 5.6.3 packages/performance-tests: dependencies: '@itwin/core-backend': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) '@itwin/core-bentley': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/core-common': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) '@itwin/core-geometry': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/core-quantity': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1) '@itwin/ecschema-metadata': - specifier: 4.3.5 - version: 4.3.5(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12)) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)) '@itwin/imodel-transformer': specifier: workspace:* version: link:../transformer '@itwin/imodels-access-backend': - specifier: ^4.1.4 - version: 4.1.6(@itwin/core-backend@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0))(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(inversify@6.0.2)(reflect-metadata@0.1.14) + specifier: ^6.0.1 + version: 6.0.2(@itwin/core-backend@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))))(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1)) + '@itwin/imodels-access-common': + specifier: ^6.0.1 + version: 6.0.2(@itwin/core-bentley@5.9.1)(@itwin/imodels-client-management@6.0.2) '@itwin/imodels-client-authoring': - specifier: 4.4.0 - version: 4.4.0(inversify@6.0.2)(reflect-metadata@0.1.14) + specifier: ^6.0.1 + version: 6.0.2 '@itwin/node-cli-authorization': - specifier: ~0.9.0 - version: 0.9.2(@itwin/core-bentley@4.10.12) + specifier: ^3.0.1 + version: 3.0.2(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) + '@itwin/object-storage-azure': + specifier: ^3.0.4 + version: 3.0.4 '@itwin/perf-tools': specifier: ^4.10.12 - version: 4.10.12 + version: 4.11.6 dotenv: specifier: ^10.0.0 version: 10.0.0 @@ -91,20 +97,20 @@ importers: version: 16.2.0 devDependencies: '@itwin/build-tools': - specifier: ^4.10.6 - version: 4.10.6(@types/node@14.14.31) + specifier: ^5.9.1 + version: 5.9.1(@types/node@22.18.12) '@itwin/eslint-plugin': - specifier: ^4.0.2 - version: 4.0.2(eslint@8.57.0)(typescript@5.3.3) + specifier: ^5.2.1 + version: 5.2.1(eslint@9.38.0)(typescript@5.6.3) '@itwin/itwins-client': - specifier: ^1.2.1 - version: 1.3.0 + specifier: ^1.6.1 + version: 1.6.1 '@itwin/oidc-signin-tool': - specifier: ^4.3.2 - version: 4.3.4(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) + specifier: ^5.0.0 + version: 5.0.2(@itwin/core-bentley@5.9.1) '@types/chai': specifier: ^4.1.4 - version: 4.3.1 + version: 4.3.20 '@types/fs-extra': specifier: ^4.0.7 version: 4.0.15 @@ -112,62 +118,71 @@ importers: specifier: ^8.2.2 version: 8.2.3 '@types/node': - specifier: 14.14.31 - version: 14.14.31 + specifier: ^22 + version: 22.18.12 '@types/yargs': specifier: ^12.0.5 version: 12.0.20 chai: specifier: ^4.3.6 - version: 4.4.1 + version: 4.5.0 eslint: - specifier: ^8.36.0 - version: 8.57.0 + specifier: ^9.11.1 + version: 9.38.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.2(eslint@9.38.0) mocha: specifier: ^10.0.0 - version: 10.4.0 + version: 10.8.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.6.2 rimraf: specifier: ^3.0.2 version: 3.0.2 ts-node: specifier: ^10.7.0 - version: 10.9.2(@types/node@14.14.31)(typescript@5.3.3) + version: 10.9.2(@types/node@22.18.12)(typescript@5.6.3) typescript: - specifier: ~5.3.3 - version: 5.3.3 + specifier: ~5.6.2 + version: 5.6.3 packages/test-app: dependencies: '@itwin/core-backend': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) '@itwin/core-bentley': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/core-common': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) '@itwin/core-geometry': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/imodel-transformer': specifier: workspace:* version: link:../transformer '@itwin/imodels-access-backend': - specifier: ^2.2.1 - version: 2.3.0(@itwin/core-backend@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0))(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12)) + specifier: ^6.0.2 + version: 6.0.2(@itwin/core-backend@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))))(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1)) + '@itwin/imodels-access-common': + specifier: ^6.0.2 + version: 6.0.2(@itwin/core-bentley@5.9.1)(@itwin/imodels-client-management@6.0.2) '@itwin/imodels-client-authoring': - specifier: 2.3.0 - version: 2.3.0 + specifier: ^6.0.2 + version: 6.0.2 + '@itwin/imodels-client-management': + specifier: ^6.0.2 + version: 6.0.2 '@itwin/node-cli-authorization': - specifier: ~0.9.0 - version: 0.9.2(@itwin/core-bentley@4.10.12) + specifier: ^3.0.1 + version: 3.0.2(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) + '@itwin/object-storage-azure': + specifier: ^3.0.4 + version: 3.0.4 dotenv: specifier: ^10.0.0 version: 10.0.0 @@ -182,11 +197,11 @@ importers: version: 17.7.2 devDependencies: '@itwin/build-tools': - specifier: ^4.10.6 - version: 4.10.6(@types/node@18.19.31) + specifier: ^5.9.1 + version: 5.9.1(@types/node@22.18.12) '@itwin/eslint-plugin': - specifier: 4.0.2 - version: 4.0.2(eslint@8.57.0)(typescript@5.3.3) + specifier: ^5.2.1 + version: 5.2.1(eslint@9.38.0)(typescript@5.9.3) '@itwin/projects-client': specifier: ^0.6.0 version: 0.6.0 @@ -200,8 +215,8 @@ importers: specifier: ^8.2.3 version: 8.2.3 '@types/node': - specifier: ^18.16.14 - version: 18.19.31 + specifier: ^22 + version: 22.18.12 '@types/yargs': specifier: 17.0.19 version: 17.0.19 @@ -209,17 +224,17 @@ importers: specifier: ^5.2.1 version: 5.2.1 eslint: - specifier: ^8.36.0 - version: 8.57.0 + specifier: ^9.11.1 + version: 9.38.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.2(eslint@9.38.0) mocha: specifier: ^10.2.0 - version: 10.4.0 + version: 10.8.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.6.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -227,69 +242,72 @@ importers: specifier: ^0.5.21 version: 0.5.21 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.6.2 + version: 5.9.3 packages/transformer: dependencies: semver: specifier: ^7.5.2 - version: 7.6.2 + version: 7.7.3 devDependencies: '@itwin/build-tools': - specifier: ^4.10.12 - version: 4.10.12(@types/node@18.19.31) + specifier: ^5.9.1 + version: 5.9.1(@types/node@22.18.12) '@itwin/core-backend': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) '@itwin/core-bentley': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/core-common': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) '@itwin/core-geometry': - specifier: ^4.10.12 - version: 4.10.12 + specifier: ^5.9.1 + version: 5.9.1 '@itwin/core-quantity': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1) '@itwin/ecschema-locaters': - specifier: ^4.10.12 - version: 4.10.12(@itwin/ecschema-metadata@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12))) + specifier: ^5.9.1 + version: 5.9.1(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) '@itwin/ecschema-metadata': - specifier: ^4.10.12 - version: 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12)) + specifier: ^5.9.1 + version: 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)) '@itwin/eslint-plugin': - specifier: ^4.0.2 - version: 4.0.2(eslint@8.57.0)(typescript@5.3.3) + specifier: ^5.2.1 + version: 5.2.1(eslint@9.38.0)(typescript@5.9.3) '@types/chai': - specifier: 4.3.1 - version: 4.3.1 + specifier: ^4.3.20 + version: 4.3.20 '@types/chai-as-promised': - specifier: ^7.1.5 + specifier: ^7.1.8 version: 7.1.8 '@types/mocha': specifier: ^8.2.3 version: 8.2.3 '@types/node': - specifier: ^18.16.14 - version: 18.19.31 + specifier: ^22.18.8 + version: 22.18.12 '@types/node-fetch': - specifier: 2.6.11 - version: 2.6.11 + specifier: ^2.6.13 + version: 2.6.13 '@types/semver': - specifier: 7.3.10 - version: 7.3.10 + specifier: ^7.7.1 + version: 7.7.1 '@types/sinon': specifier: ^9.0.11 version: 9.0.11 + '@typescript-eslint/parser': + specifier: ^8.45.0 + version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) chai: - specifier: ^4.3.7 - version: 4.4.1 + specifier: ^4.5.0 + version: 4.5.0 chai-as-promised: - specifier: ^7.1.1 - version: 7.1.1(chai@4.4.1) + specifier: ^7.1.2 + version: 7.1.2(chai@4.5.0) cpx2: specifier: ^3.0.2 version: 3.0.2 @@ -297,17 +315,17 @@ importers: specifier: ^5.2.1 version: 5.2.1 eslint: - specifier: ^8.36.0 - version: 8.57.0 + specifier: ^9.36.0 + version: 9.38.0 eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + specifier: ^9.1.2 + version: 9.1.2(eslint@9.38.0) js-base64: - specifier: ^3.7.5 - version: 3.7.7 + specifier: ^3.7.8 + version: 3.7.8 mocha: - specifier: ^10.2.0 - version: 10.4.0 + specifier: ^10.8.2 + version: 10.8.2 npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -315,8 +333,8 @@ importers: specifier: ^15.1.0 version: 15.1.0 prettier: - specifier: ^3.1.1 - version: 3.2.5 + specifier: ^3.6.2 + version: 3.6.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -327,209 +345,223 @@ importers: specifier: ^0.5.21 version: 0.5.21 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.9.3 + version: 5.9.3 packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@azure/abort-controller@1.1.0': - resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} - engines: {node: '>=12.0.0'} - '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} - '@azure/core-auth@1.7.2': - resolution: {integrity: sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==} - engines: {node: '>=18.0.0'} + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} + engines: {node: '>=20.0.0'} - '@azure/core-http@2.3.2': - resolution: {integrity: sha512-Z4dfbglV9kNZO177CNx4bo5ekFuYwwsvjLiKdZI4r84bYGv3irrbQz7JC3/rUfFH2l4T/W6OFleJaa2X0IaQqw==} - engines: {node: '>=14.0.0'} - deprecated: This package is no longer supported. Please migrate to use @azure/core-rest-pipeline + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} + engines: {node: '>=20.0.0'} - '@azure/core-http@3.0.4': - resolution: {integrity: sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==} - engines: {node: '>=14.0.0'} + '@azure/core-http-compat@2.3.1': + resolution: {integrity: sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==} + engines: {node: '>=20.0.0'} '@azure/core-lro@2.7.2': resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} engines: {node: '>=18.0.0'} - '@azure/core-paging@1.5.0': - resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} - engines: {node: '>=14.0.0'} - '@azure/core-paging@1.6.2': resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-tracing@1.0.0-preview.13': - resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} - engines: {node: '>=12.0.0'} - - '@azure/core-util@1.9.0': - resolution: {integrity: sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==} - engines: {node: '>=18.0.0'} + '@azure/core-rest-pipeline@1.22.1': + resolution: {integrity: sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==} + engines: {node: '>=20.0.0'} - '@azure/logger@1.1.2': - resolution: {integrity: sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==} - engines: {node: '>=18.0.0'} + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} + engines: {node: '>=20.0.0'} - '@azure/storage-blob@12.13.0': - resolution: {integrity: sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==} - engines: {node: '>=14.0.0'} + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} + engines: {node: '>=20.0.0'} - '@azure/storage-blob@12.17.0': - resolution: {integrity: sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==} - engines: {node: '>=14.0.0'} + '@azure/core-xml@1.5.0': + resolution: {integrity: sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw==} + engines: {node: '>=20.0.0'} - '@azure/storage-blob@12.7.0': - resolution: {integrity: sha512-7YEWEx03Us/YBxthzBv788R7jokwpCD5KcIsvtE5xRaijNX9o80KXpabhEwLR9DD9nmt/AlU/c1R+aXydgCduQ==} - engines: {node: '>=8.0.0'} + '@azure/logger@1.3.0': + resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} + engines: {node: '>=20.0.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + '@azure/storage-blob@12.29.1': + resolution: {integrity: sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg==} + engines: {node: '>=20.0.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} - engines: {node: '>=6.9.0'} + '@azure/storage-common@12.1.1': + resolution: {integrity: sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg==} + engines: {node: '>=20.0.0'} - '@babel/core@7.24.4': - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.4': - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.4': - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.1': - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@bentley/imodeljs-native@4.10.42': - resolution: {integrity: sha512-TrZuGcCuoFB7IaYdmTR01taLdpqKj2wp3Gry1t4FXWB1mVCN5B3jKhXocRjCAMShvENq/71Lo0kxC1EpyCwqxw==} - - '@bentley/imodeljs-native@4.3.6': - resolution: {integrity: sha512-c0DKEqyUpGOqu2NNU9IFJ96IcmIYA0eyl7rBmmeu9B4mmLW1n8ktdAPVIqd6jxbM+sdmiVwQIZOkAKk1DQpU3Q==} + '@bentley/imodeljs-native@5.9.17': + resolution: {integrity: sha512-fTMCfoIJ+dPrY/nMq2u6ngVO027lUCOISSqeGjXOnu5kX+7ggU/Se2cB+eByrwLXyXenQ2cbUXCOo8CBWV/PoA==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@es-joy/jsdoccomment@0.43.1': - resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} - engines: {node: '>=16'} + '@es-joy/jsdoccomment@0.50.2': + resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} + engines: {node: '>=18'} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@google-cloud/paginator@5.0.2': + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.0.0': + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} + + '@google-cloud/storage-control@0.5.0': + resolution: {integrity: sha512-mcWlgt6FHD31FEWLxXh2cVmX03zCDOoz8oxC9Uxfddni9VVBFOJR8AiYkisWPGsUhQt9a5PY5n5Yh36KLZCntg==} + engines: {node: '>=18'} + + '@google-cloud/storage@7.17.2': + resolution: {integrity: sha512-6xN0KNO8L/LIA5zu3CJwHkJiB6n65eykBLOb0E+RooiHYgX8CSao6lvQiKT9TBk2gL5g33LL3fmhDodZnt56rw==} + engines: {node: '>=14'} + + '@grpc/grpc-js@1.14.0': + resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} + engines: {node: '>=12.10.0'} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -543,256 +575,189 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@itwin/build-tools@4.10.12': - resolution: {integrity: sha512-CkP1y8frBsZ7xMp7FgKHGhCcihBsIHCoSO/rg8RSk9XBFYtrLtJ0DmBnta1BnjHPBUxBULaHqCrLoMDVQnX1HA==} + '@itwin/build-tools@5.9.1': + resolution: {integrity: sha512-sVg+W1DmtDWUpGKN6LiNCkIlwsvjHQlL8zR4soRwZWUfqU8xK1jxqtVe7Za86Wg82QWrjJI42WK3jvA209B8EQ==} hasBin: true - '@itwin/build-tools@4.10.6': - resolution: {integrity: sha512-org2t5aAWEhMSEzNFaGoDxXz4fjclHCx8Ph3p3zEqd5N4ErgYHTSpNuSj0zB8G4kaTGE8CQzzK/gaY0Btz3wCA==} - hasBin: true - - '@itwin/certa@4.5.2': - resolution: {integrity: sha512-QL0ezmdqvd+gVD/GpDDhtFrZwulJFqkPFzF1ned5PlG+D3Q36/aGJ5+grjyNK89afF/nHJHPz1DVPAWXM52tqQ==} + '@itwin/certa@5.2.4': + resolution: {integrity: sha512-+s/qKHSFItyTm9XT1/EqLFlDvf/2y0jF0cgThZIvuSYya/wfn8VFfPDeEr7RmU4Bwc5+o7tgVVzapBoUe+Kqlg==} hasBin: true peerDependencies: - electron: '>=23.0.0 <30.0.0' + electron: ^35.0.0 || ^36.0.0 || ^37.0.0 || ^38.0.0 peerDependenciesMeta: electron: optional: true - '@itwin/cloud-agnostic-core@1.6.0': - resolution: {integrity: sha512-IKj3lxaVQqGezz7bkFjKEf9g7Bk4i2cu2aCJsd9HnV2gn79lo8oU0UiPJ+kuVtMsEcN/yRq/EXk/IR/VnNkLKA==} - engines: {node: '>=12.20 <19.0.0'} - - '@itwin/cloud-agnostic-core@2.2.3': - resolution: {integrity: sha512-OL1kGQgI241M3mUvOIkPGvOZkQm7qQUjt2GOvknSTUB9cnMVs+vASMUD3e5xEchKdMOdepxKS1YpaFWAS8WKxQ==} - peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 - - '@itwin/cloud-agnostic-core@2.3.0': - resolution: {integrity: sha512-oFSaERSqnuXtpzJ/dX61/p47eFoNoZ3NG0F9NUpndmiErVYba8aEnlVHQqXBQb5kycXBd7c9a5Ihnif1ussLLw==} + '@itwin/cloud-agnostic-core@3.0.4': + resolution: {integrity: sha512-aOgtonCzp1mm8IueeF+7wcIsp/lpkkv3qSyPXj+C141xQItnHL6vjhSD8W8X3OWPlGZKS1JqB/mB20/2X14dFQ==} peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 + inversify: ^7.5.2 + reflect-metadata: ^0.2.2 peerDependenciesMeta: inversify: optional: true reflect-metadata: optional: true - '@itwin/core-backend@4.10.12': - resolution: {integrity: sha512-ITxdLHon0nES0lKbP/BOPB4PuzPpTP+T49cDfudXdK+3LNMFLRhU3QyKfI1kdM9TmRlyc8GraOw3QTm12I9gUg==} - engines: {node: ^18.0.0 || ^20.0.0 || ^22.0.0} - peerDependencies: - '@itwin/core-bentley': ^4.10.12 - '@itwin/core-common': ^4.10.12 - '@itwin/core-geometry': ^4.10.12 - '@opentelemetry/api': ^1.0.4 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - - '@itwin/core-backend@4.3.5': - resolution: {integrity: sha512-FQ5oF9cZs8pxPie1xifogmYLIYdj2THD1xNdk+RnOJtsvUM0xn764arfkaQ+PRKDEAtW2MJKAQYHZa5WP2UEVA==} - engines: {node: ^18.0.0 || ^20.0.0} + '@itwin/core-backend@5.9.1': + resolution: {integrity: sha512-2GJxVMd+pCNMqH9C+CVDwhrd2k7yl1mL8KfyldXGXSXZEoe6xDaAnNk7owo0tYDjqoI6Jgsb6MrHwTGCOK8zqQ==} + engines: {node: ^20.0.0 || ^22.0.0 || ^24.0.0} peerDependencies: - '@itwin/core-bentley': ^4.3.5 - '@itwin/core-common': ^4.3.5 - '@itwin/core-geometry': ^4.3.5 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-common': 5.9.1 + '@itwin/core-geometry': 5.9.1 + '@itwin/ecschema-metadata': 5.9.1 '@opentelemetry/api': ^1.0.4 peerDependenciesMeta: '@opentelemetry/api': optional: true - '@itwin/core-bentley@4.10.12': - resolution: {integrity: sha512-NRhwYKjEgxXliiXCjtNp1BHivMYEJwwarY4TsXwhd3Jmt8yL6Bws/Ls0PiDDA3BIzWZPKsGacNkyFC7K5aq/kQ==} - - '@itwin/core-bentley@4.3.5': - resolution: {integrity: sha512-DdQejKNBtukthQp8LxEr81ah60rYhcfIiaWk/hKa5D3EIMlk65JkRUIHkuiznkW9l+DBMPkoLdBeHWc1SFV6jA==} + '@itwin/core-bentley@5.9.1': + resolution: {integrity: sha512-avysdRO0rT1mkYGPh8g3cxFZb/fWpYyo2zBxrsQcFDUpkTt4cF6/UkdAKylQ8h4xd19/AKucR2Vh3K7Eeez++Q==} - '@itwin/core-common@4.10.12': - resolution: {integrity: sha512-9izI7XHRfZnau3W98UuQjc4WpKYJDDAV65dxY0wCi0RmkRoSbpF46zc91phxwZ0qvopgcTdNyJ1LyInIoV0JMw==} + '@itwin/core-common@5.9.1': + resolution: {integrity: sha512-yF4UUznzr+uxi/J0m0mDFgxkrOd4GX/lwsAitD9MQVndaYIgKHv1gxu9SbolOt02+IJ7DTxgaMrCasQLldfx+w==} peerDependencies: - '@itwin/core-bentley': ^4.10.12 - '@itwin/core-geometry': ^4.10.12 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-geometry': 5.9.1 - '@itwin/core-common@4.3.5': - resolution: {integrity: sha512-GMFtRpQkCewzVkc6tZaqlGTag5e0MJUQQhPAVY5DpPD7PKOAKC4BGUMuznWFUCgI6e8Iu0dQ278eXS22+oQHfg==} - peerDependencies: - '@itwin/core-bentley': ^4.3.5 - '@itwin/core-geometry': ^4.3.5 - - '@itwin/core-geometry@4.10.12': - resolution: {integrity: sha512-P/AxJCXC0Dwz5mW3w4h7uHKdueXexyJOiQpgP6y9118ovrbkhEtVP6HpjltmCqpFyLthdX1NX39E0WJNk2h5vA==} - - '@itwin/core-quantity@4.10.12': - resolution: {integrity: sha512-Zxg1FSQd2zNEKfKhP9zpcDWkWqJKLc8PlA6O6PoI1EGSQifx2+0EZAXYr8Uw5/WasVkkrM3BxBP9saUFH6HaRA==} - peerDependencies: - '@itwin/core-bentley': ^4.10.12 + '@itwin/core-geometry@5.9.1': + resolution: {integrity: sha512-W82J2IXrsd7iKk9Qtvv7AF9JzYGoEnim7ojum09FcJrSJifRMWukT4vJzpa1uSAIlgVjwWsJwE7RtV3RmdE7jA==} - '@itwin/core-telemetry@4.10.12': - resolution: {integrity: sha512-lOig+2h7YJFovyyLAjXFWjMBqL326eMWAzajgHkQUmDeciTP6qNHoliqVTuBWwSxuvvnUrcW7XMqlrsW9A6S2A==} - - '@itwin/core-telemetry@4.3.5': - resolution: {integrity: sha512-wethgnD3osb+Yzy517el0zLQlpiU+S78OoeTCUr0zAYyKPi6naelSec41H2vTATtPLNr77LYnyWtMtIi63t6hg==} - - '@itwin/ecschema-locaters@4.10.12': - resolution: {integrity: sha512-F9j1rSJ4oz8uNgsRHLaQKHjkqdgTVLZCQSfQY1UcM3M7xfaHehDwaXLK1TKnRLIfAkEXyi3BhHIYo7MlLRKvOg==} + '@itwin/core-quantity@5.9.1': + resolution: {integrity: sha512-M+pOFG+y5iLA9QJqmUl/Yd/4f7R+zA6OAC1oipNxUL6VMPIRnzja7O8qp6Y05Zle8uu2P2BbrD9w5M+OUjC7ZQ==} peerDependencies: - '@itwin/ecschema-metadata': ^4.10.12 + '@itwin/core-bentley': 5.9.1 - '@itwin/ecschema-metadata@4.10.12': - resolution: {integrity: sha512-1VbunG842YIDf3Nc50nclPMcqIe5nmuVblTbHgSO+GuzZx2jnnyqW0vczuBfPMWDimN5WvAqGWKTg5uqNzJITQ==} + '@itwin/ecschema-locaters@5.9.1': + resolution: {integrity: sha512-162jdDQDIujUCtRHwBl5xhy+EZDBGgXhjycnuw5kTFqLUCSBo7TsobM8N3D8wiVkldXhccuTjSWP7V91EAo5LA==} peerDependencies: - '@itwin/core-bentley': ^4.10.12 - '@itwin/core-quantity': ^4.10.12 + '@itwin/ecschema-metadata': 5.9.1 - '@itwin/ecschema-metadata@4.3.5': - resolution: {integrity: sha512-YAeh/bGAejVHQJpCot+KX4uvxm9EsmAZZb77BMPP9G2R2QJQ84uhoPXmJeAK+y/B3DTiN3j6hUzcfoB48fNduA==} + '@itwin/ecschema-metadata@5.9.1': + resolution: {integrity: sha512-H9lLwR5O7kaminfqgfP+dC07AWCPevXflxM4GmiJSc/5UU6tZTDJBBfqRUt8nVVUojJ2piTt4nYrP4Fbx6QxCg==} peerDependencies: - '@itwin/core-bentley': ^4.3.5 - '@itwin/core-quantity': ^4.3.5 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-quantity': 5.9.1 - '@itwin/eslint-plugin@4.0.2': - resolution: {integrity: sha512-UDwToOexhFRlS8XQSezvjoRHp8FH9KxfJSb6b1pN2a21g0uhsqxCQDKuOrGwSnJEERIvxMJB0ddH0aYg4dRvJw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@itwin/eslint-plugin@5.2.1': + resolution: {integrity: sha512-iFmxAXzBYUm/yHiyp37V8Qn2oZ9iqwB1HxWX1AAhewk77JUIhO1KLY2hrBNisHx49giy7hZmIOBEaXc357z+Uw==} + engines: {node: ^18.18.0 || ^20.0.0 || ^22.0.0} hasBin: true peerDependencies: - eslint: ^8.56.0 + eslint: ^9.11.1 typescript: ^3.7.0 || ^4.0.0 || ^5.0.0 - '@itwin/imodels-access-backend@2.3.0': - resolution: {integrity: sha512-g2Bygiu6Is/Xa6OWUxXN/BZwGU2M4izFl8fdgL1cFWxhoWSYL169bN3V4zvRTUJIqtsNaTyOeRu2mjkRgHY9KQ==} - peerDependencies: - '@itwin/core-backend': ^3.3.0 - '@itwin/core-bentley': ^3.3.0 - '@itwin/core-common': ^3.3.0 - - '@itwin/imodels-access-backend@4.1.6': - resolution: {integrity: sha512-8POEp9Cu/ynTVSIq4T1LLAiaZJPRclpxzITwN6oPukFrzPq+0nGmdnXsi0HSSHjEgMY6c6Rk9+4oMQTOrlZpTg==} + '@itwin/imodels-access-backend@6.0.2': + resolution: {integrity: sha512-KLlCejJJVijmVxg4t1yhKjxdZ1N+Bg+ZsHfhayCFTOSYfw0seQWm9d2SS4S5/bBI0kSecD3esX6+xg3t2MVBbw==} peerDependencies: - '@itwin/core-backend': ^4.0.0 - '@itwin/core-bentley': ^4.0.0 - '@itwin/core-common': ^4.0.0 + '@itwin/core-backend': ^5.0.0 + '@itwin/core-bentley': ^5.0.0 + '@itwin/core-common': ^5.0.0 - '@itwin/imodels-access-common@4.1.6': - resolution: {integrity: sha512-clgmDy54XkUuX0rjBrinDukc1anxZlqfzPhRYKvi3CBI6v84mXCGrCciootbdQpv+7yNy3L+FOHGPYXukLZcUA==} + '@itwin/imodels-access-common@6.0.2': + resolution: {integrity: sha512-qR6ZTk3hyepniYUixnuoin/59eAD9idLSdFkTRtpdrqWMLKKvtD9heoOgxbCBd4jnuEfJpuwDTmJFbFkSBnCNw==} peerDependencies: - '@itwin/core-bentley': ^4.0.0 - '@itwin/core-common': ^4.0.0 + '@itwin/core-bentley': ^5.0.0 + '@itwin/imodels-client-management': 6.0.2 - '@itwin/imodels-client-authoring@2.3.0': - resolution: {integrity: sha512-wsG6TRv+Ss/L9U5T9/nYwlvQBR5mipDqoaKlFcUwxeivTtB9K3YbeUEPdY2TaDsoFwwuM5cQSqcNr6K21GZ0cQ==} + '@itwin/imodels-client-authoring@6.0.2': + resolution: {integrity: sha512-fa/U/tJwtU6LLq8lSLw7nijaVt16G3MLjpI1oEXWCO8ekpWfldqgxxUIWuifB4guXO3MqZaTLxdGRoAavrjPSg==} - '@itwin/imodels-client-authoring@4.4.0': - resolution: {integrity: sha512-l3LL26ZuSIMjcfDi2ne9326i6mqdJdzvQfQ431fX0iHO7ISAVBn1nQ4roEhXRdIPgnWJsMKFD0FhAJuMSCyBJA==} + '@itwin/imodels-client-management@6.0.2': + resolution: {integrity: sha512-Z36FM9DesrBaYEuwDVOFaPgzqsTVXmXax/sy7mUQxs22MUUDi4S6/d3AjcoAZcSdM/m2DfWChm53tqSXKM0AnA==} - '@itwin/imodels-client-management@2.3.0': - resolution: {integrity: sha512-dKR5fGaJU66PcQ2H7v4kY9zRGBlH9X1wWuEWNkBiIaSjfsoJ0VXIF0xupD0wa6fHT0jgRlHzvV2qgasxJ3oapg==} + '@itwin/itwins-client@1.6.1': + resolution: {integrity: sha512-3/fXtJUdH7NoGr8msQba7fBrZ2sASBrAdqnEPI1ue6rLNuTkJqSR4kVoOVF7JE/VeZcQDNACHj20YWoT5ofMTw==} - '@itwin/imodels-client-management@4.4.0': - resolution: {integrity: sha512-T/WruORfR0sUNAePI08tVDFwvhzQ1ob4rOrj64FEJ6ln2jmqoGgICNtb+QP0aBoqQU6GhtEx/fM5Jhb7Tm1k9A==} - - '@itwin/itwins-client@1.3.0': - resolution: {integrity: sha512-Gtis9v/LKs9B3m3z5XupX7pQS96LGvZ7Hx2Vcez12qjHuFk0cgbYCGXu7gFYvJNXCXg4R70uUTvsvnsbxYfsFw==} - - '@itwin/node-cli-authorization@0.9.2': - resolution: {integrity: sha512-/L1MYQEKlwfBaHhO1OgRvxFOcq77lUyjR1JSeyl9iYLWuxYdwrjuRTObgX/XCGogRm3ZcUHR9YctRJgPrRyjwg==} - peerDependencies: - '@itwin/core-bentley': ^3.0.0 - - '@itwin/object-storage-azure@1.6.0': - resolution: {integrity: sha512-b0rxhn0NAFY1alOEGMAUaJtK8WG7xoJPDOVjuA8nC7zFcxxtP2VOsSOauuie2zzL3GDi9OU6vywR3gAcJcTZww==} - engines: {node: '>=12.20 <19.0.0'} - - '@itwin/object-storage-azure@2.2.3': - resolution: {integrity: sha512-Y61HBUyUWc4QZXGWsG0h8tcQUqAI3O1VyG8fRaxVtsAniwfqjyB7ZA5xXhilC5WbUeLyeZI8hzT9SvwcEGblYg==} + '@itwin/node-cli-authorization@3.0.2': + resolution: {integrity: sha512-bGWeRp7tE5p1hMLVNgNpXjXRKXbaV5b+OCKZBfyhzng8n3L6WcXqADDIkqd55DoKy95gC050jz9jG2DMzE9DYg==} peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 + '@itwin/core-bentley': ^5.0.0 - '@itwin/object-storage-azure@2.3.0': - resolution: {integrity: sha512-WHECH+aBo9OVk5xcY5cdGnj5g08d2jMQefm6Q4rvHcqlfFtCKh4hfUMkaU5GAF8peNZxkxy06Goe206RWTtsVw==} + '@itwin/object-storage-azure@3.0.4': + resolution: {integrity: sha512-KtXn8DCTpnRcPRQv2v6XNSa9Zb266vL8C71oH5RKbAPjl6QHtj1A1uN5m+pHt23b1UvJYB3QZz+7YKWeqU9dqQ==} peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 + inversify: ^7.5.2 + reflect-metadata: ^0.2.2 peerDependenciesMeta: inversify: optional: true reflect-metadata: optional: true - '@itwin/object-storage-core@1.6.0': - resolution: {integrity: sha512-6X6YZ5E/kSJJlKQm7+xluzBGBGPILlEmEfzBgEcDqEwABS214OcKU74kW5mfrB6AiNXKZ2RkxfafW/ZpYi24fg==} - engines: {node: '>=12.20 <19.0.0'} - - '@itwin/object-storage-core@2.2.3': - resolution: {integrity: sha512-oBPkyZN1gVCRdK2KJlF782skWf/pudkDQr8e6LArj0ixtsgUNPTCeA+suLuEWGrVOaywafFbYxS57tEARvR7wg==} + '@itwin/object-storage-core@3.0.4': + resolution: {integrity: sha512-CnNpqI3ZgCMM6sFMXqvToFjN6/9K4xCOQZf6svL0PgaMhNF0cfqhqtgJG58CGuH/fvVENcCqXmn+4esX0KiOjQ==} peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 + inversify: ^7.5.2 + reflect-metadata: ^0.2.2 + peerDependenciesMeta: + inversify: + optional: true + reflect-metadata: + optional: true - '@itwin/object-storage-core@2.3.0': - resolution: {integrity: sha512-PAHaTMG7sE1hLlXBmSimxo/oZDJZJ81vS/hJ1p7QnwEu6MEtLgo5wXMU7sy7fHtOeh8ZqzKpXWkQyry5kRDXAg==} + '@itwin/object-storage-google@3.0.4': + resolution: {integrity: sha512-ADiKiNf1UKvrxFfODDeBCIsierAKEosJ9K7CCbzmEnIOyrUo3c/jM8zr6fFuPBb92NEBgCFrcmHPfSr+j0hvWw==} peerDependencies: - inversify: ^6.0.1 - reflect-metadata: ^0.1.13 + inversify: ^7.5.2 + reflect-metadata: ^0.2.2 peerDependenciesMeta: inversify: optional: true reflect-metadata: optional: true - '@itwin/oidc-signin-tool@4.3.4': - resolution: {integrity: sha512-eAQOIQah1z0oCEE2KQhYt0c7KAjntY71wj4SCiU7HDBq119i6vBctk77snPrhBYdwWAgyEpNLC9pVCAHG/fgXA==} + '@itwin/oidc-signin-tool@5.0.2': + resolution: {integrity: sha512-71rD1C1YTfz+PkXrxg0yp9XXavfvi2DAXfebR7/8QSAfhCeK3bnhWlGJExoE8l/SfVbOjbjPrfpNTS9kugqddw==} peerDependencies: - '@itwin/core-bentley': ^3.3.0 || ^4.0.0 + '@itwin/core-bentley': ^5.0.0 - '@itwin/perf-tools@4.10.12': - resolution: {integrity: sha512-zH7Wd5vdVoKhNNRW7BM5hWrKRMJP9Mvi+7D6hYpXlCldRiSEgi3NUcezAtiMoEsjwUoE2yBG08U0WjRm/aIjiA==} + '@itwin/perf-tools@4.11.6': + resolution: {integrity: sha512-NM4WSGEjclXLafAEpDV+BMDAtWO/FoeAZmhbBLCy8rPTDEuXb0APNWBHDvoa6q8rXcKosv4TvmQ5L0bLW42KMw==} '@itwin/projects-client@0.6.0': resolution: {integrity: sha512-uA8lqjNLIpmpdldoOa/EwQfaV+F2yflxoi1aEZSb+R+dlCyvlsE/hLM7oTzYwmYmFzdezKNbFjwN2PvWLBWaBg==} - '@itwin/service-authorization@1.2.0': - resolution: {integrity: sha512-Mq3eGtPChVE5ANA8kIqz6lzCzZJq5hdyZ30XCxBMR+qL47kFBIf6MUYIBs1JP6S1j8WY+k42i+DRTjvMkQPuPw==} + '@itwin/service-authorization@2.1.0': + resolution: {integrity: sha512-UHaXyJOgpzAjo2aBX1PDcr2t7GnDx76TQjYAamUPhG58w0BFhQ69LFt9c6mdXi2BZBdYHNc6xIijGGjoHDGz1A==} peerDependencies: - '@itwin/core-bentley': ^3.3.0 || ^4.0.0 + '@itwin/core-bentley': ^5.0.0 - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@microsoft/api-extractor-model@7.29.9': - resolution: {integrity: sha512-/DaMfUjiswmrnLjHCorVzWGbW5rmeTGDo+H0QcvcarJ14SjNVmFWiRKzscN4B2y9AyllqeXMPgwbtSFAdAkpMQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@microsoft/api-extractor-model@7.33.8': + resolution: {integrity: sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==} - '@microsoft/api-extractor@7.47.12': - resolution: {integrity: sha512-YE/h4vE9T1i3oGtgEZC7pHupH/drtGAuQ36iJ1Ua0gQ8NXmPXNKNilkCqzWnX/QvMnr1xSgEjHppWMXEi5YZKQ==} + '@microsoft/api-extractor@7.58.7': + resolution: {integrity: sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==} hasBin: true - '@microsoft/tsdoc-config@0.17.1': - resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} - '@microsoft/tsdoc@0.15.1': - resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -809,48 +774,77 @@ packages: '@openid/appauth@1.3.2': resolution: {integrity: sha512-NoOejniaqzOEbHg3RcBZtTriYqhqpQFgTC4lDNaRbgRCnpz6n8PlxWlCbh2N1K5qKawfxRP29/Wiho3FrXQ3Qw==} - '@opentelemetry/api@1.8.0': - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} - - '@panva/asn1.js@1.0.0': - resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} - engines: {node: '>=10.13.0'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@playwright/test@1.41.2': - resolution: {integrity: sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==} - engines: {node: '>=16'} + '@playwright/test@1.56.1': + resolution: {integrity: sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==} + engines: {node: '>=18'} hasBin: true - '@rushstack/node-core-library@5.10.0': - resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/node-core-library@5.23.1': + resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/rig-package@0.5.3': - resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + '@rushstack/rig-package@0.7.3': + resolution: {integrity: sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==} - '@rushstack/terminal@0.14.3': - resolution: {integrity: sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==} + '@rushstack/terminal@0.24.0': + resolution: {integrity: sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.23.1': - resolution: {integrity: sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==} + '@rushstack/ts-command-line@5.3.9': + resolution: {integrity: sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==} '@shikijs/core@1.29.2': resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} @@ -870,8 +864,8 @@ packages: '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -886,13 +880,17 @@ packages: '@sinonjs/samsam@5.3.1': resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@sinonjs/text-encoding@0.7.3': + resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -908,11 +906,15 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/base64-js@1.3.2': - resolution: {integrity: sha512-Q2Xn2/vQHRGLRXhQ5+BSLwhHkR3JVflxVKywH0Q6fVoAiUE8fFYL2pE5/l2ZiOiBDfA8qUqRnSxln4G/NFz1Sg==} + '@types/base64-js@1.5.0': + resolution: {integrity: sha512-xDDGwUoGXW4FHFWs1pIMXZrVD4kxOAo4KmNSZlb0w5hT52Gd4eIzkjwVp/XRpSox2hfR3h7ZO6witfU7aAZ6XA==} + deprecated: This is a stub types definition. base64-js provides its own type definitions, so you do not need this installed. + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} @@ -920,20 +922,20 @@ packages: '@types/chai@4.3.1': resolution: {integrity: sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==} + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} '@types/fs-extra@4.0.15': resolution: {integrity: sha512-zU/EU2kZ1tv+p4pswQLntA7dFQq84wXrSCfmLjZvMbLjf4N46cPOWHg+WKfc27YnEOQ0chVFlBui55HRsvzHPA==} @@ -944,11 +946,11 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/jquery@3.5.29': - resolution: {integrity: sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==} + '@types/jquery@3.5.33': + resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -956,8 +958,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@8.5.9': - resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -968,44 +970,51 @@ packages: '@types/mocha@8.2.3': resolution: {integrity: sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==} - '@types/node-fetch@2.6.11': - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@14.14.31': - resolution: {integrity: sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==} + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@18.19.31': - resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/semver@7.3.10': - resolution: {integrity: sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==} + '@types/request@2.48.13': + resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} '@types/sinon@9.0.11': resolution: {integrity: sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==} - '@types/sinonjs__fake-timers@8.1.5': - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + '@types/sinonjs__fake-timers@15.0.1': + resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} - '@types/sizzle@2.3.8': - resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} + '@types/sizzle@2.3.10': + resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} - '@types/tunnel@0.0.3': - resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1019,107 +1028,83 @@ packages: '@types/yargs@17.0.19': resolution: {integrity: sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==} - '@typescript-eslint/eslint-plugin@7.0.2': - resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@7.0.2': - resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.0.2': - resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@7.0.2': - resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@7.0.2': - resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@7.14.1': - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@7.0.2': - resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@7.0.2': - resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@7.0.2': - resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typespec/ts-http-runtime@0.3.1': + resolution: {integrity: sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==} + engines: {node: '>=20.0.0'} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + '@xmldom/xmldom@0.8.13': + resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -1130,12 +1115,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1143,6 +1128,14 @@ packages: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -1166,29 +1159,23 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - almost-equal@1.1.0: - resolution: {integrity: sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1199,8 +1186,8 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} anymatch@3.1.3: @@ -1227,18 +1214,19 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -1249,34 +1237,43 @@ packages: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1284,31 +1281,27 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + axe-core@4.11.0: + resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} engines: {node: '>=4'} - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - axios@0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} - axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.13.0: + resolution: {integrity: sha512-zt40Pz4zcRXra9CVV31KeyofwiNvAbJ5B6YPz9pMJ+yOSLikvPT4Yi5LjfgjRa9CawVYBaD1JQzIVcIvBejKeA==} - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -1316,31 +1309,35 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - beachball@2.43.1: - resolution: {integrity: sha512-qMNOIwrH8SYwybkHI4k8rOe1/YaYAlFYD5kSsyrUHWKFTlWRCcq01VncuIwSD2M7X1IgOKH/R+smXbIC9xohKg==} + baseline-browser-mapping@2.8.20: + resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + hasBin: true + + beachball@2.56.0: + resolution: {integrity: sha512-ddVqdeXVPhpj7/3XAw1iDjLiUvqOKThHC2bthBBYoxQyVuO72aTCOL1ZQOLykhAe7hDij6quee6ibTwkrtTKGA==} engines: {node: '>=14.0.0'} hasBin: true + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1349,8 +1346,8 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1360,8 +1357,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -1383,8 +1381,12 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -1399,8 +1401,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001612: - resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} canonical-path@1.0.0: resolution: {integrity: sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==} @@ -1408,13 +1410,13 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai-as-promised@7.1.1: - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: - chai: '>= 2.1.2 < 5' + chai: '>= 2.1.2 < 6' - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} chalk@2.4.2: @@ -1441,12 +1443,13 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -1497,8 +1500,8 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} comment-parser@1.4.1: @@ -1528,12 +1531,12 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1546,6 +1549,11 @@ packages: engines: {node: '>=6.5'} hasBin: true + cpx2@8.0.0: + resolution: {integrity: sha512-RxD9jrSVNSOmfcbiPlr3XnKbUKH9K1w2HCv0skczUKhsZTueiDBecxuaSAKQkYSLQaGVA4ZQJZlTj5hVNNEvKg==} + engines: {node: ^20.0.0 || >=22.0.0, npm: '>=10'} + hasBin: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1554,14 +1562,10 @@ packages: engines: {node: '>=4.0'} hasBin: true - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1569,27 +1573,32 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@2.2.0: + resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1606,8 +1615,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1627,17 +1636,21 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} @@ -1650,9 +1663,9 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} @@ -1678,10 +1691,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - detect-port@1.3.0: resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} engines: {node: '>= 4.2.1'} @@ -1694,8 +1703,16 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -1706,10 +1723,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} @@ -1724,6 +1737,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1733,8 +1749,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.747: - resolution: {integrity: sha512-+FnSWZIAvFHbsNVmUxhEqWiaOiPMcfum1GQzlWCg/wLigVtshOsjXHyEFfmt6cFK6+HkS3QOJBv6/3OPumbBfw==} + electron-to-chromium@1.5.241: + resolution: {integrity: sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -1752,26 +1768,30 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -1782,41 +1802,31 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -1830,17 +1840,21 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@9.1.2: + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} hasBin: true peerDependencies: eslint: '>=7.0.0' + eslint-formatter-visualstudio@8.40.0: + resolution: {integrity: sha512-TsbZJpvu0wclOoy5MEhETzxrVWMPDg5sejowvQfbqw9e0ooozbnX/1STGiGaO/fH1JWLQvqQ4qAmai2u/Kep1g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1860,18 +1874,12 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-deprecation@2.0.0: - resolution: {integrity: sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: ^4.2.4 || ^5.0.0 - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true @@ -1880,59 +1888,68 @@ packages: resolution: {integrity: sha512-aW1L8C96fsRji0c8ZAgqtJVIu5p2IaNbeT2kuHNS6p5tontAVK1yP1W4ECjq3BHOv/GgAWvBVIx7kQI0kG2Rew==} engines: {node: '>=4'} - eslint-plugin-jsdoc@48.5.0: - resolution: {integrity: sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==} + eslint-plugin-jsdoc@50.8.0: + resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-jsx-a11y@6.8.0: - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint-plugin-prefer-arrow@1.2.3: resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} peerDependencies: eslint: '>=2.0.0' - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1951,6 +1968,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -1958,27 +1979,26 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1987,23 +2007,34 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fast-xml-parser@5.3.0: + resolution: {integrity: sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==} + hasBin: true - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@3.3.2: @@ -2021,9 +2052,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -2032,11 +2063,11 @@ packages: flatbuffers@1.12.0: resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2044,32 +2075,33 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + form-data@2.5.5: + resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} engines: {node: '>= 0.12'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -2082,21 +2114,14 @@ packages: fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -2117,13 +2142,33 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gaxios@7.1.2: + resolution: {integrity: sha512-/Szrn8nr+2TsQT1Gp8iIe/BEytJmbyfrbFh419DfGQSkEgNEhbPi7JRJuughjkTzPWgU9gBQf5AVu3DbHt0OXA==} + engines: {node: '>=18'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + gcp-metadata@8.1.1: + resolution: {integrity: sha512-dTCcAe9fRQf06ELwel6lWWFrEbstwjUBYEhr5VRGoC+iPDZQucHppCowaIp8b8v92tU1G4X4H3b/Y6zXZxkMsQ==} + engines: {node: '>=18'} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2139,10 +2184,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2155,26 +2196,29 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} git-up@7.0.0: resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} + git-url-parse@13.1.1: resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2188,36 +2232,57 @@ packages: resolution: {integrity: sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==} engines: {node: '>= 0.10'} - glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + google-auth-library@10.4.2: + resolution: {integrity: sha512-EKiQasw6aEdxSovPEf1oBxCEvxjFamZ6MPaVOSPXZMnqKFLo+rrYjHyjKlFfZcXiKi9qAH6cutr5WRqqa1jKhg==} + engines: {node: '>=18'} + + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-gax@5.0.4: + resolution: {integrity: sha512-HmQ6zIYBs2EikTk+kjeHmtHprNTEpsnVaKONw9cwZZwUNCkUb+D5RYrJpCxyjdvIDvJp3wLbVReolJLRZRms1g==} + engines: {node: '>=18'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + + google-logging-utils@1.1.1: + resolution: {integrity: sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==} + engines: {node: '>=14'} gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} @@ -2233,8 +2298,17 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -2247,12 +2321,8 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} has-symbols@1.1.0: @@ -2275,8 +2345,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -2288,14 +2358,17 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} @@ -2305,32 +2378,57 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} hasBin: true iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} import-lazy@4.0.0: @@ -2347,47 +2445,40 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - inversify@5.0.5: - resolution: {integrity: sha512-60QsfPz8NAU/GZqXu8hJ+BhNf/C/c+Hp0eDc6XMIJTxBiP36AQyyQKpBkOVTLWBFDQWYVHpbbEuIsHu9dLuJDA==} - - inversify@6.0.2: - resolution: {integrity: sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA==} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -2397,28 +2488,30 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -2428,14 +2521,19 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2444,8 +2542,8 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -2460,39 +2558,39 @@ packages: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + is-ssh@1.4.1: + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -2506,20 +2604,21 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -2554,26 +2653,29 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jose@2.0.7: - resolution: {integrity: sha512-5hFWIigKqC+e/lRyQhfnirrAqUdIPMB7SJRqflJaO29dW7q5DFvH1XCSTmv6PQ6pb++0k6MJlLRoS0Wv4s38Wg==} - engines: {node: '>=10.13.0 < 13 || >=13.7.0'} + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2586,15 +2688,18 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2628,8 +2733,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} @@ -2642,21 +2747,25 @@ packages: just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - jwks-rsa@2.1.5: - resolution: {integrity: sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==} - engines: {node: '>=10 < 13 || >=14'} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jwks-rsa@3.2.0: + resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} + engines: {node: '>=14'} jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} - keytar@7.9.0: - resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2665,8 +2774,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} @@ -2688,8 +2797,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.7: - resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} + lint-staged@16.4.0: + resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} engines: {node: '>=20.17'} hasBin: true @@ -2709,6 +2818,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -2717,6 +2829,7 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2753,6 +2866,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2764,12 +2880,12 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@4.0.2: - resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2778,8 +2894,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-memoizer@2.2.0: - resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -2795,10 +2911,6 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -2820,16 +2932,16 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - mem@4.3.0: - resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==} - engines: {node: '>=6'} + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2854,12 +2966,8 @@ packages: micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -2878,10 +2986,19 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -2894,20 +3011,17 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@10.2.3: + resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2919,9 +3033,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -2932,17 +3043,19 @@ packages: peerDependencies: mocha: '>=2.2.5' - mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} engines: {node: '>= 14.0.0'} hasBin: true + mocha@11.7.4: + resolution: {integrity: sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2950,13 +3063,6 @@ packages: resolution: {integrity: sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==} engines: {node: '>= 0.10'} - nano-spawn@2.0.0: - resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} - engines: {node: '>=20.17'} - - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2970,12 +3076,10 @@ packages: nise@4.1.0: resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} - node-abi@3.62.0: - resolution: {integrity: sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==} - engines: {node: '>=10'} - - node-addon-api@4.3.0: - resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -2986,16 +3090,20 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-persist@3.1.3: + resolution: {integrity: sha512-CaFv+kSZtsc+VeDRldK1yR47k1vPLBpzYB9re2z7LIwITxwBtljMq3s8VQnnr+x3E8pQfHbc5r2IyJsBLJhtXg==} + engines: {node: '>=10.12.0'} + node-preload@0.2.1: resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} engines: {node: '>=8'} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true + node-releases@2.0.26: + resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -3004,8 +3112,8 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-run-all@4.1.5: @@ -3013,14 +3121,14 @@ packages: engines: {node: '>= 4'} hasBin: true - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nyc@15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} engines: {node: '>=8.9'} @@ -3030,19 +3138,24 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -3053,17 +3166,13 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - oidc-client-ts@2.4.0: - resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} - engines: {node: '>=12.13.0'} + oidc-client-ts@3.3.0: + resolution: {integrity: sha512-t13S540ZwFOEZKLYHJwSfITugupW4uYLwuQSSXyKH/wHwZ+7FvgHE7gnNJh1YQIZ1Yd1hKSRjqeXGSUtS0r9JA==} + engines: {node: '>=18'} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -3076,6 +3185,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -3083,33 +3196,28 @@ packages: oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-is-promise@2.1.0: - resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} - engines: {node: '>=6'} + p-graph@1.2.0: + resolution: {integrity: sha512-tJcm42n9DPoTKtt/m2/KAoSSVuFrxV+p32A+58mtt8ta7sjcUBcOTS7AIPpz2miqEpVNuDYjPzs+3lM/hJWAQQ==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -3131,6 +3239,10 @@ packages: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3139,8 +3251,8 @@ packages: resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} engines: {node: '>=8'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -3149,9 +3261,8 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-imports@2.1.0: - resolution: {integrity: sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==} - engines: {node: '>= 18'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} @@ -3161,12 +3272,19 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-path@7.1.0: + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} parse-url@8.1.0: resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3187,6 +3305,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3194,11 +3316,15 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} - path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -3211,23 +3337,22 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} hasBin: true - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -3236,52 +3361,43 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.35.1: - resolution: {integrity: sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==} - engines: {node: '>=16'} + playwright-core@1.47.2: + resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} + engines: {node: '>=18'} hasBin: true - playwright-core@1.41.2: - resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} - engines: {node: '>=16'} + playwright-core@1.56.1: + resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} + engines: {node: '>=18'} hasBin: true - playwright@1.35.1: - resolution: {integrity: sha512-NbwBeGJLu5m7VGM0+xtlmLAH9VUfWwYOhUi/lSEDyGg46r1CA9RWlvoc5yywxR9AzQb0mOCm7bWtOXV7/w43ZA==} - engines: {node: '>=16'} + playwright@1.47.2: + resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} + engines: {node: '>=18'} hasBin: true - playwright@1.41.2: - resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} - engines: {node: '>=16'} + playwright@1.56.1: + resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==} + engines: {node: '>=18'} hasBin: true - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3289,11 +3405,19 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proto3-json-serializer@3.0.3: + resolution: {integrity: sha512-iUi7jGLuECChuoUwtvf6eXBDcFXTHAt5GM6ckvtD3RqD+j2wW0GW6WndPOu9IWeUk7n933lzrskcNMHJy2tFSw==} + engines: {node: '>=18'} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + protocols@2.0.2: + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -3302,15 +3426,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -3319,13 +3434,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3348,10 +3460,6 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3367,16 +3475,14 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -3386,8 +3492,8 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} release-zalgo@1.0.0: @@ -3409,9 +3515,6 @@ packages: resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} engines: {node: '>=0.10.5'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -3423,8 +3526,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: @@ -3439,8 +3543,20 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + + retry-request@8.0.2: + resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==} + engines: {node: '>=18'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -3448,47 +3564,53 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: @@ -3502,6 +3624,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -3521,14 +3647,27 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -3538,12 +3677,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - sinon@9.2.4: resolution: {integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==} deprecated: 16.1.1 @@ -3555,9 +3688,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -3588,8 +3718,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3602,6 +3732,16 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3622,20 +3762,28 @@ packages: resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} engines: {node: '>=20'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.padend@3.1.6: resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + 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==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -3651,8 +3799,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -3663,22 +3811,27 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + subarg@1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} @@ -3698,30 +3851,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + teeny-request@10.1.0: + resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==} + engines: {node: '>=18'} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + engines: {node: '>=18'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3734,14 +3881,10 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3752,11 +3895,11 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} @@ -3775,24 +3918,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -3802,9 +3929,9 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} @@ -3814,20 +3941,20 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typedarray-to-buffer@3.1.5: @@ -3845,18 +3972,13 @@ packages: peerDependencies: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -3867,17 +3989,18 @@ packages: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} @@ -3885,8 +4008,8 @@ packages: unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -3895,10 +4018,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3907,8 +4026,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3916,12 +4035,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - username@5.1.0: - resolution: {integrity: sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==} - engines: {node: '>=8'} + username@7.0.0: + resolution: {integrity: sha512-MkXUkVGJzcTpIXo7vnIGokz+WzDqEuRUcHJzDm3ZPXFUUNwMmkf26Hz8HqN3ZhWZisWaP/c6Y3/ERBdUDGl9LQ==} + engines: {node: '>=18'} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3948,23 +4064,28 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: @@ -3974,8 +4095,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -3987,12 +4108,22 @@ packages: engines: {node: '>= 8'} hasBin: true - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} workspace-tools@0.36.4: resolution: {integrity: sha512-v0UFVvw9BjHtRu2Dau5PEJKkuG8u4jPlpXZQWjSz9XgbSutpPURqtO2P0hp3cVmQVATh8lkMFCewFgJuDnyC/w==} + workspace-tools@0.38.4: + resolution: {integrity: sha512-wCei5WNlhHswuU5tPjTYy4yVd7jnavtRUNbqpiHAmWRPOJtkvUpBQZExrrgFs3h9jdx6Qf6inCDSwjqnXhf+vQ==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -4027,33 +4158,18 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} - wtfnode@0.9.2: - resolution: {integrity: sha512-AzGy/MOGmzufyHDKHwuZeuqaqslGIPuwxDAhdmUUJ91Ak22Ynxry8quXNR/cZZIaSs5T+C+LNS3W9AcMzJXhMw==} + wtfnode@0.9.4: + resolution: {integrity: sha512-5xgeLjIxZ8DVHU4ty3kOdd9QfHDxf89tmSy0+yN8n59S3wx6LBJh8XhEg61OPOGE65jEYGAtLq0GMzLKrsjfPQ==} + engines: {node: '>=0.10.0'} hasBin: true - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - xml@1.0.1: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -4061,22 +4177,14 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.8.1: - resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} hasBin: true @@ -4084,10 +4192,6 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -4125,321 +4229,344 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@azure/abort-controller@1.1.0': + '@azure/abort-controller@2.1.2': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@azure/abort-controller@2.1.2': + '@azure/core-auth@1.10.1': dependencies: - tslib: 2.6.2 + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color - '@azure/core-auth@1.7.2': + '@azure/core-client@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.9.0 - tslib: 2.6.2 - - '@azure/core-http@2.3.2': - dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.7.2 - '@azure/core-tracing': 1.0.0-preview.13 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - '@types/node-fetch': 2.6.11 - '@types/tunnel': 0.0.3 - form-data: 4.0.0 - node-fetch: 2.7.0 - process: 0.11.10 - tough-cookie: 4.1.3 - tslib: 2.6.2 - tunnel: 0.0.6 - uuid: 8.3.2 - xml2js: 0.5.0 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.22.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 transitivePeerDependencies: - - encoding + - supports-color - '@azure/core-http@3.0.4': + '@azure/core-http-compat@2.3.1': dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.7.2 - '@azure/core-tracing': 1.0.0-preview.13 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - '@types/node-fetch': 2.6.11 - '@types/tunnel': 0.0.3 - form-data: 4.0.0 - node-fetch: 2.7.0 - process: 0.11.10 - tslib: 2.6.2 - tunnel: 0.0.6 - uuid: 8.3.2 - xml2js: 0.5.0 + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.1 transitivePeerDependencies: - - encoding + - supports-color '@azure/core-lro@2.7.2': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.9.0 - '@azure/logger': 1.1.2 - tslib: 2.6.2 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color - '@azure/core-paging@1.5.0': + '@azure/core-paging@1.6.2': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@azure/core-paging@1.6.2': + '@azure/core-rest-pipeline@1.22.1': dependencies: - tslib: 2.6.2 + '@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.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color - '@azure/core-tracing@1.0.0-preview.13': + '@azure/core-tracing@1.3.1': dependencies: - '@opentelemetry/api': 1.8.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@azure/core-util@1.9.0': + '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - tslib: 2.6.2 + '@typespec/ts-http-runtime': 0.3.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color - '@azure/logger@1.1.2': + '@azure/core-xml@1.5.0': dependencies: - tslib: 2.6.2 + fast-xml-parser: 5.3.0 + tslib: 2.8.1 - '@azure/storage-blob@12.13.0': + '@azure/logger@1.3.0': dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.4 - '@azure/core-lro': 2.7.2 - '@azure/core-paging': 1.6.2 - '@azure/core-tracing': 1.0.0-preview.13 - '@azure/logger': 1.1.2 - events: 3.3.0 - tslib: 2.6.2 + '@typespec/ts-http-runtime': 0.3.1 + tslib: 2.8.1 transitivePeerDependencies: - - encoding + - supports-color - '@azure/storage-blob@12.17.0': + '@azure/storage-blob@12.29.1': dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.4 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-http-compat': 2.3.1 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-tracing': 1.0.0-preview.13 - '@azure/logger': 1.1.2 + '@azure/core-rest-pipeline': 1.22.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/core-xml': 1.5.0 + '@azure/logger': 1.3.0 + '@azure/storage-common': 12.1.1 events: 3.3.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - - encoding + - supports-color - '@azure/storage-blob@12.7.0': + '@azure/storage-common@12.1.1': dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-http': 2.3.2 - '@azure/core-lro': 2.7.2 - '@azure/core-paging': 1.6.2 - '@azure/core-tracing': 1.0.0-preview.13 - '@azure/logger': 1.1.2 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-http-compat': 2.3.1 + '@azure/core-rest-pipeline': 1.22.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 events: 3.3.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - - encoding - - '@babel/code-frame@7.24.2': - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - - '@babel/compat-data@7.24.4': {} + - supports-color - '@babel/core@7.24.4': + '@babel/code-frame@7.27.1': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 7.6.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.4': + '@babel/generator@7.28.5': dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 lru-cache: 5.1.1 - semver: 7.6.2 - - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.0 + semver: 7.7.3 - '@babel/helper-module-imports@7.24.3': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-globals@7.28.0': {} - '@babel/helper-simple-access@7.22.5': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-string-parser@7.24.1': {} - - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/helper-validator-option@7.23.5': {} + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/helpers@7.24.4': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.2': - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} - '@babel/parser@7.24.4': + '@babel/helpers@7.28.4': dependencies: - '@babel/types': 7.24.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 - '@babel/runtime@7.24.4': + '@babel/parser@7.28.5': dependencies: - regenerator-runtime: 0.14.1 + '@babel/types': 7.28.5 - '@babel/template@7.24.0': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.24.1': + '@babel/traverse@7.28.5': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.24.0': + '@babel/types@7.28.5': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@bentley/imodeljs-native@4.10.42': {} - - '@bentley/imodeljs-native@4.3.6': {} + '@bentley/imodeljs-native@5.9.17': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@es-joy/jsdoccomment@0.43.1': + '@es-joy/jsdoccomment@0.50.2': dependencies: - '@types/eslint': 8.56.10 - '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.14.1 + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.46.2 comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': dependencies: - eslint: 8.57.0 + eslint: 9.38.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.1': + dependencies: + '@eslint/core': 0.16.0 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.38.0': {} + + '@eslint/object-schema@2.1.7': {} - '@humanwhocodes/config-array@0.11.14': + '@eslint/plugin-kit@0.4.0': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 + '@eslint/core': 0.16.0 + levn: 0.4.1 + + '@google-cloud/paginator@5.0.2': + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + + '@google-cloud/projectify@4.0.0': {} + + '@google-cloud/promisify@4.0.0': {} + + '@google-cloud/storage-control@0.5.0': + dependencies: + google-gax: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@google-cloud/storage@7.17.2': + dependencies: + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 + abort-controller: 3.0.0 + async-retry: 1.3.3 + duplexify: 4.1.3 + fast-xml-parser: 4.5.3 + gaxios: 6.7.1 + google-auth-library: 9.15.1 + html-entities: 2.6.0 + mime: 3.0.0 + p-limit: 3.1.0 + retry-request: 7.0.2 + teeny-request: 9.0.0 + uuid: 8.3.2 transitivePeerDependencies: + - encoding - supports-color + '@grpc/grpc-js@1.14.0': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -4454,405 +4581,239 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@itwin/build-tools@4.10.12(@types/node@18.19.31)': - dependencies: - '@microsoft/api-extractor': 7.47.12(@types/node@18.19.31) - chalk: 3.0.0 - cpx2: 3.0.2 - cross-spawn: 7.0.6 - fs-extra: 8.1.0 - glob: 10.4.2 - mocha: 10.4.0 - mocha-junit-reporter: 2.2.1(mocha@10.4.0) - rimraf: 3.0.2 - tree-kill: 1.2.2 - typedoc: 0.26.11(typescript@5.6.3) - typedoc-plugin-merge-modules: 6.1.0(typedoc@0.26.11(typescript@5.6.3)) - typescript: 5.6.3 - wtfnode: 0.9.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - '@itwin/build-tools@4.10.6(@types/node@14.14.31)': + '@itwin/build-tools@5.9.1(@types/node@22.18.12)': dependencies: - '@microsoft/api-extractor': 7.47.12(@types/node@14.14.31) + '@microsoft/api-extractor': 7.58.7(@types/node@22.18.12) chalk: 3.0.0 - cpx2: 3.0.2 + cpx2: 8.0.0 cross-spawn: 7.0.6 fs-extra: 8.1.0 - glob: 10.4.2 - mocha: 10.4.0 - mocha-junit-reporter: 2.2.1(mocha@10.4.0) - rimraf: 3.0.2 + glob: 10.5.0 + mocha: 11.7.4 + mocha-junit-reporter: 2.2.1(mocha@11.7.4) + rimraf: 6.0.1 tree-kill: 1.2.2 typedoc: 0.26.11(typescript@5.6.3) typedoc-plugin-merge-modules: 6.1.0(typedoc@0.26.11(typescript@5.6.3)) typescript: 5.6.3 - wtfnode: 0.9.2 + wtfnode: 0.9.4 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - supports-color - '@itwin/build-tools@4.10.6(@types/node@18.19.31)': - dependencies: - '@microsoft/api-extractor': 7.47.12(@types/node@18.19.31) - chalk: 3.0.0 - cpx2: 3.0.2 - cross-spawn: 7.0.6 - fs-extra: 8.1.0 - glob: 10.4.2 - mocha: 10.4.0 - mocha-junit-reporter: 2.2.1(mocha@10.4.0) - rimraf: 3.0.2 - tree-kill: 1.2.2 - typedoc: 0.26.11(typescript@5.6.3) - typedoc-plugin-merge-modules: 6.1.0(typedoc@0.26.11(typescript@5.6.3)) - typescript: 5.6.3 - wtfnode: 0.9.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - '@itwin/certa@4.5.2': + '@itwin/certa@5.2.4': dependencies: canonical-path: 1.0.0 detect-port: 1.3.0 - express: 4.19.2 + express: 4.21.2 jsonc-parser: 2.0.3 lodash: 4.17.21 - mocha: 10.4.0 - playwright: 1.35.1 + mocha: 11.7.4 + playwright: 1.47.2 source-map-support: 0.5.21 yargs: 17.7.2 transitivePeerDependencies: - supports-color - '@itwin/cloud-agnostic-core@1.6.0': - dependencies: - inversify: 5.0.5 - reflect-metadata: 0.1.14 + '@itwin/cloud-agnostic-core@3.0.4': {} - '@itwin/cloud-agnostic-core@2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14)': + '@itwin/core-backend@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)))': dependencies: - inversify: 6.0.2 - reflect-metadata: 0.1.14 - - '@itwin/cloud-agnostic-core@2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14)': - optionalDependencies: - inversify: 6.0.2 - reflect-metadata: 0.1.14 - - '@itwin/core-backend@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0)': - dependencies: - '@bentley/imodeljs-native': 4.10.42 - '@itwin/cloud-agnostic-core': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@itwin/core-geometry': 4.10.12 - '@itwin/core-telemetry': 4.10.12(@itwin/core-geometry@4.10.12) - '@itwin/object-storage-azure': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/object-storage-core': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - form-data: 4.0.2 + '@azure/storage-blob': 12.29.1 + '@bentley/imodeljs-native': 5.9.17 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-common': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) + '@itwin/core-geometry': 5.9.1 + '@itwin/ecschema-metadata': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)) + '@itwin/object-storage-azure': 3.0.4 + form-data: 4.0.4 fs-extra: 8.1.0 - inversify: 6.0.2 json5: 2.2.3 linebreak: 1.1.0 multiparty: 4.2.3 - reflect-metadata: 0.1.14 - semver: 7.6.2 - touch: 3.1.0 + semver: 7.7.3 + touch: 3.1.1 ws: 7.5.10 - optionalDependencies: - '@opentelemetry/api': 1.8.0 transitivePeerDependencies: - bufferutil - debug - - encoding - - utf-8-validate - - '@itwin/core-backend@4.3.5(@itwin/core-bentley@4.3.5)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0)': - dependencies: - '@bentley/imodeljs-native': 4.3.6 - '@itwin/cloud-agnostic-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/core-bentley': 4.3.5 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12) - '@itwin/core-geometry': 4.10.12 - '@itwin/core-telemetry': 4.3.5(@itwin/core-geometry@4.10.12) - '@itwin/object-storage-azure': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/object-storage-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - form-data: 2.5.1 - fs-extra: 8.1.0 - inversify: 6.0.2 - json5: 2.2.3 - multiparty: 4.2.3 - reflect-metadata: 0.1.14 - semver: 7.6.0 - touch: 3.1.0 - ws: 7.5.9 - optionalDependencies: - '@opentelemetry/api': 1.8.0 - transitivePeerDependencies: - - bufferutil - - debug - - encoding + - inversify + - reflect-metadata + - supports-color - utf-8-validate - '@itwin/core-bentley@4.10.12': {} + '@itwin/core-bentley@5.9.1': {} - '@itwin/core-bentley@4.3.5': {} - - '@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12)': - dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-geometry': 4.10.12 - flatbuffers: 1.12.0 - js-base64: 3.7.7 - - '@itwin/core-common@4.10.12(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12)': + '@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1)': dependencies: - '@itwin/core-bentley': 4.3.5 - '@itwin/core-geometry': 4.10.12 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-geometry': 5.9.1 flatbuffers: 1.12.0 - js-base64: 3.7.7 + js-base64: 3.7.8 - '@itwin/core-common@4.3.5(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12)': + '@itwin/core-geometry@5.9.1': dependencies: - '@itwin/core-bentley': 4.3.5 - '@itwin/core-geometry': 4.10.12 + '@itwin/core-bentley': 5.9.1 flatbuffers: 1.12.0 - js-base64: 3.7.7 - '@itwin/core-geometry@4.10.12': + '@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)': dependencies: - '@itwin/core-bentley': 4.10.12 - flatbuffers: 1.12.0 + '@itwin/core-bentley': 5.9.1 - '@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12)': + '@itwin/ecschema-locaters@5.9.1(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)))': dependencies: - '@itwin/core-bentley': 4.10.12 - - '@itwin/core-telemetry@4.10.12(@itwin/core-geometry@4.10.12)': - dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - transitivePeerDependencies: - - '@itwin/core-geometry' - - '@itwin/core-telemetry@4.3.5(@itwin/core-geometry@4.10.12)': - dependencies: - '@itwin/core-bentley': 4.3.5 - '@itwin/core-common': 4.3.5(@itwin/core-bentley@4.3.5)(@itwin/core-geometry@4.10.12) - transitivePeerDependencies: - - '@itwin/core-geometry' - - '@itwin/ecschema-locaters@4.10.12(@itwin/ecschema-metadata@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12)))': - dependencies: - '@itwin/ecschema-metadata': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12)) - '@xmldom/xmldom': 0.8.10 + '@itwin/ecschema-metadata': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1)) + '@xmldom/xmldom': 0.8.13 fs-extra: 8.1.0 - glob: 10.4.2 - - '@itwin/ecschema-metadata@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12))': - dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-quantity': 4.10.12(@itwin/core-bentley@4.10.12) + glob: 10.5.0 - '@itwin/ecschema-metadata@4.3.5(@itwin/core-bentley@4.10.12)(@itwin/core-quantity@4.10.12(@itwin/core-bentley@4.10.12))': + '@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))': dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-quantity': 4.10.12(@itwin/core-bentley@4.10.12) - almost-equal: 1.1.0 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-quantity': 5.9.1(@itwin/core-bentley@5.9.1) - '@itwin/eslint-plugin@4.0.2(eslint@8.57.0)(typescript@5.3.3)': + '@itwin/eslint-plugin@5.2.1(eslint@9.38.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/eslint-plugin': 7.0.2(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-plugin-deprecation: 2.0.0(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0) + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint@9.38.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + eslint: 9.38.0 + eslint-formatter-visualstudio: 8.40.0 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint@9.38.0) eslint-plugin-jam3: 0.2.3 - eslint-plugin-jsdoc: 48.5.0(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-prefer-arrow: 1.2.3(eslint@8.57.0) - eslint-plugin-react: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - typescript: 5.3.3 + eslint-plugin-jsdoc: 50.8.0(eslint@9.38.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.38.0) + eslint-plugin-prefer-arrow: 1.2.3(eslint@9.38.0) + eslint-plugin-react: 7.37.5(eslint@9.38.0) + eslint-plugin-react-hooks: 5.2.0(eslint@9.38.0) + typescript: 5.6.3 workspace-tools: 0.36.4 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - '@itwin/imodels-access-backend@2.3.0(@itwin/core-backend@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0))(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))': + '@itwin/eslint-plugin@5.2.1(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@azure/abort-controller': 1.1.0 - '@itwin/core-backend': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@itwin/imodels-client-authoring': 2.3.0 - axios: 0.21.4 + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + eslint: 9.38.0 + eslint-formatter-visualstudio: 8.40.0 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0) + eslint-plugin-jam3: 0.2.3 + eslint-plugin-jsdoc: 50.8.0(eslint@9.38.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.38.0) + eslint-plugin-prefer-arrow: 1.2.3(eslint@9.38.0) + eslint-plugin-react: 7.37.5(eslint@9.38.0) + eslint-plugin-react-hooks: 5.2.0(eslint@9.38.0) + typescript: 5.9.3 + workspace-tools: 0.36.4 transitivePeerDependencies: - - debug - - encoding + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color - '@itwin/imodels-access-backend@4.1.6(@itwin/core-backend@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0))(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(inversify@6.0.2)(reflect-metadata@0.1.14)': - dependencies: - '@azure/abort-controller': 1.1.0 - '@itwin/core-backend': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))(@itwin/core-geometry@4.10.12)(@opentelemetry/api@1.8.0) - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@itwin/imodels-access-common': 4.1.6(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12)) - '@itwin/imodels-client-authoring': 4.4.0(inversify@6.0.2)(reflect-metadata@0.1.14) - axios: 1.6.8 + '@itwin/imodels-access-backend@6.0.2(@itwin/core-backend@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))))(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))': + dependencies: + '@itwin/core-backend': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-common@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1))(@itwin/core-geometry@5.9.1)(@itwin/ecschema-metadata@5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-quantity@5.9.1(@itwin/core-bentley@5.9.1))) + '@itwin/core-bentley': 5.9.1 + '@itwin/core-common': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) + '@itwin/imodels-access-common': 6.0.2(@itwin/core-bentley@5.9.1)(@itwin/imodels-client-management@6.0.2) + '@itwin/imodels-client-authoring': 6.0.2 + '@itwin/imodels-client-management': 6.0.2 + '@itwin/object-storage-azure': 3.0.4 + '@itwin/object-storage-core': 3.0.4 + '@itwin/object-storage-google': 3.0.4 + axios: 1.13.0 transitivePeerDependencies: - debug - encoding - inversify - reflect-metadata + - supports-color - '@itwin/imodels-access-common@4.1.6(@itwin/core-bentley@4.10.12)(@itwin/core-common@4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12))': - dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@itwin/imodels-client-management': 4.4.0 - transitivePeerDependencies: - - debug - - '@itwin/imodels-client-authoring@2.3.0': + '@itwin/imodels-access-common@6.0.2(@itwin/core-bentley@5.9.1)(@itwin/imodels-client-management@6.0.2)': dependencies: - '@azure/storage-blob': 12.7.0 - '@itwin/imodels-client-management': 2.3.0 - '@itwin/object-storage-azure': 1.6.0 - '@itwin/object-storage-core': 1.6.0 - transitivePeerDependencies: - - debug - - encoding + '@itwin/core-bentley': 5.9.1 + '@itwin/imodels-client-management': 6.0.2 - '@itwin/imodels-client-authoring@4.4.0(inversify@6.0.2)(reflect-metadata@0.1.14)': + '@itwin/imodels-client-authoring@6.0.2': dependencies: - '@azure/storage-blob': 12.17.0 - '@itwin/imodels-client-management': 4.4.0 - '@itwin/object-storage-azure': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/object-storage-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) + '@itwin/imodels-client-management': 6.0.2 + '@itwin/object-storage-core': 3.0.4 transitivePeerDependencies: - debug - - encoding - inversify - reflect-metadata - '@itwin/imodels-client-management@2.3.0': + '@itwin/imodels-client-management@6.0.2': dependencies: - axios: 0.21.4 + axios: 1.13.0 transitivePeerDependencies: - debug - '@itwin/imodels-client-management@4.4.0': + '@itwin/itwins-client@1.6.1': dependencies: - axios: 1.6.8 + axios: 1.13.0 transitivePeerDependencies: - debug - '@itwin/itwins-client@1.3.0': + '@itwin/node-cli-authorization@3.0.2(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1)': dependencies: - axios: 1.6.8 - transitivePeerDependencies: - - debug - - '@itwin/node-cli-authorization@0.9.2(@itwin/core-bentley@4.10.12)': - dependencies: - '@itwin/core-bentley': 4.10.12 + '@itwin/core-bentley': 5.9.1 + '@itwin/core-common': 5.9.1(@itwin/core-bentley@5.9.1)(@itwin/core-geometry@5.9.1) '@openid/appauth': 1.3.2 - keytar: 7.9.0 - open: 8.4.2 - username: 5.1.0 - transitivePeerDependencies: - - debug - - '@itwin/object-storage-azure@1.6.0': - dependencies: - '@azure/core-paging': 1.5.0 - '@azure/storage-blob': 12.13.0 - '@itwin/cloud-agnostic-core': 1.6.0 - '@itwin/object-storage-core': 1.6.0 - inversify: 5.0.5 - reflect-metadata: 0.1.14 - transitivePeerDependencies: - - debug - - encoding - - '@itwin/object-storage-azure@2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14)': - dependencies: - '@azure/core-paging': 1.5.0 - '@azure/storage-blob': 12.17.0 - '@itwin/cloud-agnostic-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/object-storage-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - inversify: 6.0.2 - reflect-metadata: 0.1.14 + node-persist: 3.1.3 + open: 10.2.0 + username: 7.0.0 transitivePeerDependencies: + - '@itwin/core-geometry' - debug - - encoding - '@itwin/object-storage-azure@2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14)': + '@itwin/object-storage-azure@3.0.4': dependencies: '@azure/core-paging': 1.6.2 - '@azure/storage-blob': 12.17.0 - '@itwin/cloud-agnostic-core': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - '@itwin/object-storage-core': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - optionalDependencies: - inversify: 6.0.2 - reflect-metadata: 0.1.14 - transitivePeerDependencies: - - debug - - encoding - - '@itwin/object-storage-core@1.6.0': - dependencies: - '@itwin/cloud-agnostic-core': 1.6.0 - axios: 0.27.2 - inversify: 5.0.5 - reflect-metadata: 0.1.14 + '@azure/storage-blob': 12.29.1 + '@itwin/cloud-agnostic-core': 3.0.4 + '@itwin/object-storage-core': 3.0.4 transitivePeerDependencies: - debug + - supports-color - '@itwin/object-storage-core@2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14)': + '@itwin/object-storage-core@3.0.4': dependencies: - '@itwin/cloud-agnostic-core': 2.2.3(inversify@6.0.2)(reflect-metadata@0.1.14) - axios: 1.6.8 - inversify: 6.0.2 - reflect-metadata: 0.1.14 + '@itwin/cloud-agnostic-core': 3.0.4 + axios: 1.13.0 transitivePeerDependencies: - debug - '@itwin/object-storage-core@2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14)': + '@itwin/object-storage-google@3.0.4': dependencies: - '@itwin/cloud-agnostic-core': 2.3.0(inversify@6.0.2)(reflect-metadata@0.1.14) - axios: 1.8.4 - optionalDependencies: - inversify: 6.0.2 - reflect-metadata: 0.1.14 + '@google-cloud/storage': 7.17.2 + '@google-cloud/storage-control': 0.5.0 + '@itwin/cloud-agnostic-core': 3.0.4 + '@itwin/object-storage-core': 3.0.4 + axios: 1.13.0 + google-auth-library: 10.4.2 transitivePeerDependencies: - debug + - encoding + - supports-color - '@itwin/oidc-signin-tool@4.3.4(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12)': + '@itwin/oidc-signin-tool@5.0.2(@itwin/core-bentley@5.9.1)': dependencies: - '@itwin/certa': 4.5.2 - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@itwin/service-authorization': 1.2.0(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) - '@playwright/test': 1.41.2 + '@itwin/certa': 5.2.4 + '@itwin/core-bentley': 5.9.1 + '@itwin/service-authorization': 2.1.0(@itwin/core-bentley@5.9.1) + '@playwright/test': 1.56.1 dotenv: 10.0.0 dotenv-expand: 5.1.0 - oidc-client-ts: 2.4.0 + oidc-client-ts: 3.3.0 transitivePeerDependencies: - - '@itwin/core-geometry' - electron - supports-color - '@itwin/perf-tools@4.10.12': + '@itwin/perf-tools@4.11.6': dependencies: fs-extra: 8.1.0 @@ -4862,99 +4823,75 @@ snapshots: transitivePeerDependencies: - debug - '@itwin/service-authorization@1.2.0(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12)': + '@itwin/service-authorization@2.1.0(@itwin/core-bentley@5.9.1)': dependencies: - '@itwin/core-bentley': 4.10.12 - '@itwin/core-common': 4.10.12(@itwin/core-bentley@4.10.12)(@itwin/core-geometry@4.10.12) + '@itwin/core-bentley': 5.9.1 got: 12.6.1 jsonwebtoken: 9.0.2 - jwks-rsa: 2.1.5 + jwks-rsa: 3.2.0 transitivePeerDependencies: - - '@itwin/core-geometry' - supports-color - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 - '@microsoft/api-extractor-model@7.29.9(@types/node@14.14.31)': - dependencies: - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@14.14.31) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor-model@7.29.9(@types/node@18.19.31)': - dependencies: - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@18.19.31) - transitivePeerDependencies: - - '@types/node' + '@js-sdsl/ordered-map@4.4.2': {} - '@microsoft/api-extractor@7.47.12(@types/node@14.14.31)': + '@microsoft/api-extractor-model@7.33.8(@types/node@22.18.12)': dependencies: - '@microsoft/api-extractor-model': 7.29.9(@types/node@14.14.31) - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@14.14.31) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.3(@types/node@14.14.31) - '@rushstack/ts-command-line': 4.23.1(@types/node@14.14.31) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.6.2 - source-map: 0.6.1 - typescript: 5.4.2 + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1(@types/node@22.18.12) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.12(@types/node@18.19.31)': - dependencies: - '@microsoft/api-extractor-model': 7.29.9(@types/node@18.19.31) - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@18.19.31) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.3(@types/node@18.19.31) - '@rushstack/ts-command-line': 4.23.1(@types/node@18.19.31) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.6.2 + '@microsoft/api-extractor@7.58.7(@types/node@22.18.12)': + dependencies: + '@microsoft/api-extractor-model': 7.33.8(@types/node@22.18.12) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1(@types/node@22.18.12) + '@rushstack/rig-package': 0.7.3 + '@rushstack/terminal': 0.24.0(@types/node@22.18.12) + '@rushstack/ts-command-line': 5.3.9(@types/node@22.18.12) + diff: 8.0.4 + minimatch: 10.2.3 + resolve: 1.22.11 + semver: 7.7.3 source-map: 0.6.1 - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - '@types/node' - '@microsoft/tsdoc-config@0.17.1': + '@microsoft/tsdoc-config@0.18.1': dependencies: - '@microsoft/tsdoc': 0.15.1 - ajv: 8.12.0 + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.11 - '@microsoft/tsdoc@0.15.1': {} + '@microsoft/tsdoc@0.16.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -4966,89 +4903,84 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@openid/appauth@1.3.2': dependencies: - '@types/base64-js': 1.3.2 - '@types/jquery': 3.5.29 + '@types/base64-js': 1.5.0 + '@types/jquery': 3.5.33 base64-js: 1.5.1 - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.11 + form-data: 4.0.4 opener: 1.5.2 transitivePeerDependencies: - debug - '@opentelemetry/api@1.8.0': {} - - '@panva/asn1.js@1.0.0': {} - '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} - - '@playwright/test@1.41.2': + '@playwright/test@1.56.1': dependencies: - playwright: 1.41.2 + playwright: 1.56.1 + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} - '@rushstack/node-core-library@5.10.0(@types/node@14.14.31)': + '@protobufjs/fetch@1.1.0': dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.6.2 - optionalDependencies: - '@types/node': 14.14.31 + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} - '@rushstack/node-core-library@5.10.0(@types/node@18.19.31)': + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rtsao/scc@1.1.0': {} + + '@rushstack/node-core-library@5.23.1(@types/node@22.18.12)': dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 - semver: 7.6.2 + resolve: 1.22.11 + semver: 7.7.3 optionalDependencies: - '@types/node': 18.19.31 + '@types/node': 22.18.12 - '@rushstack/rig-package@0.5.3': - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 + '@rushstack/problem-matcher@0.2.1(@types/node@22.18.12)': + optionalDependencies: + '@types/node': 22.18.12 - '@rushstack/terminal@0.14.3(@types/node@14.14.31)': + '@rushstack/rig-package@0.7.3': dependencies: - '@rushstack/node-core-library': 5.10.0(@types/node@14.14.31) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 14.14.31 + jju: 1.4.0 + resolve: 1.22.11 - '@rushstack/terminal@0.14.3(@types/node@18.19.31)': + '@rushstack/terminal@0.24.0(@types/node@22.18.12)': dependencies: - '@rushstack/node-core-library': 5.10.0(@types/node@18.19.31) + '@rushstack/node-core-library': 5.23.1(@types/node@22.18.12) + '@rushstack/problem-matcher': 0.2.1(@types/node@22.18.12) supports-color: 8.1.1 optionalDependencies: - '@types/node': 18.19.31 + '@types/node': 22.18.12 - '@rushstack/ts-command-line@4.23.1(@types/node@14.14.31)': + '@rushstack/ts-command-line@5.3.9(@types/node@22.18.12)': dependencies: - '@rushstack/terminal': 0.14.3(@types/node@14.14.31) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - - '@rushstack/ts-command-line@4.23.1(@types/node@18.19.31)': - dependencies: - '@rushstack/terminal': 0.14.3(@types/node@18.19.31) + '@rushstack/terminal': 0.24.0(@types/node@22.18.12) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -5060,20 +4992,20 @@ snapshots: '@shikijs/engine-javascript': 1.29.2 '@shikijs/engine-oniguruma': 1.29.2 '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 '@shikijs/engine-javascript@1.29.2': dependencies: '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 2.3.0 '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@shikijs/langs@1.29.2': dependencies: @@ -5085,10 +5017,10 @@ snapshots: '@shikijs/types@1.29.2': dependencies: - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@10.0.1': {} + '@shikijs/vscode-textmate@10.0.2': {} '@sindresorhus/is@5.6.0': {} @@ -5104,14 +5036,16 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 lodash.get: 4.4.2 - type-detect: 4.0.8 + type-detect: 4.1.0 - '@sinonjs/text-encoding@0.7.2': {} + '@sinonjs/text-encoding@0.7.3': {} '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 + '@tootallnate/once@2.0.0': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -5122,47 +5056,48 @@ snapshots: '@types/argparse@1.0.38': {} - '@types/base64-js@1.3.2': {} + '@types/base64-js@1.5.0': + dependencies: + base64-js: 1.5.1 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.31 + '@types/node': 22.18.12 + + '@types/caseless@0.12.5': {} '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.1 + '@types/chai': 4.3.20 '@types/chai@4.3.1': {} - '@types/connect@3.4.38': - dependencies: - '@types/node': 18.19.31 + '@types/chai@4.3.20': {} - '@types/eslint@8.56.10': + '@types/connect@3.4.38': dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + '@types/node': 22.18.12 - '@types/estree@1.0.5': {} + '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.0': + '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 18.19.31 - '@types/qs': 6.9.15 + '@types/node': 22.18.12 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 1.2.1 - '@types/express@4.17.21': + '@types/express@4.17.25': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 '@types/fs-extra@4.0.15': dependencies: - '@types/node': 18.19.31 + '@types/node': 22.18.12 '@types/hast@3.0.4': dependencies: @@ -5170,19 +5105,20 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} - '@types/jquery@3.5.29': + '@types/jquery@3.5.33': dependencies: - '@types/sizzle': 2.3.8 + '@types/sizzle': 2.3.10 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/jsonwebtoken@8.5.9': + '@types/jsonwebtoken@9.0.10': dependencies: - '@types/node': 18.19.31 + '@types/ms': 2.1.0 + '@types/node': 22.18.12 '@types/mdast@4.0.4': dependencies: @@ -5192,47 +5128,58 @@ snapshots: '@types/mocha@8.2.3': {} - '@types/node-fetch@2.6.11': + '@types/ms@2.1.0': {} + + '@types/node-fetch@2.6.13': dependencies: - '@types/node': 18.19.31 - form-data: 4.0.0 + '@types/node': 22.18.12 + form-data: 4.0.4 - '@types/node@14.14.31': {} + '@types/node@22.18.12': + dependencies: + undici-types: 6.21.0 - '@types/node@18.19.31': + '@types/parse-path@7.1.0': dependencies: - undici-types: 5.26.5 + parse-path: 7.1.0 - '@types/qs@6.9.15': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/semver@7.3.10': {} + '@types/request@2.48.13': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 22.18.12 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.5 - '@types/semver@7.5.8': {} + '@types/semver@7.7.1': {} - '@types/send@0.17.4': + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.31 + '@types/node': 22.18.12 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.18.12 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.10': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 18.19.31 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 22.18.12 + '@types/send': 0.17.6 '@types/sinon@9.0.11': dependencies: - '@types/sinonjs__fake-timers': 8.1.5 + '@types/sinonjs__fake-timers': 15.0.1 - '@types/sinonjs__fake-timers@8.1.5': {} + '@types/sinonjs__fake-timers@15.0.1': {} - '@types/sizzle@2.3.8': {} + '@types/sizzle@2.3.10': {} - '@types/tunnel@0.0.3': - dependencies: - '@types/node': 18.19.31 + '@types/tough-cookie@4.0.5': {} '@types/unist@3.0.3': {} @@ -5244,170 +5191,235 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint@9.38.0)(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/type-utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 7.0.5 natural-compare: 1.4.0 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.3.3 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.38.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.21.0': + '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.38.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/scope-manager@7.0.2': + '@typescript-eslint/project-service@8.46.2(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/visitor-keys': 7.0.2 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.6.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@7.0.2(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) - '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/scope-manager@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 - '@typescript-eslint/types@7.0.2': {} + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.6.3)': + dependencies: + typescript: 5.6.3 - '@typescript-eslint/types@7.14.1': {} + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.38.0 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.38.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.46.2': {} + + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.6.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.2(typescript@5.6.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.6.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + fast-glob: 3.3.3 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.0.2(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + fast-glob: 3.3.3 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.57.0 - semver: 7.6.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) + eslint: 9.38.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/utils@7.0.2(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) - eslint: 8.57.0 - semver: 7.6.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@6.21.0': + '@typescript-eslint/visitor-keys@8.46.2': dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@7.0.2': + '@typespec/ts-http-runtime@0.3.1': dependencies: - '@typescript-eslint/types': 7.0.2 - eslint-visitor-keys: 3.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} - '@xmldom/xmldom@0.8.10': {} + '@xmldom/xmldom@0.8.13': {} '@yarnpkg/lockfile@1.1.0': {} - abbrev@1.1.1: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.11.3 + acorn: 8.15.0 - acorn-walk@8.3.2: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 - acorn@8.11.3: {} + acorn@8.15.0: {} address@1.2.2: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-draft-04@1.0.0(ajv@8.13.0): + ajv-draft-04@1.0.0(ajv@8.18.0): optionalDependencies: - ajv: 8.13.0 + ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.13.0): + ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: - ajv: 8.13.0 + ajv: 8.18.0 ajv@6.12.6: dependencies: @@ -5416,31 +5428,22 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - - ajv@8.13.0: + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - - almost-equal@1.1.0: {} - ansi-colors@4.1.1: {} + ansi-colors@4.1.3: {} - ansi-escapes@7.2.0: + ansi-escapes@7.1.1: dependencies: environment: 1.1.0 ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -5450,7 +5453,7 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: @@ -5473,169 +5476,147 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 + aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.4 + is-array-buffer: 3.0.5 array-flatten@1.1.1: {} - array-includes@3.1.8: + array-includes@3.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - array.prototype.toreversed@1.1.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - array.prototype.tosorted@1.1.3: + array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@2.0.1: {} assertion-error@1.1.0: {} ast-types-flow@0.0.8: {} - asynckit@0.4.0: {} + async-function@1.0.0: {} - available-typed-arrays@1.0.7: + async-retry@1.3.3: dependencies: - possible-typed-array-names: 1.0.0 - - axe-core@4.7.0: {} + retry: 0.13.1 - axios@0.21.4: - dependencies: - follow-redirects: 1.15.6 - transitivePeerDependencies: - - debug + asynckit@0.4.0: {} - axios@0.25.0: + available-typed-arrays@1.0.7: dependencies: - follow-redirects: 1.15.6 - transitivePeerDependencies: - - debug + possible-typed-array-names: 1.1.0 - axios@0.27.2: - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - transitivePeerDependencies: - - debug + axe-core@4.11.0: {} - axios@1.6.8: + axios@0.25.0: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 + follow-redirects: 1.15.11 transitivePeerDependencies: - debug - axios@1.8.4: + axios@1.13.0: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.2 + follow-redirects: 1.15.11 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axobject-query@3.2.1: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@0.0.8: {} base64-js@1.5.1: {} - beachball@2.43.1(typescript@5.6.3): + baseline-browser-mapping@2.8.20: {} + + beachball@2.56.0(typescript@5.9.3): dependencies: - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 9.0.0(typescript@5.9.3) execa: 5.1.1 - fs-extra: 11.2.0 + fs-extra: 11.3.2 lodash: 4.17.21 minimatch: 3.1.2 + p-graph: 1.2.0 p-limit: 3.1.0 prompts: 2.4.2 - semver: 7.6.2 + semver: 7.7.3 toposort: 2.0.2 - uuid: 9.0.1 - workspace-tools: 0.36.4 + workspace-tools: 0.38.4 yargs-parser: 21.1.1 transitivePeerDependencies: - typescript - binary-extensions@2.3.0: {} + bignumber.js@9.3.1: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + binary-extensions@2.3.0: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -5645,25 +5626,25 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + brace-expansion@5.0.5: dependencies: - fill-range: 7.0.1 + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -5671,21 +5652,21 @@ snapshots: browser-stdout@1.3.1: {} - browserslist@4.23.0: + browserslist@4.27.0: dependencies: - caniuse-lite: 1.0.30001612 - electron-to-chromium: 1.4.747 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + baseline-browser-mapping: 2.8.20 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.241 + node-releases: 2.0.26 + update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} - buffer@5.7.1: + bundle-name@4.1.0: dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + run-applescript: 7.1.0 bytes@3.1.2: {} @@ -5695,10 +5676,10 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.1.0 responselike: 3.0.0 caching-transform@4.0.0: @@ -5713,40 +5694,44 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: + call-bind@1.0.8: dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001612: {} + caniuse-lite@1.0.30001751: {} canonical-path@1.0.0: {} ccount@2.0.1: {} - chai-as-promised@7.1.1(chai@4.4.1): + chai-as-promised@7.1.2(chai@4.5.0): dependencies: - chai: 4.4.1 + chai: 4.5.0 check-error: 1.0.3 - chai@4.4.1: + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 chalk@2.4.2: dependencies: @@ -5774,10 +5759,10 @@ snapshots: dependencies: get-func-name: 2.0.2 - chokidar@3.5.3: + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -5786,7 +5771,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 clean-stack@2.2.0: {} @@ -5839,7 +5826,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@14.0.2: {} + commander@14.0.3: {} comment-parser@1.4.1: {} @@ -5859,30 +5846,48 @@ snapshots: cookie-signature@1.0.6: {} - cookie@0.6.0: {} + cookie@0.7.1: {} - cosmiconfig@8.3.6(typescript@5.6.3): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: - import-fresh: 3.3.0 + env-paths: 2.2.1 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 cpx2@3.0.2: dependencies: co: 4.6.0 debounce: 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) duplexer: 0.1.2 fs-extra: 10.1.0 glob: 7.2.3 glob2base: 0.0.12 minimatch: 3.1.2 - resolve: 1.22.8 + resolve: 1.22.11 + safe-buffer: 5.2.1 + shell-quote: 1.8.3 + subarg: 1.0.0 + transitivePeerDependencies: + - supports-color + + cpx2@8.0.0: + dependencies: + debounce: 2.2.0 + debug: 4.4.3(supports-color@8.1.1) + duplexer: 0.1.2 + fs-extra: 11.3.2 + glob: 11.0.3 + glob2base: 0.0.12 + ignore: 6.0.2 + minimatch: 10.2.3 + p-map: 7.0.3 + resolve: 1.22.11 safe-buffer: 5.2.1 - shell-quote: 1.8.1 + shell-quote: 1.8.3 subarg: 1.0.0 transitivePeerDependencies: - supports-color @@ -5891,22 +5896,16 @@ snapshots: cross-env@5.2.1: dependencies: - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 - cross-spawn@6.0.5: + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 - semver: 7.6.2 + semver: 7.7.3 shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5915,30 +5914,32 @@ snapshots: crypt@0.0.2: {} - crypto-js@4.2.0: {} - damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 debounce@1.2.1: {} + debounce@2.2.0: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -5947,9 +5948,9 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 @@ -5961,14 +5962,19 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 - - deep-extend@0.6.0: {} + type-detect: 4.1.0 deep-is@0.1.4: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + default-require-extensions@3.0.1: dependencies: strip-bom: 4.0.0 @@ -5977,11 +5983,11 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 - define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: dependencies: @@ -5999,8 +6005,6 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.3: {} - detect-port@1.3.0: dependencies: address: 1.2.2 @@ -6014,7 +6018,11 @@ snapshots: diff@4.0.2: {} - diff@5.0.0: {} + diff@5.2.0: {} + + diff@7.0.0: {} + + diff@8.0.4: {} dir-glob@3.0.1: dependencies: @@ -6024,10 +6032,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dotenv-expand@5.1.0: {} dotenv@10.0.0: {} @@ -6040,6 +6044,13 @@ snapshots: duplexer@0.1.2: {} + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -6048,7 +6059,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.4.747: {} + electron-to-chromium@1.5.241: {} emoji-regex-xs@1.0.0: {} @@ -6060,108 +6071,106 @@ snapshots: encodeurl@1.0.2: {} - end-of-stream@1.4.4: + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: dependencies: once: 1.4.0 entities@4.5.0: {} + env-paths@2.2.1: {} + environment@1.1.0: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + es-abstract@1.24.0: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 + is-data-view: 1.0.2 is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.0.18: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - - es-module-lexer@1.5.4: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -6169,19 +6178,19 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es6-error@4.1.1: {} - escalade@3.1.2: {} + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -6189,60 +6198,93 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.2(eslint@9.38.0): dependencies: - eslint: 8.57.0 + eslint: 9.38.0 + + eslint-formatter-visualstudio@8.40.0: {} eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.6.3) + eslint: 9.38.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-deprecation@2.0.0(eslint@8.57.0)(typescript@5.3.3): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0): dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - tslib: 2.6.2 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + eslint: 9.38.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint@9.38.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.38.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 7.7.3 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.6.3) transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0): dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 9.38.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 7.6.2 + object.values: 1.2.1 + semver: 7.7.3 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6254,131 +6296,128 @@ snapshots: has: 1.0.4 requireindex: 1.1.0 - eslint-plugin-jsdoc@48.5.0(eslint@8.57.0): + eslint-plugin-jsdoc@50.8.0(eslint@9.38.0): dependencies: - '@es-joy/jsdoccomment': 0.43.1 + '@es-joy/jsdoccomment': 0.50.2 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 8.57.0 - esquery: 1.5.0 - parse-imports: 2.1.0 - semver: 7.6.2 + eslint: 9.38.0 + espree: 10.4.0 + esquery: 1.6.0 + parse-imports-exports: 0.2.4 + semver: 7.7.3 spdx-expression-parse: 4.0.0 - synckit: 0.9.0 transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.38.0): dependencies: - '@babel/runtime': 7.24.4 - aria-query: 5.3.0 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 + axe-core: 4.11.0 + axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.18 - eslint: 8.57.0 + eslint: 9.38.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.8 object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 - eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.0): + eslint-plugin-prefer-arrow@1.2.3(eslint@9.38.0): dependencies: - eslint: 8.57.0 + eslint: 9.38.0 - eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.38.0): dependencies: - eslint: 8.57.0 + eslint: 9.38.0 - eslint-plugin-react@7.34.1(eslint@8.57.0): + eslint-plugin-react@7.37.5(eslint@9.38.0): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.3 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 - eslint: 8.57.0 + es-iterator-helpers: 1.2.1 + eslint: 9.38.0 estraverse: 5.3.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 - object.hasown: 1.1.4 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 - semver: 7.6.2 - string.prototype.matchall: 4.0.11 + semver: 7.7.3 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.38.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionator: 0.9.4 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -6392,23 +6431,15 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} events@3.3.0: {} - execa@1.0.0: - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -6418,36 +6449,46 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - expand-template@2.0.3: {} + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - express@4.19.2: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -6456,40 +6497,53 @@ snapshots: transitivePeerDependencies: - supports-color + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fast-uri@3.1.0: {} + + fast-xml-parser@4.5.3: dependencies: - reusify: 1.0.4 + strnum: 1.1.2 - file-entry-cache@6.0.1: + fast-xml-parser@5.3.0: dependencies: - flat-cache: 3.2.0 + strnum: 2.1.1 - fill-range@7.0.1: + fastq@1.19.1: dependencies: - to-regex-range: 5.0.1 + reusify: 1.1.0 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -6516,54 +6570,55 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flat@5.0.2: {} flatbuffers@1.12.0: {} - flatted@3.3.1: {} + flatted@3.3.3: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.11: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 - foreground-child@3.2.1: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data-encoder@2.1.4: {} - form-data@2.5.1: + form-data@2.5.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 + safe-buffer: 5.2.1 - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - form-data@4.0.2: + formdata-polyfill@4.0.10: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 + fetch-blob: 3.2.0 forwarded@0.2.0: {} @@ -6571,26 +6626,18 @@ snapshots: fromentries@1.3.2: {} - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -6607,15 +6654,55 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gaxios@7.1.2: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@8.1.1: + dependencies: + gaxios: 7.1.2 + google-logging-utils: 1.1.1 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -6624,14 +6711,6 @@ snapshots: get-func-name@2.0.2: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -6652,28 +6731,33 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@4.1.0: - dependencies: - pump: 3.0.0 - get-stream@6.0.1: {} - get-symbol-description@1.0.2: + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 git-up@7.0.0: dependencies: - is-ssh: 1.4.0 + is-ssh: 1.4.1 parse-url: 8.1.0 + git-up@8.1.1: + dependencies: + is-ssh: 1.4.1 + parse-url: 9.2.0 + git-url-parse@13.1.1: dependencies: git-up: 7.0.0 - github-from-package@0.0.0: {} + git-url-parse@16.1.0: + dependencies: + git-up: 8.1.1 glob-parent@5.1.2: dependencies: @@ -6687,15 +6771,24 @@ snapshots: dependencies: find-index: 0.1.1 - glob@10.4.2: + glob@10.5.0: dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 + foreground-child: 3.3.1 + jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.2.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -6710,31 +6803,67 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: + google-auth-library@10.4.2: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.2 + gcp-metadata: 8.1.1 + google-logging-utils: 1.1.1 + gtoken: 8.0.0 + jws: 4.0.0 + transitivePeerDependencies: + - supports-color + + google-auth-library@9.15.1: dependencies: - get-intrinsic: 1.2.4 + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1 + gcp-metadata: 6.1.1 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-gax@5.0.4: + dependencies: + '@grpc/grpc-js': 1.14.0 + '@grpc/proto-loader': 0.8.0 + duplexify: 4.1.3 + google-auth-library: 10.4.2 + google-logging-utils: 1.1.1 + node-fetch: 3.3.2 + object-hash: 3.0.0 + proto3-json-serializer: 3.0.3 + protobufjs: 7.5.4 + retry-request: 8.0.2 + transitivePeerDependencies: + - supports-color + + google-logging-utils@0.0.2: {} + + google-logging-utils@1.1.1: {} gopd@1.2.0: {} @@ -6756,7 +6885,22 @@ snapshots: graphemer@1.4.0: {} - has-bigints@1.0.2: {} + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gtoken@8.0.0: + dependencies: + gaxios: 7.1.2 + jws: 4.0.0 + transitivePeerDependencies: + - supports-color + + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -6764,17 +6908,17 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} + es-define-property: 1.0.1 - has-symbols@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has@1.0.4: {} @@ -6787,7 +6931,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-to-html@9.0.4: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -6796,7 +6940,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -6809,11 +6953,13 @@ snapshots: hosted-git-info@2.8.9: {} + html-entities@2.6.0: {} + html-escaper@2.0.2: {} html-void-elements@3.0.0: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@1.8.1: dependencies: @@ -6831,24 +6977,57 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} - husky@8.0.3: {} + human-signals@5.0.0: {} + + husky@9.1.7: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} + ignore@5.3.2: {} - ignore@5.3.1: {} + ignore@6.0.2: {} - import-fresh@3.3.0: + ignore@7.0.5: {} + + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -6866,67 +7045,69 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 - - inversify@5.0.5: {} - - inversify@6.0.2: {} + side-channel: 1.1.0 ipaddr.js@1.9.1: {} - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - is-bigint@1.0.4: + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} is-callable@1.2.7: {} - is-core-module@2.13.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-docker@2.2.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -6934,20 +7115,29 @@ snapshots: dependencies: get-east-asian-width: 1.4.0 - is-generator-function@1.0.10: + is-generator-function@1.1.2: dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-map@2.0.3: {} is-negative-zero@2.0.3: {} - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -6956,36 +7146,41 @@ snapshots: is-plain-obj@2.1.0: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 - is-ssh@1.4.0: + is-ssh@1.4.1: dependencies: - protocols: 2.0.1 - - is-stream@1.1.0: {} + protocols: 2.0.2 is-stream@2.0.1: {} - is-string@1.0.7: + is-stream@3.0.0: {} + + is-string@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 is-typedarray@1.0.0: {} @@ -6993,20 +7188,20 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} - is-wsl@2.2.0: + is-wsl@3.1.0: dependencies: - is-docker: 2.2.1 + is-inside-container: 1.0.0 isarray@0.0.1: {} @@ -7022,17 +7217,17 @@ snapshots: istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 @@ -7046,38 +7241,41 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.2: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jju@1.4.0: {} - jose@2.0.7: - dependencies: - '@panva/asn1.js': 1.0.0 + jose@4.15.9: {} - js-base64@3.7.7: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} @@ -7090,9 +7288,13 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.0.0: {} + jsdoc-type-pratt-parser@4.1.0: {} + + jsesc@3.1.0: {} - jsesc@2.5.2: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 json-buffer@3.0.1: {} @@ -7118,7 +7320,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -7135,45 +7337,51 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.2 + semver: 7.7.3 jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 just-extend@4.2.1: {} - jwa@1.4.1: + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jwks-rsa@2.1.5: + jwks-rsa@3.2.0: dependencies: - '@types/express': 4.17.21 - '@types/jsonwebtoken': 8.5.9 - debug: 4.3.4(supports-color@8.1.1) - jose: 2.0.7 + '@types/express': 4.17.25 + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3(supports-color@8.1.1) + jose: 4.15.9 limiter: 1.1.5 - lru-memoizer: 2.2.0 + lru-memoizer: 2.3.0 transitivePeerDependencies: - supports-color jws@3.2.2: dependencies: - jwa: 1.4.1 + jwa: 1.4.2 safe-buffer: 5.2.1 - jwt-decode@3.1.2: {} - - keytar@7.9.0: + jws@4.0.0: dependencies: - node-addon-api: 4.3.0 - prebuild-install: 7.1.2 + jwa: 2.0.1 + safe-buffer: 5.2.1 + + jwt-decode@4.0.0: {} keyv@4.5.4: dependencies: @@ -7181,11 +7389,11 @@ snapshots: kleur@3.0.3: {} - language-subtag-registry@0.3.22: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 levn@0.4.1: dependencies: @@ -7205,15 +7413,14 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.2.7: + lint-staged@16.4.0: dependencies: - commander: 14.0.2 + commander: 14.0.3 listr2: 9.0.5 - micromatch: 4.0.8 - nano-spawn: 2.0.0 - pidtree: 0.6.0 + picomatch: 4.0.4 string-argv: 0.3.2 - yaml: 2.8.1 + tinyexec: 1.1.1 + yaml: 2.8.3 listr2@9.0.5: dependencies: @@ -7239,6 +7446,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.clonedeep@4.5.0: {} lodash.flattendeep@4.4.0: {} @@ -7270,12 +7479,14 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.2.0 + ansi-escapes: 7.1.1 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 9.0.2 + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -7286,12 +7497,9 @@ snapshots: lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} - lru-cache@4.0.2: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -7301,27 +7509,23 @@ snapshots: dependencies: yallist: 4.0.0 - lru-memoizer@2.2.0: + lru-memoizer@2.3.0: dependencies: lodash.clonedeep: 4.5.0 - lru-cache: 4.0.2 + lru-cache: 6.0.0 lunr@2.3.9: {} make-dir@3.1.0: dependencies: - semver: 7.6.2 + semver: 7.7.3 make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.7.3 make-error@1.3.6: {} - map-age-cleaner@0.1.3: - dependencies: - p-defer: 1.0.0 - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -7343,7 +7547,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -7355,15 +7559,13 @@ snapshots: media-typer@0.3.0: {} - mem@4.3.0: + memoize@10.2.0: dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 2.1.0 - p-is-promise: 2.1.0 + mimic-function: 5.0.1 memorystream@0.3.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -7374,7 +7576,7 @@ snapshots: micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-encode@2.0.1: {} @@ -7386,12 +7588,7 @@ snapshots: micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + micromark-util-types@2.0.2: {} micromatch@4.0.8: dependencies: @@ -7406,79 +7603,99 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} mimic-response@3.1.0: {} mimic-response@4.0.0: {} - minimatch@3.0.8: + minimatch@10.2.3: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 - - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 - minimatch@9.0.3: + minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} - mkdirp@3.0.1: {} - mocha-junit-reporter@2.2.1(mocha@10.4.0): + mocha-junit-reporter@2.2.1(mocha@11.7.4): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) md5: 2.3.0 mkdirp: 3.0.1 - mocha: 10.4.0 + mocha: 11.7.4 strip-ansi: 6.0.1 xml: 1.0.1 transitivePeerDependencies: - supports-color - mocha@10.4.0: + mocha@10.8.2: dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - ms@2.0.0: {} + mocha@11.7.4: + dependencies: + browser-stdout: 1.3.1 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + diff: 7.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 10.5.0 + he: 1.2.0 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 9.0.5 + ms: 2.1.3 + picocolors: 1.1.1 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 + yargs-unparser: 2.0.0 - ms@2.1.2: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -7488,10 +7705,6 @@ snapshots: safe-buffer: 5.2.1 uid-safe: 2.1.5 - nano-spawn@2.0.0: {} - - napi-build-utils@1.0.2: {} - natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -7502,61 +7715,61 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 '@sinonjs/fake-timers': 6.0.1 - '@sinonjs/text-encoding': 0.7.2 + '@sinonjs/text-encoding': 0.7.3 just-extend: 4.2.1 - path-to-regexp: 1.8.0 - - node-abi@3.62.0: - dependencies: - semver: 7.6.2 + path-to-regexp: 1.9.0 - node-addon-api@4.3.0: {} + node-domexception@1.0.0: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-preload@0.2.1: + node-fetch@3.3.2: dependencies: - process-on-spawn: 1.0.0 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 - node-releases@2.0.14: {} + node-persist@3.1.3: {} - nopt@1.0.10: + node-preload@0.2.1: dependencies: - abbrev: 1.1.1 + process-on-spawn: 1.1.0 + + node-releases@2.0.26: {} normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 7.6.2 + resolve: 1.22.11 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} - normalize-url@8.0.1: {} + normalize-url@8.1.0: {} npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 memorystream: 0.3.1 minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.1 + shell-quote: 1.8.3 string.prototype.padend: 3.1.6 - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 @@ -7575,11 +7788,11 @@ snapshots: istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 resolve-from: 5.0.0 rimraf: 3.0.2 signal-exit: 3.0.7 @@ -7591,52 +7804,51 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.hasown@1.1.4: - dependencies: + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 - oidc-client-ts@2.4.0: + oidc-client-ts@3.3.0: dependencies: - crypto-js: 4.2.0 - jwt-decode: 3.1.2 + jwt-decode: 4.0.0 on-finished@2.4.1: dependencies: @@ -7650,6 +7862,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -7660,30 +7876,33 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - open@8.4.2: + open@10.2.0: dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 opener@1.5.2: {} - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 - p-cancelable@3.0.0: {} - - p-defer@1.0.0: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 - p-finally@1.0.0: {} + p-cancelable@3.0.0: {} - p-is-promise@2.1.0: {} + p-graph@1.2.0: {} p-limit@2.3.0: dependencies: @@ -7705,6 +7924,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-map@7.0.3: {} + p-try@2.2.0: {} package-hash@4.0.0: @@ -7714,7 +7935,7 @@ snapshots: lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} pako@0.2.9: {} @@ -7722,30 +7943,36 @@ snapshots: dependencies: callsites: 3.1.0 - parse-imports@2.1.0: + parse-imports-exports@0.2.4: dependencies: - es-module-lexer: 1.5.4 - slashes: 3.0.12 + parse-statements: 1.0.11 parse-json@4.0.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-better-errors: 1.0.2 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-path@7.0.0: + parse-path@7.1.0: dependencies: - protocols: 2.0.1 + protocols: 2.0.2 + + parse-statements@1.0.11: {} parse-url@8.1.0: dependencies: - parse-path: 7.0.0 + parse-path: 7.1.0 + + parse-url@9.2.0: + dependencies: + '@types/parse-path': 7.1.0 + parse-path: 7.1.0 parseurl@1.3.3: {} @@ -7757,16 +7984,23 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.12: {} - path-to-regexp@1.8.0: + path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 @@ -7778,13 +8012,13 @@ snapshots: pathval@1.1.1: {} - picocolors@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} - pidtree@0.3.1: {} + picomatch@4.0.4: {} - pidtree@0.6.0: {} + pidtree@0.3.1: {} pify@3.0.0: {} @@ -7792,47 +8026,32 @@ snapshots: dependencies: find-up: 4.1.0 - playwright-core@1.35.1: {} + playwright-core@1.47.2: {} - playwright-core@1.41.2: {} + playwright-core@1.56.1: {} - playwright@1.35.1: + playwright@1.47.2: dependencies: - playwright-core: 1.35.1 + playwright-core: 1.47.2 + optionalDependencies: + fsevents: 2.3.2 - playwright@1.41.2: + playwright@1.56.1: dependencies: - playwright-core: 1.41.2 + playwright-core: 1.56.1 optionalDependencies: fsevents: 2.3.2 - possible-typed-array-names@1.0.0: {} - - prebuild-install@7.1.2: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.62.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 + possible-typed-array-names@1.1.0: {} prelude-ls@1.2.1: {} - prettier@3.2.5: {} + prettier@3.6.2: {} - process-on-spawn@1.0.0: + process-on-spawn@1.1.0: dependencies: fromentries: 1.3.2 - process@0.11.10: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -7844,9 +8063,28 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@6.5.0: {} + property-information@7.1.0: {} + + proto3-json-serializer@3.0.3: + dependencies: + protobufjs: 7.5.4 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.18.12 + long: 5.3.2 - protocols@2.0.1: {} + protocols@2.0.2: {} proxy-addr@2.0.7: dependencies: @@ -7855,24 +8093,13 @@ snapshots: proxy-from-env@1.1.0: {} - pseudomap@1.0.2: {} - - psl@1.9.0: {} - - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode.js@2.3.1: {} punycode@2.3.1: {} - qs@6.11.0: + qs@6.13.0: dependencies: - side-channel: 1.0.6 - - querystringify@2.2.0: {} + side-channel: 1.1.0 queue-microtask@1.2.3: {} @@ -7893,13 +8120,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-is@16.13.1: {} read-pkg@3.0.0: @@ -7918,19 +8138,18 @@ snapshots: dependencies: picomatch: 2.3.1 - reflect-metadata@0.1.14: {} + readdirp@4.1.2: {} - reflect.getprototypeof@1.0.6: + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - - regenerator-runtime@0.14.1: {} + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 regex-recursion@5.1.1: dependencies: @@ -7943,11 +8162,13 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 release-zalgo@1.0.0: @@ -7962,23 +8183,21 @@ snapshots: requireindex@1.1.0: {} - requires-port@1.0.0: {} - resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve@1.22.8: + resolve@1.22.11: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -7991,7 +8210,25 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - reusify@1.0.4: {} + retry-request@7.0.2: + dependencies: + '@types/request': 2.48.13 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + retry-request@8.0.2: + dependencies: + extend: 3.0.2 + teeny-request: 10.1.0 + transitivePeerDependencies: + - supports-color + + retry@0.13.1: {} + + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -7999,36 +8236,43 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@6.0.1: + dependencies: + glob: 11.0.3 + package-json-from-dist: 1.0.1 + + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 - - safer-buffer@2.1.2: {} - - sax@1.3.0: {} + isarray: 2.0.5 - semver@7.6.0: + safe-regex-test@1.1.0: dependencies: - lru-cache: 6.0.0 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} - semver@7.6.2: {} + semver@7.7.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -8046,16 +8290,16 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -8066,8 +8310,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -8077,6 +8321,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} shebang-command@1.2.0: @@ -8091,7 +8341,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.3: {} shiki@1.29.2: dependencies: @@ -8101,27 +8351,40 @@ snapshots: '@shikijs/langs': 1.29.2 '@shikijs/themes': 1.29.2 '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.4 - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 - simple-concat@1.0.1: {} + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 - simple-get@4.0.1: + side-channel@1.1.0: dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} sinon@9.2.4: dependencies: @@ -8136,11 +8399,9 @@ snapshots: slash@3.0.0: {} - slashes@3.0.12: {} - slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 source-map-support@0.5.21: @@ -8164,21 +8425,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.22 spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.17: {} + spdx-license-ids@3.0.22: {} sprintf-js@1.0.3: {} @@ -8186,6 +8447,17 @@ snapshots: statuses@2.0.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-shift@1.0.3: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -8198,59 +8470,75 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@8.1.0: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.padend@3.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + string.prototype.repeat@1.0.0: + dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.3.0: dependencies: @@ -8265,22 +8553,26 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} strip-bom@4.0.0: {} - strip-eof@1.0.0: {} - strip-final-newline@2.0.0: {} - strip-json-comments@2.0.1: {} + strip-final-newline@3.0.0: {} strip-json-comments@3.1.1: {} + strnum@1.1.2: {} + + strnum@2.1.1: {} + + stubs@3.0.0: {} + subarg@1.0.0: dependencies: minimist: 1.2.8 @@ -8299,25 +8591,25 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.0: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 - - tar-fs@2.1.1: + teeny-request@10.1.0: dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 3.3.2 + stream-events: 1.0.5 + transitivePeerDependencies: + - supports-color - tar-stream@2.2.0: + teeny-request@9.0.0: dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color test-exclude@6.0.0: dependencies: @@ -8325,11 +8617,9 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-table@0.2.0: {} - tiny-inflate@1.0.3: {} - to-fast-properties@2.0.0: {} + tinyexec@1.1.1: {} to-regex-range@5.0.1: dependencies: @@ -8339,16 +8629,7 @@ snapshots: toposort@2.0.2: {} - touch@3.1.0: - dependencies: - nopt: 1.0.10 - - tough-cookie@4.1.3: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + touch@3.1.1: {} tr46@0.0.3: {} @@ -8356,25 +8637,29 @@ snapshots: trim-lines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.3.3): + ts-api-utils@2.1.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.3.3 + typescript: 5.9.3 - ts-node@10.9.2(@types/node@14.14.31)(typescript@5.3.3): + ts-node@10.9.2(@types/node@22.18.12)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.31 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 22.18.12 + acorn: 8.15.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -8385,20 +8670,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - - tslib@2.6.2: {} - - tsutils@3.21.0(typescript@5.3.3): - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tunnel@0.0.6: {} + tslib@2.8.1: {} type-check@0.4.0: dependencies: @@ -8406,7 +8678,7 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.20.2: {} + type-detect@4.1.0: {} type-fest@0.8.1: {} @@ -8415,37 +8687,38 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 typedarray-to-buffer@3.1.5: dependencies: @@ -8462,35 +8735,33 @@ snapshots: minimatch: 9.0.5 shiki: 1.29.2 typescript: 5.6.3 - yaml: 2.7.0 - - typescript@5.3.3: {} - - typescript@5.4.2: {} + yaml: 2.8.3 typescript@5.6.3: {} + typescript@5.9.3: {} + uc.micro@2.1.0: {} uid-safe@2.1.5: dependencies: random-bytes: 1.0.0 - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} + undici-types@6.21.0: {} unicode-trie@2.0.0: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -8502,44 +8773,37 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 universalify@0.1.2: {} - universalify@0.2.0: {} - universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - username@5.1.0: + username@7.0.0: dependencies: - execa: 1.0.0 - mem: 4.3.0 + execa: 8.0.1 + memoize: 10.2.0 util-deprecate@1.0.2: {} @@ -8558,7 +8822,7 @@ snapshots: vary@1.1.2: {} - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -8566,7 +8830,9 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 + + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -8575,44 +8841,47 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.1.3: + which-builtin-type@1.2.1: dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.4 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 which-module@2.0.1: {} - which-typed-array@1.1.15: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -8623,17 +8892,31 @@ snapshots: dependencies: isexe: 2.0.0 - workerpool@6.2.1: {} + word-wrap@1.2.5: {} + + workerpool@6.5.1: {} + + workerpool@9.3.4: {} workspace-tools@0.36.4: dependencies: '@yarnpkg/lockfile': 1.1.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 git-url-parse: 13.1.1 globby: 11.1.0 jju: 1.4.0 js-yaml: 4.1.0 - micromatch: 4.0.5 + micromatch: 4.0.8 + + workspace-tools@0.38.4: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + fast-glob: 3.3.3 + git-url-parse: 16.1.0 + globby: 11.1.0 + jju: 1.4.0 + js-yaml: 4.1.0 + micromatch: 4.0.8 wrap-ansi@6.2.0: dependencies: @@ -8649,15 +8932,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -8670,40 +8953,29 @@ snapshots: ws@7.5.10: {} - ws@7.5.9: {} - - wtfnode@0.9.2: {} - - xml2js@0.5.0: + wsl-utils@0.1.0: dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 + is-wsl: 3.1.0 - xml@1.0.1: {} + wtfnode@0.9.4: {} - xmlbuilder@11.0.1: {} + xml@1.0.1: {} y18n@4.0.3: {} y18n@5.0.8: {} - yallist@2.1.2: {} - yallist@3.1.1: {} yallist@4.0.0: {} - yaml@2.7.0: {} - - yaml@2.8.1: {} + yaml@2.8.3: {} yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.4: {} - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -8732,7 +9004,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -8742,7 +9014,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3