@voxgig/system 1.13.1 → 1.14.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/dist/lib/utility.js +48 -3
- package/dist/lib/utility.js.map +1 -1
- package/lib/utility.ts +56 -3
- package/package.json +1 -1
package/dist/lib/utility.js
CHANGED
|
@@ -34,9 +34,49 @@ function listmsgs(point) {
|
|
|
34
34
|
});
|
|
35
35
|
return msgs;
|
|
36
36
|
}
|
|
37
|
+
// A message definition declares its pattern as a LIST; a chain node never
|
|
38
|
+
// does, because every value in a chain node is a map - the next pattern level,
|
|
39
|
+
// or the '$' leaf. So this tells the two shapes apart even for a legacy
|
|
40
|
+
// pattern pair spelled `pat:`. It is the same discriminator @voxgig/model
|
|
41
|
+
// validates the declared shape with (see its producer/msg.ts).
|
|
42
|
+
function ismsgdef(val) {
|
|
43
|
+
return null != val && 'object' === typeof val &&
|
|
44
|
+
!Array.isArray(val) && Array.isArray(val.pat);
|
|
45
|
+
}
|
|
46
|
+
// The pattern pairs of a declared-shape definition, in the walker's path form.
|
|
47
|
+
// A malformed pair is skipped rather than thrown on: @voxgig/model fails the
|
|
48
|
+
// build on those, so one reaching here means the model came from somewhere
|
|
49
|
+
// else, and dropping it degrades better than crashing srv startup.
|
|
50
|
+
function msgdefpath(def) {
|
|
51
|
+
let path = [];
|
|
52
|
+
for (let pair of def.pat) {
|
|
53
|
+
if (null == pair || 'object' !== typeof pair || Array.isArray(pair)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
let keys = Object.keys(pair);
|
|
57
|
+
if (1 === keys.length) {
|
|
58
|
+
path.push([keys[0], pair[keys[0]]]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return path;
|
|
62
|
+
}
|
|
37
63
|
function walkmsgs(point, path, handle) {
|
|
38
|
-
let
|
|
64
|
+
let entries = 'object' === typeof point ?
|
|
39
65
|
Object.entries(point).filter(entry => !entry[0].includes('$')) : [];
|
|
66
|
+
// A declared-shape definition carries its pattern as data, so it IS a
|
|
67
|
+
// message here, not a node to descend into. Everything else is a chain node
|
|
68
|
+
// and walks as before, which is what lets both shapes appear in one model.
|
|
69
|
+
let points = [];
|
|
70
|
+
for (let entry of entries) {
|
|
71
|
+
if (ismsgdef(entry[1])) {
|
|
72
|
+
let meta = { ...entry[1] };
|
|
73
|
+
delete meta.pat;
|
|
74
|
+
handle(path.concat(msgdefpath(entry[1])), meta);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
points.push(entry);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
40
80
|
for (let step of points) {
|
|
41
81
|
let key = step[0];
|
|
42
82
|
// TODO: capture error log if step[1] empty (key with no vals)
|
|
@@ -44,8 +84,13 @@ function walkmsgs(point, path, handle) {
|
|
|
44
84
|
walkmsgs(step[1][val], path.concat([[key, val]]), handle);
|
|
45
85
|
}
|
|
46
86
|
}
|
|
47
|
-
// if any $ meta props, or
|
|
48
|
-
|
|
87
|
+
// if any $ meta props, or nothing here at all, we found a msg.
|
|
88
|
+
//
|
|
89
|
+
// This asks about ENTRIES, not the chain nodes among them: a node holding
|
|
90
|
+
// only declared-shape definitions is a container, and must not also emit a
|
|
91
|
+
// patternless message of its own. With no definitions present the two are
|
|
92
|
+
// the same set, so legacy models walk exactly as before.
|
|
93
|
+
if (0 === entries.length || point.$) {
|
|
49
94
|
const meta = point.$ || {};
|
|
50
95
|
handle(path, meta);
|
|
51
96
|
}
|
package/dist/lib/utility.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utility.js","sourceRoot":"","sources":["../../lib/utility.ts"],"names":[],"mappings":";AAAA,+CAA+C;;;;;;AAO/C,2CAAqC;AAIrC,oDAA2B;AAG3B,yCAAyC;AACzC,SAAS,OAAO,CAAC,GAAwB,EAAE,KAA0B;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,IAAA,gBAAM,EAAC,EAAE,CAAC,CAAA;IACzB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAEzD,yDAAyD;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAClD,MAAM,OAAO,GAAU,EAAE,CAAA;IACzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAI,MAAM;SACf,IAAI,CAAC,GAAG,CAAC;SACT,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAW,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAEnD,OAAO,OAAO,CAAA;AAChB,CAAC;AAGD,SAAS,QAAQ,CAAC,KAA2B;IAC3C,IAAI,IAAI,IAAI,KAAK;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,IAAI,GAAU,EAAE,CAAA;IAEpB,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,IAAgB,EAAE,IAAS,EAAE,EAAE;QAClD,IAAI,GAAG,GAAG;YACR,OAAO,EACL,IAAI,CAAC,GAAG,CAAC,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACjE,KAAK,EACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACxE,IAAI;SACL,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC;AAGD,SAAS,QAAQ,CACf,KAA0B,EAC1B,IAAgB,EAChB,MAA6C;IAE7C,IAAI,
|
|
1
|
+
{"version":3,"file":"utility.js","sourceRoot":"","sources":["../../lib/utility.ts"],"names":[],"mappings":"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"}
|
package/lib/utility.ts
CHANGED
|
@@ -49,13 +49,61 @@ function listmsgs(point?: Record<string, any>): Msg[] {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
// A message definition declares its pattern as a LIST; a chain node never
|
|
53
|
+
// does, because every value in a chain node is a map - the next pattern level,
|
|
54
|
+
// or the '$' leaf. So this tells the two shapes apart even for a legacy
|
|
55
|
+
// pattern pair spelled `pat:`. It is the same discriminator @voxgig/model
|
|
56
|
+
// validates the declared shape with (see its producer/msg.ts).
|
|
57
|
+
function ismsgdef(val: any): boolean {
|
|
58
|
+
return null != val && 'object' === typeof val &&
|
|
59
|
+
!Array.isArray(val) && Array.isArray(val.pat)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
// The pattern pairs of a declared-shape definition, in the walker's path form.
|
|
64
|
+
// A malformed pair is skipped rather than thrown on: @voxgig/model fails the
|
|
65
|
+
// build on those, so one reaching here means the model came from somewhere
|
|
66
|
+
// else, and dropping it degrades better than crashing srv startup.
|
|
67
|
+
function msgdefpath(def: Record<string, any>): string[][] {
|
|
68
|
+
let path: string[][] = []
|
|
69
|
+
|
|
70
|
+
for (let pair of def.pat) {
|
|
71
|
+
if (null == pair || 'object' !== typeof pair || Array.isArray(pair)) {
|
|
72
|
+
continue
|
|
73
|
+
}
|
|
74
|
+
let keys = Object.keys(pair)
|
|
75
|
+
if (1 === keys.length) {
|
|
76
|
+
path.push([keys[0], pair[keys[0]]])
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return path
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
52
84
|
function walkmsgs(
|
|
53
85
|
point: Record<string, any>,
|
|
54
86
|
path: string[][],
|
|
55
87
|
handle: (path: string[][], meta: any) => void) {
|
|
56
88
|
|
|
57
|
-
let
|
|
89
|
+
let entries = 'object' === typeof point ?
|
|
58
90
|
Object.entries(point).filter(entry => !entry[0].includes('$')) : []
|
|
91
|
+
|
|
92
|
+
// A declared-shape definition carries its pattern as data, so it IS a
|
|
93
|
+
// message here, not a node to descend into. Everything else is a chain node
|
|
94
|
+
// and walks as before, which is what lets both shapes appear in one model.
|
|
95
|
+
let points: [string, any][] = []
|
|
96
|
+
for (let entry of entries) {
|
|
97
|
+
if (ismsgdef(entry[1])) {
|
|
98
|
+
let meta = { ...entry[1] }
|
|
99
|
+
delete meta.pat
|
|
100
|
+
handle(path.concat(msgdefpath(entry[1])), meta)
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
points.push(entry)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
59
107
|
for (let step of points) {
|
|
60
108
|
let key = step[0]
|
|
61
109
|
// TODO: capture error log if step[1] empty (key with no vals)
|
|
@@ -64,8 +112,13 @@ function walkmsgs(
|
|
|
64
112
|
}
|
|
65
113
|
}
|
|
66
114
|
|
|
67
|
-
// if any $ meta props, or
|
|
68
|
-
|
|
115
|
+
// if any $ meta props, or nothing here at all, we found a msg.
|
|
116
|
+
//
|
|
117
|
+
// This asks about ENTRIES, not the chain nodes among them: a node holding
|
|
118
|
+
// only declared-shape definitions is a container, and must not also emit a
|
|
119
|
+
// patternless message of its own. With no definitions present the two are
|
|
120
|
+
// the same set, so legacy models walk exactly as before.
|
|
121
|
+
if (0 === entries.length || point.$) {
|
|
69
122
|
const meta = point.$ || {}
|
|
70
123
|
handle(path, meta)
|
|
71
124
|
}
|