From 97e895ba4e5f92ddd87c5b14a006bbb862b3b10a Mon Sep 17 00:00:00 2001 From: rjrodger Date: Mon, 18 May 2020 16:14:05 +0100 Subject: [PATCH] better order semantics for plugin lifecycle --- lib/api.js | 2 +- lib/errors.js | 4 + lib/use.js | 87 +- lib/use.js.map | 2 +- lib/use.ts | 135 +- package-lock.json | 13 +- package.json | 2 +- test/coverage.html | 6022 ++++++++++++++++++++------------------ test/error.test.js | 1 + test/exports.test.js | 8 +- test/logging.test.js | 1 + test/order.test.js | 167 ++ test/plugin.test.js | 80 + test/stubs/transports.js | 4 - 14 files changed, 3559 insertions(+), 2969 deletions(-) create mode 100644 test/order.test.js diff --git a/lib/api.js b/lib/api.js index 3602150d..ed683352 100644 --- a/lib/api.js +++ b/lib/api.js @@ -651,7 +651,7 @@ exports.client = function (callpoint) { // TODO: review - this feels like a hack // perhaps we should instantiate a virtual plugin to represent the client? // ... but is this necessary at all? - var task_res = self.order.plugin.task.delegate({ + var task_res = self.order.plugin.task.delegate.exec({ ctx: { seneca: self }, diff --git a/lib/errors.js b/lib/errors.js index ab5d8b8e..66e862a9 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -145,6 +145,10 @@ module.exports = { action_timeout: '<%=legacy_string%>Action <%=pattern%> timed out. Timeout was: <%=timeout%> (start: <%=start%>, end: <%=end%>. Message was: <%=message%>.', + use_no_args: + 'The seneca.use method needs at least one argument to define a plugin.', + + // Legacy error message codes act_invalid_args: diff --git a/lib/use.js b/lib/use.js index 3584ff36..53b4888b 100644 --- a/lib/use.js +++ b/lib/use.js @@ -1,4 +1,5 @@ /* Copyright © 2020 Richard Rodger and other contributors, MIT License. */ +/* $lab:coverage:off$ */ 'use strict'; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; @@ -11,6 +12,7 @@ const ordu_1 = require("ordu"); // TODO: refactor: use.js->plugin.js and contain *_plugin api methods too const Common = require('./common'); const Print = require('./print'); +/* $lab:coverage:on$ */ exports.api_use = api_use; const intern = exports.intern = make_intern(); function api_use(callpoint) { @@ -46,10 +48,14 @@ function api_use(callpoint) { function make_use(ordu, callpoint) { let seq = { index: 0 }; return function use() { - var self = this; + let self = this; + let args = [...arguments]; + if (0 === args.length) { + throw self.error('use_no_args'); + } let ctx = { seq: seq, - args: [...arguments], + args: args, seneca: this, callpoint: callpoint(true) }; @@ -64,10 +70,13 @@ function make_use(ordu, callpoint) { }; async function run() { // NOTE: don't wait for result! + //let pn: string = (ctx.args[0] as any).name + // TODO: set runid to indicate plugin fullname + time + //console.log('USE AAA', pn)//, ctx.seneca.order.plugin.tasks().length) //var resp = await ordu.exec(ctx, data, { done: function (res) { - //console.log('RES-ERR', res.err) + //console.log('RES-DONE', pn, res.err) if (res.err) { //self.die(self.private$.error(res.err, 'plugin_' + res.err.code)) var err = res.err.seneca ? res.err : @@ -76,7 +85,7 @@ function make_use(ordu, callpoint) { } } }); - //console.log('RESP') + //console.log('RESP', pn, resp.err) //console.dir((resp.tasklog as any[]).map((x): any => [x.name, x.op, x.result.err]), { depth: null }) } run(); @@ -98,7 +107,7 @@ function make_tasks() { return { stop: false }; }, seneca_options: (tr, ctx, data) => { - nua_1.default(data.plugin.options, tr.out.plugin.options, { preserve: true }); + nua_1.default(data.plugin, tr.out.plugin, { preserve: true }); let plugin_fullname = data.plugin.fullname; let plugin_options = data.plugin.options; let plugin_options_update = { plugin: {} }; @@ -107,6 +116,7 @@ function make_tasks() { return { stop: false }; }, }, + // TODO: args validation? args: (spec) => { let args = [...spec.ctx.args]; // DEPRECATED: Remove when Seneca >= 4.x @@ -212,6 +222,7 @@ function make_tasks() { }; }, meta: (spec) => { + let seneca = spec.ctx.seneca; let plugin = spec.data.plugin; let meta = spec.data.meta; let exports = {}; @@ -225,6 +236,20 @@ function make_tasks() { exports[exportname] = v; } }); + if (meta.order) { + if (meta.order.plugin) { + let tasks = Array.isArray(meta.order.plugin) ? meta.order.plugin : + [meta.order.plugin]; + //console.log('AAA', spec.task.name, tasks) + //try { + seneca.order.plugin.add(tasks); + //} + //catch (e) { + // console.log(e) + //} + delete meta.order.plugin; + } + } return { op: 'seneca_export', out: { @@ -389,24 +414,31 @@ function make_tasks() { } let outopts = Object.assign(base, shortname_options, fullname_options, plugin.options || {}); let resolved_options = {}; + //console.log('oAAA', delegate.util.Joi.isSchema(defaults)) + // TODO: expose this on plugin let joi_schema = intern.prepare_spec(delegate.util.Joi, defaults, { allow_unknown: true }, {}); + //console.log('oBBB', joi_schema === defaults) let joi_out = joi_schema.validate(outopts); - // TODO: return this instead + //console.log('oCCC', joi_out) + let err = void 0; if (joi_out.error) { - throw delegate.error('invalid_plugin_option', { + err = delegate.error('invalid_plugin_option', { name: fullname, err_msg: joi_out.error.message, options: outopts, }); + //console.log('oDDD', err) } else { resolved_options = joi_out.value; } return { op: 'seneca_options', + err: err, out: { plugin: { - options: resolved_options + options: resolved_options, + options_schema: joi_schema } } }; @@ -598,29 +630,32 @@ function make_intern() { // copied from https://github.com/rjrodger/optioner // TODO: remove unnecessary vars+code walk: function (Joi, start_joiobj, obj, path, opts, ctxt, mod) { + let joiobj = start_joiobj; + // NOTE: use explicit Joi construction for checking within arrays if (Array.isArray(obj)) { - ctxt.arrpaths.push(path); + return Joi.array(); } - let joiobj = start_joiobj; - for (var p in obj) { - var v = obj[p]; - var t = typeof v; - var kv = {}; - if (null != v && !Joi.isSchema(v) && 'object' === t) { - var np = '' === path ? p : path + '.' + p; - joiobj = joiobj.object().default(); - if (opts.allow_unknown) { - joiobj = joiobj.unknown(); + else { + for (var p in obj) { + var v = obj[p]; + var t = typeof v; + var kv = {}; + if (null != v && !Joi.isSchema(v) && 'object' === t) { + var np = '' === path ? p : path + '.' + p; + let childjoiobj = Joi.object().default(); + if (opts.allow_unknown) { + childjoiobj = childjoiobj.unknown(); + } + kv[p] = intern.walk(Joi, childjoiobj, v, np, opts, ctxt, mod); } - kv[p] = intern.walk(Joi, joiobj, v, np, opts, ctxt, mod); - } - else { - kv[p] = mod(v); + else { + kv[p] = mod(v); + } + joiobj = joiobj.keys(kv); } - joiobj = joiobj.keys(kv); + return joiobj; } - return joiobj; - }, + } }; } //# sourceMappingURL=use.js.map \ No newline at end of file diff --git a/lib/use.js.map b/lib/use.js.map index 132ba41e..ac6c9b9e 100644 --- a/lib/use.js.map +++ b/lib/use.js.map @@ -1 +1 @@ -{"version":3,"file":"use.js","sourceRoot":"","sources":["use.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"use.js","sourceRoot":"","sources":["use.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/use.ts b/lib/use.ts index 725d5b58..40ec24ec 100644 --- a/lib/use.ts +++ b/lib/use.ts @@ -1,19 +1,20 @@ /* Copyright © 2020 Richard Rodger and other contributors, MIT License. */ +/* $lab:coverage:off$ */ 'use strict' -import * as Hoek from '@hapi/hoek' - const Uniq: any = require('lodash.uniq') const Eraro: any = require('eraro') import Nua from 'nua' -import { Ordu } from 'ordu' +import { Ordu, TaskSpec } from 'ordu' // TODO: refactor: use.js->plugin.js and contain *_plugin api methods too const Common: any = require('./common') const Print: any = require('./print') +/* $lab:coverage:on$ */ + exports.api_use = api_use @@ -77,11 +78,6 @@ interface UseData { exports: any } -interface UseSpec { - ctx: UseCtx - data: UseData -} - @@ -90,11 +86,16 @@ function make_use(ordu: any, callpoint: any) { let seq = { index: 0 } return function use() { - var self = this + let self = this + let args = [...arguments] + + if (0 === args.length) { + throw self.error('use_no_args') + } let ctx: UseCtx = { seq: seq, - args: [...arguments], + args: args, seneca: this, callpoint: callpoint(true) } @@ -110,10 +111,15 @@ function make_use(ordu: any, callpoint: any) { async function run() { // NOTE: don't wait for result! + + //let pn: string = (ctx.args[0] as any).name + + // TODO: set runid to indicate plugin fullname + time + //console.log('USE AAA', pn)//, ctx.seneca.order.plugin.tasks().length) //var resp = await ordu.exec(ctx, data, { done: function(res: any) { - //console.log('RES-ERR', res.err) + //console.log('RES-DONE', pn, res.err) if (res.err) { //self.die(self.private$.error(res.err, 'plugin_' + res.err.code)) @@ -124,7 +130,7 @@ function make_use(ordu: any, callpoint: any) { } }) - //console.log('RESP') + //console.log('RESP', pn, resp.err) //console.dir((resp.tasklog as any[]).map((x): any => [x.name, x.op, x.result.err]), { depth: null }) } @@ -152,7 +158,7 @@ function make_tasks(): any { }, seneca_options: (tr: any, ctx: any, data: any): any => { - Nua(data.plugin.options, tr.out.plugin.options, { preserve: true }) + Nua(data.plugin, tr.out.plugin, { preserve: true }) let plugin_fullname: string = data.plugin.fullname let plugin_options = data.plugin.options @@ -166,7 +172,9 @@ function make_tasks(): any { }, }, - args: (spec: UseSpec) => { + + // TODO: args validation? + args: (spec: TaskSpec) => { let args: any[] = [...spec.ctx.args] // DEPRECATED: Remove when Seneca >= 4.x @@ -187,7 +195,6 @@ function make_tasks(): any { args[0].init = args[0].define || args[0].init } - return { op: 'merge', out: { args } @@ -195,7 +202,7 @@ function make_tasks(): any { }, - load: (spec: UseSpec) => { + load: (spec: TaskSpec) => { let args: string[] = spec.data.args let seneca: any = spec.ctx.seneca let private$: any = seneca.private$ @@ -230,7 +237,7 @@ function make_tasks(): any { }, - normalize: (spec: UseSpec) => { + normalize: (spec: TaskSpec) => { let plugin: any = spec.data.plugin var modify: any = {} @@ -250,7 +257,7 @@ function make_tasks(): any { }, - preload: (spec: UseSpec) => { + preload: (spec: TaskSpec) => { let seneca: any = spec.ctx.seneca let plugin: any = spec.data.plugin @@ -298,7 +305,8 @@ function make_tasks(): any { }, - meta: (spec: UseSpec) => { + meta: (spec: TaskSpec) => { + let seneca: any = spec.ctx.seneca let plugin: any = spec.data.plugin let meta: any = spec.data.meta @@ -316,6 +324,24 @@ function make_tasks(): any { } }) + + if (meta.order) { + if (meta.order.plugin) { + let tasks: any[] = + Array.isArray(meta.order.plugin) ? meta.order.plugin : + [meta.order.plugin] + + //console.log('AAA', spec.task.name, tasks) + //try { + seneca.order.plugin.add(tasks) + //} + //catch (e) { + // console.log(e) + //} + delete meta.order.plugin + } + } + return { op: 'seneca_export', out: { @@ -326,7 +352,7 @@ function make_tasks(): any { // NOTE: mutates spec.ctx.seneca - legacy_extend: (spec: UseSpec) => { + legacy_extend: (spec: TaskSpec) => { let seneca: any = spec.ctx.seneca // let plugin: any = spec.data.plugin @@ -354,7 +380,7 @@ function make_tasks(): any { }, - delegate: (spec: UseSpec) => { + delegate: (spec: TaskSpec) => { let seneca: any = spec.ctx.seneca let plugin: any = spec.data.plugin @@ -452,7 +478,7 @@ function make_tasks(): any { }, - call_define: (spec: UseSpec) => { + call_define: (spec: TaskSpec) => { let plugin: any = spec.data.plugin let delegate: any = spec.data.delegate @@ -495,7 +521,7 @@ function make_tasks(): any { }, - options: (spec: UseSpec) => { + options: (spec: TaskSpec) => { let plugin: any = spec.data.plugin let delegate: any = spec.data.delegate @@ -556,6 +582,10 @@ function make_tasks(): any { let resolved_options: any = {} + //console.log('oAAA', delegate.util.Joi.isSchema(defaults)) + + + // TODO: expose this on plugin let joi_schema: any = intern.prepare_spec( delegate.util.Joi, defaults, @@ -563,15 +593,23 @@ function make_tasks(): any { {} ) + //console.log('oBBB', joi_schema === defaults) + + let joi_out = joi_schema.validate(outopts) - // TODO: return this instead + + //console.log('oCCC', joi_out) + + let err: Error | undefined = void 0 + if (joi_out.error) { - throw delegate.error('invalid_plugin_option', { + err = delegate.error('invalid_plugin_option', { name: fullname, err_msg: joi_out.error.message, options: outopts, }) + //console.log('oDDD', err) } else { resolved_options = joi_out.value @@ -579,9 +617,11 @@ function make_tasks(): any { return { op: 'seneca_options', + err: err, out: { plugin: { - options: resolved_options + options: resolved_options, + options_schema: joi_schema } } } @@ -589,7 +629,7 @@ function make_tasks(): any { // TODO: move data modification to returned operation - define: (spec: UseSpec) => { + define: (spec: TaskSpec) => { let seneca: any = spec.ctx.seneca let so: any = seneca.options() @@ -842,36 +882,39 @@ function make_intern() { opts: any, ctxt: any, mod: any) { - if (Array.isArray(obj)) { - ctxt.arrpaths.push(path) - } let joiobj = start_joiobj - for (var p in obj) { - var v = obj[p] - var t = typeof v + // NOTE: use explicit Joi construction for checking within arrays + if (Array.isArray(obj)) { + return Joi.array() + } + else { + for (var p in obj) { + var v = obj[p] + var t = typeof v - var kv: any = {} + var kv: any = {} - if (null != v && !Joi.isSchema(v) && 'object' === t) { - var np = '' === path ? p : path + '.' + p + if (null != v && !Joi.isSchema(v) && 'object' === t) { + var np = '' === path ? p : path + '.' + p - joiobj = joiobj.object().default() + let childjoiobj = Joi.object().default() + + if (opts.allow_unknown) { + childjoiobj = childjoiobj.unknown() + } - if (opts.allow_unknown) { - joiobj = joiobj.unknown() + kv[p] = intern.walk(Joi, childjoiobj, v, np, opts, ctxt, mod) + } else { + kv[p] = mod(v) } - kv[p] = intern.walk(Joi, joiobj, v, np, opts, ctxt, mod) - } else { - kv[p] = mod(v) + joiobj = joiobj.keys(kv) } - joiobj = joiobj.keys(kv) + return joiobj } - - return joiobj - }, + } } } diff --git a/package-lock.json b/package-lock.json index e1cc586a..963ea6c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1716,12 +1716,11 @@ } }, "ordu": { - "version": "1.4.0", - "resolved": "http://localhost:4873/ordu/-/ordu-1.4.0.tgz", - "integrity": "sha512-SZ2PkTs/3MKmxozPC8uzpYgcKdpKUBvirsrajwIVpO1fBRWT43i6WUh6oO0DBjbdeGWtgUwtCtba3RudddnLiw==", + "version": "1.7.0", + "resolved": "http://localhost:4873/ordu/-/ordu-1.7.0.tgz", + "integrity": "sha512-3rau++ZPns8jU74d+BOQtRfeKsUanBOJCI876/nj/iSJamlNZUI7uCXDcP2kaDd1IXYr84BlFsIZDzuqlTQr5w==", "requires": { "@hapi/hoek": "^9.0.4", - "@hapi/topo": "^5.0.0", "nua": "^1.0.2", "strict-event-emitter-types": "^2.0.0" } @@ -2313,9 +2312,9 @@ } }, "tslib": { - "version": "1.12.0", - "resolved": "http://localhost:4873/tslib/-/tslib-1.12.0.tgz", - "integrity": "sha512-5rxCQkP0kytf4H1T4xz1imjxaUUPMvc5aWp0rJ/VMIN7ClRiH1FwFvBt8wOeMasp/epeUnmSW6CixSIePtiLqA==", + "version": "1.13.0", + "resolved": "http://localhost:4873/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tunnel-agent": { diff --git a/package.json b/package.json index 3ffd556b..701360f3 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "nid": "^1.1.0", "norma": "^2.0.2", "optioner": "^5.0.1", - "ordu": "^1.4.0", + "ordu": "^1.7.0", "patrun": "^3.0.0", "qs": "^6.9.4", "rolling-stats": "^0.1.1", diff --git a/test/coverage.html b/test/coverage.html index 7164433c..46820f96 100644 --- a/test/coverage.html +++ b/test/coverage.html @@ -600,7 +600,7 @@ lib/transport.js
  • - 89.28 + 92.16 lib/use.js
  • Linting Report
  • @@ -610,8 +610,8 @@

    Test Report

    0
    0
    -
    342
    -
    34848
    +
    346
    +
    36199
    @@ -659,6 +659,8 @@

    Test Report

    + + @@ -712,126 +714,126 @@

    Test Report

    act make_actmsg - 10 + 14 2 act process_outward - 89 + 92 3 actions cmd_ping - 257 + 270 4 actions cmd_stats - 37 + 31 5 actions cmd_close - 139 + 133 6 actions info_fatal - 127 + 140 7 actions get_options - 26 + 43 8 add name - 19 + 32 9 add action_modifier - 129 + 128 10 api error - 3 + 6 11 api fail - 2 + 3 12 api list - 10 + 15 13 api translate - 127 + 146 14 api test-mode - 56 + 57 15 api find_plugin - 140 + 156 16 api has_plugin - 251 + 252 17 api ignore_plugin - 358 + 367 18 api has - 4 + 5 19 @@ -852,84 +854,84 @@

    Test Report

    api reply - 12 + 13 22 api delegate - 9 + 11 23 close happy - 121 + 123 24 close add - 126 + 127 25 close graceful - 237 + 238 26 close timeout - 123 + 125 27 close handle-signal - 124 + 123 28 close error - 120 + 128 29 close no-promise - 124 + 125 30 close with-promise - 122 + 124 31 close with-async-await - 122 + 125 32 common misc - 9 + 11 33 @@ -950,7 +952,7 @@

    Test Report

    common deepextend-objs - 6 + 4 36 @@ -971,7 +973,7 @@

    Test Report

    common nil - 1 + 0 39 @@ -985,14 +987,14 @@

    Test Report

    common pincanon - 1 + 0 41 common history - 6 + 5 42 @@ -1020,49 +1022,49 @@

    Test Report

    custom custom-basic - 19 + 23 46 custom custom-deep - 132 + 137 47 custom custom-reply - 128 + 130 48 custom custom-entity - 156 + 151 49 custom custom-prior - 20 + 23 50 custom custom-simple-transport - 143 + 150 51 custom custom-bells-transport - 270 + 278 52 @@ -1076,91 +1078,91 @@

    Test Report

    custom custom-add-fix - 15 + 21 54 debug logroute - 5 + 7 55 delegation happy - 141 + 145 56 delegation dynamic - 136 + 139 57 delegation prior.basic - 133 + 136 58 delegation parent.plugin - 149 + 151 59 entity happy - 40 + 46 60 entity entity-msg - 130 + 143 61 entity mem-ops - 191 + 197 62 error fail - 8 + 10 63 error response_is_error - 20 + 23 64 error action_callback - 20 + 27 65 error plugin_load - 25 + 21 66 @@ -1174,147 +1176,147 @@

    Test Report

    error exec_action_throw_basic - 18 + 27 68 error exec_action_throw_basic_legacy - 31 + 37 69 error exec_action_throw_nolog - 11 + 20 70 error exec_action_errhandler_throw - 69 + 56 71 error exec_action_result - 19 + 18 72 error exec_deep_action_result - 35 + 21 73 error exec_remote_action_result - 149 + 152 74 error exec_action_result_legacy - 33 + 39 75 error exec_action_result_nolog - 19 + 23 76 error exec_action_errhandler_result - 58 + 60 77 error action_callback - 171 + 169 78 error legacy_fail - 10 + 12 79 error types - 19 + 29 80 explain explain-basic - 43 + 34 81 explain explain-data - 47 + 45 82 explain explain-deep - 43 + 51 83 explain explain-toplevel - 137 + 132 84 explain explain-transport - 292 + 291 85 exports happy - 122 + 123 86 exports with-init - 120 + 124 87 exports with-preload - 125 + 123 88 @@ -1328,21 +1330,21 @@

    Test Report

    outward act_error - 0 + 1 90 inward announce - 119 + 122 91 inward arg-check - 2 + 3 92 @@ -1363,126 +1365,126 @@

    Test Report

    legacy router - 0 + 1 95 legacy no-default-transport - 118 + 122 96 legacy actdef - 8 + 11 97 logging happy - 119 + 121 98 logging happy-ng - 121 + 126 99 logging level-text-values - 10 + 11 100 logging build_log_spec - 2 + 3 101 logging event - 127 + 129 102 logging quiet - 118 + 122 103 logging bad_logspec - 3 + 6 104 logging basic - 119 + 124 105 logging logger-output - 736 + 753 106 logging shortcuts - 1325 + 1352 107 logging test-mode-basic - 121 + 125 108 logging test-mode-option - 120 + 124 109 logging test-mode-argv - 122 + 129 110 logging test-mode-argv-opts - 126 + 124 111 logging test-mode-env - 121 + 124 112 @@ -1496,56 +1498,56 @@

    Test Report

    logging quiet-mode-option - 120 + 126 114 logging quiet-mode-argv - 118 + 126 115 logging quiet-mode-argv-opts - 123 + 122 116 logging quiet-mode-env - 124 + 121 117 logging test-quiet-mode-basic - 123 + 122 118 logging quiet-test-mode-basic - 122 + 123 119 logging test-ready-quiet-mode-basic - 237 + 235 120 logging quiet-ready-test-mode-basic - 233 + 240 121 @@ -1573,1533 +1575,1561 @@

    Test Report

    logging test-env-override - 126 + 125 125 logging intern.build_act_entry - 1 + 2 126 message happy-vanilla - 21 + 22 127 message happy-msg - 21 + 26 128 message loop - 19 + 20 129 message branch - 29 + 82 130 message empty-response - 123 + 144 131 message reply - 121 + 124 132 message prior - 120 + 124 133 message entity - 33 + 36 134 message single-simple-transport - 139 + 148 135 message simple-transport - 589 + 596 136 message partial-patterns - 121 + 124 137 meta custom-parents - 29 + 25 138 meta custom-priors - 27 + 37 139 meta custom-fixed - 23 + 21 140 options strict.find - 6 + 9 141 options internal.routers - 6 + 11 - + 142 - outward make_error + order happy - 13 + 257 143 - outward act_stats + outward make_error - 8 + 2 144 + outward act_stats + + + 1 + + + 145 outward arg-check - 3 + 1 - 145 + 146 + plugin use.intern + + + 9 + + + 147 + plugin plugin-edges + + + 9 + + + 148 plugin plugin-internal-ordu 8 - 146 + 149 plugin standard-test-plugin - 138 + 151 - 147 + 150 plugin standard-test-plugin-full-ignore - 238 + 240 - 148 + 151 plugin plugin-ignore-via-options - 120 + 126 - 149 + 152 plugin plugin-ignore-null - 121 + 124 - 150 + 153 plugin plugin-delegate-init - 122 + 126 - 151 + 154 plugin load-defaults - 125 + 124 - 152 + 155 plugin load-relative-to-root - 127 + 134 - 153 + 156 plugin good-default-options - 123 + 127 - 154 + 157 plugin bad-default-options - 19 + 28 - 155 + 158 plugin legacy-options - 8 + 18 - 156 + 159 plugin should return "no errors created." when passing test false - 392 + 401 - 157 + 160 plugin should return "error caught!" when passing test true - 371 + 381 - 158 + 161 plugin works with exportmap - 124 + 126 - 159 + 162 plugin bad - 128 + 132 - 160 + 163 plugin plugin-error-def 20 - 161 + 164 plugin plugin-error-deprecated - 16 + 20 - 162 + 165 plugin plugin-error-add - 13 + 19 - 163 + 166 plugin plugin-error-act - 29 + 24 - 164 + 167 plugin depends - 16 + 23 - 165 + 168 plugin plugin-fix - 172 + 180 - 166 + 169 plugin export - 8 + 11 - 167 + 170 plugin handles plugin with action that timesout - 242 + 246 - 168 + 171 plugin handles plugin action that throws an error - 129 + 138 - 169 + 172 plugin calling act from init actor is deprecated - 23 + 18 - 170 + 173 plugin plugin actions receive errors in callback function - 142 + 138 - 171 + 174 plugin dynamic-load-sequence - 354 + 359 - 172 + 175 plugin serial-load-sequence - 125 + 126 - 173 + 176 plugin plugin options can be modified by plugins during load sequence - 128 + 123 - 174 + 177 plugin plugin options can be modified by plugins during init sequence 128 - 175 + 178 plugin plugin init can add actions for future init actions to call 124 - 176 + 179 plugin plugin-init-error - 19 + 18 - 177 + 180 plugin plugin-extend-action-modifier - 127 + 131 - 178 + 181 plugin plugin-extend-logger - 121 + 124 - 179 + 182 plugin plugins-from-options - 127 + 129 - 180 + 183 plugin plugins-from-bad-options - 13 + 17 - 181 + 184 plugin plugins-options-precedence - 123 + 126 - 182 + 185 plugin error-plugin-define - 13 + 12 - 183 + 186 plugin error-plugin-init - 15 + 18 - 184 + 187 plugin error-plugin-action - 17 + 25 - 185 + 188 plugin no-name - 129 + 134 - 186 + 189 plugin seneca-prefix-wins - 126 + 125 - 187 + 190 plugin plugin-defaults-top-level-joi - 129 + 127 + + + 191 + plugin plugin-order-task-args + + + 13 - 188 + 192 print init - 10 + 8 - 189 + 193 print options - 12 + 9 - 190 + 194 print print - 10 + 8 - 191 + 195 print custom-print - 27 + 18 - 192 + 196 prior happy - 57 + 33 - 193 + 197 prior top-level - 13 + 12 - 194 + 198 prior add-general-to-specific - 44 + 23 - 195 + 199 prior add-strict-general-to-specific - 21 + 30 - 196 + 200 prior add-specific-to-general - 22 + 19 - 197 + 201 prior add-strict-specific-to-general - 22 + 16 - 198 + 202 prior add-general-to-specific-alpha - 28 + 20 - 199 + 203 prior add-general-to-specific-reverse-alpha - 39 + 38 - 200 + 204 prior add-strict-default - 18 + 50 - 201 + 205 prior add-strict-true - 20 + 55 - 202 + 206 private exit_close - 374 + 379 - 203 + 207 ready ready_die - 120 + 121 - 204 + 208 ready ready_die_no_errhandler 120 - 205 + 209 ready ready_null_name - 120 + 121 - 206 + 210 ready ready-complex - 268 + 267 - 207 + 211 ready ready-always-called - 233 + 237 - 208 + 212 ready ready-error-test - 121 + 123 - 209 + 213 ready ready-event - 15 + 16 - 210 + 214 ready ready-both - 118 + 121 - 211 + 215 seneca --seneca.log arguments tests: --seneca.log=level:warn - 7 + 10 - 212 + 216 seneca --seneca.log arguments tests: --seneca.log=level:warn+ - 6 + 7 - 213 + 217 seneca --seneca.log arguments tests: --seneca.log.level.warn 13 - 214 + 218 seneca --seneca.log arguments tests: --seneca.log.level.warn+ - 20 + 33 - 215 + 219 seneca --seneca.log arguments tests: duplicate param --seneca.log 25 - 216 + 220 seneca --seneca.log arguments tests: incorrect arg --seneca.log=level: - 10 + 14 - 217 + 221 seneca --seneca.log arguments tests: incorrect arg --seneca.log.level.abc - 16 + 20 - 218 + 222 seneca --seneca.log arguments tests: incorrect arg --seneca.log.abc - 6 + 7 - 219 + 223 seneca --seneca.log aliases tests: --seneca.log.quiet - 20 + 19 - 220 + 224 seneca --seneca.log aliases tests: --seneca.log.silent - 15 + 14 - 221 + 225 seneca --seneca.log aliases tests: --seneca.log.all 17 - 222 + 226 seneca --seneca.log aliases tests: --seneca.log.any 16 - 223 + 227 seneca --seneca.log aliases tests: --seneca.log.print 20 - 224 + 228 seneca --seneca.log aliases tests: --seneca.log.test - 15 + 20 - 225 + 229 seneca --seneca.log aliases tests: --seneca.log.standard - 17 + 16 - 226 + 230 seneca --seneca.log aliases tests: --seneca.log.level.quiet - 17 + 14 - 227 + 231 seneca --seneca.log aliases tests: --seneca.log.level.silent - 15 + 28 - 228 + 232 seneca --seneca.log aliases tests: --seneca.log.level.all 18 - 229 + 233 seneca --seneca.log aliases tests: --seneca.log.level.any 15 - 230 + 234 seneca --seneca.log aliases tests: --seneca.log.level.print - 19 + 21 - 231 + 235 seneca --seneca.log aliases tests: --seneca.log.level.test - 15 + 19 - 232 + 236 seneca --seneca.log aliases tests: --seneca.log.level.standard - 16 + 14 - 233 + 237 seneca happy - 36 + 35 - 234 + 238 seneca require-abbrev - 241 + 247 - 235 + 239 seneca version - 6 + 10 - 236 + 240 seneca tag - 6 + 9 - 237 + 241 seneca json-inspect - 11 + 16 - 238 + 242 seneca quick - 38 + 77 - 239 + 243 seneca happy-error - 18 + 37 - 240 + 244 seneca errhandler 110 - 241 + 245 seneca action-basic - 20 + 18 - 242 + 246 seneca action-callback-instance - 18 + 14 - 243 + 247 seneca action-act-invalid-args - 20 + 18 - 244 + 248 seneca action-default - 13 + 21 - 245 + 249 seneca action-override - 125 + 126 - 246 + 250 seneca action-callback-args - 14 + 17 - 247 + 251 seneca action-extend - 125 + 128 - 248 + 252 seneca prior-nocache - 350 + 347 - 249 + 253 seneca gating - 120 + 124 - 250 + 254 seneca act_if - 30 + 33 - 251 + 255 seneca loading-plugins - 145 + 155 - 252 + 256 seneca fire-and-forget - 8 + 12 - 253 + 257 seneca strargs - 30 + 40 - 254 + 258 seneca string-add - 23 + 19 - 255 + 259 seneca fix-basic - 6 + 11 - 256 + 260 seneca act-history - 66 + 58 - 257 + 261 seneca wrap - 64 + 47 - 258 + 262 seneca meta - 28 + 25 - 259 + 263 seneca strict-result - 8 + 9 - 260 + 264 seneca add-noop - 20 + 16 - 261 + 265 seneca supports jsonic params to has - 6 + 9 - 262 + 266 seneca supports a function to trace actions - 26 + 33 - 263 + 267 seneca supports true to be passed as trace action option - 13 + 21 - 264 + 268 seneca strict-find-false - 20 + 29 - 265 + 269 seneca strict-find-true - 15 + 23 - 266 + 270 seneca strict-find-default - 13 + 75 - 267 + 271 seneca catchall-pattern - 122 + 155 - 268 + 272 seneca memory - 363 + 355 - 269 + 273 seneca use-shortcut - 19 + 22 - 270 + 274 seneca status-log - 18 + 15 - 271 + 275 seneca reply-seneca - 123 + 122 - 272 + 276 seneca pattern-types 125 - 273 + 277 seneca order - 8 + 10 - 274 + 278 seneca #decorate can add a property to seneca - 6 + 7 - 275 + 279 seneca #decorate cannot override core property - 15 + 17 - 276 + 280 seneca #decorate cannot overwrite a decorated property - 64 + 17 - 277 + 281 seneca #decorate cannot prefix a property with an underscore - 27 + 14 - 278 + 282 seneca #intercept intercept - 71 + 34 - 279 + 283 sequence single-add-act - 14 + 20 - 280 + 284 sequence double-add-act - 20 + 21 - 281 + 285 sequence single-add-act-ready 120 - 282 + 286 sequence single-add-act-gate-action - 17 + 20 - 283 + 287 sequence single-add-act-gate-instance - 16 + 23 - 284 + 288 smoke seneca-smoke - 18 + 31 - 285 + 289 options options-happy - 122 + 126 - 286 + 290 options options-getset - 123 + 126 - 287 + 291 options options-legacy - 121 + 123 - 288 + 292 options options-file-js - 124 + 125 - 289 + 293 options legacy-options-file-js - 121 + 125 - 290 + 294 options options-file-json - 120 + 124 - 291 + 295 options options-file-json-nomore - 119 + 122 - 292 + 296 options options-env - 125 + 124 - 293 + 297 options options-cmdline - 121 + 124 - 294 + 298 sub happy-sub - 20 + 25 - 295 + 299 sub inwards-outwards-sub 34 - 296 + 300 sub specific-sub - 20 + 70 - 297 + 301 sub error-sub - 16 + 31 - 298 + 302 sub mixed-sub - 31 + 36 - 299 + 303 sub sub-prior - 122 + 133 - 300 + 304 sub sub-close - 120 + 124 - 301 + 305 sub sub-fix - 17 + 19 - 302 + 306 timeout happy - 123 + 126 - 303 + 307 timeout error-handler - 122 + 121 - 304 + 308 timeout should accept a timeout value from options - 236 + 239 - 305 + 309 transport happy-nextgen - 383 + 390 - 306 + 310 transport config-legacy-nextgen - 481 + 484 - 307 + 311 transport error-nextgen - 365 + 368 - 308 + 312 transport interop-nextgen - 280 + 277 - 309 + 313 transport config-nextgen - 511 + 508 - 310 + 314 transport nextgen-transport-local-override - 366 + 376 - 311 + 315 transport nextgen-meta - 368 + 378 - 312 + 316 transport nextgen-ordering - 481 + 485 - 313 + 317 transport transport-exact-single - 162 + 172 - 314 + 318 transport transport-local-override - 148 + 156 - 315 + 319 transport transport-star - 273 + 276 - 316 + 320 transport transport-star-pin-object - 276 + 286 - 317 + 321 transport transport-single-notdef - 164 + 165 - 318 + 322 transport transport-pins-notdef - 175 + 177 - 319 + 323 transport transport-single-wrap-and-star - 294 + 300 - 320 + 324 transport transport-local-single-and-star - 273 + 280 - 321 + 325 transport transport-local-over-wrap - 241 + 247 - 322 + 326 transport transport-local-prior-wrap - 162 + 168 - 323 + 327 transport transport-init-ordering 242 - 324 + 328 transport transport-no-plugin-init - 279 + 284 - 325 + 329 transport transport-balance-exact - 898 + 916 - 326 + 330 transport multi-layer-error - 718 + 719 - 327 + 331 transport server can be restarted without issues to clients - 601 + 624 - 328 + 332 transport transport-listen supports-null-options 128 - 329 + 333 transport transport-listen supports type as tcp option 123 - 330 + 334 transport transport-listen supports type as http option - 127 + 126 - 331 + 335 transport transport-listen supports the port number as an argument - 121 + 127 - 332 + 336 transport transport-listen supports the port number and host as an argument - 122 + 125 - 333 + 337 transport transport-listen supports the port number, host, and path as an argument - 123 + 131 - 334 + 338 transport transport-listen action-error - 121 + 123 - 335 + 339 transport client() supports null options - 120 + 125 - 336 + 340 util seneca.util.deepextend.happy - 0 + 1 - 337 + 341 util seneca.util.deepextend.types with new - 1 + 2 - 338 + 342 util seneca.util.deepextend.types 2 - 339 + 343 util seneca.util.deepextend.mixed 2 - 340 + 344 util seneca.util.deepextend.entity - 3 + 0 - 341 + 345 xward happy-inward - 12 + 18 - 342 + 346 xward happy-outward - 15 + 17 @@ -3107,10 +3137,10 @@

    Test Report

    Code Coverage Report

    -
    91.18%
    -
    4727
    -
    4310
    -
    417
    +
    91.53%
    +
    4747
    +
    4345
    +
    402
    @@ -4915,13 +4945,13 @@

    seneca.js

    297 - 376 + 379 Events.EventEmitter.call(this) 298 - 376 + 379 this.setMaxListeners(0) @@ -5107,7 +5137,7 @@

    seneca.js

    329 - 376 + 379 initial_opts.deathdelay = initial_opts.death_delay @@ -5119,13 +5149,13 @@

    seneca.js

    331 - 376 + 379 var seneca = make_seneca(initial_opts) 332 - 374 + 377 var options = seneca.options() @@ -5149,7 +5179,7 @@

    seneca.js

    336 - 374 + 377 seneca.log.debug({ kind: 'notice', options: { ...options, internal: null } }) @@ -5161,7 +5191,7 @@

    seneca.js

    338 - 374 + 377 Print.print_options(seneca, options) @@ -5179,13 +5209,13 @@

    seneca.js

    341 - 374 + 377 if (options.legacy.transport && options.default_plugins.transport) { 342 - 309 + 311 seneca.use(require('seneca-transport')) @@ -5209,19 +5239,19 @@

    seneca.js

    346 - 374 + 377 options.plugins = null == options.plugins ? {} : options.plugins 347 - 374 + 377 var pluginkeys = Object.keys(options.plugins) 348 - 374 + 377 for (var pkI = 0; pkI < pluginkeys.length; pkI++) { @@ -5287,7 +5317,7 @@

    seneca.js

    359 - 374 + 377 seneca.ready(function () { @@ -5311,7 +5341,7 @@

    seneca.js

    363 - 374 + 377 return seneca @@ -5533,13 +5563,13 @@

    seneca.js

    400 - 376 + 379 var private$ = make_private() 401 - 376 + 379 private$.error = error @@ -5557,7 +5587,7 @@

    seneca.js

    404 - 376 + 379 var root$ = new Seneca() @@ -5575,7 +5605,7 @@

    seneca.js

    407 - 376 + 379 root$.private$ = private$ @@ -5593,13 +5623,13 @@

    seneca.js

    410 - 376 + 379 private$.optioner = Options(module, option_defaults, initial_opts) 411 - 376 + 379 var start_opts = private$.optioner.get() @@ -5617,7 +5647,7 @@

    seneca.js

    414 - 376 + 379 private$.print = { @@ -5653,7 +5683,7 @@

    seneca.js

    420 - 376 + 379 private$.actrouter = start_opts.internal.actrouter || Patrun({ gex: true }) @@ -5665,13 +5695,13 @@

    seneca.js

    422 - 376 + 379 var soi_subrouter = start_opts.internal.subrouter || {} 423 - 376 + 379 private$.subrouter = { @@ -5713,13 +5743,13 @@

    seneca.js

    430 - 376 + 379 var event_names = ['log', 'act_in', 'act_out', 'act_err', 'ready', 'close'] 431 - 376 + 379 event_names.forEach(function (event_name) { @@ -5761,13 +5791,13 @@

    seneca.js

    438 - 376 + 379 private$.actnid = Nid({ length: start_opts.idlen }) 439 - 376 + 379 private$.didnid = Nid({ length: start_opts.didlen }) @@ -5785,7 +5815,7 @@

    seneca.js

    442 - 376 + 379 private$.next_action_id = Common.autoincr() @@ -5797,7 +5827,7 @@

    seneca.js

    444 - 376 + 379 var callpoint = (private$.callpoint = make_callpoint( @@ -5827,19 +5857,19 @@

    seneca.js

    449 - 376 + 379 root$.start_time = Date.now() 450 - 376 + 379 root$.context = {} 451 - 376 + 379 root$.version = Package.version @@ -5857,7 +5887,7 @@

    seneca.js

    454 - 376 + 379 root$.fixedargs = {} @@ -5869,7 +5899,7 @@

    seneca.js

    456 - 376 + 379 root$.flags = { @@ -5893,7 +5923,7 @@

    seneca.js

    460 - 376 + 379 Object.defineProperty(root$, 'root', { value: root$ }) @@ -5905,7 +5935,7 @@

    seneca.js

    462 - 376 + 379 private$.history = Common.history(start_opts.history) @@ -5917,7 +5947,7 @@

    seneca.js

    464 - 376 + 379 const ready = Ready(root$) @@ -5929,7 +5959,7 @@

    seneca.js

    466 - 376 + 379 root$.order = {} @@ -5947,13 +5977,13 @@

    seneca.js

    469 - 376 + 379 const api_use = Use.api_use(callpoint) 470 - 376 + 379 root$.order.plugin = api_use.ordu @@ -5971,169 +6001,169 @@

    seneca.js

    473 - 376 + 379 root$.toString = API.toString 474 - 376 + 379 root$.has = API.has // True if the given pattern has an action. 475 - 376 + 379 root$.find = API.find // Find the action definition for a pattern. 476 - 376 + 379 root$.list = API.list // List the patterns added to this instance. 477 - 376 + 379 root$.status = API.status // Get the status if this instance. 478 - 376 + 379 root$.reply = API.reply // Reply to a submitted message. 479 - 376 + 379 root$.sub = Sub.api_sub // Subscribe to messages. 480 - 376 + 379 root$.list_plugins = API.list_plugins // List the registered plugins. 481 - 376 + 379 root$.find_plugin = API.find_plugin // Find the plugin definition. 482 - 376 + 379 root$.has_plugin = API.has_plugin // True if the plugin is registered. 483 - 376 + 379 root$.ignore_plugin = API.ignore_plugin // Ignore plugin and don't register it. 484 - 376 + 379 root$.listen = API.listen(callpoint) // Listen for inbound messages. 485 - 376 + 379 root$.client = API.client(callpoint) // Send outbound messages. 486 - 376 + 379 root$.gate = API.gate // Create a delegate that executes actions in sequence. 487 - 376 + 379 root$.ungate = API.ungate // Execute actions in parallel. 488 - 376 + 379 root$.translate = API.translate // Translate message to new pattern. 489 - 376 + 379 root$.ping = API.ping // Generate ping response. 490 - 376 + 379 root$.use = api_use.use // Define and load a plugin. 491 - 376 + 379 root$.test = API.test // Set test mode. 492 - 376 + 379 root$.quiet = API.quiet // Convenience method to set logging level to `warn+`. 493 - 376 + 379 root$.export = API.export // Export plain objects from a plugin. 494 - 376 + 379 root$.depends = API.depends // Check for plugin dependencies. 495 - 376 + 379 root$.delegate = API.delegate // Create an action-specific Seneca instance. 496 - 376 + 379 root$.prior = API.prior // Call the previous action definition for message pattern. 497 - 376 + 379 root$.inward = API.inward // Add a modifier function for messages inward 498 - 376 + 379 root$.outward = API.outward // Add a modifier function for responses outward 499 - 376 + 379 root$.error = API.error // Set global error handler, or generate Seneca Error 500 - 376 + 379 root$.fail = start_opts.legacy.fail @@ -6151,61 +6181,61 @@

    seneca.js

    503 - 376 + 379 root$.explain = API.explain // Toggle top level explain capture 504 - 376 + 379 root$.decorate = API.decorate // Decorate seneca object with functions 505 - 376 + 379 root$.seneca = API.seneca 506 - 376 + 379 root$.close = API.close(callpoint) // Close and shutdown plugins. 507 - 376 + 379 root$.options = API.options // Get and set options. 508 - 376 + 379 root$.fix = API.fix // fix pattern arguments, message arguments, and custom meta 509 - 376 + 379 root$.wrap = API.wrap // wrap each found pattern with a new action 510 - 376 + 379 root$.add = Add.api_add // Add a pattern an associated action. 511 - 376 + 379 root$.act = Act.api_act // Submit a message and trigger the associated action. 512 - 376 + 379 root$.ready = ready.api_ready // Callback when plugins initialized. @@ -6217,7 +6247,7 @@

    seneca.js

    514 - 376 + 379 root$.internal = function() { @@ -6295,55 +6325,55 @@

    seneca.js

    527 - 376 + 379 root$.findact = root$.find 528 - 376 + 379 root$.plugins = API.list_plugins 529 - 376 + 379 root$.findplugin = API.find_plugin 530 - 376 + 379 root$.hasplugin = API.has_plugin 531 - 376 + 379 root$.hasact = Legacy.hasact 532 - 376 + 379 root$.act_if = Legacy.act_if 533 - 376 + 379 root$.findpins = Legacy.findpins 534 - 376 + 379 root$.pinact = Legacy.findpins 535 - 376 + 379 root$.next_act = Legacy.next_act @@ -6361,7 +6391,7 @@

    seneca.js

    538 - 376 + 379 root$.idgen = Nid({ length: start_opts.idlen }) @@ -6379,7 +6409,7 @@

    seneca.js

    541 - 376 + 379 start_opts.tag = null != start_opts.tag ? start_opts.tag : option_defaults.tag @@ -6397,7 +6427,7 @@

    seneca.js

    544 - 376 + 379 root$.id = @@ -6475,7 +6505,7 @@

    seneca.js

    557 - 376 + 379 root$.tag = start_opts.tag @@ -6523,7 +6553,7 @@

    seneca.js

    565 - 376 + 379 root$.fullname = 'Seneca/' + root$.id @@ -6535,7 +6565,7 @@

    seneca.js

    567 - 376 + 379 root$.die = Common.makedie(root$, { @@ -6583,7 +6613,7 @@

    seneca.js

    575 - 376 + 379 root$.util = seneca_util @@ -6595,13 +6625,13 @@

    seneca.js

    577 - 376 + 379 private$.exports = { options: start_opts } 578 - 376 + 379 private$.decorations = {} @@ -6625,7 +6655,7 @@

    seneca.js

    582 - 376 + 379 root$.on('error', root$.die) @@ -6637,7 +6667,7 @@

    seneca.js

    584 - 376 + 379 private$.ge = GateExecutor({ @@ -6763,7 +6793,7 @@

    seneca.js

    605 - 376 + 379 private$.timestats = new Stats.NamedStats( @@ -6841,13 +6871,13 @@

    seneca.js

    618 - 376 + 379 private$.plugin_order = { byname: [], byref: [] } 619 - 376 + 379 private$.use = UsePlugin({ @@ -6901,7 +6931,7 @@

    seneca.js

    628 - 376 + 379 private$.action_modifiers = [ @@ -6955,7 +6985,7 @@

    seneca.js

    637 - 376 + 379 private$.sub = { handler: null, tracers: [] } @@ -6967,7 +6997,7 @@

    seneca.js

    639 - 376 + 379 private$.inward = LegacyOrdu({ name: 'inward' }) @@ -7057,7 +7087,7 @@

    seneca.js

    654 - 376 + 379 private$.outward = LegacyOrdu({ name: 'outward' }) @@ -7147,7 +7177,7 @@

    seneca.js

    669 - 376 + 379 if (start_opts.logger && 'object' === typeof start_opts.logger) { @@ -7177,13 +7207,13 @@

    seneca.js

    674 - 376 + 379 var logspec = private$.logging.build_log(root$) 675 - 374 + 377 start_opts = private$.exports.options = private$.optioner.set({ @@ -7207,7 +7237,7 @@

    seneca.js

    679 - 374 + 377 if (start_opts.test) { @@ -7231,7 +7261,7 @@

    seneca.js

    683 - 374 + 377 if (start_opts.quiet) { @@ -7255,7 +7285,7 @@

    seneca.js

    687 - 374 + 377 private$.exit_close = function () { @@ -7315,7 +7345,7 @@

    seneca.js

    697 - 374 + 377 Actions(root$) @@ -7327,13 +7357,13 @@

    seneca.js

    699 - 374 + 377 if (!start_opts.legacy.transport) { 700 - 64 + 65 start_opts.legacy.error = false @@ -7351,7 +7381,7 @@

    seneca.js

    703 - 64 + 65 start_opts.transport = root$.util.deepextend( @@ -7411,7 +7441,7 @@

    seneca.js

    713 - 64 + 65 Transport(root$) @@ -7429,7 +7459,7 @@

    seneca.js

    716 - 374 + 377 Print(root$, start_opts.debug.argv || process.argv) @@ -7441,7 +7471,7 @@

    seneca.js

    718 - 374 + 377 Common.each(start_opts.system.close_signals, function (active, signal) { @@ -7477,7 +7507,7 @@

    seneca.js

    724 - 374 + 377 return root$ @@ -7507,7 +7537,7 @@

    seneca.js

    729 - 376 + 379 return { @@ -7645,7 +7675,7 @@

    seneca.js

    752 - 376 + 379 return function callpoint(override) { @@ -7657,7 +7687,7 @@

    seneca.js

    754 - 8080 + 8137 return error.callpoint(new Error(), [ @@ -7693,7 +7723,7 @@

    seneca.js

    760 - 10282 + 10344 return void 0 @@ -7811,13 +7841,13 @@

    lib/act.js

    12 - 2817 + 2827 for (var l = 0; l < argsarr.length; ++l) { 13 - 6247 + 6262 argsarr[l] = arguments[l] @@ -7835,31 +7865,31 @@

    lib/act.js

    16 - 2817 + 2827 var self = this 17 - 2817 + 2827 var opts = self.options() 18 - 2817 + 2827 var spec = Common.build_message(self, argsarr, 'reply:f?', self.fixedargs) 19 - 2816 + 2826 var msg = spec.msg 20 - 2816 + 2826 var reply = spec.reply @@ -7877,7 +7907,7 @@

    lib/act.js

    23 - 807 + 815 msg.caller$ = @@ -7931,13 +7961,13 @@

    lib/act.js

    32 - 2816 + 2826 intern.do_act(self, opts, msg, reply) 33 - 2816 + 2826 return self @@ -7979,13 +8009,13 @@

    lib/act.js

    40 - 2816 + 2826 var actmsg = intern.make_actmsg(origmsg) 41 - 2816 + 2826 var meta = new intern.Meta(instance, opts, origmsg, origreply) @@ -7997,7 +8027,7 @@

    lib/act.js

    43 - 2816 + 2826 if (meta.gate) { @@ -8027,7 +8057,7 @@

    lib/act.js

    48 - 2816 + 2826 var actctxt = { @@ -8075,7 +8105,7 @@

    lib/act.js

    56 - 2816 + 2826 var execspec = {} @@ -8087,7 +8117,7 @@

    lib/act.js

    58 - 2816 + 2826 execspec.dn = meta.id @@ -8099,7 +8129,7 @@

    lib/act.js

    60 - 2816 + 2826 execspec.fn = function act_fn(done) { @@ -8111,7 +8141,7 @@

    lib/act.js

    62 - 2816 + 2826 intern.execute_action( @@ -8165,7 +8195,7 @@

    lib/act.js

    71 - 2788 + 2798 intern.handle_reply(meta, actctxt, actmsg, err, out, reply_meta) @@ -8177,7 +8207,7 @@

    lib/act.js

    73 - 2790 + 2800 done() @@ -8237,7 +8267,7 @@

    lib/act.js

    83 - 2816 + 2826 execspec.ontm = function act_tm(timeout, start, end) { @@ -8339,7 +8369,7 @@

    lib/act.js

    100 - 2816 + 2826 execspec.tm = meta.timeout @@ -8351,7 +8381,7 @@

    lib/act.js

    102 - 2816 + 2826 instance.private$.ge.add(execspec) @@ -8387,7 +8417,7 @@

    lib/act.js

    108 - 2817 + 2827 if (actmsg.id$) { @@ -8411,13 +8441,13 @@

    lib/act.js

    112 - 2817 + 2827 if (actmsg.caller$) { 113 - 808 + 816 delete actmsg.caller$ @@ -8435,7 +8465,7 @@

    lib/act.js

    116 - 2817 + 2827 if (actmsg.meta$) { @@ -8459,7 +8489,7 @@

    lib/act.js

    120 - 2817 + 2827 if (actmsg.prior$) { @@ -8483,7 +8513,7 @@

    lib/act.js

    124 - 2817 + 2827 if (actmsg.parents$) { @@ -8513,7 +8543,7 @@

    lib/act.js

    129 - 2817 + 2827 if (origmsg.transport$) { @@ -8537,7 +8567,7 @@

    lib/act.js

    133 - 2817 + 2827 return actmsg @@ -8573,7 +8603,7 @@

    lib/act.js

    139 - 2816 + 2826 var origmeta = origmsg.meta$ @@ -8591,7 +8621,7 @@

    lib/act.js

    142 - 2816 + 2826 var fixedmeta = instance.fixedmeta || {} @@ -8603,25 +8633,25 @@

    lib/act.js

    144 - 2816 + 2826 this.start = Date.now() 145 - 2816 + 2826 this.end = null 146 - 2816 + 2826 this.pattern = null 147 - 2816 + 2826 this.action = null @@ -8633,19 +8663,19 @@

    lib/act.js

    149 - 2816 + 2826 this.mi = id_tx[0] 150 - 2816 + 2826 this.tx = id_tx[1] 151 - 2816 + 2826 this.id = id_tx[0] + '/' + id_tx[1] @@ -8657,25 +8687,25 @@

    lib/act.js

    153 - 2816 + 2826 this.instance = instance.id 154 - 2816 + 2826 this.tag = instance.tag 155 - 2816 + 2826 this.seneca = instance.version 156 - 2816 + 2826 this.version = '0.1.0' @@ -8687,19 +8717,19 @@

    lib/act.js

    158 - 2816 + 2826 this.gate = !!origmsg.gate$ || fixedmeta.gate 159 - 2816 + 2826 this.fatal = !!origmsg.fatal$ || fixedmeta.fatal 160 - 2816 + 2826 this.local = !!origmsg.local$ || fixedmeta.local @@ -8723,7 +8753,7 @@

    lib/act.js

    164 - 2816 + 2826 this.timeout = Math.max( @@ -8795,25 +8825,25 @@

    lib/act.js

    176 - 2816 + 2826 this.plugin = origmsg.plugin$ 177 - 2816 + 2826 this.prior = origmsg.prior$ 178 - 2816 + 2826 this.caller = origmsg.caller$ 179 - 2816 + 2826 this.parents = origmsg.parents$ @@ -8837,7 +8867,7 @@

    lib/act.js

    183 - 2816 + 2826 this.remote = !!origmsg.remote$ @@ -8849,7 +8879,7 @@

    lib/act.js

    185 - 2816 + 2826 this.sync = @@ -8891,43 +8921,43 @@

    lib/act.js

    192 - 2816 + 2826 this.trace = null 193 - 2816 + 2826 this.sub = null 194 - 2816 + 2826 this.data = null 195 - 2816 + 2826 this.err = null 196 - 2816 + 2826 this.err_trace = null 197 - 2816 + 2826 this.error = null 198 - 2816 + 2826 this.empty = null @@ -8975,7 +9005,7 @@

    lib/act.js

    206 - 2816 + 2826 id_tx[1] = @@ -9023,7 +9053,7 @@

    lib/act.js

    214 - 2816 + 2826 return id_tx @@ -9059,13 +9089,13 @@

    lib/act.js

    220 - 2808 + 2818 var delegate = actctxt.seneca 221 - 2808 + 2818 var reply = actctxt.reply @@ -9077,7 +9107,7 @@

    lib/act.js

    223 - 2808 + 2818 var data = { @@ -9137,25 +9167,25 @@

    lib/act.js

    233 - 2808 + 2818 actctxt.duration = meta.end - meta.start 234 - 2808 + 2818 actctxt.actlog = intern.actlog 235 - 2808 + 2818 actctxt.errlog = intern.errlog 236 - 2808 + 2818 actctxt.error = Common.error @@ -9167,7 +9197,7 @@

    lib/act.js

    238 - 2808 + 2818 meta.error = Util.isError(data.res) @@ -9185,7 +9215,7 @@

    lib/act.js

    241 - 2808 + 2818 if (!meta.error && data.res === data.err) { @@ -9215,7 +9245,7 @@

    lib/act.js

    246 - 2808 + 2818 if ( @@ -9281,7 +9311,7 @@

    lib/act.js

    257 - 2808 + 2818 intern.process_outward(actctxt, data, delegate) @@ -9293,19 +9323,19 @@

    lib/act.js

    259 - 2808 + 2818 if (data.has_callback) { 260 - 2803 + 2813 try { 261 - 2803 + 2813 reply.call(delegate, data.err, data.res, data.meta) @@ -9383,7 +9413,7 @@

    lib/act.js

    274 - 2813 + 2823 if (outward) { @@ -9623,7 +9653,7 @@

    lib/act.js

    314 - 2816 + 2826 var actdef = meta.prior @@ -9641,7 +9671,7 @@

    lib/act.js

    317 - 2816 + 2826 var delegate = intern.make_act_delegate(act_instance, opts, meta, actdef) @@ -9653,19 +9683,19 @@

    lib/act.js

    319 - 2816 + 2826 actctxt.seneca = delegate 320 - 2816 + 2826 actctxt.actdef = actdef 321 - 2816 + 2826 execspec.ctxt.pattern = actdef ? actdef.pattern : null @@ -9683,13 +9713,13 @@

    lib/act.js

    324 - 2816 + 2826 var data = { meta: meta, msg: msg, reply: reply } 325 - 2816 + 2826 var inward = private$.inward.process(actctxt, data) @@ -9701,7 +9731,7 @@

    lib/act.js

    327 - 2816 + 2826 if ( @@ -9755,7 +9785,7 @@

    lib/act.js

    336 - 434 + 439 return @@ -9779,7 +9809,7 @@

    lib/act.js

    340 - 2382 + 2387 delegate.log.debug( @@ -9833,19 +9863,19 @@

    lib/act.js

    349 - 2382 + 2387 data.id = data.meta.id 350 - 2382 + 2387 data.result = [] 351 - 2382 + 2387 data.timelimit = Date.now() + data.meta.timeout @@ -9863,7 +9893,7 @@

    lib/act.js

    354 - 2382 + 2387 private$.history.add(data) @@ -9905,7 +9935,7 @@

    lib/act.js

    361 - 2382 + 2387 actdef.func.call(delegate, data.msg, data.reply, data.meta) @@ -9935,7 +9965,7 @@

    lib/act.js

    366 - 2816 + 2826 actdef = actdef || {} @@ -9947,7 +9977,7 @@

    lib/act.js

    368 - 2816 + 2826 var delegate_args = { @@ -9995,7 +10025,7 @@

    lib/act.js

    376 - 2816 + 2826 var delegate = instance.delegate(delegate_args) @@ -10007,7 +10037,7 @@

    lib/act.js

    378 - 2816 + 2826 var parent_act = instance.private$.act || meta.parent @@ -10019,7 +10049,7 @@

    lib/act.js

    380 - 2816 + 2826 delegate.private$.act = { @@ -10067,7 +10097,7 @@

    lib/act.js

    388 - 2816 + 2826 delegate.fixedargs.tx$ = meta.tx @@ -10085,7 +10115,7 @@

    lib/act.js

    391 - 2816 + 2826 return delegate @@ -10109,7 +10139,7 @@

    lib/act.js

    395 - 2382 + 2387 if (!inward) return false @@ -10121,19 +10151,19 @@

    lib/act.js

    397 - 434 + 439 var msg = data.msg 398 - 434 + 439 var reply = data.reply 399 - 434 + 439 var meta = data.meta @@ -10145,7 +10175,7 @@

    lib/act.js

    401 - 434 + 439 if ('error' === inward.kind) { @@ -10361,7 +10391,7 @@

    lib/act.js

    437 - 417 + 422 act_instance.log[inward.log.level]( @@ -10391,13 +10421,13 @@

    lib/act.js

    442 - 417 + 422 reply.call(act_instance, null, inward.result) 443 - 417 + 422 return true @@ -10809,31 +10839,31 @@

    lib/actions.js

    10 - 374 + 377 instance.add({ role: 'seneca', cmd: 'ping' }, cmd_ping) 11 - 374 + 377 instance.add({ role: 'seneca', cmd: 'stats' }, instance.stats) 12 - 374 + 377 instance.add({ role: 'seneca', cmd: 'close' }, action_seneca_close) 13 - 374 + 377 instance.add({ role: 'seneca', info: 'fatal' }, action_seneca_fatal) 14 - 374 + 377 instance.add({ role: 'seneca', get: 'options' }, action_options_get) @@ -10875,7 +10905,7 @@

    lib/actions.js

    21 - 374 + 377 instance.add( @@ -10899,7 +10929,7 @@

    lib/actions.js

    25 - 374 + 377 instance.add( @@ -11019,7 +11049,7 @@

    lib/actions.js

    45 - 374 + 377 return function action_seneca_stats(msg, reply) { @@ -11359,19 +11389,19 @@

    lib/add.js

    8 - 7453 + 7505 var private$ = self.private$ 9 - 7453 + 7505 var opts = self.options() 10 - 7453 + 7505 var args = Common.parsePattern(self, arguments, 'action:f? actdef:o?') @@ -11383,13 +11413,13 @@

    lib/add.js

    12 - 7449 + 7501 var raw_pattern = args.pattern 13 - 7449 + 7501 var pattern = self.util.clean(raw_pattern) @@ -11401,7 +11431,7 @@

    lib/add.js

    15 - 7449 + 7501 var action = @@ -11449,7 +11479,7 @@

    lib/add.js

    23 - 7449 + 7501 actdef.raw = Common.deepextend({}, raw_pattern) @@ -11467,13 +11497,13 @@

    lib/add.js

    26 - 7449 + 7501 actdef.plugin_name = actdef.plugin_name || 'root$' 27 - 7449 + 7501 actdef.plugin_fullname = @@ -11515,7 +11545,7 @@

    lib/add.js

    34 - 7449 + 7501 actdef.plugin = { @@ -11551,7 +11581,7 @@

    lib/add.js

    40 - 7449 + 7501 var add_callpoint = private$.callpoint() @@ -11581,13 +11611,13 @@

    lib/add.js

    45 - 7449 + 7501 actdef.sub = !!raw_pattern.sub$ 46 - 7449 + 7501 actdef.client = !!raw_pattern.client$ @@ -11605,7 +11635,7 @@

    lib/add.js

    49 - 7449 + 7501 actdef.deprecate = raw_pattern.deprecate$ @@ -11617,13 +11647,13 @@

    lib/add.js

    51 - 7449 + 7501 actdef.fixed = self.util.Jsonic(raw_pattern.fixed$ || {}) 52 - 7449 + 7501 actdef.custom = self.util.Jsonic(raw_pattern.custom$ || {}) @@ -11635,7 +11665,7 @@

    lib/add.js

    54 - 7449 + 7501 var strict_add = @@ -11665,7 +11695,7 @@

    lib/add.js

    59 - 7449 + 7501 var addroute = true @@ -11677,7 +11707,7 @@

    lib/add.js

    61 - 7449 + 7501 if (opts.legacy.actdef) { @@ -11701,7 +11731,7 @@

    lib/add.js

    65 - 7449 + 7501 var action_name = @@ -11713,19 +11743,19 @@

    lib/add.js

    67 - 7449 + 7501 actdef.id = action_name + '_' + private$.next_action_id() 68 - 7449 + 7501 actdef.name = action_name 69 - 7449 + 7501 actdef.func = action @@ -11743,7 +11773,7 @@

    lib/add.js

    72 - 7449 + 7501 actdef.pattern = Common.pattern(pattern) @@ -11761,7 +11791,7 @@

    lib/add.js

    75 - 7449 + 7501 actdef.msgcanon = self.util.Jsonic(actdef.pattern) @@ -11773,7 +11803,7 @@

    lib/add.js

    77 - 7449 + 7501 var priordef = self.find(pattern) @@ -11785,7 +11815,7 @@

    lib/add.js

    79 - 7449 + 7501 if (priordef && strict_add && priordef.pattern !== actdef.pattern) { @@ -11821,7 +11851,7 @@

    lib/add.js

    85 - 7449 + 7501 if (priordef) { @@ -11917,7 +11947,7 @@

    lib/add.js

    101 - 7188 + 7240 actdef.priorpath = '' @@ -11935,7 +11965,7 @@

    lib/add.js

    104 - 7449 + 7501 if ('function' === typeof action.handle) { @@ -11959,7 +11989,7 @@

    lib/add.js

    108 - 7449 + 7501 private$.stats.actmap[actdef.pattern] = @@ -11977,13 +12007,13 @@

    lib/add.js

    111 - 7449 + 7501 var pattern_rules = {} 112 - 7449 + 7501 Common.each(raw_pattern, function (v, k) { @@ -12019,7 +12049,7 @@

    lib/add.js

    118 - 7449 + 7501 actdef.rules = pattern_rules @@ -12031,13 +12061,13 @@

    lib/add.js

    120 - 7449 + 7501 if (addroute) { 121 - 7445 + 7497 self.log.debug({ @@ -12085,7 +12115,7 @@

    lib/add.js

    129 - 7445 + 7497 private$.actrouter.add(pattern, actdef) @@ -12103,7 +12133,7 @@

    lib/add.js

    132 - 7449 + 7501 private$.actdef[actdef.id] = actdef @@ -12115,7 +12145,7 @@

    lib/add.js

    134 - 7449 + 7501 intern.deferred_modify_action(self, actdef) @@ -12127,7 +12157,7 @@

    lib/add.js

    136 - 7449 + 7501 return self @@ -12683,7 +12713,7 @@

    lib/api.js

    58 - 21930 + 22068 var private$ = self.private$ @@ -12695,13 +12725,13 @@

    lib/api.js

    60 - 21930 + 22068 if (null == options) { 61 - 20676 + 20800 return private$.optioner.get() @@ -12731,7 +12761,7 @@

    lib/api.js

    66 - 1254 + 1268 self.log.debug({ @@ -12773,7 +12803,7 @@

    lib/api.js

    73 - 1254 + 1268 var out_opts = (private$.exports.options = private$.optioner.set(options)) @@ -12785,7 +12815,7 @@

    lib/api.js

    75 - 1254 + 1268 if ('string' === typeof options.tag) { @@ -12845,19 +12875,19 @@

    lib/api.js

    85 - 1254 + 1268 if (options.log) { 86 - 238 + 241 var logspec = private$.logging.build_log(self) 87 - 238 + 241 out_opts = private$.exports.options = private$.optioner.set({ @@ -13199,13 +13229,13 @@

    lib/api.js

    144 - 67 + 68 this.options({ errhandler: first }) 145 - 67 + 68 return this @@ -13217,7 +13247,7 @@

    lib/api.js

    147 - 15 + 16 if (null == first) { @@ -13241,7 +13271,7 @@

    lib/api.js

    151 - 13 + 14 var plugin_fullname = @@ -13259,7 +13289,7 @@

    lib/api.js

    154 - 13 + 14 var plugin = @@ -13289,7 +13319,7 @@

    lib/api.js

    159 - 13 + 14 var error = null @@ -13313,7 +13343,7 @@

    lib/api.js

    163 - 10 + 11 error = Common.eraro.apply(this, arguments) @@ -13331,7 +13361,7 @@

    lib/api.js

    166 - 13 + 14 return error @@ -13673,13 +13703,13 @@

    lib/api.js

    223 - 3593 + 3608 var root = this.root 224 - 3593 + 3608 var opts = this.options() @@ -13691,13 +13721,13 @@

    lib/api.js

    226 - 3593 + 3608 fixedargs = fixedargs || {} 227 - 3593 + 3608 fixedmeta = fixedmeta || {} @@ -13709,7 +13739,7 @@

    lib/api.js

    229 - 3593 + 3608 var delegate = Object.create(self) @@ -13721,7 +13751,7 @@

    lib/api.js

    231 - 3593 + 3608 delegate.private$ = Object.create(self.private$) @@ -13733,7 +13763,7 @@

    lib/api.js

    233 - 3593 + 3608 delegate.did = @@ -13757,7 +13787,7 @@

    lib/api.js

    237 - 11886 + 11953 return root.log.apply(delegate, arguments) @@ -13775,13 +13805,13 @@

    lib/api.js

    240 - 3593 + 3608 Object.assign(delegate_log, root.log) 241 - 3593 + 3608 delegate_log.self = () => delegate @@ -13793,7 +13823,7 @@

    lib/api.js

    243 - 3593 + 3608 var strdesc @@ -13955,19 +13985,19 @@

    lib/api.js

    270 - 2119 + 2129 var args = Object.assign({}, delegate.fixedargs, further_fixedargs || {}) 271 - 2119 + 2129 var meta = Object.assign({}, delegate.fixedmeta, further_fixedmeta || {}) 272 - 2119 + 2129 return self.delegate.call(this, args, meta) @@ -13997,7 +14027,7 @@

    lib/api.js

    277 - 3593 + 3608 var delegate_context = Object.assign({}, self.context) @@ -14015,7 +14045,7 @@

    lib/api.js

    280 - 3593 + 3608 Object.defineProperties(delegate, { @@ -14069,7 +14099,7 @@

    lib/api.js

    289 - 3593 + 3608 return delegate @@ -14255,19 +14285,19 @@

    lib/api.js

    320 - 74 + 76 var private$ = this.private$ 321 - 74 + 76 var error = this.util.error 322 - 74 + 76 var opts = this.options() @@ -14309,7 +14339,7 @@

    lib/api.js

    329 - 74 + 76 var exportval = private$.exports[key] @@ -14345,7 +14375,7 @@

    lib/api.js

    335 - 73 + 75 return exportval @@ -14519,7 +14549,7 @@

    lib/api.js

    364 - 199 + 202 if ('-' != opts.tag) { @@ -14561,19 +14591,19 @@

    lib/api.js

    371 - 199 + 202 if ('function' !== typeof errhandler && null !== errhandler) { 372 - 54 + 55 logspec = errhandler 373 - 54 + 55 errhandler = null @@ -14603,7 +14633,7 @@

    lib/api.js

    378 - 199 + 202 var test_opts = { @@ -14651,7 +14681,7 @@

    lib/api.js

    386 - 199 + 202 var set_opts = this.options(test_opts) @@ -14669,7 +14699,7 @@

    lib/api.js

    389 - 199 + 202 if (set_opts.quiet) { @@ -14687,7 +14717,7 @@

    lib/api.js

    392 - 197 + 200 this.private$.logging.build_log(this) @@ -14711,13 +14741,13 @@

    lib/api.js

    396 - 197 + 200 if (!this.private$.logger.from_options$) { 397 - 184 + 187 this.root.private$.logger = this.private$.logging.test_logger @@ -14735,7 +14765,7 @@

    lib/api.js

    400 - 197 + 200 return this @@ -15407,19 +15437,19 @@

    lib/api.js

    512 - 10198 + 10260 var pat = 'string' === typeof pattern ? Jsonic(pattern) : pattern 513 - 10198 + 10260 pat = seneca.util.clean(pat) 514 - 10198 + 10260 pat = pat || {} @@ -15431,7 +15461,7 @@

    lib/api.js

    516 - 10198 + 10260 var actdef = seneca.private$.actrouter.find(pat, flags && flags.exact) @@ -15443,13 +15473,13 @@

    lib/api.js

    518 - 10198 + 10260 if (!actdef) { 519 - 7622 + 7679 actdef = seneca.private$.actrouter.find({}) @@ -15467,7 +15497,7 @@

    lib/api.js

    522 - 10198 + 10260 return actdef @@ -16260,7 +16290,7 @@

    lib/api.js

    654 43 - var task_res = self.order.plugin.task.delegate({ + var task_res = self.order.plugin.task.delegate.exec({ 655 @@ -18057,13 +18087,13 @@

    lib/common.js

    54 - 1422 + 1437 var name = null == plugin.name ? plugin : plugin.name 55 - 1422 + 1437 var tag = null == plugin.tag ? (null == origtag ? '' : origtag) : plugin.tag @@ -18099,7 +18129,7 @@

    lib/common.js

    61 - 1422 + 1437 if ('number' === typeof tag) { @@ -18123,7 +18153,7 @@

    lib/common.js

    65 - 1422 + 1437 if ('' == name || 'string' !== typeof name) { @@ -18147,13 +18177,13 @@

    lib/common.js

    69 - 1420 + 1435 var m = name.match(/^([a-zA-Z@][a-zA-Z0-9.~_\-/]*)\$([a-zA-Z0-9.~_-]+)$/) 70 - 1420 + 1435 if (m) { @@ -18189,7 +18219,7 @@

    lib/common.js

    76 - 1420 + 1435 if (!name.match(/^(\.|\/|\\|\w:)/)) { @@ -18201,7 +18231,7 @@

    lib/common.js

    78 - 1414 + 1429 if (!name.match(/^[a-zA-Z@][a-zA-Z0-9.~_\-/]*$/) || 1024 < name.length) { @@ -18231,7 +18261,7 @@

    lib/common.js

    83 - 1418 + 1433 if ('' != tag && (!tag.match(/^[a-zA-Z0-9.~_-]+$/) || 1024 < tag.length)) { @@ -18255,7 +18285,7 @@

    lib/common.js

    87 - 1416 + 1431 var key = name + (tag ? '$' + tag : '') @@ -18267,7 +18297,7 @@

    lib/common.js

    89 - 1416 + 1431 return key @@ -18297,7 +18327,7 @@

    lib/common.js

    94 - 630 + 636 return !!JSON.parse(v) @@ -18363,13 +18393,13 @@

    lib/common.js

    105 - 10427 + 10489 try { 106 - 10427 + 10489 return null == str ? null : Jsonic(str) @@ -18525,7 +18555,7 @@

    lib/common.js

    132 - 7478 + 7530 args.pattern = Object.assign( @@ -18573,7 +18603,7 @@

    lib/common.js

    140 - 7477 + 7529 return args @@ -18663,7 +18693,7 @@

    lib/common.js

    155 - 2945 + 2955 args.msg = Object.assign( @@ -18711,7 +18741,7 @@

    lib/common.js

    163 - 2944 + 2954 return args @@ -19005,13 +19035,13 @@

    lib/common.js

    212 - 7576 + 7628 patobj = patobj || {} 213 - 7576 + 7628 var sb = [] @@ -19023,7 +19053,7 @@

    lib/common.js

    215 - 7576 + 7628 Object.keys(patobj).forEach((k) => { @@ -19035,13 +19065,13 @@

    lib/common.js

    217 - 18757 + 18894 if (!~k.indexOf('$') && 'function' != typeof v && 'object' != typeof v) { 218 - 18749 + 18886 sb.push(k + ':' + v) @@ -19065,7 +19095,7 @@

    lib/common.js

    222 - 7576 + 7628 sb.sort() @@ -19077,7 +19107,7 @@

    lib/common.js

    224 - 7576 + 7628 return sb.join(',') @@ -19245,7 +19275,7 @@

    lib/common.js

    252 - 23507 + 23609 if (null == obj) return obj @@ -19257,7 +19287,7 @@

    lib/common.js

    254 - 23501 + 23603 var out = Array.isArray(obj) ? [] : {} @@ -19269,19 +19299,19 @@

    lib/common.js

    256 - 23501 + 23603 var pn = Object.getOwnPropertyNames(obj) 257 - 23501 + 23603 for (var i = 0; i < pn.length; i++) { 258 - 77299 + 77583 var p = pn[i] @@ -19293,13 +19323,13 @@

    lib/common.js

    260 - 77299 + 77583 if ('$' != p[p.length - 1]) { 261 - 63416 + 63698 out[p] = obj[p] @@ -19347,7 +19377,7 @@

    lib/common.js

    269 - 23501 + 23603 return out @@ -19389,7 +19419,7 @@

    lib/common.js

    276 - 27240 + 27440 argsarr = argsarr.reverse() @@ -19413,7 +19443,7 @@

    lib/common.js

    280 - 27240 + 27440 argsarr.unshift({}) @@ -19425,7 +19455,7 @@

    lib/common.js

    282 - 27240 + 27440 return DefaultsDeep.apply(null, argsarr) @@ -19659,7 +19689,7 @@

    lib/common.js

    321 - 15355 + 15462 Assert('function' === typeof func) @@ -19671,13 +19701,13 @@

    lib/common.js

    323 - 15355 + 15462 if (Array.isArray(collect)) { 324 - 7455 + 7507 return collect.forEach(func) @@ -19689,7 +19719,7 @@

    lib/common.js

    326 - 7900 + 7955 Object.keys(collect).forEach((k) => func(collect[k], k)) @@ -19731,7 +19761,7 @@

    lib/common.js

    333 - 882 + 890 var diecount = 0 @@ -19743,7 +19773,7 @@

    lib/common.js

    335 - 882 + 890 var die = function (err) { @@ -20919,7 +20949,7 @@

    lib/common.js

    531 - 882 + 890 die.context = ctxt @@ -20931,7 +20961,7 @@

    lib/common.js

    533 - 882 + 890 return die @@ -21003,13 +21033,13 @@

    lib/common.js

    545 - 5616 + 5636 var prior = callmeta.prior || {} 546 - 5616 + 5636 actdef = actdef || {} @@ -21021,7 +21051,7 @@

    lib/common.js

    548 - 5616 + 5636 return Object.assign( @@ -21351,7 +21381,7 @@

    lib/common.js

    603 - 752 + 758 return function () { @@ -21555,13 +21585,13 @@

    lib/common.js

    637 - 379 + 382 var self = this 638 - 379 + 382 opts = opts || {} @@ -21573,19 +21603,19 @@

    lib/common.js

    640 - 379 + 382 this._total = 0 641 - 379 + 382 this._list = [] 642 - 379 + 382 this._map = {} @@ -21597,13 +21627,13 @@

    lib/common.js

    644 - 379 + 382 if (opts.prune) { 645 - 376 + 379 this._prune_interval = setInterval(function () { @@ -21627,7 +21657,7 @@

    lib/common.js

    649 - 376 + 379 this._prune_interval.unref() @@ -21711,7 +21741,7 @@

    lib/common.js

    663 - 2398 + 2403 var i = this._list.length - 1 @@ -21723,13 +21753,13 @@

    lib/common.js

    665 - 2398 + 2403 if (i < 0 || this._list[i].timelimit <= obj.timelimit) { 666 - 2388 + 2393 this._list.push(obj) @@ -21783,13 +21813,13 @@

    lib/common.js

    675 - 55845 + 58265 var s = 0 676 - 55845 + 58265 var e = i @@ -21801,13 +21831,13 @@

    lib/common.js

    678 - 55845 + 58265 if (0 === this._list.length) { 679 - 7867 + 9278 return 0 @@ -21825,13 +21855,13 @@

    lib/common.js

    682 - 47978 + 48987 do { 683 - 99890 + 101921 i = Math.floor((s + e) / 2) @@ -21843,31 +21873,31 @@

    lib/common.js

    685 - 99890 + 101921 if (timelimit > this._list[i].timelimit) { 686 - 197 + 212 s = i + 1 687 - 197 + 212 i = s 688 - 99693 + 101709 } else if (timelimit < this._list[i].timelimit) { 689 - 99684 + 101699 e = i @@ -21879,13 +21909,13 @@

    lib/common.js

    691 - 9 + 10 i++ 692 - 9 + 10 break @@ -21909,7 +21939,7 @@

    lib/common.js

    696 - 47978 + 48987 return i @@ -21945,13 +21975,13 @@

    lib/common.js

    702 - 55835 + 58255 for (var j = 0; j < i; j++) { 703 - 378 + 401 delete this._map[this._list[j].id] @@ -21963,7 +21993,7 @@

    lib/common.js

    705 - 55835 + 58255 this._list = this._list.slice(i) @@ -22135,8 +22165,8 @@

    lib/common.js

    lib/errors.js

    100%
    -
    110
    -
    110
    +
    112
    +
    112
    0
    @@ -23036,61 +23066,61 @@

    lib/errors.js

    - + - + - + - + - + - + - + - - + + - + - + @@ -23101,19 +23131,43 @@

    lib/errors.js

    - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -23303,7 +23357,7 @@

    lib/inward.js

    - + @@ -23315,19 +23369,19 @@

    lib/inward.js

    - + - + - + @@ -23345,7 +23399,7 @@

    lib/inward.js

    - + @@ -23369,13 +23423,13 @@

    lib/inward.js

    - + - + @@ -23411,13 +23465,13 @@

    lib/inward.js

    - + - + @@ -23531,7 +23585,7 @@

    lib/inward.js

    - + @@ -23573,7 +23627,7 @@

    lib/inward.js

    - + @@ -23603,7 +23657,7 @@

    lib/inward.js

    - + @@ -23699,13 +23753,13 @@

    lib/inward.js

    - + - + @@ -23717,7 +23771,7 @@

    lib/inward.js

    - + @@ -23729,7 +23783,7 @@

    lib/inward.js

    - + @@ -23747,7 +23801,7 @@

    lib/inward.js

    - + @@ -23771,19 +23825,19 @@

    lib/inward.js

    - + - + - + @@ -23801,13 +23855,13 @@

    lib/inward.js

    - + - + @@ -23819,7 +23873,7 @@

    lib/inward.js

    - + @@ -23843,7 +23897,7 @@

    lib/inward.js

    - + @@ -23993,13 +24047,13 @@

    lib/inward.js

    - + - + @@ -24011,7 +24065,7 @@

    lib/inward.js

    - + @@ -24113,13 +24167,13 @@

    lib/inward.js

    - + - + @@ -24131,13 +24185,13 @@

    lib/inward.js

    - + - + @@ -24347,13 +24401,13 @@

    lib/inward.js

    - + - + @@ -24365,13 +24419,13 @@

    lib/inward.js

    - + - + @@ -24389,7 +24443,7 @@

    lib/inward.js

    - + @@ -24401,7 +24455,7 @@

    lib/inward.js

    - + @@ -24563,13 +24617,13 @@

    lib/inward.js

    - + - + @@ -24659,7 +24713,7 @@

    lib/inward.js

    - + @@ -24671,25 +24725,25 @@

    lib/inward.js

    - + - + - + - + @@ -24701,7 +24755,7 @@

    lib/inward.js

    - + @@ -24767,7 +24821,7 @@

    lib/inward.js

    - + @@ -24797,7 +24851,7 @@

    lib/inward.js

    - + @@ -24887,7 +24941,7 @@

    lib/inward.js

    - + @@ -24929,7 +24983,7 @@

    lib/inward.js

    - + @@ -24941,7 +24995,7 @@

    lib/inward.js

    - + @@ -24953,13 +25007,13 @@

    lib/inward.js

    - + - + @@ -24971,7 +25025,7 @@

    lib/inward.js

    - + @@ -24989,7 +25043,7 @@

    lib/inward.js

    - + @@ -25037,7 +25091,7 @@

    lib/inward.js

    - + @@ -25079,7 +25133,7 @@

    lib/inward.js

    - + @@ -25103,13 +25157,13 @@

    lib/inward.js

    - + - + @@ -25145,13 +25199,13 @@

    lib/inward.js

    - + - + @@ -25169,7 +25223,7 @@

    lib/inward.js

    - + @@ -25193,7 +25247,7 @@

    lib/inward.js

    - + @@ -25217,7 +25271,7 @@

    lib/inward.js

    - + @@ -25229,7 +25283,7 @@

    lib/inward.js

    - + @@ -25241,7 +25295,7 @@

    lib/inward.js

    - + @@ -26791,7 +26845,7 @@

    lib/logging.js

    - + @@ -26851,7 +26905,7 @@

    lib/logging.js

    - + @@ -27283,19 +27337,19 @@

    lib/logging.js

    - + - + - + @@ -27349,7 +27403,7 @@

    lib/logging.js

    - + @@ -27361,7 +27415,7 @@

    lib/logging.js

    - + @@ -27391,7 +27445,7 @@

    lib/logging.js

    - + @@ -27421,7 +27475,7 @@

    lib/logging.js

    - + @@ -27475,7 +27529,7 @@

    lib/logging.js

    - + @@ -27505,13 +27559,13 @@

    lib/logging.js

    - + - + @@ -27529,7 +27583,7 @@

    lib/logging.js

    - + @@ -27565,7 +27619,7 @@

    lib/logging.js

    - + @@ -27589,13 +27643,13 @@

    lib/logging.js

    - + - + @@ -27613,7 +27667,7 @@

    lib/logging.js

    - + @@ -27649,19 +27703,19 @@

    lib/logging.js

    - + - + - + @@ -27679,7 +27733,7 @@

    lib/logging.js

    - + @@ -27709,13 +27763,13 @@

    lib/logging.js

    - + - + @@ -27817,7 +27871,7 @@

    lib/logging.js

    - + @@ -27829,7 +27883,7 @@

    lib/logging.js

    - + @@ -27877,7 +27931,7 @@

    lib/logging.js

    - + @@ -27895,7 +27949,7 @@

    lib/logging.js

    - + @@ -27907,7 +27961,7 @@

    lib/logging.js

    - + @@ -27925,7 +27979,7 @@

    lib/logging.js

    - + @@ -27943,7 +27997,7 @@

    lib/logging.js

    - + @@ -27967,7 +28021,7 @@

    lib/logging.js

    - + @@ -27985,7 +28039,7 @@

    lib/logging.js

    - + @@ -27997,7 +28051,7 @@

    lib/logging.js

    - + @@ -28009,7 +28063,7 @@

    lib/logging.js

    - + @@ -28021,7 +28075,7 @@

    lib/logging.js

    - + @@ -28063,7 +28117,7 @@

    lib/logging.js

    - + @@ -28087,13 +28141,13 @@

    lib/logging.js

    - + - + @@ -28105,7 +28159,7 @@

    lib/logging.js

    - + @@ -28141,7 +28195,7 @@

    lib/logging.js

    - + @@ -28165,25 +28219,25 @@

    lib/logging.js

    - + - + - + - + @@ -28195,13 +28249,13 @@

    lib/logging.js

    - + - + @@ -28219,13 +28273,13 @@

    lib/logging.js

    - + - + @@ -28249,13 +28303,13 @@

    lib/logging.js

    - + - + @@ -28279,7 +28333,7 @@

    lib/logging.js

    - + @@ -28291,7 +28345,7 @@

    lib/logging.js

    - + @@ -28303,13 +28357,13 @@

    lib/logging.js

    - + - + @@ -28327,7 +28381,7 @@

    lib/logging.js

    - + @@ -28345,7 +28399,7 @@

    lib/logging.js

    - + @@ -28357,7 +28411,7 @@

    lib/logging.js

    - + @@ -28381,7 +28435,7 @@

    lib/logging.js

    - + @@ -28405,7 +28459,7 @@

    lib/logging.js

    - + @@ -28417,7 +28471,7 @@

    lib/logging.js

    - + @@ -28429,7 +28483,7 @@

    lib/logging.js

    - + @@ -28465,13 +28519,13 @@

    lib/logging.js

    - + - + @@ -28489,7 +28543,7 @@

    lib/logging.js

    - + @@ -28501,7 +28555,7 @@

    lib/logging.js

    - + @@ -28525,19 +28579,19 @@

    lib/logging.js

    - + - + - + @@ -28561,7 +28615,7 @@

    lib/logging.js

    - + @@ -28639,19 +28693,19 @@

    lib/logging.js

    - + - + - + @@ -28705,7 +28759,7 @@

    lib/logging.js

    - + @@ -28729,7 +28783,7 @@

    lib/logging.js

    - + @@ -28771,13 +28825,13 @@

    lib/logging.js

    - + - + @@ -28795,7 +28849,7 @@

    lib/logging.js

    - + @@ -28819,7 +28873,7 @@

    lib/logging.js

    - + @@ -28843,7 +28897,7 @@

    lib/logging.js

    - + @@ -28903,49 +28957,49 @@

    lib/logging.js

    - + - + - + - + - + - + - + - + @@ -28957,13 +29011,13 @@

    lib/logging.js

    - + - + @@ -29059,13 +29113,13 @@

    lib/logging.js

    - + - + @@ -29083,7 +29137,7 @@

    lib/logging.js

    - + @@ -29095,7 +29149,7 @@

    lib/logging.js

    - + @@ -29131,19 +29185,19 @@

    lib/logging.js

    - + - + - + @@ -29155,19 +29209,19 @@

    lib/logging.js

    - + - + - + @@ -29203,7 +29257,7 @@

    lib/logging.js

    - + @@ -29375,7 +29429,7 @@

    lib/options.js

    - + @@ -29387,7 +29441,7 @@

    lib/options.js

    - + @@ -29411,7 +29465,7 @@

    lib/options.js

    - + @@ -29435,7 +29489,7 @@

    lib/options.js

    - + @@ -29453,7 +29507,7 @@

    lib/options.js

    - + @@ -29471,13 +29525,13 @@

    lib/options.js

    - + - + @@ -29513,13 +29567,13 @@

    lib/options.js

    - + - + @@ -29549,7 +29603,7 @@

    lib/options.js

    - + @@ -29585,7 +29639,7 @@

    lib/options.js

    - + @@ -29681,13 +29735,13 @@

    lib/options.js

    - + - + @@ -29771,7 +29825,7 @@

    lib/options.js

    - + @@ -29819,7 +29873,7 @@

    lib/options.js

    - + @@ -29843,7 +29897,7 @@

    lib/options.js

    - + @@ -29867,7 +29921,7 @@

    lib/options.js

    - + @@ -30107,7 +30161,7 @@

    lib/options.js

    - + @@ -30125,13 +30179,13 @@

    lib/options.js

    - + - + @@ -30215,7 +30269,7 @@

    lib/options.js

    - + @@ -30311,7 +30365,7 @@

    lib/options.js

    - + @@ -30323,7 +30377,7 @@

    lib/options.js

    - + @@ -30503,7 +30557,7 @@

    lib/options.js

    - + @@ -30515,13 +30569,13 @@

    lib/options.js

    - + - + @@ -30533,7 +30587,7 @@

    lib/options.js

    - + @@ -30551,7 +30605,7 @@

    lib/options.js

    - + @@ -30575,7 +30629,7 @@

    lib/options.js

    - + @@ -30773,7 +30827,7 @@

    lib/options.js

    - + @@ -31137,7 +31191,7 @@

    lib/outward.js

    - + @@ -31221,7 +31275,7 @@

    lib/outward.js

    - + @@ -31233,19 +31287,19 @@

    lib/outward.js

    - + - + - + @@ -31257,13 +31311,13 @@

    lib/outward.js

    - + - + @@ -31281,7 +31335,7 @@

    lib/outward.js

    - + @@ -31293,13 +31347,13 @@

    lib/outward.js

    - + - + @@ -31335,13 +31389,13 @@

    lib/outward.js

    - + - + @@ -31359,19 +31413,19 @@

    lib/outward.js

    - + - + - + @@ -31383,7 +31437,7 @@

    lib/outward.js

    - + @@ -31407,7 +31461,7 @@

    lib/outward.js

    - + @@ -31425,7 +31479,7 @@

    lib/outward.js

    - + @@ -31437,7 +31491,7 @@

    lib/outward.js

    - + @@ -31479,7 +31533,7 @@

    lib/outward.js

    - + @@ -31509,7 +31563,7 @@

    lib/outward.js

    - + @@ -31521,19 +31575,19 @@

    lib/outward.js

    - + - + - + @@ -31545,13 +31599,13 @@

    lib/outward.js

    - + - + @@ -31569,7 +31623,7 @@

    lib/outward.js

    - + @@ -31641,7 +31695,7 @@

    lib/outward.js

    - + @@ -31665,7 +31719,7 @@

    lib/outward.js

    - + @@ -31791,7 +31845,7 @@

    lib/outward.js

    - + @@ -31803,7 +31857,7 @@

    lib/outward.js

    - + @@ -31851,7 +31905,7 @@

    lib/outward.js

    - + @@ -31863,7 +31917,7 @@

    lib/outward.js

    - + @@ -31935,7 +31989,7 @@

    lib/outward.js

    - + @@ -31947,13 +32001,13 @@

    lib/outward.js

    - + - + @@ -32019,7 +32073,7 @@

    lib/outward.js

    - + @@ -32079,13 +32133,13 @@

    lib/outward.js

    - + - + @@ -32133,19 +32187,19 @@

    lib/outward.js

    - + - + - + @@ -32157,7 +32211,7 @@

    lib/outward.js

    - + @@ -32289,7 +32343,7 @@

    lib/outward.js

    - + @@ -32319,7 +32373,7 @@

    lib/outward.js

    - + @@ -32361,13 +32415,13 @@

    lib/outward.js

    - + - + @@ -32385,7 +32439,7 @@

    lib/outward.js

    - + @@ -32409,7 +32463,7 @@

    lib/outward.js

    - + @@ -32433,7 +32487,7 @@

    lib/outward.js

    - + @@ -32445,7 +32499,7 @@

    lib/outward.js

    - + @@ -32475,7 +32529,7 @@

    lib/outward.js

    - + @@ -33193,13 +33247,13 @@

    lib/print.js

    - + - + @@ -33211,13 +33265,13 @@

    lib/print.js

    - + - + @@ -33403,7 +33457,7 @@

    lib/print.js

    - + @@ -33641,13 +33695,13 @@

    lib/ready.js

    - + - + @@ -33659,7 +33713,7 @@

    lib/ready.js

    - + @@ -33707,7 +33761,7 @@

    lib/ready.js

    - + @@ -33731,7 +33785,7 @@

    lib/ready.js

    - + @@ -33749,13 +33803,13 @@

    lib/ready.js

    - + - + @@ -33767,7 +33821,7 @@

    lib/ready.js

    - + @@ -33791,7 +33845,7 @@

    lib/ready.js

    - + @@ -33833,7 +33887,7 @@

    lib/ready.js

    - + @@ -33845,13 +33899,13 @@

    lib/ready.js

    - + - + @@ -33893,7 +33947,7 @@

    lib/ready.js

    - + @@ -33917,13 +33971,13 @@

    lib/ready.js

    - + - + @@ -33935,13 +33989,13 @@

    lib/ready.js

    - + - + @@ -33953,13 +34007,13 @@

    lib/ready.js

    - + - + @@ -34001,13 +34055,13 @@

    lib/ready.js

    - + - + @@ -34019,19 +34073,19 @@

    lib/ready.js

    - + - + - + @@ -34555,7 +34609,7 @@

    lib/transport.js

    - + @@ -34567,13 +34621,13 @@

    lib/transport.js

    - + - + @@ -34585,7 +34639,7 @@

    lib/transport.js

    - + @@ -34597,13 +34651,13 @@

    lib/transport.js

    - + - + @@ -34615,31 +34669,31 @@

    lib/transport.js

    - + - + - + - + - + @@ -34651,7 +34705,7 @@

    lib/transport.js

    - + @@ -34735,7 +34789,7 @@

    lib/transport.js

    - + @@ -37168,10 +37222,10 @@

    lib/transport.js

    lib/use.js

    -
    89.28%
    -
    569
    -
    508
    -
    61
    +
    92.16%
    +
    587
    +
    541
    +
    46
    148 // Legacy error message codes use_no_args:
    149 'The seneca.use method needs at least one argument to define a plugin.',
    150 act_invalid_args:
    151 'Action <%=pattern%> has invalid arguments; <%=message%>; ' +
    152 'arguments were: <%=msg%>.', // Legacy error message codes
    153 }
    154 act_invalid_args:
    155 1module.exports.deprecation = { 'Action <%=pattern%> has invalid arguments; <%=message%>; ' +
    156 seneca_parent: 'arguments were: <%=msg%>.',
    157 'Seneca.parent has been renamed to Seneca.prior. Seneca.parent will be removed in Seneca 4.x.',}
    158
    159 seneca_next_act: 'Seneca.next_act will be removed in Seneca 3.x',1module.exports.deprecation = {
    160 } seneca_parent:
    161 'Seneca.parent has been renamed to Seneca.prior. Seneca.parent will be removed in Seneca 4.x.',
    162
    163 seneca_next_act: 'Seneca.next_act will be removed in Seneca 3.x',
    164}
    165
    28 28162826 var meta = data.meta
    30 28162826 if (ctxt.actdef) {
    31 23872392 var fixed = ctxt.actdef.fixed
    32 23872392 var custom = ctxt.actdef.custom
    35 23872392 Object.assign(data.msg, fixed)
    39 23872392 meta.custom = meta.custom || {}
    40 23872392 Object.assign(meta.custom, custom)
    46 23842389 var so = ctxt.options
    47 23842389 var meta = data.meta
    66 23852390 if (!ctxt.actdef) return
    73 23832388 ctxt.seneca.emit('act-in', data.msg, null, data.meta)
    78 28162826 if (ctxt.seneca.flags.closed && !data.meta.closing) {
    94 23852390 var private$ = ctxt.seneca.private$
    95 23852390 ++private$.stats.act.calls
    97 23852390 var pattern = ctxt.actdef.pattern
    99 23852390 var actstats = (private$.stats.actmap[pattern] =
    102 23852390 ++actstats.calls
    106 28142824 var so = ctxt.options
    107 28142824 var msg = data.msg
    108 28142824 var meta = data.meta
    111 28142824 if (!ctxt.actdef) {
    112 429434 var default$ = meta.dflt || (!so.strict.find ? {} : meta.dflt)
    114 429434 if (
    118 416421 return {
    143 23962401 var so = ctxt.options
    144 23962401 var msg = data.msg
    146 23962401 if (!ctxt.actdef) {
    163 23852390 var so = ctxt.options
    164 23852390 var msg = data.msg
    166 23852390 if ('function' !== typeof ctxt.actdef.validate) {
    167 23832388 return
    202 28152825 var so = ctxt.options
    203 28152825 var meta = data.meta
    205 28152825 var actid = meta.id
    206 28152825 var private$ = ctxt.seneca.private$
    209 28152825 var actdetails = private$.history.get(actid)
    211 28152825 if (actdetails) {
    238 23842389 var so = ctxt.options
    239 23842389 var msg = data.msg
    254 23842389 var meta = data.meta
    256 23842389 meta.pattern = ctxt.actdef.pattern
    257 23842389 meta.client_pattern = ctxt.actdef.client_pattern
    258 23842389 meta.action = ctxt.actdef.id
    259 23842389 meta.plugin = Object.assign({}, meta.plugin, ctxt.actdef.plugin)
    261 23842389 meta.parents = meta.parents || []
    272 23842389 if (parent) {
    277 23842389 meta.custom = Object.assign(
    292 23842389 if (ctxt.seneca.private$.explain) {
    299 23832388 var meta = data.meta
    301 23832388 ctxt.seneca.fixedargs.tx$ = data.meta.tx
    303 23832388 data.reply = data.reply.bind(ctxt.seneca)
    304 23832388 data.reply.seneca = ctxt.seneca
    306 23832388 var reply = data.reply
    309 23832388 ctxt.seneca.good = function good(out) {
    317 23832388 ctxt.seneca.bad = function bad(err) {
    324 23832388 ctxt.seneca.reply = function reply(err, out) {
    328 23832388 ctxt.seneca.explain = intern.explain.bind(ctxt.seneca, meta)
    329 23832388 if (meta.explain) {
    335 23832388 var meta = data.meta
    336 23832388 var private$ = ctxt.seneca.private$
    339 23832388 if (meta.prior) {
    343 22802285 var submsg = ctxt.seneca.util.clean(data.msg)
    347 22802285 var sub_actions_list = private$.subrouter.inward.find(submsg, false, true)
    349 22802285 submsg.in$ = true
    351 22802285 for (var alI = 0; alI < sub_actions_list.length; alI++) {
    43 378381 const logging = {
    53 378381 return logging
    125 22490 try {
    126 22490 var logstr = build_test_log(this, entry)
    127 22490 this.private$.print.log(logstr)
    136 846855 var logger = log_plugin
    138 846855 if ('string' === typeof logger) {
    143 846855 if (log_plugin.preload) {
    148 846855 if (2 == logger.length) {
    157 762771 return logger
    162 856865 var options = self.options()
    163 856865 var orig_logspec = options.log
    166 856865 var logspec = Common.deep(
    172 856865 Object.keys(logspec.level_text).forEach((val) => {
    176 856865 var text_level = logspec.text_level
    177 856865 var level_text = logspec.level_text
    180 856865 var logger =
    186 856865 if ('string' === typeof orig_logspec) {
    187 379382 let level_value = null
    188 379382 let found_logger = null
    191 379382 if (text_level[orig_logspec]) {
    196 335338 else if (level_abbrev[orig_logspec]) {
    197 332335 logspec.level = level_abbrev[orig_logspec]
    214 477483 else if ('number' === typeof orig_logspec) {
    216 475481 } else if ('function' === typeof orig_logspec) {
    224 854863 logspec.level = level_text[logspec.level] || '' + logspec.level
    227 854863 var live_level = text_level[logspec.level] || parseInt(logspec.level, 10)
    229 854863 logspec.live_level = live_level
    232 854863 logspec.logger = logger
    235 854863 return logspec
    239 848857 var logspec = build_log_spec(self)
    242 846855 self.private$.logspec = logspec
    244 846855 var logger = load_logger(self, logspec.logger)
    246 846855 self.private$.logger = logger
    248 846855 self.log = function log(entry) {
    255 1767417788 } else if ('string' === typeof entry) {
    259 1767417788 var logspec = instance.private$.logspec
    260 1767417788 entry.level = entry.level || logspec.default_level
    262 1767417788 if ('number' !== typeof entry.level) {
    268 1767417788 var now = new Date()
    272 1767417788 entry.isot = entry.isot || now.toISOString()
    273 1767417788 entry.when = entry.when || now.getTime()
    274 1767417788 entry.level_name = entry.level_name || logspec.level_text[entry.level]
    275 1767417788 entry.seneca_id = entry.seneca_id || instance.id
    277 1767417788 if (instance.did) {
    278 1188611953 entry.seneca_did = entry.seneca_did || instance.did
    281 1767417788 if (instance.fixedargs.plugin$) {
    282 1174711814 entry.plugin_name = entry.plugin_name || instance.fixedargs.plugin$.name
    286 1767417788 if (instance.private$.act) {
    287 53565371 intern.build_act_entry(instance.private$.act, entry)
    291 1767417788 instance.emit('log', entry)
    293 1767417788 var level_match = logspec.live_level <= entry.level
    295 1767417788 if (level_match) {
    296 743611 instance.private$.logger.call(this, entry)
    299 1767417788 return this
    302 846855 self.log.self = () => self
    304 846855 Object.keys(logspec.text_level).forEach((level_name) => {
    308 846855 return logspec
    312 59225985 var level = logspec.text_level[level_name]
    314 59225985 var log_level = function (entry) {
    316 1763117745 if ('object' !== typeof entry) {
    322 1763117745 entry.level = level
    323 1763117745 return self.log(entry)
    326 59225985 Object.defineProperty(log_level, 'name', { value: 'log_' + level_name })
    328 59225985 return log_level
    332 22490 var logstr
    333 22490 var time = data.when - seneca.start_time
    334 22490 var exports = seneca.private$.exports
    338 22490 var logb = [
    351 22490 if ('act' === data.kind) {
    352 5422 if (data.meta) {
    353 5119 logb.push(
    362 5119 logb.push(data.meta.pattern)
    366 5119 logb.push(
    373 5422 if (data.actdef) {
    374 5119 logb.push(data.actdef.id)
    377 5422 if (data.notice) {
    381 5422 if (data.data) {
    385 5422 if ('ERR' === data.case) {
    395 17068 } else if ('add' === data.kind) {
    396 9040 logb.push(data.pattern)
    397 9040 logb.push(data.name)
    398 8028 } else if ('ready' === data.kind) {
    399 146 logb.push(data.name)
    400 6622 } else if ('plugin' === data.kind) {
    401 317 logb.push(data.plugin_name + (data.plugin_tag ? '$' + data.plugin_tag : ''))
    402 3515 } else if ('options' === data.kind) {
    404 128 } else if ('notice' === data.kind) {
    405 117 logb.push(data.notice)
    421 22490 if (data.did) {
    422 4115 logb.push(data.did)
    425 22490 logstr = logb.join('\t')
    427 22490 return logstr
    433 53585373 entry.actid = entry.actid || act.meta.id
    434 53585373 entry.pattern = entry.pattern || act.meta.pattern
    435 53585373 entry.action = entry.action || act.def.id
    437 53585373 entry.idpath = ('' + act.meta.tx).substring(0, 5)
    438 53585373 if (act.meta.parents) {
    439 49244934 for (var i = 0; i < act.meta.parents.length; i++) {
    445 53585373 entry.idpath += ('.' + act.meta.mi).substring(0, 6)
    22 376379 var options = {}
    24 376379 var basemodule
    28 370373 basemodule = callmodule.parent
    32 376379 options = prepare(basemodule, defaults, orig_initial)
    35 376379 delete options.module
    38 615621 var DEFAULT_OPTIONS_FILE = './seneca.options.js'
    39 615621 var FATAL_OPTIONS_FILE = './options.seneca.js'
    45 615621 var from = initial.from
    46 615621 if ('string' === typeof initial) {
    51 615621 if ('string' === typeof from) {
    57 615621 var argv = Minimist(
    73 615621 try {
    74 615621 sourcemap.default_file =
    88 615621 if (env.SENECA_OPTIONS) {
    96 615621 if (env.SENECA_TEST) {
    100 615621 if (env.SENECA_QUIET) {
    104 615621 if (argv.seneca) {
    144 615621 var adjusted = {}
    147 615621 if (false === initial.legacy) {
    148 1617 adjusted.legacy = {
    162 615621 var out = Common.deepextend(
    178 615621 out.legacy.logging = Common.boolify(out.legacy.logging)
    180 615621 return out
    210 18661886 if ('string' === typeof input) {
    212 18651885 } else if (input.reload$) {
    213 238241 options = prepare(basemodule, defaults, input)
    215 16271644 options = Common.deepextend(options, input)
    218 18661886 return options
    222 2105321180 return options
    255 376379 return {
    27 28102820 if (!ctxt.options.legacy.error) {
    41 28082818 Assert(ctxt.options)
    43 28082818 var so = ctxt.options
    44 28082818 var res = data.res
    45 28082818 var meta = data.meta
    47 28082818 var actid = meta.id
    48 28082818 var private$ = ctxt.seneca.private$
    51 28082818 var actdetails = private$.history.get(actid)
    53 28082818 if (actdetails) {
    54 23742379 actdetails.result.push({ when: Date.now(), res: res })
    60 28092819 if (!ctxt.actdef || ctxt.cached$) {
    61 430435 return
    64 23792384 var private$ = ctxt.seneca.private$
    65 23792384 var stats = private$.stats.act
    66 23792384 var meta = data.meta
    68 23792384 ++stats.done
    72 22762281 private$.timestats.point(ctxt.duration, ctxt.actdef.pattern)
    75 23792384 var pattern = ctxt.actdef.pattern
    77 23792384 var actstats = (private$.stats.actmap[pattern] =
    84 23172322 ++actstats.done
    89 28082818 Assert(ctxt.options)
    91 28082818 var so = ctxt.options
    92 28082818 var msg = data.msg
    93 28082818 var res = data.res
    95 28082818 if (void 0 === data.res) {
    96 613618 data.res = null
    99 28082818 var not_object =
    111 28082818 if (data.out instanceof Error) {
    115 28082818 var not_legacy = !(
    136 28082818 var meta = data.meta
    138 28082818 if (meta.error) {
    146 27222732 ctxt.seneca.emit('act-out', data.msg, data.res, data.meta)
    148 27222732 ctxt.seneca.log.debug(
    160 28082818 var private$ = ctxt.seneca.private$
    162 28082818 var meta = data.meta
    163 28082818 var reply_meta = data.reply_meta
    174 28082818 if (parent_meta) {
    184 28082818 var meta = data.meta
    185 28082818 var reply_meta = data.reply_meta
    193 28082818 var delegate = ctxt.seneca
    194 28082818 var actdef = ctxt.actdef
    195 28082818 var meta = data.meta
    197 28082818 if (meta.error) {
    219 27222732 data.err = null
    224 28082818 var delegate = ctxt.seneca
    231 28082818 var meta = data.meta
    232 28082818 var private$ = ctxt.seneca.private$
    235 28082818 if (meta.prior) {
    239 27052715 var submsg = ctxt.seneca.util.clean(data.msg)
    243 27052715 var sub_actions_list = private$.subrouter.outward.find(submsg, false, true)
    245 27052715 submsg.out$ = true
    250 27052715 for (var alI = 0; alI < sub_actions_list.length; alI++) {
    14 377380 var cmdspec = argv.seneca
    15 377380 seneca.root.argv = cmdspec
    17 377380 if (!argv.seneca) {
    18 276279 return
    49 503369 konsole_log.apply(konsole_log, arguments)
    13 376379 private$.next_ready_id = Common.autoincr()
    14 376379 private$.ready_list = []
    16 376379 return {
    24 632637 var self = this
    28 632637 setTimeout(run_ready, self.private$.ge.options.interval)
    31 630635 if ('function' === typeof ready_func) {
    32 626631 var private$ = self.root.private$
    34 626631 var ready_call = function () {
    38 626631 var ready_name =
    45 626631 Object.defineProperty(ready_call, 'name', { value: ready_name })
    47 626631 if (private$.ge.isclear()) {
    48 600605 execute_ready(self, ready_call)
    55 632637 return self
    59 538542 const root = this
    60 538542 var private$ = root.private$
    62 538542 root.emit('ready')
    63 538542 execute_ready(root, private$.ready_list.shift())
    65 538542 if (private$.ge.isclear()) {
    66 537541 while (0 < private$.ready_list.length) {
    73 16621675 if (null == ready_func) return
    74 618623 var opts = instance.options()
    76 618623 try {
    77 618623 instance.log.debug({ kind: 'ready', case: 'call', name: ready_func.name })
    78 618623 ready_func()
    22 6465 seneca.add('role:transport,cmd:client', action_client)
    24 6465 seneca.add('role:transport,hook:listen,type:web', hook_listen_web)
    25 6465 seneca.add('role:transport,hook:client,type:web', hook_client_web)
    27 6465 var tu = {}
    29 6465 tu.stringifyJSON = stringifyJSON
    30 6465 tu.parseJSON = parseJSON
    32 6465 tu.externalize_msg = externalize_msg
    33 6465 tu.externalize_reply = externalize_reply
    34 6465 tu.internalize_msg = internalize_msg
    35 6465 tu.internalize_reply = internalize_reply
    36 6465 tu.close = close
    38 6465 tu.info = function () {
    52 6465 seneca.private$.exports['transport/utils'] = tu
    @@ -37194,3750 +37248,3960 @@

    lib/use.js

    - + - + - - - + + + - + - + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - - + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - - - - + + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - - + + + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - - + + + + - - + + - - - - + + + + - - + + - - + + - - - + + + - - + + - + - + - + - + - + - + - - + + - + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - - + + + + - - + + - - - + + + - - + + - + - - - - + + + + - - - + + + - - - + + + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - - + + + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/error.test.js b/test/error.test.js index 63bcc28e..2c873f1a 100644 --- a/test/error.test.js +++ b/test/error.test.js @@ -206,6 +206,7 @@ describe('error', function () { }) .listen({ type: 'test', pin: 'a:1' }) .ready(function () { + Seneca({ tag: 'c0', legacy: { error: false }, log: 'silent' }) .error(fail_assert(done)) .use(tt) diff --git a/test/exports.test.js b/test/exports.test.js index c0bddcaa..83c88a56 100644 --- a/test/exports.test.js +++ b/test/exports.test.js @@ -13,7 +13,7 @@ var Seneca = require('..') describe('exports', function () { it('happy', async ()=>{ - var s0 = Seneca().test('print') + var s0 = Seneca().test() var p0 = function p0(options) { return { @@ -35,7 +35,7 @@ describe('exports', function () { it('with-init', async ()=>{ - var s0 = Seneca().test('print') + var s0 = Seneca().test() var p0 = function p0(options) { @@ -70,7 +70,7 @@ describe('exports', function () { it('with-preload', async ()=>{ - var s0 = Seneca().test('print') + var s0 = Seneca().test() var p0 = function p0(options) { @@ -108,7 +108,7 @@ describe('exports', function () { it('with-preload-and-init', async ()=>{ - var s0 = Seneca().test('print') + var s0 = Seneca().test() var p0 = function p0(options) { diff --git a/test/logging.test.js b/test/logging.test.js index 18b52032..d3b791a6 100644 --- a/test/logging.test.js +++ b/test/logging.test.js @@ -307,6 +307,7 @@ describe('logging', function () { } }) + // NOTE: spurious console.logs left in code with cause this to fail it('shortcuts', function (fin) { var log diff --git a/test/order.test.js b/test/order.test.js new file mode 100644 index 00000000..d2699f1d --- /dev/null +++ b/test/order.test.js @@ -0,0 +1,167 @@ +/* Copyright © 2020 Richard Rodger and other contributors, MIT License. */ +'use strict' + +const Code = require('@hapi/code') +const Lab = require('@hapi/lab') + +var lab = (exports.lab = Lab.script()) +var describe = lab.describe +var expect = Code.expect +var it = lab.it + +var Seneca = require('..') + +describe('order', function () { + it('happy', async ()=>{ + var s0 = Seneca({xdebug:{undead:true}}).test() + + /* + s0.order.plugin.addListener('xtask-end', function(ev) { + console.log( + ev.result.log.task.name + ) + }) + */ + + s0.order.plugin.add({ + name: 'before-options', + exec: function(spec) { + return { + op: 'merge', + out: { + plugin: { + options: { + c: 3 + } + } + } + } + }, + before: 'options' + }) + + // TODO: fix ordu so this works - need to add before next + s0.order.plugin.add({ + name: 'after-options', + exec: function(spec) { + var opts = spec.data.plugin.options + return { + op: 'merge', + out: { + plugin: { + options: { + d: opts.a+opts.c + } + } + } + } + }, + after: 'options' + }) + + + expect(s0.order.plugin.tasks().map(t=>t.name)).equal([ + 'args', + 'load', + 'normalize', + 'preload', + 'pre_meta', + 'pre_legacy_extend', + 'delegate', + 'call_define', + 'before-options', + 'options', + 'after-options', + 'define', + 'post_meta', + 'post_legacy_extend', + 'complete' + ]) + + + var p0 = function p0(options) { + //console.log('p0 OPTS', options) + return { + exports: { + opts: options + } + } + } + + p0.defaults = { + a: 1 + } + + s0.use(p0,{b:2}) + + return new Promise((r,j)=>{ + s0.error(j) + s0.ready(function() { + expect(s0.export('p0/opts')).equals({ b: 2, a: 1, c: 3, d: 4 }) + + + var p1 = function p1() {} + p1.preload = function() { + return { + order: { + plugin: [ + { + name: 'more-before-options', + before: 'options', + exec: ()=>{ + return { + op: 'merge', + out: { + plugin: { + options: { + f: 5 + } + } + } + } + } + } + ] + } + } + } + + s0.use(p1) + + var Joi = s0.util.Joi + + + // console.log('TASKLIST',s0.order.plugin.tasks().map(t=>t.name).join('\n')) + + s0.use({ + name: 'p2', + define: function(options) { + return { + exports: { + opts: options + } + } + }, + + + defaults: Joi.object({ + e: Joi.string().default('v0'), + c: Joi.number(), + f: Joi.number() + }).default() + }) + + + s0.ready(function() { + //console.log('AAA', s0.export('p2/opts')) + expect(s0.export('p2/opts')).equals({ + c: 3, e: 'v0', d: NaN, f:5 + }) + r() + }) + }) + }) + }) + + +}) diff --git a/test/plugin.test.js b/test/plugin.test.js index fed24255..2565387b 100644 --- a/test/plugin.test.js +++ b/test/plugin.test.js @@ -12,8 +12,62 @@ var Shared = require('./shared') var it = Shared.make_it(lab) var Seneca = require('..') +var Use = require('../lib/use') describe('plugin', function () { + it('use.intern', (fin)=>{ + expect(Use.intern).exists() + + var Joi = Seneca.util.Joi + + var spec = { + a: null, + b: void 0, + c: Joi.object(), + d: 1, + e: 'a', + f: {}, + g: { h: 2 }, + i: { j: { k: 3 } }, + + // NOTE: a simple array check is as good as it gets + // Use explicit Joi.array construction for detailed validation + + l: [], + m: [4], + n: [[5]], + o: {p:[6]}, + q: {u:[{v:[{w:7}]}]} + } + + var out = Use.intern.prepare_spec(Joi,spec,{allow_unknown:false}) + // console.dir(out.describe(),{depth:null}) + expect(out.validate(spec).error).not.exists() + + + out = Use.intern.prepare_spec(Joi,spec,{allow_unknown:true}) + // console.dir(out.describe(),{depth:null}) + + spec.z = 1 + expect(out.validate(spec).error).not.exists() + + + fin() + }) + + it('plugin-edges', (fin)=>{ + var s = Seneca({debug:{undead:true}}).test(fin) + + try { + s.use() + Code.fail('empty-use-should-throw') + } + catch(e) { + expect(e.message).includes('seneca.use') + fin() + } + }) + it('plugin-internal-ordu', (fin)=>{ var s = Seneca().test(fin) @@ -1075,5 +1129,31 @@ describe('plugin', function () { }) + it('plugin-order-task-args', function (fin) { + var s0 = Seneca({ legacy: false }).test(fin) + + var args_task = s0.order.plugin.task.args + expect(args_task.name).equals('args') + + var out = args_task.exec({ctx:{args:[]}}) + expect(out).equal({ op: 'merge', out: { args: [] } }) + out = args_task.exec({ctx:{args:['foo']}}) + expect(out).equal({ op: 'merge', out: { args: ['foo'] } }) + + function a() {} + out = args_task.exec({ctx:{args:[a]}}) + expect(out).equal({ op: 'merge', out: { args: [a] } }) + + var b = {} + out = args_task.exec({ctx:{args:[b]}}) + expect(out).equal({ op: 'merge', out: { args: [{init: void 0}] } }) + + + var b = {define:a} + out = args_task.exec({ctx:{args:[b]}}) + expect(out).equal({ op: 'merge', out: { args: [{init: a, define: a}] } }) + + fin() + }) }) diff --git a/test/stubs/transports.js b/test/stubs/transports.js index 0e8c3742..14f74599 100644 --- a/test/stubs/transports.js +++ b/test/stubs/transports.js @@ -193,15 +193,11 @@ function make_simple_transport () { simple_transport.queuemap[config.pin+'~OUT'] = Async.queue(handle_reply) var msg = JSON.stringify(tu.externalize_msg(seneca, msg, meta)) - //console.log('ST CS', msg) - simple_transport.queuemap[config.pin+'~IN'].push(msg) } function handle_reply(data, done) { var rep = tu.internalize_reply(seneca,JSON.parse(data)) - //console.log('ST CR', rep) - seneca.reply(rep) return done() }
    2 'use strict';/* $lab:coverage:off$ */ 2
    3
    var __importDefault = (
    this
    &&
    this.__importDefault
    ) || function (mod) {
    'use strict';3
    4
    return (
    mod
    && mod.__esModule) ?
    mod
    : { "default": mod };
    var __importDefault = (this && this.__importDefault) || function (mod) {
    5 }; return (mod && mod.__esModule) ? mod : { "default": mod };
    6 1Object.defineProperty(exports, "__esModule", { value: true });};
    7 1const Uniq = require('lodash.uniq');6Object.defineProperty(exports, "__esModule", { value: true });
    8 1const Eraro = require('eraro');7const Uniq = require('lodash.uniq');5
    9 1const nua_1 = __importDefault(require("nua"));9const Eraro = require('eraro');6
    10 1const ordu_1 = require("ordu");10const nua_1 = __importDefault(require("nua"));8
    11 // TODO: refactor: use.js->plugin.js and contain *_plugin api methods too13const ordu_1 = require("ordu");9
    12 1const Common = require('./common');14// TODO: refactor: use.js->plugin.js and contain *_plugin api methods too12
    13 1const Print = require('./print');15const Common = require('./common');13
    14 1exports.api_use = api_use;18const Print = require('./print');14
    15 1const intern = exports.intern = make_intern();21/* $lab:coverage:on$ */16
    16 function api_use(callpoint) {241exports.api_use = api_use;19
    17 376 const tasks = make_tasks();251const intern = exports.intern = make_intern();22
    18 376 const ordu = new ordu_1.Ordu({ debug: true });26function api_use(callpoint) {25
    19 376 ordu.operator('seneca_plugin', tasks.op.seneca_plugin);28379 const tasks = make_tasks();26
    20 376 ordu.operator('seneca_export', tasks.op.seneca_export);29379 const ordu = new ordu_1.Ordu({ debug: true });27
    21 376 ordu.operator('seneca_options', tasks.op.seneca_options);30379 ordu.operator('seneca_plugin', tasks.op.seneca_plugin);29
    22 // TODO: exports -> meta and handle all meta processing33379 ordu.operator('seneca_export', tasks.op.seneca_export);30
    23 376 ordu.add([35379 ordu.operator('seneca_options', tasks.op.seneca_options);31
    24 tasks.args,36 // TODO: exports -> meta and handle all meta processing34
    25 tasks.load,37379 ordu.add([36
    26 tasks.normalize,38 tasks.args,37
    27 tasks.preload,39 tasks.load,38
    28 { name: 'pre_meta', exec: tasks.meta },40 tasks.normalize,39
    29 { name: 'pre_legacy_extend', exec: tasks.legacy_extend },41 tasks.preload,40
    30 tasks.delegate,42 { name: 'pre_meta', exec: tasks.meta },41
    31 tasks.call_define,43 { name: 'pre_legacy_extend', exec: tasks.legacy_extend },42
    32 tasks.options,44 tasks.delegate,43
    33 tasks.define,45 tasks.call_define,44
    34 { name: 'post_meta', exec: tasks.meta },46 tasks.options,45
    35 { name: 'post_legacy_extend', exec: tasks.legacy_extend },47 tasks.define,46
    36 function complete() {48 { name: 'post_meta', exec: tasks.meta },47
    37 //console.log('COMPLETE')49 { name: 'post_legacy_extend', exec: tasks.legacy_extend },48
    38 },50 function complete() {49
    39 ]);51 //console.log('COMPLETE')50
    40 376 return {53 },51
    41 use: make_use(ordu, callpoint),54 ]);52
    42 ordu,55379 return {54
    43 tasks,56 use: make_use(ordu, callpoint),55
    44 };57 ordu,56
    45 }58 tasks,57
    46 function make_use(ordu, callpoint) {89 };58
    47 376 let seq = { index: 0 };90}59
    48 376 return function use() {92function make_use(ordu, callpoint) {85
    49 var self = this;93379 let seq = { index: 0 };86
    50 476 let ctx = {95379 return function use() {88
    51 seq: seq,96 let self = this;89
    52 args: [...arguments],97482 let args = [...arguments];90
    53 seneca: this,98482 if (0 === args.length) {92
    54 callpoint: callpoint(true)991 throw self.error('use_no_args');93
    55 };100 }94
    56 476 let data = {101481 let ctx = {96
    57 seq: -1,102 seq: seq,97
    58 args: [],103 args: args,98
    59 plugin: null,104 seneca: this,99
    60 meta: null,105 callpoint: callpoint(true)100
    61 delegate: null,106 };101
    62 plugin_done: null,107481 let data = {102
    63 exports: {},108 seq: -1,103
    64 };109 args: [],104
    65 async function run() {111 plugin: null,105
    66 // NOTE: don't wait for result!112 meta: null,106
    67 //var resp =113 delegate: null,107
    68 476 await ordu.exec(ctx, data, {114 plugin_done: null,108
    69 done: function (res) {115 exports: {},109
    70 //console.log('RES-ERR', res.err)116 };110
    71 if (res.err) {118 async function run() {112
    72 //self.die(self.private$.error(res.err, 'plugin_' + res.err.code))119 // NOTE: don't wait for result!113
    73 10 var err = res.err.seneca ? res.err :120 //let pn: string = (ctx.args[0] as any).name115
    74 self.private$.error(res.err, res.err.code);121 // TODO: set runid to indicate plugin fullname + time117
    75 10 self.die(err);122 //console.log('USE AAA', pn)//, ctx.seneca.order.plugin.tasks().length)118
    76 }123 //var resp =119
    77 }124481 await ordu.exec(ctx, data, {120
    78 });125 done: function (res) {121
    79 //console.log('RESP')127 //console.log('RES-DONE', pn, res.err)122
    80 //console.dir((resp.tasklog as any[]).map((x): any => [x.name, x.op, x.result.err]), { depth: null })128 if (res.err) {124
    81 }129 //self.die(self.private$.error(res.err, 'plugin_' + res.err.code))125
    82 476 run();13110 var err = res.err.seneca ? res.err :126
    83 476 return self;133 self.private$.error(res.err, res.err.code);127
    84 };13410 self.die(err);128
    85 }135 }129
    86 function make_tasks() {137 }130
    87 376 return {138 });131
    88 // TODO: explicit tests for these operators139 //console.log('RESP', pn, resp.err)133
    89 op: {141 //console.dir((resp.tasklog as any[]).map((x): any => [x.name, x.op, x.result.err]), { depth: null })134
    90 seneca_plugin: (tr, ctx, data) => {142 }135
    91 nua_1.default(data, tr.out.merge, { preserve: true });143481 run();137
    92 463 ctx.seneca.private$.plugins[data.plugin.fullname] = tr.out.plugin;144481 return self;139
    93 463 return { stop: false };145 };140
    94 },146}141
    95 seneca_export: (tr, ctx, data) => {148function make_tasks() {143
    96 Object.assign(data.exports, tr.out.exports);149379 return {144
    97 920 Object.assign(ctx.seneca.private$.exports, tr.out.exports);150 // TODO: explicit tests for these operators145
    98 920 return { stop: false };151 op: {147
    99 },152 seneca_plugin: (tr, ctx, data) => {148
    100 seneca_options: (tr, ctx, data) => {154 nua_1.default(data, tr.out.merge, { preserve: true });149
    101 nua_1.default(data.plugin.options, tr.out.plugin.options, { preserve: true });155468 ctx.seneca.private$.plugins[data.plugin.fullname] = tr.out.plugin;150
    102 462 let plugin_fullname = data.plugin.fullname;157468 return { stop: false };151
    103 462 let plugin_options = data.plugin.options;158 },152
    104 462 let plugin_options_update = { plugin: {} };160 seneca_export: (tr, ctx, data) => {154
    105 462 plugin_options_update.plugin[plugin_fullname] = plugin_options;161 Object.assign(data.exports, tr.out.exports);155
    106 462 ctx.seneca.options(plugin_options_update);163930 Object.assign(ctx.seneca.private$.exports, tr.out.exports);156
    107 462930 return { stop: false };165157
    108 },166158
    109 },167 seneca_options: (tr, ctx, data) => {160
    110 args: (spec) => {169 nua_1.default(data.plugin, tr.out.plugin, { preserve: true });161
    111 let args = [...spec.ctx.args];170467 let plugin_fullname = data.plugin.fullname;163
    112 // DEPRECATED: Remove when Seneca >= 4.x172467 let plugin_options = data.plugin.options;164
    113 // Allow chaining with seneca.use('options', {...})173467 let plugin_options_update = { plugin: {} };166
    114 // see https://github.com/rjrodger/seneca/issues/80174467 plugin_options_update.plugin[plugin_fullname] = plugin_options;167
    115 476 if ('options' === args[0]) {175467 ctx.seneca.options(plugin_options_update);169
    116 3 spec.ctx.seneca.options(args[1]);176467 return { stop: false };171
    117 3 return {177 },172
    118 op: 'stop',178 },173
    119 why: 'legacy-options'179 // TODO: args validation?176
    120 };180 args: (spec) => {177
    121 }181 let args = [...spec.ctx.args];178
    122 // Plugin definition function is under property `define`.183 // DEPRECATED: Remove when Seneca >= 4.x180
    123 // `init` is deprecated from 4.x184 // Allow chaining with seneca.use('options', {...})181
    124 // TODO: use-plugin expects `init` - update use-plugin to make this customizable185
    // see https://github.com/rjrodger/seneca/issues/80182
    125
    if (
    null != args[0]
    && 'object' === typeof args[0]) {
    186486 if ('options' === args[0]) {183
    126 19 args[0].init = args[0].define || args[0].init;1873 spec.ctx.seneca.options(args[1]);184
    127 }1883 return {185
    128 473 return {191 op: 'stop',186
    129 op: 'merge',192 why: 'legacy-options'187
    130 out: { args }193 };188
    131 };194 }189
    132 },195 // Plugin definition function is under property `define`.191
    133 load: (spec) => {198 // `init` is deprecated from 4.x192
    134 let args = spec.data.args;199 // TODO: use-plugin expects `init` - update use-plugin to make this customizable193
    135 473 let seneca = spec.ctx.seneca;200483 if (null != args[0] && 'object' === typeof args[0]) {194
    136 473 let private$ = seneca.private$;20122 args[0].init = args[0].define || args[0].init;195
    137 // TODO: use-plugin needs better error message for malformed plugin desc203 }196
    138 473 var desc = private$.use.build_plugin_desc(...args);204483 return {198
    139 471 if (private$.ignore_plugins[desc.full]) {206 op: 'merge',199
    140 6 seneca.log.info({207 out: { args }200
    141 kind: 'plugin',208 };201
    142 case: 'ignore',209 },202
    143 plugin_full: desc.full,210 load: (spec) => {205
    144 plugin_name: desc.name,211 let args = spec.data.args;206
    145 plugin_tag: desc.tag,212478 let seneca = spec.ctx.seneca;207
    146 });213478 let private$ = seneca.private$;208
    147 6 return {215 // TODO: use-plugin needs better error message for malformed plugin desc210
    148 op: 'stop',216478 var desc = private$.use.build_plugin_desc(...args);211
    149 why: 'ignore'217476 if (private$.ignore_plugins[desc.full]) {213
    150 };2186 seneca.log.info({214
    151 }219 kind: 'plugin',215
    152 else {220 case: 'ignore',216
    153 465 let plugin = private$.use.use_plugin_desc(desc);221 plugin_full: desc.full,217
    154 463 return {223 plugin_name: desc.name,218
    155 op: 'merge',224 plugin_tag: desc.tag,219
    156 out: {225 });220
    157 plugin2266 return {222
    158 }227 op: 'stop',223
    159 };228 why: 'ignore'224
    160 }229 };225
    161 },230 }226
    162 normalize: (spec) => {233 else {227
    163 let plugin = spec.data.plugin;234470 let plugin = private$.use.use_plugin_desc(desc);228
    164 463 var modify = {};236468 return {230
    165 // NOTE: `define` is the property for the plugin definition action.238 op: 'merge',231
    166 // The property `init` will be deprecated in 4.x239 out: {232
    167 463 modify.define = plugin.define || plugin.init;240 plugin233
    168 463 modify.fullname = Common.make_plugin_key(plugin);242 }234
    169 463 modify.loading = true;244 };235
    170 463 return {246 }236
    171 op: 'merge',247 },237
    172 out: { plugin: modify }248 normalize: (spec) => {240
    173 };249 let plugin = spec.data.plugin;241
    174 },250468 var modify = {};243
    175 preload: (spec) => {253 // NOTE: `define` is the property for the plugin definition action.245
    176 let seneca = spec.ctx.seneca;254 // The property `init` will be deprecated in 4.x246
    177 463 let plugin = spec.data.plugin;256468 modify.define = plugin.define || plugin.init;247
    178 463 let so = seneca.options();258468 modify.fullname = Common.make_plugin_key(plugin);249
    179 // Don't reload plugins if load_once true.260
    468 modify.loading = true;251
    180
    if (
    so.system.plugin.load_once
    ) {
    261
    468 return {253
    181 if (seneca.has_plugin(plugin)) {262
    op: 'merge',254
    182 return {263 out: { plugin: modify }255
    183 op: 'stop',264 };256
    184 why: 'already-loaded',265 },257
    185 out: {266 preload: (spec) => {260
    186 plugin: {267 let seneca = spec.ctx.seneca;261
    187 loading: false268468 let plugin = spec.data.plugin;263
    188 }269468 let so = seneca.options();265
    189 }270
    // Don't reload plugins if load_once true.267
    190 };271
    if (
    so.system.plugin.load_once
    ) {
    268
    191 }272
    if (seneca.has_plugin(plugin)) {269
    192 }273 return {270
    193 463 let meta = {};275 op: 'stop',271
    194 463 if ('function' === typeof plugin.define.preload) {277 why: 'already-loaded',272
    195 // TODO: need to capture errors278 out: {273
    196 340 meta = plugin.define.preload.call(seneca, plugin) || {};279 plugin: {274
    197 }280 loading: false275
    198 463 let name = meta.name || plugin.name;282 }276
    199 463 let fullname = Common.make_plugin_key(name, plugin.tag);283 }277
    200 463 return {285 };278
    201 op: 'seneca_plugin',286 }279
    202 out: {287 }280
    203 merge: {288468 let meta = {};282
    204 meta,289468 if ('function' === typeof plugin.define.preload) {284
    205 plugin: {290 // TODO: need to capture errors285
    206 name,291343 meta = plugin.define.preload.call(seneca, plugin) || {};286
    207 fullname292 }287
    208 }293468 let name = meta.name || plugin.name;289
    209 },294468 let fullname = Common.make_plugin_key(name, plugin.tag);290
    210 plugin295468 return {292
    211 }296 op: 'seneca_plugin',293
    212 };297 out: {294
    213 },298 merge: {295
    214 meta: (spec) => {301 meta,296
    215 let plugin = spec.data.plugin;302 plugin: {297
    216 920 let meta = spec.data.meta;303 name,298
    217 920 let exports = {};305 fullname299
    218 920 exports[plugin.name] = meta.export || plugin;306 }300
    219 920 exports[plugin.fullname] = meta.export || plugin;307 },301
    220 920 let exportmap = meta.exportmap || meta.exports || {};309 plugin302
    221 920 Object.keys(exportmap).forEach(k => {311 }303
    222 let v = exportmap[k];312
    };304
    223
    if (
    void 0 !== v
    ) {
    313 },305
    224 665 let exportname = plugin.fullname + '/' + k;314 meta: (spec) => {308
    225 665 exports[exportname] = v;315 let seneca = spec.ctx.seneca;309
    226 }316930 let plugin = spec.data.plugin;310
    227 });317930 let meta = spec.data.meta;311
    228 920 return {319930 let exports = {};313
    229 op: 'seneca_export',320930 exports[plugin.name] = meta.export || plugin;314
    230 out: {321930 exports[plugin.fullname] = meta.export || plugin;315
    231 exports322930 let exportmap = meta.exportmap || meta.exports || {};317
    232 }323930 Object.keys(exportmap).forEach(k => {319
    233 };324
    let v = exportmap[k];320
    234 },325
    if (
    void 0 !== v
    ) {
    321
    235 // NOTE: mutates spec.ctx.seneca328671 let exportname = plugin.fullname + '/' + k;322
    236 legacy_extend: (spec) => {329671 exports[exportname] = v;323
    237 let seneca = spec.ctx.seneca;330 }324
    238 // let plugin: any = spec.data.plugin332 });325
    239 920 let meta = spec.data.meta;333930 if (meta.order) {328
    240 920 if ('object' === typeof meta.extend) {335
    2 if (meta.order.plugin) {329
    241 4 if ('function' === typeof meta.extend.action_modifier) {336
    let tasks =
    Array.isArray(meta.order.plugin)
    ? meta.order.plugin :
    331
    242 3 seneca.private$.action_modifiers.push(meta.extend.action_modifier);337
    [meta.order.plugin]
    ;
    332
    243 }338 //console.log('AAA', spec.task.name, tasks)334
    244 // FIX: needs to use logging.load_logger340 //try {335
    245 4 if ('function' === typeof meta.extend.logger) {341
    1 seneca.order.plugin.add(tasks);336
    246
    if (
    !meta.extend.logger.replace
    &&
    343
    //}337
    247
    'function' === typeof seneca.private$.logger.add
    ) {
    345
    //catch (e) {338
    248 seneca.private$.logger.add(meta.extend.logger);346 // console.log(e)339
    249 }347 //}340
    250 else {3471 delete meta.order.plugin;341
    251 1 seneca.private$.logger = meta.extend.logger;348 }342
    252 }349 }343
    253 }350930 return {345
    254 }351 op: 'seneca_export',346
    255 //seneca.register(plugin, meta)353 out: {347
    256 },354 exports348
    257 delegate: (spec) => {357 }349
    258 let seneca = spec.ctx.seneca;358 };350
    259 506 let plugin = spec.data.plugin;359 },351
    260 //var delegate = make_delegate(seneca, plugin)361 // NOTE: mutates spec.ctx.seneca354
    261 // Adjust Seneca API to be plugin specific.364 legacy_extend: (spec) => {355
    262 506 var delegate = seneca.delegate({365 let seneca = spec.ctx.seneca;356
    263 plugin$: {366 // let plugin: any = spec.data.plugin358
    264 name: plugin.name,367930 let meta = spec.data.meta;359
    265 tag: plugin.tag,368930 if ('object' === typeof meta.extend) {361
    266 },3694 if ('function' === typeof meta.extend.action_modifier) {362
    267 fatal$: true,3713 seneca.private$.action_modifiers.push(meta.extend.action_modifier);363
    268 });372 }364
    269 506 delegate.private$ = Object.create(seneca.private$);374 // FIX: needs to use logging.load_logger366
    270 506 delegate.private$.ge = delegate.private$.ge.gate();375
    4 if ('function' === typeof meta.extend.logger) {367
    271 506 delegate.die = Common.makedie(delegate, {377
    if (
    !meta.extend.logger.replace
    &&
    369
    272 type: 'plugin',378
    'function' === typeof seneca.private$.logger.add
    ) {
    371
    273 plugin: plugin.name,379 seneca.private$.logger.add(meta.extend.logger);372
    274 });380 }373
    275 506 var actdeflist = [];382 else {373
    276 506 delegate.add = function () {3841 seneca.private$.logger = meta.extend.logger;374
    277 var argsarr = new Array(arguments.length);385 }375
    278 4131 for (var l = 0; l < argsarr.length; ++l) {386 }376
    279 8261 argsarr[l] = arguments[l];387 }377
    280 }388
    //seneca.register(plugin, meta)379
    281
    var actdef =
    argsarr[argsarr.length - 1]
    ||
    {}
    ;
    390 },380
    282 4131 if ('function' === typeof actdef) {392 delegate: (spec) => {383
    283 4130 actdef = {};393 let seneca = spec.ctx.seneca;384
    284 4130 argsarr.push(actdef);394511 let plugin = spec.data.plugin;385
    285 }395
    //var delegate = make_delegate(seneca, plugin)387
    286
    actdef.plugin_name =
    plugin.name
    ||
    '-'
    ;
    397 // Adjust Seneca API to be plugin specific.390
    287 4131 actdef.plugin_tag = plugin.tag || '-';398511 var delegate = seneca.delegate({391
    288 4131 actdef.plugin_fullname = plugin.fullname;399 plugin$: {392
    289 // TODO: is this necessary?401 name: plugin.name,393
    290 4131 actdef.log = delegate.log;402 tag: plugin.tag,394
    291 4131 actdeflist.push(actdef);404 },395
    292 4131 seneca.add.apply(delegate, argsarr);406 fatal$: true,397
    293 // FIX: should be this408 });398
    294 4130 return delegate;409511 delegate.private$ = Object.create(seneca.private$);400
    295 };410511 delegate.private$.ge = delegate.private$.ge.gate();401
    296 506 delegate.__update_plugin__ = function (plugin) {412
    511 delegate.die = Common.makedie(delegate, {403
    297
    delegate.context.name =
    plugin.name
    ||
    '-'
    ;
    413 type: 'plugin',404
    298 457 delegate.context.tag = plugin.tag || '-';414
    plugin: plugin.name,405
    299
    delegate.context.full =
    plugin.fullname
    ||
    '-'
    ;
    415 });406
    300 457 actdeflist.forEach(function (actdef) {417
    511 var actdeflist = [];408
    301
    actdef.plugin_name =
    plugin.name
    ||
    actdef.plugin_name
    ||
    '-'
    ;
    418
    511 delegate.add = function () {410
    302
    actdef.plugin_tag = plugin.tag ||
    actdef.plugin_tag
    ||
    '-'
    ;
    419
    var argsarr = new Array(arguments.length);411
    303
    actdef.plugin_fullname =
    plugin.fullname
    ||
    actdef.plugin_fullname
    ||
    '-'
    ;
    4204158 for (var l = 0; l < argsarr.length; ++l) {412
    304 });4218315 argsarr[l] = arguments[l];413
    305 };422
    }414
    306 506 delegate.init = function (init) {424
    var actdef =
    argsarr[argsarr.length - 1]
    ||
    {}
    ;
    416
    307 // TODO: validate init_action is function4254158 if ('function' === typeof actdef) {418
    308 var pat = {4274157 actdef = {};419
    309 role: 'seneca',4284157 argsarr.push(actdef);420
    310 plugin: 'init',429
    }421
    311 init: plugin.name,430
    actdef.plugin_name =
    plugin.name
    ||
    '-'
    ;
    423
    312 };431
    4158 actdef.plugin_tag = plugin.tag || '-';424
    313
    if (
    null != plugin.tag
    &&
    '-' != plugin.tag
    ) {
    433
    4158 actdef.plugin_fullname = plugin.fullname;425
    314 pat.tag = plugin.tag;434 // TODO: is this necessary?427
    315 }4354158 actdef.log = delegate.log;428
    316 6 delegate.add(pat, function (_, reply) {4374158 actdeflist.push(actdef);430
    317 init.call(this, reply);4384158 seneca.add.apply(delegate, argsarr);432
    318 });439 // FIX: should be this434
    319 };4404157 return delegate;435
    320 506 delegate.context.plugin = plugin;442 };436
    321 506 delegate.context.plugin.mark = Math.random();443
    511 delegate.__update_plugin__ = function (plugin) {438
    322 506 return {446
    delegate.context.name =
    plugin.name
    ||
    '-'
    ;
    439
    323 op: 'merge',447
    462 delegate.context.tag = plugin.tag || '-';440
    324 out: {448
    delegate.context.full =
    plugin.fullname
    ||
    '-'
    ;
    441
    325 delegate449
    462 actdeflist.forEach(function (actdef) {443
    326 }450
    actdef.plugin_name =
    plugin.name
    ||
    actdef.plugin_name
    ||
    '-'
    ;
    444
    327 };451
    actdef.plugin_tag = plugin.tag ||
    actdef.plugin_tag
    ||
    '-'
    ;
    445
    328 },452
    actdef.plugin_fullname =
    plugin.fullname
    ||
    actdef.plugin_fullname
    ||
    '-'
    ;
    446
    329 call_define: (spec) => {455 });447
    330 let plugin = spec.data.plugin;456 };448
    331 463 let delegate = spec.data.delegate;457511 delegate.init = function (init) {450
    332 // FIX: mutating context!!!459 // TODO: validate init_action is function451
    333 463 var seq = spec.ctx.seq.index++;460 var pat = {453
    334 463 var plugin_define_pattern = {463 role: 'seneca',454
    335 role: 'seneca',464 plugin: 'init',455
    336 plugin: 'define',465 init: plugin.name,456
    337 name: plugin.name,466
    };457
    338 seq: seq,467
    if (
    null != plugin.tag
    &&
    '-' != plugin.tag
    ) {
    459
    339 };468
    pat.tag = plugin.tag;460
    340
    if (
    plugin.tag !== null
    ) {
    470 }461
    341 463 plugin_define_pattern.tag = plugin.tag;4716 delegate.add(pat, function (_, reply) {463
    342 }472 init.call(this, reply);464
    343 463 return new Promise(resolve => {474 });465
    344 // seneca476 };466
    345 delegate.add(plugin_define_pattern, (_, reply) => {477511 delegate.context.plugin = plugin;468
    346 resolve({478511 delegate.context.plugin.mark = Math.random();469
    347 op: 'merge',479511 return {472
    348 out: { seq, plugin_done: reply }480 op: 'merge',473
    349 });481 out: {474
    350 });482 delegate475
    351 463 delegate.act({484 }476
    352 role: 'seneca',485 };477
    353 plugin: 'define',486 },478
    354 name: plugin.name,487 call_define: (spec) => {481
    355 tag: plugin.tag,488 let plugin = spec.data.plugin;482
    356 seq: seq,489468 let delegate = spec.data.delegate;483
    357 default$: {},490 // FIX: mutating context!!!485
    358 fatal$: true,491468 var seq = spec.ctx.seq.index++;486
    359 local$: true,492468 var plugin_define_pattern = {489
    360 });493 role: 'seneca',490
    361 });494 plugin: 'define',491
    362 },495 name: plugin.name,492
    363 options: (spec) => {498 seq: seq,493
    364 let plugin = spec.data.plugin;499
    };494
    365 463 let delegate = spec.data.delegate;500
    if (
    plugin.tag !== null
    ) {
    496
    366 463 let so = delegate.options();502468 plugin_define_pattern.tag = plugin.tag;497
    367 463 let fullname = plugin.fullname;504
    }498
    368
    let defaults =
    plugin.defaults
    ||
    {}
    ;
    505468 return new Promise(resolve => {500
    369 463 let fullname_options = Object.assign({}, 508 // seneca502
    370 // DEPRECATED: remove in 4510 delegate.add(plugin_define_pattern, (_, reply) => {503
    371 so[fullname], so.plugin[fullname], 513 resolve({504
    372 // DEPRECATED: remove in 4515 op: 'merge',505
    373 so[fullname + '$' + plugin.tag], so.plugin[fullname + '$' + plugin.tag]);519 out: { seq, plugin_done: reply }506
    374 463 var shortname = fullname !== plugin.name ? plugin.name : null;521 });507
    375 463 if (!shortname && fullname.indexOf('seneca-') === 0) {522 });508
    376 16 shortname = fullname.substring('seneca-'.length);523468 delegate.act({510
    377 }524 role: 'seneca',511
    378 463 var shortname_options = Object.assign({}, 527 plugin: 'define',512
    379 // DEPRECATED: remove in 4529 name: plugin.name,513
    380 so[shortname], so.plugin[shortname], 532 tag: plugin.tag,514
    381 // DEPRECATED: remove in 4534 seq: seq,515
    382 so[shortname + '$' + plugin.tag], so.plugin[shortname + '$' + plugin.tag]);538 default$: {},516
    383 463 let base = {};540 fatal$: true,517
    384 // NOTE: plugin error codes are in their own namespaces542 local$: true,518
    385 // TODO: test this!!!543
    });519
    386
    let errors =
    plugin.errors
    || (
    plugin.define
    && plugin.define.errors);
    544 });520
    387 463 if (errors) {546 },521
    388 5 base.errors = errors;547 options: (spec) => {524
    389 }548
    let plugin = spec.data.plugin;525
    390
    let outopts = Object.assign(base, shortname_options, fullname_options,
    plugin.options
    ||
    {}
    );
    555468 let delegate = spec.data.delegate;526
    391 463 let resolved_options = {};557468 let so = delegate.options();528
    392 463 let joi_schema = intern.prepare_spec(delegate.util.Joi, defaults, { allow_unknown: true }, {});564
    468 let fullname = plugin.fullname;530
    393 463 let joi_out = joi_schema.validate(outopts);566
    let defaults =
    plugin.defaults
    ||
    {}
    ;
    531
    394 // TODO: return this instead568468 let fullname_options = Object.assign({}, 534
    395 463 if (joi_out.error) {569 // DEPRECATED: remove in 4536
    396 1 throw delegate.error('invalid_plugin_option', {570 so[fullname], so.plugin[fullname], 539
    397 name: fullname,571 // DEPRECATED: remove in 4541
    398 err_msg: joi_out.error.message,572 so[fullname + '$' + plugin.tag], so.plugin[fullname + '$' + plugin.tag]);545
    399 options: outopts,573468 var shortname = fullname !== plugin.name ? plugin.name : null;547
    400 });574468 if (!shortname && fullname.indexOf('seneca-') === 0) {548
    401 }57516 shortname = fullname.substring('seneca-'.length);549
    402 else {576 }550
    403 462 resolved_options = joi_out.value;577468 var shortname_options = Object.assign({}, 553
    404 }578 // DEPRECATED: remove in 4555
    405 462 return {580 so[shortname], so.plugin[shortname], 558
    406 op: 'seneca_options',581 // DEPRECATED: remove in 4560
    407 out: {582 so[shortname + '$' + plugin.tag], so.plugin[shortname + '$' + plugin.tag]);564
    408 plugin: {583468 let base = {};566
    409 options: resolved_options584 // NOTE: plugin error codes are in their own namespaces568
    410 }585
    // TODO: test this!!!569
    411 }586
    let errors =
    plugin.errors
    || (
    plugin.define
    && plugin.define.errors);
    570
    412 };587468 if (errors) {572
    413 },5885 base.errors = errors;573
    414 // TODO: move data modification to returned operation591
    }574
    415 define: (spec) => {592
    let outopts = Object.assign(base, shortname_options, fullname_options,
    plugin.options
    ||
    {}
    );
    581
    416 let seneca = spec.ctx.seneca;593468 let resolved_options = {};583
    417 462 let so = seneca.options();594 //console.log('oAAA', delegate.util.Joi.isSchema(defaults))585
    418 462 let plugin = spec.data.plugin;596 // TODO: expose this on plugin588
    419 462 let plugin_done = spec.data.plugin_done;597468 let joi_schema = intern.prepare_spec(delegate.util.Joi, defaults, { allow_unknown: true }, {});594
    420 462 var plugin_seneca = spec.data.delegate;599 //console.log('oBBB', joi_schema === defaults)596
    421 462 var plugin_options = spec.data.plugin.options;600468 let joi_out = joi_schema.validate(outopts);599
    422 462 plugin_seneca.log.debug({ //console.log('oCCC', joi_out) 602
    423 kind: 'plugin',603468 let err = void 0;604
    424 case: 'DEFINE',604468 if (joi_out.error) {606
    425 name: plugin.name,6051 err = delegate.error('invalid_plugin_option', {607
    426 tag: plugin.tag,606 name: fullname,608
    427 options: plugin_options,607 err_msg: joi_out.error.message,609
    428 callpoint: spec.ctx.callpoint,608 options: outopts,610
    429 });609 });611
    430 462 var meta = intern.define_plugin(plugin_seneca, plugin, seneca.util.clean(plugin_options));615 //console.log('oDDD', err)612
    431 457 plugin.meta = meta;618 }613
    432 // legacy api for service function620
    else {614
    433
    if (
    'function' === typeof meta
    ) {
    621
    467 resolved_options = joi_out.value;615
    434 meta = { service: meta };622 }616
    435 }623468 return {618
    436 // Plugin may have changed its own name dynamically625 op: 'seneca_options',619
    437 457 plugin.name = meta.name || plugin.name;627 err: err,620
    438 457 plugin.tag =628
    out: {621
    439
    meta.tag || plugin.tag || (
    plugin.options
    &&
    plugin.options.tag$
    );
    629 plugin: {622
    440 457 plugin.fullname = Common.make_plugin_key(plugin);631
    options: resolved_options,623
    441
    plugin.service =
    meta.service
    || plugin.service;
    632 options_schema: joi_schema624
    442 457 plugin_seneca.__update_plugin__(plugin);634 }625
    443 457 seneca.private$.plugins[plugin.fullname] = plugin;636 }626
    444 457 seneca.private$.plugin_order.byname.push(plugin.name);638 };627
    445 457 seneca.private$.plugin_order.byname = Uniq(seneca.private$.plugin_order.byname);641 },628
    446 457 seneca.private$.plugin_order.byref.push(plugin.fullname);642 // TODO: move data modification to returned operation631
    447 457 var exports = spec.data.exports;644 define: (spec) => {632
    448 // 3.x Backwards compatibility - REMOVE in 4.x646
    let seneca = spec.ctx.seneca;633
    449
    if (
    'amqp-transport' === plugin.name
    ) {
    647
    467 let so = seneca.options();634
    450 seneca.options({ legacy: { meta: true } });648467 let plugin = spec.data.plugin;636
    451 }649
    467 let plugin_done = spec.data.plugin_done;637
    452
    if (
    'function' === typeof plugin_options.defined$
    ) {
    651
    467 var plugin_seneca = spec.data.delegate;639
    453 plugin_options.defined$(plugin);652467 var plugin_options = spec.data.plugin.options;640
    454 }653467 plugin_seneca.log.debug({642
    455 // TODO: split out form here into separate task: call_init655 kind: 'plugin',643
    456 // If init$ option false, do not execute init action.657
    case: 'DEFINE',644
    457
    if (
    false === plugin_options.init$
    ) {
    658
    name: plugin.name,645
    458 plugin_done();659 tag: plugin.tag,646
    459 //return resolve()660 options: plugin_options,647
    460 }661 callpoint: spec.ctx.callpoint,648
    461 457 plugin_seneca.log.debug({663 });649
    462 kind: 'plugin',664467 var meta = intern.define_plugin(plugin_seneca, plugin, seneca.util.clean(plugin_options));655
    463 case: 'INIT',665462 plugin.meta = meta;658
    464 name: plugin.name,666
    // legacy api for service function660
    465 tag: plugin.tag,667
    if (
    'function' === typeof meta
    ) {
    661
    466 exports: exports,668 meta = { service: meta };662
    467 });669 }663
    468 457 plugin_seneca.act({673 // Plugin may have changed its own name dynamically665
    469 role: 'seneca',674462 plugin.name = meta.name || plugin.name;667
    470 plugin: 'init',675
    462 plugin.tag =668
    471 seq: spec.data.seq,676
    meta.tag || plugin.tag || (
    plugin.options
    &&
    plugin.options.tag$
    );
    669
    472 init: plugin.name,677
    462 plugin.fullname = Common.make_plugin_key(plugin);671
    473 tag: plugin.tag,678
    plugin.service =
    meta.service
    || plugin.service;
    672
    474 default$: {},679462 plugin_seneca.__update_plugin__(plugin);674
    475 fatal$: true,680462 seneca.private$.plugins[plugin.fullname] = plugin;676
    476 local$: true,681462 seneca.private$.plugin_order.byname.push(plugin.name);678
    477 }, function (err) {683462 seneca.private$.plugin_order.byname = Uniq(seneca.private$.plugin_order.byname);681
    478 //try {684462 seneca.private$.plugin_order.byref.push(plugin.fullname);682
    479 if (err) {685462 var exports = spec.data.exports;684
    480 2 var plugin_err_code = 'plugin_init'; // 3.x Backwards compatibility - REMOVE in 4.x 686
    481 2 plugin.plugin_error = err.message;688
    if (
    'amqp-transport' === plugin.name
    ) {
    687
    482
    if (
    err.code === 'action-timeout'
    ) {
    690
    seneca.options({ legacy: { meta: true } });688
    483 plugin_err_code = 'plugin_init_timeout';691
    }689
    484 plugin.timeout = so.timeout;692
    if (
    'function' === typeof plugin_options.defined$
    ) {
    691
    485 }693 plugin_options.defined$(plugin);692
    486 2 return plugin_seneca.die(695 }693
    487 //internals.error(err, plugin_err_code, plugin)696 // TODO: split out form here into separate task: call_init695
    488 seneca.error(err, plugin_err_code, plugin));698
    // If init$ option false, do not execute init action.697
    489 }699
    if (
    false === plugin_options.init$
    ) {
    698
    490 455 var fullname = plugin.name + (plugin.tag ? '$' + plugin.tag : '');701
    plugin_done();699
    491
    if (
    so.debug.print
    && so.debug.print.options) {
    703 //return resolve()700
    492 2 Print.plugin_options(seneca, fullname, plugin_options);704 }701
    493 }705462 plugin_seneca.log.debug({703
    494 455 plugin_seneca.log.info({707 kind: 'plugin',704
    495 kind: 'plugin',708 case: 'INIT',705
    496 case: 'READY',709 name: plugin.name,706
    497 name: plugin.name,710 tag: plugin.tag,707
    498 tag: plugin.tag,711 exports: exports,708
    499 });712
    });709
    500
    if (
    'function' === typeof plugin_options.inited$
    ) {
    714
    462 plugin_seneca.act({713
    501 plugin_options.inited$(plugin);715 role: 'seneca',714
    502 }716 plugin: 'init',715
    503 455 plugin_done();718 seq: spec.data.seq,716
    504 });720 init: plugin.name,717
    505 // TODO: test this, with preload, explicitly722 tag: plugin.tag,718
    506 457 return {723 default$: {},719
    507 op: 'merge',724 fatal$: true,720
    508 out: {725 local$: true,721
    509 meta,726 }, function (err) {723
    510 }727 //try {724
    511 };728 if (err) {725
    512 },7302 var plugin_err_code = 'plugin_init';726
    513 };731
    2 plugin.plugin_error = err.message;728
    514 }732
    if (
    err.code === 'action-timeout'
    ) {
    730
    515 function make_intern() {735
    plugin_err_code = 'plugin_init_timeout';731
    516 1 return {736 plugin.timeout = so.timeout;732
    517 define_plugin: function (delegate, plugin, options) {737 }733
    518 // legacy plugins7382 return plugin_seneca.die(735
    519 if (plugin.define.length > 1) {739 //internals.error(err, plugin_err_code, plugin)736
    520 1 let fnstr = plugin.define.toString();740
    seneca.error(err, plugin_err_code, plugin));738
    521
    plugin.init_func_sig = (
    fnstr.match(/^(.*)\r*\n/)
    ||
    []
    )[1];
    741 }739
    522 1 let ex = delegate.error('unsupported_legacy_plugin', plugin);742
    460 var fullname = plugin.name + (plugin.tag ? '$' + plugin.tag : '');741
    523 1 throw ex;
    if (
    so.debug.print
    && so.debug.print.options) {
    743
    524 }2 Print.plugin_options(seneca, fullname, plugin_options); 744
    525 461 if (options.errors) {746 }745
    526 5 plugin.eraro = Eraro({460 plugin_seneca.log.info({ 747
    527 package: 'seneca', kind: 'plugin', 748
    528 msgmap: options.errors, case: 'READY', 749
    529 override: true, name: plugin.name, 750
    530 }); tag: plugin.tag, 751
    531 } }); 752
    532 461 var meta;
    if (
    'function' === typeof plugin_options.inited$
    ) {
    754
    533 461 try {756 plugin_options.inited$(plugin);755
    534 461 meta = plugin.define.call(delegate, options) || {};757 }756
    535 }460 plugin_done(); 758
    536 catch (e) {758 });760
    537 4 Common.wrap_error(e, 'plugin_define_failed', {759 // TODO: test this, with preload, explicitly762
    538 fullname: plugin.fullname,760462 return {763
    539 message: (e.message + (' (' + e.stack.match(/\n.*?\n/)).replace(/\n.*\//g, '')).replace(/\n/g, ''),763 op: 'merge',764
    540 options: options,764
    out: {765
    541
    repo:
    plugin.repo
    ?
    ' ' + plugin.repo + '/issues'
    : '',
    765 meta,766
    542 });766 }767
    543 }767
    };768
    544
    meta =
    'string' === typeof meta
    ?
    { name: meta }
    : meta;
    769 },770
    545 457 meta.options = meta.options || options;770 };771
    546 457 var updated_options = {};} 772
    547 457 updated_options[plugin.fullname] = meta.options;773function make_intern() {775
    548 457 delegate.options(updated_options);7741 return {776
    549 457 return meta;776 define_plugin: function (delegate, plugin, options) {777
    550 },777 // legacy plugins778
    551 // copied from https://github.com/rjrodger/optioner780 if (plugin.define.length > 1) {779
    552 // TODO: remove unnecessary vars+code781
    1 let fnstr = plugin.define.toString();780
    553 prepare_spec: function (Joi, spec, opts, ctxt) {782
    plugin.init_func_sig = (
    fnstr.match(/^(.*)\r*\n/)
    ||
    []
    )[1];
    781
    554 if (Joi.isSchema(spec)) {7831 let ex = delegate.error('unsupported_legacy_plugin', plugin);782
    555 1 return spec;784 throw ex;783
    556 }785784
    557 462 var joiobj = Joi.object();787
    466 if (options.errors) {786
    558
    if (
    opts.allow_unknown
    ) {
    7895 plugin.eraro = Eraro({787
    559 462 joiobj = joiobj.unknown();790 package: 'seneca',788
    560 }791 msgmap: options.errors,789
    561 462 var joi = intern.walk(Joi, joiobj, spec, '', opts, ctxt, function (valspec) {800
    override: true,790
    562
    if (
    valspec
    && Joi.isSchema(valspec)) {
    801 });791
    563 1 return valspec;802 }792
    564 }803466 var meta;794
    565 else {803466 try {796
    566 21 var typecheck = typeof valspec;804466 meta = plugin.define.call(delegate, options) || {};797
    567 //typecheck = 'function' === typecheck ? 'func' : typecheck805
    }798
    568
    if (
    opts.must_match_literals
    ) {
    807
    catch (e) {798
    569 return Joi.any()8084 Common.wrap_error(e, 'plugin_define_failed', {799
    570 .required()809 fullname: plugin.fullname,800
    571 .valid(valspec);810 message: (e.message + (' (' + e.stack.match(/\n.*?\n/)).replace(/\n.*\//g, '')).replace(/\n/g, ''),803
    572 }811
    options: options,804
    573 else {811
    repo:
    plugin.repo
    ?
    ' ' + plugin.repo + '/issues'
    : '',
    805
    574
    if (
    void 0 === valspec
    ) {
    812
    });806
    575 return Joi.any().optional();813
    }807
    576 }814
    meta =
    'string' === typeof meta
    ?
    { name: meta }
    : meta;
    809
    577
    else if (
    null == valspec
    ) {
    814
    462 meta.options = meta.options || options;810
    578 return Joi.any().default(null);815462 var updated_options = {};812
    579 }816
    462 updated_options[plugin.fullname] = meta.options;813
    580
    else if ('number' === typecheck &&
    Number.isInteger(valspec)
    ) {
    816462 delegate.options(updated_options);814
    581 12 return Joi.number()817462 return meta;816
    582 .integer()818 },817
    583 .default(valspec);819 // copied from https://github.com/rjrodger/optioner820
    584 }820
    // TODO: remove unnecessary vars+code821
    585
    else if (
    'string' === typecheck
    ) {
    820 prepare_spec: function (Joi, spec, opts, ctxt) {822
    586 9 return Joi.string()821 if (Joi.isSchema(spec)) {823
    587 .empty('')8222 return spec;824
    588 .default(() => valspec);823 }825
    589 }824468 var joiobj = Joi.object();827
    590 else {824
    468 if (opts.allow_unknown) {829
    591 return Joi[typecheck]().default(() => valspec);825467 joiobj = joiobj.unknown();830
    592 }826 }831
    593 }827468 var joi = intern.walk(Joi, joiobj, spec, '', opts, ctxt, function (valspec) {840
    594 }828 if (valspec && Joi.isSchema(valspec)) {841
    595 });8293 return valspec;842
    596 462 return joi;831 }843
    597 },832 else {843
    598 // copied from https://github.com/rjrodger/optioner83534 var typecheck = typeof valspec;844
    599 // TODO: remove unnecessary vars+code836
    //typecheck = 'function' === typecheck ? 'func' : typecheck845
    600 walk: function (Joi, start_joiobj, obj, path, opts, ctxt, mod) {844
    if (
    opts.must_match_literals
    ) {
    847
    601
    if (
    Array.isArray(obj)
    ) {
    845
    return Joi.any()848
    602 ctxt.arrpaths.push(path);846 .required()849
    603 }847 .valid(valspec);850
    604 462 let joiobj = start_joiobj;849 }851
    605 462 for (var p in obj) { else { 851
    606 22 var v = obj[p];34 if (void 0 === valspec) { 852
    607 22 var t = typeof v;2 return Joi.any().optional(); 853
    608 22 var kv = {};855
    }854
    609
    if (
    null != v
    && !Joi.isSchema(v) &&
    'object' === t
    ) {
    857
    32 else if (null == valspec) {854
    610 var np = '' === path ? p : path + '.' + p;858
    2 return Joi.any().default(null);855
    611 joiobj = joiobj.object().default();860
    }856
    612 if (opts.allow_unknown) {862
    else if ('number' === typecheck &&
    Number.isInteger(valspec)
    ) {
    856
    613 joiobj = joiobj.unknown();86319 return Joi.number()857
    614 }864
    .integer()858
    615 kv[p] = intern.walk(Joi, joiobj, v, np, opts, ctxt, mod);866 .default(valspec);859
    616 }867
    }860
    617 else {867
    else if (
    'string' === typecheck
    ) {
    860
    618 22 kv[p] = mod(v);86811 return Joi.string()861
    619 }869 .empty('')862
    620 22 joiobj = joiobj.keys(kv);871 .default(() => valspec);863
    621 }872 }864
    622 462 return joiobj;874
    else {864
    623 },875 return Joi[typecheck]().default(() => valspec);865
    624 };876 }866
    625 }877 }867
    626 }868
    627 });869
    628468 return joi;871
    629 },872
    630 // copied from https://github.com/rjrodger/optioner875
    631 // TODO: remove unnecessary vars+code876
    632 walk: function (Joi, start_joiobj, obj, path, opts, ctxt, mod) {884
    633 let joiobj = start_joiobj;886
    634 // NOTE: use explicit Joi construction for checking within arrays888
    635490 if (Array.isArray(obj)) {889
    63610 return Joi.array();890
    637 }891
    638 else {892
    639480 for (var p in obj) {893
    64059 var v = obj[p];894
    64159 var t = typeof v;895
    64259 var kv = {};897
    64359 if (null != v && !Joi.isSchema(v) && 'object' === t) {899
    64422 var np = '' === path ? p : path + '.' + p;900
    64522 let childjoiobj = Joi.object().default();902
    64622 if (opts.allow_unknown) {904
    64711 childjoiobj = childjoiobj.unknown();905
    648 }906
    64922 kv[p] = intern.walk(Joi, childjoiobj, v, np, opts, ctxt, mod);908
    650 }909
    651 else {909
    65237 kv[p] = mod(v);910
    653 }911
    65459 joiobj = joiobj.keys(kv);913
    655 }914
    656480 return joiobj;916
    657 }917
    658 }918
    659 };919
    660}920
    661 //# sourceMappingURL=use.js.map