theprogrammablemind_4wp 7.10.0 → 7.10.1
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +280 -288
- package/demo.js +24 -24
- package/lines.js +2 -2
- package/package.json +1 -1
- package/runtime.js +12 -12
- 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
|
}
|