theprogrammablemind 7.10.0 → 7.10.1
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 +280 -288
- package/demo.js +24 -24
- package/lines.js +2 -2
- package/package.json +1 -1
- package/runtime.js +2 -2
- package/src/config.js +261 -241
- 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,16 +19,17 @@ 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) => {
|
26
|
+
// cant change things because copy breaks something
|
26
27
|
}
|
27
28
|
|
28
29
|
const debugPriority = (priority) => {
|
29
30
|
if (global.entodictonDebugPriority) {
|
30
31
|
if (helpers.subPriority(entodictonDebugPriority, priority)) {
|
31
|
-
debugger
|
32
|
+
debugger // debug hierarchy hit
|
32
33
|
}
|
33
34
|
}
|
34
35
|
}
|
@@ -36,7 +37,7 @@ const debugPriority = (priority) => {
|
|
36
37
|
const debugAssociation = (association) => {
|
37
38
|
if (global.entodictonDebugAssociation) {
|
38
39
|
if (helpers.safeEquals(global.entodictonDebugAssociation, association)) {
|
39
|
-
debugger
|
40
|
+
debugger // debug association hit
|
40
41
|
}
|
41
42
|
}
|
42
43
|
}
|
@@ -44,15 +45,15 @@ const debugAssociation = (association) => {
|
|
44
45
|
const debugHierarchy = (pair) => {
|
45
46
|
if (global.entodictonDebugHierarchy) {
|
46
47
|
if (helpers.safeEquals(global.entodictonDebugHierarchy, pair)) {
|
47
|
-
debugger
|
48
|
+
debugger // debug hierarchy hit
|
48
49
|
}
|
49
50
|
}
|
50
51
|
}
|
51
52
|
|
52
|
-
const debugBridge = (bridge) => {
|
53
|
+
const debugBridge = (bridge) => {
|
53
54
|
if (global.entodictonDebugBridge) {
|
54
55
|
if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
|
55
|
-
debugger
|
56
|
+
debugger // debug hierarchy hit
|
56
57
|
}
|
57
58
|
}
|
58
59
|
}
|
@@ -60,7 +61,7 @@ const debugBridge = (bridge) => {
|
|
60
61
|
const debugOperator = (operator) => {
|
61
62
|
if (global.entodictonDebugOperator) {
|
62
63
|
if ((operator.pattern || operator) === global.entodictonDebugOperator) {
|
63
|
-
debugger
|
64
|
+
debugger // debug operator hit
|
64
65
|
}
|
65
66
|
}
|
66
67
|
}
|
@@ -74,7 +75,7 @@ const debugConfigProps = (config) => {
|
|
74
75
|
{ property: 'association', check: (v) => debugAssociation(v) },
|
75
76
|
{ property: 'hierarchy', check: (v) => debugHierarchy(v) },
|
76
77
|
{ property: 'operators', check: (v) => debugOperator(v) },
|
77
|
-
{ property: 'bridges', check: (v) => debugBridge(v) }
|
78
|
+
{ property: 'bridges', check: (v) => debugBridge(v) }
|
78
79
|
]
|
79
80
|
for (const { property, check } of checkProps) {
|
80
81
|
if (config[property]) {
|
@@ -86,21 +87,21 @@ const debugConfigProps = (config) => {
|
|
86
87
|
}
|
87
88
|
|
88
89
|
const validConfigProps = (config) => {
|
89
|
-
const valid = [
|
90
|
-
'hierarchy',
|
91
|
-
'objects',
|
92
|
-
'bridges',
|
93
|
-
'operators',
|
94
|
-
'words',
|
95
|
-
'priorities',
|
96
|
-
'associations',
|
97
|
-
'name',
|
98
|
-
'version',
|
99
|
-
'generatorp',
|
100
|
-
'generators',
|
101
|
-
'semantics',
|
102
|
-
'where',
|
103
|
-
'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',
|
104
105
|
'debug',
|
105
106
|
|
106
107
|
// TODO Fix these from the test app
|
@@ -115,7 +116,7 @@ const validConfigProps = (config) => {
|
|
115
116
|
'flatten',
|
116
117
|
|
117
118
|
'namespaces',
|
118
|
-
'eqClasses'
|
119
|
+
'eqClasses'
|
119
120
|
]
|
120
121
|
helpers.validProps(valid, config, 'config')
|
121
122
|
}
|
@@ -133,30 +134,29 @@ const setupInitializerFNArgs = (config, args) => {
|
|
133
134
|
config: config.getPseudoConfig(args.uuid, args.currentConfig),
|
134
135
|
km,
|
135
136
|
baseConfig: config,
|
136
|
-
apis
|
137
|
+
apis
|
137
138
|
}
|
138
139
|
}
|
139
140
|
|
140
141
|
const operatorKey_valid = (key) => {
|
141
142
|
if (
|
142
|
-
|
143
|
+
!_.isArray(key) ||
|
143
144
|
key.length != 2 ||
|
144
145
|
!_.isString(key[0]) ||
|
145
146
|
!_.isInteger(key[1]) ||
|
146
147
|
key[1] < 0
|
147
|
-
|
148
|
-
|
148
|
+
) {
|
149
149
|
let details = ''
|
150
150
|
if (!_.isArray(key)) {
|
151
|
-
details =
|
151
|
+
details = 'Expected an array.'
|
152
152
|
} else if (key.length != 2) {
|
153
|
-
details =
|
153
|
+
details = 'Expected an array of length two.'
|
154
154
|
} else if (!_.isString(key[0])) {
|
155
|
-
details =
|
155
|
+
details = 'Expected element zero to be a string that is an operator id.'
|
156
156
|
} else if (!_.isInteger(key[1])) {
|
157
|
-
details =
|
157
|
+
details = 'Expected element one to be a number that is an operator level.'
|
158
158
|
} else if (key[1] < 0) {
|
159
|
-
details =
|
159
|
+
details = 'Expected element one to be a number that is an operator level which is greater than zero.'
|
160
160
|
}
|
161
161
|
throw new Error(`${JSON.stringify(key)} is not a valid operator key. Values are of the form [<operatorId>, <operatorLevel>]. ${details}`)
|
162
162
|
}
|
@@ -166,13 +166,13 @@ const elist = (list, check, prefix) => {
|
|
166
166
|
for ([index, element] of list.entries()) {
|
167
167
|
try {
|
168
168
|
check(element)
|
169
|
-
} catch(
|
169
|
+
} catch (e) {
|
170
170
|
throw new Error(prefix(index, e))
|
171
171
|
}
|
172
172
|
}
|
173
173
|
}
|
174
174
|
const priorities_valid = (cps) => {
|
175
|
-
elist(cps, (cp) => priority_valid(cp),
|
175
|
+
elist(cps, (cp) => priority_valid(cp), (index, e) => `priorities has an invalid priority at position ${index}. ${e}`)
|
176
176
|
}
|
177
177
|
|
178
178
|
const priority_valid = (cp) => {
|
@@ -186,16 +186,16 @@ const priority_valid = (cp) => {
|
|
186
186
|
if (!_.isArray(cp.choose)) {
|
187
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.`)
|
188
188
|
}
|
189
|
-
elist(cp.choose,
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
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}`
|
199
199
|
)
|
200
200
|
}
|
201
201
|
|
@@ -203,29 +203,29 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
203
203
|
ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
|
204
204
|
() => {
|
205
205
|
if (!bridge.bridge) {
|
206
|
-
bridge.bridge =
|
206
|
+
bridge.bridge = '{ ...next(operator) }'
|
207
207
|
}
|
208
208
|
if (!bridge.level) {
|
209
209
|
bridge.level = 0
|
210
210
|
}
|
211
211
|
if (bridge.children) {
|
212
|
-
for (
|
212
|
+
for (const child of bridge.children) {
|
213
213
|
config.addHierarchy(child, bridge.id)
|
214
214
|
}
|
215
215
|
}
|
216
216
|
if (bridge.parents) {
|
217
|
-
for (
|
217
|
+
for (const parent of bridge.parents) {
|
218
218
|
config.addHierarchy(bridge.id, parent)
|
219
219
|
}
|
220
220
|
}
|
221
221
|
if (bridge.isA) {
|
222
|
-
for (
|
222
|
+
for (const parent of bridge.isA) {
|
223
223
|
config.addHierarchy(bridge.id, parent)
|
224
224
|
}
|
225
225
|
}
|
226
226
|
if (bridge.before) {
|
227
227
|
for (let after of bridge.before) {
|
228
|
-
if (typeof after
|
228
|
+
if (typeof after === 'string') {
|
229
229
|
after = [after, 0]
|
230
230
|
}
|
231
231
|
config.addPriority({ context: [[bridge.id, bridge.level], after], choose: [0] })
|
@@ -233,7 +233,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
233
233
|
}
|
234
234
|
if (bridge.after) {
|
235
235
|
for (let before of bridge.after) {
|
236
|
-
if (typeof before
|
236
|
+
if (typeof before === 'string') {
|
237
237
|
before = [before, 0]
|
238
238
|
}
|
239
239
|
config.addPriority({ context: [before, [bridge.id, bridge.level]], choose: [0] })
|
@@ -241,8 +241,8 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
241
241
|
}
|
242
242
|
if (bridge.words) {
|
243
243
|
for (let def of bridge.words) {
|
244
|
-
if (typeof def
|
245
|
-
config.addWordInternal(def, {
|
244
|
+
if (typeof def === 'string') {
|
245
|
+
config.addWordInternal(def, { id: bridge.id, initial: `{ value: "${def}"}` })
|
246
246
|
} else {
|
247
247
|
const word = def.word
|
248
248
|
def = { initial: JSON.stringify(def), id: bridge.id, word }
|
@@ -262,7 +262,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
262
262
|
if (bridge.generators) {
|
263
263
|
const generators = [...bridge.generators]
|
264
264
|
generators.reverse()
|
265
|
-
for (
|
265
|
+
for (const generator of generators) {
|
266
266
|
if (addFirst) {
|
267
267
|
config.config.generators.unshift(generator)
|
268
268
|
} else {
|
@@ -276,33 +276,32 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
276
276
|
}
|
277
277
|
if (bridge.generatorp) {
|
278
278
|
const match = bridge.generatorp.match || (() => true)
|
279
|
-
const apply = typeof bridge.generatorp
|
279
|
+
const apply = typeof bridge.generatorp === 'function' ? bridge.generatorp : bridge.generatorp.apply || bridge.generatorp
|
280
280
|
const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
|
281
|
-
|
281
|
+
|
282
282
|
const generator = {
|
283
283
|
where: bridge.generatorp.where || bridge.where || client.where(4),
|
284
284
|
match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
|
285
285
|
apply: (args) => apply(args),
|
286
286
|
applyWrapped: apply,
|
287
|
-
property: 'generatorp'
|
287
|
+
property: 'generatorp'
|
288
288
|
}
|
289
289
|
if (addFirst) {
|
290
290
|
config.config.generators.unshift(generator)
|
291
291
|
} else {
|
292
292
|
config.config.generators.push(generator)
|
293
293
|
}
|
294
|
-
|
295
294
|
}
|
296
295
|
if (bridge.generatorr) {
|
297
296
|
const match = bridge.generatorr.match || (() => true)
|
298
|
-
const apply = typeof bridge.generatorr
|
297
|
+
const apply = typeof bridge.generatorr === 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
|
299
298
|
const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
|
300
299
|
const generator = {
|
301
300
|
where: bridge.generatorr.where || bridge.where || client.where(4),
|
302
301
|
match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
|
303
302
|
apply: (args) => apply(args),
|
304
303
|
applyWrapped: apply,
|
305
|
-
property: 'generatorr'
|
304
|
+
property: 'generatorr'
|
306
305
|
}
|
307
306
|
if (addFirst) {
|
308
307
|
config.config.generators.unshift(generator)
|
@@ -313,10 +312,10 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
313
312
|
if (bridge.evaluator) {
|
314
313
|
const semantic = {
|
315
314
|
where: bridge.evaluator.where || bridge.where || client.where(3),
|
316
|
-
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
315
|
+
match: ({ context }) => bridge.id == context.marker && context.evaluate,
|
317
316
|
apply: (args) => bridge.evaluator(args),
|
318
317
|
applyWrapped: bridge.evaluator,
|
319
|
-
property: 'evaluator'
|
318
|
+
property: 'evaluator'
|
320
319
|
}
|
321
320
|
if (addFirst) {
|
322
321
|
config.config.semantics.unshift(semantic)
|
@@ -327,10 +326,10 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
327
326
|
if (bridge.semantic) {
|
328
327
|
const semantic = {
|
329
328
|
where: bridge.semantic.where || bridge.where || client.where(3),
|
330
|
-
match: ({context}) => bridge.id == context.marker,
|
329
|
+
match: ({ context }) => bridge.id == context.marker,
|
331
330
|
apply: (args) => bridge.semantic(args),
|
332
331
|
applyWrapped: bridge.semantic,
|
333
|
-
property: 'semantic'
|
332
|
+
property: 'semantic'
|
334
333
|
}
|
335
334
|
if (addFirst) {
|
336
335
|
config.config.semantics.unshift(semantic)
|
@@ -343,11 +342,15 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
343
342
|
}
|
344
343
|
|
345
344
|
const handleCalculatedProps = (baseConfig, moreConfig, addFirst) => {
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
345
|
+
if (moreConfig.bridges) {
|
346
|
+
moreConfig.bridges = moreConfig.bridges.map((bridge) => {
|
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']
|
350
|
+
helpers.validProps(valid, bridge, 'bridge')
|
351
|
+
handleBridgeProps(baseConfig, bridge, addFirst)
|
352
|
+
return bridge
|
353
|
+
})
|
351
354
|
}
|
352
355
|
if (moreConfig.operators) {
|
353
356
|
moreConfig.operators = moreConfig.operators.map((operator) => {
|
@@ -364,7 +367,6 @@ if (runtime.process.env.DEBUG_HIERARCHY) {
|
|
364
367
|
global.entodictonDebugHierarchy = JSON.parse(runtime.process.env.DEBUG_HIERARCHY)
|
365
368
|
}
|
366
369
|
|
367
|
-
|
368
370
|
// i keep randomly doing one of the other so I will just make both work the same way
|
369
371
|
if (runtime.process.env.DEBUG_PRIORITIES) {
|
370
372
|
global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITIES)
|
@@ -385,7 +387,7 @@ if (runtime.process.env.DEBUG_BRIDGE) {
|
|
385
387
|
// id/level
|
386
388
|
global.entodictonDebugBridge = runtime.process.env.DEBUG_BRIDGE.split('/')
|
387
389
|
if (global.entodictonDebugBridge.length !== 2) {
|
388
|
-
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"')
|
389
391
|
process.exit(-1)
|
390
392
|
}
|
391
393
|
global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
|
@@ -397,12 +399,12 @@ if (runtime.process.env.DEBUG_OPERATOR) {
|
|
397
399
|
}
|
398
400
|
|
399
401
|
const hierarchyCanonical = (element) => {
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
}
|
402
|
+
if (element.child && element.parent) {
|
403
|
+
return element
|
404
|
+
} else {
|
405
|
+
return { child: element[0], parent: element[1] }
|
405
406
|
}
|
407
|
+
}
|
406
408
|
|
407
409
|
const isValidDef = (word, def, config) => {
|
408
410
|
if (!def.id) {
|
@@ -447,21 +449,20 @@ const normalizeConfig = (config) => {
|
|
447
449
|
config[bag][i].km = config.name
|
448
450
|
}
|
449
451
|
}
|
450
|
-
|
451
452
|
}
|
452
|
-
if (config
|
453
|
-
for (
|
453
|
+
if (config.bridges) {
|
454
|
+
for (const bridge of config.bridges) {
|
454
455
|
if (!bridge.level) {
|
455
456
|
bridge.level = 0
|
456
457
|
}
|
457
458
|
if (!bridge.bridge) {
|
458
|
-
bridge.bridge =
|
459
|
+
bridge.bridge = '{ ...next(operator) }'
|
459
460
|
}
|
460
461
|
}
|
461
462
|
}
|
462
463
|
|
463
464
|
if (config.semantics) {
|
464
|
-
for (
|
465
|
+
for (const semantic of config.semantics) {
|
465
466
|
if (semantic.oneShot) {
|
466
467
|
semantic.id = uuid()
|
467
468
|
}
|
@@ -606,7 +607,7 @@ class KM {
|
|
606
607
|
const config = configDup(this._config, options)
|
607
608
|
const km = new KM({
|
608
609
|
config,
|
609
|
-
getCounter: options.getCounter,
|
610
|
+
getCounter: options.getCounter,
|
610
611
|
name: this._name,
|
611
612
|
_uuid: config._uuid,
|
612
613
|
namespace: this._namespace,
|
@@ -703,16 +704,14 @@ const multiApiImpl = (initializer) => {
|
|
703
704
|
})
|
704
705
|
}
|
705
706
|
|
706
|
-
|
707
707
|
class Config {
|
708
|
-
|
709
708
|
toServer (config) {
|
710
709
|
return config_toServer(config)
|
711
710
|
}
|
712
711
|
|
713
712
|
base () {
|
714
713
|
const base = new Config()
|
715
|
-
for (
|
714
|
+
for (const km of this.configs.reverse()) {
|
716
715
|
if (km.isSelf) {
|
717
716
|
continue
|
718
717
|
}
|
@@ -721,9 +720,30 @@ class Config {
|
|
721
720
|
return base
|
722
721
|
}
|
723
722
|
|
723
|
+
getInfo () {
|
724
|
+
const name = this.name
|
725
|
+
const includes = this.configs.slice(1).map((km) => km.config.name)
|
726
|
+
const visibleExamples = []
|
727
|
+
for (const test of this.tests) {
|
728
|
+
if (!test.developerTest) {
|
729
|
+
visibleExamples.push(test.query)
|
730
|
+
}
|
731
|
+
}
|
732
|
+
const templateQueries = []
|
733
|
+
if (this.instances && this.instances.length > 0) {
|
734
|
+
for (const query of this.instances.slice(-1)[0].queries) {
|
735
|
+
if (typeof query === 'string') {
|
736
|
+
templateQueries.push(query)
|
737
|
+
}
|
738
|
+
}
|
739
|
+
}
|
740
|
+
const info = { name, description: this.description, examples: visibleExamples, template: templateQueries, includes }
|
741
|
+
return info
|
742
|
+
}
|
743
|
+
|
724
744
|
getPseudoConfig (uuid, config) {
|
725
745
|
return {
|
726
|
-
description:
|
746
|
+
description: 'this is a pseudo config that has limited functionality due to being available in the initializer function context',
|
727
747
|
addAssociation: (...args) => this.addAssociation(...args),
|
728
748
|
addAssociations: (...args) => this.addAssociations(...args),
|
729
749
|
addBridge: (...args) => this.addBridge(...args, uuid),
|
@@ -743,7 +763,7 @@ class Config {
|
|
743
763
|
getBridge: (...args) => this.getBridge(...args),
|
744
764
|
fragment: (...args) => this.fragment(...args),
|
745
765
|
exists: (...args) => this.exists(...args),
|
746
|
-
addAPI: (...args) => this.addAPI(...args)
|
766
|
+
addAPI: (...args) => this.addAPI(...args)
|
747
767
|
}
|
748
768
|
}
|
749
769
|
|
@@ -757,7 +777,7 @@ class Config {
|
|
757
777
|
}
|
758
778
|
|
759
779
|
// return the config with just the elements from the included KM's
|
760
|
-
baseConfig() {
|
780
|
+
baseConfig () {
|
761
781
|
const operators = this.config.operators.filter((operator) => {
|
762
782
|
return operator.uuid !== this.uuid
|
763
783
|
})
|
@@ -765,8 +785,8 @@ class Config {
|
|
765
785
|
return bridge.uuid !== this.uuid
|
766
786
|
})
|
767
787
|
const words = {}
|
768
|
-
for (
|
769
|
-
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)
|
770
790
|
if (defs.length > 0) {
|
771
791
|
words[word] = defs
|
772
792
|
}
|
@@ -784,11 +804,11 @@ class Config {
|
|
784
804
|
return `${maybeName}${counter}`
|
785
805
|
}
|
786
806
|
|
787
|
-
setTestConfig(testConfig) {
|
807
|
+
setTestConfig (testConfig) {
|
788
808
|
this.testConfig = testConfig
|
789
809
|
}
|
790
810
|
|
791
|
-
getTestConfig() {
|
811
|
+
getTestConfig () {
|
792
812
|
return this.testConfig
|
793
813
|
}
|
794
814
|
|
@@ -833,44 +853,44 @@ class Config {
|
|
833
853
|
|
834
854
|
// applies only to config sent to the server
|
835
855
|
|
836
|
-
watching() {
|
856
|
+
watching () {
|
837
857
|
const props = [
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
]
|
858
|
+
'operators',
|
859
|
+
'bridges',
|
860
|
+
'hierarchy',
|
861
|
+
'namespaces',
|
862
|
+
'eqClasses',
|
863
|
+
'priorities',
|
864
|
+
'associations',
|
865
|
+
'words',
|
866
|
+
'floaters',
|
867
|
+
'implicits',
|
868
|
+
'flatten'
|
869
|
+
]
|
850
870
|
const watching = {}
|
851
|
-
for (
|
871
|
+
for (const prop of props) {
|
852
872
|
watching[prop] = this.config[prop]
|
853
873
|
}
|
854
874
|
return JSON.stringify(watching)
|
855
875
|
}
|
856
876
|
|
857
|
-
watch() {
|
858
|
-
this.watchStart = this.watching()
|
877
|
+
watch () {
|
878
|
+
this.watchStart = this.watching()
|
859
879
|
}
|
860
880
|
|
861
|
-
wasChanged() {
|
881
|
+
wasChanged () {
|
862
882
|
if (!this.watchStart) {
|
863
|
-
return false
|
883
|
+
return false
|
864
884
|
}
|
865
885
|
return this.watchStart !== this.watching()
|
866
886
|
}
|
867
887
|
|
868
|
-
|
869
|
-
for (
|
888
|
+
exists (marker) {
|
889
|
+
for (const bridge of this.config.bridges) {
|
870
890
|
if (bridge.id == marker) {
|
871
|
-
return true
|
891
|
+
return true
|
872
892
|
}
|
873
|
-
|
893
|
+
}
|
874
894
|
}
|
875
895
|
|
876
896
|
getSemantics (logs = []) {
|
@@ -884,7 +904,7 @@ class Config {
|
|
884
904
|
warningNotEvaluated (log, value) {
|
885
905
|
const description = 'WARNING: for semantics, implement an evaluations handler, set "value" property of the operator to the value.'
|
886
906
|
const match = `({context}) => context.marker == '${value.marker}' && context.evaluate && <other conditions as you like>`
|
887
|
-
const apply =
|
907
|
+
const apply = '({context}) => <do stuff...>; context.value = <value>'
|
888
908
|
const input = indent(JSON.stringify(value, null, 2), 2)
|
889
909
|
const message = `${description}\nThe semantic would be\n match: ${match}\n apply: ${apply}\nThe input context would be:\n${input}\n`
|
890
910
|
log.push(indent(message, 4))
|
@@ -911,18 +931,17 @@ class Config {
|
|
911
931
|
const instance = s({ ...context, evaluate: true })
|
912
932
|
calls.touch(instance)
|
913
933
|
if (!instance.evalue && !instance.verbatim && !instance.value) {
|
914
|
-
this.warningNotEvaluated(log, context)
|
934
|
+
this.warningNotEvaluated(log, context)
|
915
935
|
}
|
916
936
|
if (!instance.evalue) {
|
917
937
|
instance.evalue = instance.value
|
918
938
|
instance.edefault = true
|
919
939
|
}
|
920
940
|
delete instance.evaluate
|
921
|
-
instance.instance = true
|
941
|
+
instance.instance = true
|
922
942
|
return instance
|
923
943
|
}
|
924
944
|
|
925
|
-
|
926
945
|
fragmentInstantiator (contexts) {
|
927
946
|
return new Object({
|
928
947
|
contexts: () => contexts,
|
@@ -944,7 +963,7 @@ class Config {
|
|
944
963
|
continue
|
945
964
|
}
|
946
965
|
if (context[key].instantiated) {
|
947
|
-
continue
|
966
|
+
continue
|
948
967
|
}
|
949
968
|
todo.push(context[key])
|
950
969
|
}
|
@@ -970,20 +989,20 @@ class Config {
|
|
970
989
|
return true
|
971
990
|
}
|
972
991
|
const toCanonical = (f) => {
|
973
|
-
if (typeof f
|
992
|
+
if (typeof f === 'string') {
|
974
993
|
return { query: f }
|
975
994
|
} else {
|
976
995
|
return f
|
977
996
|
}
|
978
997
|
}
|
979
|
-
const instanceFragments = (instance.fragments || []).map((fragment) => fragment.key || fragment.query).map(
|
980
|
-
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)
|
981
1000
|
const sameFragments = helpers.safeEquals(templateFragments, instanceFragments)
|
982
1001
|
const toCanonicalQuery = (queryOrConfig) => {
|
983
|
-
if (typeof queryOrConfig
|
1002
|
+
if (typeof queryOrConfig === 'string') {
|
984
1003
|
const query = queryOrConfig
|
985
1004
|
return query
|
986
|
-
} else if (typeof queryOrConfig
|
1005
|
+
} else if (typeof queryOrConfig === 'function') {
|
987
1006
|
if (options.isModule) {
|
988
1007
|
return { apply: 'function in the browser has webpack rewrites so can not be compared' }
|
989
1008
|
} else {
|
@@ -998,8 +1017,8 @@ class Config {
|
|
998
1017
|
} else {
|
999
1018
|
const config = { ...queryOrConfig }
|
1000
1019
|
delete config.where
|
1001
|
-
config.operators = (config.operators || []).map(
|
1002
|
-
if (typeof operator
|
1020
|
+
config.operators = (config.operators || []).map((operator) => {
|
1021
|
+
if (typeof operator === 'string') {
|
1003
1022
|
return { pattern: operator }
|
1004
1023
|
} else {
|
1005
1024
|
operator = { ...operator }
|
@@ -1007,7 +1026,7 @@ class Config {
|
|
1007
1026
|
return operator
|
1008
1027
|
}
|
1009
1028
|
})
|
1010
|
-
config.bridges = (config.bridges || []).map(
|
1029
|
+
config.bridges = (config.bridges || []).map((bridge) => {
|
1011
1030
|
bridge = { ...bridge },
|
1012
1031
|
bridge.level = bridge.level || 0
|
1013
1032
|
delete bridge.uuid
|
@@ -1015,10 +1034,10 @@ class Config {
|
|
1015
1034
|
})
|
1016
1035
|
if (options.isModule) {
|
1017
1036
|
// things like webpack rewrite the functions if there are constants so this compare does not work
|
1018
|
-
delete config.generators
|
1019
|
-
delete config.semantics
|
1037
|
+
delete config.generators
|
1038
|
+
delete config.semantics
|
1020
1039
|
config.bridges = (config.bridges || []).map((bridge) => {
|
1021
|
-
bridge = {...bridge}
|
1040
|
+
bridge = { ...bridge }
|
1022
1041
|
delete bridge.where
|
1023
1042
|
delete bridge.generatorp
|
1024
1043
|
delete bridge.generatorr
|
@@ -1026,24 +1045,24 @@ class Config {
|
|
1026
1045
|
delete bridge.evaluator
|
1027
1046
|
delete bridge.semantic
|
1028
1047
|
return bridge
|
1029
|
-
})
|
1048
|
+
})
|
1030
1049
|
} else {
|
1031
1050
|
config.generators = (config.generators || []).map((generator) => {
|
1032
|
-
generator = {...generator}
|
1051
|
+
generator = { ...generator }
|
1033
1052
|
delete generator.where
|
1034
1053
|
generator.match = generator.match.toString()
|
1035
1054
|
generator.apply = generator.apply.toString()
|
1036
1055
|
return generator
|
1037
1056
|
})
|
1038
1057
|
config.semantics = (config.semantics || []).map((semantic) => {
|
1039
|
-
semantic = {...semantic}
|
1058
|
+
semantic = { ...semantic }
|
1040
1059
|
delete semantic.where
|
1041
1060
|
semantic.match = semantic.match.toString()
|
1042
1061
|
semantic.apply = semantic.apply.toString()
|
1043
1062
|
return semantic
|
1044
1063
|
})
|
1045
1064
|
config.bridges = (config.bridges || []).map((bridge) => {
|
1046
|
-
bridge = {...bridge}
|
1065
|
+
bridge = { ...bridge }
|
1047
1066
|
delete bridge.where
|
1048
1067
|
if (bridge.generatorp) {
|
1049
1068
|
bridge.generatorp = bridge.generatorp.toString()
|
@@ -1067,13 +1086,13 @@ class Config {
|
|
1067
1086
|
}
|
1068
1087
|
}
|
1069
1088
|
const toCanonicalQueries = (elements) => {
|
1070
|
-
return elements.map(
|
1089
|
+
return elements.map(toCanonicalQuery)
|
1071
1090
|
}
|
1072
1091
|
|
1073
1092
|
const templateQueries = toCanonicalQueries(template.queries || []).map(helpers.updateQueries)
|
1074
1093
|
const instanceQueries = toCanonicalQueries(instance.queries || [])
|
1075
1094
|
let sameQueries = true
|
1076
|
-
let startOfChanges
|
1095
|
+
let startOfChanges
|
1077
1096
|
for (let iq = 0; iq < templateQueries.length; ++iq) {
|
1078
1097
|
if (!helpers.safeEquals(templateQueries[iq], instanceQueries[iq])) {
|
1079
1098
|
sameQueries = false
|
@@ -1081,9 +1100,10 @@ class Config {
|
|
1081
1100
|
}
|
1082
1101
|
}
|
1083
1102
|
|
1084
|
-
|
1085
|
-
|
1086
|
-
console.log('
|
1103
|
+
const debug = true
|
1104
|
+
if (debug && startOfChanges) {
|
1105
|
+
console.log('templateQueries[startOfChanges]', templateQueries[startOfChanges])
|
1106
|
+
console.log('instanceQueries[startOfChanges]', instanceQueries[startOfChanges])
|
1087
1107
|
}
|
1088
1108
|
|
1089
1109
|
// things were deleted case
|
@@ -1092,7 +1112,6 @@ class Config {
|
|
1092
1112
|
}
|
1093
1113
|
// const sameQueries = helpers.safeEquals(toCanonicalQueries(template.queries || []).map(helpers.updateQueries), toCanonicalQueries(instance.queries || []))
|
1094
1114
|
|
1095
|
-
const debug = false
|
1096
1115
|
if (debug) {
|
1097
1116
|
if (!(instance && sameQueries && sameFragments)) {
|
1098
1117
|
if (!sameQueries) {
|
@@ -1100,8 +1119,8 @@ class Config {
|
|
1100
1119
|
debugger
|
1101
1120
|
}
|
1102
1121
|
// console.log("instance", instance)
|
1103
|
-
console.log(
|
1104
|
-
console.log(
|
1122
|
+
console.log('sameQueries', sameQueries)
|
1123
|
+
console.log('sameFragments', sameFragments)
|
1105
1124
|
// console.log("templateFragments", templateFragments)
|
1106
1125
|
// console.log("instanceFragments", instanceFragments)
|
1107
1126
|
// console.log('template.queries', JSON.stringify(toCanonicalQueries(template.queries || []).map(helpers.updateQueries), null, 2))
|
@@ -1119,8 +1138,8 @@ class Config {
|
|
1119
1138
|
if (!template.queries && !template.fragments) {
|
1120
1139
|
throw new Error(`Expected the template for ${this.name} to be an object that can have the properties: queries and fragments`)
|
1121
1140
|
}
|
1122
|
-
for (
|
1123
|
-
if (typeof query
|
1141
|
+
for (const query of template.queries || []) {
|
1142
|
+
if (typeof query === 'string') {
|
1124
1143
|
} else if (query instanceof Config) {
|
1125
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).`)
|
1126
1145
|
}
|
@@ -1133,7 +1152,7 @@ class Config {
|
|
1133
1152
|
}
|
1134
1153
|
|
1135
1154
|
// loadTemplate
|
1136
|
-
load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }
|
1155
|
+
load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
|
1137
1156
|
this.validifyTemplate(template)
|
1138
1157
|
instance.template = template
|
1139
1158
|
this.logs.push(`loading template for ${this.name}`)
|
@@ -1145,15 +1164,15 @@ class Config {
|
|
1145
1164
|
} else {
|
1146
1165
|
// no change
|
1147
1166
|
// this.initInstances.push({ ...instance, name: config.name })
|
1148
|
-
const isEmpty = (
|
1167
|
+
const isEmpty = (instance) => {
|
1149
1168
|
const properties = [
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1169
|
+
'queries',
|
1170
|
+
'resultss',
|
1171
|
+
'fragments',
|
1172
|
+
'semantics',
|
1173
|
+
'associations'
|
1155
1174
|
]
|
1156
|
-
return !properties.find(
|
1175
|
+
return !properties.find((property) => instance[property] && instance[property].length > 0)
|
1157
1176
|
}
|
1158
1177
|
if (!isEmpty(instance)) {
|
1159
1178
|
// fix up apply functions
|
@@ -1171,7 +1190,7 @@ class Config {
|
|
1171
1190
|
}
|
1172
1191
|
}
|
1173
1192
|
|
1174
|
-
addFragments(fragments) {
|
1193
|
+
addFragments (fragments) {
|
1175
1194
|
// only run this if not loading as module write error if loading as module and different
|
1176
1195
|
this.dynamicFragments = this.dynamicFragments.concat(fragments)
|
1177
1196
|
}
|
@@ -1181,12 +1200,12 @@ class Config {
|
|
1181
1200
|
}
|
1182
1201
|
|
1183
1202
|
addAssociations (associations) {
|
1184
|
-
for (
|
1203
|
+
for (const association of associations) {
|
1185
1204
|
this.addAssociation(association)
|
1186
1205
|
}
|
1187
1206
|
}
|
1188
1207
|
|
1189
|
-
debugConfig() {
|
1208
|
+
debugConfig () {
|
1190
1209
|
}
|
1191
1210
|
|
1192
1211
|
addAssociation (association) {
|
@@ -1215,17 +1234,17 @@ class Config {
|
|
1215
1234
|
}
|
1216
1235
|
|
1217
1236
|
addPriorities (priorities) {
|
1218
|
-
for (
|
1237
|
+
for (const priority of priorities) {
|
1219
1238
|
this.addPriority(priority)
|
1220
1239
|
}
|
1221
1240
|
}
|
1222
1241
|
|
1223
1242
|
addHierarchy (child, parent) {
|
1224
|
-
if (child && parent || !child || Array.isArray(child) || (typeof child
|
1243
|
+
if (child && parent || !child || Array.isArray(child) || (typeof child === 'string' && !parent)) {
|
1225
1244
|
this.addHierarchyChildParent(child, parent)
|
1226
1245
|
// this.addHierarchyProperties ({ child, parent })
|
1227
1246
|
} else {
|
1228
|
-
this.addHierarchyProperties
|
1247
|
+
this.addHierarchyProperties(child)
|
1229
1248
|
}
|
1230
1249
|
}
|
1231
1250
|
|
@@ -1251,8 +1270,8 @@ class Config {
|
|
1251
1270
|
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
1252
1271
|
}
|
1253
1272
|
debugHierarchy([child, parent])
|
1254
|
-
if (this.config.hierarchy.find(
|
1255
|
-
const hc = hierarchyCanonical(element)
|
1273
|
+
if (this.config.hierarchy.find((element) => {
|
1274
|
+
const hc = hierarchyCanonical(element)
|
1256
1275
|
if (child == hc.child && parent == hc.parent) {
|
1257
1276
|
return true
|
1258
1277
|
}
|
@@ -1267,9 +1286,9 @@ class Config {
|
|
1267
1286
|
|
1268
1287
|
getBridge (id, level) {
|
1269
1288
|
if (level) {
|
1270
|
-
return this.config.bridges.find(
|
1289
|
+
return this.config.bridges.find((bridge) => bridge.id == id && bridge.level == level)
|
1271
1290
|
} else {
|
1272
|
-
return this.config.bridges.find(
|
1291
|
+
return this.config.bridges.find((bridge) => bridge.id == id)
|
1273
1292
|
}
|
1274
1293
|
}
|
1275
1294
|
|
@@ -1279,12 +1298,12 @@ class Config {
|
|
1279
1298
|
}
|
1280
1299
|
const bridges = this.config.bridges
|
1281
1300
|
const def = Object.assign({}, bridge, { uuid: uuid || this._uuid })
|
1282
|
-
|
1301
|
+
|
1283
1302
|
debugBridge(bridge)
|
1284
1303
|
if (bridge.allowDups) {
|
1285
1304
|
// if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1286
|
-
if (bridges.find(
|
1287
|
-
return
|
1305
|
+
if (bridges.find((b) => b.id == bridge.id && b.level == bridge.level)) {
|
1306
|
+
return
|
1288
1307
|
}
|
1289
1308
|
}
|
1290
1309
|
if (global.transitoryMode) {
|
@@ -1292,7 +1311,7 @@ class Config {
|
|
1292
1311
|
}
|
1293
1312
|
handleBridgeProps(this, def)
|
1294
1313
|
bridges.push(def)
|
1295
|
-
this.checkBridges()
|
1314
|
+
this.checkBridges()
|
1296
1315
|
this._delta.json.bridges.push({ action: 'add', bridge: def })
|
1297
1316
|
}
|
1298
1317
|
|
@@ -1340,8 +1359,8 @@ class Config {
|
|
1340
1359
|
semantics.unshift(semantic)
|
1341
1360
|
}
|
1342
1361
|
|
1343
|
-
removeSemantic(deleteSemantic) {
|
1344
|
-
const index = this.config.semantics.findIndex(
|
1362
|
+
removeSemantic (deleteSemantic) {
|
1363
|
+
const index = this.config.semantics.findIndex((semantic) => semantic.id === deleteSemantic.id)
|
1345
1364
|
if (index >= 0) {
|
1346
1365
|
this.config.semantics.splice(index, 1)
|
1347
1366
|
}
|
@@ -1354,7 +1373,7 @@ class Config {
|
|
1354
1373
|
|
1355
1374
|
const operators = this.config.operators
|
1356
1375
|
|
1357
|
-
let operator
|
1376
|
+
let operator
|
1358
1377
|
if (typeof objectOrPattern === 'string') {
|
1359
1378
|
operator = { pattern: objectOrPattern, uuid: uuid || this._uuid }
|
1360
1379
|
} else {
|
@@ -1364,8 +1383,8 @@ class Config {
|
|
1364
1383
|
debugOperator(operator)
|
1365
1384
|
|
1366
1385
|
if (operator.allowDups) {
|
1367
|
-
if (operators.find(
|
1368
|
-
return
|
1386
|
+
if (operators.find((o) => o.pattern == operator.pattern)) {
|
1387
|
+
return
|
1369
1388
|
}
|
1370
1389
|
}
|
1371
1390
|
|
@@ -1424,19 +1443,19 @@ class Config {
|
|
1424
1443
|
}
|
1425
1444
|
}
|
1426
1445
|
|
1427
|
-
getServer() {
|
1446
|
+
getServer () {
|
1428
1447
|
return this._server
|
1429
1448
|
}
|
1430
1449
|
|
1431
|
-
getAPIKey() {
|
1450
|
+
getAPIKey () {
|
1432
1451
|
return this._key
|
1433
1452
|
}
|
1434
1453
|
|
1435
|
-
getQueryParams() {
|
1454
|
+
getQueryParams () {
|
1436
1455
|
return this._queryParams
|
1437
1456
|
}
|
1438
1457
|
|
1439
|
-
setQueryParams(queryParams) {
|
1458
|
+
setQueryParams (queryParams) {
|
1440
1459
|
this._queryParams = queryParams
|
1441
1460
|
}
|
1442
1461
|
|
@@ -1544,14 +1563,14 @@ class Config {
|
|
1544
1563
|
}
|
1545
1564
|
|
1546
1565
|
getConfigs () {
|
1547
|
-
const configs = {}
|
1566
|
+
const configs = {}
|
1548
1567
|
configs[this.name] = this
|
1549
1568
|
for (const config of this.configs) {
|
1550
1569
|
if (config.config instanceof Config) {
|
1551
1570
|
configs[config.config.name] = config.config
|
1552
1571
|
}
|
1553
1572
|
}
|
1554
|
-
return configs
|
1573
|
+
return configs
|
1555
1574
|
}
|
1556
1575
|
|
1557
1576
|
getConfigByUUID (uuid) {
|
@@ -1580,18 +1599,18 @@ class Config {
|
|
1580
1599
|
}
|
1581
1600
|
}
|
1582
1601
|
|
1583
|
-
removeDevelopmentElements(config) {
|
1602
|
+
removeDevelopmentElements (config) {
|
1584
1603
|
if (!config) {
|
1585
1604
|
return
|
1586
1605
|
}
|
1587
|
-
config.operators = config.operators.filter(
|
1588
|
-
config.bridges = config.bridges.filter(
|
1589
|
-
config.generators = config.generators.filter(
|
1590
|
-
config.semantics = config.semantics.filter(
|
1591
|
-
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)
|
1592
1611
|
for (const word in config.words) {
|
1593
1612
|
const defs = config.words[word] || []
|
1594
|
-
config.words[word] = defs.filter(
|
1613
|
+
config.words[word] = defs.filter((def) => !def.development)
|
1595
1614
|
if (config.words[word].length == 0) {
|
1596
1615
|
delete config.words[word]
|
1597
1616
|
}
|
@@ -1714,11 +1733,11 @@ class Config {
|
|
1714
1733
|
debugConfigProps(this.config)
|
1715
1734
|
}
|
1716
1735
|
|
1717
|
-
addArgs(moreArgs) {
|
1736
|
+
addArgs (moreArgs) {
|
1718
1737
|
this.addedArgss.push(moreArgs)
|
1719
1738
|
}
|
1720
1739
|
|
1721
|
-
getAddedArgs(args) {
|
1740
|
+
getAddedArgs (args) {
|
1722
1741
|
for (let addedArgs of this.addedArgss) {
|
1723
1742
|
addedArgs = addedArgs(args)
|
1724
1743
|
Object.assign(args, addedArgs)
|
@@ -1742,9 +1761,9 @@ class Config {
|
|
1742
1761
|
}
|
1743
1762
|
|
1744
1763
|
delta () {
|
1745
|
-
return {
|
1746
|
-
cacheKey: this._delta.cacheKey,
|
1747
|
-
json: this._delta.json
|
1764
|
+
return {
|
1765
|
+
cacheKey: this._delta.cacheKey,
|
1766
|
+
json: this._delta.json
|
1748
1767
|
}
|
1749
1768
|
}
|
1750
1769
|
|
@@ -1757,7 +1776,7 @@ class Config {
|
|
1757
1776
|
bridges: [],
|
1758
1777
|
associations: [],
|
1759
1778
|
priorities: [],
|
1760
|
-
hierarchy: []
|
1779
|
+
hierarchy: []
|
1761
1780
|
}
|
1762
1781
|
}
|
1763
1782
|
}
|
@@ -1774,11 +1793,11 @@ class Config {
|
|
1774
1793
|
}
|
1775
1794
|
}
|
1776
1795
|
|
1777
|
-
addAPI(api) {
|
1796
|
+
addAPI (api) {
|
1778
1797
|
if (this._api && this._api.multiApi) {
|
1779
1798
|
this._api.add(this, this._api, api)
|
1780
1799
|
} else {
|
1781
|
-
throw new Error(
|
1800
|
+
throw new Error('Can only add apis to a multi-api')
|
1782
1801
|
}
|
1783
1802
|
}
|
1784
1803
|
|
@@ -1841,15 +1860,15 @@ class Config {
|
|
1841
1860
|
}
|
1842
1861
|
|
1843
1862
|
// TODO add more details
|
1844
|
-
equal(config) {
|
1863
|
+
equal (config) {
|
1845
1864
|
if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
|
1846
|
-
debugger
|
1847
|
-
return false
|
1865
|
+
debugger
|
1866
|
+
return false
|
1848
1867
|
}
|
1849
1868
|
return true
|
1850
1869
|
}
|
1851
1870
|
|
1852
|
-
dump(fn) {
|
1871
|
+
dump (fn) {
|
1853
1872
|
runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
|
1854
1873
|
}
|
1855
1874
|
|
@@ -1861,7 +1880,7 @@ class Config {
|
|
1861
1880
|
const cp = new Config()
|
1862
1881
|
cp.logs = []
|
1863
1882
|
cp.maxDepth = this.maxDepth
|
1864
|
-
cp.debugLoops
|
1883
|
+
cp.debugLoops = this.debugLoops
|
1865
1884
|
cp.transitoryMode = this.transitoryMode
|
1866
1885
|
cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
1867
1886
|
cp._uuid = cp.configs[0]._uuid
|
@@ -1898,7 +1917,7 @@ class Config {
|
|
1898
1917
|
cp.mapUUIDs(map)
|
1899
1918
|
|
1900
1919
|
if (cp._uuid == 'concept2') {
|
1901
|
-
|
1920
|
+
// debugger
|
1902
1921
|
}
|
1903
1922
|
if (options.callInitializers) {
|
1904
1923
|
cp.rebuild(options)
|
@@ -1921,7 +1940,7 @@ class Config {
|
|
1921
1940
|
// const namespace = km.namespace
|
1922
1941
|
cp.config.objects.namespaced[km._uuid] = {}
|
1923
1942
|
})
|
1924
|
-
/*
|
1943
|
+
/*
|
1925
1944
|
if (cp._uuid == 'concept2') {
|
1926
1945
|
if (!cp.api.objects.defaultTypesForHierarchy) {
|
1927
1946
|
debugger
|
@@ -2061,7 +2080,7 @@ class Config {
|
|
2061
2080
|
|
2062
2081
|
initializer (fn, options = {}) {
|
2063
2082
|
if (options) {
|
2064
|
-
for (
|
2083
|
+
for (const option of Object.keys(options)) {
|
2065
2084
|
const validOptions = []
|
2066
2085
|
if (!validOptions.includes(option)) {
|
2067
2086
|
throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
|
@@ -2227,7 +2246,7 @@ class Config {
|
|
2227
2246
|
// rebuild ({ isModule: mainIsModule = false } = {}) {
|
2228
2247
|
rebuild ({ isModule: mainIsModule } = {}) {
|
2229
2248
|
this.resetDelta()
|
2230
|
-
const debug = this.config.debug
|
2249
|
+
const debug = this.config.debug
|
2231
2250
|
this.config = _.cloneDeep(this.initConfig)
|
2232
2251
|
this.hierarchy = new DigraphInternal(this.config.hierarchy)
|
2233
2252
|
if (debug) {
|
@@ -2270,8 +2289,8 @@ class Config {
|
|
2270
2289
|
// const aw = (word, def) => this.addWord(word, def)
|
2271
2290
|
// const ag = (matchOrGenerator, applyOrNothing) => this.addGenerator(matchOrGenerator, applyOrNothing)
|
2272
2291
|
let config = km.config
|
2273
|
-
|
2274
|
-
if (config.addedArgss) {
|
2292
|
+
|
2293
|
+
if (config.addedArgss) {
|
2275
2294
|
this.addedArgss = this.addedArgss.concat(config.addedArgss)
|
2276
2295
|
}
|
2277
2296
|
|
@@ -2294,15 +2313,15 @@ class Config {
|
|
2294
2313
|
return config
|
2295
2314
|
}
|
2296
2315
|
// const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
|
2297
|
-
const args = new Object(setupInitializerFNArgs(this, {
|
2298
|
-
isModule,
|
2299
|
-
hierarchy: this.hierarchy,
|
2316
|
+
const args = new Object(setupInitializerFNArgs(this, {
|
2317
|
+
isModule,
|
2318
|
+
hierarchy: this.hierarchy,
|
2300
2319
|
testConfig: config,
|
2301
|
-
currentConfig: config,
|
2302
|
-
uuid: config._uuid,
|
2303
|
-
objects: namespacedObjects,
|
2304
|
-
namespace,
|
2305
|
-
api: config.api
|
2320
|
+
currentConfig: config,
|
2321
|
+
uuid: config._uuid,
|
2322
|
+
objects: namespacedObjects,
|
2323
|
+
namespace,
|
2324
|
+
api: config.api
|
2306
2325
|
}))
|
2307
2326
|
|
2308
2327
|
const currentConfig = args.currentConfig
|
@@ -2319,12 +2338,12 @@ class Config {
|
|
2319
2338
|
// debugger
|
2320
2339
|
// greg55
|
2321
2340
|
config.initializerFn(args, { dontCallFn: true })
|
2322
|
-
|
2341
|
+
initAfterApis.unshift({ config, args })
|
2323
2342
|
if (config._api) {
|
2324
2343
|
if (config._api.initialize) {
|
2325
2344
|
// reverse the list
|
2326
2345
|
// TODO sync up the args with initialize of config
|
2327
|
-
inits.unshift(
|
2346
|
+
inits.unshift(() => config._api.initialize({ config: this, km: kmFn, ...args, api: config._api }))
|
2328
2347
|
// config._api.initialize({ config, api: config._api })
|
2329
2348
|
} else {
|
2330
2349
|
inits.unshift(null)
|
@@ -2366,13 +2385,13 @@ class Config {
|
|
2366
2385
|
this.config.priorities = []
|
2367
2386
|
this.config.associations = { positive: [], negative: [] }
|
2368
2387
|
this.config.words = {}
|
2369
|
-
|
2388
|
+
|
2370
2389
|
for (let i = 0; i < addInternals.length; ++i) {
|
2371
|
-
let name
|
2390
|
+
let name
|
2372
2391
|
if (addInternals[i]) {
|
2373
2392
|
this.addInternalR(addInternals[i], true, false, false, true)
|
2374
2393
|
name = addInternals[i].name
|
2375
|
-
} else{
|
2394
|
+
} else {
|
2376
2395
|
// the ones defined in config must come after the ones in the templates
|
2377
2396
|
this.config.generators = generators.concat(this.config.generators)
|
2378
2397
|
this.config.semantics = semantics.concat(this.config.semantics)
|
@@ -2386,7 +2405,7 @@ class Config {
|
|
2386
2405
|
}
|
2387
2406
|
if (initAfterApis[i]) {
|
2388
2407
|
const init = initAfterApis[i]
|
2389
|
-
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true})
|
2408
|
+
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
|
2390
2409
|
}
|
2391
2410
|
const instance = this.instances.find((instance) => instance.name == name)
|
2392
2411
|
if (instance) {
|
@@ -2401,9 +2420,10 @@ class Config {
|
|
2401
2420
|
this.checkBridges()
|
2402
2421
|
}
|
2403
2422
|
|
2404
|
-
nameToUUID(name) {
|
2423
|
+
nameToUUID (name) {
|
2405
2424
|
return this.configs.find((km) => km._name == name)._uuid
|
2406
2425
|
}
|
2426
|
+
|
2407
2427
|
// name: namespace name
|
2408
2428
|
// others
|
2409
2429
|
// if undefined namespace applies to first loaded config
|
@@ -2580,7 +2600,7 @@ class Config {
|
|
2580
2600
|
context: context.map((id) => {
|
2581
2601
|
return [toNS(id[0]), id[1]]
|
2582
2602
|
}),
|
2583
|
-
choose
|
2603
|
+
choose
|
2584
2604
|
}
|
2585
2605
|
if (ordered) {
|
2586
2606
|
priority.ordered = ordered
|
@@ -2605,7 +2625,7 @@ class Config {
|
|
2605
2625
|
}
|
2606
2626
|
|
2607
2627
|
const seen = {}
|
2608
|
-
for (
|
2628
|
+
for (const operator of this.config.operators) {
|
2609
2629
|
if (seen[operator.pattern]) {
|
2610
2630
|
const key = `${operator.pattern} (namespace: ${operator.uuid})`
|
2611
2631
|
throw new Error(`Operator '${key}' is defined more than once in the operators`)
|
@@ -2678,10 +2698,10 @@ class Config {
|
|
2678
2698
|
throw new Error(`Setting invalid property ${property}`)
|
2679
2699
|
}
|
2680
2700
|
|
2681
|
-
if ('words'
|
2682
|
-
for (
|
2683
|
-
for (
|
2684
|
-
if (!def
|
2701
|
+
if (property == 'words') {
|
2702
|
+
for (const word in value) {
|
2703
|
+
for (const def of value[word]) {
|
2704
|
+
if (!def.uuid) {
|
2685
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}'`)
|
2686
2706
|
}
|
2687
2707
|
}
|
@@ -2689,8 +2709,8 @@ class Config {
|
|
2689
2709
|
}
|
2690
2710
|
|
2691
2711
|
if (['operators', 'bridges'].includes(property)) {
|
2692
|
-
for (
|
2693
|
-
if (!def
|
2712
|
+
for (const def of value) {
|
2713
|
+
if (!def.uuid) {
|
2694
2714
|
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`)
|
2695
2715
|
}
|
2696
2716
|
}
|
@@ -2770,9 +2790,9 @@ class Config {
|
|
2770
2790
|
this.configs.forEach((km) => {
|
2771
2791
|
this.instances = (km._config.instances || this.initInstances.slice()).concat(this.instances)
|
2772
2792
|
})
|
2773
|
-
|
2774
|
-
for (
|
2775
|
-
if (!noDups.find(
|
2793
|
+
const noDups = []
|
2794
|
+
for (const instance of this.instances) {
|
2795
|
+
if (!noDups.find((existing) => existing.name == instance.name)) {
|
2776
2796
|
noDups.push(instance)
|
2777
2797
|
}
|
2778
2798
|
}
|
@@ -2784,7 +2804,7 @@ class Config {
|
|
2784
2804
|
}
|
2785
2805
|
|
2786
2806
|
// TODO get rid of useOldVersion arg
|
2787
|
-
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 } = {}) {
|
2788
2808
|
validConfigProps(more)
|
2789
2809
|
if (more instanceof Config) {
|
2790
2810
|
more.initialize({ force: false })
|
@@ -2866,12 +2886,12 @@ class Config {
|
|
2866
2886
|
const isDup = (op1, op2) => op1.pattern == op2.pattern
|
2867
2887
|
for (const newOne of more[key]) {
|
2868
2888
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2869
|
-
const oldOne = this.config[key][iOldOne]
|
2889
|
+
const oldOne = this.config[key][iOldOne]
|
2870
2890
|
if (isDup(newOne, oldOne)) {
|
2871
2891
|
if (oldOne.allowDups) {
|
2872
2892
|
// the old one takes precedence to match what would happen during the original load
|
2873
2893
|
this.config[key].splice(iOldOne, 1)
|
2874
|
-
break
|
2894
|
+
break
|
2875
2895
|
}
|
2876
2896
|
}
|
2877
2897
|
}
|
@@ -2882,14 +2902,14 @@ class Config {
|
|
2882
2902
|
const idDup = (b1, b2) => b1.id == b2.id && b1.level == b2.level && b1.bridge == b2.bridge
|
2883
2903
|
for (const newOne of more[key]) {
|
2884
2904
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2885
|
-
const oldOne = this.config[key][iOldOne]
|
2905
|
+
const oldOne = this.config[key][iOldOne]
|
2886
2906
|
if (newOne.id == oldOne.id) {
|
2887
2907
|
if (oldOne.allowDups) {
|
2888
2908
|
// the old one takes precedence to match what would happen during the original load
|
2889
2909
|
this.config[key].splice(iOldOne, 1)
|
2890
|
-
break
|
2910
|
+
break
|
2891
2911
|
}
|
2892
|
-
}
|
2912
|
+
}
|
2893
2913
|
}
|
2894
2914
|
}
|
2895
2915
|
}
|
@@ -2987,12 +3007,12 @@ class Config {
|
|
2987
3007
|
const isDup = (op1, op2) => op1.pattern == op2.pattern
|
2988
3008
|
for (const newOne of more[key]) {
|
2989
3009
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2990
|
-
const oldOne = this.config[key][iOldOne]
|
3010
|
+
const oldOne = this.config[key][iOldOne]
|
2991
3011
|
if (isDup(newOne, oldOne)) {
|
2992
3012
|
if (oldOne.allowDups) {
|
2993
3013
|
// the old one takes precedence to match what would happen during the original load
|
2994
3014
|
this.config[key].splice(iOldOne, 1)
|
2995
|
-
break
|
3015
|
+
break
|
2996
3016
|
}
|
2997
3017
|
}
|
2998
3018
|
}
|
@@ -3003,12 +3023,12 @@ class Config {
|
|
3003
3023
|
const idDup = (b1, b2) => b1.id == b2.id && b1.level == b2.level && b1.bridge == b2.bridge
|
3004
3024
|
for (const newOne of more[key]) {
|
3005
3025
|
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
3006
|
-
const oldOne = this.config[key][iOldOne]
|
3026
|
+
const oldOne = this.config[key][iOldOne]
|
3007
3027
|
if (newOne.id == oldOne.id) {
|
3008
3028
|
if (oldOne.allowDups) {
|
3009
3029
|
// the old one takes precedence to match what would happen during the original load
|
3010
3030
|
this.config[key].splice(iOldOne, 1)
|
3011
|
-
break
|
3031
|
+
break
|
3012
3032
|
}
|
3013
3033
|
}
|
3014
3034
|
}
|
@@ -3034,5 +3054,5 @@ module.exports = {
|
|
3034
3054
|
Config,
|
3035
3055
|
config_toServer,
|
3036
3056
|
operatorKey_valid,
|
3037
|
-
handleBridgeProps
|
3057
|
+
handleBridgeProps
|
3038
3058
|
}
|