@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.
- package/CHANGELOG.md +15 -6
- package/dist/action.d.ts +7 -0
- package/dist/action.js +23 -0
- package/dist/action.js.map +1 -0
- package/dist/app.d.ts +28 -0
- package/dist/app.js +211 -0
- package/dist/app.js.map +1 -0
- package/dist/driver.d.ts +2 -17
- package/dist/driver.js +52 -0
- package/dist/driver.js.map +1 -1
- package/dist/hook.d.ts +8 -0
- package/dist/hook.js +25 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.d.ts +8 -25
- package/dist/index.js +8 -141
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +9 -4
- package/dist/loader.js +206 -9
- package/dist/loader.js.map +1 -1
- package/dist/object.d.ts +3 -0
- package/dist/object.js +28 -0
- package/dist/object.js.map +1 -0
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.js +56 -0
- package/dist/plugin.js.map +1 -0
- package/dist/remote.d.ts +8 -0
- package/dist/remote.js +43 -0
- package/dist/remote.js.map +1 -0
- package/dist/repository.d.ts +3 -5
- package/dist/repository.js +107 -112
- package/dist/repository.js.map +1 -1
- package/jest.config.js +3 -0
- package/package.json +11 -7
- package/src/action.ts +40 -0
- package/src/app.ts +257 -0
- package/src/driver.ts +51 -21
- package/src/hook.ts +42 -0
- package/src/index.ts +8 -158
- package/src/loader.ts +184 -9
- package/src/object.ts +26 -0
- package/src/plugin.ts +53 -0
- package/src/remote.ts +50 -0
- package/src/repository.ts +123 -127
- package/test/action.test.ts +58 -0
- package/test/fixtures/project.action.js +8 -0
- package/test/hook.test.ts +60 -0
- package/test/loader.test.ts +1 -8
- package/test/metadata.test.ts +1 -1
- package/test/mock-driver.ts +1 -1
- package/test/remote.test.ts +119 -0
- package/test/repository.test.ts +42 -49
- package/test/utils.ts +54 -0
- package/tsconfig.json +7 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/README.md +0 -53
- package/dist/metadata.d.ts +0 -104
- package/dist/metadata.js +0 -3
- package/dist/metadata.js.map +0 -1
- package/dist/query.d.ts +0 -10
- package/dist/query.js +0 -3
- package/dist/query.js.map +0 -1
- package/dist/registry.d.ts +0 -4
- package/dist/registry.js +0 -8
- package/dist/registry.js.map +0 -1
- package/dist/types.d.ts +0 -83
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/src/metadata.ts +0 -143
- package/src/query.ts +0 -11
- package/src/registry.ts +0 -6
- package/src/types.ts +0 -115
- package/test/fixtures/project.action.ts +0 -6
package/dist/loader.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { MetadataRegistry } from '
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
36
|
+
exports.ObjectLoader = void 0;
|
|
4
37
|
exports.loadObjectConfigs = loadObjectConfigs;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
16
|
-
const loader = new
|
|
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;
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiLA,8CAmBC;AApMD,uCAAyB;AACzB,gDAAkC;AAClC,2CAA6B;AAC7B,2CAAqG;AACrG,8CAAgC;AAEhC,MAAa,YAAY;IAGrB,YAAsB,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;QAFxC,YAAO,GAAmB,EAAE,CAAC;QAGjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAEO,sBAAsB;QAC1B,UAAU;QACV,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YAC7C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,IAAI,CAAC;oBACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAQ,CAAC;oBAC1C,IAAI,CAAC,GAAG;wBAAE,OAAO;oBAEjB,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;wBACzB,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC5H,CAAC;yBAAM,CAAC;wBACJ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAa,CAAC,MAAM,EAAE,CAAC;gCACrD,MAAM,GAAG,GAAG,KAAY,CAAC;gCACzB,IAAI,CAAC,GAAG,CAAC,IAAI;oCAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;gCAC9B,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;4BACjE,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,QAAQ;QACR,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,0DAA0D;gBAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBAE5D,IAAI,CAAC;oBACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC9B,0CAA0C;oBAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;oBAEjC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;wBAC1B,IAAI,EAAE,MAAM;wBACZ,EAAE,EAAE,UAAU,EAAE,6BAA6B;wBAC7C,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,OAAO,EAAE,GAAG,CAAC,WAAW;wBACxB,OAAO,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,UAAU;QACV,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;YAC1C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,oDAAoD;gBACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;gBAE9D,IAAI,CAAC;oBACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAE9B,MAAM,OAAO,GAAwB,EAAE,CAAC;oBAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC7C,IAAI,GAAG,KAAK,SAAS;4BAAE,SAAS;wBAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAa,CAAC,OAAO,EAAE,CAAC;4BACtD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;wBACzB,CAAC;oBACL,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;4BAC7B,IAAI,EAAE,QAAQ;4BACd,EAAE,EAAE,UAAU,EAAE,0CAA0C;4BAC1D,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,OAAO,EAAE,GAAG,CAAC,WAAW;4BACxB,OAAO,EAAE,OAAO;yBACnB,CAAC,CAAC;oBACP,CAAC;gBAEL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,GAAG,CAAC,MAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,WAAoB;QAClC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,WAAW,CAAC,WAAmB;QAC3B,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3E,cAAc;YACd,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,wBAAwB;YACxB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,MAAoB,EAAE,GAAW,EAAE,WAAoB;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACjC,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBACD,MAAM,GAAG,GAAyB;oBAC9B,IAAI;oBACJ,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,WAAW;iBACd,CAAC;gBAEF,2BAA2B;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACjC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAExB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,IAAI,gBAAgB,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AArJD,oCAqJC;AAED,SAAS,cAAc,CAAC,QAA0B,EAAE,GAAQ,EAAE,IAAY,EAAE,WAAoB;IAC5F,mBAAmB;IACnB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC9C,IAAI,CAAE,KAAa,CAAC,IAAI,EAAE,CAAC;oBACtB,KAAa,CAAC,IAAI,GAAG,GAAG,CAAC;gBAC9B,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,GAAG,CAAC,IAAI;QACZ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,GAAG;KACf,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAW;IACzC,MAAM,QAAQ,GAAG,IAAI,wBAAgB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAM,QAAQ,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAe,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,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"}
|
package/dist/object.d.ts
ADDED
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"}
|
package/dist/plugin.d.ts
ADDED
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"}
|
package/dist/remote.d.ts
ADDED
|
@@ -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"}
|
package/dist/repository.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { ObjectQLContext, IObjectQL } from '
|
|
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
|
|
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
|
-
|
|
23
|
+
execute(actionName: string, id: string | number | undefined, params: any): Promise<any>;
|
|
26
24
|
}
|