@webiny/api-core-sql 6.5.0 → 6.5.1-beta.0

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.
package/TableManager.d.ts CHANGED
@@ -2,7 +2,14 @@ import type { Knex } from "knex";
2
2
  interface ITableManager {
3
3
  reset(): void;
4
4
  resolve(tableName: string): string;
5
- ensure(tableName: string, creator: (table: Knex.CreateTableBuilder) => void): Promise<void>;
5
+ ensure(tableName: string, creator: (table: Knex.CreateTableBuilder) => void, upgrade?: TableUpgrade): Promise<void>;
6
+ }
7
+ /**
8
+ * Brings a table that already existed up to date (`creator` only runs for new tables).
9
+ * Must be idempotent: it runs once per process for every existing table.
10
+ */
11
+ export interface TableUpgrade {
12
+ (knex: Knex, resolvedTableName: string): Promise<void>;
6
13
  }
7
14
  export declare class TableManager implements ITableManager {
8
15
  private readonly knex;
@@ -11,6 +18,6 @@ export declare class TableManager implements ITableManager {
11
18
  constructor(knex: Knex, prefix?: string);
12
19
  reset(): void;
13
20
  resolve(tableName: string): string;
14
- ensure(tableName: string, creator: (table: Knex.CreateTableBuilder) => void): Promise<void>;
21
+ ensure(tableName: string, creator: (table: Knex.CreateTableBuilder) => void, upgrade?: TableUpgrade): Promise<void>;
15
22
  }
16
23
  export {};
package/TableManager.js CHANGED
@@ -13,11 +13,13 @@ class TableManager {
13
13
  resolve(tableName) {
14
14
  return `${this.prefix}${tableName}`;
15
15
  }
16
- async ensure(tableName, creator) {
16
+ async ensure(tableName, creator, upgrade) {
17
17
  const resolved = this.resolve(tableName);
18
18
  if (this.verified.has(resolved)) return;
19
19
  const exists = await this.knex.schema.hasTable(resolved);
20
- if (!exists) await this.knex.schema.createTable(resolved, creator);
20
+ if (exists) {
21
+ if (upgrade) await upgrade(this.knex, resolved);
22
+ } else await this.knex.schema.createTable(resolved, creator);
21
23
  this.verified.add(resolved);
22
24
  }
23
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TableManager.js","sources":["../src/TableManager.ts"],"sourcesContent":["import type { Knex } from \"knex\";\n\ninterface ITableManager {\n reset(): void;\n resolve(tableName: string): string;\n ensure(tableName: string, creator: (table: Knex.CreateTableBuilder) => void): Promise<void>;\n}\n\nexport class TableManager implements ITableManager {\n private readonly knex: Knex;\n private readonly prefix: string;\n private readonly verified = new Set<string>();\n\n constructor(knex: Knex, prefix: string = \"\") {\n this.knex = knex;\n this.prefix = prefix ? `${prefix}_` : \"\";\n\n const g = globalThis as Record<string, unknown>;\n const managers = (g.__sqlTableManagers ??= []) as ITableManager[];\n managers.push(this);\n }\n\n public reset(): void {\n this.verified.clear();\n }\n\n public resolve(tableName: string): string {\n return `${this.prefix}${tableName}`;\n }\n\n public async ensure(\n tableName: string,\n creator: (table: Knex.CreateTableBuilder) => void\n ): Promise<void> {\n const resolved = this.resolve(tableName);\n\n if (this.verified.has(resolved)) {\n return;\n }\n\n const exists = await this.knex.schema.hasTable(resolved);\n\n if (!exists) {\n await this.knex.schema.createTable(resolved, creator);\n }\n\n this.verified.add(resolved);\n }\n}\n"],"names":["TableManager","knex","prefix","Set","g","globalThis","managers","tableName","creator","resolved","exists"],"mappings":"AAQO,MAAMA;IAKT,YAAYC,IAAU,EAAEC,SAAiB,EAAE,CAAE;aAF5B,QAAQ,GAAG,IAAIC;QAG5B,IAAI,CAAC,IAAI,GAAGF;QACZ,IAAI,CAAC,MAAM,GAAGC,SAAS,GAAGA,OAAO,CAAC,CAAC,GAAG;QAEtC,MAAME,IAAIC;QACV,MAAMC,WAAYF,EAAE,kBAAkB,KAAK,EAAE;QAC7CE,SAAS,IAAI,CAAC,IAAI;IACtB;IAEO,QAAc;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK;IACvB;IAEO,QAAQC,SAAiB,EAAU;QACtC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAGA,WAAW;IACvC;IAEA,MAAa,OACTA,SAAiB,EACjBC,OAAiD,EACpC;QACb,MAAMC,WAAW,IAAI,CAAC,OAAO,CAACF;QAE9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACE,WAClB;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAACD;QAE/C,IAAI,CAACC,QACD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAACD,UAAUD;QAGjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACC;IACtB;AACJ"}
1
+ {"version":3,"file":"TableManager.js","sources":["../src/TableManager.ts"],"sourcesContent":["import type { Knex } from \"knex\";\n\ninterface ITableManager {\n reset(): void;\n resolve(tableName: string): string;\n ensure(\n tableName: string,\n creator: (table: Knex.CreateTableBuilder) => void,\n upgrade?: TableUpgrade\n ): Promise<void>;\n}\n\n/**\n * Brings a table that already existed up to date (`creator` only runs for new tables).\n * Must be idempotent: it runs once per process for every existing table.\n */\nexport interface TableUpgrade {\n (knex: Knex, resolvedTableName: string): Promise<void>;\n}\n\nexport class TableManager implements ITableManager {\n private readonly knex: Knex;\n private readonly prefix: string;\n private readonly verified = new Set<string>();\n\n constructor(knex: Knex, prefix: string = \"\") {\n this.knex = knex;\n this.prefix = prefix ? `${prefix}_` : \"\";\n\n const g = globalThis as Record<string, unknown>;\n const managers = (g.__sqlTableManagers ??= []) as ITableManager[];\n managers.push(this);\n }\n\n public reset(): void {\n this.verified.clear();\n }\n\n public resolve(tableName: string): string {\n return `${this.prefix}${tableName}`;\n }\n\n public async ensure(\n tableName: string,\n creator: (table: Knex.CreateTableBuilder) => void,\n upgrade?: TableUpgrade\n ): Promise<void> {\n const resolved = this.resolve(tableName);\n\n if (this.verified.has(resolved)) {\n return;\n }\n\n const exists = await this.knex.schema.hasTable(resolved);\n\n if (!exists) {\n await this.knex.schema.createTable(resolved, creator);\n } else if (upgrade) {\n await upgrade(this.knex, resolved);\n }\n\n this.verified.add(resolved);\n }\n}\n"],"names":["TableManager","knex","prefix","Set","g","globalThis","managers","tableName","creator","upgrade","resolved","exists"],"mappings":"AAoBO,MAAMA;IAKT,YAAYC,IAAU,EAAEC,SAAiB,EAAE,CAAE;aAF5B,QAAQ,GAAG,IAAIC;QAG5B,IAAI,CAAC,IAAI,GAAGF;QACZ,IAAI,CAAC,MAAM,GAAGC,SAAS,GAAGA,OAAO,CAAC,CAAC,GAAG;QAEtC,MAAME,IAAIC;QACV,MAAMC,WAAYF,EAAE,kBAAkB,KAAK,EAAE;QAC7CE,SAAS,IAAI,CAAC,IAAI;IACtB;IAEO,QAAc;QACjB,IAAI,CAAC,QAAQ,CAAC,KAAK;IACvB;IAEO,QAAQC,SAAiB,EAAU;QACtC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAGA,WAAW;IACvC;IAEA,MAAa,OACTA,SAAiB,EACjBC,OAAiD,EACjDC,OAAsB,EACT;QACb,MAAMC,WAAW,IAAI,CAAC,OAAO,CAACH;QAE9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACG,WAClB;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAACD;QAE/C,IAAKC,QAEE;YAAA,IAAIF,SACP,MAAMA,QAAQ,IAAI,CAAC,IAAI,EAAEC;QAC7B,OAHI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAACA,UAAUF;QAKjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACE;IACtB;AACJ"}
@@ -10,6 +10,7 @@ const userToRow = (user)=>({
10
10
  const rowToUser = (row)=>JSON.parse(row.data);
11
11
  const createStorageOperations = (params)=>{
12
12
  const { knex, tableManager } = params;
13
+ const idIndexName = `${tableManager.resolve(TABLE_NAME)}_id_index`;
13
14
  const ensureTable = ()=>tableManager.ensure(TABLE_NAME, (table)=>{
14
15
  table.text("id").notNullable();
15
16
  table.text("tenant").notNullable();
@@ -23,6 +24,15 @@ const createStorageOperations = (params)=>{
23
24
  "tenant",
24
25
  "email"
25
26
  ]);
27
+ table.index([
28
+ "id"
29
+ ], idIndexName);
30
+ }, async (knex, tableName)=>{
31
+ await knex.raw("CREATE INDEX IF NOT EXISTS ?? ON ?? (??)", [
32
+ idIndexName,
33
+ tableName,
34
+ "id"
35
+ ]);
26
36
  });
27
37
  const query = ()=>knex(tableManager.resolve(TABLE_NAME));
28
38
  return {
@@ -47,6 +57,40 @@ const createStorageOperations = (params)=>{
47
57
  });
48
58
  }
49
59
  },
60
+ async getUserAcrossTenants (params) {
61
+ const { id, tenants } = params;
62
+ if (0 === tenants.length) return [];
63
+ await ensureTable();
64
+ try {
65
+ const rows = await query().where("id", id).whereIn("tenant", tenants);
66
+ return rows.map((row)=>rowToUser(row));
67
+ } catch (err) {
68
+ throw error.from(err, {
69
+ message: "Could not load user across tenants.",
70
+ code: "GET_ADMIN_USER_ACROSS_TENANTS_ERROR",
71
+ data: {
72
+ id,
73
+ tenants
74
+ }
75
+ });
76
+ }
77
+ },
78
+ async listUserRecords (params) {
79
+ await ensureTable();
80
+ const { id } = params;
81
+ try {
82
+ const rows = await query().where("id", id);
83
+ return rows.map((row)=>rowToUser(row));
84
+ } catch (err) {
85
+ throw error.from(err, {
86
+ message: "Could not list user records.",
87
+ code: "LIST_ADMIN_USER_RECORDS_ERROR",
88
+ data: {
89
+ id
90
+ }
91
+ });
92
+ }
93
+ },
50
94
  async listUsers (params) {
51
95
  await ensureTable();
52
96
  const { where, sort } = params;
@@ -1 +1 @@
1
- {"version":3,"file":"adminUsers/index.js","sources":["../../src/adminUsers/index.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type {\n AdminUser,\n AdminUsersStorageOperations,\n StorageOperationsGetUserParams,\n StorageOperationsListUsersParams\n} from \"@webiny/api-core/types/users.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { TableManager } from \"~/TableManager.js\";\nimport { sortItems } from \"~/sortItems.js\";\n\nconst TABLE_NAME = \"webiny_core_admin_users\";\n\ninterface IAdminUserRow {\n id: string;\n tenant: string;\n email: string;\n data: string;\n}\n\nconst userToRow = (user: AdminUser): IAdminUserRow => {\n return {\n id: user.id,\n tenant: user.tenant,\n email: user.email,\n data: JSON.stringify(user)\n };\n};\n\nconst rowToUser = <TUser extends AdminUser = AdminUser>(row: IAdminUserRow): TUser => {\n return JSON.parse(row.data) as TUser;\n};\n\ninterface CreateStorageOperationsParams {\n knex: Knex;\n tableManager: TableManager;\n}\n\nexport const createStorageOperations = (\n params: CreateStorageOperationsParams\n): AdminUsersStorageOperations => {\n const { knex, tableManager } = params;\n\n const ensureTable = () => {\n return tableManager.ensure(TABLE_NAME, table => {\n table.text(\"id\").notNullable();\n table.text(\"tenant\").notNullable();\n table.text(\"email\").notNullable();\n table.text(\"data\").notNullable();\n\n table.primary([\"tenant\", \"id\"]);\n table.unique([\"tenant\", \"email\"]);\n });\n };\n\n const query = () => {\n return knex<IAdminUserRow>(tableManager.resolve(TABLE_NAME));\n };\n\n return {\n async getUser<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsGetUserParams\n ): Promise<TUser | null> {\n await ensureTable();\n\n const {\n where: { tenant, id, email }\n } = params;\n\n try {\n if (id) {\n const row = await query().where(\"tenant\", tenant).andWhere(\"id\", id).first();\n\n return row ? rowToUser<TUser>(row) : null;\n }\n\n const row = await query()\n .where(\"tenant\", tenant)\n .andWhere(\"email\", email as string)\n .first();\n\n return row ? rowToUser<TUser>(row) : null;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not load user.\",\n code: \"GET_ADMIN_USERS_ERROR\",\n data: { id, email }\n });\n }\n },\n\n async listUsers<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsListUsersParams\n ): Promise<TUser[]> {\n await ensureTable();\n\n const { where, sort } = params;\n\n try {\n const rows = await query().where(\"tenant\", where.tenant);\n\n let items = rows.map(row => rowToUser<TUser>(row));\n\n items = sortItems(items, sort);\n\n const { id_in } = where;\n\n if (Array.isArray(id_in)) {\n return items.filter(item => id_in.includes(item.id));\n }\n\n return items;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not list users.\",\n code: \"LIST_ADMIN_USERS_ERROR\"\n });\n }\n },\n\n async createUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<TUser> {\n await ensureTable();\n\n try {\n const row = userToRow(user);\n await query().insert(row);\n\n return user;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not create admin user.\",\n code: \"CREATE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n },\n\n async updateUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<TUser> {\n await ensureTable();\n\n try {\n const row = userToRow(user);\n await query().where(\"tenant\", user.tenant).andWhere(\"id\", user.id).update(row);\n\n return user;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not update user.\",\n code: \"UPDATE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n },\n\n async deleteUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<void> {\n await ensureTable();\n\n try {\n await query().where(\"tenant\", user.tenant).andWhere(\"id\", user.id).delete();\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not delete user.\",\n code: \"DELETE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n }\n };\n};\n"],"names":["TABLE_NAME","userToRow","user","JSON","rowToUser","row","createStorageOperations","params","knex","tableManager","ensureTable","table","query","tenant","id","email","err","WebinyError","where","sort","rows","items","sortItems","id_in","Array","item"],"mappings":"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"}
1
+ {"version":3,"file":"adminUsers/index.js","sources":["../../src/adminUsers/index.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type {\n AdminUser,\n AdminUsersStorageOperations,\n StorageOperationsGetUserAcrossTenantsParams,\n StorageOperationsGetUserParams,\n StorageOperationsListUserRecordsParams,\n StorageOperationsListUsersParams\n} from \"@webiny/api-core/types/users.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { TableManager } from \"~/TableManager.js\";\nimport { sortItems } from \"~/sortItems.js\";\n\nconst TABLE_NAME = \"webiny_core_admin_users\";\n\ninterface IAdminUserRow {\n id: string;\n tenant: string;\n email: string;\n data: string;\n}\n\nconst userToRow = (user: AdminUser): IAdminUserRow => {\n return {\n id: user.id,\n tenant: user.tenant,\n email: user.email,\n data: JSON.stringify(user)\n };\n};\n\nconst rowToUser = <TUser extends AdminUser = AdminUser>(row: IAdminUserRow): TUser => {\n return JSON.parse(row.data) as TUser;\n};\n\ninterface CreateStorageOperationsParams {\n knex: Knex;\n tableManager: TableManager;\n}\n\nexport const createStorageOperations = (\n params: CreateStorageOperationsParams\n): AdminUsersStorageOperations => {\n const { knex, tableManager } = params;\n\n // The user→tenant index: finds every tenant's record of one user.\n const idIndexName = `${tableManager.resolve(TABLE_NAME)}_id_index`;\n\n const ensureTable = () => {\n return tableManager.ensure(\n TABLE_NAME,\n table => {\n table.text(\"id\").notNullable();\n table.text(\"tenant\").notNullable();\n table.text(\"email\").notNullable();\n table.text(\"data\").notNullable();\n\n table.primary([\"tenant\", \"id\"]);\n table.unique([\"tenant\", \"email\"]);\n table.index([\"id\"], idIndexName);\n },\n async (knex, tableName) => {\n // Tables created before the index existed.\n await knex.raw(\"CREATE INDEX IF NOT EXISTS ?? ON ?? (??)\", [\n idIndexName,\n tableName,\n \"id\"\n ]);\n }\n );\n };\n\n const query = () => {\n return knex<IAdminUserRow>(tableManager.resolve(TABLE_NAME));\n };\n\n return {\n async getUser<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsGetUserParams\n ): Promise<TUser | null> {\n await ensureTable();\n\n const {\n where: { tenant, id, email }\n } = params;\n\n try {\n if (id) {\n const row = await query().where(\"tenant\", tenant).andWhere(\"id\", id).first();\n\n return row ? rowToUser<TUser>(row) : null;\n }\n\n const row = await query()\n .where(\"tenant\", tenant)\n .andWhere(\"email\", email as string)\n .first();\n\n return row ? rowToUser<TUser>(row) : null;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not load user.\",\n code: \"GET_ADMIN_USERS_ERROR\",\n data: { id, email }\n });\n }\n },\n\n async getUserAcrossTenants<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsGetUserAcrossTenantsParams\n ): Promise<TUser[]> {\n const { id, tenants } = params;\n if (tenants.length === 0) {\n return [];\n }\n\n await ensureTable();\n\n try {\n const rows = await query().where(\"id\", id).whereIn(\"tenant\", tenants);\n\n return rows.map(row => rowToUser<TUser>(row));\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not load user across tenants.\",\n code: \"GET_ADMIN_USER_ACROSS_TENANTS_ERROR\",\n data: { id, tenants }\n });\n }\n },\n\n async listUserRecords<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsListUserRecordsParams\n ): Promise<TUser[]> {\n await ensureTable();\n\n const { id } = params;\n\n try {\n const rows = await query().where(\"id\", id);\n\n return rows.map(row => rowToUser<TUser>(row));\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not list user records.\",\n code: \"LIST_ADMIN_USER_RECORDS_ERROR\",\n data: { id }\n });\n }\n },\n\n async listUsers<TUser extends AdminUser = AdminUser>(\n params: StorageOperationsListUsersParams\n ): Promise<TUser[]> {\n await ensureTable();\n\n const { where, sort } = params;\n\n try {\n const rows = await query().where(\"tenant\", where.tenant);\n\n let items = rows.map(row => rowToUser<TUser>(row));\n\n items = sortItems(items, sort);\n\n const { id_in } = where;\n\n if (Array.isArray(id_in)) {\n return items.filter(item => id_in.includes(item.id));\n }\n\n return items;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not list users.\",\n code: \"LIST_ADMIN_USERS_ERROR\"\n });\n }\n },\n\n async createUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<TUser> {\n await ensureTable();\n\n try {\n const row = userToRow(user);\n await query().insert(row);\n\n return user;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not create admin user.\",\n code: \"CREATE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n },\n\n async updateUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<TUser> {\n await ensureTable();\n\n try {\n const row = userToRow(user);\n await query().where(\"tenant\", user.tenant).andWhere(\"id\", user.id).update(row);\n\n return user;\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not update user.\",\n code: \"UPDATE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n },\n\n async deleteUser<TUser extends AdminUser = AdminUser>({\n user\n }: {\n user: TUser;\n }): Promise<void> {\n await ensureTable();\n\n try {\n await query().where(\"tenant\", user.tenant).andWhere(\"id\", user.id).delete();\n } catch (err) {\n throw WebinyError.from(err, {\n message: \"Could not delete user.\",\n code: \"DELETE_ADMIN_USER_ERROR\",\n data: { user }\n });\n }\n }\n };\n};\n"],"names":["TABLE_NAME","userToRow","user","JSON","rowToUser","row","createStorageOperations","params","knex","tableManager","idIndexName","ensureTable","table","tableName","query","tenant","id","email","err","WebinyError","tenants","rows","where","sort","items","sortItems","id_in","Array","item"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-core-sql",
3
- "version": "6.5.0",
3
+ "version": "6.5.1-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -21,15 +21,15 @@
21
21
  "author": "Webiny Ltd.",
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@webiny/api-core": "6.5.0",
25
- "@webiny/error": "6.5.0",
26
- "@webiny/feature": "6.5.0",
27
- "@webiny/handler": "6.5.0",
24
+ "@webiny/api-core": "6.5.1-beta.0",
25
+ "@webiny/error": "6.5.1-beta.0",
26
+ "@webiny/feature": "6.5.1-beta.0",
27
+ "@webiny/handler": "6.5.1-beta.0",
28
28
  "knex": "3.3.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@webiny/build-tools": "6.5.0",
32
- "@webiny/project-utils": "6.5.0",
31
+ "@webiny/build-tools": "6.5.1-beta.0",
32
+ "@webiny/project-utils": "6.5.1-beta.0",
33
33
  "better-sqlite3": "13.0.3",
34
34
  "typescript": "7.0.2",
35
35
  "vitest": "5.0.5"