theprogrammablemind_4wp 7.5.4-beta.0 → 7.5.4-beta.10
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 +31 -12
- package/package.json +5 -4
- package/src/config.js +182 -123
- package/src/generators.js +4 -2
- package/src/helpers.js +74 -2
- package/src/semantics.js +4 -2
    
        package/client.js
    CHANGED
    
    | @@ -8,7 +8,7 @@ const _ = require('lodash') | |
| 8 8 | 
             
            const stringify = require('json-stable-stringify')
         | 
| 9 9 | 
             
            const Lines = require('./lines')
         | 
| 10 10 | 
             
            const flattens = require('./src/flatten')
         | 
| 11 | 
            -
            const { appendNoDups, InitCalls } = require('./src/helpers')
         | 
| 11 | 
            +
            const { appendNoDups, InitCalls, updateQueries } = require('./src/helpers')
         | 
| 12 12 | 
             
            const runtime = require('./runtime')
         | 
| 13 13 | 
             
            const sortJson = runtime.sortJson
         | 
| 14 14 |  | 
| @@ -478,7 +478,7 @@ const doWithRetries = async (n, url, queryParams, data) => { | |
| 478 478 | 
             
              }
         | 
| 479 479 | 
             
            }
         | 
| 480 480 |  | 
| 481 | 
            -
            const setupProcessB = ({ config, allowDelta=false } = {}) => {
         | 
| 481 | 
            +
            const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
         | 
| 482 482 | 
             
              const key = config._key
         | 
| 483 483 |  | 
| 484 484 | 
             
              const data = Object.assign({ key, version: '3' }, { uuid: config._uuid })
         | 
| @@ -515,10 +515,13 @@ const processInstance = (config, instance) => { | |
| 515 515 | 
             
              const transitoryMode = global.transitoryMode
         | 
| 516 516 | 
             
              global.transitoryMode = false
         | 
| 517 517 | 
             
              const { /* data, generators, semantics, */ hierarchy } = setupProcessB({ config })
         | 
| 518 | 
            -
              for (const results of (instance.resultss || [])) {
         | 
| 518 | 
            +
              // for (const results of (instance.resultss || [])) {
         | 
| 519 | 
            +
              for (const i in (instance.resultss || [])) {
         | 
| 520 | 
            +
                const results = instance.resultss[i]
         | 
| 519 521 | 
             
                if (results.extraConfig) {
         | 
| 520 522 | 
             
                  // config.addInternal(results, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false)
         | 
| 521 | 
            -
                  config.addInternal( | 
| 523 | 
            +
                  // config.addInternal(config.template.queries[i], { handleCalculatedProps: true } )
         | 
| 524 | 
            +
                  config.addInternal(instance.template.queries[i], { handleCalculatedProps: true } )
         | 
| 522 525 | 
             
                } else {
         | 
| 523 526 | 
             
                  processContextsB({ config, hierarchy, json: results/*, generators, semantics */ })
         | 
| 524 527 | 
             
                }
         | 
| @@ -526,7 +529,7 @@ const processInstance = (config, instance) => { | |
| 526 529 | 
             
              global.transitoryMode = transitoryMode
         | 
| 527 530 | 
             
            }
         | 
| 528 531 |  | 
| 529 | 
            -
            const _process = async (config, query, { commandLineArgs, credentials, writeTests, isTest, saveDeveloper, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
         | 
| 532 | 
            +
            const _process = async (config, query, { initializer, commandLineArgs, credentials, writeTests, isTest, saveDeveloper, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
         | 
| 530 533 | 
             
              if (credentials) {
         | 
| 531 534 | 
             
                config.server(credentials.server, credentials.key)
         | 
| 532 535 | 
             
              }
         | 
| @@ -546,7 +549,7 @@ const _process = async (config, query, { commandLineArgs, credentials, writeTest | |
| 546 549 | 
             
                throw error
         | 
| 547 550 | 
             
              }
         | 
| 548 551 |  | 
| 549 | 
            -
              let { data, /* generators, semantics, */ hierarchy } = setupProcessB({ config, allowDelta: true })
         | 
| 552 | 
            +
              let { data, /* generators, semantics, */ hierarchy } = setupProcessB({ config, initializer, allowDelta: true })
         | 
| 550 553 | 
             
              if (commandLineArgs && commandLineArgs.checkForLoop) {
         | 
| 551 554 | 
             
                data.checkForLoop = true
         | 
| 552 555 | 
             
              }
         | 
| @@ -1057,7 +1060,7 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand | |
| 1057 1060 | 
             
                  finish()
         | 
| 1058 1061 | 
             
                  return
         | 
| 1059 1062 | 
             
                }
         | 
| 1060 | 
            -
                const { property, hierarchy, query: queryOrExtraConfig, skipSemantics } = queries.shift()
         | 
| 1063 | 
            +
                const { property, hierarchy, query: queryOrExtraConfig, initializer, skipSemantics } = queries.shift()
         | 
| 1061 1064 | 
             
                // queries are strings or { query: "blah", development: true/false }
         | 
| 1062 1065 | 
             
                if (typeof queryOrExtraConfig === 'string' || queryOrExtraConfig.query) {
         | 
| 1063 1066 | 
             
                  let query = queryOrExtraConfig;
         | 
| @@ -1082,7 +1085,7 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand | |
| 1082 1085 | 
             
                  }
         | 
| 1083 1086 |  | 
| 1084 1087 | 
             
                  try {
         | 
| 1085 | 
            -
                    const results = await _process(config, query.query, {})
         | 
| 1088 | 
            +
                    const results = await _process(config, query.query, {initializer})
         | 
| 1086 1089 | 
             
                    if (config.config.debug) {
         | 
| 1087 1090 | 
             
                      // TODO pass in the error handler like the other ones
         | 
| 1088 1091 | 
             
                      defaultInnerProcess(config, defaultErrorHandler, results)
         | 
| @@ -1143,7 +1146,7 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand | |
| 1143 1146 | 
             
                  return template
         | 
| 1144 1147 | 
             
                };
         | 
| 1145 1148 | 
             
                stabilizeOutput(accumulators)
         | 
| 1146 | 
            -
                runtime.fs.writeFileSync(instanceName, JSON.stringify(Object.assign({ queries: template.queries }, accumulators), 0, 2))
         | 
| 1149 | 
            +
                runtime.fs.writeFileSync(instanceName, JSON.stringify(Object.assign({ queries: template.queries.map(updateQueries) }, accumulators), 0, 2))
         | 
| 1147 1150 |  | 
| 1148 1151 | 
             
                // km tests file
         | 
| 1149 1152 | 
             
                const testsName = `./${target}.test.json`
         | 
| @@ -1160,7 +1163,9 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand | |
| 1160 1163 | 
             
                  return queryStringOrProperties
         | 
| 1161 1164 | 
             
                }
         | 
| 1162 1165 | 
             
              }
         | 
| 1163 | 
            -
              let todo =  | 
| 1166 | 
            +
              let todo = []
         | 
| 1167 | 
            +
              todo = todo.concat((template.initializers || []).map((query) => { return { initializer: true, property: 'resultss', query, skipSemantics: false } }))
         | 
| 1168 | 
            +
              todo = todo.concat((template.queries || []).map((query) => { return { property: 'resultss', query, skipSemantics: false } }))
         | 
| 1164 1169 | 
             
              todo = todo.concat((template.fragments || []).map((query) => { return Object.assign({}, toProperties(query), { property: 'fragments', skipSemantics: false }) }))
         | 
| 1165 1170 | 
             
              todo = todo.concat((template.semantics || []).map((definition) => { return { property: 'semantics', query: `${definition.from}\n${definition.to}`, skipSemantics: true } }))
         | 
| 1166 1171 | 
             
              await looper(Object.assign([], todo))
         | 
| @@ -1265,7 +1270,6 @@ const knowledgeModule = async ({ | |
| 1265 1270 | 
             
                  config.load(template.template, template.instance)
         | 
| 1266 1271 | 
             
                }
         | 
| 1267 1272 | 
             
              }
         | 
| 1268 | 
            -
             | 
| 1269 1273 | 
             
              if (isProcess) {
         | 
| 1270 1274 | 
             
                // setup();
         | 
| 1271 1275 | 
             
                const parser = new runtime.ArgumentParser({
         | 
| @@ -1299,6 +1303,7 @@ const knowledgeModule = async ({ | |
| 1299 1303 | 
             
                parser.add_argument('-da', '--debugAssociation', { help: 'When running with the --debugAssociation flag the debugging will break when the specified association is added to the config' })
         | 
| 1300 1304 | 
             
                parser.add_argument('-dh', '--debugHierarchy', { help: 'When running with the --debugHierarchy flag the debugging will break when the specified child-parent pair is added to the config for the main config. Set DEBUG_HIERARCHY to debug any config loaded. For example DEBUG_HIERARCHY=\'["cat", "mammel"]\'' })
         | 
| 1301 1305 | 
             
                parser.add_argument('-db', '--debugBridge', { help: 'When running with the --debugBridge flag the debugging will break when the specified bridge is added to the config for the main config. Set DEBUG_BRIDGE to debug any config loaded. For example DEBUG_BRIDGE=\'id/level\'' })
         | 
| 1306 | 
            +
                parser.add_argument('-do', '--debugOperator', { help: 'When running with the --debugOperator flag the debugging will break when the specified operator is added to the config for the main config. Set DEBUG_OPERATOR to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\'' })
         | 
| 1302 1307 |  | 
| 1303 1308 | 
             
                const args = parser.parse_args()
         | 
| 1304 1309 | 
             
                args.count = args.count || 1
         | 
| @@ -1316,6 +1321,10 @@ const knowledgeModule = async ({ | |
| 1316 1321 | 
             
                    console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
         | 
| 1317 1322 | 
             
                  }
         | 
| 1318 1323 | 
             
                }
         | 
| 1324 | 
            +
                if (args.debugOperator) {
         | 
| 1325 | 
            +
                    // id/level
         | 
| 1326 | 
            +
                  global.entodictonDebugOperator = args.debugOperator
         | 
| 1327 | 
            +
                }
         | 
| 1319 1328 |  | 
| 1320 1329 | 
             
                if (args.clean) {
         | 
| 1321 1330 | 
             
                  const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
         | 
| @@ -1450,6 +1459,9 @@ const knowledgeModule = async ({ | |
| 1450 1459 | 
             
                    for (const semantic of easyToRead) {
         | 
| 1451 1460 | 
             
                      semantic.match = semantic.match.toString()
         | 
| 1452 1461 | 
             
                      semantic.apply = semantic.apply.toString()
         | 
| 1462 | 
            +
                      if (semantic.applyWrapped) {
         | 
| 1463 | 
            +
                        semantic.applyWrapped = semantic.applyWrapped.toString()
         | 
| 1464 | 
            +
                      }
         | 
| 1453 1465 | 
             
                    }
         | 
| 1454 1466 | 
             
                    console.dir(easyToRead)
         | 
| 1455 1467 | 
             
                  }
         | 
| @@ -1656,7 +1668,14 @@ function where(goUp = 2) { | |
| 1656 1668 | 
             
              const e = new Error();
         | 
| 1657 1669 | 
             
              const regexForm1 = /\((.*):(\d+):(\d+)\)$/
         | 
| 1658 1670 | 
             
              const regexForm2 = /at (.*):(\d+):(\d+)$/
         | 
| 1659 | 
            -
              const  | 
| 1671 | 
            +
              const lines = e.stack.split("\n")
         | 
| 1672 | 
            +
              let line
         | 
| 1673 | 
            +
              for (line of lines.slice(1)) {
         | 
| 1674 | 
            +
                if (!(line.includes("config.js:") || line.includes("client.js:"))) {
         | 
| 1675 | 
            +
                  break;
         | 
| 1676 | 
            +
                }
         | 
| 1677 | 
            +
              }
         | 
| 1678 | 
            +
              // const line = e.stack.split("\n")[goUp];
         | 
| 1660 1679 | 
             
              const match = regexForm1.exec(line) || regexForm2.exec(line);
         | 
| 1661 1680 | 
             
              if (match) {
         | 
| 1662 1681 | 
             
                return `${match[1]}:${match[2]}`
         | 
    
        package/package.json
    CHANGED
    
    | @@ -10,12 +10,13 @@ | |
| 10 10 | 
             
                "eslint": "^7.31.0"
         | 
| 11 11 | 
             
              },
         | 
| 12 12 | 
             
              "scripts": {
         | 
| 13 | 
            -
                "to:debug": "node inspect node_modules/.bin/jest --runInBand -t  | 
| 13 | 
            +
                "to:debug": "node inspect node_modules/.bin/jest --runInBand -t NEO23",
         | 
| 14 14 | 
             
                "test:debug": "node inspect node_modules/.bin/jest --runInBand --config ./jest.config.json",
         | 
| 15 | 
            -
                "tod": "node inspect node_modules/.bin/jest --runInBand -t  | 
| 15 | 
            +
                "tod": "node inspect node_modules/.bin/jest --runInBand -t NEO23",
         | 
| 16 16 | 
             
                "lint:fix": "eslint \"**/*.js\" --fix",
         | 
| 17 17 | 
             
                "lint": "eslint \"**/*.js\"",
         | 
| 18 | 
            -
                "to": "node node_modules/.bin/jest --runInBand -t  | 
| 18 | 
            +
                "to": "node node_modules/.bin/jest --runInBand -t NEO23",
         | 
| 19 | 
            +
                "tos": "node node_modules/.bin/jest --runInBand -t NEOS23",
         | 
| 19 20 | 
             
                "test": "jest --config ./jest.config.json",
         | 
| 20 21 | 
             
                "test:watch": "npm run test -- --watch"
         | 
| 21 22 | 
             
              },
         | 
| @@ -61,6 +62,6 @@ | |
| 61 62 | 
             
                "json-stable-stringify": "^1.0.1",
         | 
| 62 63 | 
             
                "node-fetch": "^2.6.1"
         | 
| 63 64 | 
             
              },
         | 
| 64 | 
            -
              "version": "7.5.4-beta. | 
| 65 | 
            +
              "version": "7.5.4-beta.10",
         | 
| 65 66 | 
             
              "license": "ISC"
         | 
| 66 67 | 
             
            }
         | 
    
        package/src/config.js
    CHANGED
    
    | @@ -5,7 +5,6 @@ const { Generators } = require('./generators') | |
| 5 5 | 
             
            const client = require('../client')
         | 
| 6 6 | 
             
            const Digraph = require('./digraph')
         | 
| 7 7 | 
             
            const helpers = require('./helpers')
         | 
| 8 | 
            -
            const deepEqual = require('deep-equal')
         | 
| 9 8 | 
             
            const runtime = require('../runtime')
         | 
| 10 9 | 
             
            const _ = require('lodash')
         | 
| 11 10 |  | 
| @@ -22,6 +21,114 @@ const indent = (string, indent) => { | |
| 22 21 | 
             
                return string.replace(/^/gm, ' '.repeat(indent));
         | 
| 23 22 | 
             
            }
         | 
| 24 23 |  | 
| 24 | 
            +
            const handleBridgeProps = (config, bridge) => {
         | 
| 25 | 
            +
              if (!bridge.bridge) {
         | 
| 26 | 
            +
                bridge.bridge = "{ ...next(operator) }"
         | 
| 27 | 
            +
              }
         | 
| 28 | 
            +
              if (!bridge.level) {
         | 
| 29 | 
            +
                bridge.level = 0
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
              if (bridge.children) {
         | 
| 32 | 
            +
                for (let child of bridge.children) {
         | 
| 33 | 
            +
                  config.addHierarchy(child, bridge.id)
         | 
| 34 | 
            +
                }
         | 
| 35 | 
            +
              }
         | 
| 36 | 
            +
              if (bridge.parents) {
         | 
| 37 | 
            +
                for (let parent of bridge.parents) {
         | 
| 38 | 
            +
                  config.addHierarchy(bridge.id, parent)
         | 
| 39 | 
            +
                }
         | 
| 40 | 
            +
              }
         | 
| 41 | 
            +
              if (bridge.isA) {
         | 
| 42 | 
            +
                for (let parent of bridge.isA) {
         | 
| 43 | 
            +
                  config.addHierarchy(bridge.id, parent)
         | 
| 44 | 
            +
                }
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
              if (bridge.before) {
         | 
| 47 | 
            +
                for (let after of bridge.before) {
         | 
| 48 | 
            +
                  if (typeof after == 'string') {
         | 
| 49 | 
            +
                    after = [after, 0]
         | 
| 50 | 
            +
                  }
         | 
| 51 | 
            +
                  config.addPriorities([after, [bridge.id, bridge.level]])
         | 
| 52 | 
            +
                }
         | 
| 53 | 
            +
              }
         | 
| 54 | 
            +
              if (bridge.words) {
         | 
| 55 | 
            +
                for (let def of bridge.words) {
         | 
| 56 | 
            +
                  if (typeof def == 'string') {
         | 
| 57 | 
            +
                    config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
         | 
| 58 | 
            +
                  } else {
         | 
| 59 | 
            +
                    const word = def.word
         | 
| 60 | 
            +
                    def = { initial: JSON.stringify(def), id: bridge.id, word: undefined }
         | 
| 61 | 
            +
                    config.addWordInternal(word, def)
         | 
| 62 | 
            +
                  }
         | 
| 63 | 
            +
                }
         | 
| 64 | 
            +
              }
         | 
| 65 | 
            +
              if (bridge.generator) {
         | 
| 66 | 
            +
                config.config.generators.unshift(bridge.generator)
         | 
| 67 | 
            +
              }
         | 
| 68 | 
            +
              if (bridge.generators) {
         | 
| 69 | 
            +
                const generators = [...bridge.generators]
         | 
| 70 | 
            +
                generators.reverse()
         | 
| 71 | 
            +
                for (let generator of generators) {
         | 
| 72 | 
            +
                  config.config.generators.unshift(generator)
         | 
| 73 | 
            +
                }
         | 
| 74 | 
            +
              }
         | 
| 75 | 
            +
              if (bridge.generatorp) {
         | 
| 76 | 
            +
                config.config.generators.unshift({ 
         | 
| 77 | 
            +
                  where: bridge.generatorp.where || bridge.where || client.where(4),
         | 
| 78 | 
            +
                  match: ({context}) => bridge.id == context.marker && context.paraphrase,
         | 
| 79 | 
            +
                  apply: (args) => bridge.generatorp(args),
         | 
| 80 | 
            +
                  applyWrapped: bridge.generatorp,
         | 
| 81 | 
            +
                  property: 'generatorp',
         | 
| 82 | 
            +
                })
         | 
| 83 | 
            +
              }
         | 
| 84 | 
            +
              if (bridge.generatorr) {
         | 
| 85 | 
            +
                config.config.generators.unshift({ 
         | 
| 86 | 
            +
                  // TODO merge response and isResponse
         | 
| 87 | 
            +
                  where: bridge.generatorr.where || bridge.where || client.where(3),
         | 
| 88 | 
            +
                  match: ({context}) => bridge.id == context.marker && !context.paraphrase && (context.response || context.isResponse),
         | 
| 89 | 
            +
                  apply: (args) => bridge.generatorr(args),
         | 
| 90 | 
            +
                  applyWrapped: bridge.generatorr,
         | 
| 91 | 
            +
                  property: 'generatorr',
         | 
| 92 | 
            +
                })
         | 
| 93 | 
            +
              }
         | 
| 94 | 
            +
              if (bridge.evaluator) {
         | 
| 95 | 
            +
                config.config.semantics.unshift({ 
         | 
| 96 | 
            +
                  where: bridge.evaluator.where || bridge.where || client.where(3),
         | 
| 97 | 
            +
                  match: ({context}) => bridge.id == context.marker && context.evaluate,
         | 
| 98 | 
            +
                  apply: (args) => bridge.evaluator(args),
         | 
| 99 | 
            +
                  applyWrapped: bridge.evaluator,
         | 
| 100 | 
            +
                  property: 'evaluator',
         | 
| 101 | 
            +
                })
         | 
| 102 | 
            +
              }
         | 
| 103 | 
            +
              if (bridge.semantic) {
         | 
| 104 | 
            +
                config.config.semantics.unshift({ 
         | 
| 105 | 
            +
                  where: bridge.semantic.where || bridge.where || client.where(3),
         | 
| 106 | 
            +
                  match: ({context}) => bridge.id == context.marker,
         | 
| 107 | 
            +
                  apply: (args) => bridge.semantic(args),
         | 
| 108 | 
            +
                  applyWrapped: bridge.semantic,
         | 
| 109 | 
            +
                  property: 'semantic',
         | 
| 110 | 
            +
                })
         | 
| 111 | 
            +
              }
         | 
| 112 | 
            +
            }
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            const handleCalculatedProps = (baseConfig, moreConfig) => {
         | 
| 115 | 
            +
              for (let bridge of moreConfig.bridges) {
         | 
| 116 | 
            +
                const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
         | 
| 117 | 
            +
                                'level', 'optional', 'selector', 'semantic',  'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
         | 
| 118 | 
            +
                helpers.validProps(valid, bridge, 'bridge')
         | 
| 119 | 
            +
                handleBridgeProps(baseConfig, bridge)
         | 
| 120 | 
            +
              }
         | 
| 121 | 
            +
              if (moreConfig.operators) {
         | 
| 122 | 
            +
                moreConfig.operators = moreConfig.operators.map((operator) => {
         | 
| 123 | 
            +
                  if (typeof operator === 'string') {
         | 
| 124 | 
            +
                    return { pattern: operator }
         | 
| 125 | 
            +
                  } else {
         | 
| 126 | 
            +
                    return operator
         | 
| 127 | 
            +
                  }
         | 
| 128 | 
            +
                })
         | 
| 129 | 
            +
              }
         | 
| 130 | 
            +
            }
         | 
| 131 | 
            +
             | 
| 25 132 | 
             
            if (runtime.process.env.DEBUG_HIERARCHY) {
         | 
| 26 133 | 
             
              global.entodictonDebugHierarchy = JSON.parse(runtime.process.env.DEBUG_HIERARCHY)
         | 
| 27 134 | 
             
            }
         | 
| @@ -35,6 +142,11 @@ if (runtime.process.env.DEBUG_BRIDGE) { | |
| 35 142 | 
             
              global.entodictonDebugBridge[1] = int(global.entodictonDebugBridge[1])
         | 
| 36 143 | 
             
            }
         | 
| 37 144 |  | 
| 145 | 
            +
            if (runtime.process.env.DEBUG_OPERATOR) {
         | 
| 146 | 
            +
              // id/level
         | 
| 147 | 
            +
              global.entodictonDebugOperator = runtime.process.env.DEBUG_OPERATOR
         | 
| 148 | 
            +
            }
         | 
| 149 | 
            +
             | 
| 38 150 | 
             
            const hierarchyCanonical = (element) => {
         | 
| 39 151 | 
             
                if (element.child && element.parent) {
         | 
| 40 152 | 
             
                  return element
         | 
| @@ -86,6 +198,17 @@ const normalizeConfig = (config) => { | |
| 86 198 | 
             
                      config[bag][i].km = config.name
         | 
| 87 199 | 
             
                    }
         | 
| 88 200 | 
             
                  }
         | 
| 201 | 
            +
                  
         | 
| 202 | 
            +
                }
         | 
| 203 | 
            +
                if (config['bridges']) {
         | 
| 204 | 
            +
                  for (let bridge of config['bridges']) {
         | 
| 205 | 
            +
                    if (!bridge.level) {
         | 
| 206 | 
            +
                      bridge.level = 0
         | 
| 207 | 
            +
                    }
         | 
| 208 | 
            +
                    if (!bridge.bridge) {
         | 
| 209 | 
            +
                      bridge.bridge = "{ ...next(operator) }"
         | 
| 210 | 
            +
                    }
         | 
| 211 | 
            +
                  }
         | 
| 89 212 | 
             
                }
         | 
| 90 213 | 
             
              }
         | 
| 91 214 | 
             
            }
         | 
| @@ -324,6 +447,37 @@ const multiApiImpl = (initializer) => { | |
| 324 447 |  | 
| 325 448 | 
             
            class Config {
         | 
| 326 449 |  | 
| 450 | 
            +
              inDevelopmentMode (call) {
         | 
| 451 | 
            +
                config.developmentModeOn += 1
         | 
| 452 | 
            +
                try {
         | 
| 453 | 
            +
                  call()
         | 
| 454 | 
            +
                } finally {
         | 
| 455 | 
            +
                  config.developmentModeOn -= 1
         | 
| 456 | 
            +
                }
         | 
| 457 | 
            +
              }
         | 
| 458 | 
            +
             | 
| 459 | 
            +
              // return the config with just the elements from the included KM's
         | 
| 460 | 
            +
              baseConfig() {
         | 
| 461 | 
            +
                const operators = this.config.operators.filter((operator) => {
         | 
| 462 | 
            +
                  return operator.uuid !== this.uuid
         | 
| 463 | 
            +
                })
         | 
| 464 | 
            +
                const bridges = this.config.bridges.filter((bridge) => {
         | 
| 465 | 
            +
                  return bridge.uuid !== this.uuid
         | 
| 466 | 
            +
                })
         | 
| 467 | 
            +
                const words = {}
         | 
| 468 | 
            +
                for (let word in this.config.words) {
         | 
| 469 | 
            +
                  const defs = this.config.words[word].filter( (def) => def.uuid !== this.uuid )
         | 
| 470 | 
            +
                  if (defs.length > 0) {
         | 
| 471 | 
            +
                    words[word] = defs
         | 
| 472 | 
            +
                  }
         | 
| 473 | 
            +
                }
         | 
| 474 | 
            +
                return {
         | 
| 475 | 
            +
                  operators,
         | 
| 476 | 
            +
                  bridges,
         | 
| 477 | 
            +
                  words
         | 
| 478 | 
            +
                }
         | 
| 479 | 
            +
              }
         | 
| 480 | 
            +
             | 
| 327 481 | 
             
              getCounter (maybeName = '') {
         | 
| 328 482 | 
             
                const counter = this.configCounter
         | 
| 329 483 | 
             
                this.configCounter += 1
         | 
| @@ -525,12 +679,13 @@ class Config { | |
| 525 679 | 
             
                }
         | 
| 526 680 | 
             
                const instanceFragments = (instance.fragments || []).map((fragment) => fragment.key || fragment.query).map( toCanonical )
         | 
| 527 681 | 
             
                const templateFragments = (template.fragments || []).concat(this.dynamicFragments).map( toCanonical )
         | 
| 528 | 
            -
                const sameFragments =  | 
| 529 | 
            -
                const sameQueries =  | 
| 682 | 
            +
                const sameFragments = helpers.safeEquals(templateFragments, instanceFragments)
         | 
| 683 | 
            +
                const sameQueries = helpers.safeEquals((template.queries || []).map(helpers.updateQueries), (instance.queries || []))
         | 
| 530 684 | 
             
                return !(instance && sameQueries && sameFragments)
         | 
| 531 685 | 
             
              }
         | 
| 532 686 |  | 
| 533 687 | 
             
              load (template, instance, options = { rebuild: false } ) {
         | 
| 688 | 
            +
                instance.template = template
         | 
| 534 689 | 
             
                this.logs.push(`loading template for ${this.name}`)
         | 
| 535 690 | 
             
                if (instance && instance.associations && !options.rebuild) {
         | 
| 536 691 | 
             
                  this.addAssociations(instance.associations)
         | 
| @@ -592,7 +747,7 @@ class Config { | |
| 592 747 | 
             
                  }
         | 
| 593 748 | 
             
                }
         | 
| 594 749 | 
             
                if (global.entodictonDebugAssociation) {
         | 
| 595 | 
            -
                  if ( | 
| 750 | 
            +
                  if (helpers.safeEquals(global.entodictonDebugAssociation, association)) {
         | 
| 596 751 | 
             
                    debugger; // debug association hit
         | 
| 597 752 | 
             
                  }
         | 
| 598 753 | 
             
                }
         | 
| @@ -627,7 +782,7 @@ class Config { | |
| 627 782 | 
             
                  throw `addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`
         | 
| 628 783 | 
             
                }
         | 
| 629 784 | 
             
                if (global.entodictonDebugHierarchy) {
         | 
| 630 | 
            -
                  if ( | 
| 785 | 
            +
                  if ((helpers.safeEquals.entodictonDebugHierarchy, [child, parent])) {
         | 
| 631 786 | 
             
                    debugger; // debug hierarchy hit
         | 
| 632 787 | 
             
                  }
         | 
| 633 788 | 
             
                }
         | 
| @@ -645,7 +800,7 @@ class Config { | |
| 645 800 | 
             
                }
         | 
| 646 801 |  | 
| 647 802 | 
             
                if (global.entodictonDebugHierarchy) {
         | 
| 648 | 
            -
                  if ( | 
| 803 | 
            +
                  if (helpers.safeEquals(global.entodictonDebugHierarchy, [child, parent])) {
         | 
| 649 804 | 
             
                    debugger; // debug hierarchy hit
         | 
| 650 805 | 
             
                  }
         | 
| 651 806 | 
             
                }
         | 
| @@ -689,6 +844,7 @@ class Config { | |
| 689 844 | 
             
                if (global.transitoryMode) {
         | 
| 690 845 | 
             
                  def.transitoryMode = true
         | 
| 691 846 | 
             
                }
         | 
| 847 | 
            +
                handleBridgeProps(this, def)
         | 
| 692 848 | 
             
                bridges.push(def)
         | 
| 693 849 | 
             
                this.checkBridges();
         | 
| 694 850 | 
             
                this._delta.json.bridges.push({ action: 'add', bridge: def })
         | 
| @@ -751,6 +907,7 @@ class Config { | |
| 751 907 | 
             
                if (!this.config.operators) {
         | 
| 752 908 | 
             
                  this.config.operators = []
         | 
| 753 909 | 
             
                }
         | 
| 910 | 
            +
             | 
| 754 911 | 
             
                const operators = this.config.operators
         | 
| 755 912 |  | 
| 756 913 | 
             
                let operator;
         | 
| @@ -760,6 +917,12 @@ class Config { | |
| 760 917 | 
             
                  operator = Object.assign({}, objectOrPattern, { uuid: this._uuid })
         | 
| 761 918 | 
             
                }
         | 
| 762 919 |  | 
| 920 | 
            +
                if (global.entodictonDebugOperator) {
         | 
| 921 | 
            +
                  if (operator.pattern === global.entodictonDebugOperator) {
         | 
| 922 | 
            +
                    debugger; // debug operator hit
         | 
| 923 | 
            +
                  }
         | 
| 924 | 
            +
                }
         | 
| 925 | 
            +
             | 
| 763 926 | 
             
                if (operator.allowDups) {
         | 
| 764 927 | 
             
                  if (operators.find( (o) => o.pattern == operator.pattern )) {
         | 
| 765 928 | 
             
                    return;
         | 
| @@ -1018,7 +1181,8 @@ class Config { | |
| 1018 1181 | 
             
                    'debug',
         | 
| 1019 1182 |  | 
| 1020 1183 | 
             
                    // TODO Fix these from the test app
         | 
| 1021 | 
            -
                    ' | 
| 1184 | 
            +
                    'implicits',
         | 
| 1185 | 
            +
                    'convolution',
         | 
| 1022 1186 | 
             
                    'expected_generated',
         | 
| 1023 1187 | 
             
                    'expected_results',
         | 
| 1024 1188 | 
             
                    'skipSemantics',
         | 
| @@ -1114,115 +1278,12 @@ class Config { | |
| 1114 1278 | 
             
                if (config) {
         | 
| 1115 1279 | 
             
                  config = _.cloneDeep(config)
         | 
| 1116 1280 | 
             
                  this.config = config
         | 
| 1117 | 
            -
                   | 
| 1118 | 
            -
                    const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
         | 
| 1119 | 
            -
                                    'level', 'optional', 'selector', 'semantic',  'words', /Bridge$/, 'localHierarchy' ]
         | 
| 1120 | 
            -
                    helpers.validProps(valid, bridge, 'bridge')
         | 
| 1121 | 
            -
                    /*
         | 
| 1122 | 
            -
                    if (bridge.generator) {
         | 
| 1123 | 
            -
                      this.config.generators.push({ 
         | 
| 1124 | 
            -
                        match: ({context}) => bridge.id == context.marker,
         | 
| 1125 | 
            -
                        apply: (args) => bridge.generator(args),
         | 
| 1126 | 
            -
                      })
         | 
| 1127 | 
            -
                    }
         | 
| 1128 | 
            -
                    */
         | 
| 1129 | 
            -
                    if (bridge.children) {
         | 
| 1130 | 
            -
                      for (let child of bridge.children) {
         | 
| 1131 | 
            -
                        this.addHierarchy(child, bridge.id)
         | 
| 1132 | 
            -
                      }
         | 
| 1133 | 
            -
                    }
         | 
| 1134 | 
            -
                    if (bridge.parents) {
         | 
| 1135 | 
            -
                      for (let parent of bridge.parents) {
         | 
| 1136 | 
            -
                        this.addHierarchy(bridge.id, parent)
         | 
| 1137 | 
            -
                      }
         | 
| 1138 | 
            -
                    }
         | 
| 1139 | 
            -
                    if (bridge.isA) {
         | 
| 1140 | 
            -
                      for (let parent of bridge.isA) {
         | 
| 1141 | 
            -
                        this.addHierarchy(bridge.id, parent)
         | 
| 1142 | 
            -
                      }
         | 
| 1143 | 
            -
                    }
         | 
| 1144 | 
            -
                    if (bridge.before) {
         | 
| 1145 | 
            -
                      for (let after of bridge.before) {
         | 
| 1146 | 
            -
                        if (typeof after == 'string') {
         | 
| 1147 | 
            -
                          after = [after, 0]
         | 
| 1148 | 
            -
                        }
         | 
| 1149 | 
            -
                        this.addPriorities([after, [bridge.id, bridge.level]])
         | 
| 1150 | 
            -
                      }
         | 
| 1151 | 
            -
                    }
         | 
| 1152 | 
            -
                    if (bridge.words) {
         | 
| 1153 | 
            -
                      for (let def of bridge.words) {
         | 
| 1154 | 
            -
                        if (typeof def == 'string') {
         | 
| 1155 | 
            -
                          this.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
         | 
| 1156 | 
            -
                        } else {
         | 
| 1157 | 
            -
                          const word = def.word
         | 
| 1158 | 
            -
                          def = { initial: JSON.stringify(def), id: bridge.id, word: undefined }
         | 
| 1159 | 
            -
                          this.addWordInternal(word, def)
         | 
| 1160 | 
            -
                        }
         | 
| 1161 | 
            -
                      }
         | 
| 1162 | 
            -
                    }
         | 
| 1163 | 
            -
                    if (bridge.generator) {
         | 
| 1164 | 
            -
                      this.config.generators.unshift(bridge.generator)
         | 
| 1165 | 
            -
                    }
         | 
| 1166 | 
            -
                    if (bridge.generators) {
         | 
| 1167 | 
            -
                      const generators = [...bridge.generators]
         | 
| 1168 | 
            -
                      generators.reverse()
         | 
| 1169 | 
            -
                      for (let generator of generators) {
         | 
| 1170 | 
            -
                        this.config.generators.unshift(generator)
         | 
| 1171 | 
            -
                      }
         | 
| 1172 | 
            -
                    }
         | 
| 1173 | 
            -
                    if (bridge.generatorp) {
         | 
| 1174 | 
            -
                      this.config.generators.unshift({ 
         | 
| 1175 | 
            -
                        where: bridge.generatorp.where || client.where(3),
         | 
| 1176 | 
            -
                        match: ({context}) => bridge.id == context.marker && context.paraphrase,
         | 
| 1177 | 
            -
                        apply: (args) => bridge.generatorp(args),
         | 
| 1178 | 
            -
                      })
         | 
| 1179 | 
            -
                    }
         | 
| 1180 | 
            -
                    if (bridge.generatorr) {
         | 
| 1181 | 
            -
                      this.config.generators.unshift({ 
         | 
| 1182 | 
            -
                        // TODO merge response and isResponse
         | 
| 1183 | 
            -
                        where: bridge.generatorr.where || client.where(3),
         | 
| 1184 | 
            -
                        match: ({context}) => bridge.id == context.marker && !context.paraphrase && (context.response || context.isResponse),
         | 
| 1185 | 
            -
                        apply: (args) => bridge.generatorr(args),
         | 
| 1186 | 
            -
                      })
         | 
| 1187 | 
            -
                    }
         | 
| 1188 | 
            -
                    if (bridge.evaluator) {
         | 
| 1189 | 
            -
                      this.config.semantics.unshift({ 
         | 
| 1190 | 
            -
                        where: bridge.evaluator.where || client.where(3),
         | 
| 1191 | 
            -
                        match: ({context}) => bridge.id == context.marker && context.evaluate,
         | 
| 1192 | 
            -
                        apply: (args) => bridge.evaluator(args),
         | 
| 1193 | 
            -
                      })
         | 
| 1194 | 
            -
                    }
         | 
| 1195 | 
            -
                    if (bridge.semantic) {
         | 
| 1196 | 
            -
                      this.config.semantics.unshift({ 
         | 
| 1197 | 
            -
                        where: bridge.semantic.where || client.where(3),
         | 
| 1198 | 
            -
                        match: ({context}) => bridge.id == context.marker,
         | 
| 1199 | 
            -
                        apply: (args) => bridge.semantic(args),
         | 
| 1200 | 
            -
                      })
         | 
| 1201 | 
            -
                    }
         | 
| 1202 | 
            -
                  }
         | 
| 1203 | 
            -
                  if (config.operators) {
         | 
| 1204 | 
            -
                    config.operators = config.operators.map((operator) => {
         | 
| 1205 | 
            -
                      if (typeof operator === 'string') {
         | 
| 1206 | 
            -
                        return { pattern: operator }
         | 
| 1207 | 
            -
                      } else {
         | 
| 1208 | 
            -
                        return operator
         | 
| 1209 | 
            -
                      }
         | 
| 1210 | 
            -
                    })
         | 
| 1211 | 
            -
                  }
         | 
| 1281 | 
            +
                  handleCalculatedProps(this, config)
         | 
| 1212 1282 | 
             
                }
         | 
| 1213 1283 | 
             
                this.hierarchy = new Digraph(this.config.hierarchy)
         | 
| 1214 1284 | 
             
                this.initConfig = _.cloneDeep(this.config)
         | 
| 1215 1285 | 
             
                this.configs.push(new KM({ config: this.config, getCounter: (name) => this.config.getCounter(name), uuid: this._uuid }))
         | 
| 1216 1286 |  | 
| 1217 | 
            -
                /*
         | 
| 1218 | 
            -
                if (config) {
         | 
| 1219 | 
            -
                  this.configs.push(new KM({config, isSelf: true}))
         | 
| 1220 | 
            -
                  this.addInternal(Object.assign({}, config), false)
         | 
| 1221 | 
            -
                } else {
         | 
| 1222 | 
            -
                  this.configs.push( new KM({config: this.config, isSelf: true}) )
         | 
| 1223 | 
            -
                }
         | 
| 1224 | 
            -
                */
         | 
| 1225 | 
            -
             | 
| 1226 1287 | 
             
                this.setUUIDs()
         | 
| 1227 1288 | 
             
                this.initDefaults()
         | 
| 1228 1289 | 
             
                if (!this.config.objects.namespaced) {
         | 
| @@ -1311,6 +1372,7 @@ class Config { | |
| 1311 1372 | 
             
                    this._api.config = () => this
         | 
| 1312 1373 | 
             
                    this._api.uuid = this._uuid
         | 
| 1313 1374 | 
             
                  }
         | 
| 1375 | 
            +
                  this.rebuild()
         | 
| 1314 1376 | 
             
                }
         | 
| 1315 1377 | 
             
              }
         | 
| 1316 1378 |  | 
| @@ -1613,7 +1675,8 @@ class Config { | |
| 1613 1675 |  | 
| 1614 1676 | 
             
                  if (currentConfig.api) {
         | 
| 1615 1677 | 
             
                    currentConfig.api.objects = args.objects
         | 
| 1616 | 
            -
                    currentConfig.api.config = () => this
         | 
| 1678 | 
            +
                    // GREG42 currentConfig.api.config = () => this
         | 
| 1679 | 
            +
                    currentConfig.api.config = () => args.baseConfig
         | 
| 1617 1680 | 
             
                    currentConfig.api.uuid = currentConfig._uuid
         | 
| 1618 1681 | 
             
                  }
         | 
| 1619 1682 | 
             
                  // this.instances.forEach( (instance) => client.processInstance(this, instance) )
         | 
| @@ -1877,7 +1940,6 @@ class Config { | |
| 1877 1940 | 
             
                    } else {
         | 
| 1878 1941 | 
             
                      addInternals.unshift(config)
         | 
| 1879 1942 | 
             
                    }
         | 
| 1880 | 
            -
                    // this.addInternal(config, true, false, false, true)
         | 
| 1881 1943 | 
             
                  } else {
         | 
| 1882 1944 | 
             
                    if (interleaved) {
         | 
| 1883 1945 | 
             
                      addInternals.unshift(null)
         | 
| @@ -1886,10 +1948,6 @@ class Config { | |
| 1886 1948 | 
             
                  km.valid()
         | 
| 1887 1949 | 
             
                })
         | 
| 1888 1950 |  | 
| 1889 | 
            -
                if (addInternals.length !== inits.length || addInternals.length !== initAfterApis.length) {
         | 
| 1890 | 
            -
                  debugger // bug
         | 
| 1891 | 
            -
                }
         | 
| 1892 | 
            -
             | 
| 1893 1951 | 
             
                const generators = this.config.generators
         | 
| 1894 1952 | 
             
                const semantics = this.config.semantics
         | 
| 1895 1953 | 
             
                if (reverseIt) {
         | 
| @@ -1900,7 +1958,7 @@ class Config { | |
| 1900 1958 | 
             
                if (!interleaved) {
         | 
| 1901 1959 | 
             
                  for (const config of addInternals) {
         | 
| 1902 1960 | 
             
                    if (!reverseIt) {
         | 
| 1903 | 
            -
                      this.addInternal(config,  | 
| 1961 | 
            +
                      this.addInternal(config, { includeNamespace: false, allowNameToBeNull: true })
         | 
| 1904 1962 | 
             
                    } else {
         | 
| 1905 1963 | 
             
                      this.addInternalR(config, true, false, false, true)
         | 
| 1906 1964 | 
             
                    }
         | 
| @@ -2052,7 +2110,7 @@ class Config { | |
| 2052 2110 |  | 
| 2053 2111 | 
             
                  this.applyNamespace(configPrime, km.namespace, km.uuid)
         | 
| 2054 2112 | 
             
                  first = false
         | 
| 2055 | 
            -
                  this.addInternal(configPrime, false, true)
         | 
| 2113 | 
            +
                  this.addInternal(configPrime, { useOldVersion: false, skipObjects: true })
         | 
| 2056 2114 | 
             
                  applyUUID(configPrime, km.uuid)
         | 
| 2057 2115 | 
             
                })
         | 
| 2058 2116 |  | 
| @@ -2342,7 +2400,7 @@ class Config { | |
| 2342 2400 | 
             
              }
         | 
| 2343 2401 |  | 
| 2344 2402 | 
             
              // TODO get rid of useOldVersion arg
         | 
| 2345 | 
            -
              addInternal (more, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false) {
         | 
| 2403 | 
            +
              addInternal (more, { useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
         | 
| 2346 2404 | 
             
                if (more instanceof Config) {
         | 
| 2347 2405 | 
             
                  more.initialize({ force: false })
         | 
| 2348 2406 | 
             
                  if (useOldVersion) {
         | 
| @@ -2352,6 +2410,10 @@ class Config { | |
| 2352 2410 | 
             
                    more = _.cloneDeep(more.initConfig)
         | 
| 2353 2411 | 
             
                  }
         | 
| 2354 2412 | 
             
                }
         | 
| 2413 | 
            +
                if (hcps) {
         | 
| 2414 | 
            +
                  handleCalculatedProps(this, more)
         | 
| 2415 | 
            +
                  applyUUID(more, this._uuid)
         | 
| 2416 | 
            +
                }
         | 
| 2355 2417 | 
             
                for (const key of Object.keys(more)) {
         | 
| 2356 2418 | 
             
                  const value = more[key]
         | 
| 2357 2419 | 
             
                  // TODO remove name and description on the config bag
         | 
| @@ -2560,9 +2622,6 @@ class Config { | |
| 2560 2622 | 
             
                    // console.log('key', key, 'XXX')
         | 
| 2561 2623 | 
             
                    // console.log('more', JSON.stringify(more, null, 2))
         | 
| 2562 2624 | 
             
                    // this.config[key] = this.config[key].concat(more[key])
         | 
| 2563 | 
            -
                    if (key == '2enerators') {
         | 
| 2564 | 
            -
                      debugger
         | 
| 2565 | 
            -
                    }
         | 
| 2566 2625 | 
             
                    // this.config[key] = this.config[key].concat(more[key])
         | 
| 2567 2626 | 
             
                    this.config[key] = more[key].concat(this.config[key])
         | 
| 2568 2627 | 
             
                  } else {
         | 
    
        package/src/generators.js
    CHANGED
    
    | @@ -6,9 +6,11 @@ class Generator { | |
| 6 6 | 
             
              // constructor ({ match, apply, uuid, index, km, priority, notes }) {
         | 
| 7 7 | 
             
              constructor (generator) {
         | 
| 8 8 | 
             
                generator = normalizeGenerator(generator)
         | 
| 9 | 
            -
                const { match, apply, uuid, index, km, priority, where, notes, debug } = generator
         | 
| 9 | 
            +
                const { match, apply, uuid, index, km, priority, where, notes, debug, applyWrapped, property } = generator
         | 
| 10 10 | 
             
                this.match = match
         | 
| 11 11 | 
             
                this._apply = apply
         | 
| 12 | 
            +
                this._applyWrapped = applyWrapped
         | 
| 13 | 
            +
                this.property = property
         | 
| 12 14 | 
             
                this.uuid = uuid
         | 
| 13 15 | 
             
                this.index = index
         | 
| 14 16 | 
             
                this.km = km
         | 
| @@ -39,7 +41,7 @@ class Generator { | |
| 39 41 | 
             
              }
         | 
| 40 42 |  | 
| 41 43 | 
             
              toString () {
         | 
| 42 | 
            -
                return `Generator(${this.match}, ${this._apply})`
         | 
| 44 | 
            +
                return `Generator(${this.match}, ${this._applyWrapped || this._apply})${this.property ? `\nsee the ${this.property} property` : ''}`
         | 
| 43 45 | 
             
              }
         | 
| 44 46 |  | 
| 45 47 | 
             
              matches (baseArgs, objects, context, hierarchy, config, options = {}) {
         | 
    
        package/src/helpers.js
    CHANGED
    
    | @@ -44,10 +44,23 @@ const appendNoDups = (l1, l2) => { | |
| 44 44 | 
             
            }
         | 
| 45 45 |  | 
| 46 46 | 
             
            const safeEquals = (v1, v2) => {
         | 
| 47 | 
            -
              if ( | 
| 47 | 
            +
              if (typeof v1 !== typeof v2) {
         | 
| 48 48 | 
             
                return false
         | 
| 49 49 | 
             
              }
         | 
| 50 | 
            -
             | 
| 50 | 
            +
             | 
| 51 | 
            +
              const type = typeof v1
         | 
| 52 | 
            +
              if (type == 'number' || type == 'string') {
         | 
| 53 | 
            +
                return v1 == v2
         | 
| 54 | 
            +
              } else if (type == 'function') {
         | 
| 55 | 
            +
                return v1.toString() == v2.toString()
         | 
| 56 | 
            +
              } else {
         | 
| 57 | 
            +
                for (let key in v1) {
         | 
| 58 | 
            +
                  if (!safeEquals(v1[key], v2[key])) {
         | 
| 59 | 
            +
                    return false
         | 
| 60 | 
            +
                  }
         | 
| 61 | 
            +
                }
         | 
| 62 | 
            +
                return true
         | 
| 63 | 
            +
              }
         | 
| 51 64 | 
             
            }
         | 
| 52 65 |  | 
| 53 66 | 
             
            /*
         | 
| @@ -238,7 +251,66 @@ const mapInPlace = (list, fn) => { | |
| 238 251 | 
             
              }
         | 
| 239 252 | 
             
            }
         | 
| 240 253 |  | 
| 254 | 
            +
            const updateQueries = (queryOrConfig) => {
         | 
| 255 | 
            +
              if (typeof queryOrConfig == 'string' || queryOrConfig.query) {
         | 
| 256 | 
            +
                return queryOrConfig
         | 
| 257 | 
            +
              } else {
         | 
| 258 | 
            +
                const config = queryOrConfig
         | 
| 259 | 
            +
                return functionsToStrings(config)
         | 
| 260 | 
            +
              }
         | 
| 261 | 
            +
            }
         | 
| 262 | 
            +
             | 
| 263 | 
            +
            const functionsToStrings = (config) => {
         | 
| 264 | 
            +
              config = {...config}
         | 
| 265 | 
            +
              const mapGenerator = (generator) => {
         | 
| 266 | 
            +
                  if (generator.apply) {
         | 
| 267 | 
            +
                    return { ...generator, match: generator.match.toString(), apply: generator.apply.toString() }
         | 
| 268 | 
            +
                  } else {
         | 
| 269 | 
            +
                    return [ generator[0].toString(), generator[1].toString() ]
         | 
| 270 | 
            +
                  }
         | 
| 271 | 
            +
                }
         | 
| 272 | 
            +
              if (config.generators) {
         | 
| 273 | 
            +
                config.generators = config.generators.map( mapGenerator )
         | 
| 274 | 
            +
              }
         | 
| 275 | 
            +
              if (config.semantics) {
         | 
| 276 | 
            +
                config.semantics = config.semantics.map( (semantic) => {
         | 
| 277 | 
            +
                  if (semantic.apply) {
         | 
| 278 | 
            +
                    return { ...semantic, match: semantic.match.toString(), apply: semantic.apply.toString() }
         | 
| 279 | 
            +
                  } else {
         | 
| 280 | 
            +
                    return [ semantic[0].toString(), semantic[1].toString() ]
         | 
| 281 | 
            +
                  }
         | 
| 282 | 
            +
                })
         | 
| 283 | 
            +
              }
         | 
| 284 | 
            +
              if (config.bridges) {
         | 
| 285 | 
            +
                config.bridges = config.bridges.map( (bridge) => {
         | 
| 286 | 
            +
                  bridge = {...bridge}
         | 
| 287 | 
            +
                  if (bridge.generator) {
         | 
| 288 | 
            +
                    bridge.generator = bridge.generator.toString()
         | 
| 289 | 
            +
                  }
         | 
| 290 | 
            +
                  if (bridge.generators) {
         | 
| 291 | 
            +
                    bridge.generators = bridge.generators.map( mapGenerator )
         | 
| 292 | 
            +
                  }
         | 
| 293 | 
            +
                  if (bridge.generatorp) {
         | 
| 294 | 
            +
                    bridge.generatorp = bridge.generatorp.toString()
         | 
| 295 | 
            +
                  }
         | 
| 296 | 
            +
                  if (bridge.generatorr) {
         | 
| 297 | 
            +
                    bridge.generatorr = bridge.generatorr.toString()
         | 
| 298 | 
            +
                  }
         | 
| 299 | 
            +
                  if (bridge.semantic) {
         | 
| 300 | 
            +
                    bridge.semantic = bridge.semantic.toString()
         | 
| 301 | 
            +
                  }
         | 
| 302 | 
            +
                  if (bridge.evaluator) {
         | 
| 303 | 
            +
                    bridge.evaluator = bridge.evaluator.toString()
         | 
| 304 | 
            +
                  }
         | 
| 305 | 
            +
                  return bridge
         | 
| 306 | 
            +
                })
         | 
| 307 | 
            +
              }
         | 
| 308 | 
            +
              return config
         | 
| 309 | 
            +
            }
         | 
| 310 | 
            +
             | 
| 241 311 | 
             
            module.exports = { 
         | 
| 312 | 
            +
              functionsToStrings,
         | 
| 313 | 
            +
              updateQueries,
         | 
| 242 314 | 
             
              mapInPlace,
         | 
| 243 315 | 
             
              validProps, 
         | 
| 244 316 | 
             
              args, 
         | 
    
        package/src/semantics.js
    CHANGED
    
    | @@ -6,9 +6,11 @@ class Semantic { | |
| 6 6 | 
             
              // constructor ({match, apply, uuid, index, km, notes}) {
         | 
| 7 7 | 
             
              constructor (semantic) {
         | 
| 8 8 | 
             
                semantic = normalizeSemantic(semantic)
         | 
| 9 | 
            -
                const { match, apply, uuid, index, km, notes, priority, debug, where } = semantic
         | 
| 9 | 
            +
                const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property } = semantic
         | 
| 10 10 | 
             
                this.matcher = match
         | 
| 11 11 | 
             
                this._apply = apply
         | 
| 12 | 
            +
                this._applyWrapped = applyWrapped
         | 
| 13 | 
            +
                this.property = property
         | 
| 12 14 | 
             
                this.uuid = uuid
         | 
| 13 15 | 
             
                this.index = index
         | 
| 14 16 | 
             
                this.km = km
         | 
| @@ -27,7 +29,7 @@ class Semantic { | |
| 27 29 | 
             
              }
         | 
| 28 30 |  | 
| 29 31 | 
             
              toString () {
         | 
| 30 | 
            -
                return `Semantic(${this.matcher}, ${this._apply})`
         | 
| 32 | 
            +
                return `Semantic(${this.matcher}, ${this._applyWrapped || this._apply})${this.property ? `\nsee the ${this.property} property` : ''}`
         | 
| 31 33 | 
             
              }
         | 
| 32 34 |  | 
| 33 35 | 
             
              getAPI (config) {
         |