theprogrammablemind_4wp 7.5.8-beta.73 → 7.5.8-beta.76
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +72 -56
- package/package.json +1 -1
- package/src/config.js +33 -28
- package/src/helpers.js +11 -0
- package/src/project.js +28 -6
package/client.js
CHANGED
@@ -10,12 +10,12 @@ const _ = require('lodash')
|
|
10
10
|
const stringify = require('json-stable-stringify')
|
11
11
|
const Lines = require('./lines')
|
12
12
|
const flattens = require('./src/flatten')
|
13
|
-
const { appendNoDups, InitCalls, updateQueries } = require('./src/helpers')
|
13
|
+
const { appendNoDups, InitCalls, updateQueries, safeNoDups } = require('./src/helpers')
|
14
14
|
const runtime = require('./runtime')
|
15
15
|
const sortJson = runtime.sortJson
|
16
16
|
|
17
|
-
const
|
18
|
-
return (testConfig.checks && testConfig.checks.objects) ||
|
17
|
+
const getConfig_getObjectsCheck = (testConfig) => {
|
18
|
+
return (testConfig.checks && testConfig.checks.objects) || []
|
19
19
|
}
|
20
20
|
|
21
21
|
const getConfig_getContextCheck = (testConfig) => {
|
@@ -26,6 +26,10 @@ const pickContext = (testConfig) => (context) => {
|
|
26
26
|
return project(context, getConfig_getContextCheck(testConfig))
|
27
27
|
}
|
28
28
|
|
29
|
+
const pickObjects = (testConfig, objects) => {
|
30
|
+
return project(objects, getConfig_getObjectsCheck(testConfig))
|
31
|
+
}
|
32
|
+
|
29
33
|
const getAsk = (config) => (uuid) => (asks) => {
|
30
34
|
for (let ask of asks) {
|
31
35
|
config.addSemantic({
|
@@ -64,6 +68,12 @@ const getAsk = (config) => (uuid) => (asks) => {
|
|
64
68
|
})
|
65
69
|
}
|
66
70
|
|
71
|
+
const sameJSON = (json1, json2) => {
|
72
|
+
const sjson1 = sortJson(json1, { depth: 25 })
|
73
|
+
const sjson2 = sortJson(json2, { depth: 25 })
|
74
|
+
return JSON.stringify(sjson1) == JSON.stringify(sjson2)
|
75
|
+
}
|
76
|
+
|
67
77
|
const vimdiff = (actualJSON, expectedJSON) => {
|
68
78
|
const path = '.'
|
69
79
|
const actual = sortJson(actualJSON, { depth: 25 })
|
@@ -424,7 +434,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
424
434
|
if (isInstance) {
|
425
435
|
console.log('error', e.error)
|
426
436
|
}
|
427
|
-
contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
|
437
|
+
contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason, error: e.stack })
|
428
438
|
}
|
429
439
|
}
|
430
440
|
if (contextPrime.controlRemove) {
|
@@ -570,10 +580,22 @@ const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
|
|
570
580
|
}
|
571
581
|
}
|
572
582
|
|
573
|
-
// instance template
|
583
|
+
// instance template loadTemplate
|
574
584
|
const loadInstance = (config, instance) => {
|
575
585
|
const transitoryMode = global.transitoryMode
|
576
586
|
global.transitoryMode = false
|
587
|
+
|
588
|
+
if (instance && (instance.associations || instance.learned_contextual_priorities)) {
|
589
|
+
if (!config.config.retrain) {
|
590
|
+
if (instance.associations) {
|
591
|
+
config.addAssociations(instance.associations)
|
592
|
+
}
|
593
|
+
if (instance.learned_contextual_priorities && instance.learned_contextual_priorities.length > 0) {
|
594
|
+
config.addContextualPriorities(instance.learned_contextual_priorities)
|
595
|
+
}
|
596
|
+
}
|
597
|
+
}
|
598
|
+
|
577
599
|
const { /* data, generators, semantics, */ hierarchy } = setupProcessB({ config })
|
578
600
|
// for (const results of (instance.resultss || [])) {
|
579
601
|
for (const i in (instance.resultss || [])) {
|
@@ -583,7 +605,13 @@ const loadInstance = (config, instance) => {
|
|
583
605
|
// config.addInternal(config.template.queries[i], { handleCalculatedProps: true } )
|
584
606
|
config.addInternal(instance.template.queries[i], { addFirst: true, handleCalculatedProps: true } )
|
585
607
|
} else {
|
608
|
+
if (results.skipSemantics) {
|
609
|
+
config.config.skipSemantics = results.skipSemantics
|
610
|
+
}
|
586
611
|
processContextsB({ config, hierarchy, json: results/*, generators, semantics */, commandLineArgs: {}, isInstance: `instance${i}`, instance: instance.queries[i] })
|
612
|
+
if (results.skipSemantics) {
|
613
|
+
config.config.skipSemantics = null
|
614
|
+
}
|
587
615
|
}
|
588
616
|
}
|
589
617
|
global.transitoryMode = transitoryMode
|
@@ -670,6 +698,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
|
|
670
698
|
const { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime } =
|
671
699
|
processContextsB({ isTest, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
|
672
700
|
response.associations = json.associations
|
701
|
+
response.learned_contextual_priorities = json.learned_contextual_priorities
|
673
702
|
response.hierarchy = json.hierarchy
|
674
703
|
response.load_cache_time += json.load_cache_time
|
675
704
|
appendNoDups(response.logs, json.logs)
|
@@ -797,33 +826,13 @@ const runTest = async (config, expected, { args, verbose, testConfig, debug }) =
|
|
797
826
|
const pickedExpectedContexts = expected.contexts.map(pickContext(testConfig))
|
798
827
|
const failedCheckedContexts = !matching(pickedResultContexts, pickedExpectedContexts)
|
799
828
|
|
800
|
-
const pickEm = (getObjects) => {
|
801
|
-
const picked = {}
|
802
|
-
for (let prop of getConfig_getObjectCheck(testConfig)) {
|
803
|
-
if (prop.km) {
|
804
|
-
c = config.getConfig(prop.km)
|
805
|
-
o = getObjects(prop.km)
|
806
|
-
picked[prop.km] = {}
|
807
|
-
for (let p of getConfig_getObjectCheck(c.testConfig)) {
|
808
|
-
if (p.km) {
|
809
|
-
continue
|
810
|
-
}
|
811
|
-
picked[p] = o[p]
|
812
|
-
}
|
813
|
-
} else {
|
814
|
-
picked[prop] = getObjects(testConfigName)[prop]
|
815
|
-
}
|
816
|
-
}
|
817
|
-
return picked
|
818
|
-
}
|
819
829
|
const expectedGetObjects = (name) => {
|
820
830
|
if (!name) {
|
821
831
|
name = config.name
|
822
832
|
}
|
823
833
|
return expected.objects.namespaced[expected.objects.nameToUUID[name]]
|
824
834
|
}
|
825
|
-
sortJson(
|
826
|
-
const expected_checked = sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
835
|
+
const expected_checked = sortJson(pickObjects(testConfig, objects), { depth: 25 })
|
827
836
|
const actualGetObjects = (name) => {
|
828
837
|
if (!name) {
|
829
838
|
name = config.name
|
@@ -831,7 +840,7 @@ const runTest = async (config, expected, { args, verbose, testConfig, debug }) =
|
|
831
840
|
const km = config.configs.find( (km) => km.name == name )
|
832
841
|
return config.config.objects.namespaced[km.uuid]
|
833
842
|
}
|
834
|
-
const actual_checked = sortJson(
|
843
|
+
const actual_checked = sortJson(pickObjects(testConfig, actualGetObjects(testConfigName)), { depth: 25 })
|
835
844
|
const failed_checked = !matching(actual_objects, expected_objects)
|
836
845
|
|
837
846
|
const failed_checks = !matching(actual_objects, expected_objects)
|
@@ -1155,7 +1164,8 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
|
|
1155
1164
|
console.log(` ${JSON.stringify(inputss)} reason: ${reason}`)
|
1156
1165
|
}
|
1157
1166
|
}
|
1158
|
-
const
|
1167
|
+
const objects = config.get('objects').namespaced[config.uuid]
|
1168
|
+
const picked = sortJson(pickObjects(config.testConfig, objects), { depth: 25 })
|
1159
1169
|
if (!_.isEmpty(picked)) {
|
1160
1170
|
console.log('--- Object showing only the checked values ---')
|
1161
1171
|
console.log(JSON.stringify(picked, null, 2))
|
@@ -1207,13 +1217,14 @@ const defaultProcess = ({ config, errorHandler }) => async (promise) => {
|
|
1207
1217
|
}
|
1208
1218
|
}
|
1209
1219
|
|
1210
|
-
//
|
1220
|
+
// builtTemplate saveInstance
|
1211
1221
|
const rebuildTemplate = async ({ config, target, template, errorHandler = defaultErrorHandler }) => {
|
1212
1222
|
const accumulators = {
|
1213
1223
|
resultss: [],
|
1214
1224
|
fragments: [],
|
1215
1225
|
semantics: [],
|
1216
1226
|
associations: [],
|
1227
|
+
learned_contextual_priorities: [],
|
1217
1228
|
}
|
1218
1229
|
const looper = async (queries) => {
|
1219
1230
|
if (queries.length === 0) {
|
@@ -1241,7 +1252,6 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1241
1252
|
}
|
1242
1253
|
}
|
1243
1254
|
}
|
1244
|
-
|
1245
1255
|
try {
|
1246
1256
|
const results = await _process(config, query.query, {initializer, rebuildingTemplate: true})
|
1247
1257
|
if (config.config.debug) {
|
@@ -1258,10 +1268,12 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1258
1268
|
global.transitoryMode = transitoryMode
|
1259
1269
|
config.config.skipSemantics = null
|
1260
1270
|
results.query = query.query
|
1271
|
+
results.skipSemantics = skipSemantics
|
1261
1272
|
results.development = query.development
|
1262
1273
|
results.key = { query: query.query, hierarchy }
|
1263
1274
|
accumulators[property].push(results)
|
1264
1275
|
accumulators.associations = accumulators.associations.concat(results.associations)
|
1276
|
+
accumulators.learned_contextual_priorities = accumulators.learned_contextual_priorities.concat(results.learned_contextual_priorities)
|
1265
1277
|
await looper(queries)
|
1266
1278
|
} catch(e) {
|
1267
1279
|
const error = { errors: [e], query: query.query };
|
@@ -1306,6 +1318,7 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1306
1318
|
delete result.version
|
1307
1319
|
result.hierarchy.sort()
|
1308
1320
|
stabilizeAssociations(result.associations)
|
1321
|
+
result.learned_contextual_priorities = safeNoDups(result.learned_contextual_priorities)
|
1309
1322
|
}
|
1310
1323
|
}
|
1311
1324
|
}
|
@@ -1326,14 +1339,14 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1326
1339
|
|
1327
1340
|
const toProperties = (queryStringOrProperties) => {
|
1328
1341
|
if (typeof queryStringOrProperties == 'string') {
|
1329
|
-
return { query: queryStringOrProperties}
|
1342
|
+
return { query: queryStringOrProperties }
|
1330
1343
|
} else {
|
1331
1344
|
return queryStringOrProperties
|
1332
1345
|
}
|
1333
1346
|
}
|
1334
1347
|
let todo = []
|
1335
|
-
todo = todo.concat((template.initializers || []).map((query) => { return { initializer: true, property: 'resultss', query, skipSemantics: false } }))
|
1336
|
-
todo = todo.concat((template.queries || []).map((query) => { return { property: 'resultss', query, skipSemantics: false } }))
|
1348
|
+
todo = todo.concat((template.initializers || []).map((query) => { return { initializer: true, property: 'resultss', query, skipSemantics: false || query.skipSemantics } }))
|
1349
|
+
todo = todo.concat((template.queries || []).map((query) => { return { property: 'resultss', query, skipSemantics: false || query.skipSemantics} }))
|
1337
1350
|
todo = todo.concat((template.fragments || []).map((query) => { return Object.assign({}, toProperties(query), { property: 'fragments', skipSemantics: false }) }))
|
1338
1351
|
todo = todo.concat((template.semantics || []).map((definition) => { return { property: 'semantics', query: `${definition.from}\n${definition.to}`, skipSemantics: true } }))
|
1339
1352
|
await looper(Object.assign([], todo))
|
@@ -1439,7 +1452,7 @@ const knowledgeModule = async ({
|
|
1439
1452
|
parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
|
1440
1453
|
parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
|
1441
1454
|
parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
|
1442
|
-
parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server. for example --print wb' })
|
1455
|
+
parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server x == contextual priorities. for example --print wb' })
|
1443
1456
|
parser.add_argument('-s', '--save', { action: 'store_true', help: 'When running with the --query flag this will save the current run to the test file. When running without the --query flag all tests will be run and resaved.' })
|
1444
1457
|
parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
|
1445
1458
|
parser.add_argument('-dl', '--debugLoops', { action: 'store_true', help: 'When running with the --debugLoops flag the logs calls to semantics and generators will be immediately written to the console '})
|
@@ -1552,26 +1565,6 @@ const knowledgeModule = async ({
|
|
1552
1565
|
|
1553
1566
|
config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
|
1554
1567
|
|
1555
|
-
if (template) {
|
1556
|
-
const needsRebuild = config.needsRebuild(template.template, template.instance, options)
|
1557
|
-
if (needsRebuild) {
|
1558
|
-
console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
|
1559
|
-
|
1560
|
-
}
|
1561
|
-
config.load(template.template, template.instance, { rebuild: needsRebuild })
|
1562
|
-
if (config.name == 'ui') {
|
1563
|
-
console.log('config.COUNTER', config.COUNTER)
|
1564
|
-
debugger
|
1565
|
-
}
|
1566
|
-
if (needsRebuild) {
|
1567
|
-
return
|
1568
|
-
}
|
1569
|
-
}
|
1570
|
-
|
1571
|
-
if (!args.save && !args.rebuildTemplate && !args.dontAddAssociations) {
|
1572
|
-
config.addAssociationsFromTests(config.tests);
|
1573
|
-
}
|
1574
|
-
|
1575
1568
|
let configPrinted = false
|
1576
1569
|
const printConfig = () => {
|
1577
1570
|
if (configPrinted) {
|
@@ -1636,6 +1629,11 @@ const knowledgeModule = async ({
|
|
1636
1629
|
console.log(JSON.stringify(priority))
|
1637
1630
|
}
|
1638
1631
|
}
|
1632
|
+
if (args.print.includes('x')) {
|
1633
|
+
for (let contextual_priority of config.config.contextual_priorities) {
|
1634
|
+
console.log(JSON.stringify(contextual_priority))
|
1635
|
+
}
|
1636
|
+
}
|
1639
1637
|
if (args.print.includes('h')) {
|
1640
1638
|
for (let edge of config.config.hierarchy) {
|
1641
1639
|
console.log(JSON.stringify(edge))
|
@@ -1663,6 +1661,24 @@ const knowledgeModule = async ({
|
|
1663
1661
|
}
|
1664
1662
|
}
|
1665
1663
|
|
1664
|
+
if (template) {
|
1665
|
+
const needsRebuild = config.needsRebuild(template.template, template.instance, options)
|
1666
|
+
if (needsRebuild) {
|
1667
|
+
console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
|
1668
|
+
options.rebuild = true
|
1669
|
+
config.config.rebuild = true
|
1670
|
+
}
|
1671
|
+
config.load(template.template, template.instance, { rebuild: needsRebuild })
|
1672
|
+
printConfig()
|
1673
|
+
if (needsRebuild) {
|
1674
|
+
return
|
1675
|
+
}
|
1676
|
+
}
|
1677
|
+
|
1678
|
+
if (!args.save && !args.rebuildTemplate && !args.dontAddAssociations) {
|
1679
|
+
config.addAssociationsFromTests(config.tests);
|
1680
|
+
}
|
1681
|
+
|
1666
1682
|
if (args.retrain) {
|
1667
1683
|
config.config.retrain = true
|
1668
1684
|
}
|
@@ -1718,7 +1734,7 @@ const knowledgeModule = async ({
|
|
1718
1734
|
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1719
1735
|
hasError = true
|
1720
1736
|
}
|
1721
|
-
if (
|
1737
|
+
if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
|
1722
1738
|
hasError = true
|
1723
1739
|
}
|
1724
1740
|
}
|
@@ -1784,7 +1800,7 @@ const knowledgeModule = async ({
|
|
1784
1800
|
newError = true
|
1785
1801
|
headerShown = true
|
1786
1802
|
}
|
1787
|
-
if (
|
1803
|
+
if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
|
1788
1804
|
if (!headerShown) {
|
1789
1805
|
console.log(' Failure')
|
1790
1806
|
}
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -23,11 +23,13 @@ const indent = (string, indent) => {
|
|
23
23
|
}
|
24
24
|
|
25
25
|
const config_toServer = (config) => {
|
26
|
+
/*
|
26
27
|
if (config.contextual_priorities) {
|
27
28
|
config.contextual_priorities = config.contextual_priorities.map((cp) => {
|
28
29
|
return [cp.context, cp.choose]
|
29
30
|
})
|
30
31
|
}
|
32
|
+
*/
|
31
33
|
}
|
32
34
|
|
33
35
|
const debugPriority = (priority) => {
|
@@ -48,7 +50,7 @@ const debugAssociation = (association) => {
|
|
48
50
|
|
49
51
|
const debugContextualPriority = (contextual_priority) => {
|
50
52
|
if (global.entodictonDebugContextualPriority) {
|
51
|
-
if (helpers.safeEquals(entodictonDebugContextualPriority,
|
53
|
+
if (helpers.safeEquals(entodictonDebugContextualPriority, contextual_priority)) {
|
52
54
|
debugger; // debug hierarchy hit
|
53
55
|
}
|
54
56
|
}
|
@@ -79,6 +81,9 @@ const debugOperator = (operator) => {
|
|
79
81
|
}
|
80
82
|
|
81
83
|
const debugConfigProps = (config) => {
|
84
|
+
if (!config) {
|
85
|
+
return
|
86
|
+
}
|
82
87
|
const checkProps = [
|
83
88
|
{ property: 'priorities', check: (v) => debugPriority(v) },
|
84
89
|
{ property: 'association', check: (v) => debugAssociation(v) },
|
@@ -149,20 +154,6 @@ const setupInitializerFNArgs = (config, args) => {
|
|
149
154
|
}
|
150
155
|
}
|
151
156
|
|
152
|
-
const contextual_priorities_toServer = (cp) => {
|
153
|
-
if (cp.context && cp.choose) {
|
154
|
-
return [cp.context, cp.choose]
|
155
|
-
}
|
156
|
-
return cp
|
157
|
-
}
|
158
|
-
|
159
|
-
const contextual_priorities_toClient = (cp) => {
|
160
|
-
if (cp.context && cp.choose) {
|
161
|
-
return cp
|
162
|
-
}
|
163
|
-
return { context: cp[0], choose: cp[1] }
|
164
|
-
}
|
165
|
-
|
166
157
|
const operatorKey_valid = (key) => {
|
167
158
|
if (
|
168
159
|
!_.isArray(key) ||
|
@@ -254,7 +245,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
254
245
|
if (typeof after == 'string') {
|
255
246
|
after = [after, 0]
|
256
247
|
}
|
257
|
-
config.addPriorities([[bridge.id, bridge.level], after])
|
248
|
+
config.addPriorities({ "context": [[bridge.id, bridge.level], after], "choose": [0] })
|
258
249
|
}
|
259
250
|
}
|
260
251
|
if (bridge.after) {
|
@@ -262,7 +253,7 @@ const handleBridgeProps = (config, bridge, addFirst) => {
|
|
262
253
|
if (typeof before == 'string') {
|
263
254
|
before = [before, 0]
|
264
255
|
}
|
265
|
-
config.addPriorities([before, [bridge.id, bridge.level]])
|
256
|
+
config.addPriorities({ "context": [before, [bridge.id, bridge.level]], "choose": [0] })
|
266
257
|
}
|
267
258
|
}
|
268
259
|
if (bridge.words) {
|
@@ -407,6 +398,7 @@ if (runtime.process.env.DEBUG_BRIDGE) {
|
|
407
398
|
global.entodictonDebugBridge = runtime.process.env.DEBUG_BRIDGE.split('/')
|
408
399
|
if (global.entodictonDebugBridge.length !== 2) {
|
409
400
|
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
|
401
|
+
process.exit(-1)
|
410
402
|
}
|
411
403
|
global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
|
412
404
|
}
|
@@ -762,6 +754,7 @@ class Config {
|
|
762
754
|
addArgs: (...args) => this.addArgs(...args),
|
763
755
|
getBridge: (...args) => this.getBridge(...args),
|
764
756
|
fragment: (...args) => this.fragment(...args),
|
757
|
+
exists: (...args) => this.exists(...args),
|
765
758
|
addAPI: (...args) => this.addAPI(...args),
|
766
759
|
}
|
767
760
|
}
|
@@ -1060,9 +1053,16 @@ class Config {
|
|
1060
1053
|
this.validifyTemplate(template)
|
1061
1054
|
instance.template = template
|
1062
1055
|
this.logs.push(`loading template for ${this.name}`)
|
1063
|
-
|
1064
|
-
|
1056
|
+
/*
|
1057
|
+
if (instance && (instance.associations || instance.learned_contextual_priorities) && !options.rebuild) {
|
1058
|
+
if (instance.associations) {
|
1059
|
+
this.addAssociations(instance.associations)
|
1060
|
+
}
|
1061
|
+
if (instance.learned_contextual_priorities && instance.learned_contextual_priorities.length > 0) {
|
1062
|
+
this.addContextualPriorities(instance.learned_contextual_priorities)
|
1063
|
+
}
|
1065
1064
|
}
|
1065
|
+
*/
|
1066
1066
|
if (options.rebuild) {
|
1067
1067
|
// TODO fix beforeQuery
|
1068
1068
|
template = { fragments: [], queries: [], ...template }
|
@@ -1105,13 +1105,18 @@ class Config {
|
|
1105
1105
|
}
|
1106
1106
|
}
|
1107
1107
|
|
1108
|
-
|
1109
1108
|
addAssociations (associations) {
|
1110
1109
|
for (let association of associations) {
|
1111
1110
|
this.addAssociation(association)
|
1112
1111
|
}
|
1113
1112
|
}
|
1114
1113
|
|
1114
|
+
addContextualPriorities (cps) {
|
1115
|
+
for (let cp of cps) {
|
1116
|
+
this.addContextualPriority(cp)
|
1117
|
+
}
|
1118
|
+
}
|
1119
|
+
|
1115
1120
|
debugConfig() {
|
1116
1121
|
}
|
1117
1122
|
|
@@ -1146,8 +1151,7 @@ class Config {
|
|
1146
1151
|
debugContextualPriority(contextual_priority)
|
1147
1152
|
contextual_priority_valid(contextual_priority)
|
1148
1153
|
this.config.contextual_priorities.push(contextual_priority)
|
1149
|
-
|
1150
|
-
this._delta.json.contextual_priorities.push({ action: 'add', contextual_priority: cpServer })
|
1154
|
+
this._delta.json.contextual_priorities.push({ action: 'add', contextual_priority: contextual_priority })
|
1151
1155
|
}
|
1152
1156
|
|
1153
1157
|
addHierarchy (child, parent) {
|
@@ -1212,7 +1216,8 @@ class Config {
|
|
1212
1216
|
|
1213
1217
|
debugBridge(bridge)
|
1214
1218
|
if (bridge.allowDups) {
|
1215
|
-
if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1219
|
+
// if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level && b.bridge == bridge.bridge )) {
|
1220
|
+
if (bridges.find( (b) => b.id == bridge.id && b.level == bridge.level)) {
|
1216
1221
|
return;
|
1217
1222
|
}
|
1218
1223
|
}
|
@@ -1641,6 +1646,7 @@ class Config {
|
|
1641
1646
|
}
|
1642
1647
|
this.get('objects').namespaced[this._uuid] = {}
|
1643
1648
|
this.valid()
|
1649
|
+
debugConfigProps(this.config)
|
1644
1650
|
}
|
1645
1651
|
|
1646
1652
|
addArgs(moreArgs) {
|
@@ -2535,9 +2541,7 @@ class Config {
|
|
2535
2541
|
if (config.priorities) {
|
2536
2542
|
let priorities = config.priorities
|
2537
2543
|
priorities = priorities.map((p) => {
|
2538
|
-
return p.map((id) =>
|
2539
|
-
return [toNS(id[0]), id[1]]
|
2540
|
-
})
|
2544
|
+
return { ...p, context: p.context.map( (id) => [toNS(id[0]), id[1]] )}
|
2541
2545
|
})
|
2542
2546
|
config.priorities = priorities
|
2543
2547
|
}
|
@@ -2545,12 +2549,13 @@ class Config {
|
|
2545
2549
|
if (config.contextual_priorities) {
|
2546
2550
|
let contextual_priorities = config.contextual_priorities
|
2547
2551
|
contextual_priorities = contextual_priorities.map((cp) => {
|
2548
|
-
const { context, choose } = cp
|
2552
|
+
const { context, choose, ordered } = cp
|
2549
2553
|
return {
|
2550
2554
|
context: context.map((id) => {
|
2551
2555
|
return [toNS(id[0]), id[1]]
|
2552
2556
|
}),
|
2553
|
-
choose
|
2557
|
+
choose,
|
2558
|
+
ordered
|
2554
2559
|
}
|
2555
2560
|
})
|
2556
2561
|
config.contextual_priorities = contextual_priorities
|
package/src/helpers.js
CHANGED
@@ -43,6 +43,16 @@ const appendNoDups = (l1, l2) => {
|
|
43
43
|
}
|
44
44
|
}
|
45
45
|
|
46
|
+
const safeNoDups = (list) => {
|
47
|
+
noDups = []
|
48
|
+
for (const element of list) {
|
49
|
+
if (!noDups.find((e) => safeEquals(e, element))) {
|
50
|
+
noDups.push(element)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
return noDups
|
54
|
+
}
|
55
|
+
|
46
56
|
const safeEquals = (v1, v2) => {
|
47
57
|
if (typeof v1 !== typeof v2) {
|
48
58
|
return false
|
@@ -331,6 +341,7 @@ module.exports = {
|
|
331
341
|
mapInPlace,
|
332
342
|
validProps,
|
333
343
|
args,
|
344
|
+
safeNoDups,
|
334
345
|
safeEquals,
|
335
346
|
appendNoDups,
|
336
347
|
hashIndexesGet,
|
package/src/project.js
CHANGED
@@ -5,6 +5,12 @@ const project = (object, filter) => {
|
|
5
5
|
}
|
6
6
|
|
7
7
|
let projection = {}
|
8
|
+
const set = (property, value) => {
|
9
|
+
if (value === null || value === undefined) {
|
10
|
+
return
|
11
|
+
}
|
12
|
+
projection[property] = value
|
13
|
+
}
|
8
14
|
if (Array.isArray(filter)) {
|
9
15
|
if (Array.isArray(object)) {
|
10
16
|
return object.map( element => project(element, filter) )
|
@@ -15,7 +21,7 @@ const project = (object, filter) => {
|
|
15
21
|
for (const propertyList in properties.propertyLists) {
|
16
22
|
if (object[propertyList]) {
|
17
23
|
for (const property of object[propertyList]) {
|
18
|
-
|
24
|
+
set(property, project(object[property], properties.propertyLists[propertyList]))
|
19
25
|
}
|
20
26
|
}
|
21
27
|
}
|
@@ -24,16 +30,32 @@ const project = (object, filter) => {
|
|
24
30
|
for (const listProperty in properties.valueLists) {
|
25
31
|
const old = object[listProperty]
|
26
32
|
if (Array.isArray(old)) {
|
27
|
-
|
33
|
+
set(listProperty, old.map((element) => project(element, properties.valueLists[listProperty])))
|
28
34
|
} else {
|
29
|
-
|
35
|
+
set(listProperty, project(old, properties.valueLists[listProperty]))
|
30
36
|
}
|
31
37
|
}
|
32
38
|
}
|
33
39
|
if (properties.properties) {
|
34
40
|
for (const property in properties.properties) {
|
35
41
|
const old = object[property]
|
36
|
-
|
42
|
+
set(property, project(old, properties.properties[property]))
|
43
|
+
}
|
44
|
+
}
|
45
|
+
if (properties.property) {
|
46
|
+
const property = properties.property
|
47
|
+
if (properties.isPropertyList) {
|
48
|
+
debugger
|
49
|
+
if (!Array.isArray(object[property])) {
|
50
|
+
return projection
|
51
|
+
}
|
52
|
+
for (const propertyRef of object[property]) {
|
53
|
+
const old = object[propertyRef]
|
54
|
+
set(propertyRef, project(old, properties.filter))
|
55
|
+
}
|
56
|
+
} else {
|
57
|
+
const old = object[property]
|
58
|
+
set(property, project(old, properties.filter))
|
37
59
|
}
|
38
60
|
}
|
39
61
|
} else {
|
@@ -41,14 +63,14 @@ const project = (object, filter) => {
|
|
41
63
|
properties = [properties]
|
42
64
|
}
|
43
65
|
for (const property of properties) {
|
44
|
-
|
66
|
+
set(property, object[property])
|
45
67
|
}
|
46
68
|
}
|
47
69
|
}
|
48
70
|
}
|
49
71
|
} else if (typeof filter == 'object') {
|
50
72
|
for (const property of Object.keys(filter)) {
|
51
|
-
|
73
|
+
set(property, project(object[property], filter[property]))
|
52
74
|
}
|
53
75
|
}
|
54
76
|
return projection
|