From a14a377312c65bbfb242daabf9de192b25553acc Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Tue, 30 Dec 2025 21:23:32 +0200 Subject: [PATCH] improved rovo integration --- __tests__/src/core/Rovo.test.ts | 537 ++++++++++++++++++ __tests__/src/webtriggers/webtriggers.test.ts | 27 - .../package-lock.json | 12 +- .../forge-sql-orm-example-cache/package.json | 2 +- .../forge-orm-example/package-lock.json | 16 +- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 16 +- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 131 +---- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 131 +---- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 131 +---- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 16 +- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 131 +---- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 131 +---- .../package-lock.json | 10 +- .../forge-orm-example/package-lock.json | 16 +- forge-sql-orm-cli/package-lock.json | 10 +- forge-sql-orm-cli/package.json | 2 +- package-lock.json | 10 +- package.json | 2 +- src/async/index.ts | 1 + src/core/ForgeSQLQueryBuilder.ts | 61 +- src/core/Rovo.ts | 240 ++++++-- src/core/index.ts | 4 + src/index.ts | 16 +- src/lib/index.ts | 1 + src/utils/index.ts | 2 + vite.config.mjs | 30 - 33 files changed, 984 insertions(+), 772 deletions(-) create mode 100644 src/async/index.ts create mode 100644 src/core/index.ts create mode 100644 src/lib/index.ts create mode 100644 src/utils/index.ts delete mode 100644 vite.config.mjs diff --git a/__tests__/src/core/Rovo.test.ts b/__tests__/src/core/Rovo.test.ts index 8a9ab571..aed42af5 100644 --- a/__tests__/src/core/Rovo.test.ts +++ b/__tests__/src/core/Rovo.test.ts @@ -684,4 +684,541 @@ describe("Rovo", () => { Parser.prototype.astify = originalAstify; }); }); + + describe("Context Parameter Methods", () => { + it("should add string context parameter with quotes", async () => { + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .addStringContextParameter(":status", "active") + .build(); + + const params = settings.getParameters(); + expect(params[":status"]).toBe("'active'"); + }); + + it("should add number context parameter without quotes", async () => { + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .addNumberContextParameter(":limit", 100) + .build(); + + const params = settings.getParameters(); + expect(params[":limit"]).toBe("100"); + }); + + it("should add boolean context parameter as 1 or 0", async () => { + const settingsTrue = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .addBooleanContextParameter(":isActive", true) + .build(); + + const settingsFalse = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .addBooleanContextParameter(":isActive", false) + .build(); + + const paramsTrue = settingsTrue.getParameters(); + const paramsFalse = settingsFalse.getParameters(); + expect(paramsTrue[":isActive"]).toBe("1"); + expect(paramsFalse[":isActive"]).toBe("0"); + }); + + it("should chain context parameter methods", async () => { + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .addStringContextParameter(":status", "active") + .addNumberContextParameter(":maxCount", 10) + .addBooleanContextParameter(":isActive", true) + .build(); + + await rovo.dynamicIsolatedQuery( + "SELECT id FROM test_users WHERE status = :status AND maxCount = :maxCount AND isActive = :isActive", + settings, + ); + + const callArgs = vi.mocked(sql.executeRaw).mock.calls[0][0]; + expect(callArgs).toContain("'active'"); + expect(callArgs).toContain("10"); + expect(callArgs).toContain("1"); + }); + }); + + describe("Table Name Validation Edge Cases", () => { + it("should handle table names with backticks", async () => { + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Table name with backticks should still work + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM `test_users`", settings), + ).resolves.toBeDefined(); + }); + + it("should handle case-insensitive table names", async () => { + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM TEST_USERS", settings), + ).resolves.toBeDefined(); + }); + }); + + describe("JOIN Detection in Execution Plan", () => { + it("should detect CARTESIAN JOIN", async () => { + const mockExplainResult = [ + { + id: "1", + operatorInfo: "CartesianJoin", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings), + ).rejects.toThrow("Security violation: JOIN operations are not allowed"); + }); + + it("should detect NESTED LOOP JOIN", async () => { + const mockExplainResult = [ + { + id: "1", + operatorInfo: "NestedLoopJoin", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings), + ).rejects.toThrow("Security violation: JOIN operations are not allowed"); + }); + + it("should detect HASH JOIN", async () => { + const mockExplainResult = [ + { + id: "1", + operatorInfo: "HashJoin", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings), + ).rejects.toThrow("Security violation: JOIN operations are not allowed"); + }); + }); + + describe("Window Functions Detection", () => { + it("should detect window function in operatorInfo with OVER()", async () => { + const mockExplainResult = [ + { + id: "1", + operatorInfo: "COUNT(*) OVER()", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).rejects.toThrow("Window functions"); + }); + + it("should detect window function in operatorInfo with OVER(", async () => { + const mockExplainResult = [ + { + id: "1", + operatorInfo: "ROW_NUMBER() OVER(PARTITION BY id)", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).rejects.toThrow("Window functions"); + }); + + it("should detect window function in id field", async () => { + const mockExplainResult = [ + { + id: "Window", + operatorInfo: "TableReader", + accessObject: "table:test_users", + }, + ]; + + const testForgeOperations = createMockForgeOperations(); + const explainRawMock = vi.fn().mockResolvedValue(mockExplainResult as any); + testForgeOperations.analyze = () => + ({ + explainRaw: explainRawMock, + }) as any; + const testRovo = new Rovo(testForgeOperations, mockOptions); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await expect( + testRovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).rejects.toThrow("Window functions"); + }); + }); + + describe("Error Handling", () => { + it("should throw error when accountId is missing", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "").build(); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "Authentication error: User account ID is missing", + ); + }); + + it("should handle parsing errors in normalizeSqlString", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to throw a generic error + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + Parser.prototype.astify = vi.fn().mockImplementation(() => { + throw new Error("Generic parsing error"); + }); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "SQL parsing error", + ); + + // Restore original + Parser.prototype.astify = originalAstify; + }); + + it("should handle parsing errors without message", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to throw error without message + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + Parser.prototype.astify = vi.fn().mockImplementation(() => { + const error: any = new Error(); + error.message = undefined; + throw error; + }); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "SQL parsing error", + ); + + // Restore original + Parser.prototype.astify = originalAstify; + }); + }); + + describe("Logging", () => { + it("should log SQL query when logRawSqlQuery is enabled", async () => { + const consoleSpy = vi.spyOn(console, "debug").mockImplementation(() => {}); + const mockOptionsWithLogging: ForgeSqlOrmOptions = { + logRawSqlQuery: true, + }; + const testRovo = new Rovo(mockForgeOperations, mockOptionsWithLogging); + + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await testRovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await testRovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Rovo query:")); + consoleSpy.mockRestore(); + }); + + it("should not log SQL query when logRawSqlQuery is disabled", async () => { + const consoleSpy = vi.spyOn(console, "debug").mockImplementation(() => {}); + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + await rovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings); + + expect(consoleSpy).not.toHaveBeenCalled(); + consoleSpy.mockRestore(); + }); + }); + + describe("RLS Validation Edge Cases", () => { + it("should skip validation when result has no metadata", async () => { + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: undefined, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .useRLS() + .addRlsColumnName("id") + .addRlsWherePart((alias) => `${alias}.id = 'account-123'`) + .finish() + .build(); + + // Should not throw even without metadata + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).resolves.toBeDefined(); + }); + + it("should skip validation when result has no fields", async () => { + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: undefined }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .useRLS() + .addRlsColumnName("id") + .addRlsWherePart((alias) => `${alias}.id = 'account-123'`) + .finish() + .build(); + + // Should not throw even without fields + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).resolves.toBeDefined(); + }); + + it("should validate RLS fields with case-insensitive matching", async () => { + const mockResult: Result = { + rows: [{ ID: 1 }], + metadata: { + fields: [{ name: "ID", orgTable: "test_users" }], + }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + const settings = await rovo + .rovoRawSettingBuilder("test_users", "account-123") + .useRLS() + .addRlsColumnName("id") + .addRlsWherePart((alias) => `${alias}.id = 'account-123'`) + .finish() + .build(); + + // Should work with case-insensitive field matching + await expect( + rovo.dynamicIsolatedQuery("SELECT ID FROM test_users", settings), + ).resolves.toBeDefined(); + }); + }); + + describe("Table Extraction Edge Cases", () => { + it("should handle table extraction from JOIN clause", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to return AST with JOIN + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + const originalSqlify = Parser.prototype.sqlify; + + const mockAst = { + type: "select", + from: [{ type: "table", table: { name: "test_users" } }], + join: [ + { + type: "table", + table: { name: "other_table" }, + }, + ], + columns: [{ type: "column_ref", table: null, column: "id" }], + }; + + Parser.prototype.astify = vi.fn().mockReturnValue(mockAst); + Parser.prototype.sqlify = vi.fn().mockImplementation(() => { + return "SELECT `id` FROM `test_users` JOIN `other_table`"; + }); + + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).rejects.toThrow("Security violation: Query references table(s) other than"); + + // Restore original + Parser.prototype.astify = originalAstify; + Parser.prototype.sqlify = originalSqlify; + }); + + it("should handle table extraction with dual table (should be ignored)", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to return AST with dual table + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + const originalSqlify = Parser.prototype.sqlify; + + const mockAst = { + type: "select", + from: [ + { type: "table", table: { name: "test_users" } }, + { type: "dual", table: "dual" }, + ], + columns: [{ type: "column_ref", table: null, column: "id" }], + }; + + Parser.prototype.astify = vi.fn().mockReturnValue(mockAst); + Parser.prototype.sqlify = vi.fn().mockImplementation(() => { + return "SELECT `id` FROM `test_users`"; + }); + + // Dual table should be ignored, so this should pass + const mockResult: Result = { + rows: [{ id: 1 }], + metadata: { fields: [{ name: "id", orgTable: "test_users" }] }, + } as any; + + vi.mocked(sql.executeRaw).mockResolvedValue(mockResult); + + await expect( + rovo.dynamicIsolatedQuery("SELECT id FROM test_users", settings), + ).resolves.toBeDefined(); + + // Restore original + Parser.prototype.astify = originalAstify; + Parser.prototype.sqlify = originalSqlify; + }); + + it("should handle error with SQL parsing error message", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to throw error with "SQL parsing error" message + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + Parser.prototype.astify = vi.fn().mockImplementation(() => { + const error: any = new Error("SQL parsing error: something went wrong"); + throw error; + }); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "SQL parsing error", + ); + + // Restore original + Parser.prototype.astify = originalAstify; + }); + + it("should handle error that already includes 'Only' in message", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to throw error with "Only" in message + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + Parser.prototype.astify = vi.fn().mockImplementation(() => { + const error: any = new Error("Only SELECT queries are allowed"); + throw error; + }); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "Only SELECT queries are allowed", + ); + + // Restore original + Parser.prototype.astify = originalAstify; + }); + + it("should handle error that already includes 'single SELECT' in message", async () => { + const settings = await rovo.rovoRawSettingBuilder("test_users", "account-123").build(); + + // Mock parser to throw error with "single SELECT" in message + const Parser = (await import("node-sql-parser")).Parser; + const originalAstify = Parser.prototype.astify; + Parser.prototype.astify = vi.fn().mockImplementation(() => { + const error: any = new Error("Only a single SELECT query is allowed"); + throw error; + }); + + await expect(rovo.dynamicIsolatedQuery("SELECT * FROM test_users", settings)).rejects.toThrow( + "Only a single SELECT query is allowed", + ); + + // Restore original + Parser.prototype.astify = originalAstify; + }); + }); }); diff --git a/__tests__/src/webtriggers/webtriggers.test.ts b/__tests__/src/webtriggers/webtriggers.test.ts index a1413854..496c3641 100644 --- a/__tests__/src/webtriggers/webtriggers.test.ts +++ b/__tests__/src/webtriggers/webtriggers.test.ts @@ -134,33 +134,6 @@ vi.mock("../../../src/utils/cacheUtils", () => ({ clearExpiredCache: vi.fn().mockResolvedValue(undefined), })); -// Mock drizzle-orm/mysql-core -vi.mock("drizzle-orm/mysql-core", () => ({ - unionAll: vi.fn().mockImplementation(() => ({ - as: vi.fn().mockReturnValue({ - digest: "digest", - stmtType: "stmtType", - schemaName: "schemaName", - execCount: "execCount", - avgLatencyNs: "avgLatencyNs", - maxLatencyNs: "maxLatencyNs", - minLatencyNs: "minLatencyNs", - avgProcessTimeNs: "avgProcessTimeNs", - avgWaitTimeNs: "avgWaitTimeNs", - avgBackoffTimeNs: "avgBackoffTimeNs", - avgMemBytes: "avgMemBytes", - maxMemBytes: "maxMemBytes", - avgTotalKeys: "avgTotalKeys", - firstSeen: "firstSeen", - lastSeen: "lastSeen", - planInCache: "planInCache", - planCacheHits: "planCacheHits", - digestText: "digestText", - plan: "plan", - }), - })), -})); - // Mock ForgeSQLORM vi.mock("../../../src/core/ForgeSQLORM", () => { const mockQueryBuilder = { diff --git a/examples/forge-sql-orm-example-cache/package-lock.json b/examples/forge-sql-orm-example-cache/package-lock.json index 74fb0b7b..b09a52c9 100644 --- a/examples/forge-sql-orm-example-cache/package-lock.json +++ b/examples/forge-sql-orm-example-cache/package-lock.json @@ -15,7 +15,7 @@ "@forge/resolver": "1.7.1", "@forge/sql": "^3.0.14", "drizzle-orm": "^0.45.1", - "forge-sql-orm": "2.1.18" + "forge-sql-orm": "^2.1.18" }, "devDependencies": { "@types/node": "^25.0.3", @@ -1043,9 +1043,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1053,6 +1053,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-cache/package.json b/examples/forge-sql-orm-example-cache/package.json index 3b09c7a3..ba5e9ae6 100644 --- a/examples/forge-sql-orm-example-cache/package.json +++ b/examples/forge-sql-orm-example-cache/package.json @@ -11,7 +11,7 @@ "@forge/resolver": "1.7.1", "@forge/sql": "^3.0.14", "drizzle-orm": "^0.45.1", - "forge-sql-orm": "2.1.18" + "forge-sql-orm": "^2.1.18" }, "scripts": { "models:create": "forge-sql-orm-cli generate:model --output src/entities", diff --git a/examples/forge-sql-orm-example-cache/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-cache/static/forge-orm-example/package-lock.json index 515105f8..5c0db6ab 100644 --- a/examples/forge-sql-orm-example-cache/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-cache/static/forge-orm-example/package-lock.json @@ -1217,9 +1217,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1227,6 +1227,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2304,9 +2308,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { diff --git a/examples/forge-sql-orm-example-checklist/package-lock.json b/examples/forge-sql-orm-example-checklist/package-lock.json index a30f70f3..bdd2dfbd 100644 --- a/examples/forge-sql-orm-example-checklist/package-lock.json +++ b/examples/forge-sql-orm-example-checklist/package-lock.json @@ -1042,9 +1042,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1052,6 +1052,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-checklist/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-checklist/static/forge-orm-example/package-lock.json index 916bdca4..d93938b4 100644 --- a/examples/forge-sql-orm-example-checklist/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-checklist/static/forge-orm-example/package-lock.json @@ -1216,9 +1216,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1226,6 +1226,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2303,9 +2307,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { diff --git a/examples/forge-sql-orm-example-drizzle-driver-simple/package-lock.json b/examples/forge-sql-orm-example-drizzle-driver-simple/package-lock.json index d6344bbf..5c7f0ba0 100644 --- a/examples/forge-sql-orm-example-drizzle-driver-simple/package-lock.json +++ b/examples/forge-sql-orm-example-drizzle-driver-simple/package-lock.json @@ -696,9 +696,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -706,6 +706,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-drizzle-driver-simple/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-drizzle-driver-simple/static/forge-orm-example/package-lock.json index 45c5ae30..15a35f4a 100644 --- a/examples/forge-sql-orm-example-drizzle-driver-simple/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-drizzle-driver-simple/static/forge-orm-example/package-lock.json @@ -297,14 +297,12 @@ } }, "node_modules/@atlaskit/layering": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.4.0.tgz", - "integrity": "sha512-6JkUGbkALkC/AedsbxY2m/465lRraLLvFMQ/mPN1oLMfzflMOiaHs4DLVW79R7iuR4ren8XOHAARVD36KPSflA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.5.0.tgz", + "integrity": "sha512-UDqsbBJ7M/IZazV9rdhcxKCPLhqeiVY0oi22qYFtW/LX0u0L4fjStav7Dn3dG0yxQN7l25532+x1VR/pckymMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^5.2.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/platform-feature-flags-react": "^0.4.0", + "@atlaskit/ds-lib": "^5.3.0", "@babel/runtime": "^7.0.0", "bind-event-listener": "^3.0.0", "tiny-invariant": "^1.2.0" @@ -392,93 +390,6 @@ "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/platform-feature-flags-react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@atlaskit/platform-feature-flags-react/-/platform-feature-flags-react-0.4.3.tgz", - "integrity": "sha512-vc++ZXMxuSiwM5462Uiq5VHqnMxpZ35WxKwKVaA6pHK/QcY4om2KZKbzTY1wiNC62zPdBE33ZNxyLf8zh35rrg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/css": "^0.17.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/primitives": "^16.3.0", - "@atlaskit/tokens": "^8.3.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "react-magnetic-di": "^3.1.4" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/css": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.17.1.tgz", - "integrity": "sha512-1E74fh9aTftFp9hSgFqkgW6KovSltg1TRI1pC5ECuwxPcRwd3YSZE53o+ZVyw//oHQ7Mr7ZF7ZBSarb2sJ6CmA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.4.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives": { - "version": "16.4.4", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-16.4.4.tgz", - "integrity": "sha512-snZZYVjmULSRo+hTZ5y41LhhUESeZ7DO6iX3KjmnpdTRqH3CKSIpQPz0OGq+5v4P9ITQg+rBf68A5Pb03U4Ajw==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/analytics-next": "^11.1.0", - "@atlaskit/app-provider": "^3.2.0", - "@atlaskit/css": "^0.18.0", - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/interaction-context": "^3.1.0", - "@atlaskit/tokens": "^8.6.0", - "@atlaskit/visually-hidden": "^3.0.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0", - "bind-event-listener": "^3.0.0", - "tiny-invariant": "^1.2.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives/node_modules/@atlaskit/css": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.18.1.tgz", - "integrity": "sha512-zEk/OyFy6Ebx/6Z59h/rBmrXUu3cCMm35UfI984iKsF5WrkZS79Jd1FoIb2sgGIwAV1ZZbJKFcuOyzeRG3vhVQ==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.6.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/tokens": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-8.6.1.tgz", - "integrity": "sha512-Ka+XXo3rKm3PXdXqSmx7A4MRmOHvd5TeKJb8aO5jUgsehnvPk85QhEeFeYT/D62dorJjA+CvE/wBpvZkT4OqnA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.20.0", - "bind-event-listener": "^3.0.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/@atlaskit/popper": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-7.1.7.tgz", @@ -1864,9 +1775,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1874,6 +1785,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2991,9 +2906,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -4943,24 +4858,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-magnetic-di": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/react-magnetic-di/-/react-magnetic-di-3.2.4.tgz", - "integrity": "sha512-ZQSAxi66rh88vACMLzH/3EP/QMqshiimsSnoUSS85huYN0ChVAULQHPuZevrgGU4VontpH9/CVGsgvMhFeMJyQ==", - "license": "MIT", - "engines": { - "node": ">=10.16.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", diff --git a/examples/forge-sql-orm-example-dynamic/package-lock.json b/examples/forge-sql-orm-example-dynamic/package-lock.json index 803bb390..9825e50a 100644 --- a/examples/forge-sql-orm-example-dynamic/package-lock.json +++ b/examples/forge-sql-orm-example-dynamic/package-lock.json @@ -1041,9 +1041,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1051,6 +1051,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-dynamic/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-dynamic/static/forge-orm-example/package-lock.json index 45c5ae30..15a35f4a 100644 --- a/examples/forge-sql-orm-example-dynamic/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-dynamic/static/forge-orm-example/package-lock.json @@ -297,14 +297,12 @@ } }, "node_modules/@atlaskit/layering": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.4.0.tgz", - "integrity": "sha512-6JkUGbkALkC/AedsbxY2m/465lRraLLvFMQ/mPN1oLMfzflMOiaHs4DLVW79R7iuR4ren8XOHAARVD36KPSflA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.5.0.tgz", + "integrity": "sha512-UDqsbBJ7M/IZazV9rdhcxKCPLhqeiVY0oi22qYFtW/LX0u0L4fjStav7Dn3dG0yxQN7l25532+x1VR/pckymMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^5.2.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/platform-feature-flags-react": "^0.4.0", + "@atlaskit/ds-lib": "^5.3.0", "@babel/runtime": "^7.0.0", "bind-event-listener": "^3.0.0", "tiny-invariant": "^1.2.0" @@ -392,93 +390,6 @@ "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/platform-feature-flags-react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@atlaskit/platform-feature-flags-react/-/platform-feature-flags-react-0.4.3.tgz", - "integrity": "sha512-vc++ZXMxuSiwM5462Uiq5VHqnMxpZ35WxKwKVaA6pHK/QcY4om2KZKbzTY1wiNC62zPdBE33ZNxyLf8zh35rrg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/css": "^0.17.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/primitives": "^16.3.0", - "@atlaskit/tokens": "^8.3.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "react-magnetic-di": "^3.1.4" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/css": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.17.1.tgz", - "integrity": "sha512-1E74fh9aTftFp9hSgFqkgW6KovSltg1TRI1pC5ECuwxPcRwd3YSZE53o+ZVyw//oHQ7Mr7ZF7ZBSarb2sJ6CmA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.4.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives": { - "version": "16.4.4", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-16.4.4.tgz", - "integrity": "sha512-snZZYVjmULSRo+hTZ5y41LhhUESeZ7DO6iX3KjmnpdTRqH3CKSIpQPz0OGq+5v4P9ITQg+rBf68A5Pb03U4Ajw==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/analytics-next": "^11.1.0", - "@atlaskit/app-provider": "^3.2.0", - "@atlaskit/css": "^0.18.0", - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/interaction-context": "^3.1.0", - "@atlaskit/tokens": "^8.6.0", - "@atlaskit/visually-hidden": "^3.0.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0", - "bind-event-listener": "^3.0.0", - "tiny-invariant": "^1.2.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives/node_modules/@atlaskit/css": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.18.1.tgz", - "integrity": "sha512-zEk/OyFy6Ebx/6Z59h/rBmrXUu3cCMm35UfI984iKsF5WrkZS79Jd1FoIb2sgGIwAV1ZZbJKFcuOyzeRG3vhVQ==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.6.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/tokens": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-8.6.1.tgz", - "integrity": "sha512-Ka+XXo3rKm3PXdXqSmx7A4MRmOHvd5TeKJb8aO5jUgsehnvPk85QhEeFeYT/D62dorJjA+CvE/wBpvZkT4OqnA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.20.0", - "bind-event-listener": "^3.0.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/@atlaskit/popper": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-7.1.7.tgz", @@ -1864,9 +1775,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1874,6 +1785,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2991,9 +2906,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -4943,24 +4858,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-magnetic-di": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/react-magnetic-di/-/react-magnetic-di-3.2.4.tgz", - "integrity": "sha512-ZQSAxi66rh88vACMLzH/3EP/QMqshiimsSnoUSS85huYN0ChVAULQHPuZevrgGU4VontpH9/CVGsgvMhFeMJyQ==", - "license": "MIT", - "engines": { - "node": ">=10.16.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", diff --git a/examples/forge-sql-orm-example-optimistic-locking/package-lock.json b/examples/forge-sql-orm-example-optimistic-locking/package-lock.json index 803bb390..9825e50a 100644 --- a/examples/forge-sql-orm-example-optimistic-locking/package-lock.json +++ b/examples/forge-sql-orm-example-optimistic-locking/package-lock.json @@ -1041,9 +1041,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1051,6 +1051,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-optimistic-locking/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-optimistic-locking/static/forge-orm-example/package-lock.json index 8e2b8f74..9baee331 100644 --- a/examples/forge-sql-orm-example-optimistic-locking/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-optimistic-locking/static/forge-orm-example/package-lock.json @@ -300,14 +300,12 @@ } }, "node_modules/@atlaskit/layering": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.4.0.tgz", - "integrity": "sha512-6JkUGbkALkC/AedsbxY2m/465lRraLLvFMQ/mPN1oLMfzflMOiaHs4DLVW79R7iuR4ren8XOHAARVD36KPSflA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.5.0.tgz", + "integrity": "sha512-UDqsbBJ7M/IZazV9rdhcxKCPLhqeiVY0oi22qYFtW/LX0u0L4fjStav7Dn3dG0yxQN7l25532+x1VR/pckymMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^5.2.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/platform-feature-flags-react": "^0.4.0", + "@atlaskit/ds-lib": "^5.3.0", "@babel/runtime": "^7.0.0", "bind-event-listener": "^3.0.0", "tiny-invariant": "^1.2.0" @@ -395,93 +393,6 @@ "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/platform-feature-flags-react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@atlaskit/platform-feature-flags-react/-/platform-feature-flags-react-0.4.3.tgz", - "integrity": "sha512-vc++ZXMxuSiwM5462Uiq5VHqnMxpZ35WxKwKVaA6pHK/QcY4om2KZKbzTY1wiNC62zPdBE33ZNxyLf8zh35rrg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/css": "^0.17.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/primitives": "^16.3.0", - "@atlaskit/tokens": "^8.3.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "react-magnetic-di": "^3.1.4" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/css": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.17.1.tgz", - "integrity": "sha512-1E74fh9aTftFp9hSgFqkgW6KovSltg1TRI1pC5ECuwxPcRwd3YSZE53o+ZVyw//oHQ7Mr7ZF7ZBSarb2sJ6CmA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.4.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives": { - "version": "16.4.4", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-16.4.4.tgz", - "integrity": "sha512-snZZYVjmULSRo+hTZ5y41LhhUESeZ7DO6iX3KjmnpdTRqH3CKSIpQPz0OGq+5v4P9ITQg+rBf68A5Pb03U4Ajw==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/analytics-next": "^11.1.0", - "@atlaskit/app-provider": "^3.2.0", - "@atlaskit/css": "^0.18.0", - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/interaction-context": "^3.1.0", - "@atlaskit/tokens": "^8.6.0", - "@atlaskit/visually-hidden": "^3.0.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0", - "bind-event-listener": "^3.0.0", - "tiny-invariant": "^1.2.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives/node_modules/@atlaskit/css": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.18.1.tgz", - "integrity": "sha512-zEk/OyFy6Ebx/6Z59h/rBmrXUu3cCMm35UfI984iKsF5WrkZS79Jd1FoIb2sgGIwAV1ZZbJKFcuOyzeRG3vhVQ==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.6.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/tokens": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-8.6.1.tgz", - "integrity": "sha512-Ka+XXo3rKm3PXdXqSmx7A4MRmOHvd5TeKJb8aO5jUgsehnvPk85QhEeFeYT/D62dorJjA+CvE/wBpvZkT4OqnA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.20.0", - "bind-event-listener": "^3.0.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/@atlaskit/popper": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-7.1.7.tgz", @@ -1885,9 +1796,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1895,6 +1806,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -3012,9 +2927,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -4964,24 +4879,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-magnetic-di": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/react-magnetic-di/-/react-magnetic-di-3.2.4.tgz", - "integrity": "sha512-ZQSAxi66rh88vACMLzH/3EP/QMqshiimsSnoUSS85huYN0ChVAULQHPuZevrgGU4VontpH9/CVGsgvMhFeMJyQ==", - "license": "MIT", - "engines": { - "node": ">=10.16.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", diff --git a/examples/forge-sql-orm-example-org-tracker/package-lock.json b/examples/forge-sql-orm-example-org-tracker/package-lock.json index 67d6fd86..dcfb9aec 100644 --- a/examples/forge-sql-orm-example-org-tracker/package-lock.json +++ b/examples/forge-sql-orm-example-org-tracker/package-lock.json @@ -1041,9 +1041,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1051,6 +1051,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-org-tracker/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-org-tracker/static/forge-orm-example/package-lock.json index aa978dab..12c5cfd7 100644 --- a/examples/forge-sql-orm-example-org-tracker/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-org-tracker/static/forge-orm-example/package-lock.json @@ -1217,9 +1217,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1227,6 +1227,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2304,9 +2308,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { diff --git a/examples/forge-sql-orm-example-query-analyses/package-lock.json b/examples/forge-sql-orm-example-query-analyses/package-lock.json index 7e8adb09..912826c1 100644 --- a/examples/forge-sql-orm-example-query-analyses/package-lock.json +++ b/examples/forge-sql-orm-example-query-analyses/package-lock.json @@ -1056,9 +1056,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1066,6 +1066,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-query-analyses/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-query-analyses/static/forge-orm-example/package-lock.json index c80c9792..ff427c52 100644 --- a/examples/forge-sql-orm-example-query-analyses/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-query-analyses/static/forge-orm-example/package-lock.json @@ -298,14 +298,12 @@ } }, "node_modules/@atlaskit/layering": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.4.0.tgz", - "integrity": "sha512-6JkUGbkALkC/AedsbxY2m/465lRraLLvFMQ/mPN1oLMfzflMOiaHs4DLVW79R7iuR4ren8XOHAARVD36KPSflA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.5.0.tgz", + "integrity": "sha512-UDqsbBJ7M/IZazV9rdhcxKCPLhqeiVY0oi22qYFtW/LX0u0L4fjStav7Dn3dG0yxQN7l25532+x1VR/pckymMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^5.2.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/platform-feature-flags-react": "^0.4.0", + "@atlaskit/ds-lib": "^5.3.0", "@babel/runtime": "^7.0.0", "bind-event-listener": "^3.0.0", "tiny-invariant": "^1.2.0" @@ -393,93 +391,6 @@ "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/platform-feature-flags-react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@atlaskit/platform-feature-flags-react/-/platform-feature-flags-react-0.4.3.tgz", - "integrity": "sha512-vc++ZXMxuSiwM5462Uiq5VHqnMxpZ35WxKwKVaA6pHK/QcY4om2KZKbzTY1wiNC62zPdBE33ZNxyLf8zh35rrg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/css": "^0.17.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/primitives": "^16.3.0", - "@atlaskit/tokens": "^8.3.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "react-magnetic-di": "^3.1.4" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/css": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.17.1.tgz", - "integrity": "sha512-1E74fh9aTftFp9hSgFqkgW6KovSltg1TRI1pC5ECuwxPcRwd3YSZE53o+ZVyw//oHQ7Mr7ZF7ZBSarb2sJ6CmA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.4.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives": { - "version": "16.4.4", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-16.4.4.tgz", - "integrity": "sha512-snZZYVjmULSRo+hTZ5y41LhhUESeZ7DO6iX3KjmnpdTRqH3CKSIpQPz0OGq+5v4P9ITQg+rBf68A5Pb03U4Ajw==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/analytics-next": "^11.1.0", - "@atlaskit/app-provider": "^3.2.0", - "@atlaskit/css": "^0.18.0", - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/interaction-context": "^3.1.0", - "@atlaskit/tokens": "^8.6.0", - "@atlaskit/visually-hidden": "^3.0.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0", - "bind-event-listener": "^3.0.0", - "tiny-invariant": "^1.2.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives/node_modules/@atlaskit/css": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.18.1.tgz", - "integrity": "sha512-zEk/OyFy6Ebx/6Z59h/rBmrXUu3cCMm35UfI984iKsF5WrkZS79Jd1FoIb2sgGIwAV1ZZbJKFcuOyzeRG3vhVQ==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.6.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/tokens": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-8.6.1.tgz", - "integrity": "sha512-Ka+XXo3rKm3PXdXqSmx7A4MRmOHvd5TeKJb8aO5jUgsehnvPk85QhEeFeYT/D62dorJjA+CvE/wBpvZkT4OqnA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.20.0", - "bind-event-listener": "^3.0.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/@atlaskit/popper": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-7.1.7.tgz", @@ -1924,9 +1835,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1934,6 +1845,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -3066,9 +2981,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -5190,24 +5105,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-magnetic-di": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/react-magnetic-di/-/react-magnetic-di-3.2.4.tgz", - "integrity": "sha512-ZQSAxi66rh88vACMLzH/3EP/QMqshiimsSnoUSS85huYN0ChVAULQHPuZevrgGU4VontpH9/CVGsgvMhFeMJyQ==", - "license": "MIT", - "engines": { - "node": ">=10.16.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", diff --git a/examples/forge-sql-orm-example-simple/package-lock.json b/examples/forge-sql-orm-example-simple/package-lock.json index 803bb390..9825e50a 100644 --- a/examples/forge-sql-orm-example-simple/package-lock.json +++ b/examples/forge-sql-orm-example-simple/package-lock.json @@ -1041,9 +1041,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1051,6 +1051,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-simple/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-simple/static/forge-orm-example/package-lock.json index e71243da..dcf3ca11 100644 --- a/examples/forge-sql-orm-example-simple/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-simple/static/forge-orm-example/package-lock.json @@ -296,14 +296,12 @@ } }, "node_modules/@atlaskit/layering": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.4.0.tgz", - "integrity": "sha512-6JkUGbkALkC/AedsbxY2m/465lRraLLvFMQ/mPN1oLMfzflMOiaHs4DLVW79R7iuR4ren8XOHAARVD36KPSflA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@atlaskit/layering/-/layering-3.5.0.tgz", + "integrity": "sha512-UDqsbBJ7M/IZazV9rdhcxKCPLhqeiVY0oi22qYFtW/LX0u0L4fjStav7Dn3dG0yxQN7l25532+x1VR/pckymMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^5.2.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/platform-feature-flags-react": "^0.4.0", + "@atlaskit/ds-lib": "^5.3.0", "@babel/runtime": "^7.0.0", "bind-event-listener": "^3.0.0", "tiny-invariant": "^1.2.0" @@ -391,93 +389,6 @@ "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/platform-feature-flags-react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@atlaskit/platform-feature-flags-react/-/platform-feature-flags-react-0.4.3.tgz", - "integrity": "sha512-vc++ZXMxuSiwM5462Uiq5VHqnMxpZ35WxKwKVaA6pHK/QcY4om2KZKbzTY1wiNC62zPdBE33ZNxyLf8zh35rrg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/css": "^0.17.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@atlaskit/primitives": "^16.3.0", - "@atlaskit/tokens": "^8.3.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "react-magnetic-di": "^3.1.4" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/css": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.17.1.tgz", - "integrity": "sha512-1E74fh9aTftFp9hSgFqkgW6KovSltg1TRI1pC5ECuwxPcRwd3YSZE53o+ZVyw//oHQ7Mr7ZF7ZBSarb2sJ6CmA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.4.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives": { - "version": "16.4.4", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-16.4.4.tgz", - "integrity": "sha512-snZZYVjmULSRo+hTZ5y41LhhUESeZ7DO6iX3KjmnpdTRqH3CKSIpQPz0OGq+5v4P9ITQg+rBf68A5Pb03U4Ajw==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/analytics-next": "^11.1.0", - "@atlaskit/app-provider": "^3.2.0", - "@atlaskit/css": "^0.18.0", - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/interaction-context": "^3.1.0", - "@atlaskit/tokens": "^8.6.0", - "@atlaskit/visually-hidden": "^3.0.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0", - "bind-event-listener": "^3.0.0", - "tiny-invariant": "^1.2.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/primitives/node_modules/@atlaskit/css": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@atlaskit/css/-/css-0.18.1.tgz", - "integrity": "sha512-zEk/OyFy6Ebx/6Z59h/rBmrXUu3cCMm35UfI984iKsF5WrkZS79Jd1FoIb2sgGIwAV1ZZbJKFcuOyzeRG3vhVQ==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/tokens": "^8.6.0", - "@babel/runtime": "^7.0.0", - "@compiled/react": "^0.18.6" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@atlaskit/platform-feature-flags-react/node_modules/@atlaskit/tokens": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-8.6.1.tgz", - "integrity": "sha512-Ka+XXo3rKm3PXdXqSmx7A4MRmOHvd5TeKJb8aO5jUgsehnvPk85QhEeFeYT/D62dorJjA+CvE/wBpvZkT4OqnA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/ds-lib": "^5.3.0", - "@atlaskit/platform-feature-flags": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.20.0", - "bind-event-listener": "^3.0.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/@atlaskit/popper": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-7.1.7.tgz", @@ -1863,9 +1774,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1873,6 +1784,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2980,9 +2895,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -4932,24 +4847,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-magnetic-di": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/react-magnetic-di/-/react-magnetic-di-3.2.4.tgz", - "integrity": "sha512-ZQSAxi66rh88vACMLzH/3EP/QMqshiimsSnoUSS85huYN0ChVAULQHPuZevrgGU4VontpH9/CVGsgvMhFeMJyQ==", - "license": "MIT", - "engines": { - "node": ">=10.16.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", diff --git a/examples/forge-sql-orm-example-sql-executor/package-lock.json b/examples/forge-sql-orm-example-sql-executor/package-lock.json index a8309042..0d2cc800 100644 --- a/examples/forge-sql-orm-example-sql-executor/package-lock.json +++ b/examples/forge-sql-orm-example-sql-executor/package-lock.json @@ -1040,9 +1040,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1050,6 +1050,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/examples/forge-sql-orm-example-sql-executor/static/forge-orm-example/package-lock.json b/examples/forge-sql-orm-example-sql-executor/static/forge-orm-example/package-lock.json index aa978dab..12c5cfd7 100644 --- a/examples/forge-sql-orm-example-sql-executor/static/forge-orm-example/package-lock.json +++ b/examples/forge-sql-orm-example-sql-executor/static/forge-orm-example/package-lock.json @@ -1217,9 +1217,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1227,6 +1227,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2304,9 +2308,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { diff --git a/forge-sql-orm-cli/package-lock.json b/forge-sql-orm-cli/package-lock.json index 78f7073d..35f24ba0 100644 --- a/forge-sql-orm-cli/package-lock.json +++ b/forge-sql-orm-cli/package-lock.json @@ -1700,9 +1700,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1710,6 +1710,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/forge-sql-orm-cli/package.json b/forge-sql-orm-cli/package.json index 3862ac3e..5bf3710b 100644 --- a/forge-sql-orm-cli/package.json +++ b/forge-sql-orm-cli/package.json @@ -1,6 +1,6 @@ { "name": "forge-sql-orm-cli", - "version": "2.1.20", + "version": "2.1.21", "description": "CLI tool for Forge SQL ORM", "main": "dist-cli/cli.js", "types": "dist-cli/cli.d.ts", diff --git a/package-lock.json b/package-lock.json index 3ffb6e66..54a4310a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1039,9 +1039,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, @@ -1049,6 +1049,10 @@ "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { diff --git a/package.json b/package.json index 4cc33404..1b4d0419 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "forge-sql-orm", - "version": "2.1.18", + "version": "2.1.21", "description": "Drizzle ORM integration for Atlassian @forge/sql. Provides a custom driver, schema migration, two levels of caching (local and global via @forge/kvs), optimistic locking, and query analysis.", "main": "dist/index.js", "homepage": "https://github.com/vzakharchenko/forge-sql-orm#readme", diff --git a/src/async/index.ts b/src/async/index.ts new file mode 100644 index 00000000..344cc430 --- /dev/null +++ b/src/async/index.ts @@ -0,0 +1 @@ +export * from "./PrintQueryConsumer"; diff --git a/src/core/ForgeSQLQueryBuilder.ts b/src/core/ForgeSQLQueryBuilder.ts index 39fc7cc9..c6d8f000 100644 --- a/src/core/ForgeSQLQueryBuilder.ts +++ b/src/core/ForgeSQLQueryBuilder.ts @@ -1143,14 +1143,71 @@ export interface RlsSettings { * @interface RovoIntegrationSettingCreator */ export interface RovoIntegrationSettingCreator { + /** + * Adds a string context parameter for query substitution. + * The value will be wrapped in single quotes in the SQL query. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{projectKey}}') + * @param {string} value - The string value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addStringContextParameter('{{projectKey}}', 'PROJ-123'); + * // In SQL: {{projectKey}} will be replaced with 'PROJ-123' + * ``` + */ + addStringContextParameter(parameterName: string, value: string): RovoIntegrationSettingCreator; + /** + * Adds a number context parameter for query substitution. + * The value will be inserted as-is without quotes in the SQL query. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{limit}}') + * @param {number} value - The numeric value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addNumberContextParameter('{{limit}}', 100); + * // In SQL: {{limit}} will be replaced with 100 + * ``` + */ + addNumberContextParameter(parameterName: string, value: number): RovoIntegrationSettingCreator; + /** + * Adds a boolean context parameter for query substitution. + * The value will be converted to 1 (true) or 0 (false) and inserted as a number. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{isActive}}') + * @param {boolean} value - The boolean value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addBooleanContextParameter('{{isActive}}', true); + * // In SQL: {{isActive}} will be replaced with 1 + * ``` + */ + addBooleanContextParameter(parameterName: string, value: boolean): RovoIntegrationSettingCreator; /** * Adds a context parameter for query substitution. + * Context parameters are replaced in the SQL query before execution. * - * @param {string} parameterName - The parameter name to replace in the query + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{projectKey}}') * @param {string} value - The value to substitute for the parameter + * @param {boolean} wrap - Whether to wrap the value in single quotes (true for strings, false for numbers) * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addContextParameter('{{projectKey}}', 'PROJ-123', true); + * // In SQL: {{projectKey}} will be replaced with 'PROJ-123' + * ``` */ - addContextParameter(parameterName: string, value: string): RovoIntegrationSettingCreator; + addContextParameter( + parameterName: string, + value: string, + wrap: boolean, + ): RovoIntegrationSettingCreator; /** * Enables Row-Level Security (RLS) for the query. diff --git a/src/core/Rovo.ts b/src/core/Rovo.ts index be277261..d984a337 100644 --- a/src/core/Rovo.ts +++ b/src/core/Rovo.ts @@ -31,10 +31,10 @@ class RovoIntegrationSettingImpl implements RovoIntegrationSetting { * * @param {string} accountId - The account ID of the active user * @param {string} tableName - The name of the table to query - * @param {Record} contextParam - Context parameters for query substitution + * @param {Record} contextParam - Context parameters for query substitution (parameter name -> value mapping) * @param {boolean} rls - Whether Row-Level Security is enabled * @param {string[]} rlsFields - Array of field names required for RLS validation - * @param {(alias: string) => string} rlsWherePart - Function that generates WHERE clause for RLS + * @param {(alias: string) => string} rlsWherePart - Function that generates WHERE clause for RLS filtering */ constructor( accountId: string, @@ -135,21 +135,83 @@ class RovoIntegrationSettingCreatorImpl implements RovoIntegrationSettingCreator this.accountId = accountId; } + /** + * Adds a string context parameter for query substitution. + * The value will be wrapped in single quotes in the SQL query. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{projectKey}}') + * @param {string} value - The string value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addStringContextParameter('{{projectKey}}', 'PROJ-123'); + * // In SQL: {{projectKey}} will be replaced with 'PROJ-123' + * ``` + */ + addStringContextParameter(parameterName: string, value: string): RovoIntegrationSettingCreator { + this.addContextParameter(parameterName, value, true); + return this; + } + + /** + * Adds a number context parameter for query substitution. + * The value will be inserted as-is without quotes in the SQL query. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{limit}}') + * @param {number} value - The numeric value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addNumberContextParameter('{{limit}}', 100); + * // In SQL: {{limit}} will be replaced with 100 + * ``` + */ + addNumberContextParameter(parameterName: string, value: number): RovoIntegrationSettingCreator { + this.addContextParameter(parameterName, String(value), false); + return this; + } + + /** + * Adds a boolean context parameter for query substitution. + * The value will be converted to 1 (true) or 0 (false) and inserted as a number. + * + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{isActive}}') + * @param {boolean} value - The boolean value to substitute for the parameter + * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining + * + * @example + * ```typescript + * builder.addBooleanContextParameter('{{isActive}}', true); + * // In SQL: {{isActive}} will be replaced with 1 + * ``` + */ + addBooleanContextParameter(parameterName: string, value: boolean): RovoIntegrationSettingCreator { + this.addNumberContextParameter(parameterName, value ? 1 : 0); + return this; + } /** * Adds a context parameter for query substitution. * Context parameters are replaced in the SQL query before execution. * - * @param {string} parameterName - The parameter name to replace in the query + * @param {string} parameterName - The parameter name to replace in the query (e.g., '{{projectKey}}') * @param {string} value - The value to substitute for the parameter + * @param {boolean} wrap - Whether to wrap the value in single quotes (true for strings, false for numbers) * @returns {RovoIntegrationSettingCreator} This builder instance for method chaining * * @example * ```typescript - * builder.addContextParameter('{{projectKey}}', 'PROJ-123'); + * builder.addContextParameter('{{projectKey}}', 'PROJ-123', true); + * // In SQL: {{projectKey}} will be replaced with 'PROJ-123' * ``` */ - addContextParameter(parameterName: string, value: string): RovoIntegrationSettingCreator { - this.contextParam[parameterName] = value; + addContextParameter( + parameterName: string, + value: string, + wrap: boolean, + ): RovoIntegrationSettingCreator { + this.contextParam[parameterName] = wrap ? `'${value}'` : value; return this; } @@ -179,6 +241,12 @@ class RovoIntegrationSettingCreatorImpl implements RovoIntegrationSettingCreator private isUseRlsConditionalSettings: () => Promise = async () => true; private rlsFieldsSettings: string[] = []; private wherePartSettings: (alias: string) => string = () => ""; + + /** + * Creates a new RlsSettingsImpl instance. + * + * @param {RovoIntegrationSettingCreatorImpl} parent - The parent settings builder instance + */ constructor(private readonly parent: RovoIntegrationSettingCreatorImpl) {} /** * Sets a conditional function to determine if RLS should be applied. @@ -328,8 +396,8 @@ export class Rovo implements RovoIntegration { /** * Creates a new Rovo instance. * - * @param {ForgeSqlOperation} forgeSqlOperations - The ForgeSQL operations instance for query analysis - * @param options - Configuration options for the ORM + * @param {ForgeSqlOperation} forgeSqlOperations - The ForgeSQL operations instance for query analysis and execution + * @param {ForgeSqlOrmOptions} options - Configuration options for the ORM (e.g., logging settings) */ constructor(forgeSqlOperations: ForgeSqlOperation, options: ForgeSqlOrmOptions) { this.forgeOperations = forgeSqlOperations; @@ -337,10 +405,11 @@ export class Rovo implements RovoIntegration { } /** - * Parses SQL query into AST and validates it's a single SELECT statement - * @param sqlQuery - Normalized SQL query string - * @returns Parsed AST of the SELECT statement - * @throws Error if parsing fails or query is not a single SELECT statement + * Parses SQL query into AST and validates it's a single SELECT statement. + * + * @param {string} sqlQuery - Normalized SQL query string + * @returns {Select} Parsed AST of the SELECT statement + * @throws {Error} If parsing fails or query is not a single SELECT statement */ private parseSqlQuery(sqlQuery: string): Select { const parser = new Parser(); @@ -370,9 +439,10 @@ export class Rovo implements RovoIntegration { } /** - * Recursively processes array or single node and extracts tables - * @param items - Array of nodes or single node - * @param tables - Accumulator array for table names + * Recursively processes array or single node and extracts table names. + * + * @param {any} items - Array of AST nodes or single AST node + * @param {string[]} tables - Accumulator array for collecting table names (modified in place) */ private extractTablesFromItems(items: any, tables: string[]): void { if (Array.isArray(items)) { @@ -385,9 +455,10 @@ export class Rovo implements RovoIntegration { } /** - * Extracts table name from table node - * @param node - AST node with table information - * @returns Table name in uppercase or null if not applicable + * Extracts table name from table AST node. + * + * @param {any} node - AST node with table information + * @returns {string | null} Table name in uppercase, or null if not applicable (e.g., 'dual' table) */ private extractTableName(node: any): string | null { if (!node.table) { @@ -398,9 +469,11 @@ export class Rovo implements RovoIntegration { } /** - * Recursively extracts all table names from SQL AST node - * @param node - AST node to extract tables from - * @returns Array of table names (uppercase) + * Recursively extracts all table names from SQL AST node. + * Traverses FROM and JOIN clauses to find all referenced tables. + * + * @param {any} node - AST node to extract tables from + * @returns {string[]} Array of table names in uppercase */ private extractTables(node: any): string[] { const tables: string[] = []; @@ -427,9 +500,11 @@ export class Rovo implements RovoIntegration { } /** - * Recursively checks if AST node contains scalar subqueries - * @param node - AST node to check - * @returns true if node contains scalar subquery, false otherwise + * Recursively checks if AST node contains scalar subqueries. + * Used for security validation to prevent subquery-based attacks. + * + * @param {any} node - AST node to check for subqueries + * @returns {boolean} True if node contains scalar subquery, false otherwise */ private hasScalarSubquery(node: any): boolean { if (!node) return false; @@ -452,13 +527,16 @@ export class Rovo implements RovoIntegration { /** * Creates a settings builder for Rovo queries using a raw table name. * - * @param {string} tableName - The name of the table to query - * @param {string} accountId - The account ID of the active user + * @param {string} tableName - The name of the table to query (case-insensitive) + * @param {string} accountId - The account ID of the active user for RLS filtering * @returns {RovoIntegrationSettingCreator} Builder for configuring Rovo query settings * * @example * ```typescript * const builder = rovo.rovoRawSettingBuilder('users', accountId); + * const settings = await builder + * .addStringContextParameter('{{status}}', 'active') + * .build(); * ``` */ rovoRawSettingBuilder(tableName: string, accountId: string): RovoIntegrationSettingCreator { @@ -467,14 +545,21 @@ export class Rovo implements RovoIntegration { /** * Creates a settings builder for Rovo queries using a Drizzle table object. + * This is a convenience method that extracts the table name from the Drizzle table object. * * @param {AnyMySqlTable} table - The Drizzle table object - * @param {string} accountId - The account ID of the active user + * @param {string} accountId - The account ID of the active user for RLS filtering * @returns {RovoIntegrationSettingCreator} Builder for configuring Rovo query settings * * @example * ```typescript * const builder = rovo.rovoSettingBuilder(usersTable, accountId); + * const settings = await builder + * .useRLS() + * .addRlsColumn(usersTable.id) + * .addRlsWherePart((alias) => `${alias}.userId = '${accountId}'`) + * .finish() + * .build(); * ``` */ rovoSettingBuilder(table: AnyMySqlTable, accountId: string): RovoIntegrationSettingCreator { @@ -482,33 +567,12 @@ export class Rovo implements RovoIntegration { } /** - * Executes a dynamic SQL query with comprehensive security validations. - * - * This method performs multiple security checks: - * 1. Validates that the query is a SELECT statement - * 2. Ensures the query targets only the specified table - * 3. Blocks JOINs, subqueries, and window functions - * 4. Applies Row-Level Security filtering if enabled - * 5. Validates query results to ensure security fields are present - * - * @param {string} dynamicSql - The SQL query to execute (must be a SELECT statement) - * @param {RovoIntegrationSetting} settings - Configuration settings for the query - * @returns {Promise>} Query execution result with metadata - * @throws {Error} If the query violates security restrictions + * Validates basic input parameters for the SQL query. * - * @example - * ```typescript - * const result = await rovo.dynamicIsolatedQuery( - * "SELECT id, name, email FROM users WHERE status = 'active' ORDER BY name", - * settings - * ); - * - * console.log(result.rows); // Query results - * console.log(result.metadata); // Query metadata - * ``` - */ - /** - * Validates basic input parameters + * @param {string} query - The SQL query string to validate + * @param {string} tableName - The expected table name + * @returns {string} The trimmed query string + * @throws {Error} If query is empty, table name is missing, or query is not a SELECT statement */ private validateInputs(query: string, tableName: string): string { if (!query?.trim()) { @@ -530,7 +594,12 @@ export class Rovo implements RovoIntegration { } /** - * Normalizes SQL query using AST parsing and stringification + * Normalizes SQL query using AST parsing and stringification. + * This ensures consistent formatting and validates the query structure. + * + * @param {string} sql - The SQL query string to normalize + * @returns {string} The normalized SQL query string + * @throws {Error} If parsing fails, query is not a SELECT statement, or multiple statements are detected */ private normalizeSqlString(sql: string): string { try { @@ -566,7 +635,12 @@ export class Rovo implements RovoIntegration { } /** - * Validates that query targets the correct table + * Validates that query targets the correct table. + * Checks that the FROM clause references only the expected table. + * + * @param {string} normalized - The normalized SQL query string + * @param {string} tableName - The expected table name + * @throws {Error} If query does not target the expected table */ private validateTableName(normalized: string, tableName: string): void { const upperTableName = tableName.toUpperCase(); @@ -581,7 +655,12 @@ export class Rovo implements RovoIntegration { } /** - * Validates query structure (tables, subqueries) + * Validates query structure for security compliance. + * Checks that only the specified table is referenced and no scalar subqueries are present. + * + * @param {Select} selectAst - The parsed SELECT AST node + * @param {string} tableName - The expected table name + * @throws {Error} If query references other tables or contains scalar subqueries */ private validateQueryStructure(selectAst: Select, tableName: string): void { const upperTableName = tableName.toUpperCase(); @@ -616,7 +695,13 @@ export class Rovo implements RovoIntegration { } /** - * Validates query execution plan for security violations + * Validates query execution plan for security violations. + * Uses EXPLAIN to detect JOINs, window functions, and references to other tables. + * + * @param {string} normalized - The normalized SQL query string + * @param {string} tableName - The expected table name + * @returns {Promise} + * @throws {Error} If execution plan reveals JOINs, window functions, or references to other tables */ private async validateExecutionPlan(normalized: string, tableName: string): Promise { const explainRows = await this.forgeOperations.analyze().explainRaw(normalized, []); @@ -667,7 +752,12 @@ export class Rovo implements RovoIntegration { } /** - * Applies row-level security filtering to query + * Applies row-level security filtering to query. + * Wraps the original query in a subquery and adds a WHERE clause with RLS conditions. + * + * @param {string} normalized - The normalized SQL query string + * @param {RovoIntegrationSetting} settings - Rovo settings containing RLS configuration + * @returns {string} The SQL query with RLS filtering applied */ private applyRLSFiltering(normalized: string, settings: RovoIntegrationSetting): string { if (normalized.endsWith(";")) { @@ -684,7 +774,13 @@ export class Rovo implements RovoIntegration { } /** - * Validates query results for RLS compliance + * Validates query results for RLS compliance. + * Ensures that required RLS fields are present and all fields originate from the correct table. + * + * @param {Result} result - The query execution result + * @param {RovoIntegrationSetting} settings - Rovo settings containing RLS field requirements + * @param {string} upperTableName - The expected table name in uppercase + * @throws {Error} If required RLS fields are missing or fields originate from other tables */ private validateQueryResults( result: Result, @@ -731,6 +827,32 @@ export class Rovo implements RovoIntegration { } } + /** + * Executes a dynamic SQL query with comprehensive security validations. + * + * This method performs multiple security checks: + * 1. Validates that the query is a SELECT statement + * 2. Ensures the query targets only the specified table + * 3. Blocks JOINs, subqueries, and window functions + * 4. Applies Row-Level Security filtering if enabled + * 5. Validates query results to ensure security fields are present + * + * @param {string} dynamicSql - The SQL query to execute (must be a SELECT statement) + * @param {RovoIntegrationSetting} settings - Configuration settings for the query + * @returns {Promise>} Query execution result with metadata + * @throws {Error} If the query violates security restrictions, parsing fails, or validation errors occur + * + * @example + * ```typescript + * const result = await rovo.dynamicIsolatedQuery( + * "SELECT id, name, email FROM users WHERE status = 'active' ORDER BY name", + * settings + * ); + * + * console.log(result.rows); // Query results + * console.log(result.metadata); // Query metadata + * ``` + */ async dynamicIsolatedQuery( dynamicSql: string, settings: RovoIntegrationSetting, diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 00000000..dd7ca47d --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,4 @@ +export * from "./ForgeSQLQueryBuilder"; +export * from "./ForgeSQLCrudOperations"; +export * from "./ForgeSQLSelectOperations"; +export * from "./SystemTables"; diff --git a/src/index.ts b/src/index.ts index 01b3436f..693e2448 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ export { default } from "./core/ForgeSQLORM"; -export * from "./core/ForgeSQLQueryBuilder"; -export * from "./core/ForgeSQLCrudOperations"; -export * from "./core/ForgeSQLSelectOperations"; -export * from "./utils/sqlUtils"; -export * from "./utils/forgeDriver"; +export * from "./core"; + +export * from "./utils"; + export * from "./webtriggers"; -export * from "./lib/drizzle/extensions/additionalActions"; -export * from "./core/SystemTables"; -export * from "./async/PrintQueryConsumer"; + +export * from "./lib"; + +export * from "./async"; diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 00000000..2c6d1855 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +export * from "./drizzle/extensions/additionalActions"; diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 00000000..f9504328 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from "./sqlUtils"; +export * from "./forgeDriver"; diff --git a/vite.config.mjs b/vite.config.mjs deleted file mode 100644 index cf46d99b..00000000 --- a/vite.config.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import { defineConfig } from "vite"; -import path from "node:path"; - -export default defineConfig(() => { - return { - ssr: { - external: ["@forge/sql"], - optimizeDeps: true, - emitAssets: false, - }, - build: { - outDir: "dist", - lib: { - entry: { ForgeSQLORM: path.resolve("src/index.ts") }, - formats: ["cjs", "es"], - }, - ssr: true, - sourcemap: true, - target: "node22", - rollupOptions: { - external: ["@forge/sql"], - output: { - esModule: true, - externalImportAttributes: true, - exports: "named", - }, - }, - }, - }; -});