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