theprogrammablemind_4wp 7.5.8 → 7.6.0-beta.1
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +580 -347
- package/index.js +1 -0
- package/lines.js +3 -3
- package/package.json +2 -1
- package/runtime.js +3 -1
- package/src/config.js +699 -331
- package/src/flatten.js +9 -1
- package/src/generators.js +2 -2
- package/src/helpers.js +38 -10
- package/src/project.js +81 -0
- package/src/semantics.js +8 -3
package/src/config.js
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
// lookup = (name) => returns <config>
|
2
2
|
const { Semantics, normalizeGenerator } = require('./semantics')
|
3
3
|
const { Generators } = require('./generators')
|
4
|
-
|
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')
|
8
|
+
const { ecatch } = require('./helpers')
|
8
9
|
const runtime = require('../runtime')
|
9
10
|
const _ = require('lodash')
|
10
11
|
|
@@ -21,106 +22,332 @@ const indent = (string, indent) => {
|
|
21
22
|
return string.replace(/^/gm, ' '.repeat(indent));
|
22
23
|
}
|
23
24
|
|
24
|
-
const
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
if (
|
29
|
-
|
25
|
+
const config_toServer = (config) => {
|
26
|
+
}
|
27
|
+
|
28
|
+
const debugPriority = (priority) => {
|
29
|
+
if (global.entodictonDebugPriority) {
|
30
|
+
if (helpers.safeEquals(entodictonDebugPriority, priority)) {
|
31
|
+
debugger; // debug hierarchy hit
|
32
|
+
}
|
30
33
|
}
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
}
|
35
|
+
|
36
|
+
const debugAssociation = (association) => {
|
37
|
+
if (global.entodictonDebugAssociation) {
|
38
|
+
if (helpers.safeEquals(global.entodictonDebugAssociation, association)) {
|
39
|
+
debugger; // debug association hit
|
34
40
|
}
|
35
41
|
}
|
36
|
-
|
37
|
-
|
38
|
-
|
42
|
+
}
|
43
|
+
|
44
|
+
const debugHierarchy = (pair) => {
|
45
|
+
if (global.entodictonDebugHierarchy) {
|
46
|
+
if (helpers.safeEquals(global.entodictonDebugHierarchy, pair)) {
|
47
|
+
debugger; // debug hierarchy hit
|
39
48
|
}
|
40
49
|
}
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
}
|
51
|
+
|
52
|
+
const debugBridge = (bridge) => {
|
53
|
+
if (global.entodictonDebugBridge) {
|
54
|
+
if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
|
55
|
+
debugger; // debug hierarchy hit
|
44
56
|
}
|
45
57
|
}
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
58
|
+
}
|
59
|
+
|
60
|
+
const debugOperator = (operator) => {
|
61
|
+
if (global.entodictonDebugOperator) {
|
62
|
+
if ((operator.pattern || operator) === global.entodictonDebugOperator) {
|
63
|
+
debugger; // debug operator hit
|
52
64
|
}
|
53
65
|
}
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
66
|
+
}
|
67
|
+
|
68
|
+
const debugConfigProps = (config) => {
|
69
|
+
if (!config) {
|
70
|
+
return
|
71
|
+
}
|
72
|
+
const checkProps = [
|
73
|
+
{ property: 'priorities', check: (v) => debugPriority(v) },
|
74
|
+
{ property: 'association', check: (v) => debugAssociation(v) },
|
75
|
+
{ property: 'hierarchy', check: (v) => debugHierarchy(v) },
|
76
|
+
{ property: 'operators', check: (v) => debugOperator(v) },
|
77
|
+
{ property: 'bridges', check: (v) => debugBridge(v) },
|
78
|
+
]
|
79
|
+
for (const { property, check } of checkProps) {
|
80
|
+
if (config[property]) {
|
81
|
+
for (const value of config[property]) {
|
82
|
+
check(value)
|
62
83
|
}
|
63
84
|
}
|
64
85
|
}
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
86
|
+
}
|
87
|
+
|
88
|
+
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',
|
104
|
+
'debug',
|
105
|
+
|
106
|
+
// TODO Fix these from the test app
|
107
|
+
'implicits',
|
108
|
+
'convolution',
|
109
|
+
'expected_generated',
|
110
|
+
'expected_results',
|
111
|
+
'skipSemantics',
|
112
|
+
'description',
|
113
|
+
'contexts',
|
114
|
+
'utterances',
|
115
|
+
'flatten',
|
116
|
+
|
117
|
+
'namespaces',
|
118
|
+
'eqClasses',
|
119
|
+
]
|
120
|
+
helpers.validProps(valid, config, 'config')
|
121
|
+
}
|
122
|
+
|
123
|
+
const setupInitializerFNArgs = (config, args) => {
|
124
|
+
const aw = (word, def) => config.addWord(word, def, args.uuid)
|
125
|
+
const ag = (generator) => config.addGenerator(generator, args.uuid, config.name)
|
126
|
+
const km = (name) => config.getConfig(name)
|
127
|
+
const apis = (name) => config.getConfig(name).api
|
128
|
+
|
129
|
+
return {
|
130
|
+
...args,
|
131
|
+
addWord: aw,
|
132
|
+
addGenerator: ag,
|
133
|
+
config: config.getPseudoConfig(args.uuid, args.currentConfig),
|
134
|
+
km,
|
135
|
+
baseConfig: config,
|
136
|
+
apis,
|
74
137
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
138
|
+
}
|
139
|
+
|
140
|
+
const operatorKey_valid = (key) => {
|
141
|
+
if (
|
142
|
+
!_.isArray(key) ||
|
143
|
+
key.length != 2 ||
|
144
|
+
!_.isString(key[0]) ||
|
145
|
+
!_.isInteger(key[1]) ||
|
146
|
+
key[1] < 0
|
147
|
+
) {
|
148
|
+
|
149
|
+
let details = ''
|
150
|
+
if (!_.isArray(key)) {
|
151
|
+
details = "Expected an array."
|
152
|
+
} else if (key.length != 2) {
|
153
|
+
details = "Expected an array of length two."
|
154
|
+
} else if (!_.isString(key[0])) {
|
155
|
+
details = "Expected element zero to be a string that is an operator id."
|
156
|
+
} else if (!_.isInteger(key[1])) {
|
157
|
+
details = "Expected element one to be a number that is an operator level."
|
158
|
+
} else if (key[1] < 0) {
|
159
|
+
details = "Expected element one to be a number that is an operator level which is greater than zero."
|
160
|
+
}
|
161
|
+
throw new Error(`${JSON.stringify(key)} is not a valid operator key. Values are of the form [<operatorId>, <operatorLevel>]. ${details}`)
|
78
162
|
}
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
163
|
+
}
|
164
|
+
|
165
|
+
const elist = (list, check, prefix) => {
|
166
|
+
for ([index, element] of list.entries()) {
|
167
|
+
try {
|
168
|
+
check(element)
|
169
|
+
} catch( e ) {
|
170
|
+
throw new Error(prefix(index, e))
|
171
|
+
}
|
87
172
|
}
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
})
|
173
|
+
}
|
174
|
+
const priorities_valid = (cps) => {
|
175
|
+
elist(cps, (cp) => priority_valid(cp), (index, e) => `priorities has an invalid priority at position ${index}. ${e}`)
|
176
|
+
}
|
177
|
+
|
178
|
+
const priority_valid = (cp) => {
|
179
|
+
if (!cp.context) {
|
180
|
+
throw new Error(`The priority ${JSON.stringify(cp)} is missing the "context" property. That is a list of the operator keys that are to be prioritized differently.`)
|
97
181
|
}
|
98
|
-
if (
|
99
|
-
|
100
|
-
where: bridge.evaluator.where || bridge.where || client.where(3),
|
101
|
-
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
102
|
-
apply: (args) => bridge.evaluator(args),
|
103
|
-
applyWrapped: bridge.evaluator,
|
104
|
-
property: 'evaluator',
|
105
|
-
})
|
182
|
+
if (!_.isArray(cp.context)) {
|
183
|
+
throw new Error(`The priority ${JSON.stringify(cp)} has an invalid "context" value. That is a list of the operator keys that are to be prioritized differently.`)
|
106
184
|
}
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
match: ({context}) => bridge.id == context.marker,
|
111
|
-
apply: (args) => bridge.semantic(args),
|
112
|
-
applyWrapped: bridge.semantic,
|
113
|
-
property: 'semantic',
|
114
|
-
})
|
185
|
+
elist(cp.context, (element) => operatorKey_valid(element), (index, e) => `The priority ${JSON.stringify(cp)} has an invalid operator key at position ${index}. ${e}`)
|
186
|
+
if (!_.isArray(cp.choose)) {
|
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.`)
|
115
188
|
}
|
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
|
+
)
|
116
200
|
}
|
117
201
|
|
118
|
-
const
|
119
|
-
|
120
|
-
|
121
|
-
|
202
|
+
const handleBridgeProps = (config, bridge, addFirst) => {
|
203
|
+
ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
|
204
|
+
() => {
|
205
|
+
if (!bridge.bridge) {
|
206
|
+
bridge.bridge = "{ ...next(operator) }"
|
207
|
+
}
|
208
|
+
if (!bridge.level) {
|
209
|
+
bridge.level = 0
|
210
|
+
}
|
211
|
+
if (bridge.children) {
|
212
|
+
for (let child of bridge.children) {
|
213
|
+
config.addHierarchy(child, bridge.id)
|
214
|
+
}
|
215
|
+
}
|
216
|
+
if (bridge.parents) {
|
217
|
+
for (let parent of bridge.parents) {
|
218
|
+
config.addHierarchy(bridge.id, parent)
|
219
|
+
}
|
220
|
+
}
|
221
|
+
if (bridge.isA) {
|
222
|
+
for (let parent of bridge.isA) {
|
223
|
+
config.addHierarchy(bridge.id, parent)
|
224
|
+
}
|
225
|
+
}
|
226
|
+
if (bridge.before) {
|
227
|
+
for (let after of bridge.before) {
|
228
|
+
if (typeof after == 'string') {
|
229
|
+
after = [after, 0]
|
230
|
+
}
|
231
|
+
config.addPriority({ context: [[bridge.id, bridge.level], after], choose: [0] })
|
232
|
+
}
|
233
|
+
}
|
234
|
+
if (bridge.after) {
|
235
|
+
for (let before of bridge.after) {
|
236
|
+
if (typeof before == 'string') {
|
237
|
+
before = [before, 0]
|
238
|
+
}
|
239
|
+
config.addPriority({ context: [before, [bridge.id, bridge.level]], choose: [0] })
|
240
|
+
}
|
241
|
+
}
|
242
|
+
if (bridge.words) {
|
243
|
+
for (let def of bridge.words) {
|
244
|
+
if (typeof def == 'string') {
|
245
|
+
config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
|
246
|
+
} else {
|
247
|
+
const word = def.word
|
248
|
+
def = { initial: JSON.stringify(def), id: bridge.id, word }
|
249
|
+
config.addWordInternal(word, def)
|
250
|
+
}
|
251
|
+
}
|
252
|
+
}
|
253
|
+
/*
|
254
|
+
if (bridge.generator) {
|
255
|
+
if (addFirst) {
|
256
|
+
config.config.generators.unshift(bridge.generator)
|
257
|
+
} else {
|
258
|
+
config.config.generators.push(bridge.generator)
|
259
|
+
}
|
260
|
+
}
|
261
|
+
*/
|
262
|
+
if (bridge.generators) {
|
263
|
+
const generators = [...bridge.generators]
|
264
|
+
generators.reverse()
|
265
|
+
for (let generator of generators) {
|
266
|
+
if (addFirst) {
|
267
|
+
config.config.generators.unshift(generator)
|
268
|
+
} else {
|
269
|
+
config.config.generators.push(generator)
|
270
|
+
}
|
271
|
+
}
|
272
|
+
}
|
273
|
+
if (bridge.generatorpr) {
|
274
|
+
bridge.generatorp = bridge.generatorpr
|
275
|
+
bridge.generatorr = bridge.generatorpr
|
276
|
+
}
|
277
|
+
if (bridge.generatorp) {
|
278
|
+
const match = bridge.generatorp.match || (() => true)
|
279
|
+
const apply = typeof bridge.generatorp == 'function' ? bridge.generatorp : bridge.generatorp.apply || bridge.generatorp
|
280
|
+
const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
|
281
|
+
|
282
|
+
const generator = {
|
283
|
+
where: bridge.generatorp.where || bridge.where || client.where(4),
|
284
|
+
match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
|
285
|
+
apply: (args) => apply(args),
|
286
|
+
applyWrapped: apply,
|
287
|
+
property: 'generatorp',
|
288
|
+
}
|
289
|
+
if (addFirst) {
|
290
|
+
config.config.generators.unshift(generator)
|
291
|
+
} else {
|
292
|
+
config.config.generators.push(generator)
|
293
|
+
}
|
294
|
+
|
295
|
+
}
|
296
|
+
if (bridge.generatorr) {
|
297
|
+
const match = bridge.generatorr.match || (() => true)
|
298
|
+
const apply = typeof bridge.generatorr == 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
|
299
|
+
const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
|
300
|
+
const generator = {
|
301
|
+
where: bridge.generatorr.where || bridge.where || client.where(4),
|
302
|
+
match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
|
303
|
+
apply: (args) => apply(args),
|
304
|
+
applyWrapped: apply,
|
305
|
+
property: 'generatorr',
|
306
|
+
}
|
307
|
+
if (addFirst) {
|
308
|
+
config.config.generators.unshift(generator)
|
309
|
+
} else {
|
310
|
+
config.config.generators.push(generator)
|
311
|
+
}
|
312
|
+
}
|
313
|
+
if (bridge.evaluator) {
|
314
|
+
const semantic = {
|
315
|
+
where: bridge.evaluator.where || bridge.where || client.where(3),
|
316
|
+
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
317
|
+
apply: (args) => bridge.evaluator(args),
|
318
|
+
applyWrapped: bridge.evaluator,
|
319
|
+
property: 'evaluator',
|
320
|
+
}
|
321
|
+
if (addFirst) {
|
322
|
+
config.config.semantics.unshift(semantic)
|
323
|
+
} else {
|
324
|
+
config.config.semantics.push(semantic)
|
325
|
+
}
|
326
|
+
}
|
327
|
+
if (bridge.semantic) {
|
328
|
+
const semantic = {
|
329
|
+
where: bridge.semantic.where || bridge.where || client.where(3),
|
330
|
+
match: ({context}) => bridge.id == context.marker,
|
331
|
+
apply: (args) => bridge.semantic(args),
|
332
|
+
applyWrapped: bridge.semantic,
|
333
|
+
property: 'semantic',
|
334
|
+
}
|
335
|
+
if (addFirst) {
|
336
|
+
config.config.semantics.unshift(semantic)
|
337
|
+
} else {
|
338
|
+
config.config.semantics.push(semantic)
|
339
|
+
}
|
340
|
+
}
|
341
|
+
}
|
342
|
+
)
|
343
|
+
}
|
344
|
+
|
345
|
+
const handleCalculatedProps = (baseConfig, moreConfig, addFirst) => {
|
346
|
+
for (let bridge of (moreConfig.bridges || [])) {
|
347
|
+
const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
348
|
+
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where', 'uuid' ]
|
122
349
|
helpers.validProps(valid, bridge, 'bridge')
|
123
|
-
handleBridgeProps(baseConfig, bridge)
|
350
|
+
handleBridgeProps(baseConfig, bridge, addFirst)
|
124
351
|
}
|
125
352
|
if (moreConfig.operators) {
|
126
353
|
moreConfig.operators = moreConfig.operators.map((operator) => {
|
@@ -137,13 +364,31 @@ if (runtime.process.env.DEBUG_HIERARCHY) {
|
|
137
364
|
global.entodictonDebugHierarchy = JSON.parse(runtime.process.env.DEBUG_HIERARCHY)
|
138
365
|
}
|
139
366
|
|
367
|
+
|
368
|
+
// i keep randomly doing one of the other so I will just make both work the same way
|
369
|
+
if (runtime.process.env.DEBUG_PRIORITIES) {
|
370
|
+
global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITIES)
|
371
|
+
}
|
372
|
+
if (runtime.process.env.DEBUG_PRIORITY) {
|
373
|
+
global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITY)
|
374
|
+
}
|
375
|
+
|
376
|
+
if (runtime.process.env.DEBUG_CONTEXTUAL_PRIORITY) {
|
377
|
+
global.entodictonDebugContextualPriority = JSON.parse(runtime.process.env.DEBUG_CONTEXTUAL_PRIORITY)
|
378
|
+
}
|
379
|
+
|
380
|
+
if (runtime.process.env.DEBUG_ASSOCIATION) {
|
381
|
+
global.entodictonDebugAssociation = JSON.parse(runtime.process.env.DEBUG_ASSOCIATION)
|
382
|
+
}
|
383
|
+
|
140
384
|
if (runtime.process.env.DEBUG_BRIDGE) {
|
141
385
|
// id/level
|
142
386
|
global.entodictonDebugBridge = runtime.process.env.DEBUG_BRIDGE.split('/')
|
143
387
|
if (global.entodictonDebugBridge.length !== 2) {
|
144
388
|
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
|
389
|
+
process.exit(-1)
|
145
390
|
}
|
146
|
-
global.entodictonDebugBridge[1] =
|
391
|
+
global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
|
147
392
|
}
|
148
393
|
|
149
394
|
if (runtime.process.env.DEBUG_OPERATOR) {
|
@@ -161,7 +406,7 @@ const hierarchyCanonical = (element) => {
|
|
161
406
|
|
162
407
|
const isValidDef = (word, def, config) => {
|
163
408
|
if (!def.id) {
|
164
|
-
throw `In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`
|
409
|
+
throw new Error(`In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`)
|
165
410
|
}
|
166
411
|
/*
|
167
412
|
if (!def.initial) {
|
@@ -214,6 +459,14 @@ const normalizeConfig = (config) => {
|
|
214
459
|
}
|
215
460
|
}
|
216
461
|
}
|
462
|
+
|
463
|
+
if (config.semantics) {
|
464
|
+
for (let semantic of config.semantics) {
|
465
|
+
if (semantic.oneShot) {
|
466
|
+
semantic.id = uuid()
|
467
|
+
}
|
468
|
+
}
|
469
|
+
}
|
217
470
|
}
|
218
471
|
}
|
219
472
|
|
@@ -421,8 +674,8 @@ const multiApiImpl = (initializer) => {
|
|
421
674
|
initializer(config, api)
|
422
675
|
const name = api.getName()
|
423
676
|
multiApi.apis[name] = api
|
424
|
-
api.objects = config.get('objects')
|
425
|
-
api.config = () => config
|
677
|
+
// api.objects = config.get('objects')
|
678
|
+
// api.config = () => config
|
426
679
|
multiApi.current = name
|
427
680
|
},
|
428
681
|
|
@@ -433,11 +686,13 @@ const multiApiImpl = (initializer) => {
|
|
433
686
|
}
|
434
687
|
},
|
435
688
|
|
689
|
+
/*
|
436
690
|
set objects (value) {
|
437
691
|
for (const key in Object.keys(this.apis)) {
|
438
692
|
this.apis[key].objects = value
|
439
693
|
}
|
440
694
|
},
|
695
|
+
*/
|
441
696
|
|
442
697
|
// "product1": apiInstance(testData1),
|
443
698
|
apis: {
|
@@ -451,6 +706,47 @@ const multiApiImpl = (initializer) => {
|
|
451
706
|
|
452
707
|
class Config {
|
453
708
|
|
709
|
+
toServer (config) {
|
710
|
+
return config_toServer(config)
|
711
|
+
}
|
712
|
+
|
713
|
+
base () {
|
714
|
+
const base = new Config()
|
715
|
+
for (let km of this.configs.reverse()) {
|
716
|
+
if (km.isSelf) {
|
717
|
+
continue
|
718
|
+
}
|
719
|
+
base.add(km.config)
|
720
|
+
}
|
721
|
+
return base
|
722
|
+
}
|
723
|
+
|
724
|
+
getPseudoConfig (uuid, config) {
|
725
|
+
return {
|
726
|
+
description: "this is a pseudo config that has limited functionality due to being available in the initializer function context",
|
727
|
+
addAssociation: (...args) => this.addAssociation(...args),
|
728
|
+
addAssociations: (...args) => this.addAssociations(...args),
|
729
|
+
addBridge: (...args) => this.addBridge(...args, uuid),
|
730
|
+
addGenerator: (...args) => this.addGenerator(...args, uuid, config.name),
|
731
|
+
addHierarchy: (...args) => this.addHierarchy(...args),
|
732
|
+
addOperator: (...args) => this.addOperator(...args, uuid),
|
733
|
+
addPriority: (...args) => this.addPriority(...args),
|
734
|
+
addPriorities: (...args) => this.addPriorities(...args),
|
735
|
+
addSemantic: (...args) => this.addSemantic(...args, uuid, config.name),
|
736
|
+
removeSemantic: (...args) => this.removeSemantic(...args, uuid, config.name),
|
737
|
+
addWord: (...args) => this.addWord(...args, uuid),
|
738
|
+
|
739
|
+
getHierarchy: (...args) => this.config.hierarchy,
|
740
|
+
getBridges: (...args) => this.config.bridges,
|
741
|
+
|
742
|
+
addArgs: (...args) => this.addArgs(...args),
|
743
|
+
getBridge: (...args) => this.getBridge(...args),
|
744
|
+
fragment: (...args) => this.fragment(...args),
|
745
|
+
exists: (...args) => this.exists(...args),
|
746
|
+
addAPI: (...args) => this.addAPI(...args),
|
747
|
+
}
|
748
|
+
}
|
749
|
+
|
454
750
|
inDevelopmentMode (call) {
|
455
751
|
config.developmentModeOn += 1
|
456
752
|
try {
|
@@ -489,9 +785,6 @@ class Config {
|
|
489
785
|
}
|
490
786
|
|
491
787
|
setTestConfig(testConfig) {
|
492
|
-
if (this.name == 'ui') {
|
493
|
-
console.log('ui setting testConfig')
|
494
|
-
}
|
495
788
|
this.testConfig = testConfig
|
496
789
|
}
|
497
790
|
|
@@ -614,8 +907,9 @@ class Config {
|
|
614
907
|
return instance
|
615
908
|
}
|
616
909
|
*/
|
617
|
-
getEvaluator (s, log, context) {
|
910
|
+
getEvaluator (s, calls, log, context) {
|
618
911
|
const instance = s({ ...context, evaluate: true })
|
912
|
+
calls.touch(instance)
|
619
913
|
if (!instance.evalue && !instance.verbatim && !instance.value) {
|
620
914
|
this.warningNotEvaluated(log, context);
|
621
915
|
}
|
@@ -670,7 +964,8 @@ class Config {
|
|
670
964
|
}
|
671
965
|
}
|
672
966
|
|
673
|
-
|
967
|
+
// { rebuild: false, isModule: false }
|
968
|
+
needsRebuild(template, instance, options) {
|
674
969
|
if (options.rebuild) {
|
675
970
|
return true
|
676
971
|
}
|
@@ -684,7 +979,103 @@ class Config {
|
|
684
979
|
const instanceFragments = (instance.fragments || []).map((fragment) => fragment.key || fragment.query).map( toCanonical )
|
685
980
|
const templateFragments = (template.fragments || []).concat(this.dynamicFragments).map( toCanonical )
|
686
981
|
const sameFragments = helpers.safeEquals(templateFragments, instanceFragments)
|
687
|
-
const
|
982
|
+
const toCanonicalQuery = (queryOrConfig) => {
|
983
|
+
if (typeof queryOrConfig == 'string') {
|
984
|
+
const query = queryOrConfig
|
985
|
+
return query
|
986
|
+
} else {
|
987
|
+
const config = { ...queryOrConfig }
|
988
|
+
delete config.where
|
989
|
+
config.operators = (config.operators || []).map( (operator) => {
|
990
|
+
if (typeof operator == 'string') {
|
991
|
+
return { pattern: operator }
|
992
|
+
} else {
|
993
|
+
operator = { ...operator }
|
994
|
+
delete operator.uuid
|
995
|
+
return operator
|
996
|
+
}
|
997
|
+
})
|
998
|
+
config.bridges = (config.bridges || []).map( (bridge) => {
|
999
|
+
bridge = { ...bridge },
|
1000
|
+
bridge.level = bridge.level || 0
|
1001
|
+
delete bridge.uuid
|
1002
|
+
return bridge
|
1003
|
+
})
|
1004
|
+
if (options.isModule) {
|
1005
|
+
// things like webpack rewrite the functions if there are constants so this compare does not work
|
1006
|
+
delete config.generators;
|
1007
|
+
delete config.semantics;
|
1008
|
+
config.bridges = (config.bridges || []).map((bridge) => {
|
1009
|
+
bridge = {...bridge}
|
1010
|
+
delete bridge.where
|
1011
|
+
delete bridge.generatorp
|
1012
|
+
delete bridge.generatorr
|
1013
|
+
delete bridge.generatorpr
|
1014
|
+
delete bridge.evaluator
|
1015
|
+
delete bridge.semantic
|
1016
|
+
return bridge
|
1017
|
+
});
|
1018
|
+
} else {
|
1019
|
+
config.generators = (config.generators || []).map((generator) => {
|
1020
|
+
generator = {...generator}
|
1021
|
+
delete generator.where
|
1022
|
+
generator.match = generator.match.toString()
|
1023
|
+
generator.apply = generator.apply.toString()
|
1024
|
+
return generator
|
1025
|
+
})
|
1026
|
+
config.semantics = (config.semantics || []).map((semantic) => {
|
1027
|
+
semantic = {...semantic}
|
1028
|
+
delete semantic.where
|
1029
|
+
semantic.match = semantic.match.toString()
|
1030
|
+
semantic.apply = semantic.apply.toString()
|
1031
|
+
return semantic
|
1032
|
+
})
|
1033
|
+
config.bridges = (config.bridges || []).map((bridge) => {
|
1034
|
+
bridge = {...bridge}
|
1035
|
+
delete bridge.where
|
1036
|
+
if (bridge.generatorp) {
|
1037
|
+
bridge.generatorp = bridge.generatorp.toString()
|
1038
|
+
}
|
1039
|
+
if (bridge.generatorr) {
|
1040
|
+
bridge.generatorr = bridge.generatorr.toString()
|
1041
|
+
}
|
1042
|
+
if (bridge.generatorpr) {
|
1043
|
+
bridge.generatorpr = bridge.generatorpr.toString()
|
1044
|
+
}
|
1045
|
+
if (bridge.evaluator) {
|
1046
|
+
bridge.evaluator = bridge.evaluator.toString()
|
1047
|
+
}
|
1048
|
+
if (bridge.semantic) {
|
1049
|
+
bridge.semantic = bridge.semantic.toString()
|
1050
|
+
}
|
1051
|
+
return bridge
|
1052
|
+
})
|
1053
|
+
}
|
1054
|
+
return config
|
1055
|
+
}
|
1056
|
+
}
|
1057
|
+
const toCanonicalQueries = (elements) => {
|
1058
|
+
return elements.map( toCanonicalQuery )
|
1059
|
+
}
|
1060
|
+
|
1061
|
+
const sameQueries = helpers.safeEquals(toCanonicalQueries(template.queries || []).map(helpers.updateQueries), toCanonicalQueries(instance.queries || []))
|
1062
|
+
|
1063
|
+
const debug = false
|
1064
|
+
if (debug) {
|
1065
|
+
if (!(instance && sameQueries && sameFragments)) {
|
1066
|
+
if (!sameQueries) {
|
1067
|
+
debugger
|
1068
|
+
debugger
|
1069
|
+
}
|
1070
|
+
console.log("instance", instance)
|
1071
|
+
console.log("sameQueries", sameQueries)
|
1072
|
+
console.log("sameFragments", sameFragments)
|
1073
|
+
console.log("templateFragments", templateFragments)
|
1074
|
+
console.log("instanceFragments", instanceFragments)
|
1075
|
+
console.log('template.queries', JSON.stringify(toCanonicalQueries(template.queries || []).map(helpers.updateQueries), null, 2))
|
1076
|
+
console.log("instance.queries", JSON.stringify(toCanonicalQueries(instance.queries || []), null, 2))
|
1077
|
+
}
|
1078
|
+
}
|
688
1079
|
return !(instance && sameQueries && sameFragments)
|
689
1080
|
}
|
690
1081
|
|
@@ -700,18 +1091,21 @@ class Config {
|
|
700
1091
|
}
|
701
1092
|
}
|
702
1093
|
|
1094
|
+
toData (data) {
|
1095
|
+
Object.assign(data, this.config)
|
1096
|
+
config_toServer(data)
|
1097
|
+
}
|
1098
|
+
|
1099
|
+
// loadTemplate
|
703
1100
|
load (template, instance, options = { rebuild: false } ) {
|
704
1101
|
this.validifyTemplate(template)
|
705
1102
|
instance.template = template
|
706
1103
|
this.logs.push(`loading template for ${this.name}`)
|
707
|
-
if (instance && instance.associations && !options.rebuild) {
|
708
|
-
this.addAssociations(instance.associations)
|
709
|
-
}
|
710
1104
|
if (options.rebuild) {
|
711
1105
|
// TODO fix beforeQuery
|
712
1106
|
template = { fragments: [], queries: [], ...template }
|
713
1107
|
template.fragments = template.fragments.concat(this.dynamicFragments)
|
714
|
-
client.
|
1108
|
+
client.rebuildTemplate({ config: this, target: this.name, beforeQuery: () => {}, template, ...options })
|
715
1109
|
} else {
|
716
1110
|
// no change
|
717
1111
|
// this.initInstances.push({ ...instance, name: config.name })
|
@@ -723,13 +1117,13 @@ class Config {
|
|
723
1117
|
"semantics",
|
724
1118
|
"associations",
|
725
1119
|
]
|
726
|
-
return !properties.find( (property) => instance[property].length > 0 )
|
1120
|
+
return !properties.find( (property) => instance[property] && instance[property].length > 0 )
|
727
1121
|
}
|
728
1122
|
if (!isEmpty(instance)) {
|
729
1123
|
instance.name = this.name
|
730
1124
|
this.initInstances.push(instance)
|
731
1125
|
this.instances.push(instance)
|
732
|
-
client.
|
1126
|
+
client.loadInstance(this, instance)
|
733
1127
|
}
|
734
1128
|
}
|
735
1129
|
}
|
@@ -743,19 +1137,15 @@ class Config {
|
|
743
1137
|
return this.config.objects.namespaced[this._uuid]
|
744
1138
|
}
|
745
1139
|
|
746
|
-
addAssociationsFromTests(tests = []) {
|
747
|
-
for (let test of tests) {
|
748
|
-
this.addAssociations(test.associations || []);
|
749
|
-
}
|
750
|
-
}
|
751
|
-
|
752
|
-
|
753
1140
|
addAssociations (associations) {
|
754
1141
|
for (let association of associations) {
|
755
1142
|
this.addAssociation(association)
|
756
1143
|
}
|
757
1144
|
}
|
758
1145
|
|
1146
|
+
debugConfig() {
|
1147
|
+
}
|
1148
|
+
|
759
1149
|
addAssociation (association) {
|
760
1150
|
if (!this.config.associations) {
|
761
1151
|
this.config.associations = {
|
@@ -763,24 +1153,30 @@ class Config {
|
|
763
1153
|
positive: []
|
764
1154
|
}
|
765
1155
|
}
|
766
|
-
|
767
|
-
if (helpers.safeEquals(global.entodictonDebugAssociation, association)) {
|
768
|
-
debugger; // debug association hit
|
769
|
-
}
|
770
|
-
}
|
1156
|
+
debugAssociation(association)
|
771
1157
|
this.config.associations.positive.push(association)
|
772
1158
|
this._delta.json.associations.push({ action: 'add', association })
|
773
1159
|
}
|
774
1160
|
|
775
1161
|
// TODO add more error checking to these like addHierarchy has
|
776
|
-
|
1162
|
+
// TODO change name from priorities to priority
|
1163
|
+
// [ context: <list of [id, level]>, choose: [<indexes of prioritized operator>], [ordered: [true|false]] ]
|
1164
|
+
addPriority (priority) {
|
777
1165
|
if (!this.config.priorities) {
|
778
1166
|
this.config.priorities = []
|
779
1167
|
}
|
780
|
-
|
781
|
-
|
1168
|
+
debugPriority(priority)
|
1169
|
+
priority_valid(priority)
|
1170
|
+
this.config.priorities.push(priority)
|
1171
|
+
this._delta.json.priorities.push({ action: 'add', priority })
|
782
1172
|
}
|
783
|
-
|
1173
|
+
|
1174
|
+
addPriorities (priorities) {
|
1175
|
+
for (let priority of priorities) {
|
1176
|
+
this.addPriority(priority)
|
1177
|
+
}
|
1178
|
+
}
|
1179
|
+
|
784
1180
|
addHierarchy (child, parent) {
|
785
1181
|
if (child && parent || !child || Array.isArray(child) || (typeof child == 'string' && !parent)) {
|
786
1182
|
this.addHierarchyChildParent(child, parent)
|
@@ -793,16 +1189,12 @@ class Config {
|
|
793
1189
|
addHierarchyProperties (edge) {
|
794
1190
|
const { child, parent } = edge
|
795
1191
|
if (typeof child !== 'string') {
|
796
|
-
throw `addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`
|
1192
|
+
throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
|
797
1193
|
}
|
798
1194
|
if (typeof parent !== 'string') {
|
799
|
-
throw `addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`
|
800
|
-
}
|
801
|
-
if (global.entodictonDebugHierarchy) {
|
802
|
-
if ((helpers.safeEquals.entodictonDebugHierarchy, [child, parent])) {
|
803
|
-
debugger; // debug hierarchy hit
|
804
|
-
}
|
1195
|
+
throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
|
805
1196
|
}
|
1197
|
+
debugHierarchy([child, parent])
|
806
1198
|
this.config.hierarchy.push(edge)
|
807
1199
|
// TODO greg11 this.hierarchy.addEdge(edge)
|
808
1200
|
this._delta.json.hierarchy.push([child, parent])
|
@@ -810,18 +1202,12 @@ class Config {
|
|
810
1202
|
|
811
1203
|
addHierarchyChildParent (child, parent) {
|
812
1204
|
if (typeof child !== 'string') {
|
813
|
-
throw `addHierarchy expected child to be a string. got ${JSON.stringify(child)}`
|
1205
|
+
throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
|
814
1206
|
}
|
815
1207
|
if (typeof parent !== 'string') {
|
816
|
-
throw `addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`
|
1208
|
+
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
817
1209
|
}
|
818
|
-
|
819
|
-
if (global.entodictonDebugHierarchy) {
|
820
|
-
if (helpers.safeEquals(global.entodictonDebugHierarchy, [child, parent])) {
|
821
|
-
debugger; // debug hierarchy hit
|
822
|
-
}
|
823
|
-
}
|
824
|
-
|
1210
|
+
debugHierarchy([child, parent])
|
825
1211
|
if (this.config.hierarchy.find( (element) => {
|
826
1212
|
const hc = hierarchyCanonical(element)
|
827
1213
|
if (child == hc.child && parent == hc.parent) {
|
@@ -837,24 +1223,24 @@ class Config {
|
|
837
1223
|
}
|
838
1224
|
|
839
1225
|
getBridge (id, level) {
|
840
|
-
|
1226
|
+
if (level) {
|
1227
|
+
return this.config.bridges.find( (bridge) => bridge.id == id && bridge.level == level )
|
1228
|
+
} else {
|
1229
|
+
return this.config.bridges.find( (bridge) => bridge.id == id)
|
1230
|
+
}
|
841
1231
|
}
|
842
1232
|
|
843
|
-
addBridge (bridge) {
|
1233
|
+
addBridge (bridge, uuid) {
|
844
1234
|
if (!this.config.bridges) {
|
845
1235
|
this.config.bridges = []
|
846
1236
|
}
|
847
1237
|
const bridges = this.config.bridges
|
848
|
-
const def = Object.assign({}, bridge, { uuid: this._uuid })
|
849
|
-
|
850
|
-
|
851
|
-
if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
|
852
|
-
debugger; // debug hierarchy hit
|
853
|
-
}
|
854
|
-
}
|
855
|
-
|
1238
|
+
const def = Object.assign({}, bridge, { uuid: uuid || this._uuid })
|
1239
|
+
|
1240
|
+
debugBridge(bridge)
|
856
1241
|
if (bridge.allowDups) {
|
857
|
-
if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1242
|
+
// if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1243
|
+
if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level)) {
|
858
1244
|
return;
|
859
1245
|
}
|
860
1246
|
}
|
@@ -867,17 +1253,12 @@ class Config {
|
|
867
1253
|
this._delta.json.bridges.push({ action: 'add', bridge: def })
|
868
1254
|
}
|
869
1255
|
|
870
|
-
addGenerator (
|
871
|
-
let generator = match
|
872
|
-
if ((typeof match === 'function') && (typeof apply === 'function')) {
|
873
|
-
generator = { match, apply }
|
874
|
-
}
|
875
|
-
|
1256
|
+
addGenerator (generator, uuid, name) {
|
876
1257
|
if (!(typeof generator.match === 'function')) {
|
877
|
-
throw 'addGenerator: Expected matcher to be a function'
|
1258
|
+
throw new Error('addGenerator: Expected matcher to be a function')
|
878
1259
|
}
|
879
1260
|
if (!(typeof generator.apply === 'function')) {
|
880
|
-
throw 'addGenerator: Expected action to be a function'
|
1261
|
+
throw new Error('addGenerator: Expected action to be a function')
|
881
1262
|
}
|
882
1263
|
|
883
1264
|
if (!this.config.generators) {
|
@@ -889,22 +1270,18 @@ class Config {
|
|
889
1270
|
}
|
890
1271
|
|
891
1272
|
const generators = this.config.generators
|
892
|
-
Object.assign(generator, { uuid: this._uuid, km: this.name, index: generators.length })
|
1273
|
+
Object.assign(generator, { uuid: uuid || this._uuid, km: name || this.name, index: generators.length })
|
893
1274
|
// used to be unshift
|
894
1275
|
generators.unshift(generator)
|
895
1276
|
}
|
896
1277
|
|
897
|
-
addSemantic (
|
898
|
-
let semantic = match
|
899
|
-
if ((typeof match === 'function') && (typeof apply === 'function')) {
|
900
|
-
semantic = { match, apply }
|
901
|
-
}
|
902
|
-
|
1278
|
+
addSemantic (semantic, uuid, name) {
|
903
1279
|
if (!(typeof semantic.match === 'function')) {
|
904
|
-
throw 'addSemantic: Expected match to be a function'
|
1280
|
+
throw new Error('addSemantic: Expected match to be a function')
|
905
1281
|
}
|
1282
|
+
|
906
1283
|
if (!(typeof semantic.apply === 'function')) {
|
907
|
-
throw 'addSemantic: Expected apply to be a function'
|
1284
|
+
throw new Error('addSemantic: Expected apply to be a function')
|
908
1285
|
}
|
909
1286
|
|
910
1287
|
if (!this.config.semantics) {
|
@@ -916,11 +1293,18 @@ class Config {
|
|
916
1293
|
}
|
917
1294
|
|
918
1295
|
const semantics = this.config.semantics
|
919
|
-
Object.assign(semantic, { uuid: this._uuid, km: this.name, index: semantics.length })
|
1296
|
+
Object.assign(semantic, { uuid: uuid || semantic.uuid || this._uuid, km: name || this.name, index: semantics.length, id: semantic.id || uuidv4() })
|
920
1297
|
semantics.unshift(semantic)
|
921
1298
|
}
|
922
1299
|
|
923
|
-
|
1300
|
+
removeSemantic(deleteSemantic) {
|
1301
|
+
const index = this.config.semantics.findIndex( (semantic) => semantic.id === deleteSemantic.id )
|
1302
|
+
if (index >= 0) {
|
1303
|
+
this.config.semantics.splice(index, 1)
|
1304
|
+
}
|
1305
|
+
}
|
1306
|
+
|
1307
|
+
addOperator (objectOrPattern, uuid) {
|
924
1308
|
if (!this.config.operators) {
|
925
1309
|
this.config.operators = []
|
926
1310
|
}
|
@@ -929,16 +1313,12 @@ class Config {
|
|
929
1313
|
|
930
1314
|
let operator;
|
931
1315
|
if (typeof objectOrPattern === 'string') {
|
932
|
-
operator = { pattern: objectOrPattern, uuid: this._uuid }
|
1316
|
+
operator = { pattern: objectOrPattern, uuid: uuid || this._uuid }
|
933
1317
|
} else {
|
934
|
-
operator = Object.assign({}, objectOrPattern, { uuid: this._uuid })
|
1318
|
+
operator = Object.assign({}, objectOrPattern, { uuid: uuid || this._uuid })
|
935
1319
|
}
|
936
1320
|
|
937
|
-
|
938
|
-
if (operator.pattern === global.entodictonDebugOperator) {
|
939
|
-
debugger; // debug operator hit
|
940
|
-
}
|
941
|
-
}
|
1321
|
+
debugOperator(operator)
|
942
1322
|
|
943
1323
|
if (operator.allowDups) {
|
944
1324
|
if (operators.find( (o) => o.pattern == operator.pattern )) {
|
@@ -952,16 +1332,16 @@ class Config {
|
|
952
1332
|
this._delta.json.operators.push({ action: 'add', operator })
|
953
1333
|
}
|
954
1334
|
|
955
|
-
addWord (word, def) {
|
956
|
-
this.addWordInternal(word, def)
|
1335
|
+
addWord (word, def, uuid) {
|
1336
|
+
this.addWordInternal(word, def, uuid)
|
957
1337
|
}
|
958
1338
|
|
959
|
-
addWordInternal (word, def) {
|
1339
|
+
addWordInternal (word, def, uuid) {
|
960
1340
|
if (!this.config.words) {
|
961
1341
|
this.config.words = {}
|
962
1342
|
}
|
963
1343
|
const words = this.config.words
|
964
|
-
def = Object.assign({}, def, { uuid: this._uuid })
|
1344
|
+
def = Object.assign({}, def, { uuid: uuid || this._uuid })
|
965
1345
|
if (words[word]) {
|
966
1346
|
if (!words[word].some((e) => helpers.safeEquals(e, def))) {
|
967
1347
|
words[word].unshift(def)
|
@@ -1178,37 +1558,11 @@ class Config {
|
|
1178
1558
|
// configs = [ { config, namespace } ... ]
|
1179
1559
|
constructor (config, module) {
|
1180
1560
|
if (config instanceof Config) {
|
1181
|
-
throw 'Excepted the config argument to be a hash not a Config object'
|
1561
|
+
throw new Error('Excepted the config argument to be a hash not a Config object')
|
1182
1562
|
}
|
1183
1563
|
|
1184
1564
|
if (config) {
|
1185
|
-
|
1186
|
-
'hierarchy',
|
1187
|
-
'objects',
|
1188
|
-
'bridges',
|
1189
|
-
'operators',
|
1190
|
-
'words',
|
1191
|
-
'priorities',
|
1192
|
-
'associations',
|
1193
|
-
'name',
|
1194
|
-
'version',
|
1195
|
-
'generators',
|
1196
|
-
'semantics',
|
1197
|
-
'floaters',
|
1198
|
-
'debug',
|
1199
|
-
|
1200
|
-
// TODO Fix these from the test app
|
1201
|
-
'implicits',
|
1202
|
-
'convolution',
|
1203
|
-
'expected_generated',
|
1204
|
-
'expected_results',
|
1205
|
-
'skipSemantics',
|
1206
|
-
'description',
|
1207
|
-
'contexts',
|
1208
|
-
'utterances',
|
1209
|
-
'flatten',
|
1210
|
-
]
|
1211
|
-
helpers.validProps(valid, config, 'config')
|
1565
|
+
validConfigProps(config)
|
1212
1566
|
|
1213
1567
|
config.operators = config.operators || []
|
1214
1568
|
config.bridges = config.bridges || []
|
@@ -1259,7 +1613,7 @@ class Config {
|
|
1259
1613
|
}
|
1260
1614
|
duplicated = Array.from(duplicated)
|
1261
1615
|
if (duplicated.length > 0) {
|
1262
|
-
throw `In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`
|
1616
|
+
throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
1263
1617
|
}
|
1264
1618
|
}
|
1265
1619
|
|
@@ -1271,6 +1625,10 @@ class Config {
|
|
1271
1625
|
}
|
1272
1626
|
}
|
1273
1627
|
|
1628
|
+
if (config && config.priorities) {
|
1629
|
+
priorities_valid(config.priorities)
|
1630
|
+
}
|
1631
|
+
|
1274
1632
|
normalizeConfig(config)
|
1275
1633
|
|
1276
1634
|
// set the default server so stuff just works
|
@@ -1286,7 +1644,6 @@ class Config {
|
|
1286
1644
|
if (config) {
|
1287
1645
|
this.name = config.name
|
1288
1646
|
}
|
1289
|
-
this.motivations = []
|
1290
1647
|
this.loadOrder = new DigraphInternal()
|
1291
1648
|
this.wasInitialized = false
|
1292
1649
|
this.configs = []
|
@@ -1311,6 +1668,7 @@ class Config {
|
|
1311
1668
|
}
|
1312
1669
|
this.get('objects').namespaced[this._uuid] = {}
|
1313
1670
|
this.valid()
|
1671
|
+
debugConfigProps(this.config)
|
1314
1672
|
}
|
1315
1673
|
|
1316
1674
|
addArgs(moreArgs) {
|
@@ -1341,7 +1699,10 @@ class Config {
|
|
1341
1699
|
}
|
1342
1700
|
|
1343
1701
|
delta () {
|
1344
|
-
return {
|
1702
|
+
return {
|
1703
|
+
cacheKey: this._delta.cacheKey,
|
1704
|
+
json: this._delta.json
|
1705
|
+
}
|
1345
1706
|
}
|
1346
1707
|
|
1347
1708
|
resetDelta (cacheKey) {
|
@@ -1374,24 +1735,26 @@ class Config {
|
|
1374
1735
|
if (this._api && this._api.multiApi) {
|
1375
1736
|
this._api.add(this, this._api, api)
|
1376
1737
|
} else {
|
1377
|
-
throw "Can only add apis to a multi-api"
|
1738
|
+
throw new Error("Can only add apis to a multi-api")
|
1378
1739
|
}
|
1379
1740
|
}
|
1380
1741
|
|
1381
1742
|
set api (value) {
|
1382
1743
|
if (!value.initialize) {
|
1383
|
-
throw `Expected the API to have an initialize function for ${this.name}.`
|
1744
|
+
throw new Error(`Expected the API to have an initialize function for ${this.name}.`)
|
1384
1745
|
}
|
1385
1746
|
|
1386
1747
|
if (this._api && this._api.multiApi) {
|
1387
1748
|
this._api.add(this, this._api, value)
|
1388
1749
|
} else {
|
1389
1750
|
this._api = _.cloneDeep(value)
|
1751
|
+
/*
|
1390
1752
|
if (this._api) {
|
1391
|
-
this._api.objects = this.config.objects
|
1392
|
-
this._api.config = () => this
|
1393
|
-
this._api.uuid = this._uuid
|
1753
|
+
// this._api.objects = this.config.objects
|
1754
|
+
// this._api.config = () => this
|
1755
|
+
// this._api.uuid = this._uuid
|
1394
1756
|
}
|
1757
|
+
*/
|
1395
1758
|
this.rebuild()
|
1396
1759
|
}
|
1397
1760
|
}
|
@@ -1434,40 +1797,6 @@ class Config {
|
|
1434
1797
|
// this.valid() init was not run because the kms are not all setup yet
|
1435
1798
|
}
|
1436
1799
|
|
1437
|
-
// motivation === { match, apply, uuid }
|
1438
|
-
addMotivation (motivation) {
|
1439
|
-
if (!motivation.uuid) {
|
1440
|
-
motivation.uuid = this.uuid
|
1441
|
-
}
|
1442
|
-
this.motivations.push(motivation)
|
1443
|
-
}
|
1444
|
-
|
1445
|
-
resetMotivations () {
|
1446
|
-
this.motivations = []
|
1447
|
-
}
|
1448
|
-
|
1449
|
-
doMotivations (args, context) {
|
1450
|
-
args = Object.assign({}, args, { context })
|
1451
|
-
// console.log('src/config doMotivations this.uuid', this.uuid)
|
1452
|
-
// args.objects = args.getObjects(this.uuid)
|
1453
|
-
const motivations = this.motivations
|
1454
|
-
this.motivations = []
|
1455
|
-
let done = false
|
1456
|
-
for (const motivation of motivations) {
|
1457
|
-
args.objects = args.getObjects(motivation.uuid)
|
1458
|
-
if (!done && motivation.match(args)) {
|
1459
|
-
motivation.apply(args)
|
1460
|
-
if (args.context.controlKeepMotivation || motivation.repeat) {
|
1461
|
-
this.motivations.push(motivation)
|
1462
|
-
}
|
1463
|
-
done = true
|
1464
|
-
} else {
|
1465
|
-
this.motivations.push(motivation)
|
1466
|
-
}
|
1467
|
-
}
|
1468
|
-
return done
|
1469
|
-
}
|
1470
|
-
|
1471
1800
|
// TODO add more details
|
1472
1801
|
equal(config) {
|
1473
1802
|
if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
|
@@ -1481,6 +1810,9 @@ class Config {
|
|
1481
1810
|
runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
|
1482
1811
|
}
|
1483
1812
|
|
1813
|
+
copy (options = { callInitializers: true }) {
|
1814
|
+
}
|
1815
|
+
|
1484
1816
|
copy (options = { callInitializers: true }) {
|
1485
1817
|
this.valid()
|
1486
1818
|
const cp = new Config()
|
@@ -1490,15 +1822,14 @@ class Config {
|
|
1490
1822
|
cp.transitoryMode = this.transitoryMode
|
1491
1823
|
cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
1492
1824
|
cp._uuid = cp.configs[0]._uuid
|
1825
|
+
// update uuid here set the uuid in the objects and add error checking
|
1493
1826
|
cp.initializerFn = this.initializerFn
|
1494
|
-
cp.initAfterApi = this.initAfterApi
|
1495
1827
|
cp._api = _.cloneDeep(this._api)
|
1496
1828
|
cp._namespace = this._namespace
|
1497
1829
|
cp._eqClasses = this._eqClasses
|
1498
1830
|
cp.name = this.name
|
1499
1831
|
cp.description = this.description
|
1500
1832
|
cp.tests = this.tests
|
1501
|
-
cp.motivations = [...this.motivations]
|
1502
1833
|
cp.isModule = this.isModule
|
1503
1834
|
cp.loadedForTesting = this.loadedForTesting
|
1504
1835
|
cp.initInstances = this.initInstances.slice()
|
@@ -1523,25 +1854,38 @@ class Config {
|
|
1523
1854
|
}
|
1524
1855
|
cp.mapUUIDs(map)
|
1525
1856
|
|
1857
|
+
if (cp._uuid == 'concept2') {
|
1858
|
+
// debugger
|
1859
|
+
}
|
1526
1860
|
if (options.callInitializers) {
|
1527
1861
|
cp.rebuild(options)
|
1528
|
-
}
|
1529
|
-
|
1530
|
-
|
1531
|
-
cp._api
|
1532
|
-
|
1533
|
-
|
1862
|
+
} else {
|
1863
|
+
// this mess is for duplicate into a KM after resetToOne was called
|
1864
|
+
/*
|
1865
|
+
if (cp._api) {
|
1866
|
+
// cp._api.objects = cp.config.objects
|
1867
|
+
// cp._api.config = () => (cp instanceof Config) ? cp : cp.config
|
1868
|
+
// cp._api.uuid = cp._uuid
|
1869
|
+
}
|
1870
|
+
*/
|
1534
1871
|
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1872
|
+
if (!cp.config.objects) {
|
1873
|
+
cp.config.objects = { namespaced: {} }
|
1874
|
+
} else if (!cp.config.objects.namespaced) {
|
1875
|
+
cp.config.objects.namespaced = {}
|
1876
|
+
}
|
1877
|
+
cp.configs.forEach((km) => {
|
1878
|
+
// const namespace = km.namespace
|
1879
|
+
cp.config.objects.namespaced[km._uuid] = {}
|
1880
|
+
})
|
1881
|
+
/*
|
1882
|
+
if (cp._uuid == 'concept2') {
|
1883
|
+
if (!cp.api.objects.defaultTypesForHierarchy) {
|
1884
|
+
debugger
|
1885
|
+
}
|
1886
|
+
}
|
1887
|
+
*/
|
1539
1888
|
}
|
1540
|
-
cp.configs.forEach((km) => {
|
1541
|
-
// const namespace = km.namespace
|
1542
|
-
cp.config.objects.namespaced[km._uuid] = {}
|
1543
|
-
})
|
1544
|
-
|
1545
1889
|
cp.valid()
|
1546
1890
|
return cp
|
1547
1891
|
}
|
@@ -1641,38 +1985,33 @@ class Config {
|
|
1641
1985
|
}
|
1642
1986
|
*/
|
1643
1987
|
const objects = {}
|
1644
|
-
const km = (name) => this.getConfig(name)
|
1645
1988
|
if (config instanceof Config) {
|
1646
|
-
// const aw = addWord(this.config, config.uuid)
|
1647
|
-
const aw = (word, def) => this.addWord(word, def)
|
1648
1989
|
this.get('objects').namespaced[config._uuid] = objects
|
1990
|
+
/*
|
1649
1991
|
if (config._api) {
|
1650
|
-
config._api.objects = objects
|
1651
|
-
config._api.config = () => this
|
1992
|
+
// config._api.objects = objects
|
1993
|
+
// config._api.config = () => this
|
1652
1994
|
}
|
1653
|
-
|
1995
|
+
*/
|
1996
|
+
config.initializerFn(setupInitializerFNArgs(this, { testConfig: config, currentConfig: config, objects, namespace, uuid }))
|
1654
1997
|
} else {
|
1655
|
-
// const aw = addWord(this.config, this.uuid)
|
1656
|
-
const aw = (word, def) => this.addWord(word, def)
|
1657
1998
|
this.get('objects').namespaced[this._uuid] = objects
|
1999
|
+
/*
|
1658
2000
|
if (config._api) {
|
1659
|
-
config._api.objects = objects
|
1660
|
-
config._api.config = () => this
|
2001
|
+
// config._api.objects = objects
|
2002
|
+
// config._api.config = () => this
|
1661
2003
|
}
|
1662
|
-
|
2004
|
+
*/
|
2005
|
+
this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, namespace, uuid }))
|
1663
2006
|
}
|
1664
2007
|
})
|
1665
|
-
this.instances.forEach((instance) => client.
|
2008
|
+
this.instances.forEach((instance) => client.loadInstance(this, instance))
|
1666
2009
|
}
|
1667
2010
|
|
1668
2011
|
initialize ({ force = true } = {}) {
|
1669
2012
|
if (force || !this.wasInitialized) {
|
1670
|
-
// const aw = addWord(this.config, this.uuid)
|
1671
|
-
const aw = (word, def) => this.addWord(word, def)
|
1672
|
-
const km = (name) => this.getConfig(name)
|
1673
|
-
// this.initializerFn({ addWord: aw, km, config: this, baseConfig: this, currentConfig: this, objects: this.get('objects'), uuid: this._uuid, namespace: '', api: this.api })
|
1674
2013
|
const objects = this.config.objects.namespaced[this._uuid]
|
1675
|
-
this.initializerFn(
|
2014
|
+
this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, uuid: this._uuid, namespace: '' }))
|
1676
2015
|
this.wasInitialized = true
|
1677
2016
|
}
|
1678
2017
|
}
|
@@ -1680,29 +2019,22 @@ class Config {
|
|
1680
2019
|
initializer (fn, options = {}) {
|
1681
2020
|
if (options) {
|
1682
2021
|
for (let option of Object.keys(options)) {
|
1683
|
-
const validOptions = [
|
1684
|
-
if (!
|
1685
|
-
throw `For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`
|
2022
|
+
const validOptions = []
|
2023
|
+
if (!validOptions.includes(option)) {
|
2024
|
+
throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
|
1686
2025
|
}
|
1687
2026
|
}
|
1688
2027
|
}
|
1689
|
-
const { initAfterApi = false } = options;
|
1690
2028
|
this.wasInitialized = false
|
1691
|
-
this.
|
1692
|
-
this.initializerFn = (args) => {
|
2029
|
+
this.initializerFn = (args, { dontCallFn } = {}) => {
|
1693
2030
|
const transitoryMode = global.transitoryMode
|
1694
2031
|
global.transitoryMode = false
|
1695
2032
|
// const baseConfig = args.baseConfig
|
1696
2033
|
const currentConfig = args.currentConfig
|
1697
2034
|
|
1698
|
-
if (
|
1699
|
-
|
1700
|
-
// GREG42 currentConfig.api.config = () => this
|
1701
|
-
currentConfig.api.config = () => args.baseConfig
|
1702
|
-
currentConfig.api.uuid = currentConfig._uuid
|
2035
|
+
if (args.isAfterApi) {
|
2036
|
+
fn(args)
|
1703
2037
|
}
|
1704
|
-
// this.instances.forEach( (instance) => client.processInstance(this, instance) )
|
1705
|
-
fn(args)
|
1706
2038
|
currentConfig.wasInitialized = true
|
1707
2039
|
global.transitoryMode = transitoryMode
|
1708
2040
|
}
|
@@ -1869,7 +2201,6 @@ class Config {
|
|
1869
2201
|
}
|
1870
2202
|
this.config.objects.namespaced = {}
|
1871
2203
|
this.resetWasInitialized()
|
1872
|
-
this.resetMotivations()
|
1873
2204
|
|
1874
2205
|
// reorder configs base on load ordering
|
1875
2206
|
{
|
@@ -1895,8 +2226,8 @@ class Config {
|
|
1895
2226
|
this.config.objects.namespaced[km._uuid] = {}
|
1896
2227
|
const namespacedObjects = this.config.objects.namespaced[km._uuid]
|
1897
2228
|
this.setupNamespace(km)
|
1898
|
-
// const aw =
|
1899
|
-
const
|
2229
|
+
// const aw = (word, def) => this.addWord(word, def)
|
2230
|
+
// const ag = (matchOrGenerator, applyOrNothing) => this.addGenerator(matchOrGenerator, applyOrNothing)
|
1900
2231
|
let config = km.config
|
1901
2232
|
|
1902
2233
|
if (config.addedArgss) {
|
@@ -1917,32 +2248,51 @@ class Config {
|
|
1917
2248
|
}
|
1918
2249
|
config.wasInitialized = false
|
1919
2250
|
// TODO change name of config: to baseConfig:
|
1920
|
-
const kmFn = (name) =>
|
2251
|
+
const kmFn = (name) => {
|
2252
|
+
const config = this.getConfig(name)
|
2253
|
+
return config
|
2254
|
+
}
|
1921
2255
|
// const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
|
1922
|
-
const args =
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
2256
|
+
const args = new Object(setupInitializerFNArgs(this, {
|
2257
|
+
isModule,
|
2258
|
+
hierarchy: this.hierarchy,
|
2259
|
+
testConfig: config,
|
2260
|
+
currentConfig: config,
|
2261
|
+
uuid: config._uuid,
|
2262
|
+
objects: namespacedObjects,
|
2263
|
+
namespace,
|
2264
|
+
api: config.api,
|
2265
|
+
}))
|
2266
|
+
|
2267
|
+
const currentConfig = args.currentConfig
|
2268
|
+
|
2269
|
+
/*
|
2270
|
+
if (args.currentConfig.api) {
|
2271
|
+
// args.currentConfig.api.objects = args.objects
|
2272
|
+
// TODO assign pseudo config?
|
2273
|
+
// args.currentConfig.api.config = () => args.baseConfig
|
2274
|
+
// args.currentConfig.api.uuid = args.currentConfig._uuid
|
2275
|
+
args.currentConfig.wasInitialized = true
|
1931
2276
|
}
|
1932
|
-
|
2277
|
+
*/
|
2278
|
+
// debugger
|
2279
|
+
// greg55
|
2280
|
+
config.initializerFn(args, { dontCallFn: true })
|
2281
|
+
initAfterApis.unshift({ config, args })
|
1933
2282
|
if (config._api) {
|
1934
2283
|
if (config._api.initialize) {
|
1935
2284
|
// reverse the list
|
1936
|
-
|
2285
|
+
// TODO sync up the args with initialize of config
|
2286
|
+
inits.unshift( () => config._api.initialize({ config: this, km: kmFn, ...args, api: config._api }) )
|
1937
2287
|
// config._api.initialize({ config, api: config._api })
|
1938
2288
|
} else {
|
1939
2289
|
if (interleaved) {
|
1940
2290
|
inits.unshift(null)
|
1941
2291
|
}
|
1942
2292
|
}
|
1943
|
-
config._api.objects = namespacedObjects
|
1944
|
-
config._api.config = () => this
|
1945
|
-
config._api.uuid = config._uuid
|
2293
|
+
// config._api.objects = namespacedObjects
|
2294
|
+
// config._api.config = () => this
|
2295
|
+
// config._api.uuid = config._uuid
|
1946
2296
|
} else {
|
1947
2297
|
if (interleaved) {
|
1948
2298
|
inits.unshift(null)
|
@@ -1984,10 +2334,9 @@ class Config {
|
|
1984
2334
|
init()
|
1985
2335
|
}
|
1986
2336
|
for (let init of initAfterApis) {
|
1987
|
-
// init.args.isAfterApi = true
|
1988
2337
|
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
|
1989
2338
|
}
|
1990
|
-
this.instances.forEach((instance) => client.
|
2339
|
+
this.instances.forEach((instance) => client.loadInstance(this, instance))
|
1991
2340
|
} else {
|
1992
2341
|
const base = {
|
1993
2342
|
operators: this.config.operators,
|
@@ -2016,19 +2365,19 @@ class Config {
|
|
2016
2365
|
}
|
2017
2366
|
// console.log('name -------------', name)
|
2018
2367
|
if (inits[i]) {
|
2368
|
+
// greg55
|
2019
2369
|
inits[i]()
|
2020
2370
|
}
|
2021
2371
|
if (initAfterApis[i]) {
|
2022
2372
|
const init = initAfterApis[i]
|
2023
|
-
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true
|
2373
|
+
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true})
|
2024
2374
|
}
|
2025
2375
|
const instance = this.instances.find((instance) => instance.name == name)
|
2026
2376
|
if (instance) {
|
2027
|
-
client.
|
2377
|
+
client.loadInstance(this, instance)
|
2028
2378
|
}
|
2029
2379
|
this.hierarchy.edges = this.config.hierarchy
|
2030
2380
|
}
|
2031
|
-
// this.instances.forEach((instance) => client.processInstance(this, instance))
|
2032
2381
|
}
|
2033
2382
|
|
2034
2383
|
if (reverseIt) {
|
@@ -2151,13 +2500,9 @@ class Config {
|
|
2151
2500
|
}
|
2152
2501
|
const km = (name) => this.getConfig(name)
|
2153
2502
|
if (config instanceof Config) {
|
2154
|
-
|
2155
|
-
const aw = (word, def) => this.addWord(word, def)
|
2156
|
-
config.initializerFn({ isModule: this.isModule, addWord: aw, baseConfig: this, km, currentConfig: config, config, objects: nsobjects, namespace, uuid, api: config.api })
|
2503
|
+
config.initializerFn(setupInitializerFNArgs(this, { isModule: this.isModule, currentConfig: config, testConfig: config, objects: nsobjects, namespace, uuid }))
|
2157
2504
|
} else {
|
2158
|
-
|
2159
|
-
const aw = (word, def) => this.addWord(word, def)
|
2160
|
-
this.initializerFn({ isModule: this.isModule, addWord: aw, baseConfig: this, km, currentConfig: this, config: this, objects: nsobjects, namespace, uuid, api: this.api })
|
2505
|
+
this.initializerFn(setupInitializerFNArgs(this, { isModule: this.isModule, currentConfig: this, testConfig: this, objects: nsobjects, namespace, uuid }))
|
2161
2506
|
}
|
2162
2507
|
})
|
2163
2508
|
}
|
@@ -2214,10 +2559,18 @@ class Config {
|
|
2214
2559
|
|
2215
2560
|
if (config.priorities) {
|
2216
2561
|
let priorities = config.priorities
|
2217
|
-
priorities = priorities.map((
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
2562
|
+
priorities = priorities.map((cp) => {
|
2563
|
+
const { context, choose, ordered } = cp
|
2564
|
+
const priority = {
|
2565
|
+
context: context.map((id) => {
|
2566
|
+
return [toNS(id[0]), id[1]]
|
2567
|
+
}),
|
2568
|
+
choose,
|
2569
|
+
}
|
2570
|
+
if (ordered) {
|
2571
|
+
priority.ordered = ordered
|
2572
|
+
}
|
2573
|
+
return priority
|
2221
2574
|
})
|
2222
2575
|
config.priorities = priorities
|
2223
2576
|
}
|
@@ -2307,14 +2660,14 @@ class Config {
|
|
2307
2660
|
|
2308
2661
|
set (property, value) {
|
2309
2662
|
if (!this.config.hasOwnProperty(property)) {
|
2310
|
-
throw `Setting invalid property ${property}`
|
2663
|
+
throw new Error(`Setting invalid property ${property}`)
|
2311
2664
|
}
|
2312
2665
|
|
2313
2666
|
if ('words' == property) {
|
2314
2667
|
for (let word in value) {
|
2315
2668
|
for (let def of value[word]) {
|
2316
2669
|
if (!def['uuid']) {
|
2317
|
-
throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`
|
2670
|
+
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}'`)
|
2318
2671
|
}
|
2319
2672
|
}
|
2320
2673
|
}
|
@@ -2323,7 +2676,7 @@ class Config {
|
|
2323
2676
|
if (['operators', 'bridges'].includes(property)) {
|
2324
2677
|
for (let def of value) {
|
2325
2678
|
if (!def['uuid']) {
|
2326
|
-
throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`
|
2679
|
+
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`)
|
2327
2680
|
}
|
2328
2681
|
}
|
2329
2682
|
}
|
@@ -2355,7 +2708,7 @@ class Config {
|
|
2355
2708
|
|
2356
2709
|
add (more) {
|
2357
2710
|
if (more === this) {
|
2358
|
-
throw 'Cannot add an object to itself.'
|
2711
|
+
throw new Error('Cannot add an object to itself.')
|
2359
2712
|
}
|
2360
2713
|
if (!(more instanceof Config)) {
|
2361
2714
|
more = new Config(more)
|
@@ -2416,7 +2769,8 @@ class Config {
|
|
2416
2769
|
}
|
2417
2770
|
|
2418
2771
|
// TODO get rid of useOldVersion arg
|
2419
|
-
addInternal (more, { useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
|
2772
|
+
addInternal (more, { addFirst = false, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
|
2773
|
+
validConfigProps(more)
|
2420
2774
|
if (more instanceof Config) {
|
2421
2775
|
more.initialize({ force: false })
|
2422
2776
|
if (useOldVersion) {
|
@@ -2426,8 +2780,10 @@ class Config {
|
|
2426
2780
|
more = _.cloneDeep(more.initConfig)
|
2427
2781
|
}
|
2428
2782
|
}
|
2783
|
+
debugConfigProps(more)
|
2784
|
+
|
2429
2785
|
if (hcps) {
|
2430
|
-
handleCalculatedProps(this, more)
|
2786
|
+
handleCalculatedProps(this, more, addFirst)
|
2431
2787
|
applyUUID(more, this._uuid)
|
2432
2788
|
}
|
2433
2789
|
for (const key of Object.keys(more)) {
|
@@ -2452,7 +2808,11 @@ class Config {
|
|
2452
2808
|
if (!configWords[word]) {
|
2453
2809
|
configWords[word] = []
|
2454
2810
|
}
|
2455
|
-
|
2811
|
+
if (addFirst) {
|
2812
|
+
configWords[word] = moreWords[word].concat(configWords[word])
|
2813
|
+
} else {
|
2814
|
+
configWords[word] = configWords[word].concat(moreWords[word])
|
2815
|
+
}
|
2456
2816
|
}
|
2457
2817
|
} else if (key === 'name') {
|
2458
2818
|
/*
|
@@ -2514,16 +2874,21 @@ class Config {
|
|
2514
2874
|
this.config[key].splice(iOldOne, 1)
|
2515
2875
|
break;
|
2516
2876
|
}
|
2517
|
-
}
|
2877
|
+
}
|
2518
2878
|
}
|
2519
2879
|
}
|
2520
2880
|
}
|
2881
|
+
|
2521
2882
|
// console.log('key', key, 'XXX')
|
2522
2883
|
// console.log('more', JSON.stringify(more, null, 2))
|
2523
|
-
|
2884
|
+
if (addFirst) {
|
2885
|
+
this.config[key] = more[key].concat(this.config[key])
|
2886
|
+
} else {
|
2887
|
+
this.config[key] = this.config[key].concat(more[key])
|
2888
|
+
}
|
2524
2889
|
} else {
|
2525
2890
|
if (!(key in this.config)) {
|
2526
|
-
throw `Unexpected property in config ${key}`
|
2891
|
+
throw new Error(`Unexpected property in config ${key}`)
|
2527
2892
|
}
|
2528
2893
|
this.config[key] = more[key]
|
2529
2894
|
}
|
@@ -2641,7 +3006,7 @@ class Config {
|
|
2641
3006
|
this.config[key] = more[key].concat(this.config[key])
|
2642
3007
|
} else {
|
2643
3008
|
if (!(key in this.config)) {
|
2644
|
-
throw `Unexpected property in config ${key}`
|
3009
|
+
throw new Error(`Unexpected property in config ${key}`)
|
2645
3010
|
}
|
2646
3011
|
this.config[key] = more[key]
|
2647
3012
|
}
|
@@ -2651,5 +3016,8 @@ class Config {
|
|
2651
3016
|
}
|
2652
3017
|
|
2653
3018
|
module.exports = {
|
2654
|
-
Config
|
3019
|
+
Config,
|
3020
|
+
config_toServer,
|
3021
|
+
operatorKey_valid,
|
3022
|
+
handleBridgeProps,
|
2655
3023
|
}
|