@itwin/core-backend 5.14.0-dev.10 → 5.14.0-dev.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { BeDuration, DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n });\r\n\r\n});\r\n"]}
1
+ {"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { BeDuration, DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteChangesetReader } from \"../../SqliteChangesetReader\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n it(\"supports reading an iModel changeset with SQLiteDb\", () => {\r\n const iModelFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/ReadOnlyTest.bim\");\r\n const changesetFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs\");\r\n const iModel = SnapshotDb.openFile(iModelFileName);\r\n let tableName: string;\r\n let columnNames: string[];\r\n let expectedValues: Record<string, unknown>;\r\n let stage: \"Old\" | \"New\";\r\n try {\r\n using schemaReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel });\r\n expect(schemaReader.step()).true;\r\n tableName = schemaReader.tableName;\r\n columnNames = schemaReader.getColumnNames(tableName);\r\n stage = schemaReader.op === \"Deleted\" ? \"Old\" : \"New\";\r\n expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true })!;\r\n } finally {\r\n iModel.close();\r\n }\r\n\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"changeset-reader.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(dbFileName, undefined, { rawSQLite: true });\r\n const declaredColumns = columnNames.slice(0, -1);\r\n\r\n try {\r\n using missingTableReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(missingTableReader.step()).true;\r\n expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);\r\n\r\n db.executeSQL(`CREATE TABLE \"${tableName}\" (${declaredColumns.map((name) => `\"${name}\"`).join(\",\")})`);\r\n\r\n using checkedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db });\r\n expect(checkedReader.step()).true;\r\n expect(() => checkedReader.getChangeValuesObject(stage)).throws(\"columns count does not match\");\r\n\r\n using uncheckedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(uncheckedReader.step()).true;\r\n const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });\r\n const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));\r\n expect(values).deep.equal(expectedDeclaredValues);\r\n } finally {\r\n db.closeDb();\r\n }\r\n\r\n expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws(\"db must be open\");\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n });\r\n\r\n});\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "5.14.0-dev.10",
3
+ "version": "5.14.0-dev.12",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "module": "lib/esm/core-backend.js",
@@ -27,10 +27,10 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.0.4",
30
- "@itwin/core-bentley": "5.14.0-dev.10",
31
- "@itwin/core-common": "5.14.0-dev.10",
32
- "@itwin/ecschema-metadata": "5.14.0-dev.10",
33
- "@itwin/core-geometry": "5.14.0-dev.10"
30
+ "@itwin/core-geometry": "5.14.0-dev.12",
31
+ "@itwin/core-bentley": "5.14.0-dev.12",
32
+ "@itwin/core-common": "5.14.0-dev.12",
33
+ "@itwin/ecschema-metadata": "5.14.0-dev.12"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "@opentelemetry/api": {
@@ -71,17 +71,17 @@
71
71
  "marked": "^14.1.3",
72
72
  "sql-formatter": "^15.4.6",
73
73
  "vite": "^6.4.3",
74
- "@itwin/build-tools": "5.14.0-dev.10",
75
- "@itwin/core-bentley": "5.14.0-dev.10",
76
- "@itwin/ecschema-locaters": "5.14.0-dev.10",
77
- "@itwin/core-common": "5.14.0-dev.10",
78
- "@itwin/ecsql-common": "5.14.0-dev.10",
79
- "@itwin/core-geometry": "5.14.0-dev.10",
74
+ "@itwin/build-tools": "5.14.0-dev.12",
75
+ "@itwin/core-bentley": "5.14.0-dev.12",
76
+ "@itwin/core-common": "5.14.0-dev.12",
77
+ "@itwin/ecsql-common": "5.14.0-dev.12",
78
+ "@itwin/core-geometry": "5.14.0-dev.12",
80
79
  "internal-tools": "3.0.0-dev.69",
81
- "@itwin/ecschema-metadata": "5.14.0-dev.10"
80
+ "@itwin/ecschema-locaters": "5.14.0-dev.12",
81
+ "@itwin/ecschema-metadata": "5.14.0-dev.12"
82
82
  },
83
83
  "dependencies": {
84
- "@bentley/imodeljs-native": "5.14.22",
84
+ "@bentley/imodeljs-native": "5.14.29",
85
85
  "@itwin/object-storage-azure": "^3.0.4",
86
86
  "@azure/storage-blob": "^12.28.0",
87
87
  "form-data": "^4.0.6",