theprogrammablemind 8.0.0-beta.5 → 8.0.0-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client.js +73 -487
- package/index.js +3 -2
- package/package.json +13 -12
- package/src/config.js +193 -249
- package/src/configHelpers.js +448 -0
- package/src/generators.js +8 -8
- package/src/helpers.js +34 -1
- package/src/semantics.js +63 -69
package/src/config.js
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
const { Semantics, normalizeGenerator } = require('./semantics')
|
3
3
|
const { Generators } = require('./generators')
|
4
4
|
const { v4: uuidv4 } = require('uuid')
|
5
|
-
const
|
5
|
+
const configHelpers = require('./configHelpers')
|
6
6
|
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
8
|
+
const { InitCalls } = require('./helpers')
|
8
9
|
const { ecatch } = require('./helpers')
|
9
10
|
const runtime = require('../runtime')
|
10
11
|
const _ = require('lodash')
|
@@ -254,6 +255,9 @@ const priority_valid = (cp) => {
|
|
254
255
|
const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
255
256
|
ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
|
256
257
|
() => {
|
258
|
+
if (bridge.development && config.isModule) {
|
259
|
+
return
|
260
|
+
}
|
257
261
|
if (!bridge.bridge) {
|
258
262
|
bridge.bridge = '{ ...next(operator) }'
|
259
263
|
}
|
@@ -262,7 +266,12 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
262
266
|
}
|
263
267
|
if (bridge.children) {
|
264
268
|
for (const child of bridge.children) {
|
265
|
-
config.addHierarchy(child, bridge.id)
|
269
|
+
// config.addHierarchy(child, bridge.id)
|
270
|
+
if (child.child) {
|
271
|
+
config.addHierarchy(child.child, bridge.id, child.instance)
|
272
|
+
} else {
|
273
|
+
config.addHierarchy(child, bridge.id)
|
274
|
+
}
|
266
275
|
}
|
267
276
|
}
|
268
277
|
if (bridge.operator) {
|
@@ -270,12 +279,20 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
270
279
|
}
|
271
280
|
if (bridge.parents) {
|
272
281
|
for (const parent of bridge.parents) {
|
273
|
-
|
282
|
+
if (parent.parent) {
|
283
|
+
config.addHierarchy(bridge.id, parent.parent, parent.instance)
|
284
|
+
} else {
|
285
|
+
config.addHierarchy(bridge.id, parent)
|
286
|
+
}
|
274
287
|
}
|
275
288
|
}
|
276
289
|
if (bridge.isA) {
|
277
290
|
for (const parent of bridge.isA) {
|
278
|
-
|
291
|
+
if (parent.parent) {
|
292
|
+
config.addHierarchy(bridge.id, parent.parent, parent.instance)
|
293
|
+
} else {
|
294
|
+
config.addHierarchy(bridge.id, parent)
|
295
|
+
}
|
279
296
|
}
|
280
297
|
}
|
281
298
|
if (bridge.before) {
|
@@ -338,8 +355,8 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
338
355
|
const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
|
339
356
|
|
340
357
|
const generator = {
|
341
|
-
where: bridge.generatorp.where || bridge.where ||
|
342
|
-
match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
|
358
|
+
where: bridge.generatorp.where || bridge.where || helpers.where(4),
|
359
|
+
match: async (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && await match(args),
|
343
360
|
apply: (args) => apply(args),
|
344
361
|
applyWrapped: apply,
|
345
362
|
property: 'generatorp'
|
@@ -355,8 +372,8 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
355
372
|
const apply = typeof bridge.generatorr === 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
|
356
373
|
const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
|
357
374
|
const generator = {
|
358
|
-
where: bridge.generatorr.where || bridge.where ||
|
359
|
-
match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
|
375
|
+
where: bridge.generatorr.where || bridge.where || helpers.where(4),
|
376
|
+
match: async (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && await match(args),
|
360
377
|
apply: (args) => apply(args),
|
361
378
|
applyWrapped: apply,
|
362
379
|
property: 'generatorr'
|
@@ -369,7 +386,7 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
369
386
|
}
|
370
387
|
if (bridge.evaluator) {
|
371
388
|
const semantic = {
|
372
|
-
where: bridge.evaluator.where || bridge.where ||
|
389
|
+
where: bridge.evaluator.where || bridge.where || helpers.where(3),
|
373
390
|
match: ({ context }) => bridge.id == context.marker && context.evaluate,
|
374
391
|
apply: (args) => bridge.evaluator(args),
|
375
392
|
applyWrapped: bridge.evaluator,
|
@@ -383,7 +400,7 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
383
400
|
}
|
384
401
|
if (bridge.semantic) {
|
385
402
|
const semantic = {
|
386
|
-
where: bridge.semantic.where || bridge.where ||
|
403
|
+
where: bridge.semantic.where || bridge.where || helpers.where(3),
|
387
404
|
match: ({ context }) => bridge.id == context.marker && !context.evaluate,
|
388
405
|
apply: (args) => bridge.semantic(args),
|
389
406
|
applyWrapped: bridge.semantic,
|
@@ -551,7 +568,7 @@ function isLetter (char) {
|
|
551
568
|
}
|
552
569
|
*/
|
553
570
|
|
554
|
-
function configDup (config, options) {
|
571
|
+
async function configDup (config, options) {
|
555
572
|
if (config instanceof Config) {
|
556
573
|
return config.copy(options)
|
557
574
|
}
|
@@ -691,9 +708,9 @@ class KM {
|
|
691
708
|
return true
|
692
709
|
}
|
693
710
|
|
694
|
-
copy2 (options) {
|
711
|
+
async copy2 (options) {
|
695
712
|
// greg -> add a flag to say don't init the api's
|
696
|
-
const config = configDup(this._config, options)
|
713
|
+
const config = await configDup(this._config, options)
|
697
714
|
const km = new KM({
|
698
715
|
config,
|
699
716
|
getCounter: options.getCounter,
|
@@ -705,10 +722,10 @@ class KM {
|
|
705
722
|
return km // copy2()
|
706
723
|
}
|
707
724
|
|
708
|
-
copy () {
|
725
|
+
async copy () {
|
709
726
|
const km = new KM({
|
710
727
|
name: this._name,
|
711
|
-
config: configDup(this._config),
|
728
|
+
config: await configDup(this._config),
|
712
729
|
// _uuid: uuidv4(),
|
713
730
|
_uuid: this._config.getCounter(this._config._name),
|
714
731
|
getCounter: (name) => this._config.getCounter(name),
|
@@ -760,12 +777,11 @@ const multiApiImpl = (initializer) => {
|
|
760
777
|
multiApi: true,
|
761
778
|
|
762
779
|
// multi functions
|
763
|
-
add: (config, multiApi, api) => {
|
780
|
+
add: async (config, multiApi, api, apiConstructor) => {
|
764
781
|
initializer(config, api)
|
765
782
|
const name = api.getName()
|
766
783
|
multiApi.apis[name] = api
|
767
|
-
|
768
|
-
// api.config = () => config
|
784
|
+
multiApi.apiConstructors[name] = apiConstructor
|
769
785
|
multiApi.current = name
|
770
786
|
},
|
771
787
|
|
@@ -788,6 +804,9 @@ const multiApiImpl = (initializer) => {
|
|
788
804
|
apis: {
|
789
805
|
},
|
790
806
|
|
807
|
+
apiConstructors: {
|
808
|
+
},
|
809
|
+
|
791
810
|
// api functions
|
792
811
|
api: (multiApi) => multiApi.apis[multiApi.current]
|
793
812
|
})
|
@@ -798,17 +817,6 @@ class Config {
|
|
798
817
|
return config_toServer(config)
|
799
818
|
}
|
800
819
|
|
801
|
-
base () {
|
802
|
-
const base = new Config()
|
803
|
-
for (const km of this.configs.reverse()) {
|
804
|
-
if (km.isSelf) {
|
805
|
-
continue
|
806
|
-
}
|
807
|
-
base.add(km.config)
|
808
|
-
}
|
809
|
-
return base
|
810
|
-
}
|
811
|
-
|
812
820
|
getInfo () {
|
813
821
|
const name = this.name
|
814
822
|
const includes = this.configs.slice(1).map((km) => km.config.name)
|
@@ -852,6 +860,7 @@ class Config {
|
|
852
860
|
addArgs: (...args) => this.addArgs(...args),
|
853
861
|
getBridge: (...args) => this.getBridge(...args),
|
854
862
|
fragment: (...args) => this.fragment(...args),
|
863
|
+
server: (...args) => this.server(...args),
|
855
864
|
exists: (...args) => this.exists(...args),
|
856
865
|
addAPI: (...args) => this.addAPI(...args)
|
857
866
|
}
|
@@ -988,23 +997,8 @@ class Config {
|
|
988
997
|
|
989
998
|
// value is in response field
|
990
999
|
// TODO maybe generalize out query+evaluate along the lines of set value and set reference
|
991
|
-
|
992
|
-
|
993
|
-
const instance = s({ ...context, evaluate: true })
|
994
|
-
if (!instance.evalue && !instance.verbatim && !instance.value) {
|
995
|
-
this.warningNotEvaluated(log, context);
|
996
|
-
}
|
997
|
-
if (!instance.evalue) {
|
998
|
-
instance.evalue = instance.value
|
999
|
-
instance.edefault = true
|
1000
|
-
}
|
1001
|
-
delete instance.evaluate
|
1002
|
-
instance.instance = true;
|
1003
|
-
return instance
|
1004
|
-
}
|
1005
|
-
*/
|
1006
|
-
getEvaluator (s, calls, log, context) {
|
1007
|
-
const instance = s({ ...context, evaluate: true })
|
1000
|
+
async getEvaluator (s, calls, log, context) {
|
1001
|
+
const instance = await s({ ...context, evaluate: true })
|
1008
1002
|
calls.touch(instance)
|
1009
1003
|
if (!instance.evalue && !instance.verbatim && !instance.value) {
|
1010
1004
|
this.warningNotEvaluated(log, context)
|
@@ -1018,19 +1012,21 @@ class Config {
|
|
1018
1012
|
return instance
|
1019
1013
|
}
|
1020
1014
|
|
1021
|
-
fragmentInstantiator (contexts) {
|
1015
|
+
fragmentInstantiator (args, contexts) {
|
1022
1016
|
return new Object({
|
1023
1017
|
contexts: () => contexts,
|
1024
|
-
instantiate: (mappings) => {
|
1018
|
+
instantiate: async (mappings) => {
|
1025
1019
|
const instantiated = _.cloneDeep(contexts)
|
1026
1020
|
// const todo = [...instantiated]
|
1027
1021
|
// const todo = [...instantiated]
|
1028
1022
|
const todo = _.clone(instantiated)
|
1023
|
+
args = {...args}
|
1029
1024
|
while (todo.length > 0) {
|
1030
1025
|
const context = todo.pop()
|
1026
|
+
args.context = context
|
1031
1027
|
for (const mapping of mappings) {
|
1032
|
-
if (mapping.match(
|
1033
|
-
mapping.apply(
|
1028
|
+
if (await mapping.match(args)) {
|
1029
|
+
await mapping.apply(args)
|
1034
1030
|
}
|
1035
1031
|
}
|
1036
1032
|
for (const key of Object.keys(context)) {
|
@@ -1049,11 +1045,21 @@ class Config {
|
|
1049
1045
|
})
|
1050
1046
|
}
|
1051
1047
|
|
1052
|
-
fragment (query) {
|
1048
|
+
fragment (args, query) {
|
1053
1049
|
for (const instance of (this.instances || [])) {
|
1054
1050
|
for (const fragment of (instance.fragments || [])) {
|
1055
1051
|
if (fragment.query === query) {
|
1056
|
-
return this.fragmentInstantiator(fragment.contexts)
|
1052
|
+
return this.fragmentInstantiator(args, fragment.contexts)
|
1053
|
+
}
|
1054
|
+
}
|
1055
|
+
for (const fragment of (instance.resultss || [])) {
|
1056
|
+
if (fragment.isFragment && fragment.query === query) {
|
1057
|
+
return this.fragmentInstantiator(args, fragment.contexts)
|
1058
|
+
}
|
1059
|
+
}
|
1060
|
+
for (const fragment of (this.fragmentsBeingBuilt || [])) {
|
1061
|
+
if (fragment.query === query) {
|
1062
|
+
return this.fragmentInstantiator(args, fragment.contexts)
|
1057
1063
|
}
|
1058
1064
|
}
|
1059
1065
|
}
|
@@ -1093,6 +1099,27 @@ class Config {
|
|
1093
1099
|
} else {
|
1094
1100
|
const config = { ...queryOrConfig }
|
1095
1101
|
delete config.where
|
1102
|
+
|
1103
|
+
if (config.words && config.words.hierarchy) {
|
1104
|
+
config.words.hierarchy = config.words.hierarchy.map( (value) => {
|
1105
|
+
value = {...value}
|
1106
|
+
delete value.uuid
|
1107
|
+
return value
|
1108
|
+
})
|
1109
|
+
}
|
1110
|
+
|
1111
|
+
if (config.words && config.words.patterns) {
|
1112
|
+
config.words.patterns = config.words.patterns.map( (value) => {
|
1113
|
+
value = {...value}
|
1114
|
+
value.defs = value.defs.map( (value) => {
|
1115
|
+
value = {...value}
|
1116
|
+
delete value.uuid
|
1117
|
+
return value
|
1118
|
+
})
|
1119
|
+
return value
|
1120
|
+
})
|
1121
|
+
}
|
1122
|
+
|
1096
1123
|
config.operators = (config.operators || []).map((operator) => {
|
1097
1124
|
if (typeof operator === 'string') {
|
1098
1125
|
return { pattern: operator }
|
@@ -1120,6 +1147,9 @@ class Config {
|
|
1120
1147
|
delete bridge.generatorpr
|
1121
1148
|
delete bridge.evaluator
|
1122
1149
|
delete bridge.semantic
|
1150
|
+
if (!bridge.bridge) {
|
1151
|
+
bridge.bridge = "{ ...next(operator) }"
|
1152
|
+
}
|
1123
1153
|
return bridge
|
1124
1154
|
})
|
1125
1155
|
} else {
|
@@ -1197,7 +1227,9 @@ class Config {
|
|
1197
1227
|
// console.log("instanceFragments", instanceFragments)
|
1198
1228
|
}
|
1199
1229
|
}
|
1200
|
-
if (startOfChanges
|
1230
|
+
if (startOfChanges) {
|
1231
|
+
return { needsRebuild: true, startOfChanges, previousResultss: instance.resultss }
|
1232
|
+
} else if (startOfChanges || instance.resultss) {
|
1201
1233
|
return { needsRebuild: !(instance && sameQueries && sameFragments), startOfChanges, previousResultss: instance.resultss }
|
1202
1234
|
} else {
|
1203
1235
|
return { needsRebuild: !(instance && sameQueries && sameFragments) }
|
@@ -1222,7 +1254,7 @@ class Config {
|
|
1222
1254
|
}
|
1223
1255
|
|
1224
1256
|
// loadTemplate
|
1225
|
-
load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
|
1257
|
+
async load (rebuildTemplate, template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
|
1226
1258
|
this.validifyTemplate(template)
|
1227
1259
|
instance.template = template
|
1228
1260
|
this.logs.push(`loading template for ${this.name}`)
|
@@ -1230,7 +1262,7 @@ class Config {
|
|
1230
1262
|
// TODO fix beforeQuery
|
1231
1263
|
template = { fragments: [], configs: [], ...template }
|
1232
1264
|
template.fragments = template.fragments.concat(this.dynamicFragments)
|
1233
|
-
|
1265
|
+
rebuildTemplate({ config: this, target: this.name, previousResultss: options.previousResultss, startOfChanges: options.startOfChanges, beforeQuery: () => {}, template, ...options })
|
1234
1266
|
} else {
|
1235
1267
|
// no change
|
1236
1268
|
// this.initInstances.push({ ...instance, name: config.name })
|
@@ -1255,7 +1287,7 @@ class Config {
|
|
1255
1287
|
instance.name = this.name
|
1256
1288
|
this.initInstances.push(instance)
|
1257
1289
|
this.instances.push(instance)
|
1258
|
-
|
1290
|
+
await configHelpers.loadInstance(this, instance)
|
1259
1291
|
}
|
1260
1292
|
}
|
1261
1293
|
}
|
@@ -1309,9 +1341,9 @@ class Config {
|
|
1309
1341
|
}
|
1310
1342
|
}
|
1311
1343
|
|
1312
|
-
addHierarchy (child, parent) {
|
1344
|
+
addHierarchy (child, parent, instance) {
|
1313
1345
|
if (child && parent || !child || Array.isArray(child) || (typeof child === 'string' && !parent)) {
|
1314
|
-
this.addHierarchyChildParent(child, parent)
|
1346
|
+
this.addHierarchyChildParent(child, parent, instance)
|
1315
1347
|
// this.addHierarchyProperties ({ child, parent })
|
1316
1348
|
} else {
|
1317
1349
|
this.addHierarchyProperties(child)
|
@@ -1319,26 +1351,32 @@ class Config {
|
|
1319
1351
|
}
|
1320
1352
|
|
1321
1353
|
addHierarchyProperties (edge) {
|
1322
|
-
const { child, parent } = edge
|
1354
|
+
const { child, parent, instance } = edge
|
1323
1355
|
if (typeof child !== 'string') {
|
1324
1356
|
throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
|
1325
1357
|
}
|
1326
1358
|
if (typeof parent !== 'string') {
|
1327
1359
|
throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
|
1328
1360
|
}
|
1361
|
+
if (instance && typeof instance !== 'boolean') {
|
1362
|
+
throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
|
1363
|
+
}
|
1329
1364
|
debugHierarchy([child, parent])
|
1330
1365
|
this.config.hierarchy.push(edge)
|
1331
1366
|
// TODO greg11 this.hierarchy.addEdge(edge)
|
1332
|
-
this._delta.json.hierarchy.push([child, parent])
|
1367
|
+
this._delta.json.hierarchy.push([child, parent, instance || false])
|
1333
1368
|
}
|
1334
1369
|
|
1335
|
-
addHierarchyChildParent (child, parent) {
|
1370
|
+
addHierarchyChildParent (child, parent, instance) {
|
1336
1371
|
if (typeof child !== 'string') {
|
1337
1372
|
throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
|
1338
1373
|
}
|
1339
1374
|
if (typeof parent !== 'string') {
|
1340
1375
|
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
1341
1376
|
}
|
1377
|
+
if (instance && typeof instance !== 'boolean') {
|
1378
|
+
throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
|
1379
|
+
}
|
1342
1380
|
debugHierarchy([child, parent])
|
1343
1381
|
if (this.config.hierarchy.find((element) => {
|
1344
1382
|
const hc = hierarchyCanonical(element)
|
@@ -1349,9 +1387,9 @@ class Config {
|
|
1349
1387
|
return
|
1350
1388
|
}
|
1351
1389
|
|
1352
|
-
this.config.hierarchy.push([child, parent])
|
1390
|
+
this.config.hierarchy.push([child, parent, instance || false])
|
1353
1391
|
// this.hierarchy.addEdge([child, parent])
|
1354
|
-
this._delta.json.hierarchy.push([child, parent])
|
1392
|
+
this._delta.json.hierarchy.push([child, parent, instance || false])
|
1355
1393
|
}
|
1356
1394
|
|
1357
1395
|
getBridge (id, level) {
|
@@ -1398,7 +1436,7 @@ class Config {
|
|
1398
1436
|
}
|
1399
1437
|
|
1400
1438
|
if (!generator.where) {
|
1401
|
-
generator.where =
|
1439
|
+
generator.where = helpers.where(3)
|
1402
1440
|
}
|
1403
1441
|
|
1404
1442
|
const generators = this.config.generators
|
@@ -1421,7 +1459,7 @@ class Config {
|
|
1421
1459
|
}
|
1422
1460
|
|
1423
1461
|
if (!semantic.where) {
|
1424
|
-
semantic.where =
|
1462
|
+
semantic.where = helpers.where(3)
|
1425
1463
|
}
|
1426
1464
|
|
1427
1465
|
const semantics = this.config.semantics
|
@@ -1608,16 +1646,12 @@ class Config {
|
|
1608
1646
|
return params
|
1609
1647
|
}
|
1610
1648
|
|
1611
|
-
|
1612
|
-
|
1613
|
-
}
|
1614
|
-
|
1615
|
-
processContext (context) {
|
1616
|
-
return client.processContext(context, this.getParams())
|
1649
|
+
async processContext (context) {
|
1650
|
+
return await configHelpers.processContext(context, this.getParams())
|
1617
1651
|
}
|
1618
1652
|
|
1619
1653
|
process (query, options) {
|
1620
|
-
return
|
1654
|
+
return this.clientProcess(this, query, options)
|
1621
1655
|
}
|
1622
1656
|
|
1623
1657
|
query (query, options) {
|
@@ -1758,7 +1792,7 @@ class Config {
|
|
1758
1792
|
}
|
1759
1793
|
|
1760
1794
|
// configs = [ { config, namespace } ... ]
|
1761
|
-
constructor (config, module) {
|
1795
|
+
constructor (config, module, clientProcess) {
|
1762
1796
|
if (config instanceof Config) {
|
1763
1797
|
throw new Error('Excepted the config argument to be a hash not a Config object')
|
1764
1798
|
}
|
@@ -1776,6 +1810,7 @@ class Config {
|
|
1776
1810
|
config.priorities = config.priorities || []
|
1777
1811
|
}
|
1778
1812
|
|
1813
|
+
this.clientProcess = clientProcess
|
1779
1814
|
this.maxDepth = 20 // for generators and semantics
|
1780
1815
|
this.debugLoops = false // for generators and semantics
|
1781
1816
|
|
@@ -1801,24 +1836,6 @@ class Config {
|
|
1801
1836
|
// when running configs any bridges added are marked as transitory so that the associated will ignore those op's
|
1802
1837
|
this.transitoryMode = false
|
1803
1838
|
|
1804
|
-
// check for duplicate bridges
|
1805
|
-
if (config && config.bridges) {
|
1806
|
-
let duplicated = new Set()
|
1807
|
-
const seen = new Set()
|
1808
|
-
for (const bridge of config.bridges) {
|
1809
|
-
const id = `${bridge.id}/${bridge.level}`
|
1810
|
-
if (seen.has(id)) {
|
1811
|
-
duplicated.add(id)
|
1812
|
-
} else {
|
1813
|
-
seen.add(id)
|
1814
|
-
}
|
1815
|
-
}
|
1816
|
-
duplicated = Array.from(duplicated)
|
1817
|
-
if (duplicated.length > 0) {
|
1818
|
-
throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
1819
|
-
}
|
1820
|
-
}
|
1821
|
-
|
1822
1839
|
if (config && config.words) {
|
1823
1840
|
initWords(config.words)
|
1824
1841
|
isValidWordDef(config.words)
|
@@ -1867,6 +1884,7 @@ class Config {
|
|
1867
1884
|
}
|
1868
1885
|
this.get('objects').namespaced[this._uuid] = {}
|
1869
1886
|
this.valid()
|
1887
|
+
this.checks()
|
1870
1888
|
debugConfigProps(this.config)
|
1871
1889
|
}
|
1872
1890
|
|
@@ -1878,9 +1896,9 @@ class Config {
|
|
1878
1896
|
this._stop_auto_rebuild = true
|
1879
1897
|
}
|
1880
1898
|
|
1881
|
-
restart_auto_rebuild() {
|
1899
|
+
async restart_auto_rebuild() {
|
1882
1900
|
this._stop_auto_rebuild = false
|
1883
|
-
this.rebuild()
|
1901
|
+
await this.rebuild()
|
1884
1902
|
}
|
1885
1903
|
|
1886
1904
|
getAddedArgs (args) {
|
@@ -1899,8 +1917,8 @@ class Config {
|
|
1899
1917
|
}
|
1900
1918
|
}
|
1901
1919
|
|
1902
|
-
|
1903
|
-
this.
|
1920
|
+
async setMultiApi (initializer) {
|
1921
|
+
await this.setApi(() => multiApiImpl(initializer))
|
1904
1922
|
}
|
1905
1923
|
|
1906
1924
|
get multiApi () {
|
@@ -1948,31 +1966,38 @@ class Config {
|
|
1948
1966
|
}
|
1949
1967
|
}
|
1950
1968
|
|
1951
|
-
addAPI (api) {
|
1969
|
+
async addAPI (api) {
|
1970
|
+
// console.trace()
|
1971
|
+
// throw "addAPI"
|
1952
1972
|
if (this._api && this._api.multiApi) {
|
1953
|
-
this._api.add(this, this._api, api)
|
1973
|
+
await this._api.add(this, this._api, api)
|
1954
1974
|
} else {
|
1955
1975
|
throw new Error('Can only add apis to a multi-api')
|
1956
1976
|
}
|
1957
1977
|
}
|
1958
1978
|
|
1959
|
-
|
1979
|
+
async setApi (constructor) {
|
1980
|
+
if (typeof constructor !== 'function') {
|
1981
|
+
throw new Error(`Expected the argument to be an API constructor for ${this.name}.`)
|
1982
|
+
}
|
1983
|
+
const value = constructor()
|
1960
1984
|
if (!value.initialize) {
|
1961
1985
|
throw new Error(`Expected the API to have an initialize function for ${this.name}.`)
|
1962
1986
|
}
|
1963
1987
|
|
1964
1988
|
if (this._api && this._api.multiApi) {
|
1965
|
-
this._api.add(this, this._api, value)
|
1966
|
-
|
1967
|
-
this.
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
// this._api.uuid = this._uuid
|
1989
|
+
await this._api.add(this, this._api, value, constructor)
|
1990
|
+
const previousApiConstructor = this._apiConstructor
|
1991
|
+
this._apiConstructor = (config) => {
|
1992
|
+
const api = previousApiConstructor(config)
|
1993
|
+
// does this need await?
|
1994
|
+
api.add(config, api, constructor(config), constructor)
|
1995
|
+
return api
|
1973
1996
|
}
|
1974
|
-
|
1975
|
-
this.
|
1997
|
+
} else {
|
1998
|
+
this._api = value
|
1999
|
+
this._apiConstructor = constructor
|
2000
|
+
await this.rebuild()
|
1976
2001
|
}
|
1977
2002
|
}
|
1978
2003
|
|
@@ -1992,7 +2017,7 @@ class Config {
|
|
1992
2017
|
}
|
1993
2018
|
|
1994
2019
|
// remove all added modules and initialize with the init config
|
1995
|
-
resetToOne () {
|
2020
|
+
async resetToOne () {
|
1996
2021
|
/*
|
1997
2022
|
this.config = _.cloneDeep(this.initConfig)
|
1998
2023
|
this.configs = [this.configs[0]]
|
@@ -2001,11 +2026,8 @@ class Config {
|
|
2001
2026
|
*/
|
2002
2027
|
this.configs = [this.configs[0]]
|
2003
2028
|
this.defaultConfig()
|
2004
|
-
|
2005
|
-
|
2006
|
-
Object.assign(this.config.objects, _.cloneDeep(this.initConfig.objects || {}))
|
2007
|
-
}
|
2008
|
-
this.initializeConfigFromConfigs({ others: [], objects: this.config.objects.namespaced, moreNames: [], callInitializers: false })
|
2029
|
+
Object.assign(this.config.objects, _.cloneDeep(this.initConfig.objects || {}))
|
2030
|
+
await this.initializeConfigFromConfigs({ others: [], objects: this.config.objects.namespaced, moreNames: [], callInitializers: false })
|
2009
2031
|
const map = {}
|
2010
2032
|
for (let i = 0; i < this.configs.length; ++i) {
|
2011
2033
|
map[this.configs[i].uuid] = this.configs[i].uuid
|
@@ -2027,21 +2049,26 @@ class Config {
|
|
2027
2049
|
runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
|
2028
2050
|
}
|
2029
2051
|
|
2030
|
-
copy (options = { callInitializers: true }) {
|
2031
|
-
}
|
2032
|
-
|
2033
|
-
copy (options = { callInitializers: true }) {
|
2052
|
+
async copy (options = { callInitializers: true }) {
|
2034
2053
|
this.valid()
|
2035
2054
|
const cp = new Config()
|
2036
2055
|
cp.logs = []
|
2037
2056
|
cp.maxDepth = this.maxDepth
|
2038
2057
|
cp.debugLoops = this.debugLoops
|
2039
2058
|
cp.transitoryMode = this.transitoryMode
|
2040
|
-
cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
2059
|
+
// cp.configs = this.configs.map((km) => await km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
2060
|
+
cp.configs = []
|
2061
|
+
for (const km of this.configs) {
|
2062
|
+
cp.configs.push(await km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
|
2063
|
+
}
|
2041
2064
|
cp._uuid = cp.configs[0]._uuid
|
2042
2065
|
// update uuid here set the uuid in the objects and add error checking
|
2043
2066
|
cp.initializerFn = this.initializerFn
|
2044
|
-
cp._api = _.cloneDeep(this._api)
|
2067
|
+
// cp._api = _.cloneDeep(this._api)
|
2068
|
+
if (this._apiConstructor) {
|
2069
|
+
cp._api = this._apiConstructor(cp)
|
2070
|
+
cp._apiConstructor = this._apiConstructor
|
2071
|
+
}
|
2045
2072
|
cp._namespace = this._namespace
|
2046
2073
|
cp._eqClasses = this._eqClasses
|
2047
2074
|
cp.name = this.name
|
@@ -2058,13 +2085,8 @@ class Config {
|
|
2058
2085
|
cp.defaultConfig()
|
2059
2086
|
// cp.wasInitialized = false; // since default config GREG
|
2060
2087
|
cp.resetWasInitialized()
|
2061
|
-
|
2062
|
-
|
2063
|
-
Object.assign(cp.config.objects, _.cloneDeep(this.initConfig.objects || {}))
|
2064
|
-
}
|
2065
|
-
// cp.initializeConfigFromConfigs({ others: [], objects: cp.config.objects.namespaced, moreNames: [], ...options })
|
2066
|
-
// cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, { callInitializers: false }))
|
2067
|
-
cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, options))
|
2088
|
+
Object.assign(cp.config.objects, _.cloneDeep(this.initConfig.objects || {}))
|
2089
|
+
await cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, options))
|
2068
2090
|
const map = {}
|
2069
2091
|
for (let i = 0; i < this.configs.length; ++i) {
|
2070
2092
|
map[this.configs[i].uuid] = cp.configs[i].uuid
|
@@ -2075,33 +2097,16 @@ class Config {
|
|
2075
2097
|
// debugger
|
2076
2098
|
}
|
2077
2099
|
if (options.callInitializers) {
|
2078
|
-
cp.rebuild(options)
|
2100
|
+
await cp.rebuild(options) // in copy
|
2079
2101
|
} else {
|
2080
|
-
// this mess is for duplicate into a KM after resetToOne was called
|
2081
|
-
/*
|
2082
|
-
if (cp._api) {
|
2083
|
-
// cp._api.objects = cp.config.objects
|
2084
|
-
// cp._api.config = () => (cp instanceof Config) ? cp : cp.config
|
2085
|
-
// cp._api.uuid = cp._uuid
|
2086
|
-
}
|
2087
|
-
*/
|
2088
|
-
|
2089
2102
|
if (!cp.config.objects) {
|
2090
2103
|
cp.config.objects = { namespaced: {} }
|
2091
2104
|
} else if (!cp.config.objects.namespaced) {
|
2092
2105
|
cp.config.objects.namespaced = {}
|
2093
2106
|
}
|
2094
2107
|
cp.configs.forEach((km) => {
|
2095
|
-
// const namespace = km.namespace
|
2096
2108
|
cp.config.objects.namespaced[km._uuid] = {}
|
2097
2109
|
})
|
2098
|
-
/*
|
2099
|
-
if (cp._uuid == 'concept2') {
|
2100
|
-
if (!cp.api.objects.defaultTypesForHierarchy) {
|
2101
|
-
debugger
|
2102
|
-
}
|
2103
|
-
}
|
2104
|
-
*/
|
2105
2110
|
}
|
2106
2111
|
cp.valid()
|
2107
2112
|
return cp
|
@@ -2225,41 +2230,7 @@ class Config {
|
|
2225
2230
|
}
|
2226
2231
|
}
|
2227
2232
|
|
2228
|
-
|
2229
|
-
// [...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
|
2230
|
-
[...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
|
2231
|
-
/*
|
2232
|
-
let objects = this.get('objects')
|
2233
|
-
if (namespace) {
|
2234
|
-
objects = {}
|
2235
|
-
this.get('objects')['namespaced'][namespace] = objects
|
2236
|
-
}
|
2237
|
-
*/
|
2238
|
-
const objects = {}
|
2239
|
-
if (config instanceof Config) {
|
2240
|
-
this.get('objects').namespaced[config._uuid] = objects
|
2241
|
-
/*
|
2242
|
-
if (config._api) {
|
2243
|
-
// config._api.objects = objects
|
2244
|
-
// config._api.config = () => this
|
2245
|
-
}
|
2246
|
-
*/
|
2247
|
-
config.initializerFn(setupInitializerFNArgs(this, { testConfig: config, currentConfig: config, objects, namespace, uuid }))
|
2248
|
-
} else {
|
2249
|
-
this.get('objects').namespaced[this._uuid] = objects
|
2250
|
-
/*
|
2251
|
-
if (config._api) {
|
2252
|
-
// config._api.objects = objects
|
2253
|
-
// config._api.config = () => this
|
2254
|
-
}
|
2255
|
-
*/
|
2256
|
-
this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, namespace, uuid }))
|
2257
|
-
}
|
2258
|
-
})
|
2259
|
-
this.instances.forEach((instance) => client.loadInstance(this, instance))
|
2260
|
-
}
|
2261
|
-
|
2262
|
-
initialize ({ force = true } = {}) {
|
2233
|
+
initialize23 ({ force = true } = {}) {
|
2263
2234
|
if (force || !this.wasInitialized) {
|
2264
2235
|
const objects = this.config.objects.namespaced[this._uuid]
|
2265
2236
|
this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, uuid: this._uuid, namespace: '' }))
|
@@ -2267,7 +2238,7 @@ class Config {
|
|
2267
2238
|
}
|
2268
2239
|
}
|
2269
2240
|
|
2270
|
-
initializer (fn, options = {}) {
|
2241
|
+
async initializer (fn, options = {}) {
|
2271
2242
|
if (options) {
|
2272
2243
|
for (const option of Object.keys(options)) {
|
2273
2244
|
const validOptions = []
|
@@ -2289,8 +2260,7 @@ class Config {
|
|
2289
2260
|
currentConfig.wasInitialized = true
|
2290
2261
|
global.transitoryMode = transitoryMode
|
2291
2262
|
}
|
2292
|
-
|
2293
|
-
this.rebuild()
|
2263
|
+
await this.rebuild()
|
2294
2264
|
}
|
2295
2265
|
|
2296
2266
|
nsToString (id) {
|
@@ -2436,7 +2406,7 @@ class Config {
|
|
2436
2406
|
}
|
2437
2407
|
|
2438
2408
|
// rebuild ({ isModule: mainIsModule = false } = {}) {
|
2439
|
-
rebuild ({ isModule: mainIsModule } = {}) {
|
2409
|
+
async rebuild ({ isModule: mainIsModule } = {}) {
|
2440
2410
|
if (this._stop_auto_rebuild) {
|
2441
2411
|
return
|
2442
2412
|
}
|
@@ -2604,7 +2574,7 @@ class Config {
|
|
2604
2574
|
}
|
2605
2575
|
const instance = this.instances.find((instance) => instance.name == name)
|
2606
2576
|
if (instance) {
|
2607
|
-
|
2577
|
+
await configHelpers.loadInstance(this, instance)
|
2608
2578
|
}
|
2609
2579
|
this.hierarchy.edges = this.config.hierarchy
|
2610
2580
|
}
|
@@ -2612,7 +2582,7 @@ class Config {
|
|
2612
2582
|
|
2613
2583
|
this.hierarchy.edges = this.config.hierarchy
|
2614
2584
|
this.valid()
|
2615
|
-
this.
|
2585
|
+
this.checks()
|
2616
2586
|
}
|
2617
2587
|
|
2618
2588
|
nameToUUID (name) {
|
@@ -2624,6 +2594,7 @@ class Config {
|
|
2624
2594
|
// if undefined namespace applies to first loaded config
|
2625
2595
|
// if list of name then namespace applied only to those configs
|
2626
2596
|
// if true then namespace applies to all loaded configs
|
2597
|
+
/*
|
2627
2598
|
namespace (moreNames, others) {
|
2628
2599
|
const config = this.copy()
|
2629
2600
|
if (!Array.isArray(moreNames)) {
|
@@ -2659,6 +2630,7 @@ class Config {
|
|
2659
2630
|
config.rebuild()
|
2660
2631
|
return config
|
2661
2632
|
}
|
2633
|
+
*/
|
2662
2634
|
|
2663
2635
|
setupNamespace (km) {
|
2664
2636
|
let config = km.config
|
@@ -2677,7 +2649,7 @@ class Config {
|
|
2677
2649
|
|
2678
2650
|
// config.initializerFn({ config: this, objects, namespace })
|
2679
2651
|
// this goes through all the configs and sets up this.config
|
2680
|
-
initializeConfigFromConfigs ({ others, objects, moreNames, callInitializers = true }) {
|
2652
|
+
async initializeConfigFromConfigs ({ others, objects, moreNames, callInitializers = true }) {
|
2681
2653
|
// setup the namespace in the configs
|
2682
2654
|
let first = true
|
2683
2655
|
this.configs.forEach((km) => {
|
@@ -2826,6 +2798,11 @@ class Config {
|
|
2826
2798
|
}
|
2827
2799
|
}
|
2828
2800
|
|
2801
|
+
checks () {
|
2802
|
+
this.checkOperators()
|
2803
|
+
this.checkBridges()
|
2804
|
+
}
|
2805
|
+
|
2829
2806
|
checkOperators () {
|
2830
2807
|
if (!this.config.operators) {
|
2831
2808
|
return
|
@@ -2846,53 +2823,19 @@ class Config {
|
|
2846
2823
|
return
|
2847
2824
|
}
|
2848
2825
|
|
2849
|
-
|
2850
|
-
|
2851
|
-
"634a678b-8d92-4464-bf65-943a82f404d8": {
|
2852
|
-
"ids": [ "tankConcept" ],
|
2853
|
-
"namespace": [ "ns1" ]
|
2854
|
-
},
|
2855
|
-
console.log('before check', JSON.stringify(this._eqClasses, null, 2))
|
2856
|
-
*/
|
2857
|
-
|
2858
|
-
const errors = []
|
2859
|
-
/*
|
2860
|
-
const namespaces = this.config.namespaces
|
2861
|
-
const nsToIds = {}
|
2862
|
-
for (const uuid in namespaces) {
|
2863
|
-
const namespace = namespaces[uuid].namespace
|
2864
|
-
const ns = namespace.join('#')
|
2865
|
-
if (!nsToIds[ns]) {
|
2866
|
-
nsToIds[ns] = new Set()
|
2867
|
-
}
|
2868
|
-
const ids = nsToIds[ns]
|
2869
|
-
for (const id of namespaces[uuid].ids) {
|
2870
|
-
if (ids.has(id)) {
|
2871
|
-
if (ns === '') {
|
2872
|
-
const dups = this.config.bridges.filter( (bridge) => bridge.id == id )
|
2873
|
-
errors.push(`Id '${id}' is defined more than once in the bridges of the base namespace of the KM ${this.name}, Dups are ${JSON.stringify(dups)}`)
|
2874
|
-
} else {
|
2875
|
-
errors.push(`Id '${id}' is defined more than once in the bridges of the ${ns} namespace of the KM ${this.name}`)
|
2876
|
-
}
|
2877
|
-
} else {
|
2878
|
-
ids.add(id)
|
2879
|
-
}
|
2880
|
-
}
|
2881
|
-
}
|
2882
|
-
*/
|
2883
|
-
|
2884
|
-
const keyIsPresent = {}
|
2826
|
+
let duplicated = new Set()
|
2827
|
+
const seen = new Set()
|
2885
2828
|
for (const bridge of this.config.bridges) {
|
2886
|
-
const
|
2887
|
-
if (
|
2888
|
-
|
2829
|
+
const id = `${bridge.id}/${bridge.level} (namespace: ${bridge.uuid || this.uuid})`
|
2830
|
+
if (seen.has(id)) {
|
2831
|
+
duplicated.add(id)
|
2889
2832
|
} else {
|
2890
|
-
|
2833
|
+
seen.add(id)
|
2891
2834
|
}
|
2892
2835
|
}
|
2893
|
-
|
2894
|
-
if (
|
2895
|
-
throw
|
2836
|
+
duplicated = Array.from(duplicated)
|
2837
|
+
if (duplicated.length > 0) {
|
2838
|
+
throw new Error(`In the KM ${this.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
2896
2839
|
}
|
2897
2840
|
};
|
2898
2841
|
|
@@ -2949,25 +2892,29 @@ class Config {
|
|
2949
2892
|
}
|
2950
2893
|
}
|
2951
2894
|
|
2952
|
-
add (...
|
2953
|
-
|
2954
|
-
if (
|
2955
|
-
throw new Error(
|
2895
|
+
async add (...createConfigs) {
|
2896
|
+
createConfigs.forEach((createConfig, index) => {
|
2897
|
+
if (typeof createConfig !== 'function') {
|
2898
|
+
throw new Error(`Expected add argument number ${index+1} to be a function that constructs the config.`)
|
2956
2899
|
}
|
2957
2900
|
})
|
2958
2901
|
|
2959
|
-
mores =
|
2960
|
-
|
2961
|
-
|
2902
|
+
const mores = []
|
2903
|
+
for (const createConfig of createConfigs) {
|
2904
|
+
const more = await createConfig()
|
2905
|
+
if (this.name && this.name == more.name) {
|
2906
|
+
throw new Error('Cannot add an object to itself for argument number ${index+1}.')
|
2962
2907
|
}
|
2963
|
-
|
2964
|
-
|
2965
|
-
|
2966
|
-
|
2908
|
+
if (this === more) {
|
2909
|
+
throw new Error('Cannot add an object to itself.')
|
2910
|
+
}
|
2911
|
+
mores.push(more)
|
2912
|
+
}
|
2913
|
+
for (let more of mores) {
|
2967
2914
|
this.valid()
|
2968
2915
|
more.valid()
|
2969
2916
|
// copy so i don't have to copy later
|
2970
|
-
more = more.copy()
|
2917
|
+
more = await more.copy()
|
2971
2918
|
more.server(this._server, this._key, this._queryParams)
|
2972
2919
|
|
2973
2920
|
const moreConfigs = more.configs.map((km) => km.name || km.uuid)
|
@@ -2982,9 +2929,6 @@ class Config {
|
|
2982
2929
|
const moreKMs1 = [new KM({ config: more, getCounter: (name) => this.getCounter(name), uuid: more.uuid, namespace })]
|
2983
2930
|
const moreKMs2 = more.configs.slice(1).map((km) => {
|
2984
2931
|
return km
|
2985
|
-
// const cp = km.copy()
|
2986
|
-
// cp.namespace = namespace
|
2987
|
-
// return cp;
|
2988
2932
|
})
|
2989
2933
|
const moreKMs = moreKMs1.concat(moreKMs2)
|
2990
2934
|
const eqClass = moreKMs.map((km) => km.uuid)
|
@@ -2998,7 +2942,7 @@ class Config {
|
|
2998
2942
|
this.configs.push(moreKM)
|
2999
2943
|
}
|
3000
2944
|
}
|
3001
|
-
more.resetToOne()
|
2945
|
+
await more.resetToOne()
|
3002
2946
|
this.config.eqClasses = this._eqClasses
|
3003
2947
|
// greg
|
3004
2948
|
// setup instances
|
@@ -3013,8 +2957,8 @@ class Config {
|
|
3013
2957
|
}
|
3014
2958
|
}
|
3015
2959
|
this.instances = noDups
|
3016
|
-
}
|
3017
|
-
this.rebuild()
|
2960
|
+
}
|
2961
|
+
await this.rebuild() // in add(
|
3018
2962
|
this.valid()
|
3019
2963
|
return this
|
3020
2964
|
}
|
@@ -3170,7 +3114,7 @@ class Config {
|
|
3170
3114
|
// assumes this is called in reverse order
|
3171
3115
|
addInternalR (more, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false) {
|
3172
3116
|
if (more instanceof Config) {
|
3173
|
-
more.
|
3117
|
+
more.initialize23({ force: false })
|
3174
3118
|
if (useOldVersion) {
|
3175
3119
|
more = more.config
|
3176
3120
|
} else {
|