@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.
@@ -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
- export { Add, gubuify, System, MakeSrv, Utility, Local, Live, };
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
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":"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"}
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
+ }