@voxgig/system 1.14.0 → 1.15.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.
@@ -34,19 +34,18 @@ 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).
37
+ // A message definition declares its pattern as a LIST, so it is told apart
38
+ // from a chain node - whose values are always maps, the next pattern level or
39
+ // the '$' leaf - even when spelled `pat:`. Same discriminator @voxgig/model
40
+ // validates the declared shape with.
42
41
  function ismsgdef(val) {
43
42
  return null != val && 'object' === typeof val &&
44
43
  !Array.isArray(val) && Array.isArray(val.pat);
45
44
  }
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.
45
+ // The pattern pairs of a definition, in the walker's path form. A malformed
46
+ // pair is skipped rather than thrown on: @voxgig/model fails the build on
47
+ // those, so one reaching here means the model came from somewhere else, and
48
+ // dropping it degrades better than crashing srv startup.
50
49
  function msgdefpath(def) {
51
50
  let path = [];
52
51
  for (let pair of def.pat) {
@@ -61,22 +60,29 @@ function msgdefpath(def) {
61
60
  return path;
62
61
  }
63
62
  function walkmsgs(point, path, handle) {
64
- let entries = 'object' === typeof point ?
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);
63
+ // THE DECLARED SHAPE: main.msg is a LIST of definitions, each carrying its
64
+ // pattern as data rather than as its position in the tree.
65
+ //
66
+ // A list rather than a map keyed by message name, because a gateway proxy
67
+ // and the message it forwards to necessarily share their last pattern pair
68
+ // (aim:web,on:todo,save:item proxies aim:todo,save:item), so any key derived
69
+ // from that pair would collide and the two could not both be declared. A
70
+ // list has no key, so the question never arises - and the action file still
71
+ // comes from the last pair, or from `file`, exactly as before.
72
+ if (Array.isArray(point)) {
73
+ for (let def of point) {
74
+ if (ismsgdef(def)) {
75
+ let meta = { ...def };
76
+ delete meta.pat;
77
+ handle(path.concat(msgdefpath(def)), meta);
78
+ }
78
79
  }
80
+ return;
79
81
  }
82
+ // THE LEGACY CHAIN: the nesting is the pattern, consumed two levels at a
83
+ // time, with '$' carrying the metadata. Unchanged.
84
+ let points = 'object' === typeof point ?
85
+ Object.entries(point).filter(entry => !entry[0].includes('$')) : [];
80
86
  for (let step of points) {
81
87
  let key = step[0];
82
88
  // TODO: capture error log if step[1] empty (key with no vals)
@@ -84,13 +90,8 @@ function walkmsgs(point, path, handle) {
84
90
  walkmsgs(step[1][val], path.concat([[key, val]]), handle);
85
91
  }
86
92
  }
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.$) {
93
+ // if any $ meta props, or no points, we found a msg
94
+ if (0 === points.length || point.$) {
94
95
  const meta = point.$ || {};
95
96
  handle(path, meta);
96
97
  }
@@ -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/lib/utility.ts CHANGED
@@ -49,21 +49,20 @@ 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).
52
+ // A message definition declares its pattern as a LIST, so it is told apart
53
+ // from a chain node - whose values are always maps, the next pattern level or
54
+ // the '$' leaf - even when spelled `pat:`. Same discriminator @voxgig/model
55
+ // validates the declared shape with.
57
56
  function ismsgdef(val: any): boolean {
58
57
  return null != val && 'object' === typeof val &&
59
58
  !Array.isArray(val) && Array.isArray(val.pat)
60
59
  }
61
60
 
62
61
 
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.
62
+ // The pattern pairs of a definition, in the walker's path form. A malformed
63
+ // pair is skipped rather than thrown on: @voxgig/model fails the build on
64
+ // those, so one reaching here means the model came from somewhere else, and
65
+ // dropping it degrades better than crashing srv startup.
67
66
  function msgdefpath(def: Record<string, any>): string[][] {
68
67
  let path: string[][] = []
69
68
 
@@ -86,24 +85,30 @@ function walkmsgs(
86
85
  path: string[][],
87
86
  handle: (path: string[][], meta: any) => void) {
88
87
 
89
- let entries = 'object' === typeof point ?
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)
88
+ // THE DECLARED SHAPE: main.msg is a LIST of definitions, each carrying its
89
+ // pattern as data rather than as its position in the tree.
90
+ //
91
+ // A list rather than a map keyed by message name, because a gateway proxy
92
+ // and the message it forwards to necessarily share their last pattern pair
93
+ // (aim:web,on:todo,save:item proxies aim:todo,save:item), so any key derived
94
+ // from that pair would collide and the two could not both be declared. A
95
+ // list has no key, so the question never arises - and the action file still
96
+ // comes from the last pair, or from `file`, exactly as before.
97
+ if (Array.isArray(point)) {
98
+ for (let def of point) {
99
+ if (ismsgdef(def)) {
100
+ let meta = { ...def }
101
+ delete meta.pat
102
+ handle(path.concat(msgdefpath(def)), meta)
103
+ }
104
104
  }
105
+ return
105
106
  }
106
107
 
108
+ // THE LEGACY CHAIN: the nesting is the pattern, consumed two levels at a
109
+ // time, with '$' carrying the metadata. Unchanged.
110
+ let points = 'object' === typeof point ?
111
+ Object.entries(point).filter(entry => !entry[0].includes('$')) : []
107
112
  for (let step of points) {
108
113
  let key = step[0]
109
114
  // TODO: capture error log if step[1] empty (key with no vals)
@@ -112,13 +117,8 @@ function walkmsgs(
112
117
  }
113
118
  }
114
119
 
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.$) {
120
+ // if any $ meta props, or no points, we found a msg
121
+ if (0 === points.length || point.$) {
122
122
  const meta = point.$ || {}
123
123
  handle(path, meta)
124
124
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxgig/system",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "main": "dist/system.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/system.d.ts",