@objectstack/objectql 3.2.7 → 3.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +20 -0
- package/dist/index.d.mts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +66 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/engine.ts +18 -0
- package/src/plugin.integration.test.ts +232 -0
- package/src/plugin.ts +60 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/objectql@3.2.
|
|
2
|
+
> @objectstack/objectql@3.2.9 build /home/runner/work/spec/spec/packages/objectql
|
|
3
3
|
> tsup --config ../../tsup.config.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m96.39 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m196.70 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 178ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m98.13 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m198.00 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 189ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 24730ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m78.30 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m78.30 KB[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @objectstack/objectql
|
|
2
2
|
|
|
3
|
+
## 3.2.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c3065dd: fix turso 2
|
|
8
|
+
- @objectstack/spec@3.2.9
|
|
9
|
+
- @objectstack/core@3.2.9
|
|
10
|
+
- @objectstack/types@3.2.9
|
|
11
|
+
|
|
12
|
+
## 3.2.8
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Auto-sync all registered object schemas to database on startup: `ObjectQLPlugin.start()` now iterates every object in `SchemaRegistry` and calls `driver.syncSchema()` after driver connections are established. This ensures tables for plugin-registered objects (e.g. `sys_user` from plugin-auth) are created or updated automatically.
|
|
17
|
+
- Added `getDriverForObject(objectName)` public method to `ObjectQL` engine for resolving the responsible driver for a given object.
|
|
18
|
+
- Added optional `syncSchema` method to `DriverInterface` contract, aligning it with the full `IDataDriver` protocol.
|
|
19
|
+
- @objectstack/spec@3.2.8
|
|
20
|
+
- @objectstack/core@3.2.8
|
|
21
|
+
- @objectstack/types@3.2.8
|
|
22
|
+
|
|
3
23
|
## 3.2.7
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -1683,6 +1683,17 @@ declare class ObjectQL implements IDataEngine {
|
|
|
1683
1683
|
* this method directly looks up a driver by its registered name.
|
|
1684
1684
|
*/
|
|
1685
1685
|
getDriverByName(name: string): DriverInterface | undefined;
|
|
1686
|
+
/**
|
|
1687
|
+
* Get the driver responsible for the given object.
|
|
1688
|
+
*
|
|
1689
|
+
* Resolves datasource binding from the object's schema definition,
|
|
1690
|
+
* falling back to the default driver. This is a public version of
|
|
1691
|
+
* the internal getDriver() used by CRUD operations.
|
|
1692
|
+
*
|
|
1693
|
+
* @param objectName - FQN or short name of the registered object.
|
|
1694
|
+
* @returns The resolved DriverInterface, or undefined if no driver is available.
|
|
1695
|
+
*/
|
|
1696
|
+
getDriverForObject(objectName: string): DriverInterface | undefined;
|
|
1686
1697
|
/**
|
|
1687
1698
|
* Get a registered driver by datasource name.
|
|
1688
1699
|
* Alias matching @objectql/core datasource() API.
|
|
@@ -1877,6 +1888,17 @@ declare class ObjectQLPlugin implements Plugin {
|
|
|
1877
1888
|
* for multi-tenant operations.
|
|
1878
1889
|
*/
|
|
1879
1890
|
private registerTenantMiddleware;
|
|
1891
|
+
/**
|
|
1892
|
+
* Synchronize all registered object schemas to the database.
|
|
1893
|
+
*
|
|
1894
|
+
* Iterates every object in the SchemaRegistry and calls the
|
|
1895
|
+
* responsible driver's `syncSchema()` for each one. This is
|
|
1896
|
+
* idempotent — drivers must tolerate repeated calls without
|
|
1897
|
+
* duplicating tables or erroring out.
|
|
1898
|
+
*
|
|
1899
|
+
* Drivers that do not implement `syncSchema` are silently skipped.
|
|
1900
|
+
*/
|
|
1901
|
+
private syncRegisteredSchemas;
|
|
1880
1902
|
/**
|
|
1881
1903
|
* Load metadata from external metadata service into ObjectQL registry
|
|
1882
1904
|
* This enables ObjectQL to use file-based or remote metadata
|
package/dist/index.d.ts
CHANGED
|
@@ -1683,6 +1683,17 @@ declare class ObjectQL implements IDataEngine {
|
|
|
1683
1683
|
* this method directly looks up a driver by its registered name.
|
|
1684
1684
|
*/
|
|
1685
1685
|
getDriverByName(name: string): DriverInterface | undefined;
|
|
1686
|
+
/**
|
|
1687
|
+
* Get the driver responsible for the given object.
|
|
1688
|
+
*
|
|
1689
|
+
* Resolves datasource binding from the object's schema definition,
|
|
1690
|
+
* falling back to the default driver. This is a public version of
|
|
1691
|
+
* the internal getDriver() used by CRUD operations.
|
|
1692
|
+
*
|
|
1693
|
+
* @param objectName - FQN or short name of the registered object.
|
|
1694
|
+
* @returns The resolved DriverInterface, or undefined if no driver is available.
|
|
1695
|
+
*/
|
|
1696
|
+
getDriverForObject(objectName: string): DriverInterface | undefined;
|
|
1686
1697
|
/**
|
|
1687
1698
|
* Get a registered driver by datasource name.
|
|
1688
1699
|
* Alias matching @objectql/core datasource() API.
|
|
@@ -1877,6 +1888,17 @@ declare class ObjectQLPlugin implements Plugin {
|
|
|
1877
1888
|
* for multi-tenant operations.
|
|
1878
1889
|
*/
|
|
1879
1890
|
private registerTenantMiddleware;
|
|
1891
|
+
/**
|
|
1892
|
+
* Synchronize all registered object schemas to the database.
|
|
1893
|
+
*
|
|
1894
|
+
* Iterates every object in the SchemaRegistry and calls the
|
|
1895
|
+
* responsible driver's `syncSchema()` for each one. This is
|
|
1896
|
+
* idempotent — drivers must tolerate repeated calls without
|
|
1897
|
+
* duplicating tables or erroring out.
|
|
1898
|
+
*
|
|
1899
|
+
* Drivers that do not implement `syncSchema` are silently skipped.
|
|
1900
|
+
*/
|
|
1901
|
+
private syncRegisteredSchemas;
|
|
1880
1902
|
/**
|
|
1881
1903
|
* Load metadata from external metadata service into ObjectQL registry
|
|
1882
1904
|
* This enables ObjectQL to use file-based or remote metadata
|
package/dist/index.js
CHANGED
|
@@ -2246,6 +2246,23 @@ var _ObjectQL = class _ObjectQL {
|
|
|
2246
2246
|
getDriverByName(name) {
|
|
2247
2247
|
return this.drivers.get(name);
|
|
2248
2248
|
}
|
|
2249
|
+
/**
|
|
2250
|
+
* Get the driver responsible for the given object.
|
|
2251
|
+
*
|
|
2252
|
+
* Resolves datasource binding from the object's schema definition,
|
|
2253
|
+
* falling back to the default driver. This is a public version of
|
|
2254
|
+
* the internal getDriver() used by CRUD operations.
|
|
2255
|
+
*
|
|
2256
|
+
* @param objectName - FQN or short name of the registered object.
|
|
2257
|
+
* @returns The resolved DriverInterface, or undefined if no driver is available.
|
|
2258
|
+
*/
|
|
2259
|
+
getDriverForObject(objectName) {
|
|
2260
|
+
try {
|
|
2261
|
+
return this.getDriver(objectName);
|
|
2262
|
+
} catch {
|
|
2263
|
+
return void 0;
|
|
2264
|
+
}
|
|
2265
|
+
}
|
|
2249
2266
|
/**
|
|
2250
2267
|
* Get a registered driver by datasource name.
|
|
2251
2268
|
* Alias matching @objectql/core datasource() API.
|
|
@@ -2643,6 +2660,7 @@ var ObjectQLPlugin = class {
|
|
|
2643
2660
|
}
|
|
2644
2661
|
}
|
|
2645
2662
|
await this.ql?.init();
|
|
2663
|
+
await this.syncRegisteredSchemas(ctx);
|
|
2646
2664
|
this.registerAuditHooks(ctx);
|
|
2647
2665
|
this.registerTenantMiddleware(ctx);
|
|
2648
2666
|
ctx.logger.info("ObjectQL engine started", {
|
|
@@ -2737,6 +2755,54 @@ var ObjectQLPlugin = class {
|
|
|
2737
2755
|
});
|
|
2738
2756
|
ctx.logger.debug("Tenant isolation middleware registered");
|
|
2739
2757
|
}
|
|
2758
|
+
/**
|
|
2759
|
+
* Synchronize all registered object schemas to the database.
|
|
2760
|
+
*
|
|
2761
|
+
* Iterates every object in the SchemaRegistry and calls the
|
|
2762
|
+
* responsible driver's `syncSchema()` for each one. This is
|
|
2763
|
+
* idempotent — drivers must tolerate repeated calls without
|
|
2764
|
+
* duplicating tables or erroring out.
|
|
2765
|
+
*
|
|
2766
|
+
* Drivers that do not implement `syncSchema` are silently skipped.
|
|
2767
|
+
*/
|
|
2768
|
+
async syncRegisteredSchemas(ctx) {
|
|
2769
|
+
if (!this.ql) return;
|
|
2770
|
+
const allObjects = this.ql.registry?.getAllObjects?.() ?? [];
|
|
2771
|
+
if (allObjects.length === 0) return;
|
|
2772
|
+
let synced = 0;
|
|
2773
|
+
let skipped = 0;
|
|
2774
|
+
for (const obj of allObjects) {
|
|
2775
|
+
const driver = this.ql.getDriverForObject(obj.name);
|
|
2776
|
+
if (!driver) {
|
|
2777
|
+
ctx.logger.debug("No driver available for object, skipping schema sync", {
|
|
2778
|
+
object: obj.name
|
|
2779
|
+
});
|
|
2780
|
+
skipped++;
|
|
2781
|
+
continue;
|
|
2782
|
+
}
|
|
2783
|
+
if (typeof driver.syncSchema !== "function") {
|
|
2784
|
+
ctx.logger.debug("Driver does not support syncSchema, skipping", {
|
|
2785
|
+
object: obj.name,
|
|
2786
|
+
driver: driver.name
|
|
2787
|
+
});
|
|
2788
|
+
skipped++;
|
|
2789
|
+
continue;
|
|
2790
|
+
}
|
|
2791
|
+
try {
|
|
2792
|
+
await driver.syncSchema(obj.name, obj);
|
|
2793
|
+
synced++;
|
|
2794
|
+
} catch (e) {
|
|
2795
|
+
ctx.logger.warn("Failed to sync schema for object", {
|
|
2796
|
+
object: obj.name,
|
|
2797
|
+
driver: driver.name,
|
|
2798
|
+
error: e instanceof Error ? e.message : String(e)
|
|
2799
|
+
});
|
|
2800
|
+
}
|
|
2801
|
+
}
|
|
2802
|
+
if (synced > 0 || skipped > 0) {
|
|
2803
|
+
ctx.logger.info("Schema sync complete", { synced, skipped, total: allObjects.length });
|
|
2804
|
+
}
|
|
2805
|
+
}
|
|
2740
2806
|
/**
|
|
2741
2807
|
* Load metadata from external metadata service into ObjectQL registry
|
|
2742
2808
|
* This enables ObjectQL to use file-based or remote metadata
|