@objectql/core 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +15 -6
  2. package/dist/action.d.ts +7 -0
  3. package/dist/action.js +23 -0
  4. package/dist/action.js.map +1 -0
  5. package/dist/app.d.ts +28 -0
  6. package/dist/app.js +211 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/driver.d.ts +2 -17
  9. package/dist/driver.js +52 -0
  10. package/dist/driver.js.map +1 -1
  11. package/dist/hook.d.ts +8 -0
  12. package/dist/hook.js +25 -0
  13. package/dist/hook.js.map +1 -0
  14. package/dist/index.d.ts +8 -25
  15. package/dist/index.js +8 -141
  16. package/dist/index.js.map +1 -1
  17. package/dist/loader.d.ts +9 -4
  18. package/dist/loader.js +206 -9
  19. package/dist/loader.js.map +1 -1
  20. package/dist/object.d.ts +3 -0
  21. package/dist/object.js +28 -0
  22. package/dist/object.js.map +1 -0
  23. package/dist/plugin.d.ts +2 -0
  24. package/dist/plugin.js +56 -0
  25. package/dist/plugin.js.map +1 -0
  26. package/dist/remote.d.ts +8 -0
  27. package/dist/remote.js +43 -0
  28. package/dist/remote.js.map +1 -0
  29. package/dist/repository.d.ts +3 -5
  30. package/dist/repository.js +107 -112
  31. package/dist/repository.js.map +1 -1
  32. package/jest.config.js +3 -0
  33. package/package.json +11 -7
  34. package/src/action.ts +40 -0
  35. package/src/app.ts +257 -0
  36. package/src/driver.ts +51 -21
  37. package/src/hook.ts +42 -0
  38. package/src/index.ts +8 -158
  39. package/src/loader.ts +184 -9
  40. package/src/object.ts +26 -0
  41. package/src/plugin.ts +53 -0
  42. package/src/remote.ts +50 -0
  43. package/src/repository.ts +123 -127
  44. package/test/action.test.ts +58 -0
  45. package/test/fixtures/project.action.js +8 -0
  46. package/test/hook.test.ts +60 -0
  47. package/test/loader.test.ts +1 -8
  48. package/test/metadata.test.ts +1 -1
  49. package/test/mock-driver.ts +1 -1
  50. package/test/remote.test.ts +119 -0
  51. package/test/repository.test.ts +42 -49
  52. package/test/utils.ts +54 -0
  53. package/tsconfig.json +7 -3
  54. package/tsconfig.tsbuildinfo +1 -1
  55. package/README.md +0 -53
  56. package/dist/metadata.d.ts +0 -104
  57. package/dist/metadata.js +0 -3
  58. package/dist/metadata.js.map +0 -1
  59. package/dist/query.d.ts +0 -10
  60. package/dist/query.js +0 -3
  61. package/dist/query.js.map +0 -1
  62. package/dist/registry.d.ts +0 -4
  63. package/dist/registry.js +0 -8
  64. package/dist/registry.js.map +0 -1
  65. package/dist/types.d.ts +0 -83
  66. package/dist/types.js +0 -6
  67. package/dist/types.js.map +0 -1
  68. package/src/metadata.ts +0 -143
  69. package/src/query.ts +0 -11
  70. package/src/registry.ts +0 -6
  71. package/src/types.ts +0 -115
  72. package/test/fixtures/project.action.ts +0 -6
