@objectql/platform-node 1.6.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 +13 -0
- package/LICENSE +21 -0
- package/dist/driver.d.ts +2 -0
- package/dist/driver.js +55 -0
- package/dist/driver.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +12 -0
- package/dist/loader.js +358 -0
- package/dist/loader.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/jest.config.js +13 -0
- package/package.json +19 -0
- package/src/driver.ts +54 -0
- package/src/index.ts +3 -0
- package/src/loader.ts +349 -0
- package/src/plugin.ts +53 -0
- package/test/dynamic.test.ts +33 -0
- package/test/fixtures/project-with-validation.object.yml +124 -0
- package/test/fixtures/project.action.js +8 -0
- package/test/fixtures/project.object.yml +41 -0
- package/test/fixtures/test_dashboard.page.yml +42 -0
- package/test/fixtures/test_page.page.yml +54 -0
- package/test/fixtures/test_responsive.page.yml +39 -0
- package/test/fixtures/test_sections.page.yml +45 -0
- package/test/loader.test.ts +15 -0
- package/test/metadata.test.ts +49 -0
- package/test/page.test.ts +137 -0
- package/test/validation.test.ts +486 -0
- package/tsconfig.json +14 -0
- package/tsconfig.tsbuildinfo +1 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ObjectQL Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/driver.d.ts
ADDED
package/dist/driver.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDriverFromConnection = createDriverFromConnection;
|
|
4
|
+
function createDriverFromConnection(connection) {
|
|
5
|
+
let driverPackage = '';
|
|
6
|
+
let driverClass = '';
|
|
7
|
+
let driverConfig = {};
|
|
8
|
+
if (connection.startsWith('mongodb://')) {
|
|
9
|
+
driverPackage = '@objectql/driver-mongo';
|
|
10
|
+
driverClass = 'MongoDriver';
|
|
11
|
+
driverConfig = { url: connection };
|
|
12
|
+
}
|
|
13
|
+
else if (connection.startsWith('sqlite://')) {
|
|
14
|
+
driverPackage = '@objectql/driver-sql';
|
|
15
|
+
driverClass = 'KnexDriver';
|
|
16
|
+
const filename = connection.replace('sqlite://', '');
|
|
17
|
+
driverConfig = {
|
|
18
|
+
client: 'sqlite3',
|
|
19
|
+
connection: { filename },
|
|
20
|
+
useNullAsDefault: true
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
else if (connection.startsWith('postgres://') || connection.startsWith('postgresql://')) {
|
|
24
|
+
driverPackage = '@objectql/driver-sql';
|
|
25
|
+
driverClass = 'KnexDriver';
|
|
26
|
+
driverConfig = {
|
|
27
|
+
client: 'pg',
|
|
28
|
+
connection: connection
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
else if (connection.startsWith('mysql://')) {
|
|
32
|
+
driverPackage = '@objectql/driver-sql';
|
|
33
|
+
driverClass = 'KnexDriver';
|
|
34
|
+
driverConfig = {
|
|
35
|
+
client: 'mysql2',
|
|
36
|
+
connection: connection
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error(`Unsupported connection protocol: ${connection}`);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
44
|
+
const pkg = require(driverPackage);
|
|
45
|
+
const DriverClass = pkg[driverClass];
|
|
46
|
+
if (!DriverClass) {
|
|
47
|
+
throw new Error(`${driverClass} not found in ${driverPackage}`);
|
|
48
|
+
}
|
|
49
|
+
return new DriverClass(driverConfig);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
throw new Error(`Failed to load driver ${driverPackage}. Please install it: npm install ${driverPackage}. Error: ${e.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":";;AAEA,gEAmDC;AAnDD,SAAgB,0BAA0B,CAAC,UAAkB;IACzD,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,YAAY,GAAQ,EAAE,CAAC;IAE3B,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,aAAa,GAAG,wBAAwB,CAAC;QACzC,WAAW,GAAG,aAAa,CAAC;QAC5B,YAAY,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;SACI,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,aAAa,GAAG,sBAAsB,CAAC;QACvC,WAAW,GAAG,YAAY,CAAC;QAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACrD,YAAY,GAAG;YACX,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE,QAAQ,EAAE;YACxB,gBAAgB,EAAE,IAAI;SACzB,CAAC;IACN,CAAC;SACI,IAAI,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACtF,aAAa,GAAG,sBAAsB,CAAC;QACvC,WAAW,GAAG,YAAY,CAAC;QAC3B,YAAY,GAAG;YACX,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,UAAU;SACzB,CAAC;IACN,CAAC;SACI,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,aAAa,GAAG,sBAAsB,CAAC;QACvC,WAAW,GAAG,YAAY,CAAC;QAC3B,YAAY,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,UAAU;SACzB,CAAC;IACN,CAAC;SACI,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC;QACD,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,iBAAiB,aAAa,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,aAAa,oCAAoC,aAAa,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpI,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./loader"), exports);
|
|
18
|
+
__exportStar(require("./plugin"), exports);
|
|
19
|
+
__exportStar(require("./driver"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,2CAAyB"}
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MetadataRegistry, ObjectConfig, LoaderPlugin } from '@objectql/types';
|
|
2
|
+
export declare class ObjectLoader {
|
|
3
|
+
protected registry: MetadataRegistry;
|
|
4
|
+
private plugins;
|
|
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;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadObjectConfigs(dir: string): Record<string, ObjectConfig>;
|
package/dist/loader.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
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
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ObjectLoader = void 0;
|
|
37
|
+
exports.loadObjectConfigs = loadObjectConfigs;
|
|
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
|
+
const core_1 = require("@objectql/core");
|
|
44
|
+
class ObjectLoader {
|
|
45
|
+
constructor(registry) {
|
|
46
|
+
this.registry = registry;
|
|
47
|
+
this.plugins = [];
|
|
48
|
+
this.registerBuiltinPlugins();
|
|
49
|
+
}
|
|
50
|
+
registerBuiltinPlugins() {
|
|
51
|
+
// Objects
|
|
52
|
+
this.use({
|
|
53
|
+
name: 'object',
|
|
54
|
+
glob: ['**/*.object.yml', '**/*.object.yaml'],
|
|
55
|
+
handler: (ctx) => {
|
|
56
|
+
try {
|
|
57
|
+
const doc = yaml.load(ctx.content);
|
|
58
|
+
if (!doc)
|
|
59
|
+
return;
|
|
60
|
+
// Calculate ID from filename
|
|
61
|
+
const basename = path.basename(ctx.file);
|
|
62
|
+
const filenameId = basename.replace(/\.object\.(yml|yaml)$/, '');
|
|
63
|
+
// 1. Single Object definition (Standard)
|
|
64
|
+
// If fields are present, we treat it as a single object definition
|
|
65
|
+
if (doc.fields) {
|
|
66
|
+
if (!doc.name) {
|
|
67
|
+
// If name is missing, infer from filename
|
|
68
|
+
doc.name = filenameId;
|
|
69
|
+
}
|
|
70
|
+
else if (doc.name !== filenameId) {
|
|
71
|
+
// warn if mismatch
|
|
72
|
+
console.warn(`[ObjectQL] Warning: Object name '${doc.name}' in ${basename} does not match filename. Using '${doc.name}'.`);
|
|
73
|
+
}
|
|
74
|
+
const packageEntry = ctx.registry.getEntry('package-map', ctx.file);
|
|
75
|
+
registerObject(ctx.registry, doc, ctx.file, ctx.packageName || (packageEntry && packageEntry.package));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// 2. Multi-object map (Legacy/Bundle mode)
|
|
79
|
+
// e.g. { object1: { fields... }, object2: { fields... } }
|
|
80
|
+
for (const [key, value] of Object.entries(doc)) {
|
|
81
|
+
if (typeof value === 'object' && value.fields) {
|
|
82
|
+
const obj = value;
|
|
83
|
+
if (!obj.name)
|
|
84
|
+
obj.name = key;
|
|
85
|
+
registerObject(ctx.registry, obj, ctx.file, ctx.packageName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error(`Error loading object from ${ctx.file}:`, e);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Hooks
|
|
95
|
+
this.use({
|
|
96
|
+
name: 'hook',
|
|
97
|
+
glob: ['**/*.hook.ts', '**/*.hook.js'],
|
|
98
|
+
handler: (ctx) => {
|
|
99
|
+
const basename = path.basename(ctx.file);
|
|
100
|
+
// Extract object name from filename: user.hook.ts -> user
|
|
101
|
+
const objectName = basename.replace(/\.hook\.(ts|js)$/, '');
|
|
102
|
+
try {
|
|
103
|
+
const mod = require(ctx.file);
|
|
104
|
+
// Support default export or named exports
|
|
105
|
+
const hooks = mod.default || mod;
|
|
106
|
+
ctx.registry.register('hook', {
|
|
107
|
+
type: 'hook',
|
|
108
|
+
id: objectName, // Hook ID is the object name
|
|
109
|
+
path: ctx.file,
|
|
110
|
+
package: ctx.packageName,
|
|
111
|
+
content: hooks
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error(`Error loading hook from ${ctx.file}:`, e);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// Actions
|
|
120
|
+
this.use({
|
|
121
|
+
name: 'action',
|
|
122
|
+
glob: ['**/*.action.ts', '**/*.action.js'],
|
|
123
|
+
handler: (ctx) => {
|
|
124
|
+
const basename = path.basename(ctx.file);
|
|
125
|
+
// Extract object name: invoice.action.ts -> invoice
|
|
126
|
+
const objectName = basename.replace(/\.action\.(ts|js)$/, '');
|
|
127
|
+
try {
|
|
128
|
+
const mod = require(ctx.file);
|
|
129
|
+
const actions = {};
|
|
130
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
131
|
+
if (key === 'default')
|
|
132
|
+
continue;
|
|
133
|
+
if (typeof value === 'object' && value.handler) {
|
|
134
|
+
actions[key] = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (Object.keys(actions).length > 0) {
|
|
138
|
+
ctx.registry.register('action', {
|
|
139
|
+
type: 'action',
|
|
140
|
+
id: objectName, // Action collection ID is the object name
|
|
141
|
+
path: ctx.file,
|
|
142
|
+
package: ctx.packageName,
|
|
143
|
+
content: actions
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
console.error(`Error loading action from ${ctx.file}:`, e);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// Generic YAML Metadata Loaders
|
|
153
|
+
const metaTypes = ['view', 'form', 'permission', 'report', 'workflow', 'validation', 'data', 'app', 'page', 'menu'];
|
|
154
|
+
for (const type of metaTypes) {
|
|
155
|
+
this.use({
|
|
156
|
+
name: type,
|
|
157
|
+
glob: [`**/*.${type}.yml`, `**/*.${type}.yaml`],
|
|
158
|
+
handler: (ctx) => {
|
|
159
|
+
try {
|
|
160
|
+
const doc = yaml.load(ctx.content);
|
|
161
|
+
if (!doc)
|
|
162
|
+
return;
|
|
163
|
+
// Use 'name' from doc, or filename base (without extension)
|
|
164
|
+
let id = doc.name;
|
|
165
|
+
if (!id) {
|
|
166
|
+
const basename = path.basename(ctx.file);
|
|
167
|
+
// e.g. "my-view.view.yml" -> "my-view"
|
|
168
|
+
// Regex: remove .type.yml or .type.yaml
|
|
169
|
+
const re = new RegExp(`\\.${type}\\.(yml|yaml)$`);
|
|
170
|
+
id = basename.replace(re, '');
|
|
171
|
+
}
|
|
172
|
+
// Ensure name is in the doc for consistency
|
|
173
|
+
if (!doc.name)
|
|
174
|
+
doc.name = id;
|
|
175
|
+
ctx.registry.register(type, {
|
|
176
|
+
type: type,
|
|
177
|
+
id: id,
|
|
178
|
+
path: ctx.file,
|
|
179
|
+
package: ctx.packageName,
|
|
180
|
+
content: doc
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
console.error(`Error loading ${type} from ${ctx.file}:`, e);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
use(plugin) {
|
|
191
|
+
this.plugins.push(plugin);
|
|
192
|
+
}
|
|
193
|
+
load(dir, packageName) {
|
|
194
|
+
for (const plugin of this.plugins) {
|
|
195
|
+
this.runPlugin(plugin, dir, packageName);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
loadPackage(packageName) {
|
|
199
|
+
try {
|
|
200
|
+
const entryPath = require.resolve(packageName, { paths: [process.cwd()] });
|
|
201
|
+
// clean cache
|
|
202
|
+
delete require.cache[entryPath];
|
|
203
|
+
const packageDir = path.dirname(entryPath);
|
|
204
|
+
this.load(packageDir, packageName);
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
// fallback to directory
|
|
208
|
+
this.load(packageName, packageName);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
runPlugin(plugin, dir, packageName) {
|
|
212
|
+
// Enforce path conventions:
|
|
213
|
+
// 1. Never scan node_modules (unless explicitly loaded via loadPackage which sets cwd inside it)
|
|
214
|
+
// 2. Ignore build artifacts (dist, build, out) to avoid double-loading metadata if both src and dist exist.
|
|
215
|
+
// Note: If you want to load from 'dist', you must explicitly point the loader to it (e.g. loader.load('./dist')).
|
|
216
|
+
// In that case, the patterns won't match relative to the CWD.
|
|
217
|
+
// Path conventions:
|
|
218
|
+
// 1. Always ignore node_modules and .git
|
|
219
|
+
const ignore = [
|
|
220
|
+
'**/node_modules/**',
|
|
221
|
+
'**/.git/**'
|
|
222
|
+
];
|
|
223
|
+
// 2. Intelligent handling of build artifacts (dist/build)
|
|
224
|
+
// If 'src' exists in the scan directory, we assume it's a Development Environment.
|
|
225
|
+
// In Dev, we ignore 'dist' to avoid duplicate loading (ts in src vs js in dist).
|
|
226
|
+
// In Production (no src), we must NOT ignore 'dist', otherwise we can't load compiled hooks/actions.
|
|
227
|
+
const srcPath = path.join(dir, 'src');
|
|
228
|
+
const hasSrc = fs.existsSync(srcPath) && fs.statSync(srcPath).isDirectory();
|
|
229
|
+
if (hasSrc) {
|
|
230
|
+
ignore.push('**/dist/**', '**/build/**', '**/out/**');
|
|
231
|
+
}
|
|
232
|
+
// 3. User instruction: "src 不行的" (src is not viable for metadata in production)
|
|
233
|
+
// Metadata (.yml) should ideally be placed in 'objects/' or root, not 'src/',
|
|
234
|
+
// to simplify packaging (so you don't need to copy assets from src to dist).
|
|
235
|
+
// However, we do not strictly block 'src' scanning here to avoid breaking dev workflow.
|
|
236
|
+
// The exclusion of 'dist' in dev mode (above) handles the code duality.
|
|
237
|
+
const files = glob.sync(plugin.glob, {
|
|
238
|
+
cwd: dir,
|
|
239
|
+
absolute: true,
|
|
240
|
+
ignore
|
|
241
|
+
});
|
|
242
|
+
for (const file of files) {
|
|
243
|
+
try {
|
|
244
|
+
const ctx = {
|
|
245
|
+
file,
|
|
246
|
+
content: '',
|
|
247
|
+
registry: this.registry,
|
|
248
|
+
packageName
|
|
249
|
+
};
|
|
250
|
+
// Pre-read for convenience
|
|
251
|
+
if (!file.match(/\.(js|ts|node)$/)) {
|
|
252
|
+
ctx.content = fs.readFileSync(file, 'utf8');
|
|
253
|
+
}
|
|
254
|
+
plugin.handler(ctx);
|
|
255
|
+
}
|
|
256
|
+
catch (e) {
|
|
257
|
+
console.error(`Error in loader plugin '${plugin.name}' processing ${file}:`, e);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.ObjectLoader = ObjectLoader;
|
|
263
|
+
function registerObject(registry, obj, file, packageName) {
|
|
264
|
+
if (!obj.name)
|
|
265
|
+
return;
|
|
266
|
+
// --- Smart Defaults & Normalization ---
|
|
267
|
+
// 1. Object Label: Infer from name if missing
|
|
268
|
+
if (!obj.label) {
|
|
269
|
+
obj.label = (0, core_1.toTitleCase)(obj.name);
|
|
270
|
+
}
|
|
271
|
+
// 2. Normalize Fields
|
|
272
|
+
if (obj.fields) {
|
|
273
|
+
for (const [key, field] of Object.entries(obj.fields)) {
|
|
274
|
+
if (typeof field === 'object' && field !== null) {
|
|
275
|
+
const f = field;
|
|
276
|
+
// Ensure field has a name
|
|
277
|
+
if (!f.name) {
|
|
278
|
+
f.name = key;
|
|
279
|
+
}
|
|
280
|
+
// Field Label: Infer from key if missing
|
|
281
|
+
if (!f.label) {
|
|
282
|
+
f.label = (0, core_1.toTitleCase)(key);
|
|
283
|
+
}
|
|
284
|
+
// Inferred Types
|
|
285
|
+
if (!f.type) {
|
|
286
|
+
if (f.reference_to) {
|
|
287
|
+
f.type = 'lookup';
|
|
288
|
+
}
|
|
289
|
+
else if (f.options) {
|
|
290
|
+
f.type = 'select';
|
|
291
|
+
}
|
|
292
|
+
else if (f.formula) {
|
|
293
|
+
f.type = 'formula';
|
|
294
|
+
}
|
|
295
|
+
else if (f.summary_object) {
|
|
296
|
+
f.type = 'summary';
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// --- End Smart Defaults ---
|
|
303
|
+
// Check for existing object to Merge
|
|
304
|
+
const existing = registry.getEntry('object', obj.name);
|
|
305
|
+
if (existing) {
|
|
306
|
+
const base = existing.content;
|
|
307
|
+
// Merge Fields: New fields overwrite old ones
|
|
308
|
+
if (obj.fields) {
|
|
309
|
+
base.fields = { ...base.fields, ...obj.fields };
|
|
310
|
+
}
|
|
311
|
+
// Merge Actions
|
|
312
|
+
if (obj.actions) {
|
|
313
|
+
base.actions = { ...base.actions, ...obj.actions };
|
|
314
|
+
}
|
|
315
|
+
// Merge Indexes
|
|
316
|
+
if (obj.indexes) {
|
|
317
|
+
base.indexes = { ...base.indexes, ...obj.indexes };
|
|
318
|
+
}
|
|
319
|
+
// Override Top-level Properties if provided
|
|
320
|
+
if (obj.label)
|
|
321
|
+
base.label = obj.label;
|
|
322
|
+
if (obj.icon)
|
|
323
|
+
base.icon = obj.icon;
|
|
324
|
+
if (obj.description)
|
|
325
|
+
base.description = obj.description;
|
|
326
|
+
if (obj.datasource)
|
|
327
|
+
base.datasource = obj.datasource;
|
|
328
|
+
// Update the content reference
|
|
329
|
+
existing.content = base;
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
registry.register('object', {
|
|
333
|
+
type: 'object',
|
|
334
|
+
id: obj.name,
|
|
335
|
+
path: file,
|
|
336
|
+
package: packageName,
|
|
337
|
+
content: obj
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
function loadObjectConfigs(dir) {
|
|
341
|
+
const registry = new types_1.MetadataRegistry();
|
|
342
|
+
const loader = new ObjectLoader(registry);
|
|
343
|
+
loader.load(dir);
|
|
344
|
+
// Merge actions into objects
|
|
345
|
+
const actions = registry.list('action');
|
|
346
|
+
for (const act of actions) {
|
|
347
|
+
const obj = registry.get('object', act.id);
|
|
348
|
+
if (obj) {
|
|
349
|
+
obj.actions = act.content;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const result = {};
|
|
353
|
+
for (const obj of registry.list('object')) {
|
|
354
|
+
result[obj.name] = obj;
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
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/jest.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: 'ts-jest',
|
|
3
|
+
testEnvironment: 'node',
|
|
4
|
+
testMatch: ['**/test/**/*.test.ts'],
|
|
5
|
+
moduleNameMapper: {
|
|
6
|
+
'^@objectql/(.*)$': '<rootDir>/../$1/src',
|
|
7
|
+
},
|
|
8
|
+
transform: {
|
|
9
|
+
'^.+\\.ts$': ['ts-jest', {
|
|
10
|
+
isolatedModules: true,
|
|
11
|
+
}],
|
|
12
|
+
},
|
|
13
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@objectql/platform-node",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"fast-glob": "^3.3.2",
|
|
8
|
+
"js-yaml": "^4.1.1",
|
|
9
|
+
"@objectql/types": "1.6.0",
|
|
10
|
+
"@objectql/core": "1.6.0"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"typescript": "^5.3.0"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"test": "jest"
|
|
18
|
+
}
|
|
19
|
+
}
|