@voxgig/system 1.3.1 → 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/README.md +23 -0
- package/cmd.ts +87 -7
- package/dist/cmd.js +80 -4
- package/dist/cmd.js.map +1 -1
- package/dist/lib/add.d.ts +4 -1
- package/dist/lib/add.js +84 -0
- package/dist/lib/add.js.map +1 -1
- package/dist/lib/template.d.ts +24 -0
- package/dist/lib/template.js +245 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/system.d.ts +10 -2
- package/dist/system.js +10 -1
- package/dist/system.js.map +1 -1
- package/lib/add.ts +98 -1
- package/lib/template.ts +323 -0
- package/package.json +1 -1
- package/system.ts +11 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright © 2026 Voxgig Ltd, MIT License. */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GENERATORS = void 0;
|
|
8
|
+
exports.resolveProject = resolveProject;
|
|
9
|
+
exports.listTemplates = listTemplates;
|
|
10
|
+
exports.ejectFragment = ejectFragment;
|
|
11
|
+
exports.ejectCode = ejectCode;
|
|
12
|
+
exports.diffTemplates = diffTemplates;
|
|
13
|
+
// Template customization tooling: list / eject / diff for the generation
|
|
14
|
+
// templates provided by @voxgig/build.
|
|
15
|
+
//
|
|
16
|
+
// Layered resolution (first hit wins):
|
|
17
|
+
// 1. backend/src/gen/<name>.ts compiled generator override (deep custom)
|
|
18
|
+
// 2. backend/tm/<area>/<frag> project fragment (text-level custom)
|
|
19
|
+
// 3. @voxgig/build package defaults
|
|
20
|
+
//
|
|
21
|
+
// Fragment names are area-qualified (lambda/srv.yml.frag,
|
|
22
|
+
// env/aws/serverless.yml.frag); bare names default to the lambda area.
|
|
23
|
+
//
|
|
24
|
+
// eject copies a package fragment (or, with code=true, a template source
|
|
25
|
+
// rewired to the package's public API) into the project, recording
|
|
26
|
+
// provenance in tm/lambda/.ejected.json so diff can show upstream drift
|
|
27
|
+
// after package upgrades.
|
|
28
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
29
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
30
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
31
|
+
const node_child_process_1 = require("node:child_process");
|
|
32
|
+
const add_1 = require("./add");
|
|
33
|
+
// The code-level template generators (env/lambda/<name>.ts in the package).
|
|
34
|
+
const GENERATORS = ['srv_yml', 'srv_handler', 'res_yml'];
|
|
35
|
+
exports.GENERATORS = GENERATORS;
|
|
36
|
+
// Generator shorthand -> default fragment.
|
|
37
|
+
const GENERATOR_FRAG = {
|
|
38
|
+
srv_yml: 'lambda/srv.yml.frag',
|
|
39
|
+
srv_handler: 'lambda/srv_handler.ts.frag',
|
|
40
|
+
res_yml: 'lambda/res.role.yml.frag',
|
|
41
|
+
};
|
|
42
|
+
function resolveProject(start) {
|
|
43
|
+
const files = (0, add_1.resolveModelFiles)(start);
|
|
44
|
+
const backend = node_path_1.default.dirname(files.folder);
|
|
45
|
+
let pkgjson;
|
|
46
|
+
try {
|
|
47
|
+
pkgjson = require.resolve('@voxgig/build/package.json', {
|
|
48
|
+
paths: [backend, files.folder, start],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
throw new Error('@voxgig/build not found from ' + backend +
|
|
53
|
+
' - is it installed? (npm install)');
|
|
54
|
+
}
|
|
55
|
+
const pkg = node_path_1.default.dirname(pkgjson);
|
|
56
|
+
return {
|
|
57
|
+
backend,
|
|
58
|
+
tm: node_path_1.default.join(backend, 'tm'),
|
|
59
|
+
gen: node_path_1.default.join(backend, 'src', 'gen'),
|
|
60
|
+
pkg,
|
|
61
|
+
pkgtm: node_path_1.default.join(pkg, 'tm'),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function pkgVersion(project) {
|
|
65
|
+
return JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(project.pkg, 'package.json'), 'utf8')).version;
|
|
66
|
+
}
|
|
67
|
+
function sha256(content) {
|
|
68
|
+
return node_crypto_1.default.createHash('sha256').update(content).digest('hex');
|
|
69
|
+
}
|
|
70
|
+
// Provenance lives at tm/.ejected.json; the pre-area location
|
|
71
|
+
// (tm/lambda/.ejected.json) and bare fragment keys are still read, with
|
|
72
|
+
// bare keys normalized to the lambda area.
|
|
73
|
+
function readProvenance(project) {
|
|
74
|
+
const out = {};
|
|
75
|
+
for (const p of [
|
|
76
|
+
node_path_1.default.join(project.tm, 'lambda', '.ejected.json'),
|
|
77
|
+
node_path_1.default.join(project.tm, '.ejected.json'),
|
|
78
|
+
]) {
|
|
79
|
+
if (node_fs_1.default.existsSync(p)) {
|
|
80
|
+
const prov = JSON.parse(node_fs_1.default.readFileSync(p, 'utf8'));
|
|
81
|
+
for (const key of Object.keys(prov)) {
|
|
82
|
+
const norm = (key.includes('/') || key.startsWith('code:')) ?
|
|
83
|
+
key : 'lambda/' + key;
|
|
84
|
+
out[norm] = prov[key];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
function writeProvenance(project, prov) {
|
|
91
|
+
node_fs_1.default.mkdirSync(project.tm, { recursive: true });
|
|
92
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(project.tm, '.ejected.json'), JSON.stringify(prov, null, 2) + '\n');
|
|
93
|
+
const old = node_path_1.default.join(project.tm, 'lambda', '.ejected.json');
|
|
94
|
+
if (node_fs_1.default.existsSync(old)) {
|
|
95
|
+
node_fs_1.default.rmSync(old);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// All package fragments, as area-qualified relative names.
|
|
99
|
+
function pkgFragments(project) {
|
|
100
|
+
const out = [];
|
|
101
|
+
const walk = (rel) => {
|
|
102
|
+
const dir = node_path_1.default.join(project.pkgtm, rel);
|
|
103
|
+
if (!node_fs_1.default.existsSync(dir)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const e of node_fs_1.default.readdirSync(dir, { withFileTypes: true })) {
|
|
107
|
+
const relpath = '' === rel ? e.name : rel + '/' + e.name;
|
|
108
|
+
if (e.isDirectory()) {
|
|
109
|
+
walk(relpath);
|
|
110
|
+
}
|
|
111
|
+
else if (e.name.endsWith('.frag')) {
|
|
112
|
+
out.push(relpath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
walk('');
|
|
117
|
+
return out.sort();
|
|
118
|
+
}
|
|
119
|
+
// List each template with the layer that currently provides it.
|
|
120
|
+
function listTemplates(start) {
|
|
121
|
+
const project = resolveProject(start);
|
|
122
|
+
const rows = [];
|
|
123
|
+
for (const gen of GENERATORS) {
|
|
124
|
+
const override = node_path_1.default.join(project.gen, gen + '.ts');
|
|
125
|
+
rows.push({
|
|
126
|
+
name: gen,
|
|
127
|
+
kind: 'generator',
|
|
128
|
+
layer: node_fs_1.default.existsSync(override) ?
|
|
129
|
+
'project (src/gen/' + gen + '.ts)' : 'package',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
for (const frag of pkgFragments(project)) {
|
|
133
|
+
rows.push({
|
|
134
|
+
name: frag,
|
|
135
|
+
kind: 'fragment',
|
|
136
|
+
layer: node_fs_1.default.existsSync(node_path_1.default.join(project.tm, frag)) ?
|
|
137
|
+
'project (tm/' + frag + ')' : 'package',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return rows;
|
|
141
|
+
}
|
|
142
|
+
// Eject a fragment (text template) into backend/tm/lambda/.
|
|
143
|
+
function ejectFragment(start, name) {
|
|
144
|
+
const project = resolveProject(start);
|
|
145
|
+
let frag = GENERATOR_FRAG[name] || name;
|
|
146
|
+
if (!frag.includes('/')) {
|
|
147
|
+
frag = 'lambda/' + frag;
|
|
148
|
+
}
|
|
149
|
+
const srcpath = node_path_1.default.join(project.pkgtm, frag);
|
|
150
|
+
if (!node_fs_1.default.existsSync(srcpath)) {
|
|
151
|
+
throw new Error('unknown fragment: ' + frag +
|
|
152
|
+
' (available: ' + pkgFragments(project).join(', ') + ')');
|
|
153
|
+
}
|
|
154
|
+
const dest = node_path_1.default.join(project.tm, frag);
|
|
155
|
+
if (node_fs_1.default.existsSync(dest)) {
|
|
156
|
+
throw new Error('already ejected: ' + node_path_1.default.relative(start, dest));
|
|
157
|
+
}
|
|
158
|
+
const content = node_fs_1.default.readFileSync(srcpath, 'utf8');
|
|
159
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(dest), { recursive: true });
|
|
160
|
+
node_fs_1.default.writeFileSync(dest, content);
|
|
161
|
+
const prov = readProvenance(project);
|
|
162
|
+
prov[frag] = {
|
|
163
|
+
package: '@voxgig/build',
|
|
164
|
+
version: pkgVersion(project),
|
|
165
|
+
sha256: sha256(content),
|
|
166
|
+
};
|
|
167
|
+
writeProvenance(project, prov);
|
|
168
|
+
return dest;
|
|
169
|
+
}
|
|
170
|
+
// Eject a generator source (compiled component override) into
|
|
171
|
+
// backend/src/gen/<name>.ts, rewiring package-internal imports to the
|
|
172
|
+
// public '@voxgig/build' API.
|
|
173
|
+
function ejectCode(start, name) {
|
|
174
|
+
const project = resolveProject(start);
|
|
175
|
+
if (!GENERATORS.includes(name)) {
|
|
176
|
+
throw new Error('unknown generator: ' + name +
|
|
177
|
+
' (available: ' + GENERATORS.join(', ') + ')');
|
|
178
|
+
}
|
|
179
|
+
const srcpath = node_path_1.default.join(project.pkg, 'env', 'lambda', name + '.ts');
|
|
180
|
+
if (!node_fs_1.default.existsSync(srcpath)) {
|
|
181
|
+
throw new Error('template source not shipped by installed ' +
|
|
182
|
+
'@voxgig/build (' + pkgVersion(project) + ') - needs >= 4.1.0');
|
|
183
|
+
}
|
|
184
|
+
const dest = node_path_1.default.join(project.gen, name + '.ts');
|
|
185
|
+
if (node_fs_1.default.existsSync(dest)) {
|
|
186
|
+
throw new Error('already ejected: ' + node_path_1.default.relative(start, dest));
|
|
187
|
+
}
|
|
188
|
+
let src = node_fs_1.default.readFileSync(srcpath, 'utf8');
|
|
189
|
+
// Package-internal imports -> public API.
|
|
190
|
+
src = src
|
|
191
|
+
.replace(/from '\.\/generate'/g, "from '@voxgig/build'")
|
|
192
|
+
.replace(/from '\.\.\/\.\.\/shape\/msg'/g, "from '@voxgig/build'")
|
|
193
|
+
.replace(/from '\.\.\/\.\.\/shape\/conf'/g, "from '@voxgig/build'")
|
|
194
|
+
.replace(/from '\.\.\/\.\.\/yml\/res_dynamo_yml'/g, "from '@voxgig/build'");
|
|
195
|
+
const version = pkgVersion(project);
|
|
196
|
+
src = '// Ejected from @voxgig/build ' + version +
|
|
197
|
+
' (env/lambda/' + name + '.ts).\n' +
|
|
198
|
+
'// This project copy now OWNS this generator: the build action uses\n' +
|
|
199
|
+
'// it instead of the package default. After editing, run:\n' +
|
|
200
|
+
'// npm run build && npm run model-build\n' +
|
|
201
|
+
'// Compare with the package version: voxgig-system template diff\n' +
|
|
202
|
+
src;
|
|
203
|
+
node_fs_1.default.mkdirSync(project.gen, { recursive: true });
|
|
204
|
+
node_fs_1.default.writeFileSync(dest, src);
|
|
205
|
+
const prov = readProvenance(project);
|
|
206
|
+
prov['code:' + name] = {
|
|
207
|
+
package: '@voxgig/build',
|
|
208
|
+
version,
|
|
209
|
+
sha256: sha256(node_fs_1.default.readFileSync(srcpath)),
|
|
210
|
+
};
|
|
211
|
+
writeProvenance(project, prov);
|
|
212
|
+
return dest;
|
|
213
|
+
}
|
|
214
|
+
// For each ejected template, report upstream drift (package version now
|
|
215
|
+
// differs from what was ejected) and show package-vs-project diffs.
|
|
216
|
+
function diffTemplates(start) {
|
|
217
|
+
const project = resolveProject(start);
|
|
218
|
+
const prov = readProvenance(project);
|
|
219
|
+
const rows = [];
|
|
220
|
+
for (const key of Object.keys(prov).sort()) {
|
|
221
|
+
const rec = prov[key];
|
|
222
|
+
const isCode = key.startsWith('code:');
|
|
223
|
+
const name = isCode ? key.substring(5) : key;
|
|
224
|
+
const pkgfile = isCode ?
|
|
225
|
+
node_path_1.default.join(project.pkg, 'env', 'lambda', name + '.ts') :
|
|
226
|
+
node_path_1.default.join(project.pkgtm, name);
|
|
227
|
+
const projfile = isCode ?
|
|
228
|
+
node_path_1.default.join(project.gen, name + '.ts') :
|
|
229
|
+
node_path_1.default.join(project.tm, name);
|
|
230
|
+
if (!node_fs_1.default.existsSync(pkgfile)) {
|
|
231
|
+
rows.push({ name: key, upstream: 'missing' });
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const upstream = sha256(node_fs_1.default.readFileSync(pkgfile)) === rec.sha256 ?
|
|
235
|
+
'unchanged' : 'changed';
|
|
236
|
+
let diff = undefined;
|
|
237
|
+
if (node_fs_1.default.existsSync(projfile)) {
|
|
238
|
+
const res = (0, node_child_process_1.spawnSync)('diff', ['-u', pkgfile, projfile], { encoding: 'utf8' });
|
|
239
|
+
diff = 0 === res.status ? '' : res.stdout;
|
|
240
|
+
}
|
|
241
|
+
rows.push({ name: key, upstream, diff });
|
|
242
|
+
}
|
|
243
|
+
return rows;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../lib/template.ts"],"names":[],"mappings":"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"}
|
package/dist/system.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Msg } from './lib/types';
|
|
2
2
|
import { Utility } from './lib/utility';
|
|
3
3
|
import { MakeSrv } from './srv/make';
|
|
4
|
-
import { addEntity, addSrv, addMsg, addFields, resolveModelFiles } from './lib/add';
|
|
4
|
+
import { addEntity, addSrv, addMsg, addFields, addEnv, resolveModelFiles } from './lib/add';
|
|
5
|
+
import { listTemplates, ejectFragment, ejectCode, diffTemplates } from './lib/template';
|
|
5
6
|
declare function messages(seneca: any, options: any, reload: any): void;
|
|
6
7
|
declare function gubuify(params: any, Gubu: any): any;
|
|
7
8
|
declare function prepare(seneca: any, require: any): void;
|
|
@@ -24,6 +25,13 @@ declare const Add: {
|
|
|
24
25
|
srv: typeof addSrv;
|
|
25
26
|
msg: typeof addMsg;
|
|
26
27
|
fields: typeof addFields;
|
|
28
|
+
env: typeof addEnv;
|
|
27
29
|
resolveModelFiles: typeof resolveModelFiles;
|
|
28
30
|
};
|
|
29
|
-
|
|
31
|
+
declare const Template: {
|
|
32
|
+
list: typeof listTemplates;
|
|
33
|
+
eject: typeof ejectFragment;
|
|
34
|
+
ejectCode: typeof ejectCode;
|
|
35
|
+
diff: typeof diffTemplates;
|
|
36
|
+
};
|
|
37
|
+
export { Add, Template, gubuify, System, MakeSrv, Utility, Local, Live, };
|
package/dist/system.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.Utility = exports.MakeSrv = exports.System = exports.Add = void 0;
|
|
7
|
+
exports.Utility = exports.MakeSrv = exports.System = exports.Template = exports.Add = void 0;
|
|
8
8
|
exports.gubuify = gubuify;
|
|
9
9
|
exports.Local = Local;
|
|
10
10
|
exports.Live = Live;
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "Utility", { enumerable: true, get: function () {
|
|
|
15
15
|
const make_1 = require("./srv/make");
|
|
16
16
|
Object.defineProperty(exports, "MakeSrv", { enumerable: true, get: function () { return make_1.MakeSrv; } });
|
|
17
17
|
const add_1 = require("./lib/add");
|
|
18
|
+
const template_1 = require("./lib/template");
|
|
18
19
|
const { srvmsgs, deep } = utility_1.Utility;
|
|
19
20
|
function messages(seneca, options, reload) {
|
|
20
21
|
let srvname = seneca.fixedargs.plugin$.name.replace(/^srv_/, '');
|
|
@@ -152,7 +153,15 @@ const Add = {
|
|
|
152
153
|
srv: add_1.addSrv,
|
|
153
154
|
msg: add_1.addMsg,
|
|
154
155
|
fields: add_1.addFields,
|
|
156
|
+
env: add_1.addEnv,
|
|
155
157
|
resolveModelFiles: add_1.resolveModelFiles,
|
|
156
158
|
};
|
|
157
159
|
exports.Add = Add;
|
|
160
|
+
const Template = {
|
|
161
|
+
list: template_1.listTemplates,
|
|
162
|
+
eject: template_1.ejectFragment,
|
|
163
|
+
ejectCode: template_1.ejectCode,
|
|
164
|
+
diff: template_1.diffTemplates,
|
|
165
|
+
};
|
|
166
|
+
exports.Template = Template;
|
|
158
167
|
//# sourceMappingURL=system.js.map
|
package/dist/system.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":";AAAA,+CAA+C;;;;;;
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":"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"}
|
package/lib/add.ts
CHANGED
|
@@ -29,7 +29,8 @@ export type ModelFiles = {
|
|
|
29
29
|
|
|
30
30
|
export type AddResult = {
|
|
31
31
|
file: string // file appended to
|
|
32
|
-
text: string // the appended block
|
|
32
|
+
text: string // the appended block ('' when skipped)
|
|
33
|
+
skipped?: boolean // true when the element already exists (no change)
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
|
|
@@ -179,6 +180,23 @@ function parseArg(arg: string, kind: string): { name: string, def: any } {
|
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
|
|
183
|
+
// The last compiled model (model.json next to the model source), used to
|
|
184
|
+
// make the add operations idempotent: an element that already exists in
|
|
185
|
+
// the compiled model is skipped rather than appended again. Formatting
|
|
186
|
+
// of the sources is irrelevant since the check is semantic. Returns null
|
|
187
|
+
// when the model has not been compiled yet (adds then simply append -
|
|
188
|
+
// aontu unification of an identical element converges anyway).
|
|
189
|
+
function compiledModel(files: ModelFiles): any {
|
|
190
|
+
const p = Path.join(files.folder, 'model.json')
|
|
191
|
+
try {
|
|
192
|
+
return JSON.parse(Fs.readFileSync(p, 'utf8'))
|
|
193
|
+
}
|
|
194
|
+
catch (e: any) {
|
|
195
|
+
return null
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
182
200
|
// Default zone for entities: the single non-sys zone shape spread already
|
|
183
201
|
// in the entity file (`<zone>: &: ...`), else 'app'.
|
|
184
202
|
function defaultZone(entFile: string): string {
|
|
@@ -207,6 +225,12 @@ function addEntity(start: string, arg: string): AddResult {
|
|
|
207
225
|
}
|
|
208
226
|
zone = zone || defaultZone(files.ent)
|
|
209
227
|
|
|
228
|
+
// Idempotent: entity already in the compiled model.
|
|
229
|
+
const model = compiledModel(files)
|
|
230
|
+
if (model?.main?.ent?.[zone]?.[name]) {
|
|
231
|
+
return { file: files.ent, text: '', skipped: true }
|
|
232
|
+
}
|
|
233
|
+
|
|
210
234
|
if (null == def.field) {
|
|
211
235
|
def.field = {}
|
|
212
236
|
}
|
|
@@ -232,6 +256,12 @@ function addSrv(start: string, arg: string): AddResult {
|
|
|
232
256
|
const files = resolveModelFiles(start)
|
|
233
257
|
const { name, def } = parseArg(arg, 'srv')
|
|
234
258
|
|
|
259
|
+
// Idempotent: service already in the compiled model.
|
|
260
|
+
const model = compiledModel(files)
|
|
261
|
+
if (model?.main?.srv?.[name]) {
|
|
262
|
+
return { file: files.srv, text: '', skipped: true }
|
|
263
|
+
}
|
|
264
|
+
|
|
235
265
|
if (null == def.in) {
|
|
236
266
|
def.in = {
|
|
237
267
|
aim: { [name]: {} },
|
|
@@ -296,6 +326,18 @@ function addMsg(start: string, arg: string): AddResult {
|
|
|
296
326
|
throw new Error('invalid msg path: ' + path.join('.'))
|
|
297
327
|
}
|
|
298
328
|
|
|
329
|
+
// Idempotent: message path already in the compiled model.
|
|
330
|
+
const model = compiledModel(files)
|
|
331
|
+
if (null != model) {
|
|
332
|
+
let node: any = model.main?.msg
|
|
333
|
+
for (const p of path) {
|
|
334
|
+
node = node?.[p]
|
|
335
|
+
}
|
|
336
|
+
if (null != node) {
|
|
337
|
+
return { file: files.msg, text: '', skipped: true }
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
299
341
|
const prefix = path.join(': ')
|
|
300
342
|
const text = 0 === Object.keys(meta).length ?
|
|
301
343
|
'\n' + prefix + ': {}' :
|
|
@@ -327,6 +369,8 @@ function addFields(start: string, entref: string, fieldargs: string[])
|
|
|
327
369
|
throw new Error('no fields given')
|
|
328
370
|
}
|
|
329
371
|
|
|
372
|
+
const model = compiledModel(files)
|
|
373
|
+
|
|
330
374
|
const out: AddResult[] = []
|
|
331
375
|
|
|
332
376
|
for (const arg of fieldargs) {
|
|
@@ -366,6 +410,12 @@ function addFields(start: string, entref: string, fieldargs: string[])
|
|
|
366
410
|
throw new Error('invalid field argument: ' + arg)
|
|
367
411
|
}
|
|
368
412
|
|
|
413
|
+
// Idempotent: field already on the entity in the compiled model.
|
|
414
|
+
if (model?.main?.ent?.[zone]?.[name]?.field?.[fname]) {
|
|
415
|
+
out.push({ file: files.ent, text: '', skipped: true })
|
|
416
|
+
continue
|
|
417
|
+
}
|
|
418
|
+
|
|
369
419
|
if (null == def.kind) {
|
|
370
420
|
def.kind = 'String'
|
|
371
421
|
}
|
|
@@ -401,5 +451,52 @@ export {
|
|
|
401
451
|
addSrv,
|
|
402
452
|
addMsg,
|
|
403
453
|
addFields,
|
|
454
|
+
addEnv,
|
|
455
|
+
ENV_KINDS,
|
|
404
456
|
fmt,
|
|
405
457
|
}
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
// The environment kinds @voxgig/build's EnvGen supports (kind defaults
|
|
461
|
+
// to the env name; an unknown kind fails generation with this list too).
|
|
462
|
+
const ENV_KINDS =
|
|
463
|
+
['local', 'basic', 'docker', 'vm', 'aws', 'azure', 'cloudflare']
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
// add env [String(name)|Jsonic(spec)]
|
|
467
|
+
// Declares a target environment in the model (main: env: <name>: {...}).
|
|
468
|
+
// Name form: `add env aws`. Spec form: `add env
|
|
469
|
+
// '{name:aws2,kind:aws,region:eu-west-1,stage:prd}'`. Appends to the
|
|
470
|
+
// model file referenced as `main: env: @"..."` when present, else to the
|
|
471
|
+
// root model file.
|
|
472
|
+
function addEnv(start: string, arg: string): AddResult {
|
|
473
|
+
const files = resolveModelFiles(start)
|
|
474
|
+
const { name, def } = parseArg(arg, 'env')
|
|
475
|
+
|
|
476
|
+
const kind = def.kind || name
|
|
477
|
+
if (!ENV_KINDS.includes(kind)) {
|
|
478
|
+
throw new Error('unknown environment kind: ' + kind +
|
|
479
|
+
' (known: ' + ENV_KINDS.join(', ') +
|
|
480
|
+
'; use {name:..., kind:...} for a custom-named env)')
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Idempotent: environment already in the compiled model.
|
|
484
|
+
const model = compiledModel(files)
|
|
485
|
+
if (model?.main?.env?.[name]) {
|
|
486
|
+
return { file: files.model, text: '', skipped: true }
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (null == def.active) {
|
|
490
|
+
def.active = true
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Target: the env model file when referenced, else the root model file.
|
|
494
|
+
const src = Fs.readFileSync(files.model, 'utf8')
|
|
495
|
+
const m = src.match(/main:\s*env:\s*@"([^"]+)"/)
|
|
496
|
+
const target = m ? Path.join(files.folder, m[1]) : files.model
|
|
497
|
+
const prefix = m ? '' : 'main: env: '
|
|
498
|
+
|
|
499
|
+
const text = '\n' + prefix + name + ': ' + fmt(def, 0)
|
|
500
|
+
|
|
501
|
+
return append(target, text)
|
|
502
|
+
}
|