package/dist/loader.d.ts CHANGED
@@ -1,7 +1,12 @@
1
- import { MetadataRegistry } from './registry';
2
- import { ObjectConfig } from './types';
3
- import { MetadataLoader as BaseLoader } from '@objectql/metadata';
4
- export declare class MetadataLoader extends BaseLoader {
1
+ import { MetadataRegistry, ObjectConfig, LoaderPlugin } from '@objectql/types';
2
+ export declare class ObjectLoader {
3
+ protected registry: MetadataRegistry;
4
+ private plugins;
5
5
  constructor(registry: MetadataRegistry);
6
+ private registerBuiltinPlugins;
7
+ use(plugin: LoaderPlugin): void;
8
+ load(dir: string, packageName?: string): void;
9
+ loadPackage(packageName: string): void;
10
+ private runPlugin;
6
11
  }
7
12
  export declare function loadObjectConfigs(dir: string): Record<string, ObjectConfig>;
package/dist/loader.js CHANGED
@@ -1,20 +1,217 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MetadataLoader = void 0;
36
+ exports.ObjectLoader = void 0;
4
37
  exports.loadObjectConfigs = loadObjectConfigs;
5
- const registry_1 = require("./registry");
6
- const metadata_1 = require("@objectql/metadata");
7
- class MetadataLoader extends metadata_1.MetadataLoader {
38
+ const fs = __importStar(require("fs"));
39
+ const glob = __importStar(require("fast-glob"));
40
+ const path = __importStar(require("path"));
41
+ const types_1 = require("@objectql/types");
42
+ const yaml = __importStar(require("js-yaml"));
43
+ class ObjectLoader {
8
44
  constructor(registry) {
9
- super(registry);
10
- (0, metadata_1.registerObjectQLPlugins)(this);
45
+ this.registry = registry;
46
+ this.plugins = [];
47
+ this.registerBuiltinPlugins();
48
+ }
49
+ registerBuiltinPlugins() {
50
+ // Objects
51
+ this.use({
52
+ name: 'object',
53
+ glob: ['**/*.object.yml', '**/*.object.yaml'],
54
+ handler: (ctx) => {
55
+ try {
56
+ const doc = yaml.load(ctx.content);
57
+ if (!doc)
58
+ return;
59
+ if (doc.name && doc.fields) {
60
+ registerObject(ctx.registry, doc, ctx.file, ctx.packageName || ctx.registry.getEntry('package-map', ctx.file)?.package);
61
+ }
62
+ else {
63
+ for (const [key, value] of Object.entries(doc)) {
64
+ if (typeof value === 'object' && value.fields) {
65
+ const obj = value;
66
+ if (!obj.name)
67
+ obj.name = key;
68
+ registerObject(ctx.registry, obj, ctx.file, ctx.packageName);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ catch (e) {
74
+ console.error(`Error loading object from ${ctx.file}:`, e);
75
+ }
76
+ }
77
+ });
78
+ // Hooks
79
+ this.use({
80
+ name: 'hook',
81
+ glob: ['**/*.hook.ts', '**/*.hook.js'],
82
+ handler: (ctx) => {
83
+ const basename = path.basename(ctx.file);
84
+ // Extract object name from filename: user.hook.ts -> user
85
+ const objectName = basename.replace(/\.hook\.(ts|js)$/, '');
86
+ try {
87
+ const mod = require(ctx.file);
88
+ // Support default export or named exports
89
+ const hooks = mod.default || mod;
90
+ ctx.registry.register('hook', {
91
+ type: 'hook',
92
+ id: objectName, // Hook ID is the object name
93
+ path: ctx.file,
94
+ package: ctx.packageName,
95
+ content: hooks
96
+ });
97
+ }
98
+ catch (e) {
99
+ console.error(`Error loading hook from ${ctx.file}:`, e);
100
+ }
101
+ }
102
+ });
103
+ // Actions
104
+ this.use({
105
+ name: 'action',
106
+ glob: ['**/*.action.ts', '**/*.action.js'],
107
+ handler: (ctx) => {
108
+ const basename = path.basename(ctx.file);
109
+ // Extract object name: invoice.action.ts -> invoice
110
+ const objectName = basename.replace(/\.action\.(ts|js)$/, '');
111
+ try {
112
+ const mod = require(ctx.file);
113
+ const actions = {};
114
+ for (const [key, value] of Object.entries(mod)) {
115
+ if (key === 'default')
116
+ continue;
117
+ if (typeof value === 'object' && value.handler) {
118
+ actions[key] = value;
119
+ }
120
+ }
121
+ if (Object.keys(actions).length > 0) {
122
+ ctx.registry.register('action', {
123
+ type: 'action',
124
+ id: objectName, // Action collection ID is the object name
125
+ path: ctx.file,
126
+ package: ctx.packageName,
127
+ content: actions
128
+ });
129
+ }
130
+ }
131
+ catch (e) {
132
+ console.error(`Error loading action from ${ctx.file}:`, e);
133
+ }
134
+ }
135
+ });
136
+ }
137
+ use(plugin) {
138
+ this.plugins.push(plugin);
139
+ }
140
+ load(dir, packageName) {
141
+ for (const plugin of this.plugins) {
142
+ this.runPlugin(plugin, dir, packageName);
143
+ }
144
+ }
145
+ loadPackage(packageName) {
146
+ try {
147
+ const entryPath = require.resolve(packageName, { paths: [process.cwd()] });
148
+ // clean cache
149
+ delete require.cache[entryPath];
150
+ const packageDir = path.dirname(entryPath);
151
+ this.load(packageDir, packageName);
152
+ }
153
+ catch (e) {
154
+ // fallback to directory
155
+ this.load(packageName, packageName);
156
+ }
11
157
  }
158
+ runPlugin(plugin, dir, packageName) {
159
+ const files = glob.sync(plugin.glob, {
160
+ cwd: dir,
161
+ absolute: true
162
+ });
163
+ for (const file of files) {
164
+ try {
165
+ const ctx = {
166
+ file,
167
+ content: '',
168
+ registry: this.registry,
169
+ packageName
170
+ };
171
+ // Pre-read for convenience
172
+ if (!file.match(/\.(js|ts|node)$/)) {
173
+ ctx.content = fs.readFileSync(file, 'utf8');
174
+ }
175
+ plugin.handler(ctx);
176
+ }
177
+ catch (e) {
178
+ console.error(`Error in loader plugin '${plugin.name}' processing ${file}:`, e);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ exports.ObjectLoader = ObjectLoader;
184
+ function registerObject(registry, obj, file, packageName) {
185
+ // Normalize fields
186
+ if (obj.fields) {
187
+ for (const [key, field] of Object.entries(obj.fields)) {
188
+ if (typeof field === 'object' && field !== null) {
189
+ if (!field.name) {
190
+ field.name = key;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ registry.register('object', {
196
+ type: 'object',
197
+ id: obj.name,
198
+ path: file,
199
+ package: packageName,
200
+ content: obj
201
+ });
12
202
  }
13
- exports.MetadataLoader = MetadataLoader;
14
203
  function loadObjectConfigs(dir) {
15
- const registry = new registry_1.MetadataRegistry();
16
- const loader = new MetadataLoader(registry);
204
+ const registry = new types_1.MetadataRegistry();
205
+ const loader = new ObjectLoader(registry);
17
206
  loader.load(dir);
207
+ // Merge actions into objects
208
+ const actions = registry.list('action');
209
+ for (const act of actions) {
210
+ const obj = registry.get('object', act.id);
211
+ if (obj) {
212
+ obj.actions = act.content;
213
+ }
214
+ }
18
215
  const result = {};
19
216
  for (const obj of registry.list('object')) {
20
217
  result[obj.name] = obj;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";;;AAWA,8CASC;AApBD,yCAA8C;AAE9C,iDAA2F;AAE3F,MAAa,cAAe,SAAQ,yBAAU;IAC1C,YAAY,QAA0B;QAClC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAA,kCAAuB,EAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACJ;AALD,wCAKC;AAED,SAAgB,iBAAiB,CAAC,GAAW;IACzC,MAAM,QAAQ,GAAG,IAAI,2BAAgB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAe,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ObjectConfig, MetadataRegistry } from '@objectql/types';
2
+ export declare function registerObjectHelper(metadata: MetadataRegistry, object: ObjectConfig): void;
3
+ export declare function getConfigsHelper(metadata: MetadataRegistry): Record<string, ObjectConfig>;
package/dist/object.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerObjectHelper = registerObjectHelper;
4
+ exports.getConfigsHelper = getConfigsHelper;
5
+ function registerObjectHelper(metadata, object) {
6
+ // Normalize fields
7
+ if (object.fields) {
8
+ for (const [key, field] of Object.entries(object.fields)) {
9
+ if (!field.name) {
10
+ field.name = key;
11
+ }
12
+ }
13
+ }
14
+ metadata.register('object', {
15
+ type: 'object',
16
+ id: object.name,
17
+ content: object
18
+ });
19
+ }
20
+ function getConfigsHelper(metadata) {
21
+ const result = {};
22
+ const objects = metadata.list('object');
23
+ for (const obj of objects) {
24
+ result[obj.name] = obj;
25
+ }
26
+ return result;
27
+ }
28
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":";;AAEA,oDAcC;AAED,4CAOC;AAvBD,SAAgB,oBAAoB,CAAC,QAA0B,EAAE,MAAoB;IACjF,mBAAmB;IACnB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAA0B;IACvD,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAe,QAAQ,CAAC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ObjectQLPlugin } from '@objectql/types';
2
+ export declare function loadPlugin(packageName: string): ObjectQLPlugin;
package/dist/plugin.js ADDED
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadPlugin = loadPlugin;
4
+ function loadPlugin(packageName) {
5
+ let mod;
6
+ try {
7
+ const modulePath = require.resolve(packageName, { paths: [process.cwd()] });
8
+ mod = require(modulePath);
9
+ }
10
+ catch (e) {
11
+ throw new Error(`Failed to resolve plugin '${packageName}': ${e}`);
12
+ }
13
+ // Helper to find plugin instance
14
+ const findPlugin = (candidate) => {
15
+ if (!candidate)
16
+ return undefined;
17
+ // 1. Try treating as Class
18
+ if (typeof candidate === 'function') {
19
+ try {
20
+ const inst = new candidate();
21
+ if (inst && typeof inst.setup === 'function') {
22
+ return inst; // Found it!
23
+ }
24
+ }
25
+ catch (e) {
26
+ // Not a constructor or instantiation failed
27
+ }
28
+ }
29
+ // 2. Try treating as Instance
30
+ if (candidate && typeof candidate.setup === 'function') {
31
+ if (candidate.name)
32
+ return candidate;
33
+ }
34
+ return undefined;
35
+ };
36
+ // Search in default, module root, and all named exports
37
+ let instance = findPlugin(mod.default) || findPlugin(mod);
38
+ if (!instance && mod && typeof mod === 'object') {
39
+ for (const key of Object.keys(mod)) {
40
+ if (key === 'default')
41
+ continue;
42
+ instance = findPlugin(mod[key]);
43
+ if (instance)
44
+ break;
45
+ }
46
+ }
47
+ if (instance) {
48
+ instance._packageName = packageName;
49
+ return instance;
50
+ }
51
+ else {
52
+ console.error(`[PluginLoader] Failed to find ObjectQLPlugin in '${packageName}'. Exports:`, Object.keys(mod));
53
+ throw new Error(`Plugin '${packageName}' must export a class or object implementing ObjectQLPlugin.`);
54
+ }
55
+ }
56
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;AAEA,gCAkDC;AAlDD,SAAgB,UAAU,CAAC,WAAmB;IAC1C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,CAAC,SAAc,EAA8B,EAAE;QAC1D,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QAEjC,2BAA2B;QAC3B,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC3C,OAAO,IAAI,CAAC,CAAC,YAAY;gBAC7B,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,4CAA4C;YAChD,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACrD,IAAI,SAAS,CAAC,IAAI;gBAAE,OAAO,SAAS,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACzB,CAAC,CAAC;IAEF,wDAAwD;IACxD,IAAI,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAE1D,IAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YAChC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,QAAQ;gBAAE,MAAM;QACxB,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACV,QAAgB,CAAC,YAAY,GAAG,WAAW,CAAC;QAC7C,OAAO,QAAQ,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,oDAAoD,WAAW,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9G,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,8DAA8D,CAAC,CAAC;IAC1G,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { RemoteDriver } from '@objectql/driver-remote';
2
+ import { ObjectConfig } from '@objectql/types';
3
+ export interface RemoteLoadResult {
4
+ driverName: string;
5
+ driver: RemoteDriver;
6
+ objects: ObjectConfig[];
7
+ }
8
+ export declare function loadRemoteFromUrl(url: string): Promise<RemoteLoadResult | null>;
package/dist/remote.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadRemoteFromUrl = loadRemoteFromUrl;
4
+ const driver_remote_1 = require("@objectql/driver-remote");
5
+ async function loadRemoteFromUrl(url) {
6
+ try {
7
+ const baseUrl = url.replace(/\/$/, '');
8
+ const metadataUrl = `${baseUrl}/api/metadata/objects`;
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore - Fetch is available in Node 18+
11
+ const res = await fetch(metadataUrl);
12
+ if (!res.ok) {
13
+ console.warn(`[ObjectQL] Remote ${url} returned ${res.status}`);
14
+ return null;
15
+ }
16
+ const data = await res.json();
17
+ if (!data || !data.objects)
18
+ return null;
19
+ const driverName = `remote:${baseUrl}`;
20
+ const driver = new driver_remote_1.RemoteDriver(baseUrl);
21
+ const objects = [];
22
+ await Promise.all(data.objects.map(async (summary) => {
23
+ try {
24
+ // @ts-ignore
25
+ const detailRes = await fetch(`${metadataUrl}/${summary.name}`);
26
+ if (detailRes.ok) {
27
+ const config = await detailRes.json();
28
+ config.datasource = driverName;
29
+ objects.push(config);
30
+ }
31
+ }
32
+ catch (e) {
33
+ console.warn(`[ObjectQL] Failed to load object ${summary.name} from ${url}`);
34
+ }
35
+ }));
36
+ return { driverName, driver, objects };
37
+ }
38
+ catch (e) {
39
+ console.warn(`[ObjectQL] Remote connection error ${url}: ${e.message}`);
40
+ return null;
41
+ }
42
+ }
43
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":";;AASA,8CAwCC;AAjDD,2DAAuD;AAShD,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC/C,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,GAAG,OAAO,uBAAuB,CAAC;QAEtD,6DAA6D;QAC7D,8CAA8C;QAC9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,qBAAqB,GAAG,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,UAAU,GAAG,UAAU,OAAO,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;YACtD,IAAI,CAAC;gBACD,aAAa;gBACb,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAkB,CAAC;oBACtD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,CAAC;YACjF,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE3C,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACjB,CAAC;AACL,CAAC"}
@@ -1,6 +1,4 @@
1
- import { ObjectQLContext, IObjectQL } from './types';
2
- import { ObjectConfig } from './metadata';
3
- import { UnifiedQuery } from './query';
1
+ import { ObjectQLContext, IObjectQL, ObjectConfig, UnifiedQuery } from '@objectql/types';
4
2
  export declare class ObjectRepository {
5
3
  private objectName;
6
4
  private context;
@@ -9,7 +7,7 @@ export declare class ObjectRepository {
9
7
  private getDriver;
10
8
  private getOptions;
11
9
  getSchema(): ObjectConfig;
12
- private executeHook;
10
+ private getHookAPI;
13
11
  find(query?: UnifiedQuery): Promise<any[]>;
14
12
  findOne(idOrQuery: string | number | UnifiedQuery): Promise<any>;
15
13
  count(filters: any): Promise<number>;
@@ -22,5 +20,5 @@ export declare class ObjectRepository {
22
20
  createMany(data: any[]): Promise<any>;
23
21
  updateMany(filters: any, data: any): Promise<any>;
24
22
  deleteMany(filters: any): Promise<any>;
25
- call(actionName: string, params: any): Promise<any>;
23
+ execute(actionName: string, id: string | number | undefined, params: any): Promise<any>;
26
24
  }