theprogrammablemind_4wp 7.10.0-beta.14 → 7.10.0-beta.16
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/client.js +254 -257
- package/demo.js +24 -24
- package/lines.js +2 -2
- package/package.json +1 -1
- package/runtime.js +12 -12
- package/src/config.js +233 -239
- package/src/digraph.js +9 -9
- package/src/digraph_internal.js +6 -6
- package/src/flatten.js +1 -1
- package/src/generators.js +41 -43
- package/src/helpers.js +57 -58
- package/src/project.js +6 -8
- package/src/semantics.js +40 -42
- package/src/unflatten.js +7 -7
package/src/config.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
// lookup = (name) => returns <config>
|
2
2
|
const { Semantics, normalizeGenerator } = require('./semantics')
|
3
3
|
const { Generators } = require('./generators')
|
4
|
-
const { v4
|
4
|
+
const { v4: uuidv4 } = require('uuid')
|
5
5
|
const client = require('../client')
|
6
6
|
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
@@ -19,7 +19,7 @@ const bags = [
|
|
19
19
|
]
|
20
20
|
|
21
21
|
const indent = (string, indent) => {
|
22
|
-
|
22
|
+
return string.replace(/^/gm, ' '.repeat(indent))
|
23
23
|
}
|
24
24
|
|
25
25
|
const config_toServer = (config) => {
|
@@ -29,7 +29,7 @@ const config_toServer = (config) => {
|
|
29
29
|
const debugPriority = (priority) => {
|
30
30
|
if (global.entodictonDebugPriority) {
|
31
31
|
if (helpers.subPriority(entodictonDebugPriority, priority)) {
|
32
|
-
debugger
|
32
|
+
debugger // debug hierarchy hit
|
33
33
|
}
|
34
34
|
}
|
35
35
|
}
|
@@ -37,7 +37,7 @@ const debugPriority = (priority) => {
|
|
37
37
|
const debugAssociation = (association) => {
|
38
38
|
if (global.entodictonDebugAssociation) {
|
39
39
|
if (helpers.safeEquals(global.entodictonDebugAssociation, association)) {
|
40
|
-
debugger
|
40
|
+
debugger // debug association hit
|
41
41
|
}
|
42
42
|
}
|
43
43
|
}
|
@@ -45,15 +45,15 @@ const debugAssociation = (association) => {
|
|
45
45
|
const debugHierarchy = (pair) => {
|
46
46
|
if (global.entodictonDebugHierarchy) {
|
47
47
|
if (helpers.safeEquals(global.entodictonDebugHierarchy, pair)) {
|
48
|
-
debugger
|
48
|
+
debugger // debug hierarchy hit
|
49
49
|
}
|
50
50
|
}
|
51
51
|
}
|
52
52
|
|
53
|
-
const debugBridge = (bridge) => {
|
53
|
+
const debugBridge = (bridge) => {
|
54
54
|
if (global.entodictonDebugBridge) {
|
55
55
|
if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
|
56
|
-
debugger
|
56
|
+
debugger // debug hierarchy hit
|
57
57
|
}
|
58
58
|
}
|
59
59
|
}
|
@@ -61,7 +61,7 @@ const debugBridge = (bridge) => {
|
|
61
61
|
const debugOperator = (operator) => {
|
62
62
|
if (global.entodictonDebugOperator) {
|
63
63
|
if ((operator.pattern || operator) === global.entodictonDebugOperator) {
|
64
|
-
debugger
|
64
|
+
debugger // debug operator hit
|
65
65
|
}
|
66
66
|
}
|
67
67
|
}
|
@@ -75,7 +75,7 @@ const debugConfigProps = (config) => {
|
|
75
75
|
{ property: 'association', check: (v) => debugAssociation(v) },
|
76
76
|
{ property: 'hierarchy', check: (v) => debugHierarchy(v) },
|
77
77
|
{ property: 'operators', check: (v) => debugOperator(v) },
|
78
|
-
{ property: 'bridges', check: (v) => debugBridge(v) }
|
78
|
+
{ property: 'bridges', check: (v) => debugBridge(v) }
|
79
79
|
]
|
80
80
|
for (const { property, check } of checkProps) {
|
81
81
|
if (config[property]) {
|
@@ -87,21 +87,21 @@ const debugConfigProps = (config) => {
|
|
87
87
|
}
|
88
88
|
|
89
89
|
const validConfigProps = (config) => {
|
90
|
-
const valid = [
|
91
|
-
'hierarchy',
|
92
|
-
'objects',
|
93
|
-
'bridges',
|
94
|
-
'operators',
|
95
|
-
'words',
|
96
|
-
'priorities',
|
97
|
-
'associations',
|
98
|
-
'name',
|
99
|
-
'version',
|
100
|
-
'generatorp',
|
101
|
-
'generators',
|
102
|
-
'semantics',
|
103
|
-
'where',
|
104
|
-
'floaters',
|
90
|
+
const valid = [
|
91
|
+
'hierarchy',
|
92
|
+
'objects',
|
93
|
+
'bridges',
|
94
|
+
'operators',
|
95
|
+
'words',
|
96
|
+
'priorities',
|
97
|
+
'associations',
|
98
|
+
'name',
|
99
|
+
'version',
|
100
|
+
'generatorp',
|
101
|
+
'generators',
|
102
|
+
'semantics',
|
103
|
+
'where',
|
104
|
+
'floaters',
|
105
105
|
'debug',
|
106
106
|
|
107
107
|
// TODO Fix these from the test app
|
@@ -116,7 +116,7 @@ const validConfigProps = (config) => {
|
|
116
116
|
'flatten',
|
117
117
|
|
118
118
|
'namespaces',
|
119
|
-
'eqClasses'
|
119
|
+
'eqClasses'
|
120
120
|
]
|
121
121
|
helpers.validProps(valid, config, 'config')
|
122
122
|
}
|
@@ -134,30 +134,29 @@ const setupInitializerFNArgs = (config, args) => {
|
|
134
134
|
config: config.getPseudoConfig(args.uuid, args.currentConfig),
|
135
135
|
km,
|
136
136
|
baseConfig: config,
|
137
|
-
apis
|
137
|
+
apis
|
138
138
|
}
|
139
139
|
}
|
140
140
|
|
141
141
|
const operatorKey_valid = (key) => {
|
142
142
|
if (
|
143
|
-
|
143
|
+
!_.isArray(key) ||
|
144
144
|
key.length != 2 ||
|
145
145
|
!_.isString(key[0]) ||
|
146
146
|
!_.isInteger(key[1]) ||
|
147
147
|
key[1] < 0
|
148
|
-
|
149
|
-
|
148
|
+
) {
|
150
149
|
let details = ''
|
151
150
|
if (!_.isArray(key)) {
|
152
|
-
details =
|
151
|
+
details = 'Expected an array.'
|
153
152
|
} else if (key.length != 2) {
|
154
|
-
details =
|
153
|
+
details = 'Expected an array of length two.'
|
155
154
|
} else if (!_.isString(key[0])) {
|
156
|
-
details =
|
155
|
+
details = 'Expected element zero to be a string that is an operator id.'
|
157
156
|
} else if (!_.isInteger(key[1])) {
|
158
|
-
details =
|
157
|
+
details = 'Expected element one to be a number that is an operator level.'
|
159
158
|
} else if (key[1] < 0) {
|
160
|
-
details =
|
159
|
+
details = 'Expected element one to be a number that is an operator level which is greater than zero.'
|
161
160
|
}
|
162
161
|
throw new Error(`${JSON.stringify(key)} is not a valid operator key. Values are of the form [<operatorId>, <operatorLevel>]. ${details}`)
|
163
162
|
}
|
@@ -167,13 +166,13 @@ const elist = (list, check, prefix) => {
|
|
167
166
|
for ([index, element] of list.entries()) {
|
168
167
|
try {
|
169
168
|
check(element)
|
170
|
-
} catch(
|
169
|
+
} catch (e) {
|
171
170
|
throw new Error(prefix(index, e))
|
172
171
|
}
|
173
172
|
}
|
174
173
|
}
|
175
174
|
const priorities_valid = (cps) => {
|
176
|
-
elist(cps, (cp) => priority_valid(cp),
|
175
|
+
elist(cps, (cp) => priority_valid(cp), (index, e) => `priorities has an invalid priority at position ${index}. ${e}`)
|
177
176
|
}
|
178
177
|
|
179
178
|
const priority_valid = (cp) => {
|
@@ -187,16 +186,16 @@ const priority_valid = (cp) => {
|
|
187
186
|
if (!_.isArray(cp.choose)) {
|
188
187
|
throw new Error(`The priority ${JSON.stringify(cp)} has an invalid "choose" value. The value should be a list of the operators in the context to consider for prioritization.`)
|
189
188
|
}
|
190
|
-
elist(cp.choose,
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
189
|
+
elist(cp.choose,
|
190
|
+
(element) => {
|
191
|
+
if (!element && element !== 0) {
|
192
|
+
throw new Error('The value should be an index into the "context" property of the operator that is to be considered for prioritization.')
|
193
|
+
}
|
194
|
+
if (!_.isInteger(element) || element < 0 || element >= cp.context.length) {
|
195
|
+
throw new Error(`The value should be an index into the "context" property of the operator that is to be considered for prioritization. Valid values are between 0 and ${cp.context.length - 1}.`)
|
196
|
+
}
|
197
|
+
},
|
198
|
+
(index, e) => `The choose property in the priority ${JSON.stringify(cp)} has an invalid index at position ${index}. ${e}`
|
200
199
|
)
|
201
200
|
}
|
202
201
|
|
@@ -204,29 +203,29 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
204
203
|
ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
|
205
204
|
() => {
|
206
205
|
if (!bridge.bridge) {
|
207
|
-
bridge.bridge =
|
206
|
+
bridge.bridge = '{ ...next(operator) }'
|
208
207
|
}
|
209
208
|
if (!bridge.level) {
|
210
209
|
bridge.level = 0
|
211
210
|
}
|
212
211
|
if (bridge.children) {
|
213
|
-
for (
|
212
|
+
for (const child of bridge.children) {
|
214
213
|
config.addHierarchy(child, bridge.id)
|
215
214
|
}
|
216
215
|
}
|
217
216
|
if (bridge.parents) {
|
218
|
-
for (
|
217
|
+
for (const parent of bridge.parents) {
|
219
218
|
config.addHierarchy(bridge.id, parent)
|
220
219
|
}
|
221
220
|
}
|
222
221
|
if (bridge.isA) {
|
223
|
-
for (
|
222
|
+
for (const parent of bridge.isA) {
|
224
223
|
config.addHierarchy(bridge.id, parent)
|
225
224
|
}
|
226
225
|
}
|
227
226
|
if (bridge.before) {
|
228
227
|
for (let after of bridge.before) {
|
229
|
-
if (typeof after
|
228
|
+
if (typeof after === 'string') {
|
230
229
|
after = [after, 0]
|
231
230
|
}
|
232
231
|
config.addPriority({ context: [[bridge.id, bridge.level], after], choose: [0] })
|
@@ -234,7 +233,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
234
233
|
}
|
235
234
|
if (bridge.after) {
|
236
235
|
for (let before of bridge.after) {
|
237
|
-
if (typeof before
|
236
|
+
if (typeof before === 'string') {
|
238
237
|
before = [before, 0]
|
239
238
|
}
|
240
239
|
config.addPriority({ context: [before, [bridge.id, bridge.level]], choose: [0] })
|
@@ -242,8 +241,8 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
242
241
|
}
|
243
242
|
if (bridge.words) {
|
244
243
|
for (let def of bridge.words) {
|
245
|
-
if (typeof def
|
246
|
-
config.addWordInternal(def, {
|
244
|
+
if (typeof def === 'string') {
|
245
|
+
config.addWordInternal(def, { id: bridge.id, initial: `{ value: "${def}"}` })
|
247
246
|
} else {
|
248
247
|
const word = def.word
|
249
248
|
def = { initial: JSON.stringify(def), id: bridge.id, word }
|
@@ -263,7 +262,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
263
262
|
if (bridge.generators) {
|
264
263
|
const generators = [...bridge.generators]
|
265
264
|
generators.reverse()
|
266
|
-
for (
|
265
|
+
for (const generator of generators) {
|
267
266
|
if (addFirst) {
|
268
267
|
config.config.generators.unshift(generator)
|
269
268
|
} else {
|
@@ -277,33 +276,32 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
277
276
|
}
|
278
277
|
if (bridge.generatorp) {
|
279
278
|
const match = bridge.generatorp.match || (() => true)
|
280
|
-
const apply = typeof bridge.generatorp
|
279
|
+
const apply = typeof bridge.generatorp === 'function' ? bridge.generatorp : bridge.generatorp.apply || bridge.generatorp
|
281
280
|
const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
|
282
|
-
|
281
|
+
|
283
282
|
const generator = {
|
284
283
|
where: bridge.generatorp.where || bridge.where || client.where(4),
|
285
284
|
match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
|
286
285
|
apply: (args) => apply(args),
|
287
286
|
applyWrapped: apply,
|
288
|
-
property: 'generatorp'
|
287
|
+
property: 'generatorp'
|
289
288
|
}
|
290
289
|
if (addFirst) {
|
291
290
|
config.config.generators.unshift(generator)
|
292
291
|
} else {
|
293
292
|
config.config.generators.push(generator)
|
294
293
|
}
|
295
|
-
|
296
294
|
}
|
297
295
|
if (bridge.generatorr) {
|
298
296
|
const match = bridge.generatorr.match || (() => true)
|
299
|
-
const apply = typeof bridge.generatorr
|
297
|
+
const apply = typeof bridge.generatorr === 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
|
300
298
|
const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
|
301
299
|
const generator = {
|
302
300
|
where: bridge.generatorr.where || bridge.where || client.where(4),
|
303
301
|
match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
|
304
302
|
apply: (args) => apply(args),
|
305
303
|
applyWrapped: apply,
|
306
|
-
property: 'generatorr'
|
304
|
+
property: 'generatorr'
|
307
305
|
}
|
308
306
|
if (addFirst) {
|
309
307
|
config.config.generators.unshift(generator)
|
@@ -314,10 +312,10 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
314
312
|
if (bridge.evaluator) {
|
315
313
|
const semantic = {
|
316
314
|
where: bridge.evaluator.where || bridge.where || client.where(3),
|
317
|
-
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
315
|
+
match: ({ context }) => bridge.id == context.marker && context.evaluate,
|
318
316
|
apply: (args) => bridge.evaluator(args),
|
319
317
|
applyWrapped: bridge.evaluator,
|
320
|
-
property: 'evaluator'
|
318
|
+
property: 'evaluator'
|
321
319
|
}
|
322
320
|
if (addFirst) {
|
323
321
|
config.config.semantics.unshift(semantic)
|
@@ -328,10 +326,10 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
328
326
|
if (bridge.semantic) {
|
329
327
|
const semantic = {
|
330
328
|
where: bridge.semantic.where || bridge.where || client.where(3),
|
331
|
-
match: ({context}) => bridge.id == context.marker,
|
329
|
+
match: ({ context }) => bridge.id == context.marker,
|
332
330
|
apply: (args) => bridge.semantic(args),
|
333
331
|
applyWrapped: bridge.semantic,
|
334
|
-
property: 'semantic'
|
332
|
+
property: 'semantic'
|
335
333
|
}
|
336
334
|
if (addFirst) {
|
337
335
|
config.config.semantics.unshift(semantic)
|
@@ -346,9 +344,9 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
346
344
|
const handleCalculatedProps = (baseConfig, moreConfig, addFirst) => {
|
347
345
|
if (moreConfig.bridges) {
|
348
346
|
moreConfig.bridges = moreConfig.bridges.map((bridge) => {
|
349
|
-
bridge = {...bridge}
|
350
|
-
const valid = [
|
351
|
-
|
347
|
+
bridge = { ...bridge }
|
348
|
+
const valid = ['after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
349
|
+
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where', 'uuid']
|
352
350
|
helpers.validProps(valid, bridge, 'bridge')
|
353
351
|
handleBridgeProps(baseConfig, bridge, addFirst)
|
354
352
|
return bridge
|
@@ -369,7 +367,6 @@ if (runtime.process.env.DEBUG_HIERARCHY) {
|
|
369
367
|
global.entodictonDebugHierarchy = JSON.parse(runtime.process.env.DEBUG_HIERARCHY)
|
370
368
|
}
|
371
369
|
|
372
|
-
|
373
370
|
// i keep randomly doing one of the other so I will just make both work the same way
|
374
371
|
if (runtime.process.env.DEBUG_PRIORITIES) {
|
375
372
|
global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITIES)
|
@@ -390,7 +387,7 @@ if (runtime.process.env.DEBUG_BRIDGE) {
|
|
390
387
|
// id/level
|
391
388
|
global.entodictonDebugBridge = runtime.process.env.DEBUG_BRIDGE.split('/')
|
392
389
|
if (global.entodictonDebugBridge.length !== 2) {
|
393
|
-
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"')
|
390
|
+
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"')
|
394
391
|
process.exit(-1)
|
395
392
|
}
|
396
393
|
global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
|
@@ -402,12 +399,12 @@ if (runtime.process.env.DEBUG_OPERATOR) {
|
|
402
399
|
}
|
403
400
|
|
404
401
|
const hierarchyCanonical = (element) => {
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
}
|
402
|
+
if (element.child && element.parent) {
|
403
|
+
return element
|
404
|
+
} else {
|
405
|
+
return { child: element[0], parent: element[1] }
|
410
406
|
}
|
407
|
+
}
|
411
408
|
|
412
409
|
const isValidDef = (word, def, config) => {
|
413
410
|
if (!def.id) {
|
@@ -452,21 +449,20 @@ const normalizeConfig = (config) => {
|
|
452
449
|
config[bag][i].km = config.name
|
453
450
|
}
|
454
451
|
}
|
455
|
-
|
456
452
|
}
|
457
|
-
if (config
|
458
|
-
for (
|
453
|
+
if (config.bridges) {
|
454
|
+
for (const bridge of config.bridges) {
|
459
455
|
if (!bridge.level) {
|
460
456
|
bridge.level = 0
|
461
457
|
}
|
462
458
|
if (!bridge.bridge) {
|
463
|
-
bridge.bridge =
|
459
|
+
bridge.bridge = '{ ...next(operator) }'
|
464
460
|
}
|
465
461
|
}
|
466
462
|
}
|
467
463
|
|
468
464
|
if (config.semantics) {
|
469
|
-
for (
|
465
|
+
for (const semantic of config.semantics) {
|
470
466
|
if (semantic.oneShot) {
|
471
467
|
semantic.id = uuid()
|
472
468
|
}
|
@@ -611,7 +607,7 @@ class KM {
|
|
611
607
|
const config = configDup(this._config, options)
|
612
608
|
const km = new KM({
|
613
609
|
config,
|
614
|
-
getCounter: options.getCounter,
|
610
|
+
getCounter: options.getCounter,
|
615
611
|
name: this._name,
|
616
612
|
_uuid: config._uuid,
|
617
613
|
namespace: this._namespace,
|
@@ -708,16 +704,14 @@ const multiApiImpl = (initializer) => {
|
|
708
704
|
})
|
709
705
|
}
|
710
706
|
|
711
|
-
|
712
707
|
class Config {
|
713
|
-
|
714
708
|
toServer (config) {
|
715
709
|
return config_toServer(config)
|
716
710
|
}
|
717
711
|
|
718
712
|
base () {
|
719
713
|
const base = new Config()
|
720
|
-
for (
|
714
|
+
for (const km of this.configs.reverse()) {
|
721
715
|
if (km.isSelf) {
|
722
716
|
continue
|
723
717
|
}
|
@@ -737,8 +731,8 @@ class Config {
|
|
737
731
|
}
|
738
732
|
const templateQueries = []
|
739
733
|
if (this.instances && this.instances.length > 0) {
|
740
|
-
for (
|
741
|
-
if (typeof query
|
734
|
+
for (const query of this.instances.slice(-1)[0].queries) {
|
735
|
+
if (typeof query === 'string') {
|
742
736
|
templateQueries.push(query)
|
743
737
|
}
|
744
738
|
}
|
@@ -749,7 +743,7 @@ class Config {
|
|
749
743
|
|
750
744
|
getPseudoConfig (uuid, config) {
|
751
745
|
return {
|
752
|
-
description:
|
746
|
+
description: 'this is a pseudo config that has limited functionality due to being available in the initializer function context',
|
753
747
|
addAssociation: (...args) => this.addAssociation(...args),
|
754
748
|
addAssociations: (...args) => this.addAssociations(...args),
|
755
749
|
addBridge: (...args) => this.addBridge(...args, uuid),
|
@@ -769,7 +763,7 @@ class Config {
|
|
769
763
|
getBridge: (...args) => this.getBridge(...args),
|
770
764
|
fragment: (...args) => this.fragment(...args),
|
771
765
|
exists: (...args) => this.exists(...args),
|
772
|
-
addAPI: (...args) => this.addAPI(...args)
|
766
|
+
addAPI: (...args) => this.addAPI(...args)
|
773
767
|
}
|
774
768
|
}
|
775
769
|
|
@@ -783,7 +777,7 @@ class Config {
|
|
783
777
|
}
|
784
778
|
|
785
779
|
// return the config with just the elements from the included KM's
|
786
|
-
baseConfig() {
|
780
|
+
baseConfig () {
|
787
781
|
const operators = this.config.operators.filter((operator) => {
|
788
782
|
return operator.uuid !== this.uuid
|
789
783
|
})
|
@@ -791,8 +785,8 @@ class Config {
|
|
791
785
|
return bridge.uuid !== this.uuid
|
792
786
|
})
|
793
787
|
const words = {}
|
794
|
-
for (
|
795
|
-
const defs = this.config.words[word].filter(
|
788
|
+
for (const word in this.config.words) {
|
789
|
+
const defs = this.config.words[word].filter((def) => def.uuid !== this.uuid)
|
796
790
|
if (defs.length > 0) {
|
797
791
|
words[word] = defs
|
798
792
|
}
|
@@ -810,11 +804,11 @@ class Config {
|
|
810
804
|
return `${maybeName}${counter}`
|
811
805
|
}
|
812
806
|
|
813
|
-
setTestConfig(testConfig) {
|
807
|
+
setTestConfig (testConfig) {
|
814
808
|
this.testConfig = testConfig
|
815
809
|
}
|
816
810
|
|
817
|
-
getTestConfig() {
|
811
|
+
getTestConfig () {
|
818
812
|
return this.testConfig
|
819
813
|
}
|
820
814
|
|
@@ -859,44 +853,44 @@ class Config {
|
|
859
853
|
|
860
854
|
// applies only to config sent to the server
|
861
855
|
|
862
|
-
watching() {
|
856
|
+
watching () {
|
863
857
|
const props = [
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
]
|
858
|
+
'operators',
|
859
|
+
'bridges',
|
860
|
+
'hierarchy',
|
861
|
+
'namespaces',
|
862
|
+
'eqClasses',
|
863
|
+
'priorities',
|
864
|
+
'associations',
|
865
|
+
'words',
|
866
|
+
'floaters',
|
867
|
+
'implicits',
|
868
|
+
'flatten'
|
869
|
+
]
|
876
870
|
const watching = {}
|
877
|
-
for (
|
871
|
+
for (const prop of props) {
|
878
872
|
watching[prop] = this.config[prop]
|
879
873
|
}
|
880
874
|
return JSON.stringify(watching)
|
881
875
|
}
|
882
876
|
|
883
|
-
watch() {
|
884
|
-
this.watchStart = this.watching()
|
877
|
+
watch () {
|
878
|
+
this.watchStart = this.watching()
|
885
879
|
}
|
886
880
|
|
887
|
-
wasChanged() {
|
881
|
+
wasChanged () {
|
888
882
|
if (!this.watchStart) {
|
889
|
-
return false
|
883
|
+
return false
|
890
884
|
}
|
891
885
|
return this.watchStart !== this.watching()
|
892
886
|
}
|
893
887
|
|
894
|
-
|
895
|
-
for (
|
888
|
+
exists (marker) {
|
889
|
+
for (const bridge of this.config.bridges) {
|
896
890
|
if (bridge.id == marker) {
|
897
|
-
return true
|
891
|
+
return true
|
898
892
|
}
|
899
|
-
|
893
|
+
}
|
900
894
|
}
|
901
895
|
|
902
896
|
getSemantics (logs = []) {
|
@@ -910,7 +904,7 @@ class Config {
|
|
910
904
|
warningNotEvaluated (log, value) {
|
911
905
|
const description = 'WARNING: for semantics, implement an evaluations handler, set "value" property of the operator to the value.'
|
912
906
|
const match = `({context}) => context.marker == '${value.marker}' && context.evaluate && <other conditions as you like>`
|
913
|
-
const apply =
|
907
|
+
const apply = '({context}) => <do stuff...>; context.value = <value>'
|
914
908
|
const input = indent(JSON.stringify(value, null, 2), 2)
|
915
909
|
const message = `${description}\nThe semantic would be\n match: ${match}\n apply: ${apply}\nThe input context would be:\n${input}\n`
|
916
910
|
log.push(indent(message, 4))
|
@@ -937,18 +931,17 @@ class Config {
|
|
937
931
|
const instance = s({ ...context, evaluate: true })
|
938
932
|
calls.touch(instance)
|
939
933
|
if (!instance.evalue && !instance.verbatim && !instance.value) {
|
940
|
-
this.warningNotEvaluated(log, context)
|
934
|
+
this.warningNotEvaluated(log, context)
|
941
935
|
}
|
942
936
|
if (!instance.evalue) {
|
943
937
|
instance.evalue = instance.value
|
944
938
|
instance.edefault = true
|
945
939
|
}
|
946
940
|
delete instance.evaluate
|
947
|
-
instance.instance = true
|
941
|
+
instance.instance = true
|
948
942
|
return instance
|
949
943
|
}
|
950
944
|
|
951
|
-
|
952
945
|
fragmentInstantiator (contexts) {
|
953
946
|
return new Object({
|
954
947
|
contexts: () => contexts,
|
@@ -970,7 +963,7 @@ class Config {
|
|
970
963
|
continue
|
971
964
|
}
|
972
965
|
if (context[key].instantiated) {
|
973
|
-
continue
|
966
|
+
continue
|
974
967
|
}
|
975
968
|
todo.push(context[key])
|
976
969
|
}
|
@@ -996,20 +989,20 @@ class Config {
|
|
996
989
|
return true
|
997
990
|
}
|
998
991
|
const toCanonical = (f) => {
|
999
|
-
if (typeof f
|
992
|
+
if (typeof f === 'string') {
|
1000
993
|
return { query: f }
|
1001
994
|
} else {
|
1002
995
|
return f
|
1003
996
|
}
|
1004
997
|
}
|
1005
|
-
const instanceFragments = (instance.fragments || []).map((fragment) => fragment.key || fragment.query).map(
|
1006
|
-
const templateFragments = (template.fragments || []).concat(this.dynamicFragments).map(
|
998
|
+
const instanceFragments = (instance.fragments || []).map((fragment) => fragment.key || fragment.query).map(toCanonical)
|
999
|
+
const templateFragments = (template.fragments || []).concat(this.dynamicFragments).map(toCanonical)
|
1007
1000
|
const sameFragments = helpers.safeEquals(templateFragments, instanceFragments)
|
1008
1001
|
const toCanonicalQuery = (queryOrConfig) => {
|
1009
|
-
if (typeof queryOrConfig
|
1002
|
+
if (typeof queryOrConfig === 'string') {
|
1010
1003
|
const query = queryOrConfig
|
1011
1004
|
return query
|
1012
|
-
} else if (typeof queryOrConfig
|
1005
|
+
} else if (typeof queryOrConfig === 'function') {
|
1013
1006
|
if (options.isModule) {
|
1014
1007
|
return { apply: 'function in the browser has webpack rewrites so can not be compared' }
|
1015
1008
|
} else {
|
@@ -1024,8 +1017,8 @@ class Config {
|
|
1024
1017
|
} else {
|
1025
1018
|
const config = { ...queryOrConfig }
|
1026
1019
|
delete config.where
|
1027
|
-
config.operators = (config.operators || []).map(
|
1028
|
-
if (typeof operator
|
1020
|
+
config.operators = (config.operators || []).map((operator) => {
|
1021
|
+
if (typeof operator === 'string') {
|
1029
1022
|
return { pattern: operator }
|
1030
1023
|
} else {
|
1031
1024
|
operator = { ...operator }
|
@@ -1033,7 +1026,7 @@ class Config {
|
|
1033
1026
|
return operator
|
1034
1027
|
}
|
1035
1028
|
})
|
1036
|
-
config.bridges = (config.bridges || []).map(
|
1029
|
+
config.bridges = (config.bridges || []).map((bridge) => {
|
1037
1030
|
bridge = { ...bridge },
|
1038
1031
|
bridge.level = bridge.level || 0
|
1039
1032
|
delete bridge.uuid
|
@@ -1041,10 +1034,10 @@ class Config {
|
|
1041
1034
|
})
|
1042
1035
|
if (options.isModule) {
|
1043
1036
|
// things like webpack rewrite the functions if there are constants so this compare does not work
|
1044
|
-
delete config.generators
|
1045
|
-
delete config.semantics
|
1037
|
+
delete config.generators
|
1038
|
+
delete config.semantics
|
1046
1039
|
config.bridges = (config.bridges || []).map((bridge) => {
|
1047
|
-
bridge = {...bridge}
|
1040
|
+
bridge = { ...bridge }
|
1048
1041
|
delete bridge.where
|
1049
1042
|
delete bridge.generatorp
|
1050
1043
|
delete bridge.generatorr
|
@@ -1052,24 +1045,24 @@ class Config {
|
|
1052
1045
|
delete bridge.evaluator
|
1053
1046
|
delete bridge.semantic
|
1054
1047
|
return bridge
|
1055
|
-
})
|
1048
|
+
})
|
1056
1049
|
} else {
|
1057
1050
|
config.generators = (config.generators || []).map((generator) => {
|
1058
|
-
generator = {...generator}
|
1051
|
+
generator = { ...generator }
|
1059
1052
|
delete generator.where
|
1060
1053
|
generator.match = generator.match.toString()
|
1061
1054
|
generator.apply = generator.apply.toString()
|
1062
1055
|
return generator
|
1063
1056
|
})
|
1064
1057
|
config.semantics = (config.semantics || []).map((semantic) => {
|
1065
|
-
semantic = {...semantic}
|
1058
|
+
semantic = { ...semantic }
|
1066
1059
|
delete semantic.where
|
1067
1060
|
semantic.match = semantic.match.toString()
|
1068
1061
|
semantic.apply = semantic.apply.toString()
|
1069
1062
|
return semantic
|
1070
1063
|
})
|
1071
1064
|
config.bridges = (config.bridges || []).map((bridge) => {
|
1072
|
-
bridge = {...bridge}
|
1065
|
+
bridge = { ...bridge }
|
1073
1066
|
delete bridge.where
|
1074
1067
|
if (bridge.generatorp) {
|
1075
1068
|
bridge.generatorp = bridge.generatorp.toString()
|
@@ -1093,13 +1086,13 @@ class Config {
|
|
1093
1086
|
}
|
1094
1087
|
}
|
1095
1088
|
const toCanonicalQueries = (elements) => {
|
1096
|
-
return elements.map(
|
1089
|
+
return elements.map(toCanonicalQuery)
|
1097
1090
|
}
|
1098
1091
|
|
1099
1092
|
const templateQueries = toCanonicalQueries(template.queries || []).map(helpers.updateQueries)
|
1100
1093
|
const instanceQueries = toCanonicalQueries(instance.queries || [])
|
1101
1094
|
let sameQueries = true
|
1102
|
-
let startOfChanges
|
1095
|
+
let startOfChanges
|
1103
1096
|
for (let iq = 0; iq < templateQueries.length; ++iq) {
|
1104
1097
|
if (!helpers.safeEquals(templateQueries[iq], instanceQueries[iq])) {
|
1105
1098
|
sameQueries = false
|
@@ -1109,8 +1102,8 @@ class Config {
|
|
1109
1102
|
|
1110
1103
|
const debug = true
|
1111
1104
|
if (debug && startOfChanges) {
|
1112
|
-
console.log('templateQueries[startOfChanges]', templateQueries[startOfChanges])
|
1113
|
-
console.log('instanceQueries[startOfChanges]', instanceQueries[startOfChanges])
|
1105
|
+
console.log('templateQueries[startOfChanges]', templateQueries[startOfChanges])
|
1106
|
+
console.log('instanceQueries[startOfChanges]', instanceQueries[startOfChanges])
|
1114
1107
|
}
|
1115
1108
|
|
1116
1109
|
// things were deleted case
|
@@ -1126,8 +1119,8 @@ class Config {
|
|
1126
1119
|
debugger
|
1127
1120
|
}
|
1128
1121
|
// console.log("instance", instance)
|
1129
|
-
console.log(
|
1130
|
-
console.log(
|
1122
|
+
console.log('sameQueries', sameQueries)
|
1123
|
+
console.log('sameFragments', sameFragments)
|
1131
1124
|
// console.log("templateFragments", templateFragments)
|
1132
1125
|
// console.log("instanceFragments", instanceFragments)
|
1133
1126
|
// console.log('template.queries', JSON.stringify(toCanonicalQueries(template.queries || []).map(helpers.updateQueries), null, 2))
|
@@ -1145,8 +1138,8 @@ class Config {
|
|
1145
1138
|
if (!template.queries && !template.fragments) {
|
1146
1139
|
throw new Error(`Expected the template for ${this.name} to be an object that can have the properties: queries and fragments`)
|
1147
1140
|
}
|
1148
|
-
for (
|
1149
|
-
if (typeof query
|
1141
|
+
for (const query of template.queries || []) {
|
1142
|
+
if (typeof query === 'string') {
|
1150
1143
|
} else if (query instanceof Config) {
|
1151
1144
|
throw new Error(`For the template for ${this.name}, each element in queries should be either a string or a structure with a config (not a Config object).`)
|
1152
1145
|
}
|
@@ -1159,7 +1152,7 @@ class Config {
|
|
1159
1152
|
}
|
1160
1153
|
|
1161
1154
|
// loadTemplate
|
1162
|
-
load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }
|
1155
|
+
load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
|
1163
1156
|
this.validifyTemplate(template)
|
1164
1157
|
instance.template = template
|
1165
1158
|
this.logs.push(`loading template for ${this.name}`)
|
@@ -1171,15 +1164,15 @@ class Config {
|
|
1171
1164
|
} else {
|
1172
1165
|
// no change
|
1173
1166
|
// this.initInstances.push({ ...instance, name: config.name })
|
1174
|
-
const isEmpty = (
|
1167
|
+
const isEmpty = (instance) => {
|
1175
1168
|
const properties = [
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1169
|
+
'queries',
|
1170
|
+
'resultss',
|
1171
|
+
'fragments',
|
1172
|
+
'semantics',
|
1173
|
+
'associations'
|
1181
1174
|
]
|
1182
|
-
return !properties.find(
|
1175
|
+
return !properties.find((property) => instance[property] && instance[property].length > 0)
|
1183
1176
|
}
|
1184
1177
|
if (!isEmpty(instance)) {
|
1185
1178
|
// fix up apply functions
|
@@ -1197,7 +1190,7 @@ class Config {
|
|
1197
1190
|
}
|
1198
1191
|
}
|
1199
1192
|
|
1200
|
-
addFragments(fragments) {
|
1193
|
+
addFragments (fragments) {
|
1201
1194
|
// only run this if not loading as module write error if loading as module and different
|
1202
1195
|
this.dynamicFragments = this.dynamicFragments.concat(fragments)
|
1203
1196
|
}
|
@@ -1207,12 +1200,12 @@ class Config {
|
|
1207
1200
|
}
|
1208
1201
|
|
1209
1202
|
addAssociations (associations) {
|
1210
|
-
for (
|
1203
|
+
for (const association of associations) {
|
1211
1204
|
this.addAssociation(association)
|
1212
1205
|
}
|
1213
1206
|
}
|
1214
1207
|
|
1215
|
-
debugConfig() {
|
1208
|
+
debugConfig () {
|
1216
1209
|
}
|
1217
1210
|
|
1218
1211
|
addAssociation (association) {
|
@@ -1241,17 +1234,17 @@ class Config {
|
|
1241
1234
|
}
|
1242
1235
|
|
1243
1236
|
addPriorities (priorities) {
|
1244
|
-
for (
|
1237
|
+
for (const priority of priorities) {
|
1245
1238
|
this.addPriority(priority)
|
1246
1239
|
}
|
1247
1240
|
}
|
1248
1241
|
|
1249
1242
|
addHierarchy (child, parent) {
|
1250
|
-
if (child && parent || !child || Array.isArray(child) || (typeof child
|
1243
|
+
if (child && parent || !child || Array.isArray(child) || (typeof child === 'string' && !parent)) {
|
1251
1244
|
this.addHierarchyChildParent(child, parent)
|
1252
1245
|
// this.addHierarchyProperties ({ child, parent })
|
1253
1246
|
} else {
|
1254
|
-
this.addHierarchyProperties
|
1247
|
+
this.addHierarchyProperties(child)
|
1255
1248
|
}
|
1256
1249
|
}
|
1257
1250
|
|
@@ -1277,8 +1270,8 @@ class Config {
|
|
1277
1270
|
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
1278
1271
|
}
|
1279
1272
|
debugHierarchy([child, parent])
|
1280
|
-
if (this.config.hierarchy.find(
|
1281
|
-
const hc = hierarchyCanonical(element)
|
1273
|
+
if (this.config.hierarchy.find((element) => {
|
1274
|
+
const hc = hierarchyCanonical(element)
|
1282
1275
|
if (child == hc.child && parent == hc.parent) {
|
1283
1276
|
return true
|
1284
1277
|
}
|
@@ -1293,9 +1286,9 @@ class Config {
|
|
1293
1286
|
|
1294
1287
|
getBridge (id, level) {
|
1295
1288
|
if (level) {
|
1296
|
-
return this.config.bridges.find(
|
1289
|
+
return this.config.bridges.find((bridge) => bridge.id == id && bridge.level == level)
|
1297
1290
|
} else {
|
1298
|
-
return this.config.bridges.find(
|
1291
|
+
return this.config.bridges.find((bridge) => bridge.id == id)
|
1299
1292
|
}
|
1300
1293
|
}
|
1301
1294
|
|
@@ -1305,12 +1298,12 @@ class Config {
|
|
1305
1298
|
}
|
1306
1299
|
const bridges = this.config.bridges
|
1307
1300
|
const def = Object.assign({}, bridge, { uuid: uuid || this._uuid })
|
1308
|
-
|
1301
|
+
|
1309
1302
|
debugBridge(bridge)
|
1310
1303
|
if (bridge.allowDups) {
|
1311
1304
|
// if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1312
|
-
if (bridges.find(
|
1313
|
-
return
|
1305
|
+
if (bridges.find((b) => b.id == bridge.id && b.level == bridge.level)) {
|
1306
|
+
return
|
1314
1307
|
}
|
1315
1308
|
}
|
1316
1309
|
if (global.transitoryMode) {
|
@@ -1318,7 +1311,7 @@ class Config {
|
|
1318
1311
|
}
|
1319
1312
|
handleBridgeProps(this, def)
|
1320
1313
|
bridges.push(def)
|
1321
|
-
this.checkBridges()
|
1314
|
+
this.checkBridges()
|
1322
1315
|
this._delta.json.bridges.push({ action: 'add', bridge: def })
|
1323
1316
|
}
|
1324
1317
|
|
@@ -1366,8 +1359,8 @@ class Config {
|
|
1366
1359
|
semantics.unshift(semantic)
|
1367
1360
|
}
|
1368
1361
|
|
1369
|
-
removeSemantic(deleteSemantic) {
|
1370
|
-
const index = this.config.semantics.findIndex(
|
1362
|
+
removeSemantic (deleteSemantic) {
|
1363
|
+
const index = this.config.semantics.findIndex((semantic) => semantic.id === deleteSemantic.id)
|
1371
1364
|
if (index >= 0) {
|
1372
1365
|
this.config.semantics.splice(index, 1)
|
1373
1366
|
}
|
@@ -1380,7 +1373,7 @@ class Config {
|
|
1380
1373
|
|
1381
1374
|
const operators = this.config.operators
|
1382
1375
|
|
1383
|
-
let operator
|
1376
|
+
let operator
|
1384
1377
|
if (typeof objectOrPattern === 'string') {
|
1385
1378
|
operator = { pattern: objectOrPattern, uuid: uuid || this._uuid }
|
1386
1379
|
} else {
|
@@ -1390,8 +1383,8 @@ class Config {
|
|
1390
1383
|
debugOperator(operator)
|
1391
1384
|
|
1392
1385
|
if (operator.allowDups) {
|
1393
|
-
if (operators.find(
|
1394
|
-
return
|
1386
|
+
if (operators.find((o) => o.pattern == operator.pattern)) {
|
1387
|
+
return
|
1395
1388
|
}
|
1396
1389
|
}
|
1397
1390
|
|
@@ -1450,19 +1443,19 @@ class Config {
|
|
1450
1443
|
}
|
1451
1444
|
}
|
1452
1445
|
|
1453
|
-
getServer() {
|
1446
|
+
getServer () {
|
1454
1447
|
return this._server
|
1455
1448
|
}
|
1456
1449
|
|
1457
|
-
getAPIKey() {
|
1450
|
+
getAPIKey () {
|
1458
1451
|
return this._key
|
1459
1452
|
}
|
1460
1453
|
|
1461
|
-
getQueryParams() {
|
1454
|
+
getQueryParams () {
|
1462
1455
|
return this._queryParams
|
1463
1456
|
}
|
1464
1457
|
|
1465
|
-
setQueryParams(queryParams) {
|
1458
|
+
setQueryParams (queryParams) {
|
1466
1459
|
this._queryParams = queryParams
|
1467
1460
|
}
|
1468
1461
|
|
@@ -1570,14 +1563,14 @@ class Config {
|
|
1570
1563
|
}
|
1571
1564
|
|
1572
1565
|
getConfigs () {
|
1573
|
-
const configs = {}
|
1566
|
+
const configs = {}
|
1574
1567
|
configs[this.name] = this
|
1575
1568
|
for (const config of this.configs) {
|
1576
1569
|
if (config.config instanceof Config) {
|
1577
1570
|
configs[config.config.name] = config.config
|
1578
1571
|
}
|
1579
1572
|
}
|
1580
|
-
return configs
|
1573
|
+
return configs
|
1581
1574
|
}
|
1582
1575
|
|
1583
1576
|
getConfigByUUID (uuid) {
|
@@ -1606,18 +1599,18 @@ class Config {
|
|
1606
1599
|
}
|
1607
1600
|
}
|
1608
1601
|
|
1609
|
-
removeDevelopmentElements(config) {
|
1602
|
+
removeDevelopmentElements (config) {
|
1610
1603
|
if (!config) {
|
1611
1604
|
return
|
1612
1605
|
}
|
1613
|
-
config.operators = config.operators.filter(
|
1614
|
-
config.bridges = config.bridges.filter(
|
1615
|
-
config.generators = config.generators.filter(
|
1616
|
-
config.semantics = config.semantics.filter(
|
1617
|
-
config.hierarchy = (config.hierarchy).filter(
|
1606
|
+
config.operators = config.operators.filter((element) => !element.development)
|
1607
|
+
config.bridges = config.bridges.filter((element) => !element.development)
|
1608
|
+
config.generators = config.generators.filter((element) => !element.development)
|
1609
|
+
config.semantics = config.semantics.filter((element) => !element.development)
|
1610
|
+
config.hierarchy = (config.hierarchy).filter((element) => !element.development)
|
1618
1611
|
for (const word in config.words) {
|
1619
1612
|
const defs = config.words[word] || []
|
1620
|
-
config.words[word] = defs.filter(
|
1613
|
+
config.words[word] = defs.filter((def) => !def.development)
|
1621
1614
|
if (config.words[word].length == 0) {
|
1622
1615
|
delete config.words[word]
|
1623
1616
|
}
|
@@ -1740,11 +1733,11 @@ class Config {
|
|
1740
1733
|
debugConfigProps(this.config)
|
1741
1734
|
}
|
1742
1735
|
|
1743
|
-
addArgs(moreArgs) {
|
1736
|
+
addArgs (moreArgs) {
|
1744
1737
|
this.addedArgss.push(moreArgs)
|
1745
1738
|
}
|
1746
1739
|
|
1747
|
-
getAddedArgs(args) {
|
1740
|
+
getAddedArgs (args) {
|
1748
1741
|
for (let addedArgs of this.addedArgss) {
|
1749
1742
|
addedArgs = addedArgs(args)
|
1750
1743
|
Object.assign(args, addedArgs)
|
@@ -1768,9 +1761,9 @@ class Config {
|
|
1768
1761
|
}
|
1769
1762
|
|
1770
1763
|
delta () {
|
1771
|
-
return {
|
1772
|
-
cacheKey: this._delta.cacheKey,
|
1773
|
-
json: this._delta.json
|
1764
|
+
return {
|
1765
|
+
cacheKey: this._delta.cacheKey,
|
1766
|
+
json: this._delta.json
|
1774
1767
|
}
|
1775
1768
|
}
|
1776
1769
|
|
@@ -1783,7 +1776,7 @@ class Config {
|
|
1783
1776
|
bridges: [],
|
1784
1777
|
associations: [],
|
1785
1778
|
priorities: [],
|
1786
|
-
hierarchy: []
|
1779
|
+
hierarchy: []
|
1787
1780
|
}
|
1788
1781
|
}
|
1789
1782
|
}
|
@@ -1800,11 +1793,11 @@ class Config {
|
|
1800
1793
|
}
|
1801
1794
|
}
|
1802
1795
|
|
1803
|
-
addAPI(api) {
|
1796
|
+
addAPI (api) {
|
1804
1797
|
if (this._api && this._api.multiApi) {
|
1805
1798
|
this._api.add(this, this._api, api)
|
1806
1799
|
} else {
|
1807
|
-
throw new Error(
|
1800
|
+
throw new Error('Can only add apis to a multi-api')
|
1808
1801
|
}
|
1809
1802
|
}
|
1810
1803
|
|
@@ -1867,15 +1860,15 @@ class Config {
|
|
1867
1860
|
}
|
1868
1861
|
|
1869
1862
|
// TODO add more details
|
1870
|
-
equal(config) {
|
1863
|
+
equal (config) {
|
1871
1864
|
if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
|
1872
|
-
debugger
|
1873
|
-
return false
|
1865
|
+
debugger
|
1866
|
+
return false
|
1874
1867
|
}
|
1875
1868
|
return true
|
1876
1869
|
}
|
1877
1870
|
|
1878
|
-
dump(fn) {
|
1871
|
+
dump (fn) {
|
1879
1872
|
runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
|
1880
1873
|
}
|
1881
1874
|
|
@@ -1887,7 +1880,7 @@ class Config {
|
|
1887
1880
|
const cp = new Config()
|
1888
1881
|
cp.logs = []
|
1889
1882
|
cp.maxDepth = this.maxDepth
|
1890
|
-
cp.debugLoops
|
1883
|
+
cp.debugLoops = this.debugLoops
|
1891
1884
|
cp.transitoryMode = this.transitoryMode
|
1892
1885
|
cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
1893
1886
|
cp._uuid = cp.configs[0]._uuid
|
@@ -1924,7 +1917,7 @@ class Config {
|
|
1924
1917
|
cp.mapUUIDs(map)
|
1925
1918
|
|
1926
1919
|
if (cp._uuid == 'concept2') {
|
1927
|
-
|
1920
|
+
// debugger
|
1928
1921
|
}
|
1929
1922
|
if (options.callInitializers) {
|
1930
1923
|
cp.rebuild(options)
|
@@ -1947,7 +1940,7 @@ class Config {
|
|
1947
1940
|
// const namespace = km.namespace
|
1948
1941
|
cp.config.objects.namespaced[km._uuid] = {}
|
1949
1942
|
})
|
1950
|
-
/*
|
1943
|
+
/*
|
1951
1944
|
if (cp._uuid == 'concept2') {
|
1952
1945
|
if (!cp.api.objects.defaultTypesForHierarchy) {
|
1953
1946
|
debugger
|
@@ -2087,7 +2080,7 @@ class Config {
|
|
2087
2080
|
|
2088
2081
|
initializer (fn, options = {}) {
|
2089
2082
|
if (options) {
|
2090
|
-
for (
|
2083
|
+
for (const option of Object.keys(options)) {
|
2091
2084
|
const validOptions = []
|
2092
2085
|
if (!validOptions.includes(option)) {
|
2093
2086
|
throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
|
@@ -2253,7 +2246,7 @@ class Config {
|
|
2253
2246
|
// rebuild ({ isModule: mainIsModule = false } = {}) {
|
2254
2247
|
rebuild ({ isModule: mainIsModule } = {}) {
|
2255
2248
|
this.resetDelta()
|
2256
|
-
const debug = this.config.debug
|
2249
|
+
const debug = this.config.debug
|
2257
2250
|
this.config = _.cloneDeep(this.initConfig)
|
2258
2251
|
this.hierarchy = new DigraphInternal(this.config.hierarchy)
|
2259
2252
|
if (debug) {
|
@@ -2296,8 +2289,8 @@ class Config {
|
|
2296
2289
|
// const aw = (word, def) => this.addWord(word, def)
|
2297
2290
|
// const ag = (matchOrGenerator, applyOrNothing) => this.addGenerator(matchOrGenerator, applyOrNothing)
|
2298
2291
|
let config = km.config
|
2299
|
-
|
2300
|
-
if (config.addedArgss) {
|
2292
|
+
|
2293
|
+
if (config.addedArgss) {
|
2301
2294
|
this.addedArgss = this.addedArgss.concat(config.addedArgss)
|
2302
2295
|
}
|
2303
2296
|
|
@@ -2320,15 +2313,15 @@ class Config {
|
|
2320
2313
|
return config
|
2321
2314
|
}
|
2322
2315
|
// const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
|
2323
|
-
const args = new Object(setupInitializerFNArgs(this, {
|
2324
|
-
isModule,
|
2325
|
-
hierarchy: this.hierarchy,
|
2316
|
+
const args = new Object(setupInitializerFNArgs(this, {
|
2317
|
+
isModule,
|
2318
|
+
hierarchy: this.hierarchy,
|
2326
2319
|
testConfig: config,
|
2327
|
-
currentConfig: config,
|
2328
|
-
uuid: config._uuid,
|
2329
|
-
objects: namespacedObjects,
|
2330
|
-
namespace,
|
2331
|
-
api: config.api
|
2320
|
+
currentConfig: config,
|
2321
|
+
uuid: config._uuid,
|
2322
|
+
objects: namespacedObjects,
|
2323
|
+
namespace,
|
2324
|
+
api: config.api
|
2332
2325
|
}))
|
2333
2326
|
|
2334
2327
|
const currentConfig = args.currentConfig
|
@@ -2345,12 +2338,12 @@ class Config {
|
|
2345
2338
|
// debugger
|
2346
2339
|
// greg55
|
2347
2340
|
config.initializerFn(args, { dontCallFn: true })
|
2348
|
-
|
2341
|
+
initAfterApis.unshift({ config, args })
|
2349
2342
|
if (config._api) {
|
2350
2343
|
if (config._api.initialize) {
|
2351
2344
|
// reverse the list
|
2352
2345
|
// TODO sync up the args with initialize of config
|
2353
|
-
inits.unshift(
|
2346
|
+
inits.unshift(() => config._api.initialize({ config: this, km: kmFn, ...args, api: config._api }))
|
2354
2347
|
// config._api.initialize({ config, api: config._api })
|
2355
2348
|
} else {
|
2356
2349
|
inits.unshift(null)
|
@@ -2392,13 +2385,13 @@ class Config {
|
|
2392
2385
|
this.config.priorities = []
|
2393
2386
|
this.config.associations = { positive: [], negative: [] }
|
2394
2387
|
this.config.words = {}
|
2395
|
-
|
2388
|
+
|
2396
2389
|
for (let i = 0; i < addInternals.length; ++i) {
|
2397
|
-
let name
|
2390
|
+
let name
|
2398
2391
|
if (addInternals[i]) {
|
2399
2392
|
this.addInternalR(addInternals[i], true, false, false, true)
|
2400
2393
|
name = addInternals[i].name
|
2401
|
-
} else{
|
2394
|
+
} else {
|
2402
2395
|
// the ones defined in config must come after the ones in the templates
|
2403
2396
|
this.config.generators = generators.concat(this.config.generators)
|
2404
2397
|
this.config.semantics = semantics.concat(this.config.semantics)
|
@@ -2412,7 +2405,7 @@ class Config {
|
|
2412
2405
|
}
|
2413
2406
|
if (initAfterApis[i]) {
|
2414
2407
|
const init = initAfterApis[i]
|
2415
|
-
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true})
|
2408
|
+
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
|
2416
2409
|
}
|
2417
2410
|
const instance = this.instances.find((instance) => instance.name == name)
|
2418
2411
|
if (instance) {
|
@@ -2427,9 +2420,10 @@ class Config {
|
|
2427
2420
|
this.checkBridges()
|
2428
2421
|
}
|
2429
2422
|
|
2430
|
-
nameToUUID(name) {
|
2423
|
+
nameToUUID (name) {
|
2431
2424
|
return this.configs.find((km) => km._name == name)._uuid
|
2432
2425
|
}
|
2426
|
+
|
2433
2427
|
// name: namespace name
|
2434
2428
|
// others
|
2435
2429
|
// if undefined namespace applies to first loaded config
|
@@ -2606,7 +2600,7 @@ class Config {
|
|
2606
2600
|
context: context.map((id) => {
|
2607
2601
|
return [toNS(id[0]), id[1]]
|
2608
2602
|
}),
|
2609
|
-
choose
|
2603
|
+
choose
|
2610
2604
|
}
|
2611
2605
|
if (ordered) {
|
2612
2606
|
priority.ordered = ordered
|
@@ -2631,7 +2625,7 @@ class Config {
|
|
2631
2625
|
}
|
2632
2626
|
|
2633
2627
|
const seen = {}
|
2634
|
-
for (
|
2628
|
+
for (const operator of this.config.operators) {
|
2635
2629
|
if (seen[operator.pattern]) {
|
2636
2630
|
const key = `${operator.pattern} (namespace: ${operator.uuid})`
|
2637
2631
|
throw new Error(`Operator '${key}' is defined more than once in the operators`)
|
@@ -2704,10 +2698,10 @@ class Config {
|
|
2704
2698
|
throw new Error(`Setting invalid property ${property}`)
|
2705
2699
|
}
|
2706
2700
|
|
2707
|
-
if ('words'
|
2708
|
-
for (
|
2709
|
-
for (
|
2710
|
-
if (!def
|
2701
|
+
if (property == 'words') {
|
2702
|
+
for (const word in value) {
|
2703
|
+
for (const def of value[word]) {
|
2704
|
+
if (!def.uuid) {
|
2711
2705
|
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`)
|
2712
2706
|
}
|
2713
2707
|
}
|
@@ -2715,8 +2709,8 @@ class Config {
|
|
2715
2709
|
}
|
2716
2710
|
|
2717
2711
|
if (['operators', 'bridges'].includes(property)) {
|
2718
|
-
for (
|
2719
|
-
if (!def
|
2712
|
+
for (const def of value) {
|
2713
|
+
if (!def.uuid) {
|
2720
2714
|
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`)
|
2721
2715
|
}
|
2722
2716
|
}
|
@@ -2796,9 +2790,9 @@ class Config {
|
|
2796
2790
|
this.configs.forEach((km) => {
|
2797
2791
|
this.instances = (km._config.instances || this.initInstances.slice()).concat(this.instances)
|
2798
2792
|
})
|
2799
|
-
|
2800
|
-
for (
|
2801
|
-
if (!noDups.find(
|
2793
|
+
const noDups = []
|
2794
|
+
for (const instance of this.instances) {
|
2795
|
+
if (!noDups.find((existing) => existing.name == instance.name)) {
|
2802
2796
|
noDups.push(instance)
|
2803
2797
|
}
|
2804
2798
|
}
|
@@ -2810,7 +2804,7 @@ class Config {
|
|
2810
2804
|
}
|
2811
2805
|
|
2812
2806
|
// TODO get rid of useOldVersion arg
|
2813
|
-
addInternal (more, { uuid, addFirst = false, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps
|
2807
|
+
addInternal (more, { uuid, addFirst = false, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps: hcps = false } = {}) {
|
2814
2808
|
validConfigProps(more)
|
2815
2809
|
if (more instanceof Config) {
|
2816
2810
|
more.initialize({ force: false })
|
@@ -2892,12 +2886,12 @@ class Config {
|
|
2892
2886
|
const isDup = (op1, op2) => op1.pattern == op2.pattern
|
2893
2887
|
for (const newOne of more[key]) {
|
2894
2888
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2895
|
-
const oldOne = this.config[key][iOldOne]
|
2889
|
+
const oldOne = this.config[key][iOldOne]
|
2896
2890
|
if (isDup(newOne, oldOne)) {
|
2897
2891
|
if (oldOne.allowDups) {
|
2898
2892
|
// the old one takes precedence to match what would happen during the original load
|
2899
2893
|
this.config[key].splice(iOldOne, 1)
|
2900
|
-
break
|
2894
|
+
break
|
2901
2895
|
}
|
2902
2896
|
}
|
2903
2897
|
}
|
@@ -2908,14 +2902,14 @@ class Config {
|
|
2908
2902
|
const idDup = (b1, b2) => b1.id == b2.id && b1.level == b2.level && b1.bridge == b2.bridge
|
2909
2903
|
for (const newOne of more[key]) {
|
2910
2904
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2911
|
-
const oldOne = this.config[key][iOldOne]
|
2905
|
+
const oldOne = this.config[key][iOldOne]
|
2912
2906
|
if (newOne.id == oldOne.id) {
|
2913
2907
|
if (oldOne.allowDups) {
|
2914
2908
|
// the old one takes precedence to match what would happen during the original load
|
2915
2909
|
this.config[key].splice(iOldOne, 1)
|
2916
|
-
break
|
2910
|
+
break
|
2917
2911
|
}
|
2918
|
-
}
|
2912
|
+
}
|
2919
2913
|
}
|
2920
2914
|
}
|
2921
2915
|
}
|
@@ -3013,12 +3007,12 @@ class Config {
|
|
3013
3007
|
const isDup = (op1, op2) => op1.pattern == op2.pattern
|
3014
3008
|
for (const newOne of more[key]) {
|
3015
3009
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
3016
|
-
const oldOne = this.config[key][iOldOne]
|
3010
|
+
const oldOne = this.config[key][iOldOne]
|
3017
3011
|
if (isDup(newOne, oldOne)) {
|
3018
3012
|
if (oldOne.allowDups) {
|
3019
3013
|
// the old one takes precedence to match what would happen during the original load
|
3020
3014
|
this.config[key].splice(iOldOne, 1)
|
3021
|
-
break
|
3015
|
+
break
|
3022
3016
|
}
|
3023
3017
|
}
|
3024
3018
|
}
|
@@ -3029,12 +3023,12 @@ class Config {
|
|
3029
3023
|
const idDup = (b1, b2) => b1.id == b2.id && b1.level == b2.level && b1.bridge == b2.bridge
|
3030
3024
|
for (const newOne of more[key]) {
|
3031
3025
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
3032
|
-
const oldOne = this.config[key][iOldOne]
|
3026
|
+
const oldOne = this.config[key][iOldOne]
|
3033
3027
|
if (newOne.id == oldOne.id) {
|
3034
3028
|
if (oldOne.allowDups) {
|
3035
3029
|
// the old one takes precedence to match what would happen during the original load
|
3036
3030
|
this.config[key].splice(iOldOne, 1)
|
3037
|
-
break
|
3031
|
+
break
|
3038
3032
|
}
|
3039
3033
|
}
|
3040
3034
|
}
|
@@ -3060,5 +3054,5 @@ module.exports = {
|
|
3060
3054
|
Config,
|
3061
3055
|
config_toServer,
|
3062
3056
|
operatorKey_valid,
|
3063
|
-
handleBridgeProps
|
3057
|
+
handleBridgeProps
|
3064
3058
|
}
|