@voxgig/system 1.2.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/README.md +57 -1
- package/cmd.ts +116 -0
- package/dist/cmd.d.ts +3 -0
- package/dist/cmd.js +98 -0
- package/dist/cmd.js.map +1 -0
- package/dist/lib/add.d.ts +19 -0
- package/dist/lib/add.js +306 -0
- package/dist/lib/add.js.map +1 -0
- package/dist/lib/utility.d.ts +1 -1
- package/dist/lib/utility.js.map +1 -1
- package/dist/srv/make.js.map +1 -1
- package/dist/system.d.ts +9 -1
- package/dist/system.js +29 -6
- package/dist/system.js.map +1 -1
- package/lib/add.ts +381 -0
- package/lib/utility.ts +1 -1
- package/package.json +20 -9
- package/system.ts +33 -5
package/README.md
CHANGED
|
@@ -1,2 +1,58 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @voxgig/system
|
|
2
2
|
|
|
3
|
+
Runtime and tooling for Voxgig system projects: service loading
|
|
4
|
+
(`MakeSrv`, `Local`, `Live`), message wiring from the model (`System`),
|
|
5
|
+
and the `voxgig-system` command line.
|
|
6
|
+
|
|
7
|
+
## voxgig-system CLI
|
|
8
|
+
|
|
9
|
+
Add elements to a Voxgig system project (as created by
|
|
10
|
+
`npm create @voxgig/system`). Run inside the project (or its `backend/`
|
|
11
|
+
folder); the commands append jsonic blocks to the model source files —
|
|
12
|
+
aontu unification merges them, and your formatting and comments are
|
|
13
|
+
preserved. Run `npm run model-build` afterwards to compile.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
voxgig-system add entity [name|spec] add an entity (name may be zone/name)
|
|
17
|
+
voxgig-system add srv [name|spec] add a service
|
|
18
|
+
voxgig-system add msg [name|spec] add a message (path: thing.save.item)
|
|
19
|
+
voxgig-system add field <entity> [field...] add field(s) to an entity
|
|
20
|
+
voxgig-system add fields <entity> [field...] alias of add field
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Each element takes either a **String(name)** — an empty element of that
|
|
24
|
+
name is added — or a **Jsonic(spec)** — a jsonic definition with config
|
|
25
|
+
options:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# empty elements by name
|
|
29
|
+
voxgig-system add entity thing # zone defaults ('app', or the file's zone)
|
|
30
|
+
voxgig-system add entity shop/order # zone-qualified
|
|
31
|
+
voxgig-system add srv thing
|
|
32
|
+
voxgig-system add msg thing.get.info # 'aim' is prepended if missing
|
|
33
|
+
|
|
34
|
+
# jsonic specs with config options
|
|
35
|
+
voxgig-system add entity '{name:thing,field:{title:{kind:String}}}'
|
|
36
|
+
voxgig-system add srv '{name:pub,user:{required:false}}'
|
|
37
|
+
voxgig-system add msg "{name:thing.save.item,params:{item:{'\$\$':'Open',title:String}}}"
|
|
38
|
+
|
|
39
|
+
# fields: name | name:Kind | name:{...def} | {name:...,...def}
|
|
40
|
+
voxgig-system add field thing title 'done:Boolean' 'note:{kind:String,valid:Skip}'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Message `params` validate the full message (data usually rides under a
|
|
44
|
+
property like `item`). Gubu param objects are closed by default; mark an
|
|
45
|
+
object with `'$$': 'Open'` (the same convention as entity `valid`) to
|
|
46
|
+
allow additional properties.
|
|
47
|
+
|
|
48
|
+
The add API is also exported for programmatic use:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
const { Add } = require('@voxgig/system')
|
|
52
|
+
Add.entity(folder, 'thing')
|
|
53
|
+
Add.fields(folder, 'thing', ['title', 'done:Boolean'])
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## License
|
|
57
|
+
|
|
58
|
+
MIT. Copyright (c) Voxgig Ltd.
|
package/cmd.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* Copyright © 2026 Voxgig Ltd, MIT License. */
|
|
3
|
+
|
|
4
|
+
// voxgig-system: command line for working with a Voxgig system project.
|
|
5
|
+
//
|
|
6
|
+
// voxgig-system add entity [String(name)|Jsonic(spec)]
|
|
7
|
+
// voxgig-system add srv [String(name)|Jsonic(spec)]
|
|
8
|
+
// voxgig-system add msg [String(name)|Jsonic(spec)]
|
|
9
|
+
// voxgig-system add field <entity> [String(name)|Jsonic(spec)] ...
|
|
10
|
+
// voxgig-system add fields <entity> [String(name)|Jsonic(spec)] ...
|
|
11
|
+
//
|
|
12
|
+
// String(name): the element name - an empty element is added.
|
|
13
|
+
// Jsonic(spec): a jsonic definition of the element with config options.
|
|
14
|
+
//
|
|
15
|
+
// Run inside a project (or its backend/ folder); the model source files
|
|
16
|
+
// are found via model/model.jsonic and appended to. Run the project's
|
|
17
|
+
// model build (npm run model-build) afterwards to compile.
|
|
18
|
+
|
|
19
|
+
import { addEntity, addSrv, addMsg, addFields } from './lib/add'
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
const USAGE = `Usage: voxgig-system add <element> [args...]
|
|
23
|
+
|
|
24
|
+
add entity [name|spec] add an entity (name may be zone/name)
|
|
25
|
+
add srv [name|spec] add a service
|
|
26
|
+
add msg [name|spec] add a message (path: thing.save.item)
|
|
27
|
+
add field <entity> [field...] add field(s) to an entity
|
|
28
|
+
add fields <entity> [field...] alias of add field
|
|
29
|
+
|
|
30
|
+
name: plain element name - an empty element is added
|
|
31
|
+
spec: jsonic definition with config options, e.g.
|
|
32
|
+
add entity '{name:thing,field:{title:{kind:String}}}'
|
|
33
|
+
add srv '{name:thing,user:{required:false}}'
|
|
34
|
+
add msg '{name:thing.save.item,params:{title:String}}'
|
|
35
|
+
add field thing title 'done:Boolean' 'note:{kind:String,valid:Skip}'
|
|
36
|
+
|
|
37
|
+
Run inside the project (or backend/) folder. Then: npm run model-build
|
|
38
|
+
`
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async function main() {
|
|
42
|
+
const argv = process.argv.slice(2)
|
|
43
|
+
|
|
44
|
+
if (0 === argv.length || argv.includes('-h') || argv.includes('--help')) {
|
|
45
|
+
console.log(USAGE)
|
|
46
|
+
process.exit(0 === argv.length ? 1 : 0)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const [cmd, element, ...args] = argv
|
|
50
|
+
|
|
51
|
+
if ('add' !== cmd) {
|
|
52
|
+
console.error('voxgig-system: unknown command: ' + cmd)
|
|
53
|
+
console.log(USAGE)
|
|
54
|
+
process.exit(1)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const start = process.cwd()
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
if ('entity' === element) {
|
|
61
|
+
requireArgs(args, 1, 'add entity')
|
|
62
|
+
const res = addEntity(start, args[0])
|
|
63
|
+
report([res])
|
|
64
|
+
}
|
|
65
|
+
else if ('srv' === element) {
|
|
66
|
+
requireArgs(args, 1, 'add srv')
|
|
67
|
+
const res = addSrv(start, args[0])
|
|
68
|
+
report([res])
|
|
69
|
+
}
|
|
70
|
+
else if ('msg' === element) {
|
|
71
|
+
requireArgs(args, 1, 'add msg')
|
|
72
|
+
const res = addMsg(start, args[0])
|
|
73
|
+
report([res])
|
|
74
|
+
}
|
|
75
|
+
else if ('field' === element || 'fields' === element) {
|
|
76
|
+
requireArgs(args, 2, 'add field')
|
|
77
|
+
const res = addFields(start, args[0], args.slice(1))
|
|
78
|
+
report(res)
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.error('voxgig-system: unknown element: ' + element)
|
|
82
|
+
console.log(USAGE)
|
|
83
|
+
process.exit(1)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.log('\nNow run: npm run model-build')
|
|
87
|
+
}
|
|
88
|
+
catch (e: any) {
|
|
89
|
+
console.error('voxgig-system: ' + e.message)
|
|
90
|
+
process.exit(1)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
function requireArgs(args: string[], n: number, what: string) {
|
|
96
|
+
if (args.length < n) {
|
|
97
|
+
throw new Error(what + ': missing argument(s)')
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function report(results: { file: string, text: string }[]) {
|
|
102
|
+
for (const res of results) {
|
|
103
|
+
console.log('appended to ' + res.file + ':')
|
|
104
|
+
console.log(res.text)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if (require.main === module) {
|
|
110
|
+
main()
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
main,
|
|
116
|
+
}
|
package/dist/cmd.d.ts
ADDED
package/dist/cmd.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/* Copyright © 2026 Voxgig Ltd, MIT License. */
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.main = main;
|
|
6
|
+
// voxgig-system: command line for working with a Voxgig system project.
|
|
7
|
+
//
|
|
8
|
+
// voxgig-system add entity [String(name)|Jsonic(spec)]
|
|
9
|
+
// voxgig-system add srv [String(name)|Jsonic(spec)]
|
|
10
|
+
// voxgig-system add msg [String(name)|Jsonic(spec)]
|
|
11
|
+
// voxgig-system add field <entity> [String(name)|Jsonic(spec)] ...
|
|
12
|
+
// voxgig-system add fields <entity> [String(name)|Jsonic(spec)] ...
|
|
13
|
+
//
|
|
14
|
+
// String(name): the element name - an empty element is added.
|
|
15
|
+
// Jsonic(spec): a jsonic definition of the element with config options.
|
|
16
|
+
//
|
|
17
|
+
// Run inside a project (or its backend/ folder); the model source files
|
|
18
|
+
// are found via model/model.jsonic and appended to. Run the project's
|
|
19
|
+
// model build (npm run model-build) afterwards to compile.
|
|
20
|
+
const add_1 = require("./lib/add");
|
|
21
|
+
const USAGE = `Usage: voxgig-system add <element> [args...]
|
|
22
|
+
|
|
23
|
+
add entity [name|spec] add an entity (name may be zone/name)
|
|
24
|
+
add srv [name|spec] add a service
|
|
25
|
+
add msg [name|spec] add a message (path: thing.save.item)
|
|
26
|
+
add field <entity> [field...] add field(s) to an entity
|
|
27
|
+
add fields <entity> [field...] alias of add field
|
|
28
|
+
|
|
29
|
+
name: plain element name - an empty element is added
|
|
30
|
+
spec: jsonic definition with config options, e.g.
|
|
31
|
+
add entity '{name:thing,field:{title:{kind:String}}}'
|
|
32
|
+
add srv '{name:thing,user:{required:false}}'
|
|
33
|
+
add msg '{name:thing.save.item,params:{title:String}}'
|
|
34
|
+
add field thing title 'done:Boolean' 'note:{kind:String,valid:Skip}'
|
|
35
|
+
|
|
36
|
+
Run inside the project (or backend/) folder. Then: npm run model-build
|
|
37
|
+
`;
|
|
38
|
+
async function main() {
|
|
39
|
+
const argv = process.argv.slice(2);
|
|
40
|
+
if (0 === argv.length || argv.includes('-h') || argv.includes('--help')) {
|
|
41
|
+
console.log(USAGE);
|
|
42
|
+
process.exit(0 === argv.length ? 1 : 0);
|
|
43
|
+
}
|
|
44
|
+
const [cmd, element, ...args] = argv;
|
|
45
|
+
if ('add' !== cmd) {
|
|
46
|
+
console.error('voxgig-system: unknown command: ' + cmd);
|
|
47
|
+
console.log(USAGE);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const start = process.cwd();
|
|
51
|
+
try {
|
|
52
|
+
if ('entity' === element) {
|
|
53
|
+
requireArgs(args, 1, 'add entity');
|
|
54
|
+
const res = (0, add_1.addEntity)(start, args[0]);
|
|
55
|
+
report([res]);
|
|
56
|
+
}
|
|
57
|
+
else if ('srv' === element) {
|
|
58
|
+
requireArgs(args, 1, 'add srv');
|
|
59
|
+
const res = (0, add_1.addSrv)(start, args[0]);
|
|
60
|
+
report([res]);
|
|
61
|
+
}
|
|
62
|
+
else if ('msg' === element) {
|
|
63
|
+
requireArgs(args, 1, 'add msg');
|
|
64
|
+
const res = (0, add_1.addMsg)(start, args[0]);
|
|
65
|
+
report([res]);
|
|
66
|
+
}
|
|
67
|
+
else if ('field' === element || 'fields' === element) {
|
|
68
|
+
requireArgs(args, 2, 'add field');
|
|
69
|
+
const res = (0, add_1.addFields)(start, args[0], args.slice(1));
|
|
70
|
+
report(res);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.error('voxgig-system: unknown element: ' + element);
|
|
74
|
+
console.log(USAGE);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
console.log('\nNow run: npm run model-build');
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
console.error('voxgig-system: ' + e.message);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function requireArgs(args, n, what) {
|
|
85
|
+
if (args.length < n) {
|
|
86
|
+
throw new Error(what + ': missing argument(s)');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function report(results) {
|
|
90
|
+
for (const res of results) {
|
|
91
|
+
console.log('appended to ' + res.file + ':');
|
|
92
|
+
console.log(res.text);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (require.main === module) {
|
|
96
|
+
main();
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=cmd.js.map
|
package/dist/cmd.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd.js","sourceRoot":"","sources":["../cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ModelFiles = {
|
|
2
|
+
folder: string;
|
|
3
|
+
model: string;
|
|
4
|
+
ent: string;
|
|
5
|
+
msg: string;
|
|
6
|
+
srv: string;
|
|
7
|
+
};
|
|
8
|
+
export type AddResult = {
|
|
9
|
+
file: string;
|
|
10
|
+
text: string;
|
|
11
|
+
};
|
|
12
|
+
declare function resolveModelFolder(start: string): string;
|
|
13
|
+
declare function resolveModelFiles(start: string): ModelFiles;
|
|
14
|
+
declare function fmt(val: any, depth: number): string;
|
|
15
|
+
declare function addEntity(start: string, arg: string): AddResult;
|
|
16
|
+
declare function addSrv(start: string, arg: string): AddResult;
|
|
17
|
+
declare function addMsg(start: string, arg: string): AddResult;
|
|
18
|
+
declare function addFields(start: string, entref: string, fieldargs: string[]): AddResult[];
|
|
19
|
+
export { resolveModelFolder, resolveModelFiles, addEntity, addSrv, addMsg, addFields, fmt, };
|
package/dist/lib/add.js
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
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.resolveModelFolder = resolveModelFolder;
|
|
8
|
+
exports.resolveModelFiles = resolveModelFiles;
|
|
9
|
+
exports.addEntity = addEntity;
|
|
10
|
+
exports.addSrv = addSrv;
|
|
11
|
+
exports.addMsg = addMsg;
|
|
12
|
+
exports.addFields = addFields;
|
|
13
|
+
exports.fmt = fmt;
|
|
14
|
+
// Add elements (entity, srv, msg, field) to a Voxgig system project by
|
|
15
|
+
// appending jsonic blocks to the project's model source files. Appending
|
|
16
|
+
// works because aontu unifies repeated paths, and it preserves the user's
|
|
17
|
+
// existing formatting and comments.
|
|
18
|
+
//
|
|
19
|
+
// Each add* function takes either a String(name) - an empty element of
|
|
20
|
+
// that name is added - or a Jsonic(spec) - a jsonic definition of the
|
|
21
|
+
// element with config options.
|
|
22
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
23
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
24
|
+
const jsonic_next_1 = require("@jsonic/jsonic-next");
|
|
25
|
+
// Values emitted bare (aontu type/token names); everything else is quoted.
|
|
26
|
+
const BARE_TOKENS = ['String', 'Number', 'Boolean', 'Skip'];
|
|
27
|
+
// Locate the model folder from a starting folder: <start>/model,
|
|
28
|
+
// <start>/backend/model, or <start> itself if it holds model.jsonic.
|
|
29
|
+
function resolveModelFolder(start) {
|
|
30
|
+
const candidates = [
|
|
31
|
+
start,
|
|
32
|
+
node_path_1.default.join(start, 'model'),
|
|
33
|
+
node_path_1.default.join(start, 'backend', 'model'),
|
|
34
|
+
];
|
|
35
|
+
for (const c of candidates) {
|
|
36
|
+
if (node_fs_1.default.existsSync(node_path_1.default.join(c, 'model.jsonic'))) {
|
|
37
|
+
return c;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
throw new Error('model folder not found (looked for model.jsonic in ' +
|
|
41
|
+
candidates.join(', ') + ')');
|
|
42
|
+
}
|
|
43
|
+
// Resolve the entity/message/service source files from the @"file" refs
|
|
44
|
+
// in model.jsonic (main: ent: @"..."), falling back to conventional names.
|
|
45
|
+
function resolveModelFiles(start) {
|
|
46
|
+
const folder = resolveModelFolder(start);
|
|
47
|
+
const model = node_path_1.default.join(folder, 'model.jsonic');
|
|
48
|
+
const src = node_fs_1.default.readFileSync(model, 'utf8');
|
|
49
|
+
const ref = (key, fallback) => {
|
|
50
|
+
const m = src.match(new RegExp('main:\\s*' + key + ':\\s*@"([^"]+)"'));
|
|
51
|
+
return node_path_1.default.join(folder, m ? m[1] : fallback);
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
folder,
|
|
55
|
+
model,
|
|
56
|
+
ent: ref('ent', 'ent.jsonic'),
|
|
57
|
+
msg: ref('msg', 'msg.jsonic'),
|
|
58
|
+
srv: ref('srv', 'srv.jsonic'),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Format a value as jsonic source. Objects use multiline path-free style;
|
|
62
|
+
// known aontu tokens (String, Skip, ...) are emitted bare.
|
|
63
|
+
function fmt(val, depth) {
|
|
64
|
+
const pad = ' '.repeat(depth);
|
|
65
|
+
const padIn = ' '.repeat(depth + 1);
|
|
66
|
+
if (null == val) {
|
|
67
|
+
return 'null';
|
|
68
|
+
}
|
|
69
|
+
else if ('string' === typeof val) {
|
|
70
|
+
return BARE_TOKENS.includes(val) ? val :
|
|
71
|
+
"'" + val.replace(/'/g, "\\'") + "'";
|
|
72
|
+
}
|
|
73
|
+
else if ('object' !== typeof val) {
|
|
74
|
+
return String(val);
|
|
75
|
+
}
|
|
76
|
+
else if (Array.isArray(val)) {
|
|
77
|
+
return '[' + val.map((v) => fmt(v, depth + 1)).join(', ') + ']';
|
|
78
|
+
}
|
|
79
|
+
const entries = Object.entries(val);
|
|
80
|
+
if (0 === entries.length) {
|
|
81
|
+
return '{}';
|
|
82
|
+
}
|
|
83
|
+
return '{\n' +
|
|
84
|
+
entries.map(([k, v]) => padIn + fmtKey(k) + ': ' + fmt(v, depth + 1))
|
|
85
|
+
.join('\n') +
|
|
86
|
+
'\n' + pad + '}';
|
|
87
|
+
}
|
|
88
|
+
function fmtKey(k) {
|
|
89
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(k) ? k :
|
|
90
|
+
"'" + k.replace(/'/g, "\\'") + "'";
|
|
91
|
+
}
|
|
92
|
+
function append(file, text) {
|
|
93
|
+
const existing = node_fs_1.default.readFileSync(file, 'utf8');
|
|
94
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n';
|
|
95
|
+
node_fs_1.default.appendFileSync(file, sep + text + '\n');
|
|
96
|
+
return { file, text };
|
|
97
|
+
}
|
|
98
|
+
// Parse a name-or-spec argument. Returns { name, def } where def is the
|
|
99
|
+
// element definition object ({} for the plain-name form).
|
|
100
|
+
function parseArg(arg, kind) {
|
|
101
|
+
let parsed;
|
|
102
|
+
try {
|
|
103
|
+
parsed = (0, jsonic_next_1.Jsonic)(arg);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
throw new Error('invalid ' + kind + ' argument (jsonic parse failed): ' +
|
|
107
|
+
arg + ' - ' + e.message);
|
|
108
|
+
}
|
|
109
|
+
if ('string' === typeof parsed) {
|
|
110
|
+
return { name: parsed, def: {} };
|
|
111
|
+
}
|
|
112
|
+
if (null != parsed && 'object' === typeof parsed && !Array.isArray(parsed)) {
|
|
113
|
+
// { name: 'foo', ...def }
|
|
114
|
+
if ('string' === typeof parsed.name) {
|
|
115
|
+
const def = { ...parsed };
|
|
116
|
+
delete def.name;
|
|
117
|
+
return { name: parsed.name, def };
|
|
118
|
+
}
|
|
119
|
+
// { foo: {...def} } - single-key form
|
|
120
|
+
const keys = Object.keys(parsed);
|
|
121
|
+
if (1 === keys.length && 'object' === typeof parsed[keys[0]]) {
|
|
122
|
+
return { name: keys[0], def: parsed[keys[0]] };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
throw new Error('invalid ' + kind + ' argument: ' + arg +
|
|
126
|
+
' - provide a name, {name:...,...spec}, or {thename:{...spec}}');
|
|
127
|
+
}
|
|
128
|
+
// Default zone for entities: the single non-sys zone shape spread already
|
|
129
|
+
// in the entity file (`<zone>: &: ...`), else 'app'.
|
|
130
|
+
function defaultZone(entFile) {
|
|
131
|
+
const src = node_fs_1.default.readFileSync(entFile, 'utf8');
|
|
132
|
+
const zones = [...src.matchAll(/^([a-z][a-z0-9_]*):\s*&:/mg)]
|
|
133
|
+
.map((m) => m[1])
|
|
134
|
+
.filter((z) => 'sys' !== z);
|
|
135
|
+
const uniq = [...new Set(zones)];
|
|
136
|
+
return 1 === uniq.length ? uniq[0] : 'app';
|
|
137
|
+
}
|
|
138
|
+
// add entity [String(name)|Jsonic(spec)]
|
|
139
|
+
// Names may be zone-qualified: app/thing. Spec: { name, zone?, ...def }.
|
|
140
|
+
function addEntity(start, arg) {
|
|
141
|
+
const files = resolveModelFiles(start);
|
|
142
|
+
const { name: rawname, def } = parseArg(arg, 'entity');
|
|
143
|
+
let zone = def.zone;
|
|
144
|
+
delete def.zone;
|
|
145
|
+
let name = rawname;
|
|
146
|
+
if (rawname.includes('/')) {
|
|
147
|
+
const parts = rawname.split('/');
|
|
148
|
+
zone = parts[0];
|
|
149
|
+
name = parts[1];
|
|
150
|
+
}
|
|
151
|
+
zone = zone || defaultZone(files.ent);
|
|
152
|
+
if (null == def.field) {
|
|
153
|
+
def.field = {};
|
|
154
|
+
}
|
|
155
|
+
if (null == def.valid) {
|
|
156
|
+
def.valid = { '$$': 'Open' };
|
|
157
|
+
}
|
|
158
|
+
const src = node_fs_1.default.readFileSync(files.ent, 'utf8');
|
|
159
|
+
const shapeLine = new RegExp('^' + zone + ':\\s*&:', 'm').test(src) ? '' :
|
|
160
|
+
zone + ': &: $.main.shape.ent\n\n';
|
|
161
|
+
const text = '\n' + shapeLine +
|
|
162
|
+
zone + ': ' + name + ': ' + fmt(def, 0);
|
|
163
|
+
return append(files.ent, text);
|
|
164
|
+
}
|
|
165
|
+
// add srv [String(name)|Jsonic(spec)]
|
|
166
|
+
// The plain-name form wires the service to its aim messages and a private
|
|
167
|
+
// web area (matching the standard project scaffold).
|
|
168
|
+
function addSrv(start, arg) {
|
|
169
|
+
const files = resolveModelFiles(start);
|
|
170
|
+
const { name, def } = parseArg(arg, 'srv');
|
|
171
|
+
if (null == def.in) {
|
|
172
|
+
def.in = {
|
|
173
|
+
aim: { [name]: {} },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (null == def.user) {
|
|
177
|
+
def.user = { required: true };
|
|
178
|
+
}
|
|
179
|
+
if (null == def.api) {
|
|
180
|
+
def.api = { web: { path: { area: 'private/', suffix: '' } } };
|
|
181
|
+
}
|
|
182
|
+
if (null == def.env) {
|
|
183
|
+
def.env = { lambda: { active: true } };
|
|
184
|
+
}
|
|
185
|
+
const text = '\n' + name + ': ' + fmt(def, 0);
|
|
186
|
+
return append(files.srv, text);
|
|
187
|
+
}
|
|
188
|
+
// add msg [String(name)|Jsonic(spec)]
|
|
189
|
+
// Name form: a message path like thing.save.item (or thing:save:item);
|
|
190
|
+
// 'aim' is prepended if missing. Spec: { name: 'thing.save.item', ...meta }
|
|
191
|
+
// where meta (params, transport, file, ...) lands under the '$' key.
|
|
192
|
+
function addMsg(start, arg) {
|
|
193
|
+
const files = resolveModelFiles(start);
|
|
194
|
+
// A pure message path (thing.save.item, aim:thing:save:item) is taken
|
|
195
|
+
// as-is - jsonic would otherwise parse the colon form as a nested map.
|
|
196
|
+
const pathform = /^[a-z0-9_-]+([.:/][a-z0-9_-]+)+$/i.test(arg.trim());
|
|
197
|
+
let parsed;
|
|
198
|
+
try {
|
|
199
|
+
parsed = pathform ? arg.trim() : (0, jsonic_next_1.Jsonic)(arg);
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
throw new Error('invalid msg argument (jsonic parse failed): ' +
|
|
203
|
+
arg + ' - ' + e.message);
|
|
204
|
+
}
|
|
205
|
+
let path;
|
|
206
|
+
let meta = {};
|
|
207
|
+
if ('string' === typeof parsed) {
|
|
208
|
+
path = parsed.split(/[.:/]/).filter((p) => '' !== p);
|
|
209
|
+
}
|
|
210
|
+
else if (null != parsed && 'string' === typeof parsed.name) {
|
|
211
|
+
path = parsed.name.split(/[.:/]/).filter((p) => '' !== p);
|
|
212
|
+
meta = { ...parsed };
|
|
213
|
+
delete meta.name;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
throw new Error('invalid msg argument: ' + arg +
|
|
217
|
+
" - provide a message path like thing.save.item, or {name:'path',...meta}");
|
|
218
|
+
}
|
|
219
|
+
if ('aim' !== path[0]) {
|
|
220
|
+
path.unshift('aim');
|
|
221
|
+
}
|
|
222
|
+
if (path.length < 2) {
|
|
223
|
+
throw new Error('invalid msg path: ' + path.join('.'));
|
|
224
|
+
}
|
|
225
|
+
const prefix = path.join(': ');
|
|
226
|
+
const text = 0 === Object.keys(meta).length ?
|
|
227
|
+
'\n' + prefix + ': {}' :
|
|
228
|
+
'\n' + prefix + ": '$': " + fmt(meta, 0);
|
|
229
|
+
return append(files.msg, text);
|
|
230
|
+
}
|
|
231
|
+
// add field <entity> [String(name)|Jsonic(spec)] ...
|
|
232
|
+
// Field forms: title | title:String | title:{kind:String,valid:'Min(1)'}
|
|
233
|
+
// | {name:title,kind:String}
|
|
234
|
+
// A label is derived from the name when not given.
|
|
235
|
+
function addFields(start, entref, fieldargs) {
|
|
236
|
+
const files = resolveModelFiles(start);
|
|
237
|
+
let zone;
|
|
238
|
+
let name;
|
|
239
|
+
if (entref.includes('/')) {
|
|
240
|
+
[zone, name] = entref.split('/');
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
zone = defaultZone(files.ent);
|
|
244
|
+
name = entref;
|
|
245
|
+
}
|
|
246
|
+
if (0 === fieldargs.length) {
|
|
247
|
+
throw new Error('no fields given');
|
|
248
|
+
}
|
|
249
|
+
const out = [];
|
|
250
|
+
for (const arg of fieldargs) {
|
|
251
|
+
let parsed;
|
|
252
|
+
try {
|
|
253
|
+
parsed = (0, jsonic_next_1.Jsonic)(arg);
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
throw new Error('invalid field argument (jsonic parse failed): ' +
|
|
257
|
+
arg + ' - ' + e.message);
|
|
258
|
+
}
|
|
259
|
+
let fname;
|
|
260
|
+
let def;
|
|
261
|
+
if ('string' === typeof parsed) {
|
|
262
|
+
fname = parsed;
|
|
263
|
+
def = {};
|
|
264
|
+
}
|
|
265
|
+
else if (null != parsed && 'object' === typeof parsed) {
|
|
266
|
+
if ('string' === typeof parsed.name) {
|
|
267
|
+
fname = parsed.name;
|
|
268
|
+
def = { ...parsed };
|
|
269
|
+
delete def.name;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const keys = Object.keys(parsed);
|
|
273
|
+
if (1 !== keys.length) {
|
|
274
|
+
throw new Error('invalid field argument: ' + arg);
|
|
275
|
+
}
|
|
276
|
+
fname = keys[0];
|
|
277
|
+
const val = parsed[fname];
|
|
278
|
+
def = 'string' === typeof val ? { kind: val } : { ...val };
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
throw new Error('invalid field argument: ' + arg);
|
|
283
|
+
}
|
|
284
|
+
if (null == def.kind) {
|
|
285
|
+
def.kind = 'String';
|
|
286
|
+
}
|
|
287
|
+
if (null == def.label) {
|
|
288
|
+
def.label = fname
|
|
289
|
+
.split('_')
|
|
290
|
+
.map((p) => '' === p ? p : p[0].toUpperCase() + p.substring(1))
|
|
291
|
+
.join(' ');
|
|
292
|
+
}
|
|
293
|
+
// Emit label before kind, matching scaffold convention.
|
|
294
|
+
const ordered = { label: def.label, kind: def.kind };
|
|
295
|
+
for (const k of Object.keys(def)) {
|
|
296
|
+
if ('label' !== k && 'kind' !== k) {
|
|
297
|
+
ordered[k] = def[k];
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const text = '\n' + zone + ': ' + name + ': field: ' + fname + ': ' +
|
|
301
|
+
fmt(ordered, 0);
|
|
302
|
+
out.push(append(files.ent, text));
|
|
303
|
+
}
|
|
304
|
+
return out;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../lib/add.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/utility.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ declare function listmsgs(point?: Record<string, any>): Msg[];
|
|
|
4
4
|
declare const Utility: {
|
|
5
5
|
srvmsgs: typeof srvmsgs;
|
|
6
6
|
listmsgs: typeof listmsgs;
|
|
7
|
-
deep:
|
|
7
|
+
deep: (base?: any, ...rest: any[]) => any;
|
|
8
8
|
};
|
|
9
9
|
export { Utility };
|
package/dist/lib/utility.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utility.js","sourceRoot":"","sources":["../../lib/utility.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utility.js","sourceRoot":"","sources":["../../lib/utility.ts"],"names":[],"mappings":"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"}
|
package/dist/srv/make.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make.js","sourceRoot":"","sources":["../../srv/make.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"make.js","sourceRoot":"","sources":["../../srv/make.ts"],"names":[],"mappings":";;QAgBE,OAAO;AAfT,sCAAkC;AAElC,SAAS,OAAO,CAAC,IAAY,EAAE,OAAY;IACzC,MAAM,GAAG,GAAG,UAAoB,OAAY;QAC1C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAA;QAChD,eAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACtC,eAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,CAAA;IAE5D,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
package/dist/system.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
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
5
|
declare function messages(seneca: any, options: any, reload: any): void;
|
|
5
6
|
declare function gubuify(params: any, Gubu: any): any;
|
|
6
7
|
declare function prepare(seneca: any, require: any): void;
|
|
@@ -18,4 +19,11 @@ declare const System: {
|
|
|
18
19
|
prepare: typeof prepare;
|
|
19
20
|
};
|
|
20
21
|
export type { Msg };
|
|
21
|
-
|
|
22
|
+
declare const Add: {
|
|
23
|
+
entity: typeof addEntity;
|
|
24
|
+
srv: typeof addSrv;
|
|
25
|
+
msg: typeof addMsg;
|
|
26
|
+
fields: typeof addFields;
|
|
27
|
+
resolveModelFiles: typeof resolveModelFiles;
|
|
28
|
+
};
|
|
29
|
+
export { Add, 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 = void 0;
|
|
7
|
+
exports.Utility = exports.MakeSrv = exports.System = exports.Add = void 0;
|
|
8
8
|
exports.gubuify = gubuify;
|
|
9
9
|
exports.Local = Local;
|
|
10
10
|
exports.Live = Live;
|
|
@@ -14,6 +14,7 @@ const utility_1 = require("./lib/utility");
|
|
|
14
14
|
Object.defineProperty(exports, "Utility", { enumerable: true, get: function () { return utility_1.Utility; } });
|
|
15
15
|
const make_1 = require("./srv/make");
|
|
16
16
|
Object.defineProperty(exports, "MakeSrv", { enumerable: true, get: function () { return make_1.MakeSrv; } });
|
|
17
|
+
const add_1 = require("./lib/add");
|
|
17
18
|
const { srvmsgs, deep } = utility_1.Utility;
|
|
18
19
|
function messages(seneca, options, reload) {
|
|
19
20
|
let srvname = seneca.fixedargs.plugin$.name.replace(/^srv_/, '');
|
|
@@ -35,11 +36,28 @@ function gubuify(params, Gubu) {
|
|
|
35
36
|
if (null == params) {
|
|
36
37
|
return params;
|
|
37
38
|
}
|
|
39
|
+
return Gubu(gubuify_spec(params, Gubu));
|
|
40
|
+
}
|
|
41
|
+
// Convert model param values into a gubu spec. The '$$': 'Open' marker
|
|
42
|
+
// (same convention as entity valid) makes an object open: additional
|
|
43
|
+
// properties are allowed. Without it gubu objects are closed, which made
|
|
44
|
+
// open message params inexpressible in the model. Nested specs stay raw
|
|
45
|
+
// (builder results, not Gubu instances) so attributes like openness
|
|
46
|
+
// compose into the parent shape.
|
|
47
|
+
function gubuify_spec(params, Gubu) {
|
|
48
|
+
if (null == params) {
|
|
49
|
+
return params;
|
|
50
|
+
}
|
|
51
|
+
let open = false;
|
|
52
|
+
if ('Open' === params['$$']) {
|
|
53
|
+
open = true;
|
|
54
|
+
delete params['$$'];
|
|
55
|
+
}
|
|
38
56
|
for (let pn in params) {
|
|
39
57
|
let m = null;
|
|
40
58
|
let pv = params[pn];
|
|
41
59
|
if ('object' === typeof pv) {
|
|
42
|
-
params[pn] =
|
|
60
|
+
params[pn] = gubuify_spec(pv, Gubu);
|
|
43
61
|
}
|
|
44
62
|
else if ('string' === typeof pv &&
|
|
45
63
|
-1 === pn.indexOf(':') && ('function' === typeof Gubu[(m = ((pv.match(/\s*([A-Z]\w+)([(.\s]|$)/) || []))[1])] ||
|
|
@@ -48,11 +66,8 @@ function gubuify(params, Gubu) {
|
|
|
48
66
|
params[png] = pv;
|
|
49
67
|
delete params[pn];
|
|
50
68
|
}
|
|
51
|
-
else {
|
|
52
|
-
params[pn] = Gubu(pv);
|
|
53
|
-
}
|
|
54
69
|
}
|
|
55
|
-
return Gubu(params);
|
|
70
|
+
return open ? Gubu.Open(params) : params;
|
|
56
71
|
}
|
|
57
72
|
function actpath(msg) {
|
|
58
73
|
if (msg.meta.file) {
|
|
@@ -132,4 +147,12 @@ const System = {
|
|
|
132
147
|
prepare,
|
|
133
148
|
};
|
|
134
149
|
exports.System = System;
|
|
150
|
+
const Add = {
|
|
151
|
+
entity: add_1.addEntity,
|
|
152
|
+
srv: add_1.addSrv,
|
|
153
|
+
msg: add_1.addMsg,
|
|
154
|
+
fields: add_1.addFields,
|
|
155
|
+
resolveModelFiles: add_1.resolveModelFiles,
|
|
156
|
+
};
|
|
157
|
+
exports.Add = Add;
|
|
135
158
|
//# 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
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/* Copyright © 2026 Voxgig Ltd, MIT License. */
|
|
2
|
+
|
|
3
|
+
// Add elements (entity, srv, msg, field) to a Voxgig system project by
|
|
4
|
+
// appending jsonic blocks to the project's model source files. Appending
|
|
5
|
+
// works because aontu unifies repeated paths, and it preserves the user's
|
|
6
|
+
// existing formatting and comments.
|
|
7
|
+
//
|
|
8
|
+
// Each add* function takes either a String(name) - an empty element of
|
|
9
|
+
// that name is added - or a Jsonic(spec) - a jsonic definition of the
|
|
10
|
+
// element with config options.
|
|
11
|
+
|
|
12
|
+
import Fs from 'node:fs'
|
|
13
|
+
import Path from 'node:path'
|
|
14
|
+
|
|
15
|
+
import { Jsonic } from '@jsonic/jsonic-next'
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
// Values emitted bare (aontu type/token names); everything else is quoted.
|
|
19
|
+
const BARE_TOKENS = ['String', 'Number', 'Boolean', 'Skip']
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
export type ModelFiles = {
|
|
23
|
+
folder: string // the model folder
|
|
24
|
+
model: string // model.jsonic path
|
|
25
|
+
ent: string // entity file path
|
|
26
|
+
msg: string // message file path
|
|
27
|
+
srv: string // service file path
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type AddResult = {
|
|
31
|
+
file: string // file appended to
|
|
32
|
+
text: string // the appended block
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// Locate the model folder from a starting folder: <start>/model,
|
|
37
|
+
// <start>/backend/model, or <start> itself if it holds model.jsonic.
|
|
38
|
+
function resolveModelFolder(start: string): string {
|
|
39
|
+
const candidates = [
|
|
40
|
+
start,
|
|
41
|
+
Path.join(start, 'model'),
|
|
42
|
+
Path.join(start, 'backend', 'model'),
|
|
43
|
+
]
|
|
44
|
+
for (const c of candidates) {
|
|
45
|
+
if (Fs.existsSync(Path.join(c, 'model.jsonic'))) {
|
|
46
|
+
return c
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error('model folder not found (looked for model.jsonic in ' +
|
|
50
|
+
candidates.join(', ') + ')')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// Resolve the entity/message/service source files from the @"file" refs
|
|
55
|
+
// in model.jsonic (main: ent: @"..."), falling back to conventional names.
|
|
56
|
+
function resolveModelFiles(start: string): ModelFiles {
|
|
57
|
+
const folder = resolveModelFolder(start)
|
|
58
|
+
const model = Path.join(folder, 'model.jsonic')
|
|
59
|
+
const src = Fs.readFileSync(model, 'utf8')
|
|
60
|
+
|
|
61
|
+
const ref = (key: string, fallback: string) => {
|
|
62
|
+
const m = src.match(
|
|
63
|
+
new RegExp('main:\\s*' + key + ':\\s*@"([^"]+)"'))
|
|
64
|
+
return Path.join(folder, m ? m[1] : fallback)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
folder,
|
|
69
|
+
model,
|
|
70
|
+
ent: ref('ent', 'ent.jsonic'),
|
|
71
|
+
msg: ref('msg', 'msg.jsonic'),
|
|
72
|
+
srv: ref('srv', 'srv.jsonic'),
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
// Format a value as jsonic source. Objects use multiline path-free style;
|
|
78
|
+
// known aontu tokens (String, Skip, ...) are emitted bare.
|
|
79
|
+
function fmt(val: any, depth: number): string {
|
|
80
|
+
const pad = ' '.repeat(depth)
|
|
81
|
+
const padIn = ' '.repeat(depth + 1)
|
|
82
|
+
|
|
83
|
+
if (null == val) {
|
|
84
|
+
return 'null'
|
|
85
|
+
}
|
|
86
|
+
else if ('string' === typeof val) {
|
|
87
|
+
return BARE_TOKENS.includes(val) ? val :
|
|
88
|
+
"'" + val.replace(/'/g, "\\'") + "'"
|
|
89
|
+
}
|
|
90
|
+
else if ('object' !== typeof val) {
|
|
91
|
+
return String(val)
|
|
92
|
+
}
|
|
93
|
+
else if (Array.isArray(val)) {
|
|
94
|
+
return '[' + val.map((v) => fmt(v, depth + 1)).join(', ') + ']'
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const entries = Object.entries(val)
|
|
98
|
+
if (0 === entries.length) {
|
|
99
|
+
return '{}'
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return '{\n' +
|
|
103
|
+
entries.map(([k, v]) => padIn + fmtKey(k) + ': ' + fmt(v, depth + 1))
|
|
104
|
+
.join('\n') +
|
|
105
|
+
'\n' + pad + '}'
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function fmtKey(k: string): string {
|
|
109
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(k) ? k :
|
|
110
|
+
"'" + k.replace(/'/g, "\\'") + "'"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
function append(file: string, text: string): AddResult {
|
|
115
|
+
const existing = Fs.readFileSync(file, 'utf8')
|
|
116
|
+
const sep = existing.endsWith('\n') ? '\n' : '\n\n'
|
|
117
|
+
Fs.appendFileSync(file, sep + text + '\n')
|
|
118
|
+
return { file, text }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
// Parse a name-or-spec argument. Returns { name, def } where def is the
|
|
123
|
+
// element definition object ({} for the plain-name form).
|
|
124
|
+
function parseArg(arg: string, kind: string): { name: string, def: any } {
|
|
125
|
+
let parsed: any
|
|
126
|
+
try {
|
|
127
|
+
parsed = Jsonic(arg)
|
|
128
|
+
}
|
|
129
|
+
catch (e: any) {
|
|
130
|
+
throw new Error('invalid ' + kind + ' argument (jsonic parse failed): ' +
|
|
131
|
+
arg + ' - ' + e.message)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if ('string' === typeof parsed) {
|
|
135
|
+
return { name: parsed, def: {} }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (null != parsed && 'object' === typeof parsed && !Array.isArray(parsed)) {
|
|
139
|
+
// { name: 'foo', ...def }
|
|
140
|
+
if ('string' === typeof parsed.name) {
|
|
141
|
+
const def = { ...parsed }
|
|
142
|
+
delete def.name
|
|
143
|
+
return { name: parsed.name, def }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// { foo: {...def} } - single-key form
|
|
147
|
+
const keys = Object.keys(parsed)
|
|
148
|
+
if (1 === keys.length && 'object' === typeof parsed[keys[0]]) {
|
|
149
|
+
return { name: keys[0], def: parsed[keys[0]] }
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
throw new Error('invalid ' + kind + ' argument: ' + arg +
|
|
154
|
+
' - provide a name, {name:...,...spec}, or {thename:{...spec}}')
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
// Default zone for entities: the single non-sys zone shape spread already
|
|
159
|
+
// in the entity file (`<zone>: &: ...`), else 'app'.
|
|
160
|
+
function defaultZone(entFile: string): string {
|
|
161
|
+
const src = Fs.readFileSync(entFile, 'utf8')
|
|
162
|
+
const zones = [...src.matchAll(/^([a-z][a-z0-9_]*):\s*&:/mg)]
|
|
163
|
+
.map((m) => m[1])
|
|
164
|
+
.filter((z) => 'sys' !== z)
|
|
165
|
+
const uniq = [...new Set(zones)]
|
|
166
|
+
return 1 === uniq.length ? uniq[0] : 'app'
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
// add entity [String(name)|Jsonic(spec)]
|
|
171
|
+
// Names may be zone-qualified: app/thing. Spec: { name, zone?, ...def }.
|
|
172
|
+
function addEntity(start: string, arg: string): AddResult {
|
|
173
|
+
const files = resolveModelFiles(start)
|
|
174
|
+
const { name: rawname, def } = parseArg(arg, 'entity')
|
|
175
|
+
|
|
176
|
+
let zone = def.zone
|
|
177
|
+
delete def.zone
|
|
178
|
+
let name = rawname
|
|
179
|
+
if (rawname.includes('/')) {
|
|
180
|
+
const parts = rawname.split('/')
|
|
181
|
+
zone = parts[0]
|
|
182
|
+
name = parts[1]
|
|
183
|
+
}
|
|
184
|
+
zone = zone || defaultZone(files.ent)
|
|
185
|
+
|
|
186
|
+
if (null == def.field) {
|
|
187
|
+
def.field = {}
|
|
188
|
+
}
|
|
189
|
+
if (null == def.valid) {
|
|
190
|
+
def.valid = { '$$': 'Open' }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const src = Fs.readFileSync(files.ent, 'utf8')
|
|
194
|
+
const shapeLine = new RegExp('^' + zone + ':\\s*&:', 'm').test(src) ? '' :
|
|
195
|
+
zone + ': &: $.main.shape.ent\n\n'
|
|
196
|
+
|
|
197
|
+
const text = '\n' + shapeLine +
|
|
198
|
+
zone + ': ' + name + ': ' + fmt(def, 0)
|
|
199
|
+
|
|
200
|
+
return append(files.ent, text)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
// add srv [String(name)|Jsonic(spec)]
|
|
205
|
+
// The plain-name form wires the service to its aim messages and a private
|
|
206
|
+
// web area (matching the standard project scaffold).
|
|
207
|
+
function addSrv(start: string, arg: string): AddResult {
|
|
208
|
+
const files = resolveModelFiles(start)
|
|
209
|
+
const { name, def } = parseArg(arg, 'srv')
|
|
210
|
+
|
|
211
|
+
if (null == def.in) {
|
|
212
|
+
def.in = {
|
|
213
|
+
aim: { [name]: {} },
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (null == def.user) {
|
|
217
|
+
def.user = { required: true }
|
|
218
|
+
}
|
|
219
|
+
if (null == def.api) {
|
|
220
|
+
def.api = { web: { path: { area: 'private/', suffix: '' } } }
|
|
221
|
+
}
|
|
222
|
+
if (null == def.env) {
|
|
223
|
+
def.env = { lambda: { active: true } }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const text = '\n' + name + ': ' + fmt(def, 0)
|
|
227
|
+
|
|
228
|
+
return append(files.srv, text)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
// add msg [String(name)|Jsonic(spec)]
|
|
233
|
+
// Name form: a message path like thing.save.item (or thing:save:item);
|
|
234
|
+
// 'aim' is prepended if missing. Spec: { name: 'thing.save.item', ...meta }
|
|
235
|
+
// where meta (params, transport, file, ...) lands under the '$' key.
|
|
236
|
+
function addMsg(start: string, arg: string): AddResult {
|
|
237
|
+
const files = resolveModelFiles(start)
|
|
238
|
+
|
|
239
|
+
// A pure message path (thing.save.item, aim:thing:save:item) is taken
|
|
240
|
+
// as-is - jsonic would otherwise parse the colon form as a nested map.
|
|
241
|
+
const pathform = /^[a-z0-9_-]+([.:/][a-z0-9_-]+)+$/i.test(arg.trim())
|
|
242
|
+
|
|
243
|
+
let parsed: any
|
|
244
|
+
try {
|
|
245
|
+
parsed = pathform ? arg.trim() : Jsonic(arg)
|
|
246
|
+
}
|
|
247
|
+
catch (e: any) {
|
|
248
|
+
throw new Error('invalid msg argument (jsonic parse failed): ' +
|
|
249
|
+
arg + ' - ' + e.message)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let path: string[]
|
|
253
|
+
let meta: any = {}
|
|
254
|
+
|
|
255
|
+
if ('string' === typeof parsed) {
|
|
256
|
+
path = parsed.split(/[.:/]/).filter((p) => '' !== p)
|
|
257
|
+
}
|
|
258
|
+
else if (null != parsed && 'string' === typeof parsed.name) {
|
|
259
|
+
path = parsed.name.split(/[.:/]/).filter((p: string) => '' !== p)
|
|
260
|
+
meta = { ...parsed }
|
|
261
|
+
delete meta.name
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
throw new Error('invalid msg argument: ' + arg +
|
|
265
|
+
" - provide a message path like thing.save.item, or {name:'path',...meta}")
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if ('aim' !== path[0]) {
|
|
269
|
+
path.unshift('aim')
|
|
270
|
+
}
|
|
271
|
+
if (path.length < 2) {
|
|
272
|
+
throw new Error('invalid msg path: ' + path.join('.'))
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const prefix = path.join(': ')
|
|
276
|
+
const text = 0 === Object.keys(meta).length ?
|
|
277
|
+
'\n' + prefix + ': {}' :
|
|
278
|
+
'\n' + prefix + ": '$': " + fmt(meta, 0)
|
|
279
|
+
|
|
280
|
+
return append(files.msg, text)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
// add field <entity> [String(name)|Jsonic(spec)] ...
|
|
285
|
+
// Field forms: title | title:String | title:{kind:String,valid:'Min(1)'}
|
|
286
|
+
// | {name:title,kind:String}
|
|
287
|
+
// A label is derived from the name when not given.
|
|
288
|
+
function addFields(start: string, entref: string, fieldargs: string[])
|
|
289
|
+
: AddResult[] {
|
|
290
|
+
const files = resolveModelFiles(start)
|
|
291
|
+
|
|
292
|
+
let zone: string
|
|
293
|
+
let name: string
|
|
294
|
+
if (entref.includes('/')) {
|
|
295
|
+
[zone, name] = entref.split('/')
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
zone = defaultZone(files.ent)
|
|
299
|
+
name = entref
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (0 === fieldargs.length) {
|
|
303
|
+
throw new Error('no fields given')
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const out: AddResult[] = []
|
|
307
|
+
|
|
308
|
+
for (const arg of fieldargs) {
|
|
309
|
+
let parsed: any
|
|
310
|
+
try {
|
|
311
|
+
parsed = Jsonic(arg)
|
|
312
|
+
}
|
|
313
|
+
catch (e: any) {
|
|
314
|
+
throw new Error('invalid field argument (jsonic parse failed): ' +
|
|
315
|
+
arg + ' - ' + e.message)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
let fname: string
|
|
319
|
+
let def: any
|
|
320
|
+
|
|
321
|
+
if ('string' === typeof parsed) {
|
|
322
|
+
fname = parsed
|
|
323
|
+
def = {}
|
|
324
|
+
}
|
|
325
|
+
else if (null != parsed && 'object' === typeof parsed) {
|
|
326
|
+
if ('string' === typeof parsed.name) {
|
|
327
|
+
fname = parsed.name
|
|
328
|
+
def = { ...parsed }
|
|
329
|
+
delete def.name
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
const keys = Object.keys(parsed)
|
|
333
|
+
if (1 !== keys.length) {
|
|
334
|
+
throw new Error('invalid field argument: ' + arg)
|
|
335
|
+
}
|
|
336
|
+
fname = keys[0]
|
|
337
|
+
const val = parsed[fname]
|
|
338
|
+
def = 'string' === typeof val ? { kind: val } : { ...val }
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
throw new Error('invalid field argument: ' + arg)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (null == def.kind) {
|
|
346
|
+
def.kind = 'String'
|
|
347
|
+
}
|
|
348
|
+
if (null == def.label) {
|
|
349
|
+
def.label = fname
|
|
350
|
+
.split('_')
|
|
351
|
+
.map((p: string) => '' === p ? p : p[0].toUpperCase() + p.substring(1))
|
|
352
|
+
.join(' ')
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Emit label before kind, matching scaffold convention.
|
|
356
|
+
const ordered: any = { label: def.label, kind: def.kind }
|
|
357
|
+
for (const k of Object.keys(def)) {
|
|
358
|
+
if ('label' !== k && 'kind' !== k) {
|
|
359
|
+
ordered[k] = def[k]
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const text = '\n' + zone + ': ' + name + ': field: ' + fname + ': ' +
|
|
364
|
+
fmt(ordered, 0)
|
|
365
|
+
|
|
366
|
+
out.push(append(files.ent, text))
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return out
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
export {
|
|
374
|
+
resolveModelFolder,
|
|
375
|
+
resolveModelFiles,
|
|
376
|
+
addEntity,
|
|
377
|
+
addSrv,
|
|
378
|
+
addMsg,
|
|
379
|
+
addFields,
|
|
380
|
+
fmt,
|
|
381
|
+
}
|
package/lib/utility.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voxgig/system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"main": "dist/system.js",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"types": "dist/system.d.ts",
|
|
@@ -25,29 +25,40 @@
|
|
|
25
25
|
"reset": "npm run clean && npm i && npm run build && npm test",
|
|
26
26
|
"repo-tag": "REPO_VERSION=`node -e \"console.log(require('./package').version)\"` && echo TAG: v$REPO_VERSION && git commit -a -m v$REPO_VERSION && git push && git tag v$REPO_VERSION && git push --tags;",
|
|
27
27
|
"repo-publish": "npm run clean && npm i && npm run repo-publish-quick",
|
|
28
|
-
"repo-publish-quick": "npm run build && npm run test && npm run repo-tag && npm publish
|
|
28
|
+
"repo-publish-quick": "npm run build && npm run test && npm run repo-tag && npm run repo-stage-publish",
|
|
29
|
+
"repo-stage-publish": "aql vault exec --for=npm vxg:pub01 -- npm stage publish --registry https://registry.npmjs.org --access=public",
|
|
30
|
+
"repo-stage-publish-dry": "aql vault exec --dry-run --for=npm vxg:pub01 -- npm stage publish --registry https://registry.npmjs.org --access=public --dry-run",
|
|
31
|
+
"repo-stage-list": "aql vault exec --for=npm vxg:pub01 -- npm stage list",
|
|
32
|
+
"repo-stage-view": "aql vault exec --for=npm vxg:pub01 -- npm stage view",
|
|
33
|
+
"repo-stage-approve": "aql vault exec --for=npm vxg:pub01 -- npm stage approve",
|
|
34
|
+
"repo-stage-reject": "aql vault exec --for=npm vxg:pub01 -- npm stage reject"
|
|
29
35
|
},
|
|
30
36
|
"license": "MIT",
|
|
31
37
|
"files": [
|
|
32
38
|
"system.ts",
|
|
39
|
+
"cmd.ts",
|
|
33
40
|
"lib",
|
|
34
41
|
"srv",
|
|
35
42
|
"dist",
|
|
36
43
|
"LICENSE"
|
|
37
44
|
],
|
|
38
45
|
"devDependencies": {
|
|
39
|
-
"@types/jest": "^
|
|
46
|
+
"@types/jest": "^30.0.0",
|
|
47
|
+
"@types/node": "^22.20.1",
|
|
40
48
|
"es-jest": "^2.1.0",
|
|
41
|
-
"esbuild": "^0.
|
|
42
|
-
"gubu": "^
|
|
43
|
-
"jest": "^
|
|
44
|
-
"typescript": "^
|
|
49
|
+
"esbuild": "^0.28.1",
|
|
50
|
+
"gubu": "^9.0.0",
|
|
51
|
+
"jest": "^30.4.2",
|
|
52
|
+
"typescript": "^7.0.2"
|
|
45
53
|
},
|
|
46
54
|
"peerDependencies": {
|
|
47
55
|
"@voxgig/model": ">=2"
|
|
48
56
|
},
|
|
49
57
|
"dependencies": {
|
|
50
|
-
"@jsonic/jsonic-next": "^2.
|
|
51
|
-
"patrun": "^7.
|
|
58
|
+
"@jsonic/jsonic-next": "^2.14.0",
|
|
59
|
+
"patrun": "^7.3.0"
|
|
60
|
+
},
|
|
61
|
+
"bin": {
|
|
62
|
+
"voxgig-system": "dist/cmd.js"
|
|
52
63
|
}
|
|
53
64
|
}
|
package/system.ts
CHANGED
|
@@ -13,6 +13,8 @@ import { Utility } from './lib/utility'
|
|
|
13
13
|
|
|
14
14
|
import { MakeSrv } from './srv/make'
|
|
15
15
|
|
|
16
|
+
import { addEntity, addSrv, addMsg, addFields, resolveModelFiles } from './lib/add'
|
|
17
|
+
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
const { srvmsgs, deep } = Utility
|
|
@@ -45,12 +47,32 @@ function gubuify(params: any, Gubu: any) {
|
|
|
45
47
|
if (null == params) {
|
|
46
48
|
return params
|
|
47
49
|
}
|
|
50
|
+
return Gubu(gubuify_spec(params, Gubu))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// Convert model param values into a gubu spec. The '$$': 'Open' marker
|
|
55
|
+
// (same convention as entity valid) makes an object open: additional
|
|
56
|
+
// properties are allowed. Without it gubu objects are closed, which made
|
|
57
|
+
// open message params inexpressible in the model. Nested specs stay raw
|
|
58
|
+
// (builder results, not Gubu instances) so attributes like openness
|
|
59
|
+
// compose into the parent shape.
|
|
60
|
+
function gubuify_spec(params: any, Gubu: any): any {
|
|
61
|
+
if (null == params) {
|
|
62
|
+
return params
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let open = false
|
|
66
|
+
if ('Open' === params['$$']) {
|
|
67
|
+
open = true
|
|
68
|
+
delete params['$$']
|
|
69
|
+
}
|
|
48
70
|
|
|
49
71
|
for (let pn in params) {
|
|
50
72
|
let m = null
|
|
51
73
|
let pv = params[pn]
|
|
52
74
|
if ('object' === typeof pv) {
|
|
53
|
-
params[pn] =
|
|
75
|
+
params[pn] = gubuify_spec(pv, Gubu)
|
|
54
76
|
}
|
|
55
77
|
else if (
|
|
56
78
|
'string' === typeof pv &&
|
|
@@ -63,11 +85,8 @@ function gubuify(params: any, Gubu: any) {
|
|
|
63
85
|
params[png] = pv
|
|
64
86
|
delete params[pn]
|
|
65
87
|
}
|
|
66
|
-
else {
|
|
67
|
-
params[pn] = Gubu(pv)
|
|
68
|
-
}
|
|
69
88
|
}
|
|
70
|
-
return Gubu(params)
|
|
89
|
+
return open ? Gubu.Open(params) : params
|
|
71
90
|
}
|
|
72
91
|
|
|
73
92
|
|
|
@@ -197,7 +216,16 @@ export type {
|
|
|
197
216
|
Msg
|
|
198
217
|
}
|
|
199
218
|
|
|
219
|
+
const Add = {
|
|
220
|
+
entity: addEntity,
|
|
221
|
+
srv: addSrv,
|
|
222
|
+
msg: addMsg,
|
|
223
|
+
fields: addFields,
|
|
224
|
+
resolveModelFiles,
|
|
225
|
+
}
|
|
226
|
+
|
|
200
227
|
export {
|
|
228
|
+
Add,
|
|
201
229
|
gubuify,
|
|
202
230
|
System,
|
|
203
231
|
MakeSrv,
|