From a950bde04fb05f052db8445d47c7e1a315dbb2e0 Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Thu, 30 Oct 2025 23:42:52 -0500 Subject: [PATCH 1/4] factor out 'app.ext.pathResolver' --- src/app.js | 21 ++++++++++--- src/handlers/server/errors/detail.mjs | 8 ++--- src/handlers/server/next-commands.mjs | 11 ++++--- src/lib/load-plugins.js | 11 ++++--- src/lib/path-to-re.mjs | 37 ++++++++++++++++++++++ src/lib/path-var-registry.mjs | 45 +++++++++++++++++++++++++++ src/lib/register-handlers.js | 23 ++++++-------- 7 files changed, 124 insertions(+), 32 deletions(-) create mode 100644 src/lib/path-to-re.mjs create mode 100644 src/lib/path-var-registry.mjs diff --git a/src/app.js b/src/app.js index e84a2319..02c43133 100644 --- a/src/app.js +++ b/src/app.js @@ -14,7 +14,7 @@ import { handlers } from './handlers' import { findOwnHome } from './lib/find-own-home' import { getServerSettings } from './lib/get-server-settings' import { loadPlugins, registerHandlers } from './lib' -import { commonPathResolvers } from './lib/path-resolvers' +import { clearRegistry, registerPathVar } from './lib/path-var-registry' import { Reporter } from './lib/reporter' const pkgRoot = findRoot(__dirname) @@ -55,12 +55,24 @@ const appInit = async(initArgs) => { version } = initArgs + // Clear and initialize path var registry + clearRegistry() + // Find the server package root (where the running server's package.json is) // This is where core plugins are loaded from const serverPackageRoot = await findOwnHome(process.argv[1]) app = app || express() + // Register core path variables + // Note: optionsFetcher still accesses app.ext.handlerPlugins for now + registerPathVar('serverPluginName', { + validationRe : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)', + optionsFetcher : ({ app }) => { + return app.ext.handlerPlugins.map(({ npmName }) => npmName) + } + }) + app.use(express.json()) app.use(express.urlencoded({ extended : true })) // handle POST body params app.use(fileUpload({ parseNested : true })) @@ -75,7 +87,6 @@ const appInit = async(initArgs) => { handlerPlugins : [], localSettings : {}, name, - pathResolvers : commonPathResolvers, pendingHandlers : [], dynamicPluginInstallDir : dynamicPluginInstallDir || fsPath.join(serverConfigRoot, 'dynamic-plugins'), serverConfigRoot, @@ -113,19 +124,19 @@ const appInit = async(initArgs) => { if (skipCorePlugins !== true) { reporter.log(`Loading core plugins from '${serverPackageRoot}'...`) - await loadPlugins(app, { cache, reporter, searchPath : serverPackageRoot, explicitPlugins, loadedPluginNames }) + await loadPlugins(app, { cache, reporter, searchPath : serverPackageRoot, explicitPlugins, loadedPluginNames, registerPathVar }) } // Also load plugins from dynamicPluginInstallDir if it's different from serverPackageRoot if (app.ext.dynamicPluginInstallDir !== serverPackageRoot) { reporter.log(`Loading dynamic plugins from '${app.ext.dynamicPluginInstallDir}'...`) - await loadPlugins(app, { cache, reporter, searchPath : app.ext.dynamicPluginInstallDir, explicitPlugins, loadedPluginNames }) + await loadPlugins(app, { cache, reporter, searchPath : app.ext.dynamicPluginInstallDir, explicitPlugins, loadedPluginNames, registerPathVar }) } if (pluginPaths?.length > 0) { for (const pluginDir of pluginPaths) { reporter.log(`Loading additional plugins from '${pluginDir}'...`) - await loadPlugins(app, { cache, reporter, searchPath : pluginDir, explicitPlugins, loadedPluginNames }) + await loadPlugins(app, { cache, reporter, searchPath : pluginDir, explicitPlugins, loadedPluginNames, registerPathVar }) } } diff --git a/src/handlers/server/errors/detail.mjs b/src/handlers/server/errors/detail.mjs index 6f0c05fb..70e9895f 100644 --- a/src/handlers/server/errors/detail.mjs +++ b/src/handlers/server/errors/detail.mjs @@ -64,12 +64,12 @@ const httpOut = ({ data, req, res }) => { } } -const func = ({ app, model, reporter }) => { - app.ext.pathResolvers.errorKey = { +const func = ({ app, model, reporter, registerPathVar }) => { + registerPathVar('errorKey', { optionsFetcher : () => app.ext.errorsRetained.map((e) => e.id) .concat(app.ext.errorsEphemeral.map((e) => e.id)), - bitReString : '[a-z0-9]{5}' - } + validationRe : '[a-z0-9]{5}' + }) return (req, res) => { const { errorKey } = req.vars diff --git a/src/handlers/server/next-commands.mjs b/src/handlers/server/next-commands.mjs index fa5e63e2..79522ab4 100644 --- a/src/handlers/server/next-commands.mjs +++ b/src/handlers/server/next-commands.mjs @@ -1,3 +1,4 @@ +import { getVarDef } from '../../lib/path-var-registry' import { nextOptions } from './_lib/next-options' const help = { @@ -69,14 +70,14 @@ const func = ({ app, cache }) => async(req, res) => { foundVariablePathElement = fKey const typeKey = fKey.slice(1) prevElements[typeKey] = commandBit // save the value of the variable - const elementConfig = app.ext.pathResolvers[typeKey] - const { bitReString, optionsFetcher } = elementConfig + const elementConfig = getVarDef(typeKey) + const { validationRe, optionsFetcher } = elementConfig let myOptions = optionsFetcher({ app, cache, currToken : commandBit, ...prevElements }) if (myOptions?.then) myOptions = await myOptions if (myOptions?.length > 0) finalOptions.push(...myOptions) - if (bitReString - && commandBit.match(new RegExp('^' + bitReString + '$')) + if (validationRe + && commandBit.match(new RegExp('^' + validationRe + '$')) && finalOptions.includes(commandBit)) { frontier = frontier[fKey] break // there may be other possibilities, but once we have a match, we move on. @@ -114,7 +115,7 @@ const func = ({ app, cache }) => async(req, res) => { .reduce(async(acc, k) => { acc = await acc if (k.startsWith(':')) { - const elementConfig = app.ext.pathResolvers[k.slice(1)] // this should already be validated + const elementConfig = getVarDef(k.slice(1)) // this should already be validated const { optionsFetcher } = elementConfig let fOpts = optionsFetcher({ app, cache, currToken : '', req, ...prevElements }) if (fOpts?.then) fOpts = await fOpts diff --git a/src/lib/load-plugins.js b/src/lib/load-plugins.js index 0cb55f07..9a527835 100644 --- a/src/lib/load-plugins.js +++ b/src/lib/load-plugins.js @@ -7,7 +7,7 @@ import { registerHandlers } from './register-handlers' /** * Loads a single plugin. */ -const loadPlugin = async({ app, cache, reporter, dir, pkg }) => { +const loadPlugin = async({ app, cache, reporter, registerPathVar, dir, pkg }) => { const { main, name: npmName, description, version } = pkg // Since we pull the 'summary' from the package.json description, there may be unecessary context which is clear when // asking 'describe this plugin'. So, we look for this specific phrase and remove it. @@ -18,7 +18,7 @@ const loadPlugin = async({ app, cache, reporter, dir, pkg }) => { } if (setup !== undefined) reporter.log(`Running setup for ${npmName}@${version} plugin...`) - let setupData = setup?.({ app, cache, reporter, serverConfigRoot : app.ext.serverConfigRoot }) + let setupData = setup?.({ app, cache, reporter, registerPathVar, serverConfigRoot : app.ext.serverConfigRoot }) if (setupData?.then !== undefined) { setupData = await setupData } @@ -98,12 +98,13 @@ const discoverExplicitPlugins = async(searchPath, explicitPlugins, reporter) => * @param {Object} options - Loading options * @param {Object} options.cache - Cache instance * @param {Object} options.reporter - Reporter for logging + * @param {Function} options.registerPathVar - Function to register path variables * @param {string} options.searchPath - Directory to search for plugins * @param {Array} options.explicitPlugins - Optional array of package names to explicitly load * @param {Set} options.loadedPluginNames - Optional Set to track loaded plugins across multiple calls * @returns {Promise} */ -const loadPlugins = async(app, { cache, reporter, searchPath, explicitPlugins, loadedPluginNames }) => { +const loadPlugins = async(app, { cache, reporter, registerPathVar, searchPath, explicitPlugins, loadedPluginNames }) => { // Use provided Set or create a new one for this call const pluginNames = loadedPluginNames || new Set() @@ -125,7 +126,7 @@ const loadPlugins = async(app, { cache, reporter, searchPath, explicitPlugins, l continue } - await loadPlugin({ app, cache, reporter, ...plugin }) + await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin }) pluginNames.add(pluginName) } } @@ -154,7 +155,7 @@ const loadPlugins = async(app, { cache, reporter, searchPath, explicitPlugins, l : `Found ${newPlugins.length} keyword-based plugins.`) for (const plugin of newPlugins) { - await loadPlugin({ app, cache, reporter, ...plugin }) + await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin }) pluginNames.add(plugin.pkg.name) } } diff --git a/src/lib/path-to-re.mjs b/src/lib/path-to-re.mjs new file mode 100644 index 00000000..7480a6cd --- /dev/null +++ b/src/lib/path-to-re.mjs @@ -0,0 +1,37 @@ +/** + * Converts a path array to a RegExp for route matching. + * + * @param {Array} pathArr - Array of path segments, may include :vars and optional? segments + * @param {Function} getVarDef - Function to look up variable definitions by name + * @returns {RegExp} Regular expression for matching the path + */ +const pathToRe = (pathArr, getVarDef) => { + let reString = '^' + + for (const pathBit of pathArr) { + if (pathBit.startsWith(':')) { + const pathVar = pathBit.slice(1) + const varDef = getVarDef(pathVar) + + if (varDef === undefined) { + throw new Error(`Unknown variable path element type '${pathVar}' while processing path ${pathArr.join('/')}.`) + } + + const { validationRe } = varDef + reString += `/(?<${pathVar}>${validationRe})` + } + else if (pathBit.endsWith('?')) { + const cleanBit = pathBit.slice(0, -1) + reString += `(?:/${cleanBit})?` + } + else { + reString += '/' + pathBit + } + } + + reString += '[/#?]?$' + + return new RegExp(reString) +} + +export { pathToRe } diff --git a/src/lib/path-var-registry.mjs b/src/lib/path-var-registry.mjs new file mode 100644 index 00000000..f60fdda8 --- /dev/null +++ b/src/lib/path-var-registry.mjs @@ -0,0 +1,45 @@ +/** + * Registry for path variable definitions. + * Path vars are used in handler paths (e.g., :serverPluginName) and need validation patterns. + * + * varDef structure: + * { + * validationRe: string - Regular expression pattern to match the variable value + * optionsFetcher: function - Optional function that returns available options for this var + * } + */ + +// Module-level registry +let registry = {} + +/** + * Clears the entire registry. Called at the start of appInit. + */ +const clearRegistry = () => { + registry = {} +} + +/** + * Registers a path variable definition. + * @param {string} varName - Name of the variable (without leading colon) + * @param {Object} varDef - Definition object with { validationRe, optionsFetcher } + * @throws {Error} If varName is already registered + */ +const registerPathVar = (varName, varDef) => { + if (registry[varName] !== undefined) { + throw new Error(`Path variable '${varName}' is already registered.`) + } + + registry[varName] = varDef +} + +/** + * Retrieves a path variable definition. + * @param {string} varName - Name of the variable (without leading colon) + * @returns {Object|undefined} The varDef object, or undefined if not found + */ +const getVarDef = (varName) => { + return registry[varName] +} + +export { clearRegistry, registerPathVar, getVarDef } diff --git a/src/lib/register-handlers.js b/src/lib/register-handlers.js index 586f17dc..3f2e9e67 100644 --- a/src/lib/register-handlers.js +++ b/src/lib/register-handlers.js @@ -4,6 +4,8 @@ import { pathToRegexp } from 'path-to-regexp' import { commonOutputParams } from '@liquid-labs/liq-handlers-lib' import { sendHelp } from '../handlers/help/lib/send-help' +import { getVarDef, registerPathVar } from './path-var-registry' +import { pathToRe } from './path-to-re' const helpParameters = commonOutputParams() @@ -97,30 +99,25 @@ const processParams = ({ parameters = [], path }) => (req, res, next) => { const processCommandPath = ({ app, model, pathArr, parameters }) => { const commandPath = [] - let reString = '^' + + // Build command path array for commandPaths tree for (const pathBit of pathArr) { if (pathBit.startsWith(':')) { - const pathVar = pathBit.slice(1) - const pathUtils = app.ext.pathResolvers[pathVar] - if (pathUtils === undefined) { - throw new Error(`Unknown variable path element type '${pathVar}' while processing path ${pathArr.join('/')}.`) - } - const { bitReString } = pathUtils commandPath.push(pathBit) // with leading ':' - reString += `/(?<${pathVar}>${bitReString})` } else if (pathBit.endsWith('?')) { const cleanBit = pathBit.slice(0, -1) commandPath.push(cleanBit) - reString += `(?:/${cleanBit})?` } else { commandPath.push(pathBit) - reString += '/' + pathBit } } - reString += '[/#?]?$' + // Build the regex using the extracted pathToRe function + const pathRe = pathToRe(pathArr, getVarDef) + + // Update commandPaths tree let frontier = app.ext.commandPaths for (const pathBit of commandPath) { if (!(pathBit in frontier)) { @@ -137,7 +134,7 @@ const processCommandPath = ({ app, model, pathArr, parameters }) => { // unfreeze and then maybe make copies here to prevent clients from changing the shared parameters data. frontier._parameters = () => parameters - return new RegExp(reString) + return pathRe } // express barfs if there are named capture groups in the path RE. However, we really want to use named capture groups @@ -166,7 +163,7 @@ const registerHandlers = (app, { npmName, handlers, model, reporter, setupData, const methodUpper = method.toUpperCase() // this must come before processCommandPath to give the function the option of registering variable name parameters - const handlerFunc = func({ parameters, app, cache, model, reporter, setupData }) + const handlerFunc = func({ parameters, app, cache, model, reporter, registerPathVar, setupData }) for (const path of paths) { if (!Array.isArray(path)) { From 137aaa8e7506637a1915e6fa5e3edffbcddbbcdf Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Fri, 31 Oct 2025 12:08:31 -0500 Subject: [PATCH 2/4] lint formatting --- src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.js b/src/app.js index 02c43133..e82b4081 100644 --- a/src/app.js +++ b/src/app.js @@ -67,7 +67,7 @@ const appInit = async(initArgs) => { // Register core path variables // Note: optionsFetcher still accesses app.ext.handlerPlugins for now registerPathVar('serverPluginName', { - validationRe : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)', + validationRe : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)', optionsFetcher : ({ app }) => { return app.ext.handlerPlugins.map(({ npmName }) => npmName) } From 354981469a084160790e1d2fea83efc7969138f6 Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Fri, 31 Oct 2025 12:12:30 -0500 Subject: [PATCH 3/4] Save QA files. --- qa/coverage/base.css | 224 ++++ qa/coverage/block-navigation.js | 87 ++ qa/coverage/clover.xml | 1145 +++++++++++++++++ qa/coverage/coverage-final.json | 37 + qa/coverage/favicon.png | Bin 0 -> 445 bytes qa/coverage/index.html | 251 ++++ qa/coverage/prettify.css | 1 + qa/coverage/prettify.js | 2 + qa/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes qa/coverage/sorter.js | 196 +++ qa/coverage/src/app.js.html | 943 ++++++++++++++ qa/coverage/src/handlers/heartbeat.mjs.html | 136 ++ qa/coverage/src/handlers/help/help.mjs.html | 160 +++ qa/coverage/src/handlers/help/index.html | 116 ++ .../handlers/help/lib/formatter-md.mjs.html | 259 ++++ .../help/lib/formatter-terminal.mjs.html | 268 ++++ .../handlers/help/lib/formatter-text.mjs.html | 247 ++++ qa/coverage/src/handlers/help/lib/index.html | 176 +++ .../src/handlers/help/lib/print-path.mjs.html | 94 ++ .../src/handlers/help/lib/send-help.mjs.html | 187 +++ qa/coverage/src/handlers/index.html | 116 ++ .../src/handlers/server/_lib/index.html | 131 ++ .../server/_lib/next-options.mjs.html | 538 ++++++++ .../server/_lib/options-tokenizer.mjs.html | 148 +++ qa/coverage/src/handlers/server/api.mjs.html | 130 ++ .../handlers/server/errors/detail.mjs.html | 337 +++++ .../src/handlers/server/errors/index.html | 131 ++ .../src/handlers/server/errors/list.mjs.html | 220 ++++ qa/coverage/src/handlers/server/index.html | 176 +++ .../handlers/server/next-commands.mjs.html | 592 +++++++++ .../server/plugins/_lib/add-plugins.mjs.html | 178 +++ .../server/plugins/_lib/error-utils.mjs.html | 418 ++++++ .../handlers/server/plugins/_lib/index.html | 161 +++ .../plugins/_lib/install-plugins.mjs.html | 466 +++++++ .../server/plugins/_lib/list-plugins.mjs.html | 121 ++ .../src/handlers/server/plugins/add.mjs.html | 214 +++ .../handlers/server/plugins/details.mjs.html | 208 +++ .../src/handlers/server/plugins/index.html | 161 +++ .../src/handlers/server/plugins/list.mjs.html | 451 +++++++ .../handlers/server/plugins/remove.mjs.html | 277 ++++ .../src/handlers/server/reload.mjs.html | 136 ++ qa/coverage/src/handlers/server/stop.mjs.html | 157 +++ .../src/handlers/server/version.js.html | 208 +++ qa/coverage/src/index.html | 131 ++ qa/coverage/src/lib/configurables.js.html | 103 ++ qa/coverage/src/lib/find-own-home.mjs.html | 319 +++++ .../src/lib/get-server-settings.mjs.html | 151 +++ qa/coverage/src/lib/index.html | 251 ++++ qa/coverage/src/lib/json-helpers.mjs.html | 163 +++ qa/coverage/src/lib/load-plugins.js.html | 574 +++++++++ qa/coverage/src/lib/path-resolvers.js.html | 115 ++ qa/coverage/src/lib/path-to-re.mjs.html | 196 +++ .../src/lib/path-var-registry.mjs.html | 220 ++++ qa/coverage/src/lib/register-handlers.js.html | 976 ++++++++++++++ qa/coverage/src/lib/reporter.js.html | 235 ++++ qa/coverage/src/server.mjs.html | 211 +++ qa/lint.txt | 1 + qa/unit-test.txt | 75 ++ 58 files changed, 13925 insertions(+) create mode 100644 qa/coverage/base.css create mode 100644 qa/coverage/block-navigation.js create mode 100644 qa/coverage/clover.xml create mode 100644 qa/coverage/coverage-final.json create mode 100644 qa/coverage/favicon.png create mode 100644 qa/coverage/index.html create mode 100644 qa/coverage/prettify.css create mode 100644 qa/coverage/prettify.js create mode 100644 qa/coverage/sort-arrow-sprite.png create mode 100644 qa/coverage/sorter.js create mode 100644 qa/coverage/src/app.js.html create mode 100644 qa/coverage/src/handlers/heartbeat.mjs.html create mode 100644 qa/coverage/src/handlers/help/help.mjs.html create mode 100644 qa/coverage/src/handlers/help/index.html create mode 100644 qa/coverage/src/handlers/help/lib/formatter-md.mjs.html create mode 100644 qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html create mode 100644 qa/coverage/src/handlers/help/lib/formatter-text.mjs.html create mode 100644 qa/coverage/src/handlers/help/lib/index.html create mode 100644 qa/coverage/src/handlers/help/lib/print-path.mjs.html create mode 100644 qa/coverage/src/handlers/help/lib/send-help.mjs.html create mode 100644 qa/coverage/src/handlers/index.html create mode 100644 qa/coverage/src/handlers/server/_lib/index.html create mode 100644 qa/coverage/src/handlers/server/_lib/next-options.mjs.html create mode 100644 qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html create mode 100644 qa/coverage/src/handlers/server/api.mjs.html create mode 100644 qa/coverage/src/handlers/server/errors/detail.mjs.html create mode 100644 qa/coverage/src/handlers/server/errors/index.html create mode 100644 qa/coverage/src/handlers/server/errors/list.mjs.html create mode 100644 qa/coverage/src/handlers/server/index.html create mode 100644 qa/coverage/src/handlers/server/next-commands.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/_lib/index.html create mode 100644 qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/add.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/details.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/index.html create mode 100644 qa/coverage/src/handlers/server/plugins/list.mjs.html create mode 100644 qa/coverage/src/handlers/server/plugins/remove.mjs.html create mode 100644 qa/coverage/src/handlers/server/reload.mjs.html create mode 100644 qa/coverage/src/handlers/server/stop.mjs.html create mode 100644 qa/coverage/src/handlers/server/version.js.html create mode 100644 qa/coverage/src/index.html create mode 100644 qa/coverage/src/lib/configurables.js.html create mode 100644 qa/coverage/src/lib/find-own-home.mjs.html create mode 100644 qa/coverage/src/lib/get-server-settings.mjs.html create mode 100644 qa/coverage/src/lib/index.html create mode 100644 qa/coverage/src/lib/json-helpers.mjs.html create mode 100644 qa/coverage/src/lib/load-plugins.js.html create mode 100644 qa/coverage/src/lib/path-resolvers.js.html create mode 100644 qa/coverage/src/lib/path-to-re.mjs.html create mode 100644 qa/coverage/src/lib/path-var-registry.mjs.html create mode 100644 qa/coverage/src/lib/register-handlers.js.html create mode 100644 qa/coverage/src/lib/reporter.js.html create mode 100644 qa/coverage/src/server.mjs.html create mode 100644 qa/lint.txt create mode 100644 qa/unit-test.txt diff --git a/qa/coverage/base.css b/qa/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/qa/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/qa/coverage/block-navigation.js b/qa/coverage/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/qa/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/qa/coverage/clover.xml b/qa/coverage/clover.xml new file mode 100644 index 00000000..86c56fd1 --- /dev/null +++ b/qa/coverage/clover.xml @@ -0,0 +1,1145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/qa/coverage/coverage-final.json b/qa/coverage/coverage-final.json new file mode 100644 index 00000000..a98331c3 --- /dev/null +++ b/qa/coverage/coverage-final.json @@ -0,0 +1,37 @@ +{"/Users/zane/playground/liquid-labs/pluggable-express/src/app.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"10":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"11":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"12":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"13":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}},"14":{"start":{"line":18,"column":0},"end":{"line":18,"column":41}},"15":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"16":{"start":{"line":20,"column":16},"end":{"line":20,"column":35}},"17":{"start":{"line":21,"column":24},"end":{"line":21,"column":74}},"18":{"start":{"line":22,"column":16},"end":{"line":22,"column":43}},"19":{"start":{"line":23,"column":22},"end":{"line":23,"column":37}},"20":{"start":{"line":43,"column":16},"end":{"line":226,"column":1}},"21":{"start":{"line":44,"column":16},"end":{"line":44,"column":24}},"22":{"start":{"line":56,"column":6},"end":{"line":56,"column":14}},"23":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}},"24":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"25":{"start":{"line":63,"column":28},"end":{"line":63,"column":62}},"26":{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},"27":{"start":{"line":69,"column":2},"end":{"line":74,"column":null}},"28":{"start":{"line":72,"column":6},"end":{"line":72,"column":null}},"29":{"start":{"line":72,"column":57},"end":{"line":72,"column":64}},"30":{"start":{"line":76,"column":2},"end":{"line":76,"column":null}},"31":{"start":{"line":77,"column":2},"end":{"line":77,"column":51}},"32":{"start":{"line":78,"column":2},"end":{"line":78,"column":null}},"33":{"start":{"line":81,"column":2},"end":{"line":98,"column":null}},"34":{"start":{"line":101,"column":28},"end":{"line":101,"column":80}},"35":{"start":{"line":102,"column":2},"end":{"line":104,"column":null}},"36":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"37":{"start":{"line":108,"column":2},"end":{"line":111,"column":null}},"38":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"39":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"40":{"start":{"line":113,"column":2},"end":{"line":113,"column":null}},"41":{"start":{"line":113,"column":32},"end":{"line":113,"column":64}},"42":{"start":{"line":115,"column":16},"end":{"line":115,"column":31}},"43":{"start":{"line":118,"column":2},"end":{"line":225,"column":null}},"44":{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},"45":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"46":{"start":{"line":123,"column":30},"end":{"line":123,"column":39}},"47":{"start":{"line":125,"column":4},"end":{"line":128,"column":null}},"48":{"start":{"line":126,"column":6},"end":{"line":126,"column":null}},"49":{"start":{"line":127,"column":6},"end":{"line":127,"column":null}},"50":{"start":{"line":131,"column":4},"end":{"line":134,"column":null}},"51":{"start":{"line":132,"column":6},"end":{"line":132,"column":null}},"52":{"start":{"line":133,"column":6},"end":{"line":133,"column":null}},"53":{"start":{"line":136,"column":4},"end":{"line":141,"column":null}},"54":{"start":{"line":137,"column":6},"end":{"line":140,"column":null}},"55":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"56":{"start":{"line":139,"column":8},"end":{"line":139,"column":null}},"57":{"start":{"line":143,"column":4},"end":{"line":145,"column":null}},"58":{"start":{"line":144,"column":6},"end":{"line":144,"column":null}},"59":{"start":{"line":148,"column":4},"end":{"line":168,"column":null}},"60":{"start":{"line":149,"column":21},"end":{"line":149,"column":44}},"61":{"start":{"line":150,"column":22},"end":{"line":150,"column":30}},"62":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"63":{"start":{"line":152,"column":6},"end":{"line":157,"column":null}},"64":{"start":{"line":158,"column":14},"end":{"line":158,"column":15}},"65":{"start":{"line":159,"column":6},"end":{"line":162,"column":null}},"66":{"start":{"line":160,"column":8},"end":{"line":160,"column":null}},"67":{"start":{"line":161,"column":8},"end":{"line":161,"column":null}},"68":{"start":{"line":163,"column":6},"end":{"line":163,"column":null}},"69":{"start":{"line":164,"column":6},"end":{"line":166,"column":null}},"70":{"start":{"line":165,"column":8},"end":{"line":165,"column":null}},"71":{"start":{"line":167,"column":6},"end":{"line":167,"column":null}},"72":{"start":{"line":170,"column":4},"end":{"line":203,"column":null}},"73":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"74":{"start":{"line":171,"column":27},"end":{"line":171,"column":null}},"75":{"start":{"line":173,"column":21},"end":{"line":173,"column":40}},"76":{"start":{"line":174,"column":6},"end":{"line":174,"column":null}},"77":{"start":{"line":176,"column":26},"end":{"line":180,"column":21}},"78":{"start":{"line":181,"column":17},"end":{"line":181,"column":116}},"79":{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},"80":{"start":{"line":184,"column":8},"end":{"line":184,"column":null}},"81":{"start":{"line":187,"column":8},"end":{"line":187,"column":null}},"82":{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},"83":{"start":{"line":191,"column":8},"end":{"line":191,"column":20}},"84":{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},"85":{"start":{"line":195,"column":10},"end":{"line":195,"column":null}},"86":{"start":{"line":198,"column":10},"end":{"line":198,"column":null}},"87":{"start":{"line":199,"column":10},"end":{"line":199,"column":null}},"88":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"89":{"start":{"line":205,"column":4},"end":{"line":205,"column":null}},"90":{"start":{"line":207,"column":22},"end":{"line":207,"column":107}},"91":{"start":{"line":208,"column":4},"end":{"line":210,"column":null}},"92":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"93":{"start":{"line":211,"column":4},"end":{"line":211,"column":null}},"94":{"start":{"line":212,"column":4},"end":{"line":212,"column":null}},"95":{"start":{"line":214,"column":4},"end":{"line":218,"column":null}},"96":{"start":{"line":215,"column":6},"end":{"line":215,"column":null}},"97":{"start":{"line":216,"column":26},"end":{"line":216,"column":87}},"98":{"start":{"line":217,"column":6},"end":{"line":217,"column":null}},"99":{"start":{"line":220,"column":4},"end":{"line":220,"column":null}},"100":{"start":{"line":223,"column":4},"end":{"line":223,"column":null}},"101":{"start":{"line":224,"column":4},"end":{"line":224,"column":null}},"102":{"start":{"line":228,"column":0},"end":{"line":228,"column":null}},"103":{"start":{"line":229,"column":15},"end":{"line":240,"column":1}},"104":{"start":{"line":230,"column":15},"end":{"line":230,"column":17}},"105":{"start":{"line":232,"column":21},"end":{"line":232,"column":57}},"106":{"start":{"line":233,"column":27},"end":{"line":233,"column":44}},"107":{"start":{"line":234,"column":16},"end":{"line":234,"column":17}},"108":{"start":{"line":235,"column":2},"end":{"line":238,"column":null}},"109":{"start":{"line":236,"column":4},"end":{"line":236,"column":null}},"110":{"start":{"line":237,"column":4},"end":{"line":237,"column":null}},"111":{"start":{"line":239,"column":2},"end":{"line":239,"column":null}},"112":{"start":{"line":242,"column":19},"end":{"line":284,"column":1}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":43,"column":16},"end":{"line":43,"column":22}},"loc":{"start":{"line":43,"column":35},"end":{"line":226,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}},"loc":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":21},"end":{"line":71,"column":22}},"loc":{"start":{"line":71,"column":34},"end":{"line":73,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":40},"end":{"line":72,"column":41}},"loc":{"start":{"line":72,"column":57},"end":{"line":72,"column":64}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":108,"column":15},"end":{"line":108,"column":26}},"loc":{"start":{"line":108,"column":26},"end":{"line":111,"column":3}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":113,"column":22},"end":{"line":113,"column":27}},"loc":{"start":{"line":113,"column":32},"end":{"line":113,"column":64}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":148,"column":12},"end":{"line":148,"column":13}},"loc":{"start":{"line":148,"column":39},"end":{"line":168,"column":5}}},"8":{"name":"(anonymous_9)","decl":{"start":{"line":170,"column":12},"end":{"line":170,"column":13}},"loc":{"start":{"line":170,"column":39},"end":{"line":203,"column":5}}},"9":{"name":"(anonymous_10)","decl":{"start":{"line":229,"column":15},"end":{"line":229,"column":16}},"loc":{"start":{"line":229,"column":31},"end":{"line":240,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"binary-expr","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"cond-expr","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"3":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":23}},"type":"default-arg","locations":[{"start":{"line":49,"column":18},"end":{"line":49,"column":23}}]},"4":{"loc":{"start":{"line":52,"column":4},"end":{"line":52,"column":29}},"type":"default-arg","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":29}}]},"5":{"loc":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"type":"default-arg","locations":[{"start":{"line":53,"column":20},"end":{"line":53,"column":null}}]},"6":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":27}},"type":"default-arg","locations":[{"start":{"line":54,"column":22},"end":{"line":54,"column":27}}]},"7":{"loc":{"start":{"line":65,"column":8},"end":{"line":65,"column":24}},"type":"binary-expr","locations":[{"start":{"line":65,"column":8},"end":{"line":65,"column":11}},{"start":{"line":65,"column":15},"end":{"line":65,"column":24}}]},"8":{"loc":{"start":{"line":91,"column":30},"end":{"line":91,"column":105}},"type":"binary-expr","locations":[{"start":{"line":91,"column":30},"end":{"line":91,"column":53}},{"start":{"line":91,"column":57},"end":{"line":91,"column":105}}]},"9":{"loc":{"start":{"line":102,"column":2},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":104,"column":null}}]},"10":{"loc":{"start":{"line":125,"column":4},"end":{"line":128,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":4},"end":{"line":128,"column":null}}]},"11":{"loc":{"start":{"line":131,"column":4},"end":{"line":134,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":4},"end":{"line":134,"column":null}}]},"12":{"loc":{"start":{"line":136,"column":4},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":141,"column":null}}]},"13":{"loc":{"start":{"line":136,"column":8},"end":{"line":136,"column":27}},"type":"cond-expr","locations":[{"start":{"line":136,"column":19},"end":{"line":136,"column":21}},{"start":{"line":136,"column":8},"end":{"line":136,"column":27}}]},"14":{"loc":{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},"type":"binary-expr","locations":[{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},{"start":{"line":136,"column":8},"end":{"line":136,"column":21}}]},"15":{"loc":{"start":{"line":159,"column":13},"end":{"line":159,"column":54}},"type":"binary-expr","locations":[{"start":{"line":159,"column":13},"end":{"line":159,"column":33}},{"start":{"line":159,"column":37},"end":{"line":159,"column":54}}]},"16":{"loc":{"start":{"line":164,"column":6},"end":{"line":166,"column":null}},"type":"if","locations":[{"start":{"line":164,"column":6},"end":{"line":166,"column":null}}]},"17":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"type":"if","locations":[{"start":{"line":171,"column":6},"end":{"line":171,"column":null}}]},"18":{"loc":{"start":{"line":173,"column":21},"end":{"line":173,"column":40}},"type":"binary-expr","locations":[{"start":{"line":173,"column":21},"end":{"line":173,"column":33}},{"start":{"line":173,"column":37},"end":{"line":173,"column":40}}]},"19":{"loc":{"start":{"line":176,"column":26},"end":{"line":180,"column":21}},"type":"cond-expr","locations":[{"start":{"line":177,"column":10},"end":{"line":177,"column":18}},{"start":{"line":178,"column":10},"end":{"line":180,"column":21}}]},"20":{"loc":{"start":{"line":176,"column":26},"end":{"line":176,"column":55}},"type":"binary-expr","locations":[{"start":{"line":176,"column":26},"end":{"line":176,"column":39}},{"start":{"line":176,"column":43},"end":{"line":176,"column":55}}]},"21":{"loc":{"start":{"line":178,"column":10},"end":{"line":180,"column":21}},"type":"cond-expr","locations":[{"start":{"line":179,"column":12},"end":{"line":179,"column":20}},{"start":{"line":180,"column":12},"end":{"line":180,"column":21}}]},"22":{"loc":{"start":{"line":178,"column":10},"end":{"line":178,"column":39}},"type":"binary-expr","locations":[{"start":{"line":178,"column":10},"end":{"line":178,"column":23}},{"start":{"line":178,"column":27},"end":{"line":178,"column":39}}]},"23":{"loc":{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},{"start":{"line":186,"column":11},"end":{"line":188,"column":null}}]},"24":{"loc":{"start":{"line":183,"column":10},"end":{"line":183,"column":50}},"type":"binary-expr","locations":[{"start":{"line":183,"column":10},"end":{"line":183,"column":35}},{"start":{"line":183,"column":39},"end":{"line":183,"column":50}}]},"25":{"loc":{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},{"start":{"line":193,"column":11},"end":{"line":202,"column":null}}]},"26":{"loc":{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},{"start":{"line":197,"column":13},"end":{"line":200,"column":null}}]},"27":{"loc":{"start":{"line":214,"column":4},"end":{"line":218,"column":null}},"type":"if","locations":[{"start":{"line":214,"column":4},"end":{"line":218,"column":null}}]},"28":{"loc":{"start":{"line":216,"column":26},"end":{"line":216,"column":87}},"type":"binary-expr","locations":[{"start":{"line":216,"column":26},"end":{"line":216,"column":37}},{"start":{"line":216,"column":41},"end":{"line":216,"column":87}}]},"29":{"loc":{"start":{"line":229,"column":16},"end":{"line":229,"column":26}},"type":"default-arg","locations":[{"start":{"line":229,"column":25},"end":{"line":229,"column":26}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":276,"16":4,"17":4,"18":4,"19":4,"20":4,"21":7,"22":7,"23":0,"24":7,"25":7,"26":7,"27":7,"28":0,"29":0,"30":7,"31":7,"32":7,"33":7,"34":7,"35":7,"36":0,"37":7,"38":0,"39":0,"40":7,"41":0,"42":7,"43":7,"44":7,"45":7,"46":7,"47":7,"48":3,"49":3,"50":7,"51":7,"52":7,"53":7,"54":3,"55":4,"56":4,"57":7,"58":3,"59":7,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":7,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":7,"90":7,"91":7,"92":0,"93":7,"94":7,"95":7,"96":0,"97":0,"98":0,"99":7,"100":0,"101":0,"102":4,"103":4,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":4},"f":{"0":12,"1":7,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[12],"1":[408,408,400],"2":[196,400],"3":[0],"4":[0],"5":[0],"6":[0],"7":[7,7],"8":[7,7],"9":[0],"10":[3],"11":[7],"12":[3],"13":[4,3],"14":[7,7],"15":[0,0],"16":[0],"17":[0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0],"28":[0,0],"29":[0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/server.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/server.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":20},"end":{"line":40,"column":1}},"2":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"3":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"4":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"5":{"start":{"line":16,"column":25},"end":{"line":16,"column":52}},"6":{"start":{"line":18,"column":17},"end":{"line":26,"column":4}},"7":{"start":{"line":19,"column":4},"end":{"line":22,"column":5}},"8":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"10":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"12":{"start":{"line":29,"column":2},"end":{"line":37,"column":null}},"13":{"start":{"line":30,"column":4},"end":{"line":33,"column":null}},"14":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"16":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"17":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"18":{"start":{"line":40,"column":1},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":26}},"loc":{"start":{"line":9,"column":6},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":35},"end":{"line":18,"column":38}},"loc":{"start":{"line":18,"column":43},"end":{"line":26,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":24},"end":{"line":29,"column":30}},"loc":{"start":{"line":29,"column":30},"end":{"line":37,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":17},"end":{"line":30,"column":23}},"loc":{"start":{"line":30,"column":23},"end":{"line":33,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":13},"end":{"line":10,"column":39}},"type":"binary-expr","locations":[{"start":{"line":10,"column":13},"end":{"line":10,"column":21}},{"start":{"line":10,"column":25},"end":{"line":10,"column":39}}]},"1":{"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":14,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":22,"column":5}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0],"2":[0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/heartbeat.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/heartbeat.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}},"1":{"start":{"line":6,"column":12},"end":{"line":6,"column":20}},"2":{"start":{"line":7,"column":10},"end":{"line":7,"column":26}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":21}},"4":{"start":{"line":10,"column":13},"end":{"line":15,"column":1}},"5":{"start":{"line":10,"column":31},"end":{"line":15,"column":1}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"8":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"9":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":31},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":31},"end":{"line":10,"column":32}},"loc":{"start":{"line":10,"column":45},"end":{"line":15,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":0,"9":4},"f":{"0":7,"1":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/help.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/help.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":12},"end":{"line":5,"column":20}},"3":{"start":{"line":6,"column":10},"end":{"line":6,"column":21}},"4":{"start":{"line":7,"column":16},"end":{"line":14,"column":null}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"6":{"start":{"line":18,"column":13},"end":{"line":21,"column":1}},"7":{"start":{"line":23,"column":10},"end":{"line":23,"column":57}}},"fnMap":{},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4},"f":{},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-md.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-md.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":34},"end":{"line":17,"column":1}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":59}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":15},"end":{"line":12,"column":18}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":14,"column":17},"end":{"line":14,"column":null}},"8":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"9":{"start":{"line":19,"column":23},"end":{"line":56,"column":1}},"10":{"start":{"line":19,"column":49},"end":{"line":56,"column":1}},"11":{"start":{"line":20,"column":16},"end":{"line":20,"column":83}},"12":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"13":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"14":{"start":{"line":26,"column":2},"end":{"line":34,"column":null}},"15":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"16":{"start":{"line":28,"column":4},"end":{"line":33,"column":null}},"17":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"18":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"19":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"20":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"21":{"start":{"line":36,"column":2},"end":{"line":39,"column":null}},"22":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"24":{"start":{"line":41,"column":2},"end":{"line":53,"column":null}},"25":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"26":{"start":{"line":43,"column":4},"end":{"line":52,"column":null}},"27":{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},"28":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"29":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"30":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"31":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"32":{"start":{"line":56,"column":1},"end":{"line":56,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":34},"end":{"line":3,"column":35}},"loc":{"start":{"line":3,"column":40},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":23},"end":{"line":19,"column":24}},"loc":{"start":{"line":19,"column":49},"end":{"line":56,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":49},"end":{"line":19,"column":50}},"loc":{"start":{"line":19,"column":122},"end":{"line":56,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":22},"end":{"line":28,"column":23}},"loc":{"start":{"line":28,"column":37},"end":{"line":33,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":22},"end":{"line":43,"column":23}},"loc":{"start":{"line":43,"column":37},"end":{"line":52,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":58}},"type":"cond-expr","locations":[{"start":{"line":4,"column":35},"end":{"line":4,"column":45}},{"start":{"line":4,"column":48},"end":{"line":4,"column":58}}]},"1":{"loc":{"start":{"line":5,"column":20},"end":{"line":5,"column":67}},"type":"cond-expr","locations":[{"start":{"line":5,"column":37},"end":{"line":5,"column":50}},{"start":{"line":5,"column":53},"end":{"line":5,"column":67}}]},"2":{"loc":{"start":{"line":6,"column":15},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":7,"column":6},"end":{"line":7,"column":15}},{"start":{"line":8,"column":6},"end":{"line":12,"column":18}}]},"3":{"loc":{"start":{"line":8,"column":6},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":9,"column":8},"end":{"line":9,"column":17}},{"start":{"line":10,"column":8},"end":{"line":12,"column":18}}]},"4":{"loc":{"start":{"line":10,"column":8},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":11,"column":10},"end":{"line":11,"column":18}},{"start":{"line":12,"column":10},"end":{"line":12,"column":18}}]},"5":{"loc":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":14,"column":null}}]},"6":{"loc":{"start":{"line":19,"column":24},"end":{"line":19,"column":44}},"type":"default-arg","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":44}}]},"7":{"loc":{"start":{"line":19,"column":26},"end":{"line":19,"column":38}},"type":"default-arg","locations":[{"start":{"line":19,"column":36},"end":{"line":19,"column":38}}]},"8":{"loc":{"start":{"line":20,"column":42},"end":{"line":20,"column":56}},"type":"binary-expr","locations":[{"start":{"line":20,"column":42},"end":{"line":20,"column":47}},{"start":{"line":20,"column":51},"end":{"line":20,"column":56}}]},"9":{"loc":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":24,"column":null}}]},"10":{"loc":{"start":{"line":26,"column":2},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":34,"column":null}}]},"11":{"loc":{"start":{"line":36,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":39,"column":null}}]},"12":{"loc":{"start":{"line":41,"column":2},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":53,"column":null}}]},"13":{"loc":{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},{"start":{"line":47,"column":11},"end":{"line":49,"column":null}}]},"14":{"loc":{"start":{"line":45,"column":49},"end":{"line":45,"column":90}},"type":"cond-expr","locations":[{"start":{"line":45,"column":66},"end":{"line":45,"column":85}},{"start":{"line":45,"column":88},"end":{"line":45,"column":90}}]},"15":{"loc":{"start":{"line":48,"column":37},"end":{"line":48,"column":78}},"type":"cond-expr","locations":[{"start":{"line":48,"column":54},"end":{"line":48,"column":73}},{"start":{"line":48,"column":76},"end":{"line":48,"column":78}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":4,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":4},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0],"7":[0],"8":[0,0],"9":[0],"10":[0],"11":[0],"12":[0],"13":[0,0],"14":[0,0],"15":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-terminal.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-terminal.mjs","statementMap":{"0":{"start":{"line":2,"column":34},"end":{"line":16,"column":1}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":86}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":15},"end":{"line":11,"column":18}},"4":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":15},"end":{"line":18,"column":16}},"8":{"start":{"line":19,"column":29},"end":{"line":59,"column":1}},"9":{"start":{"line":20,"column":16},"end":{"line":20,"column":39}},"10":{"start":{"line":20,"column":25},"end":{"line":20,"column":39}},"11":{"start":{"line":22,"column":2},"end":{"line":58,"column":null}},"12":{"start":{"line":23,"column":67},"end":{"line":23,"column":71}},"13":{"start":{"line":25,"column":18},"end":{"line":25,"column":67}},"14":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"15":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"16":{"start":{"line":31,"column":4},"end":{"line":40,"column":null}},"17":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":38,"column":null}},"19":{"start":{"line":34,"column":8},"end":{"line":34,"column":null}},"20":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"21":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"22":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"23":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"24":{"start":{"line":42,"column":4},"end":{"line":45,"column":null}},"25":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"26":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"27":{"start":{"line":47,"column":4},"end":{"line":53,"column":null}},"28":{"start":{"line":48,"column":6},"end":{"line":48,"column":null}},"29":{"start":{"line":49,"column":6},"end":{"line":52,"column":null}},"30":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"31":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"32":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"33":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"34":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":34},"end":{"line":2,"column":35}},"loc":{"start":{"line":2,"column":40},"end":{"line":16,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":19,"column":55},"end":{"line":59,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":16},"end":{"line":20,"column":20}},"loc":{"start":{"line":20,"column":25},"end":{"line":20,"column":39}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":10}},"loc":{"start":{"line":22,"column":45},"end":{"line":58,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":33,"column":34},"end":{"line":33,"column":35}},"loc":{"start":{"line":33,"column":49},"end":{"line":38,"column":7}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":24},"end":{"line":49,"column":25}},"loc":{"start":{"line":49,"column":39},"end":{"line":52,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":28},"end":{"line":3,"column":85}},"type":"cond-expr","locations":[{"start":{"line":3,"column":41},"end":{"line":3,"column":72}},{"start":{"line":3,"column":75},"end":{"line":3,"column":85}}]},"1":{"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":69}},"type":"cond-expr","locations":[{"start":{"line":4,"column":39},"end":{"line":4,"column":52}},{"start":{"line":4,"column":55},"end":{"line":4,"column":69}}]},"2":{"loc":{"start":{"line":5,"column":15},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":6,"column":6},"end":{"line":6,"column":15}},{"start":{"line":7,"column":6},"end":{"line":11,"column":18}}]},"3":{"loc":{"start":{"line":7,"column":6},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":8,"column":8},"end":{"line":8,"column":17}},{"start":{"line":9,"column":8},"end":{"line":11,"column":18}}]},"4":{"loc":{"start":{"line":9,"column":8},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":10,"column":10},"end":{"line":10,"column":18}},{"start":{"line":11,"column":10},"end":{"line":11,"column":18}}]},"5":{"loc":{"start":{"line":13,"column":14},"end":{"line":13,"column":58}},"type":"cond-expr","locations":[{"start":{"line":13,"column":26},"end":{"line":13,"column":53}},{"start":{"line":13,"column":56},"end":{"line":13,"column":58}}]},"6":{"loc":{"start":{"line":19,"column":30},"end":{"line":19,"column":50}},"type":"default-arg","locations":[{"start":{"line":19,"column":48},"end":{"line":19,"column":50}}]},"7":{"loc":{"start":{"line":19,"column":32},"end":{"line":19,"column":44}},"type":"default-arg","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":44}}]},"8":{"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":29,"column":null}}]},"9":{"loc":{"start":{"line":31,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":40,"column":null}}]},"10":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":45,"column":null}}]},"11":{"loc":{"start":{"line":47,"column":4},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":53,"column":null}}]},"12":{"loc":{"start":{"line":50,"column":41},"end":{"line":50,"column":67}},"type":"cond-expr","locations":[{"start":{"line":50,"column":57},"end":{"line":50,"column":61}},{"start":{"line":50,"column":64},"end":{"line":50,"column":67}}]},"13":{"loc":{"start":{"line":50,"column":85},"end":{"line":50,"column":110}},"type":"cond-expr","locations":[{"start":{"line":50,"column":101},"end":{"line":50,"column":104}},{"start":{"line":50,"column":107},"end":{"line":50,"column":110}}]}},"s":{"0":4,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":4,"8":4,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":4},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-text.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-text.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":34},"end":{"line":18,"column":1}},"2":{"start":{"line":5,"column":15},"end":{"line":5,"column":51}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":15},"end":{"line":13,"column":18}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":15,"column":17},"end":{"line":15,"column":null}},"8":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"9":{"start":{"line":20,"column":22},"end":{"line":52,"column":1}},"10":{"start":{"line":21,"column":16},"end":{"line":21,"column":57}},"11":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"12":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"13":{"start":{"line":27,"column":2},"end":{"line":36,"column":null}},"14":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":4},"end":{"line":35,"column":null}},"16":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"17":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"18":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"19":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"20":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"21":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"22":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"23":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"25":{"start":{"line":45,"column":4},"end":{"line":48,"column":null}},"26":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"27":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"28":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"29":{"start":{"line":52,"column":1},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":34},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":40},"end":{"line":18,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":22},"end":{"line":20,"column":23}},"loc":{"start":{"line":20,"column":95},"end":{"line":52,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":22},"end":{"line":29,"column":23}},"loc":{"start":{"line":29,"column":37},"end":{"line":35,"column":5}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":22},"end":{"line":45,"column":23}},"loc":{"start":{"line":45,"column":37},"end":{"line":48,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":15},"end":{"line":5,"column":51}},"type":"cond-expr","locations":[{"start":{"line":5,"column":28},"end":{"line":5,"column":38}},{"start":{"line":5,"column":41},"end":{"line":5,"column":51}}]},"1":{"loc":{"start":{"line":6,"column":20},"end":{"line":6,"column":67}},"type":"cond-expr","locations":[{"start":{"line":6,"column":37},"end":{"line":6,"column":50}},{"start":{"line":6,"column":53},"end":{"line":6,"column":67}}]},"2":{"loc":{"start":{"line":7,"column":15},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":8,"column":6},"end":{"line":8,"column":15}},{"start":{"line":9,"column":6},"end":{"line":13,"column":18}}]},"3":{"loc":{"start":{"line":9,"column":6},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":10,"column":8},"end":{"line":10,"column":17}},{"start":{"line":11,"column":8},"end":{"line":13,"column":18}}]},"4":{"loc":{"start":{"line":11,"column":8},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":12,"column":10},"end":{"line":12,"column":18}},{"start":{"line":13,"column":10},"end":{"line":13,"column":18}}]},"5":{"loc":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":15,"column":null}}]},"6":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":32}},"type":"binary-expr","locations":[{"start":{"line":21,"column":18},"end":{"line":21,"column":23}},{"start":{"line":21,"column":27},"end":{"line":21,"column":32}}]},"7":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}}]},"8":{"loc":{"start":{"line":27,"column":2},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":36,"column":null}}]},"9":{"loc":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":41,"column":null}}]},"10":{"loc":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":49,"column":null}}]},"11":{"loc":{"start":{"line":46,"column":30},"end":{"line":46,"column":56}},"type":"cond-expr","locations":[{"start":{"line":46,"column":46},"end":{"line":46,"column":50}},{"start":{"line":46,"column":53},"end":{"line":46,"column":56}}]},"12":{"loc":{"start":{"line":46,"column":74},"end":{"line":46,"column":99}},"type":"cond-expr","locations":[{"start":{"line":46,"column":90},"end":{"line":46,"column":93}},{"start":{"line":46,"column":96},"end":{"line":46,"column":99}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":4,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":4},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0,0],"12":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/print-path.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/print-path.mjs","statementMap":{"0":{"start":{"line":1,"column":19},"end":{"line":1,"column":94}},"1":{"start":{"line":1,"column":28},"end":{"line":1,"column":94}},"2":{"start":{"line":1,"column":56},"end":{"line":1,"column":77}},"3":{"start":{"line":1,"column":94},"end":{"line":1,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":19},"end":{"line":1,"column":23}},"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":94}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":1,"column":51},"end":{"line":1,"column":52}},"loc":{"start":{"line":1,"column":56},"end":{"line":1,"column":77}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":93}},"type":"cond-expr","locations":[{"start":{"line":1,"column":42},"end":{"line":1,"column":88}},{"start":{"line":1,"column":91},"end":{"line":1,"column":93}}]}},"s":{"0":4,"1":0,"2":0,"3":4},"f":{"0":0,"1":0},"b":{"0":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/send-help.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/send-help.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":7,"column":94}},"5":{"start":{"line":8,"column":26},"end":{"line":8,"column":39}},"6":{"start":{"line":10,"column":17},"end":{"line":32,"column":1}},"7":{"start":{"line":11,"column":27},"end":{"line":11,"column":42}},"8":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"9":{"start":{"line":12,"column":34},"end":{"line":12,"column":62}},"10":{"start":{"line":14,"column":15},"end":{"line":29,"column":3}},"11":{"start":{"line":14,"column":40},"end":{"line":29,"column":3}},"12":{"start":{"line":15,"column":4},"end":{"line":28,"column":null}},"13":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"14":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":17},"end":{"line":10,"column":18}},"loc":{"start":{"line":10,"column":57},"end":{"line":32,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":24},"end":{"line":12,"column":25}},"loc":{"start":{"line":12,"column":34},"end":{"line":12,"column":62}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":15},"end":{"line":14,"column":16}},"loc":{"start":{"line":14,"column":40},"end":{"line":29,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":40},"end":{"line":14,"column":41}},"loc":{"start":{"line":14,"column":60},"end":{"line":29,"column":3}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":88,"8":88,"9":122,"10":88,"11":91,"12":0,"13":88,"14":4},"f":{"0":88,"1":122,"2":91,"3":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/api.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/api.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":5,"column":1}},"1":{"start":{"line":7,"column":12},"end":{"line":7,"column":20}},"2":{"start":{"line":8,"column":10},"end":{"line":8,"column":30}},"3":{"start":{"line":9,"column":16},"end":{"line":9,"column":21}},"4":{"start":{"line":11,"column":13},"end":{"line":13,"column":1}},"5":{"start":{"line":11,"column":26},"end":{"line":13,"column":1}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"7":{"start":{"line":13,"column":1},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":13},"end":{"line":11,"column":14}},"loc":{"start":{"line":11,"column":26},"end":{"line":13,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":26},"end":{"line":11,"column":27}},"loc":{"start":{"line":11,"column":40},"end":{"line":13,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":1,"7":4},"f":{"0":7,"1":1},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/next-commands.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/next-commands.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":10},"end":{"line":8,"column":1}},"3":{"start":{"line":10,"column":12},"end":{"line":10,"column":20}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":40}},"5":{"start":{"line":12,"column":16},"end":{"line":16,"column":null}},"6":{"start":{"line":19,"column":18},"end":{"line":19,"column":21}},"7":{"start":{"line":20,"column":18},"end":{"line":20,"column":21}},"8":{"start":{"line":22,"column":13},"end":{"line":167,"column":1}},"9":{"start":{"line":22,"column":33},"end":{"line":167,"column":1}},"10":{"start":{"line":23,"column":2},"end":{"line":166,"column":null}},"11":{"start":{"line":24,"column":19},"end":{"line":24,"column":48}},"12":{"start":{"line":25,"column":30},"end":{"line":25,"column":39}},"13":{"start":{"line":27,"column":40},"end":{"line":27,"column":65}},"14":{"start":{"line":29,"column":19},"end":{"line":29,"column":39}},"15":{"start":{"line":30,"column":23},"end":{"line":30,"column":25}},"16":{"start":{"line":31,"column":25},"end":{"line":31,"column":27}},"17":{"start":{"line":34,"column":23},"end":{"line":34,"column":47}},"18":{"start":{"line":35,"column":23},"end":{"line":35,"column":47}},"19":{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},"20":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"21":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":39,"column":23}},"23":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"24":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"25":{"start":{"line":44,"column":6},"end":{"line":44,"column":23}},"26":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"27":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"28":{"start":{"line":50,"column":32},"end":{"line":50,"column":36}},"29":{"start":{"line":52,"column":4},"end":{"line":106,"column":null}},"30":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"31":{"start":{"line":54,"column":25},"end":{"line":54,"column":61}},"32":{"start":{"line":55,"column":6},"end":{"line":55,"column":34}},"33":{"start":{"line":55,"column":29},"end":{"line":55,"column":34}},"34":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"35":{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},"36":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"37":{"start":{"line":63,"column":39},"end":{"line":63,"column":43}},"38":{"start":{"line":64,"column":8},"end":{"line":89,"column":null}},"39":{"start":{"line":65,"column":10},"end":{"line":88,"column":null}},"40":{"start":{"line":70,"column":12},"end":{"line":70,"column":null}},"41":{"start":{"line":71,"column":28},"end":{"line":71,"column":41}},"42":{"start":{"line":72,"column":12},"end":{"line":72,"column":47}},"43":{"start":{"line":73,"column":34},"end":{"line":73,"column":52}},"44":{"start":{"line":74,"column":53},"end":{"line":74,"column":66}},"45":{"start":{"line":75,"column":28},"end":{"line":75,"column":99}},"46":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"47":{"start":{"line":76,"column":33},"end":{"line":76,"column":null}},"48":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"49":{"start":{"line":77,"column":39},"end":{"line":77,"column":null}},"50":{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},"51":{"start":{"line":82,"column":14},"end":{"line":82,"column":null}},"52":{"start":{"line":83,"column":14},"end":{"line":83,"column":19}},"53":{"start":{"line":86,"column":14},"end":{"line":86,"column":null}},"54":{"start":{"line":91,"column":8},"end":{"line":104,"column":null}},"55":{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},"56":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"57":{"start":{"line":96,"column":12},"end":{"line":101,"column":null}},"58":{"start":{"line":98,"column":14},"end":{"line":98,"column":38}},"59":{"start":{"line":98,"column":38},"end":{"line":98,"column":null}},"60":{"start":{"line":100,"column":14},"end":{"line":100,"column":null}},"61":{"start":{"line":102,"column":12},"end":{"line":102,"column":null}},"62":{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},"63":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"64":{"start":{"line":110,"column":78},"end":{"line":110,"column":113}},"65":{"start":{"line":113,"column":25},"end":{"line":113,"column":30}},"66":{"start":{"line":114,"column":6},"end":{"line":136,"column":null}},"67":{"start":{"line":116,"column":10},"end":{"line":116,"column":null}},"68":{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},"69":{"start":{"line":118,"column":34},"end":{"line":118,"column":55}},"70":{"start":{"line":119,"column":39},"end":{"line":119,"column":52}},"71":{"start":{"line":120,"column":24},"end":{"line":120,"column":92}},"72":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"73":{"start":{"line":121,"column":29},"end":{"line":121,"column":null}},"74":{"start":{"line":122,"column":12},"end":{"line":122,"column":null}},"75":{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},"76":{"start":{"line":128,"column":12},"end":{"line":128,"column":null}},"77":{"start":{"line":130,"column":15},"end":{"line":132,"column":null}},"78":{"start":{"line":131,"column":12},"end":{"line":131,"column":null}},"79":{"start":{"line":135,"column":10},"end":{"line":135,"column":null}},"80":{"start":{"line":138,"column":6},"end":{"line":138,"column":26}},"81":{"start":{"line":140,"column":22},"end":{"line":140,"column":86}},"82":{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},"83":{"start":{"line":142,"column":8},"end":{"line":152,"column":null}},"84":{"start":{"line":154,"column":11},"end":{"line":156,"column":null}},"85":{"start":{"line":155,"column":8},"end":{"line":155,"column":null}},"86":{"start":{"line":159,"column":4},"end":{"line":164,"column":null}},"87":{"start":{"line":161,"column":6},"end":{"line":161,"column":53}},"88":{"start":{"line":161,"column":53},"end":{"line":161,"column":null}},"89":{"start":{"line":163,"column":6},"end":{"line":163,"column":null}},"90":{"start":{"line":166,"column":14},"end":{"line":166,"column":32}},"91":{"start":{"line":166,"column":32},"end":{"line":166,"column":40}},"92":{"start":{"line":167,"column":1},"end":{"line":167,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":13},"end":{"line":22,"column":14}},"loc":{"start":{"line":22,"column":33},"end":{"line":167,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":33},"end":{"line":22,"column":39}},"loc":{"start":{"line":22,"column":52},"end":{"line":167,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":110,"column":72},"end":{"line":110,"column":73}},"loc":{"start":{"line":110,"column":78},"end":{"line":110,"column":113}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":115,"column":16},"end":{"line":115,"column":22}},"loc":{"start":{"line":115,"column":33},"end":{"line":136,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":12},"end":{"line":25,"column":26}},"type":"default-arg","locations":[{"start":{"line":25,"column":22},"end":{"line":25,"column":26}}]},"1":{"loc":{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},{"start":{"line":41,"column":9},"end":{"line":45,"column":null}}]},"2":{"loc":{"start":{"line":36,"column":8},"end":{"line":36,"column":89}},"type":"binary-expr","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":39}},{"start":{"line":36,"column":44},"end":{"line":36,"column":61}},{"start":{"line":36,"column":65},"end":{"line":36,"column":89}}]},"3":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}}]},"4":{"loc":{"start":{"line":46,"column":4},"end":{"line":46,"column":53}},"type":"binary-expr","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":39}},{"start":{"line":46,"column":37},"end":{"line":46,"column":39}},{"start":{"line":46,"column":8},"end":{"line":46,"column":53}}]},"5":{"loc":{"start":{"line":55,"column":6},"end":{"line":55,"column":34}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":55,"column":34}}]},"6":{"loc":{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},{"start":{"line":61,"column":11},"end":{"line":105,"column":null}}]},"7":{"loc":{"start":{"line":65,"column":10},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":10},"end":{"line":88,"column":null}}]},"8":{"loc":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":12},"end":{"line":76,"column":null}}]},"9":{"loc":{"start":{"line":76,"column":12},"end":{"line":76,"column":31}},"type":"binary-expr","locations":[{"start":{"line":76,"column":12},"end":{"line":76,"column":27}},{"start":{"line":76,"column":25},"end":{"line":76,"column":27}},{"start":{"line":76,"column":16},"end":{"line":76,"column":31}}]},"10":{"loc":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":12},"end":{"line":77,"column":null}}]},"11":{"loc":{"start":{"line":77,"column":16},"end":{"line":77,"column":33}},"type":"cond-expr","locations":[{"start":{"line":77,"column":25},"end":{"line":77,"column":27}},{"start":{"line":77,"column":16},"end":{"line":77,"column":33}}]},"12":{"loc":{"start":{"line":77,"column":16},"end":{"line":77,"column":27}},"type":"binary-expr","locations":[{"start":{"line":77,"column":16},"end":{"line":77,"column":27}},{"start":{"line":77,"column":25},"end":{"line":77,"column":27}}]},"13":{"loc":{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},{"start":{"line":85,"column":17},"end":{"line":87,"column":null}}]},"14":{"loc":{"start":{"line":79,"column":16},"end":{"line":81,"column":52}},"type":"binary-expr","locations":[{"start":{"line":79,"column":16},"end":{"line":79,"column":28}},{"start":{"line":80,"column":19},"end":{"line":80,"column":73}},{"start":{"line":81,"column":19},"end":{"line":81,"column":52}}]},"15":{"loc":{"start":{"line":91,"column":8},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":8},"end":{"line":104,"column":null}}]},"16":{"loc":{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},{"start":{"line":95,"column":15},"end":{"line":103,"column":null}}]},"17":{"loc":{"start":{"line":96,"column":12},"end":{"line":101,"column":null}},"type":"switch","locations":[{"start":{"line":97,"column":12},"end":{"line":98,"column":null}},{"start":{"line":99,"column":12},"end":{"line":100,"column":null}}]},"18":{"loc":{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},{"start":{"line":112,"column":9},"end":{"line":157,"column":null}}]},"19":{"loc":{"start":{"line":109,"column":8},"end":{"line":109,"column":72}},"type":"binary-expr","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":29}},{"start":{"line":109,"column":33},"end":{"line":109,"column":72}}]},"20":{"loc":{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},{"start":{"line":127,"column":15},"end":{"line":132,"column":null}}]},"21":{"loc":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":12},"end":{"line":121,"column":null}}]},"22":{"loc":{"start":{"line":121,"column":12},"end":{"line":121,"column":27}},"type":"binary-expr","locations":[{"start":{"line":121,"column":12},"end":{"line":121,"column":23}},{"start":{"line":121,"column":21},"end":{"line":121,"column":23}},{"start":{"line":121,"column":16},"end":{"line":121,"column":27}}]},"23":{"loc":{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},{"start":{"line":130,"column":15},"end":{"line":132,"column":null}}]},"24":{"loc":{"start":{"line":127,"column":19},"end":{"line":127,"column":49}},"type":"binary-expr","locations":[{"start":{"line":127,"column":19},"end":{"line":127,"column":27}},{"start":{"line":127,"column":31},"end":{"line":127,"column":49}}]},"25":{"loc":{"start":{"line":130,"column":15},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":130,"column":15},"end":{"line":132,"column":null}}]},"26":{"loc":{"start":{"line":140,"column":22},"end":{"line":140,"column":86}},"type":"cond-expr","locations":[{"start":{"line":140,"column":48},"end":{"line":140,"column":50}},{"start":{"line":140,"column":53},"end":{"line":140,"column":86}}]},"27":{"loc":{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},{"start":{"line":154,"column":11},"end":{"line":156,"column":null}}]},"28":{"loc":{"start":{"line":154,"column":11},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":154,"column":11},"end":{"line":156,"column":null}}]},"29":{"loc":{"start":{"line":154,"column":15},"end":{"line":154,"column":65}},"type":"binary-expr","locations":[{"start":{"line":154,"column":15},"end":{"line":154,"column":40}},{"start":{"line":154,"column":44},"end":{"line":154,"column":65}}]},"30":{"loc":{"start":{"line":159,"column":4},"end":{"line":164,"column":null}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":null}},{"start":{"line":162,"column":4},"end":{"line":163,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":7,"10":46,"11":46,"12":46,"13":46,"14":46,"15":46,"16":46,"17":46,"18":46,"19":46,"20":24,"21":24,"22":24,"23":22,"24":22,"25":22,"26":46,"27":7,"28":46,"29":46,"30":108,"31":108,"32":108,"33":0,"34":108,"35":108,"36":102,"37":6,"38":6,"39":26,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":6,"55":6,"56":6,"57":0,"58":0,"59":0,"60":0,"61":0,"62":46,"63":6,"64":26,"65":40,"66":40,"67":64,"68":64,"69":4,"70":4,"71":4,"72":4,"73":0,"74":4,"75":60,"76":30,"77":30,"78":30,"79":64,"80":40,"81":40,"82":40,"83":30,"84":10,"85":2,"86":46,"87":0,"88":0,"89":46,"90":0,"91":0,"92":4},"f":{"0":7,"1":46,"2":26,"3":64},"b":{"0":[0],"1":[24,22],"2":[46,22,1],"3":[7],"4":[46,46,44],"5":[0],"6":[102,6],"7":[0],"8":[0],"9":[0,0,0],"10":[0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0,0],"15":[6],"16":[6,0],"17":[0,0],"18":[6,40],"19":[46,6],"20":[4,60],"21":[0],"22":[4,4,4],"23":[30,30],"24":[60,60],"25":[30],"26":[4,36],"27":[30,10],"28":[2],"29":[10,4],"30":[0,46]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/reload.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/reload.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":5,"column":1}},"1":{"start":{"line":7,"column":12},"end":{"line":7,"column":20}},"2":{"start":{"line":8,"column":10},"end":{"line":8,"column":33}},"3":{"start":{"line":9,"column":16},"end":{"line":9,"column":21}},"4":{"start":{"line":11,"column":13},"end":{"line":15,"column":1}},"5":{"start":{"line":11,"column":43},"end":{"line":15,"column":1}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"7":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"8":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":13},"end":{"line":11,"column":14}},"loc":{"start":{"line":11,"column":43},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":43},"end":{"line":11,"column":49}},"loc":{"start":{"line":11,"column":62},"end":{"line":15,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":4},"f":{"0":7,"1":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/stop.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/stop.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}},"1":{"start":{"line":6,"column":12},"end":{"line":6,"column":23}},"2":{"start":{"line":7,"column":10},"end":{"line":7,"column":32}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":21}},"4":{"start":{"line":10,"column":13},"end":{"line":22,"column":1}},"5":{"start":{"line":10,"column":33},"end":{"line":22,"column":1}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":13,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":14,"column":16},"end":{"line":14,"column":39}},"9":{"start":{"line":15,"column":4},"end":{"line":17,"column":null}},"10":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"13":{"start":{"line":22,"column":1},"end":{"line":22,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":33},"end":{"line":22,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":33},"end":{"line":10,"column":39}},"loc":{"start":{"line":10,"column":52},"end":{"line":22,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":4},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":17,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":4},"f":{"0":7,"1":0},"b":{"0":[0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/version.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/version.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"3":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":10},"end":{"line":10,"column":1}},"5":{"start":{"line":12,"column":12},"end":{"line":12,"column":20}},"6":{"start":{"line":13,"column":10},"end":{"line":13,"column":34}},"7":{"start":{"line":14,"column":16},"end":{"line":14,"column":21}},"8":{"start":{"line":16,"column":13},"end":{"line":39,"column":1}},"9":{"start":{"line":16,"column":43},"end":{"line":39,"column":1}},"10":{"start":{"line":17,"column":22},"end":{"line":31,"column":3}},"11":{"start":{"line":33,"column":15},"end":{"line":37,"column":1}},"12":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":1},"end":{"line":39,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":13},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":43},"end":{"line":39,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":16,"column":43},"end":{"line":16,"column":44}},"loc":{"start":{"line":16,"column":57},"end":{"line":39,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":140,"4":4,"5":4,"6":4,"7":4,"8":4,"9":7,"10":3,"11":3,"12":3,"13":4},"f":{"0":8,"1":7,"2":3},"b":{"0":[8],"1":[192,192,188],"2":[92,188]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/next-options.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/next-options.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":31},"end":{"line":35,"column":1}},"2":{"start":{"line":13,"column":18},"end":{"line":13,"column":85}},"3":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"4":{"start":{"line":15,"column":29},"end":{"line":15,"column":null}},"5":{"start":{"line":16,"column":23},"end":{"line":16,"column":92}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"7":{"start":{"line":17,"column":27},"end":{"line":17,"column":null}},"8":{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},"9":{"start":{"line":22,"column":48},"end":{"line":22,"column":null}},"10":{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},"11":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"12":{"start":{"line":27,"column":25},"end":{"line":27,"column":72}},"13":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"14":{"start":{"line":28,"column":40},"end":{"line":28,"column":66}},"15":{"start":{"line":37,"column":25},"end":{"line":47,"column":1}},"16":{"start":{"line":38,"column":18},"end":{"line":38,"column":20}},"17":{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},"18":{"start":{"line":39,"column":26},"end":{"line":39,"column":null}},"19":{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},"20":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"21":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"22":{"start":{"line":44,"column":7},"end":{"line":44,"column":null}},"23":{"start":{"line":46,"column":2},"end":{"line":46,"column":null}},"24":{"start":{"line":49,"column":24},"end":{"line":91,"column":1}},"25":{"start":{"line":51,"column":23},"end":{"line":51,"column":60}},"26":{"start":{"line":51,"column":55},"end":{"line":51,"column":59}},"27":{"start":{"line":52,"column":25},"end":{"line":52,"column":54}},"28":{"start":{"line":52,"column":47},"end":{"line":52,"column":53}},"29":{"start":{"line":54,"column":18},"end":{"line":54,"column":20}},"30":{"start":{"line":57,"column":19},"end":{"line":59,"column":83}},"31":{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},"32":{"start":{"line":61,"column":25},"end":{"line":61,"column":80}},"33":{"start":{"line":61,"column":54},"end":{"line":61,"column":79}},"34":{"start":{"line":62,"column":23},"end":{"line":68,"column":10}},"35":{"start":{"line":63,"column":20},"end":{"line":63,"column":69}},"36":{"start":{"line":63,"column":46},"end":{"line":63,"column":58}},"37":{"start":{"line":64,"column":6},"end":{"line":66,"column":null}},"38":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"39":{"start":{"line":67,"column":6},"end":{"line":67,"column":null}},"40":{"start":{"line":70,"column":4},"end":{"line":74,"column":null}},"41":{"start":{"line":71,"column":6},"end":{"line":73,"column":null}},"42":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"43":{"start":{"line":72,"column":77},"end":{"line":72,"column":92}},"44":{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},"45":{"start":{"line":78,"column":6},"end":{"line":78,"column":null}},"46":{"start":{"line":81,"column":30},"end":{"line":81,"column":88}},"47":{"start":{"line":81,"column":59},"end":{"line":81,"column":87}},"48":{"start":{"line":82,"column":6},"end":{"line":86,"column":null}},"49":{"start":{"line":83,"column":25},"end":{"line":83,"column":71}},"50":{"start":{"line":83,"column":48},"end":{"line":83,"column":70}},"51":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"52":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"53":{"start":{"line":93,"column":20},"end":{"line":149,"column":1}},"54":{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},"55":{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},"56":{"start":{"line":106,"column":31},"end":{"line":106,"column":63}},"57":{"start":{"line":107,"column":9},"end":{"line":107,"column":null}},"58":{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},"59":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"60":{"start":{"line":114,"column":33},"end":{"line":114,"column":63}},"61":{"start":{"line":115,"column":27},"end":{"line":117,"column":64}},"62":{"start":{"line":118,"column":31},"end":{"line":118,"column":80}},"63":{"start":{"line":118,"column":54},"end":{"line":118,"column":79}},"64":{"start":{"line":119,"column":28},"end":{"line":119,"column":null}},"65":{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},"66":{"start":{"line":122,"column":6},"end":{"line":122,"column":null}},"67":{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},"68":{"start":{"line":126,"column":6},"end":{"line":135,"column":null}},"69":{"start":{"line":138,"column":6},"end":{"line":144,"column":null}},"70":{"start":{"line":148,"column":2},"end":{"line":148,"column":null}},"71":{"start":{"line":149,"column":1},"end":{"line":149,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":31},"end":{"line":3,"column":37}},"loc":{"start":{"line":12,"column":6},"end":{"line":35,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":34},"end":{"line":28,"column":35}},"loc":{"start":{"line":28,"column":40},"end":{"line":28,"column":66}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":25},"end":{"line":37,"column":26}},"loc":{"start":{"line":37,"column":43},"end":{"line":47,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":49,"column":24},"end":{"line":49,"column":25}},"loc":{"start":{"line":49,"column":111},"end":{"line":91,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":49},"end":{"line":51,"column":50}},"loc":{"start":{"line":51,"column":55},"end":{"line":51,"column":59}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":52,"column":41},"end":{"line":52,"column":42}},"loc":{"start":{"line":52,"column":47},"end":{"line":52,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":61,"column":48},"end":{"line":61,"column":49}},"loc":{"start":{"line":61,"column":54},"end":{"line":61,"column":79}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":43},"end":{"line":62,"column":44}},"loc":{"start":{"line":62,"column":55},"end":{"line":68,"column":5}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":40},"end":{"line":63,"column":41}},"loc":{"start":{"line":63,"column":46},"end":{"line":63,"column":58}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":72,"column":71},"end":{"line":72,"column":72}},"loc":{"start":{"line":72,"column":77},"end":{"line":72,"column":92}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":53},"end":{"line":81,"column":54}},"loc":{"start":{"line":81,"column":59},"end":{"line":81,"column":87}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":83,"column":42},"end":{"line":83,"column":43}},"loc":{"start":{"line":83,"column":48},"end":{"line":83,"column":70}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":93,"column":20},"end":{"line":93,"column":26}},"loc":{"start":{"line":104,"column":6},"end":{"line":149,"column":1}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":48},"end":{"line":118,"column":49}},"loc":{"start":{"line":118,"column":54},"end":{"line":118,"column":79}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":18},"end":{"line":13,"column":85}},"type":"binary-expr","locations":[{"start":{"line":13,"column":18},"end":{"line":13,"column":48}},{"start":{"line":13,"column":52},"end":{"line":13,"column":85}}]},"1":{"loc":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":15,"column":null}}]},"2":{"loc":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":17,"column":null}}]},"3":{"loc":{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},{"start":{"line":23,"column":7},"end":{"line":29,"column":null}}]},"4":{"loc":{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},{"start":{"line":26,"column":7},"end":{"line":29,"column":null}}]},"5":{"loc":{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},{"start":{"line":40,"column":7},"end":{"line":44,"column":null}}]},"6":{"loc":{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},{"start":{"line":44,"column":7},"end":{"line":44,"column":null}}]},"7":{"loc":{"start":{"line":57,"column":19},"end":{"line":59,"column":83}},"type":"binary-expr","locations":[{"start":{"line":57,"column":19},"end":{"line":57,"column":40}},{"start":{"line":59,"column":8},"end":{"line":59,"column":40}},{"start":{"line":59,"column":44},"end":{"line":59,"column":83}}]},"8":{"loc":{"start":{"line":59,"column":44},"end":{"line":59,"column":73}},"type":"cond-expr","locations":[{"start":{"line":59,"column":62},"end":{"line":59,"column":64}},{"start":{"line":59,"column":44},"end":{"line":59,"column":73}}]},"9":{"loc":{"start":{"line":59,"column":44},"end":{"line":59,"column":64}},"type":"binary-expr","locations":[{"start":{"line":59,"column":44},"end":{"line":59,"column":64}},{"start":{"line":59,"column":44},"end":{"line":59,"column":64}}]},"10":{"loc":{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},{"start":{"line":76,"column":7},"end":{"line":88,"column":null}}]},"11":{"loc":{"start":{"line":63,"column":20},"end":{"line":63,"column":69}},"type":"cond-expr","locations":[{"start":{"line":63,"column":59},"end":{"line":63,"column":61}},{"start":{"line":63,"column":23},"end":{"line":63,"column":69}}]},"12":{"loc":{"start":{"line":63,"column":20},"end":{"line":63,"column":61}},"type":"binary-expr","locations":[{"start":{"line":63,"column":20},"end":{"line":63,"column":61}},{"start":{"line":63,"column":59},"end":{"line":63,"column":61}}]},"13":{"loc":{"start":{"line":64,"column":6},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":6},"end":{"line":66,"column":null}}]},"14":{"loc":{"start":{"line":71,"column":6},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":6},"end":{"line":73,"column":null}}]},"15":{"loc":{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},{"start":{"line":80,"column":9},"end":{"line":87,"column":null}}]},"16":{"loc":{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},{"start":{"line":109,"column":7},"end":{"line":146,"column":null}}]},"17":{"loc":{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},{"start":{"line":107,"column":9},"end":{"line":107,"column":null}}]},"18":{"loc":{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},{"start":{"line":112,"column":7},"end":{"line":146,"column":null}}]},"19":{"loc":{"start":{"line":109,"column":11},"end":{"line":109,"column":57}},"type":"binary-expr","locations":[{"start":{"line":109,"column":11},"end":{"line":109,"column":30}},{"start":{"line":109,"column":34},"end":{"line":109,"column":57}}]},"20":{"loc":{"start":{"line":115,"column":27},"end":{"line":117,"column":64}},"type":"cond-expr","locations":[{"start":{"line":116,"column":8},"end":{"line":116,"column":10}},{"start":{"line":117,"column":8},"end":{"line":117,"column":64}}]},"21":{"loc":{"start":{"line":119,"column":28},"end":{"line":119,"column":null}},"type":"binary-expr","locations":[{"start":{"line":119,"column":28},"end":{"line":119,"column":46}},{"start":{"line":119,"column":50},"end":{"line":119,"column":108}}]},"22":{"loc":{"start":{"line":119,"column":50},"end":{"line":119,"column":108}},"type":"cond-expr","locations":[{"start":{"line":119,"column":70},"end":{"line":119,"column":73}},{"start":{"line":119,"column":50},"end":{"line":119,"column":108}}]},"23":{"loc":{"start":{"line":119,"column":50},"end":{"line":119,"column":73}},"type":"binary-expr","locations":[{"start":{"line":119,"column":50},"end":{"line":119,"column":73}},{"start":{"line":119,"column":50},"end":{"line":119,"column":73}}]},"24":{"loc":{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},{"start":{"line":125,"column":9},"end":{"line":145,"column":null}}]},"25":{"loc":{"start":{"line":121,"column":8},"end":{"line":121,"column":94}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":26}},{"start":{"line":121,"column":30},"end":{"line":121,"column":58}},{"start":{"line":121,"column":62},"end":{"line":121,"column":94}}]},"26":{"loc":{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},{"start":{"line":137,"column":9},"end":{"line":145,"column":null}}]},"27":{"loc":{"start":{"line":125,"column":13},"end":{"line":125,"column":93}},"type":"binary-expr","locations":[{"start":{"line":125,"column":13},"end":{"line":125,"column":35}},{"start":{"line":125,"column":40},"end":{"line":125,"column":55}},{"start":{"line":125,"column":59},"end":{"line":125,"column":93}}]}},"s":{"0":4,"1":4,"2":10,"3":10,"4":6,"5":4,"6":4,"7":0,"8":4,"9":0,"10":4,"11":2,"12":2,"13":2,"14":10,"15":4,"16":46,"17":46,"18":12,"19":34,"20":8,"21":8,"22":26,"23":46,"24":4,"25":14,"26":14,"27":14,"28":84,"29":14,"30":14,"31":14,"32":8,"33":48,"34":8,"35":8,"36":36,"37":8,"38":0,"39":8,"40":8,"41":40,"42":40,"43":132,"44":6,"45":4,"46":2,"47":12,"48":2,"49":2,"50":10,"51":2,"52":14,"53":4,"54":30,"55":2,"56":2,"57":0,"58":28,"59":2,"60":26,"61":26,"62":26,"63":106,"64":26,"65":26,"66":2,"67":24,"68":10,"69":14,"70":30,"71":4},"f":{"0":10,"1":10,"2":46,"3":14,"4":14,"5":84,"6":48,"7":8,"8":36,"9":132,"10":12,"11":10,"12":30,"13":106},"b":{"0":[10,6],"1":[6],"2":[0],"3":[0,4],"4":[2,2],"5":[12,34],"6":[8,26],"7":[14,6,6],"8":[2,4],"9":[6,6],"10":[8,6],"11":[0,8],"12":[8,8],"13":[0],"14":[40],"15":[4,2],"16":[2,28],"17":[2,0],"18":[2,26],"19":[28,4],"20":[2,24],"21":[26,22],"22":[0,22],"23":[22,22],"24":[2,24],"25":[26,22,4],"26":[10,14],"27":[24,20,10]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/options-tokenizer.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/options-tokenizer.mjs","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":64}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":26},"end":{"line":19,"column":6}},"3":{"start":{"line":5,"column":2},"end":{"line":19,"column":6}},"4":{"start":{"line":7,"column":33},"end":{"line":7,"column":45}},"5":{"start":{"line":8,"column":6},"end":{"line":16,"column":null}},"6":{"start":{"line":9,"column":22},"end":{"line":9,"column":44}},"7":{"start":{"line":10,"column":8},"end":{"line":15,"column":null}},"8":{"start":{"line":11,"column":10},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":21},"end":{"line":12,"column":29}},"10":{"start":{"line":13,"column":29},"end":{"line":13,"column":55}},"11":{"start":{"line":14,"column":10},"end":{"line":14,"column":null}},"12":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":26},"end":{"line":4,"column":38}},"loc":{"start":{"line":5,"column":2},"end":{"line":19,"column":6}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":10},"end":{"line":6,"column":11}},"loc":{"start":{"line":6,"column":16},"end":{"line":19,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":3},"end":{"line":5,"column":40}},"type":"binary-expr","locations":[{"start":{"line":5,"column":3},"end":{"line":5,"column":34}},{"start":{"line":5,"column":38},"end":{"line":5,"column":40}}]},"1":{"loc":{"start":{"line":7,"column":17},"end":{"line":7,"column":29}},"type":"default-arg","locations":[{"start":{"line":7,"column":25},"end":{"line":7,"column":29}}]},"2":{"loc":{"start":{"line":8,"column":6},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":6},"end":{"line":16,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":8},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":8},"end":{"line":15,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":32,"4":37,"5":37,"6":15,"7":15,"8":2,"9":2,"10":2,"11":2,"12":37,"13":5},"f":{"0":32,"1":37},"b":{"0":[32,2],"1":[22],"2":[15],"3":[2]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/detail.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/detail.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":10},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":12},"end":{"line":9,"column":20}},"3":{"start":{"line":11,"column":10},"end":{"line":11,"column":56}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":21}},"5":{"start":{"line":14,"column":23},"end":{"line":40,"column":1}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":22}},"7":{"start":{"line":16,"column":16},"end":{"line":16,"column":21}},"8":{"start":{"line":17,"column":20},"end":{"line":17,"column":21}},"9":{"start":{"line":18,"column":16},"end":{"line":18,"column":32}},"10":{"start":{"line":20,"column":2},"end":{"line":37,"column":null}},"11":{"start":{"line":21,"column":23},"end":{"line":21,"column":50}},"12":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"13":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"14":{"start":{"line":25,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"16":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"17":{"start":{"line":29,"column":4},"end":{"line":32,"column":null}},"18":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"19":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"20":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"21":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"22":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"23":{"start":{"line":42,"column":16},"end":{"line":65,"column":1}},"24":{"start":{"line":43,"column":17},"end":{"line":47,"column":4}},"25":{"start":{"line":49,"column":15},"end":{"line":49,"column":47}},"26":{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},"27":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"28":{"start":{"line":54,"column":21},"end":{"line":54,"column":36}},"29":{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},"30":{"start":{"line":56,"column":6},"end":{"line":56,"column":null}},"31":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"32":{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},"33":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"34":{"start":{"line":67,"column":13},"end":{"line":82,"column":1}},"35":{"start":{"line":68,"column":2},"end":{"line":72,"column":null}},"36":{"start":{"line":69,"column":27},"end":{"line":70,"column":55}},"37":{"start":{"line":69,"column":61},"end":{"line":69,"column":65}},"38":{"start":{"line":70,"column":49},"end":{"line":70,"column":53}},"39":{"start":{"line":74,"column":2},"end":{"line":81,"column":null}},"40":{"start":{"line":75,"column":25},"end":{"line":75,"column":33}},"41":{"start":{"line":77,"column":18},"end":{"line":78,"column":61}},"42":{"start":{"line":77,"column":53},"end":{"line":77,"column":70}},"43":{"start":{"line":78,"column":43},"end":{"line":78,"column":60}},"44":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"45":{"start":{"line":82,"column":1},"end":{"line":82,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":23},"end":{"line":14,"column":27}},"loc":{"start":{"line":14,"column":32},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":16},"end":{"line":42,"column":17}},"loc":{"start":{"line":42,"column":40},"end":{"line":65,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":67,"column":13},"end":{"line":67,"column":14}},"loc":{"start":{"line":67,"column":60},"end":{"line":82,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":69,"column":21},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":27},"end":{"line":70,"column":55}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":69,"column":55},"end":{"line":69,"column":56}},"loc":{"start":{"line":69,"column":61},"end":{"line":69,"column":65}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":70,"column":43},"end":{"line":70,"column":44}},"loc":{"start":{"line":70,"column":49},"end":{"line":70,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":74,"column":9},"end":{"line":74,"column":10}},"loc":{"start":{"line":74,"column":23},"end":{"line":81,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":47},"end":{"line":77,"column":48}},"loc":{"start":{"line":77,"column":53},"end":{"line":77,"column":70}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":78,"column":37},"end":{"line":78,"column":38}},"loc":{"start":{"line":78,"column":43},"end":{"line":78,"column":60}}}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":43}},"type":"binary-expr","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":15}},{"start":{"line":22,"column":19},"end":{"line":22,"column":43}}]},"2":{"loc":{"start":{"line":25,"column":4},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":28,"column":null}}]},"3":{"loc":{"start":{"line":29,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":32,"column":null}}]},"4":{"loc":{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},{"start":{"line":53,"column":7},"end":{"line":64,"column":null}}]},"5":{"loc":{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},{"start":{"line":59,"column":9},"end":{"line":61,"column":null}}]},"6":{"loc":{"start":{"line":77,"column":18},"end":{"line":78,"column":61}},"type":"binary-expr","locations":[{"start":{"line":77,"column":18},"end":{"line":77,"column":71}},{"start":{"line":78,"column":7},"end":{"line":78,"column":61}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":4,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":4,"35":7,"36":4,"37":0,"38":0,"39":7,"40":0,"41":0,"42":0,"43":0,"44":0,"45":4},"f":{"0":0,"1":0,"2":7,"3":4,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0],"1":[0,0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/list.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":10},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":12},"end":{"line":9,"column":20}},"3":{"start":{"line":11,"column":10},"end":{"line":11,"column":42}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":39}},"5":{"start":{"line":14,"column":22},"end":{"line":14,"column":65}},"6":{"start":{"line":15,"column":18},"end":{"line":15,"column":70}},"7":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"8":{"start":{"line":16,"column":23},"end":{"line":16,"column":42}},"9":{"start":{"line":16,"column":64},"end":{"line":16,"column":73}},"10":{"start":{"line":18,"column":20},"end":{"line":19,"column":92}},"11":{"start":{"line":19,"column":3},"end":{"line":19,"column":92}},"12":{"start":{"line":19,"column":36},"end":{"line":19,"column":76}},"13":{"start":{"line":21,"column":27},"end":{"line":22,"column":98}},"14":{"start":{"line":22,"column":2},"end":{"line":22,"column":98}},"15":{"start":{"line":22,"column":19},"end":{"line":22,"column":79}},"16":{"start":{"line":24,"column":23},"end":{"line":24,"column":75}},"17":{"start":{"line":24,"column":32},"end":{"line":24,"column":75}},"18":{"start":{"line":26,"column":13},"end":{"line":43,"column":1}},"19":{"start":{"line":26,"column":43},"end":{"line":43,"column":1}},"20":{"start":{"line":27,"column":17},"end":{"line":28,"column":88}},"21":{"start":{"line":27,"column":51},"end":{"line":27,"column":89}},"22":{"start":{"line":28,"column":47},"end":{"line":28,"column":86}},"23":{"start":{"line":30,"column":2},"end":{"line":42,"column":null}},"24":{"start":{"line":43,"column":1},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":17},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":23},"end":{"line":16,"column":42}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":58},"end":{"line":16,"column":64}},"loc":{"start":{"line":16,"column":64},"end":{"line":16,"column":73}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":20},"end":{"line":18,"column":21}},"loc":{"start":{"line":19,"column":3},"end":{"line":19,"column":92}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":19,"column":36},"end":{"line":19,"column":76}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":21,"column":27},"end":{"line":21,"column":31}},"loc":{"start":{"line":22,"column":2},"end":{"line":22,"column":98}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":22,"column":12},"end":{"line":22,"column":13}},"loc":{"start":{"line":22,"column":19},"end":{"line":22,"column":79}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":24,"column":23},"end":{"line":24,"column":27}},"loc":{"start":{"line":24,"column":32},"end":{"line":24,"column":75}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":26,"column":13},"end":{"line":26,"column":14}},"loc":{"start":{"line":26,"column":43},"end":{"line":43,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":26,"column":43},"end":{"line":26,"column":44}},"loc":{"start":{"line":26,"column":57},"end":{"line":43,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":27,"column":45},"end":{"line":27,"column":46}},"loc":{"start":{"line":27,"column":51},"end":{"line":27,"column":89}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":28,"column":41},"end":{"line":28,"column":42}},"loc":{"start":{"line":28,"column":47},"end":{"line":28,"column":86}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":0,"12":0,"13":4,"14":0,"15":0,"16":4,"17":0,"18":4,"19":7,"20":0,"21":0,"22":0,"23":0,"24":4},"f":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":7,"8":0,"9":0,"10":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/add.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/add.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":19},"end":{"line":6,"column":27}},"3":{"start":{"line":8,"column":10},"end":{"line":12,"column":1}},"4":{"start":{"line":14,"column":12},"end":{"line":14,"column":20}},"5":{"start":{"line":16,"column":16},"end":{"line":21,"column":null}},"6":{"start":{"line":24,"column":10},"end":{"line":24,"column":41}},"7":{"start":{"line":26,"column":13},"end":{"line":41,"column":1}},"8":{"start":{"line":26,"column":36},"end":{"line":41,"column":1}},"9":{"start":{"line":27,"column":27},"end":{"line":27,"column":55}},"10":{"start":{"line":28,"column":23},"end":{"line":28,"column":31}},"11":{"start":{"line":30,"column":23},"end":{"line":30,"column":82}},"12":{"start":{"line":32,"column":24},"end":{"line":38,"column":4}},"13":{"start":{"line":36,"column":23},"end":{"line":36,"column":35}},"14":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"15":{"start":{"line":41,"column":1},"end":{"line":41,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":26,"column":13},"end":{"line":26,"column":14}},"loc":{"start":{"line":26,"column":36},"end":{"line":41,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":36},"end":{"line":26,"column":42}},"loc":{"start":{"line":26,"column":55},"end":{"line":41,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":17},"end":{"line":36,"column":23}},"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":35}}}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":27},"end":{"line":27,"column":55}},"type":"binary-expr","locations":[{"start":{"line":27,"column":27},"end":{"line":27,"column":49}},{"start":{"line":27,"column":53},"end":{"line":27,"column":55}}]},"1":{"loc":{"start":{"line":30,"column":23},"end":{"line":30,"column":82}},"type":"binary-expr","locations":[{"start":{"line":30,"column":23},"end":{"line":30,"column":54}},{"start":{"line":30,"column":58},"end":{"line":30,"column":82}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":15,"9":8,"10":8,"11":8,"12":8,"13":1,"14":8,"15":5},"f":{"0":15,"1":8,"2":1},"b":{"0":[8,1],"1":[8,2]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/details.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/details.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":27},"end":{"line":15,"column":1}},"3":{"start":{"line":5,"column":15},"end":{"line":9,"column":3}},"4":{"start":{"line":10,"column":17},"end":{"line":10,"column":22}},"5":{"start":{"line":12,"column":21},"end":{"line":12,"column":23}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":17,"column":29},"end":{"line":29,"column":3}},"8":{"start":{"line":18,"column":2},"end":{"line":29,"column":3}},"9":{"start":{"line":18,"column":25},"end":{"line":29,"column":3}},"10":{"start":{"line":19,"column":29},"end":{"line":19,"column":74}},"11":{"start":{"line":20,"column":23},"end":{"line":20,"column":40}},"12":{"start":{"line":22,"column":23},"end":{"line":22,"column":85}},"13":{"start":{"line":22,"column":62},"end":{"line":22,"column":84}},"14":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"15":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"16":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"17":{"start":{"line":31,"column":37},"end":{"line":31,"column":92}},"18":{"start":{"line":31,"column":92},"end":{"line":31,"column":null}},"19":{"start":{"line":33,"column":22},"end":{"line":33,"column":40}},"20":{"start":{"line":35,"column":10},"end":{"line":35,"column":66}},"21":{"start":{"line":37,"column":34},"end":{"line":37,"column":69}},"22":{"start":{"line":37,"column":47},"end":{"line":37,"column":69}},"23":{"start":{"line":39,"column":10},"end":{"line":39,"column":89}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":48},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":29},"end":{"line":17,"column":30}},"loc":{"start":{"line":18,"column":2},"end":{"line":29,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":2},"end":{"line":18,"column":3}},"loc":{"start":{"line":18,"column":25},"end":{"line":29,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":25},"end":{"line":18,"column":31}},"loc":{"start":{"line":18,"column":44},"end":{"line":29,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":22,"column":45},"end":{"line":22,"column":46}},"loc":{"start":{"line":22,"column":62},"end":{"line":22,"column":84}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":37,"column":34},"end":{"line":37,"column":35}},"loc":{"start":{"line":37,"column":47},"end":{"line":37,"column":69}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":29},"end":{"line":19,"column":74}},"type":"binary-expr","locations":[{"start":{"line":19,"column":29},"end":{"line":19,"column":68}},{"start":{"line":19,"column":72},"end":{"line":19,"column":74}}]},"1":{"loc":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":25,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":15,"10":8,"11":8,"12":8,"13":7,"14":8,"15":4,"16":4,"17":5,"18":15,"19":5,"20":5,"21":5,"22":8,"23":5},"f":{"0":5,"1":5,"2":15,"3":8,"4":7,"5":8},"b":{"0":[8,2],"1":[4]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/list.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":104}},"3":{"start":{"line":7,"column":25},"end":{"line":21,"column":1}},"4":{"start":{"line":8,"column":15},"end":{"line":12,"column":3}},"5":{"start":{"line":13,"column":17},"end":{"line":13,"column":22}},"6":{"start":{"line":15,"column":21},"end":{"line":16,"column":null}},"7":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":18,"column":25},"end":{"line":18,"column":44}},"9":{"start":{"line":18,"column":69},"end":{"line":18,"column":78}},"10":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"11":{"start":{"line":23,"column":24},"end":{"line":51,"column":1}},"12":{"start":{"line":36,"column":13},"end":{"line":36,"column":51}},"13":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"14":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"15":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"16":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"17":{"start":{"line":43,"column":2},"end":{"line":45,"column":null}},"18":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"19":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"20":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"21":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"22":{"start":{"line":53,"column":20},"end":{"line":66,"column":16}},"23":{"start":{"line":53,"column":47},"end":{"line":66,"column":16}},"24":{"start":{"line":54,"column":20},"end":{"line":66,"column":4}},"25":{"start":{"line":69,"column":26},"end":{"line":83,"column":1}},"26":{"start":{"line":70,"column":2},"end":{"line":82,"column":null}},"27":{"start":{"line":70,"column":25},"end":{"line":82,"column":4}},"28":{"start":{"line":86,"column":22},"end":{"line":87,"column":52}},"29":{"start":{"line":87,"column":2},"end":{"line":87,"column":52}},"30":{"start":{"line":87,"column":18},"end":{"line":87,"column":40}},"31":{"start":{"line":90,"column":27},"end":{"line":112,"column":3}},"32":{"start":{"line":91,"column":2},"end":{"line":112,"column":3}},"33":{"start":{"line":91,"column":32},"end":{"line":112,"column":3}},"34":{"start":{"line":92,"column":29},"end":{"line":92,"column":81}},"35":{"start":{"line":94,"column":26},"end":{"line":94,"column":89}},"36":{"start":{"line":95,"column":17},"end":{"line":98,"column":43}},"37":{"start":{"line":96,"column":19},"end":{"line":96,"column":45}},"38":{"start":{"line":98,"column":8},"end":{"line":98,"column":42}},"39":{"start":{"line":99,"column":4},"end":{"line":111,"column":null}},"40":{"start":{"line":114,"column":37},"end":{"line":114,"column":90}},"41":{"start":{"line":114,"column":90},"end":{"line":114,"column":null}},"42":{"start":{"line":116,"column":10},"end":{"line":116,"column":42}},"43":{"start":{"line":118,"column":34},"end":{"line":118,"column":67}},"44":{"start":{"line":118,"column":47},"end":{"line":118,"column":67}},"45":{"start":{"line":120,"column":10},"end":{"line":120,"column":62}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":26}},"loc":{"start":{"line":7,"column":46},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":19},"end":{"line":18,"column":20}},"loc":{"start":{"line":18,"column":25},"end":{"line":18,"column":44}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":63},"end":{"line":18,"column":69}},"loc":{"start":{"line":18,"column":69},"end":{"line":18,"column":78}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":24},"end":{"line":23,"column":25}},"loc":{"start":{"line":35,"column":6},"end":{"line":51,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":21}},"loc":{"start":{"line":53,"column":47},"end":{"line":66,"column":16}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":54,"column":14},"end":{"line":54,"column":15}},"loc":{"start":{"line":54,"column":20},"end":{"line":66,"column":4}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":69,"column":26},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":45},"end":{"line":83,"column":1}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":70,"column":19},"end":{"line":70,"column":20}},"loc":{"start":{"line":70,"column":25},"end":{"line":82,"column":4}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":86,"column":22},"end":{"line":86,"column":23}},"loc":{"start":{"line":87,"column":2},"end":{"line":87,"column":52}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":87,"column":12},"end":{"line":87,"column":13}},"loc":{"start":{"line":87,"column":18},"end":{"line":87,"column":40}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":90,"column":27},"end":{"line":90,"column":28}},"loc":{"start":{"line":91,"column":2},"end":{"line":112,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":91,"column":2},"end":{"line":91,"column":3}},"loc":{"start":{"line":91,"column":32},"end":{"line":112,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":32},"end":{"line":91,"column":38}},"loc":{"start":{"line":91,"column":51},"end":{"line":112,"column":3}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":96,"column":12},"end":{"line":96,"column":13}},"loc":{"start":{"line":96,"column":19},"end":{"line":96,"column":45}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":97,"column":12},"end":{"line":97,"column":13}},"loc":{"start":{"line":98,"column":8},"end":{"line":98,"column":42}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":118,"column":34},"end":{"line":118,"column":35}},"loc":{"start":{"line":118,"column":47},"end":{"line":118,"column":67}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"type":"default-arg","locations":[{"start":{"line":26,"column":18},"end":{"line":26,"column":20}}]},"1":{"loc":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"type":"default-arg","locations":[{"start":{"line":27,"column":17},"end":{"line":27,"column":19}}]},"2":{"loc":{"start":{"line":28,"column":2},"end":{"line":28,"column":21}},"type":"default-arg","locations":[{"start":{"line":28,"column":19},"end":{"line":28,"column":21}}]},"3":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"type":"default-arg","locations":[{"start":{"line":29,"column":18},"end":{"line":29,"column":20}}]},"4":{"loc":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"type":"default-arg","locations":[{"start":{"line":30,"column":14},"end":{"line":30,"column":16}}]},"5":{"loc":{"start":{"line":31,"column":2},"end":{"line":31,"column":15}},"type":"default-arg","locations":[{"start":{"line":31,"column":13},"end":{"line":31,"column":15}}]},"6":{"loc":{"start":{"line":33,"column":2},"end":{"line":33,"column":20}},"type":"default-arg","locations":[{"start":{"line":33,"column":18},"end":{"line":33,"column":20}}]},"7":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"type":"default-arg","locations":[{"start":{"line":34,"column":17},"end":{"line":34,"column":null}}]},"8":{"loc":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":39,"column":null}}]},"9":{"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":null}}]},"10":{"loc":{"start":{"line":40,"column":6},"end":{"line":40,"column":63}},"type":"binary-expr","locations":[{"start":{"line":40,"column":6},"end":{"line":40,"column":31}},{"start":{"line":40,"column":35},"end":{"line":40,"column":63}}]},"11":{"loc":{"start":{"line":41,"column":16},"end":{"line":41,"column":139}},"type":"cond-expr","locations":[{"start":{"line":41,"column":45},"end":{"line":41,"column":133}},{"start":{"line":41,"column":136},"end":{"line":41,"column":139}}]},"12":{"loc":{"start":{"line":41,"column":92},"end":{"line":41,"column":132}},"type":"cond-expr","locations":[{"start":{"line":41,"column":123},"end":{"line":41,"column":127}},{"start":{"line":41,"column":130},"end":{"line":41,"column":132}}]},"13":{"loc":{"start":{"line":41,"column":141},"end":{"line":41,"column":206}},"type":"cond-expr","locations":[{"start":{"line":41,"column":173},"end":{"line":41,"column":200}},{"start":{"line":41,"column":203},"end":{"line":41,"column":206}}]},"14":{"loc":{"start":{"line":43,"column":2},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":45,"column":null}}]},"15":{"loc":{"start":{"line":43,"column":6},"end":{"line":43,"column":53}},"type":"binary-expr","locations":[{"start":{"line":43,"column":6},"end":{"line":43,"column":29}},{"start":{"line":43,"column":33},"end":{"line":43,"column":53}}]},"16":{"loc":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":48,"column":null}}]},"17":{"loc":{"start":{"line":53,"column":23},"end":{"line":53,"column":32}},"type":"default-arg","locations":[{"start":{"line":53,"column":30},"end":{"line":53,"column":32}}]},"18":{"loc":{"start":{"line":69,"column":29},"end":{"line":69,"column":39}},"type":"default-arg","locations":[{"start":{"line":69,"column":36},"end":{"line":69,"column":39}}]},"19":{"loc":{"start":{"line":86,"column":25},"end":{"line":86,"column":35}},"type":"default-arg","locations":[{"start":{"line":86,"column":32},"end":{"line":86,"column":35}}]},"20":{"loc":{"start":{"line":92,"column":29},"end":{"line":92,"column":81}},"type":"binary-expr","locations":[{"start":{"line":92,"column":29},"end":{"line":92,"column":75}},{"start":{"line":92,"column":79},"end":{"line":92,"column":81}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":0,"10":5,"11":5,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":5,"23":0,"24":0,"25":5,"26":0,"27":0,"28":5,"29":0,"30":0,"31":5,"32":5,"33":13,"34":6,"35":6,"36":6,"37":8,"38":4,"39":6,"40":5,"41":15,"42":5,"43":5,"44":6,"45":5},"f":{"0":5,"1":5,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":5,"11":13,"12":6,"13":8,"14":4,"15":6},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0],"6":[0],"7":[0],"8":[0],"9":[0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0],"15":[0,0],"16":[0],"17":[0],"18":[0],"19":[0],"20":[6,1]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/remove.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/remove.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":27},"end":{"line":17,"column":1}},"4":{"start":{"line":6,"column":15},"end":{"line":10,"column":3}},"5":{"start":{"line":12,"column":17},"end":{"line":12,"column":25}},"6":{"start":{"line":14,"column":21},"end":{"line":14,"column":23}},"7":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"8":{"start":{"line":19,"column":29},"end":{"line":47,"column":3}},"9":{"start":{"line":20,"column":2},"end":{"line":47,"column":3}},"10":{"start":{"line":20,"column":25},"end":{"line":47,"column":3}},"11":{"start":{"line":21,"column":29},"end":{"line":21,"column":68}},"12":{"start":{"line":22,"column":23},"end":{"line":22,"column":40}},"13":{"start":{"line":24,"column":23},"end":{"line":24,"column":85}},"14":{"start":{"line":24,"column":62},"end":{"line":24,"column":84}},"15":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"16":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"17":{"start":{"line":30,"column":20},"end":{"line":30,"column":38}},"18":{"start":{"line":31,"column":25},"end":{"line":31,"column":70}},"19":{"start":{"line":34,"column":4},"end":{"line":37,"column":null}},"20":{"start":{"line":39,"column":4},"end":{"line":44,"column":null}},"21":{"start":{"line":40,"column":21},"end":{"line":40,"column":40}},"22":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"23":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"24":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"25":{"start":{"line":49,"column":37},"end":{"line":49,"column":92}},"26":{"start":{"line":49,"column":92},"end":{"line":49,"column":null}},"27":{"start":{"line":51,"column":22},"end":{"line":51,"column":40}},"28":{"start":{"line":53,"column":10},"end":{"line":53,"column":65}},"29":{"start":{"line":55,"column":34},"end":{"line":55,"column":69}},"30":{"start":{"line":55,"column":47},"end":{"line":55,"column":69}},"31":{"start":{"line":57,"column":10},"end":{"line":62,"column":2}},"32":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}},"33":{"start":{"line":61,"column":39},"end":{"line":61,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":27},"end":{"line":5,"column":28}},"loc":{"start":{"line":5,"column":48},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":20,"column":2},"end":{"line":47,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":3}},"loc":{"start":{"line":20,"column":25},"end":{"line":47,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":25},"end":{"line":20,"column":31}},"loc":{"start":{"line":20,"column":44},"end":{"line":47,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":24,"column":45},"end":{"line":24,"column":46}},"loc":{"start":{"line":24,"column":62},"end":{"line":24,"column":84}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":55,"column":34},"end":{"line":55,"column":35}},"loc":{"start":{"line":55,"column":47},"end":{"line":55,"column":69}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":60,"column":26},"end":{"line":60,"column":27}},"loc":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":61,"column":26},"end":{"line":61,"column":27}},"loc":{"start":{"line":61,"column":39},"end":{"line":61,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":null}}]},"1":{"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":44,"column":null}}]},"2":{"loc":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":43,"column":null}}]},"3":{"loc":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}},"type":"binary-expr","locations":[{"start":{"line":60,"column":39},"end":{"line":60,"column":70}},{"start":{"line":60,"column":74},"end":{"line":60,"column":98}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":5,"10":12,"11":5,"12":5,"13":5,"14":6,"15":5,"16":1,"17":4,"18":4,"19":4,"20":4,"21":4,"22":4,"23":0,"24":4,"25":5,"26":15,"27":5,"28":5,"29":5,"30":5,"31":5,"32":4,"33":4},"f":{"0":5,"1":5,"2":12,"3":5,"4":6,"5":5,"6":4,"7":4},"b":{"0":[1],"1":[4],"2":[0],"3":[4,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/add-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/add-plugins.mjs","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":14,"column":19},"end":{"line":29,"column":1}},"2":{"start":{"line":15,"column":27},"end":{"line":15,"column":55}},"3":{"start":{"line":17,"column":23},"end":{"line":17,"column":82}},"4":{"start":{"line":18,"column":21},"end":{"line":18,"column":39}},"5":{"start":{"line":18,"column":27},"end":{"line":18,"column":39}},"6":{"start":{"line":20,"column":17},"end":{"line":26,"column":4}},"7":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"8":{"start":{"line":29,"column":1},"end":{"line":29,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":19},"end":{"line":14,"column":25}},"loc":{"start":{"line":14,"column":64},"end":{"line":29,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":21},"end":{"line":18,"column":27}},"loc":{"start":{"line":18,"column":27},"end":{"line":18,"column":39}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":27},"end":{"line":15,"column":55}},"type":"binary-expr","locations":[{"start":{"line":15,"column":27},"end":{"line":15,"column":49}},{"start":{"line":15,"column":53},"end":{"line":15,"column":55}}]},"1":{"loc":{"start":{"line":17,"column":23},"end":{"line":17,"column":82}},"type":"binary-expr","locations":[{"start":{"line":17,"column":23},"end":{"line":17,"column":54}},{"start":{"line":17,"column":58},"end":{"line":17,"column":82}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/error-utils.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/error-utils.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":22,"column":24},"end":{"line":111,"column":1}},"2":{"start":{"line":27,"column":4},"end":{"line":32,"column":null}},"3":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"4":{"start":{"line":54,"column":4},"end":{"line":58,"column":null}},"5":{"start":{"line":65,"column":4},"end":{"line":70,"column":null}},"6":{"start":{"line":77,"column":4},"end":{"line":83,"column":null}},"7":{"start":{"line":90,"column":4},"end":{"line":98,"column":null}},"8":{"start":{"line":105,"column":4},"end":{"line":109,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":17},"end":{"line":26,"column":18}},"loc":{"start":{"line":26,"column":44},"end":{"line":33,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":15},"end":{"line":38,"column":16}},"loc":{"start":{"line":38,"column":57},"end":{"line":48,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":53,"column":11},"end":{"line":53,"column":12}},"loc":{"start":{"line":53,"column":46},"end":{"line":59,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":12},"end":{"line":64,"column":13}},"loc":{"start":{"line":64,"column":63},"end":{"line":71,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":76,"column":15},"end":{"line":76,"column":16}},"loc":{"start":{"line":76,"column":62},"end":{"line":84,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":89,"column":18},"end":{"line":89,"column":19}},"loc":{"start":{"line":89,"column":65},"end":{"line":99,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":104,"column":13},"end":{"line":104,"column":14}},"loc":{"start":{"line":104,"column":71},"end":{"line":110,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":27},"end":{"line":26,"column":39}},"type":"default-arg","locations":[{"start":{"line":26,"column":37},"end":{"line":26,"column":39}}]},"1":{"loc":{"start":{"line":38,"column":40},"end":{"line":38,"column":52}},"type":"default-arg","locations":[{"start":{"line":38,"column":50},"end":{"line":38,"column":52}}]},"2":{"loc":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"type":"default-arg","locations":[{"start":{"line":53,"column":37},"end":{"line":53,"column":41}}]},"3":{"loc":{"start":{"line":64,"column":38},"end":{"line":64,"column":58}},"type":"default-arg","locations":[{"start":{"line":64,"column":54},"end":{"line":64,"column":58}}]},"4":{"loc":{"start":{"line":66,"column":53},"end":{"line":66,"column":110}},"type":"cond-expr","locations":[{"start":{"line":66,"column":69},"end":{"line":66,"column":90}},{"start":{"line":66,"column":93},"end":{"line":66,"column":110}}]},"5":{"loc":{"start":{"line":76,"column":25},"end":{"line":76,"column":37}},"type":"default-arg","locations":[{"start":{"line":76,"column":33},"end":{"line":76,"column":37}}]},"6":{"loc":{"start":{"line":76,"column":39},"end":{"line":76,"column":57}},"type":"default-arg","locations":[{"start":{"line":76,"column":53},"end":{"line":76,"column":57}}]},"7":{"loc":{"start":{"line":89,"column":48},"end":{"line":89,"column":60}},"type":"default-arg","locations":[{"start":{"line":89,"column":58},"end":{"line":89,"column":60}}]},"8":{"loc":{"start":{"line":104,"column":23},"end":{"line":104,"column":43}},"type":"default-arg","locations":[{"start":{"line":104,"column":39},"end":{"line":104,"column":43}}]},"9":{"loc":{"start":{"line":104,"column":45},"end":{"line":104,"column":66}},"type":"default-arg","locations":[{"start":{"line":104,"column":61},"end":{"line":104,"column":66}}]}},"s":{"0":8,"1":8,"2":4,"3":4,"4":4,"5":5,"6":4,"7":4,"8":6},"f":{"0":4,"1":4,"2":4,"3":5,"4":4,"5":4,"6":6},"b":{"0":[3],"1":[3],"2":[3],"3":[1],"4":[3,2],"5":[3],"6":[3],"7":[3],"8":[2],"9":[2]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/install-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/install-plugins.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":43}},"3":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"4":{"start":{"line":18,"column":23},"end":{"line":117,"column":1}},"5":{"start":{"line":25,"column":27},"end":{"line":25,"column":29}},"6":{"start":{"line":26,"column":20},"end":{"line":26,"column":22}},"7":{"start":{"line":29,"column":2},"end":{"line":39,"column":null}},"8":{"start":{"line":30,"column":31},"end":{"line":30,"column":81}},"9":{"start":{"line":31,"column":20},"end":{"line":31,"column":80}},"10":{"start":{"line":31,"column":59},"end":{"line":31,"column":79}},"11":{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},"12":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"13":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"14":{"start":{"line":41,"column":12},"end":{"line":41,"column":14}},"15":{"start":{"line":42,"column":15},"end":{"line":46,"column":3}},"16":{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},"17":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"19":{"start":{"line":55,"column":35},"end":{"line":58,"column":6}},"20":{"start":{"line":61,"column":4},"end":{"line":86,"column":null}},"21":{"start":{"line":62,"column":32},"end":{"line":62,"column":78}},"22":{"start":{"line":65,"column":6},"end":{"line":75,"column":null}},"23":{"start":{"line":66,"column":28},"end":{"line":66,"column":62}},"24":{"start":{"line":67,"column":25},"end":{"line":67,"column":52}},"25":{"start":{"line":69,"column":8},"end":{"line":71,"column":null}},"26":{"start":{"line":70,"column":10},"end":{"line":70,"column":null}},"27":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"28":{"start":{"line":77,"column":26},"end":{"line":82,"column":7}},"29":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"30":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"31":{"start":{"line":89,"column":4},"end":{"line":94,"column":null}},"32":{"start":{"line":90,"column":21},"end":{"line":90,"column":33}},"33":{"start":{"line":91,"column":6},"end":{"line":93,"column":null}},"34":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"35":{"start":{"line":96,"column":4},"end":{"line":96,"column":null}},"36":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"37":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"38":{"start":{"line":101,"column":4},"end":{"line":103,"column":null}},"39":{"start":{"line":102,"column":6},"end":{"line":102,"column":null}},"40":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"41":{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},"42":{"start":{"line":109,"column":6},"end":{"line":109,"column":null}},"43":{"start":{"line":112,"column":6},"end":{"line":112,"column":null}},"44":{"start":{"line":115,"column":4},"end":{"line":115,"column":null}},"45":{"start":{"line":117,"column":1},"end":{"line":117,"column":null}},"46":{"start":{"line":119,"column":21},"end":{"line":119,"column":24}},"47":{"start":{"line":121,"column":26},"end":{"line":125,"column":1}},"48":{"start":{"line":122,"column":2},"end":{"line":124,"column":null}},"49":{"start":{"line":123,"column":4},"end":{"line":123,"column":null}},"50":{"start":{"line":125,"column":1},"end":{"line":125,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":23},"end":{"line":18,"column":29}},"loc":{"start":{"line":24,"column":6},"end":{"line":117,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":42},"end":{"line":31,"column":43}},"loc":{"start":{"line":31,"column":59},"end":{"line":31,"column":79}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":121,"column":26},"end":{"line":121,"column":31}},"loc":{"start":{"line":121,"column":36},"end":{"line":125,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},{"start":{"line":36,"column":9},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},{"start":{"line":107,"column":7},"end":{"line":116,"column":null}}]},"5":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":56}},"type":"binary-expr","locations":[{"start":{"line":49,"column":4},"end":{"line":49,"column":14}},{"start":{"line":49,"column":4},"end":{"line":49,"column":14}},{"start":{"line":49,"column":4},"end":{"line":49,"column":56}}]},"6":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":52}},"type":"binary-expr","locations":[{"start":{"line":67,"column":25},"end":{"line":67,"column":46}},{"start":{"line":67,"column":50},"end":{"line":67,"column":52}}]},"7":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":46}},"type":"cond-expr","locations":[{"start":{"line":67,"column":36},"end":{"line":67,"column":38}},{"start":{"line":67,"column":25},"end":{"line":67,"column":46}}]},"8":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":38}},"type":"binary-expr","locations":[{"start":{"line":67,"column":25},"end":{"line":67,"column":38}},{"start":{"line":67,"column":25},"end":{"line":67,"column":38}}]},"9":{"loc":{"start":{"line":69,"column":8},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":8},"end":{"line":71,"column":null}}]},"10":{"loc":{"start":{"line":70,"column":10},"end":{"line":70,"column":131}},"type":"binary-expr","locations":[{"start":{"line":70,"column":10},"end":{"line":70,"column":20}},{"start":{"line":70,"column":10},"end":{"line":70,"column":20}},{"start":{"line":70,"column":10},"end":{"line":70,"column":131}}]},"11":{"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":99}},"type":"binary-expr","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},{"start":{"line":74,"column":8},"end":{"line":74,"column":99}}]},"12":{"loc":{"start":{"line":79,"column":27},"end":{"line":79,"column":46}},"type":"binary-expr","locations":[{"start":{"line":79,"column":27},"end":{"line":79,"column":34}},{"start":{"line":79,"column":38},"end":{"line":79,"column":46}}]},"13":{"loc":{"start":{"line":89,"column":4},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":4},"end":{"line":94,"column":null}}]},"14":{"loc":{"start":{"line":91,"column":6},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":6},"end":{"line":93,"column":null}}]},"15":{"loc":{"start":{"line":91,"column":10},"end":{"line":91,"column":22}},"type":"binary-expr","locations":[{"start":{"line":91,"column":10},"end":{"line":91,"column":18}},{"start":{"line":91,"column":10},"end":{"line":91,"column":18}},{"start":{"line":91,"column":10},"end":{"line":91,"column":22}}]},"16":{"loc":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":100,"column":null}}]},"17":{"loc":{"start":{"line":101,"column":4},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":103,"column":null}}]},"18":{"loc":{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},{"start":{"line":111,"column":9},"end":{"line":113,"column":null}}]},"19":{"loc":{"start":{"line":122,"column":2},"end":{"line":124,"column":null}},"type":"if","locations":[{"start":{"line":122,"column":2},"end":{"line":124,"column":null}}]}},"s":{"0":9,"1":9,"2":9,"3":396,"4":9,"5":27,"6":27,"7":27,"8":35,"9":35,"10":13,"11":35,"12":6,"13":29,"14":27,"15":27,"16":27,"17":24,"18":24,"19":23,"20":22,"21":27,"22":27,"23":27,"24":26,"25":26,"26":6,"27":1,"28":27,"29":27,"30":27,"31":22,"32":22,"33":22,"34":21,"35":21,"36":21,"37":21,"38":21,"39":3,"40":21,"41":3,"42":2,"43":1,"44":3,"45":9,"46":9,"47":9,"48":3,"49":1,"50":9},"f":{"0":18,"1":27,"2":13,"3":3},"b":{"0":[18],"1":[594,594,585],"2":[288,585],"3":[6,29],"4":[24,3],"5":[24,24,24],"6":[26,3],"7":[1,25],"8":[26,26],"9":[6],"10":[6,6,6],"11":[1,1,1],"12":[27,23],"13":[22],"14":[21],"15":[22,22,22],"16":[21],"17":[3],"18":[2,1],"19":[1]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/list-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/list-plugins.mjs","statementMap":{"0":{"start":{"line":8,"column":20},"end":{"line":10,"column":1}},"1":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":1},"end":{"line":10,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":20},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":33},"end":{"line":10,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":9},"end":{"line":9,"column":37}},"type":"binary-expr","locations":[{"start":{"line":9,"column":9},"end":{"line":9,"column":31}},{"start":{"line":9,"column":35},"end":{"line":9,"column":37}}]}},"s":{"0":5,"1":0,"2":5},"f":{"0":0},"b":{"0":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/configurables.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/configurables.js","statementMap":{"0":{"start":{"line":4,"column":33},"end":{"line":4,"column":74}},"1":{"start":{"line":4,"column":45},"end":{"line":4,"column":74}},"2":{"start":{"line":4,"column":74},"end":{"line":4,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":33},"end":{"line":4,"column":40}},"loc":{"start":{"line":4,"column":45},"end":{"line":4,"column":74}}}},"branchMap":{},"s":{"0":4,"1":0,"2":4},"f":{"0":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/find-own-home.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/find-own-home.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":32}},"4":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"5":{"start":{"line":33,"column":20},"end":{"line":76,"column":1}},"6":{"start":{"line":34,"column":2},"end":{"line":36,"column":null}},"7":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"8":{"start":{"line":41,"column":2},"end":{"line":51,"column":null}},"9":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"10":{"start":{"line":43,"column":34},"end":{"line":43,"column":80}},"11":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"12":{"start":{"line":45,"column":6},"end":{"line":45,"column":31}},"13":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"14":{"start":{"line":54,"column":2},"end":{"line":73,"column":null}},"15":{"start":{"line":55,"column":4},"end":{"line":72,"column":null}},"16":{"start":{"line":57,"column":23},"end":{"line":57,"column":56}},"17":{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},"18":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"19":{"start":{"line":61,"column":38},"end":{"line":61,"column":84}},"20":{"start":{"line":62,"column":8},"end":{"line":64,"column":null}},"21":{"start":{"line":63,"column":10},"end":{"line":63,"column":null}},"22":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"23":{"start":{"line":71,"column":6},"end":{"line":71,"column":null}},"24":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"25":{"start":{"line":76,"column":1},"end":{"line":76,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":20},"end":{"line":33,"column":26}},"loc":{"start":{"line":33,"column":45},"end":{"line":76,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":null}}]},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}}]},"5":{"loc":{"start":{"line":54,"column":2},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":73,"column":null}}]},"6":{"loc":{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},{"start":{"line":66,"column":11},"end":{"line":68,"column":null}}]},"7":{"loc":{"start":{"line":62,"column":8},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":64,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":314,"5":5,"6":19,"7":3,"8":16,"9":16,"10":10,"11":10,"12":1,"13":6,"14":16,"15":7,"16":7,"17":6,"18":5,"19":5,"20":5,"21":1,"22":1,"23":3,"24":13,"25":5},"f":{"0":15,"1":19},"b":{"0":[15],"1":[448,448,438],"2":[214,438],"3":[3],"4":[1],"5":[7],"6":[5,1],"7":[1]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/get-server-settings.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/get-server-settings.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":67}},"3":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":27},"end":{"line":20,"column":1}},"5":{"start":{"line":9,"column":29},"end":{"line":9,"column":82}},"6":{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"8":{"start":{"line":14,"column":27},"end":{"line":14,"column":29}},"9":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"10":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"11":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":6,"column":27},"end":{"line":6,"column":43}},"loc":{"start":{"line":6,"column":48},"end":{"line":20,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},{"start":{"line":13,"column":7},"end":{"line":19,"column":null}}]},"4":{"loc":{"start":{"line":11,"column":11},"end":{"line":11,"column":46}},"type":"binary-expr","locations":[{"start":{"line":11,"column":11},"end":{"line":11,"column":40}},{"start":{"line":11,"column":44},"end":{"line":11,"column":46}}]}},"s":{"0":4,"1":4,"2":4,"3":116,"4":4,"5":14,"6":14,"7":7,"8":7,"9":7,"10":7,"11":4},"f":{"0":8,"1":14},"b":{"0":[8],"1":[144,144,140],"2":[68,140],"3":[7,7],"4":[7,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/json-helpers.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/json-helpers.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":35}},"2":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"3":{"start":{"line":4,"column":25},"end":{"line":7,"column":1}},"4":{"start":{"line":5,"column":26},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":1},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":23},"end":{"line":24,"column":1}},"8":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"9":{"start":{"line":10,"column":28},"end":{"line":10,"column":null}},"10":{"start":{"line":12,"column":15},"end":{"line":12,"column":36}},"11":{"start":{"line":13,"column":2},"end":{"line":23,"column":null}},"12":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"13":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"14":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"15":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"16":{"start":{"line":24,"column":1},"end":{"line":24,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":4,"column":25},"end":{"line":4,"column":33}},"loc":{"start":{"line":4,"column":38},"end":{"line":7,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":23},"end":{"line":9,"column":27}},"loc":{"start":{"line":9,"column":32},"end":{"line":24,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"if","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"1":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"binary-expr","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"2":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"cond-expr","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":10,"column":null}}]},"4":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},{"start":{"line":20,"column":9},"end":{"line":22,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0,0],"2":[0,0],"3":[0],"4":[0,0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/load-plugins.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/load-plugins.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":54}},"4":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"5":{"start":{"line":10,"column":19},"end":{"line":33,"column":1}},"6":{"start":{"line":11,"column":56},"end":{"line":11,"column":59}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":99}},"8":{"start":{"line":15,"column":30},"end":{"line":15,"column":66}},"9":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}},"10":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"11":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"12":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"13":{"start":{"line":20,"column":27},"end":{"line":20,"column":null}},"14":{"start":{"line":21,"column":18},"end":{"line":21,"column":113}},"15":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"16":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"17":{"start":{"line":26,"column":2},"end":{"line":32,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"19":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"20":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"21":{"start":{"line":41,"column":33},"end":{"line":60,"column":1}},"22":{"start":{"line":42,"column":26},"end":{"line":42,"column":63}},"23":{"start":{"line":43,"column":26},"end":{"line":43,"column":63}},"24":{"start":{"line":44,"column":22},"end":{"line":44,"column":57}},"25":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"26":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"27":{"start":{"line":49,"column":2},"end":{"line":52,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"29":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"30":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"31":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"32":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"33":{"start":{"line":58,"column":18},"end":{"line":58,"column":48}},"34":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"35":{"start":{"line":69,"column":32},"end":{"line":92,"column":1}},"36":{"start":{"line":70,"column":26},"end":{"line":70,"column":63}},"37":{"start":{"line":71,"column":26},"end":{"line":71,"column":63}},"38":{"start":{"line":72,"column":28},"end":{"line":72,"column":52}},"39":{"start":{"line":74,"column":22},"end":{"line":76,"column":3}},"40":{"start":{"line":75,"column":27},"end":{"line":75,"column":null}},"41":{"start":{"line":78,"column":2},"end":{"line":80,"column":null}},"42":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"43":{"start":{"line":81,"column":2},"end":{"line":84,"column":null}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":null}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":null}},"46":{"start":{"line":85,"column":2},"end":{"line":88,"column":null}},"47":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"48":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"49":{"start":{"line":90,"column":18},"end":{"line":90,"column":48}},"50":{"start":{"line":91,"column":2},"end":{"line":91,"column":null}},"51":{"start":{"line":107,"column":20},"end":{"line":161,"column":1}},"52":{"start":{"line":109,"column":22},"end":{"line":109,"column":52}},"53":{"start":{"line":112,"column":2},"end":{"line":132,"column":null}},"54":{"start":{"line":113,"column":4},"end":{"line":113,"column":null}},"55":{"start":{"line":114,"column":28},"end":{"line":114,"column":96}},"56":{"start":{"line":116,"column":4},"end":{"line":118,"column":null}},"57":{"start":{"line":120,"column":4},"end":{"line":131,"column":null}},"58":{"start":{"line":121,"column":25},"end":{"line":121,"column":40}},"59":{"start":{"line":124,"column":6},"end":{"line":127,"column":null}},"60":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"61":{"start":{"line":126,"column":8},"end":{"line":126,"column":null}},"62":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"63":{"start":{"line":130,"column":6},"end":{"line":130,"column":null}},"64":{"start":{"line":135,"column":2},"end":{"line":135,"column":null}},"65":{"start":{"line":136,"column":25},"end":{"line":136,"column":77}},"66":{"start":{"line":139,"column":21},"end":{"line":139,"column":23}},"67":{"start":{"line":140,"column":21},"end":{"line":146,"column":4}},"68":{"start":{"line":141,"column":4},"end":{"line":144,"column":null}},"69":{"start":{"line":142,"column":6},"end":{"line":142,"column":null}},"70":{"start":{"line":143,"column":6},"end":{"line":143,"column":null}},"71":{"start":{"line":145,"column":4},"end":{"line":145,"column":null}},"72":{"start":{"line":149,"column":2},"end":{"line":151,"column":null}},"73":{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},"74":{"start":{"line":153,"column":2},"end":{"line":155,"column":null}},"75":{"start":{"line":157,"column":2},"end":{"line":160,"column":null}},"76":{"start":{"line":158,"column":4},"end":{"line":158,"column":null}},"77":{"start":{"line":159,"column":4},"end":{"line":159,"column":null}},"78":{"start":{"line":161,"column":1},"end":{"line":161,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":19},"end":{"line":10,"column":25}},"loc":{"start":{"line":10,"column":81},"end":{"line":33,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}},"loc":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}}},"3":{"name":"(anonymous_6)","decl":{"start":{"line":26,"column":31},"end":{"line":26,"column":37}},"loc":{"start":{"line":26,"column":37},"end":{"line":32,"column":3}}},"4":{"name":"(anonymous_7)","decl":{"start":{"line":41,"column":33},"end":{"line":41,"column":39}},"loc":{"start":{"line":41,"column":64},"end":{"line":60,"column":1}}},"5":{"name":"(anonymous_8)","decl":{"start":{"line":69,"column":32},"end":{"line":69,"column":38}},"loc":{"start":{"line":69,"column":80},"end":{"line":92,"column":1}}},"6":{"name":"(anonymous_9)","decl":{"start":{"line":75,"column":14},"end":{"line":75,"column":27}},"loc":{"start":{"line":75,"column":27},"end":{"line":75,"column":null}}},"7":{"name":"(anonymous_10)","decl":{"start":{"line":107,"column":20},"end":{"line":107,"column":26}},"loc":{"start":{"line":107,"column":120},"end":{"line":161,"column":1}}},"8":{"name":"(anonymous_11)","decl":{"start":{"line":140,"column":43},"end":{"line":140,"column":44}},"loc":{"start":{"line":140,"column":48},"end":{"line":146,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":99}},"type":"cond-expr","locations":[{"start":{"line":14,"column":29},"end":{"line":14,"column":31}},{"start":{"line":14,"column":18},"end":{"line":14,"column":99}}]},"4":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":31}},"type":"binary-expr","locations":[{"start":{"line":14,"column":18},"end":{"line":14,"column":31}},{"start":{"line":14,"column":18},"end":{"line":14,"column":31}}]},"5":{"loc":{"start":{"line":15,"column":30},"end":{"line":15,"column":66}},"type":"binary-expr","locations":[{"start":{"line":15,"column":30},"end":{"line":15,"column":60}},{"start":{"line":15,"column":64},"end":{"line":15,"column":66}}]},"6":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":null}}]},"7":{"loc":{"start":{"line":16,"column":6},"end":{"line":16,"column":51}},"type":"binary-expr","locations":[{"start":{"line":16,"column":6},"end":{"line":16,"column":28}},{"start":{"line":16,"column":32},"end":{"line":16,"column":51}}]},"8":{"loc":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":20,"column":null}}]},"9":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":113}},"type":"cond-expr","locations":[{"start":{"line":21,"column":23},"end":{"line":21,"column":26}},{"start":{"line":21,"column":18},"end":{"line":21,"column":113}}]},"10":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":26}},"type":"binary-expr","locations":[{"start":{"line":21,"column":18},"end":{"line":21,"column":26}},{"start":{"line":21,"column":18},"end":{"line":21,"column":26}}]},"11":{"loc":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":24,"column":null}}]},"12":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":21}},"type":"cond-expr","locations":[{"start":{"line":22,"column":15},"end":{"line":22,"column":17}},{"start":{"line":22,"column":6},"end":{"line":22,"column":21}}]},"13":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":17}},"type":"binary-expr","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":17}},{"start":{"line":22,"column":15},"end":{"line":22,"column":17}}]},"14":{"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":29,"column":null}}]},"15":{"loc":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":48,"column":null}}]},"16":{"loc":{"start":{"line":49,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":2},"end":{"line":52,"column":null}}]},"17":{"loc":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":56,"column":null}}]},"18":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":68}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":35}},{"start":{"line":53,"column":39},"end":{"line":53,"column":68}}]},"19":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":114}},"type":"binary-expr","locations":[{"start":{"line":54,"column":4},"end":{"line":54,"column":14}},{"start":{"line":54,"column":4},"end":{"line":54,"column":14}},{"start":{"line":54,"column":4},"end":{"line":54,"column":114}}]},"20":{"loc":{"start":{"line":75,"column":53},"end":{"line":75,"column":77}},"type":"cond-expr","locations":[{"start":{"line":75,"column":71},"end":{"line":75,"column":73}},{"start":{"line":75,"column":54},"end":{"line":75,"column":77}}]},"21":{"loc":{"start":{"line":75,"column":53},"end":{"line":75,"column":73}},"type":"binary-expr","locations":[{"start":{"line":75,"column":53},"end":{"line":75,"column":73}},{"start":{"line":75,"column":71},"end":{"line":75,"column":73}}]},"22":{"loc":{"start":{"line":78,"column":2},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":80,"column":null}}]},"23":{"loc":{"start":{"line":81,"column":2},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":84,"column":null}}]},"24":{"loc":{"start":{"line":85,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":88,"column":null}}]},"25":{"loc":{"start":{"line":85,"column":6},"end":{"line":85,"column":68}},"type":"binary-expr","locations":[{"start":{"line":85,"column":6},"end":{"line":85,"column":35}},{"start":{"line":85,"column":39},"end":{"line":85,"column":68}}]},"26":{"loc":{"start":{"line":86,"column":4},"end":{"line":86,"column":114}},"type":"binary-expr","locations":[{"start":{"line":86,"column":4},"end":{"line":86,"column":14}},{"start":{"line":86,"column":4},"end":{"line":86,"column":14}},{"start":{"line":86,"column":4},"end":{"line":86,"column":114}}]},"27":{"loc":{"start":{"line":109,"column":22},"end":{"line":109,"column":52}},"type":"binary-expr","locations":[{"start":{"line":109,"column":22},"end":{"line":109,"column":39}},{"start":{"line":109,"column":43},"end":{"line":109,"column":52}}]},"28":{"loc":{"start":{"line":112,"column":2},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":2},"end":{"line":132,"column":null}}]},"29":{"loc":{"start":{"line":112,"column":6},"end":{"line":112,"column":29}},"type":"cond-expr","locations":[{"start":{"line":112,"column":21},"end":{"line":112,"column":23}},{"start":{"line":112,"column":6},"end":{"line":112,"column":29}}]},"30":{"loc":{"start":{"line":112,"column":6},"end":{"line":112,"column":23}},"type":"binary-expr","locations":[{"start":{"line":112,"column":6},"end":{"line":112,"column":23}},{"start":{"line":112,"column":6},"end":{"line":112,"column":23}}]},"31":{"loc":{"start":{"line":116,"column":17},"end":{"line":118,"column":59}},"type":"cond-expr","locations":[{"start":{"line":117,"column":8},"end":{"line":117,"column":36}},{"start":{"line":118,"column":9},"end":{"line":118,"column":59}}]},"32":{"loc":{"start":{"line":124,"column":6},"end":{"line":127,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":127,"column":null}}]},"33":{"loc":{"start":{"line":141,"column":4},"end":{"line":144,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":4},"end":{"line":144,"column":null}}]},"34":{"loc":{"start":{"line":149,"column":2},"end":{"line":151,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":151,"column":null}}]},"35":{"loc":{"start":{"line":153,"column":15},"end":{"line":155,"column":57}},"type":"cond-expr","locations":[{"start":{"line":154,"column":6},"end":{"line":154,"column":50}},{"start":{"line":155,"column":7},"end":{"line":155,"column":57}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":138,"5":4,"6":3,"7":3,"8":3,"9":9,"10":3,"11":0,"12":3,"13":0,"14":3,"15":3,"16":0,"17":3,"18":3,"19":3,"20":3,"21":4,"22":14,"23":14,"24":14,"25":14,"26":7,"27":14,"28":7,"29":7,"30":14,"31":7,"32":7,"33":7,"34":7,"35":4,"36":3,"37":3,"38":3,"39":3,"40":878,"41":3,"42":2,"43":3,"44":2,"45":2,"46":3,"47":1,"48":1,"49":2,"50":2,"51":4,"52":14,"53":14,"54":3,"55":3,"56":3,"57":3,"58":1,"59":1,"60":0,"61":0,"62":1,"63":1,"64":14,"65":14,"66":14,"67":14,"68":4,"69":2,"70":2,"71":2,"72":14,"73":2,"74":14,"75":14,"76":2,"77":2,"78":4},"f":{"0":11,"1":3,"2":9,"3":3,"4":14,"5":3,"6":878,"7":14,"8":4},"b":{"0":[13],"1":[154,154,147],"2":[70,147],"3":[3,0],"4":[3,3],"5":[3,0],"6":[0],"7":[3,0],"8":[0],"9":[3,0],"10":[3,3],"11":[0],"12":[3,0],"13":[3,3],"14":[3],"15":[7],"16":[7],"17":[7],"18":[14,7],"19":[7,7,7],"20":[0,878],"21":[878,878],"22":[2],"23":[2],"24":[1],"25":[3,1],"26":[1,1,1],"27":[14,0],"28":[3],"29":[11,3],"30":[14,14],"31":[2,1],"32":[0],"33":[2],"34":[2],"35":[12,2]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-resolvers.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-resolvers.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":6,"column":1}},"1":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"2":{"start":{"line":4,"column":55},"end":{"line":4,"column":62}},"3":{"start":{"line":8,"column":25},"end":{"line":8,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":32},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":38},"end":{"line":4,"column":39}},"loc":{"start":{"line":4,"column":55},"end":{"line":4,"column":62}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0,"1":0},"b":{}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-to-re.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-to-re.mjs","statementMap":{"0":{"start":{"line":8,"column":17},"end":{"line":35,"column":1}},"1":{"start":{"line":9,"column":17},"end":{"line":9,"column":20}},"2":{"start":{"line":11,"column":2},"end":{"line":30,"column":null}},"3":{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},"4":{"start":{"line":13,"column":22},"end":{"line":13,"column":38}},"5":{"start":{"line":14,"column":21},"end":{"line":14,"column":39}},"6":{"start":{"line":16,"column":6},"end":{"line":18,"column":null}},"7":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"8":{"start":{"line":20,"column":31},"end":{"line":20,"column":37}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"10":{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},"11":{"start":{"line":24,"column":23},"end":{"line":24,"column":43}},"12":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"13":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"14":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"15":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"16":{"start":{"line":35,"column":1},"end":{"line":35,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":41},"end":{"line":35,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},{"start":{"line":23,"column":9},"end":{"line":29,"column":null}}]},"1":{"loc":{"start":{"line":16,"column":6},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":6},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},{"start":{"line":27,"column":9},"end":{"line":29,"column":null}}]}},"s":{"0":4,"1":175,"2":175,"3":539,"4":21,"5":21,"6":21,"7":0,"8":21,"9":21,"10":518,"11":28,"12":28,"13":490,"14":175,"15":175,"16":4},"f":{"0":175},"b":{"0":[21,518],"1":[0],"2":[28,490]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-var-registry.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-var-registry.mjs","statementMap":{"0":{"start":{"line":13,"column":15},"end":{"line":13,"column":17}},"1":{"start":{"line":18,"column":22},"end":{"line":20,"column":1}},"2":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"3":{"start":{"line":22,"column":0},"end":{"line":22,"column":null}},"4":{"start":{"line":28,"column":24},"end":{"line":34,"column":1}},"5":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"6":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"7":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"8":{"start":{"line":36,"column":0},"end":{"line":36,"column":null}},"9":{"start":{"line":41,"column":19},"end":{"line":43,"column":1}},"10":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"11":{"start":{"line":43,"column":1},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":22},"end":{"line":18,"column":28}},"loc":{"start":{"line":18,"column":28},"end":{"line":20,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":45},"end":{"line":34,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":19},"end":{"line":41,"column":26}},"loc":{"start":{"line":41,"column":31},"end":{"line":43,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]}},"s":{"0":4,"1":4,"2":7,"3":4,"4":4,"5":14,"6":0,"7":14,"8":4,"9":4,"10":25,"11":4},"f":{"0":7,"1":14,"2":25},"b":{"0":[0]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/register-handlers.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/register-handlers.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":10,"column":23},"end":{"line":10,"column":43}},"8":{"start":{"line":12,"column":20},"end":{"line":12,"column":39}},"9":{"start":{"line":13,"column":24},"end":{"line":13,"column":41}},"10":{"start":{"line":14,"column":25},"end":{"line":14,"column":45}},"11":{"start":{"line":15,"column":19},"end":{"line":15,"column":38}},"12":{"start":{"line":17,"column":20},"end":{"line":27,"column":1}},"13":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"14":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"15":{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},"16":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"17":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"18":{"start":{"line":32,"column":22},"end":{"line":98,"column":1}},"19":{"start":{"line":32,"column":53},"end":{"line":98,"column":1}},"20":{"start":{"line":33,"column":15},"end":{"line":33,"column":17}},"21":{"start":{"line":38,"column":2},"end":{"line":40,"column":null}},"22":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"23":{"start":{"line":42,"column":2},"end":{"line":52,"column":null}},"24":{"start":{"line":43,"column":19},"end":{"line":43,"column":21}},"25":{"start":{"line":44,"column":4},"end":{"line":49,"column":null}},"26":{"start":{"line":45,"column":6},"end":{"line":48,"column":null}},"27":{"start":{"line":46,"column":21},"end":{"line":46,"column":37}},"28":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"29":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"30":{"start":{"line":51,"column":36},"end":{"line":51,"column":54}},"31":{"start":{"line":53,"column":2},"end":{"line":53,"column":null}},"32":{"start":{"line":56,"column":17},"end":{"line":58,"column":15}},"33":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"34":{"start":{"line":59,"column":28},"end":{"line":59,"column":null}},"35":{"start":{"line":62,"column":22},"end":{"line":62,"column":63}},"36":{"start":{"line":62,"column":56},"end":{"line":62,"column":62}},"37":{"start":{"line":63,"column":20},"end":{"line":63,"column":58}},"38":{"start":{"line":64,"column":2},"end":{"line":66,"column":null}},"39":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"40":{"start":{"line":69,"column":2},"end":{"line":95,"column":null}},"41":{"start":{"line":70,"column":16},"end":{"line":70,"column":30}},"42":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"43":{"start":{"line":71,"column":29},"end":{"line":71,"column":null}},"44":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"45":{"start":{"line":73,"column":62},"end":{"line":73,"column":160}},"46":{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},"47":{"start":{"line":78,"column":6},"end":{"line":80,"column":null}},"48":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"49":{"start":{"line":81,"column":6},"end":{"line":83,"column":null}},"50":{"start":{"line":82,"column":27},"end":{"line":82,"column":49}},"51":{"start":{"line":83,"column":27},"end":{"line":83,"column":48}},"52":{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},"53":{"start":{"line":86,"column":6},"end":{"line":86,"column":null}},"54":{"start":{"line":89,"column":6},"end":{"line":91,"column":null}},"55":{"start":{"line":94,"column":4},"end":{"line":94,"column":null}},"56":{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},"57":{"start":{"line":100,"column":27},"end":{"line":138,"column":1}},"58":{"start":{"line":101,"column":22},"end":{"line":101,"column":24}},"59":{"start":{"line":104,"column":2},"end":{"line":115,"column":null}},"60":{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},"61":{"start":{"line":106,"column":6},"end":{"line":106,"column":32}},"62":{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},"63":{"start":{"line":109,"column":23},"end":{"line":109,"column":43}},"64":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"65":{"start":{"line":113,"column":6},"end":{"line":113,"column":null}},"66":{"start":{"line":118,"column":17},"end":{"line":118,"column":45}},"67":{"start":{"line":121,"column":17},"end":{"line":121,"column":37}},"68":{"start":{"line":122,"column":2},"end":{"line":127,"column":null}},"69":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"70":{"start":{"line":124,"column":6},"end":{"line":124,"column":null}},"71":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"72":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"73":{"start":{"line":130,"column":4},"end":{"line":130,"column":null}},"74":{"start":{"line":135,"column":2},"end":{"line":135,"column":null}},"75":{"start":{"line":135,"column":31},"end":{"line":135,"column":41}},"76":{"start":{"line":137,"column":2},"end":{"line":137,"column":null}},"77":{"start":{"line":143,"column":27},"end":{"line":143,"column":113}},"78":{"start":{"line":143,"column":38},"end":{"line":143,"column":113}},"79":{"start":{"line":145,"column":25},"end":{"line":293,"column":1}},"80":{"start":{"line":146,"column":2},"end":{"line":292,"column":3}},"81":{"start":{"line":147,"column":60},"end":{"line":147,"column":67}},"82":{"start":{"line":148,"column":18},"end":{"line":148,"column":42}},"83":{"start":{"line":150,"column":4},"end":{"line":154,"column":null}},"84":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}},"85":{"start":{"line":153,"column":6},"end":{"line":153,"column":null}},"86":{"start":{"line":156,"column":4},"end":{"line":158,"column":null}},"87":{"start":{"line":157,"column":6},"end":{"line":157,"column":null}},"88":{"start":{"line":159,"column":4},"end":{"line":161,"column":null}},"89":{"start":{"line":160,"column":6},"end":{"line":160,"column":null}},"90":{"start":{"line":163,"column":24},"end":{"line":163,"column":44}},"91":{"start":{"line":166,"column":24},"end":{"line":166,"column":101}},"92":{"start":{"line":168,"column":4},"end":{"line":291,"column":5}},"93":{"start":{"line":169,"column":6},"end":{"line":171,"column":null}},"94":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"95":{"start":{"line":173,"column":27},"end":{"line":177,"column":35}},"96":{"start":{"line":178,"column":6},"end":{"line":178,"column":null}},"97":{"start":{"line":180,"column":6},"end":{"line":182,"column":null}},"98":{"start":{"line":184,"column":26},"end":{"line":189,"column":7}},"99":{"start":{"line":191,"column":6},"end":{"line":194,"column":null}},"100":{"start":{"line":192,"column":8},"end":{"line":192,"column":null}},"101":{"start":{"line":193,"column":8},"end":{"line":193,"column":null}},"102":{"start":{"line":196,"column":6},"end":{"line":226,"column":null}},"103":{"start":{"line":197,"column":16},"end":{"line":197,"column":17}},"104":{"start":{"line":200,"column":27},"end":{"line":202,"column":51}},"105":{"start":{"line":204,"column":8},"end":{"line":218,"column":null}},"106":{"start":{"line":205,"column":28},"end":{"line":207,"column":36}},"107":{"start":{"line":208,"column":25},"end":{"line":208,"column":81}},"108":{"start":{"line":208,"column":60},"end":{"line":208,"column":80}},"109":{"start":{"line":209,"column":10},"end":{"line":212,"column":null}},"110":{"start":{"line":210,"column":12},"end":{"line":210,"column":null}},"111":{"start":{"line":211,"column":12},"end":{"line":211,"column":50}},"112":{"start":{"line":213,"column":10},"end":{"line":213,"column":null}},"113":{"start":{"line":214,"column":10},"end":{"line":214,"column":null}},"114":{"start":{"line":215,"column":10},"end":{"line":215,"column":null}},"115":{"start":{"line":216,"column":10},"end":{"line":216,"column":null}},"116":{"start":{"line":217,"column":10},"end":{"line":217,"column":null}},"117":{"start":{"line":220,"column":8},"end":{"line":225,"column":null}},"118":{"start":{"line":221,"column":10},"end":{"line":223,"column":null}},"119":{"start":{"line":222,"column":12},"end":{"line":222,"column":null}},"120":{"start":{"line":224,"column":10},"end":{"line":224,"column":34}},"121":{"start":{"line":229,"column":6},"end":{"line":240,"column":null}},"122":{"start":{"line":230,"column":8},"end":{"line":239,"column":null}},"123":{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},"124":{"start":{"line":232,"column":12},"end":{"line":232,"column":null}},"125":{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},"126":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"127":{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},"128":{"start":{"line":237,"column":52},"end":{"line":237,"column":92}},"129":{"start":{"line":238,"column":47},"end":{"line":238,"column":null}},"130":{"start":{"line":243,"column":6},"end":{"line":243,"column":null}},"131":{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},"132":{"start":{"line":245,"column":6},"end":{"line":255,"column":null}},"133":{"start":{"line":248,"column":8},"end":{"line":250,"column":null}},"134":{"start":{"line":253,"column":8},"end":{"line":253,"column":null}},"135":{"start":{"line":254,"column":8},"end":{"line":254,"column":null}},"136":{"start":{"line":258,"column":6},"end":{"line":258,"column":null}},"137":{"start":{"line":259,"column":6},"end":{"line":259,"column":null}},"138":{"start":{"line":260,"column":6},"end":{"line":260,"column":null}},"139":{"start":{"line":262,"column":6},"end":{"line":290,"column":7}},"140":{"start":{"line":263,"column":8},"end":{"line":265,"column":null}},"141":{"start":{"line":264,"column":10},"end":{"line":264,"column":null}},"142":{"start":{"line":267,"column":33},"end":{"line":267,"column":42}},"143":{"start":{"line":268,"column":8},"end":{"line":268,"column":null}},"144":{"start":{"line":272,"column":25},"end":{"line":272,"column":100}},"145":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}},"146":{"start":{"line":274,"column":10},"end":{"line":274,"column":112}},"147":{"start":{"line":275,"column":25},"end":{"line":275,"column":69}},"148":{"start":{"line":276,"column":8},"end":{"line":278,"column":null}},"149":{"start":{"line":280,"column":32},"end":{"line":287,"column":9}},"150":{"start":{"line":288,"column":8},"end":{"line":288,"column":null}},"151":{"start":{"line":289,"column":8},"end":{"line":289,"column":null}},"152":{"start":{"line":293,"column":1},"end":{"line":293,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":20},"end":{"line":17,"column":21}},"loc":{"start":{"line":17,"column":37},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":22},"end":{"line":32,"column":23}},"loc":{"start":{"line":32,"column":53},"end":{"line":98,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":53},"end":{"line":32,"column":54}},"loc":{"start":{"line":32,"column":73},"end":{"line":98,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":19},"end":{"line":51,"column":20}},"loc":{"start":{"line":51,"column":34},"end":{"line":51,"column":55}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":51},"end":{"line":62,"column":52}},"loc":{"start":{"line":62,"column":56},"end":{"line":62,"column":62}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":21},"end":{"line":82,"column":22}},"loc":{"start":{"line":82,"column":27},"end":{"line":82,"column":49}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":83,"column":21},"end":{"line":83,"column":22}},"loc":{"start":{"line":83,"column":27},"end":{"line":83,"column":48}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":100,"column":27},"end":{"line":100,"column":28}},"loc":{"start":{"line":100,"column":68},"end":{"line":138,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":135,"column":25},"end":{"line":135,"column":31}},"loc":{"start":{"line":135,"column":31},"end":{"line":135,"column":41}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":143,"column":27},"end":{"line":143,"column":33}},"loc":{"start":{"line":143,"column":38},"end":{"line":143,"column":113}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":145,"column":25},"end":{"line":145,"column":26}},"loc":{"start":{"line":145,"column":92},"end":{"line":293,"column":1}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":151,"column":25},"end":{"line":151,"column":26}},"loc":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":208,"column":54},"end":{"line":208,"column":55}},"loc":{"start":{"line":208,"column":60},"end":{"line":208,"column":80}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":230,"column":36},"end":{"line":230,"column":37}},"loc":{"start":{"line":230,"column":46},"end":{"line":239,"column":9}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":272,"column":47},"end":{"line":272,"column":48}},"loc":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},{"start":{"line":21,"column":7},"end":{"line":26,"column":null}}]},"1":{"loc":{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},{"start":{"line":24,"column":7},"end":{"line":26,"column":null}}]},"2":{"loc":{"start":{"line":32,"column":25},"end":{"line":32,"column":40}},"type":"default-arg","locations":[{"start":{"line":32,"column":38},"end":{"line":32,"column":40}}]},"3":{"loc":{"start":{"line":42,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":52,"column":null}}]},"4":{"loc":{"start":{"line":45,"column":6},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":6},"end":{"line":48,"column":null}}]},"5":{"loc":{"start":{"line":56,"column":17},"end":{"line":58,"column":15}},"type":"cond-expr","locations":[{"start":{"line":57,"column":6},"end":{"line":57,"column":14}},{"start":{"line":58,"column":6},"end":{"line":58,"column":15}}]},"6":{"loc":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":59,"column":null}}]},"7":{"loc":{"start":{"line":62,"column":22},"end":{"line":62,"column":63}},"type":"binary-expr","locations":[{"start":{"line":62,"column":22},"end":{"line":62,"column":32}},{"start":{"line":62,"column":36},"end":{"line":62,"column":63}}]},"8":{"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":66,"column":null}}]},"9":{"loc":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":71,"column":null}}]},"10":{"loc":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":73,"column":null}}]},"11":{"loc":{"start":{"line":73,"column":8},"end":{"line":73,"column":58}},"type":"binary-expr","locations":[{"start":{"line":73,"column":8},"end":{"line":73,"column":31}},{"start":{"line":73,"column":35},"end":{"line":73,"column":58}}]},"12":{"loc":{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},{"start":{"line":85,"column":9},"end":{"line":92,"column":null}}]},"13":{"loc":{"start":{"line":78,"column":6},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":80,"column":null}}]},"14":{"loc":{"start":{"line":81,"column":14},"end":{"line":83,"column":49}},"type":"cond-expr","locations":[{"start":{"line":82,"column":10},"end":{"line":82,"column":50}},{"start":{"line":83,"column":10},"end":{"line":83,"column":49}}]},"15":{"loc":{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},{"start":{"line":88,"column":9},"end":{"line":92,"column":null}}]},"16":{"loc":{"start":{"line":89,"column":14},"end":{"line":91,"column":35}},"type":"cond-expr","locations":[{"start":{"line":90,"column":10},"end":{"line":90,"column":36}},{"start":{"line":91,"column":10},"end":{"line":91,"column":35}}]},"17":{"loc":{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},{"start":{"line":108,"column":9},"end":{"line":114,"column":null}}]},"18":{"loc":{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},{"start":{"line":112,"column":9},"end":{"line":114,"column":null}}]},"19":{"loc":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":125,"column":null}}]},"20":{"loc":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":129,"column":2},"end":{"line":131,"column":null}}]},"21":{"loc":{"start":{"line":148,"column":18},"end":{"line":148,"column":42}},"type":"binary-expr","locations":[{"start":{"line":148,"column":18},"end":{"line":148,"column":31}},{"start":{"line":148,"column":35},"end":{"line":148,"column":42}}]},"22":{"loc":{"start":{"line":150,"column":4},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":154,"column":null}}]},"23":{"loc":{"start":{"line":150,"column":8},"end":{"line":151,"column":96}},"type":"binary-expr","locations":[{"start":{"line":150,"column":8},"end":{"line":150,"column":37}},{"start":{"line":151,"column":13},"end":{"line":151,"column":96}}]},"24":{"loc":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}},"type":"binary-expr","locations":[{"start":{"line":151,"column":31},"end":{"line":151,"column":48}},{"start":{"line":151,"column":52},"end":{"line":151,"column":70}},{"start":{"line":151,"column":74},"end":{"line":151,"column":95}}]},"25":{"loc":{"start":{"line":156,"column":4},"end":{"line":158,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":4},"end":{"line":158,"column":null}}]},"26":{"loc":{"start":{"line":156,"column":9},"end":{"line":156,"column":106}},"type":"binary-expr","locations":[{"start":{"line":156,"column":9},"end":{"line":156,"column":28}},{"start":{"line":156,"column":32},"end":{"line":156,"column":59}},{"start":{"line":156,"column":64},"end":{"line":156,"column":84}},{"start":{"line":156,"column":88},"end":{"line":156,"column":106}}]},"27":{"loc":{"start":{"line":159,"column":4},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":159,"column":4},"end":{"line":161,"column":null}}]},"28":{"loc":{"start":{"line":159,"column":8},"end":{"line":159,"column":58}},"type":"binary-expr","locations":[{"start":{"line":159,"column":8},"end":{"line":159,"column":27}},{"start":{"line":159,"column":31},"end":{"line":159,"column":58}}]},"29":{"loc":{"start":{"line":169,"column":6},"end":{"line":171,"column":null}},"type":"if","locations":[{"start":{"line":169,"column":6},"end":{"line":171,"column":null}}]},"30":{"loc":{"start":{"line":173,"column":27},"end":{"line":177,"column":35}},"type":"cond-expr","locations":[{"start":{"line":174,"column":10},"end":{"line":174,"column":14}},{"start":{"line":175,"column":10},"end":{"line":177,"column":35}}]},"31":{"loc":{"start":{"line":175,"column":10},"end":{"line":177,"column":35}},"type":"cond-expr","locations":[{"start":{"line":176,"column":12},"end":{"line":176,"column":93}},{"start":{"line":177,"column":12},"end":{"line":177,"column":35}}]},"32":{"loc":{"start":{"line":191,"column":6},"end":{"line":194,"column":null}},"type":"if","locations":[{"start":{"line":191,"column":6},"end":{"line":194,"column":null}}]},"33":{"loc":{"start":{"line":196,"column":6},"end":{"line":226,"column":null}},"type":"if","locations":[{"start":{"line":196,"column":6},"end":{"line":226,"column":null}}]},"34":{"loc":{"start":{"line":200,"column":27},"end":{"line":202,"column":51}},"type":"cond-expr","locations":[{"start":{"line":201,"column":12},"end":{"line":201,"column":39}},{"start":{"line":202,"column":12},"end":{"line":202,"column":51}}]},"35":{"loc":{"start":{"line":204,"column":32},"end":{"line":204,"column":48}},"type":"binary-expr","locations":[{"start":{"line":204,"column":32},"end":{"line":204,"column":42}},{"start":{"line":204,"column":46},"end":{"line":204,"column":48}}]},"36":{"loc":{"start":{"line":205,"column":28},"end":{"line":207,"column":36}},"type":"cond-expr","locations":[{"start":{"line":206,"column":14},"end":{"line":206,"column":36}},{"start":{"line":207,"column":14},"end":{"line":207,"column":36}}]},"37":{"loc":{"start":{"line":209,"column":10},"end":{"line":212,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":10},"end":{"line":212,"column":null}}]},"38":{"loc":{"start":{"line":221,"column":10},"end":{"line":223,"column":null}},"type":"if","locations":[{"start":{"line":221,"column":10},"end":{"line":223,"column":null}}]},"39":{"loc":{"start":{"line":221,"column":14},"end":{"line":221,"column":77}},"type":"binary-expr","locations":[{"start":{"line":221,"column":14},"end":{"line":221,"column":43}},{"start":{"line":221,"column":47},"end":{"line":221,"column":77}}]},"40":{"loc":{"start":{"line":229,"column":6},"end":{"line":240,"column":null}},"type":"if","locations":[{"start":{"line":229,"column":6},"end":{"line":240,"column":null}}]},"41":{"loc":{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},{"start":{"line":234,"column":15},"end":{"line":238,"column":null}}]},"42":{"loc":{"start":{"line":231,"column":14},"end":{"line":231,"column":53}},"type":"binary-expr","locations":[{"start":{"line":231,"column":14},"end":{"line":231,"column":31}},{"start":{"line":231,"column":35},"end":{"line":231,"column":53}}]},"43":{"loc":{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},{"start":{"line":237,"column":15},"end":{"line":238,"column":null}}]},"44":{"loc":{"start":{"line":234,"column":19},"end":{"line":234,"column":58}},"type":"binary-expr","locations":[{"start":{"line":234,"column":19},"end":{"line":234,"column":36}},{"start":{"line":234,"column":40},"end":{"line":234,"column":58}}]},"45":{"loc":{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},{"start":{"line":238,"column":47},"end":{"line":238,"column":null}}]},"46":{"loc":{"start":{"line":237,"column":59},"end":{"line":237,"column":91}},"type":"cond-expr","locations":[{"start":{"line":237,"column":85},"end":{"line":237,"column":86}},{"start":{"line":237,"column":89},"end":{"line":237,"column":91}}]},"47":{"loc":{"start":{"line":248,"column":30},"end":{"line":250,"column":48}},"type":"cond-expr","locations":[{"start":{"line":249,"column":12},"end":{"line":249,"column":62}},{"start":{"line":250,"column":12},"end":{"line":250,"column":48}}]},"48":{"loc":{"start":{"line":262,"column":6},"end":{"line":290,"column":7}},"type":"if","locations":[{"start":{"line":262,"column":6},"end":{"line":290,"column":7}}]},"49":{"loc":{"start":{"line":263,"column":8},"end":{"line":265,"column":null}},"type":"if","locations":[{"start":{"line":263,"column":8},"end":{"line":265,"column":null}}]},"50":{"loc":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}},"type":"cond-expr","locations":[{"start":{"line":272,"column":73},"end":{"line":272,"column":95}},{"start":{"line":272,"column":98},"end":{"line":272,"column":99}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":0,"14":0,"15":0,"16":0,"17":0,"18":4,"19":178,"20":53,"21":53,"22":0,"23":53,"24":50,"25":50,"26":100,"27":0,"28":0,"29":50,"30":0,"31":53,"32":53,"33":53,"34":0,"35":53,"36":46,"37":53,"38":53,"39":0,"40":53,"41":46,"42":46,"43":0,"44":46,"45":0,"46":46,"47":0,"48":0,"49":0,"50":0,"51":0,"52":46,"53":0,"54":46,"55":46,"56":53,"57":4,"58":175,"59":175,"60":539,"61":21,"62":518,"63":28,"64":28,"65":490,"66":175,"67":175,"68":175,"69":539,"70":245,"71":539,"72":175,"73":0,"74":175,"75":30,"76":175,"77":4,"78":175,"79":4,"80":10,"81":94,"82":94,"83":94,"84":0,"85":0,"86":94,"87":0,"88":94,"89":0,"90":94,"91":94,"92":94,"93":94,"94":3,"95":94,"96":94,"97":94,"98":94,"99":94,"100":3,"101":3,"102":94,"103":44,"104":44,"105":44,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":44,"118":32,"119":32,"120":32,"121":94,"122":47,"123":20,"124":0,"125":20,"126":0,"127":20,"128":0,"129":20,"130":94,"131":94,"132":94,"133":94,"134":0,"135":0,"136":94,"137":94,"138":94,"139":94,"140":84,"141":0,"142":84,"143":84,"144":84,"145":308,"146":84,"147":84,"148":84,"149":84,"150":84,"151":84,"152":4},"f":{"0":0,"1":178,"2":53,"3":0,"4":46,"5":0,"6":0,"7":175,"8":30,"9":175,"10":10,"11":0,"12":0,"13":20,"14":308},"b":{"0":[0,0],"1":[0,0],"2":[3],"3":[50],"4":[0],"5":[0,53],"6":[0],"7":[53,53],"8":[0],"9":[0],"10":[0],"11":[46,0],"12":[0,46],"13":[0],"14":[0,0],"15":[0,46],"16":[0,46],"17":[21,518],"18":[28,490],"19":[245],"20":[0],"21":[94,94],"22":[0],"23":[94,0],"24":[0,0,0],"25":[0],"26":[94,0,94,94],"27":[0],"28":[94,94],"29":[3],"30":[3,91],"31":[91,0],"32":[3],"33":[44],"34":[0,44],"35":[44,44],"36":[0,0],"37":[0],"38":[32],"39":[32,32],"40":[47],"41":[0,20],"42":[20,0],"43":[0,20],"44":[20,0],"45":[0,20],"46":[0,0],"47":[3,91],"48":[84],"49":[0],"50":[21,287]}} +,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/reporter.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/reporter.js","statementMap":{"0":{"start":{"line":3,"column":26},"end":{"line":9,"column":null}},"1":{"start":{"line":12,"column":14},"end":{"line":48,"column":null}},"2":{"start":{"line":16,"column":54},"end":{"line":16,"column":null}},"3":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"4":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"6":{"start":{"line":22,"column":4},"end":{"line":29,"column":null}},"7":{"start":{"line":23,"column":6},"end":{"line":28,"column":null}},"8":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"9":{"start":{"line":24,"column":40},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"11":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"12":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"13":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"14":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"15":{"start":{"line":42,"column":24},"end":{"line":42,"column":null}},"16":{"start":{"line":45,"column":21},"end":{"line":45,"column":50}},"17":{"start":{"line":47,"column":12},"end":{"line":47,"column":34}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":13}},"loc":{"start":{"line":16,"column":54},"end":{"line":30,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":25},"end":{"line":23,"column":26}},"loc":{"start":{"line":23,"column":38},"end":{"line":28,"column":7}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":11}},"loc":{"start":{"line":32,"column":26},"end":{"line":34,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":2},"end":{"line":36,"column":9}},"loc":{"start":{"line":36,"column":12},"end":{"line":38,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":2},"end":{"line":40,"column":6}},"loc":{"start":{"line":40,"column":36},"end":{"line":43,"column":null}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":6}},"loc":{"start":{"line":45,"column":19},"end":{"line":45,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":47,"column":2},"end":{"line":47,"column":7}},"loc":{"start":{"line":47,"column":10},"end":{"line":47,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":14},"end":{"line":16,"column":52}},"type":"default-arg","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":52}}]},"1":{"loc":{"start":{"line":20,"column":28},"end":{"line":20,"column":45}},"type":"binary-expr","locations":[{"start":{"line":20,"column":28},"end":{"line":20,"column":39}},{"start":{"line":20,"column":43},"end":{"line":20,"column":45}}]},"2":{"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":null}}]},"3":{"loc":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"type":"default-arg","locations":[{"start":{"line":32,"column":22},"end":{"line":32,"column":24}}]},"4":{"loc":{"start":{"line":40,"column":12},"end":{"line":40,"column":34}},"type":"default-arg","locations":[{"start":{"line":40,"column":32},"end":{"line":40,"column":34}}]},"5":{"loc":{"start":{"line":40,"column":14},"end":{"line":40,"column":28}},"type":"default-arg","locations":[{"start":{"line":40,"column":22},"end":{"line":40,"column":28}}]},"6":{"loc":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":null}}]}},"s":{"0":4,"1":4,"2":16,"3":8,"4":8,"5":8,"6":8,"7":48,"8":65,"9":65,"10":0,"11":8,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":8,"1":65,"2":8,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[8,8],"2":[65],"3":[0],"4":[0],"5":[0],"6":[0]}} +} diff --git a/qa/coverage/favicon.png b/qa/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 68.4% + Statements + 749/1095 +
+ + +
+ 54.62% + Branches + 295/540 +
+ + +
+ 57.86% + Functions + 103/178 +
+ + +
+ 69.53% + Lines + 696/1001 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
48.48%64/13232.69%17/5214.28%2/1449.21%63/128
src/handlers +
+
70%7/10100%0/050%1/266.66%6/9
src/handlers/help +
+
100%8/8100%0/0100%0/0100%8/8
src/handlers/help/lib +
+
23.93%28/1170%0/7014.28%3/2123.14%25/108
src/handlers/server +
+
75.36%104/13864.06%41/6484.61%11/1378.22%97/124
src/handlers/server/_lib +
+
95.34%82/8690%54/60100%16/1697.22%70/72
src/handlers/server/errors +
+
39.43%28/710%0/1125%5/2040.32%25/62
src/handlers/server/plugins +
+
85%102/12030.76%12/3975.75%25/3386.4%89/103
src/handlers/server/plugins/_lib +
+
86.11%62/7289.09%49/5578.57%11/1486.95%60/69
src/lib +
+
77.41%264/34164.55%122/18964.44%29/4579.55%253/318
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/prettify.css b/qa/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/qa/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/qa/coverage/prettify.js b/qa/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/qa/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/qa/coverage/sort-arrow-sprite.png b/qa/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/qa/coverage/sorter.js b/qa/coverage/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/qa/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/qa/coverage/src/app.js.html b/qa/coverage/src/app.js.html new file mode 100644 index 00000000..ea39e188 --- /dev/null +++ b/qa/coverage/src/app.js.html @@ -0,0 +1,943 @@ + + + + + + Code coverage report for src/app.js + + + + + + + + + +
+
+

All files / src app.js

+
+ +
+ 56.63% + Statements + 64/113 +
+ + +
+ 35.41% + Branches + 17/48 +
+ + +
+ 20% + Functions + 2/10 +
+ + +
+ 57.79% + Lines + 63/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +2874x +4x +4x +  +4x +4x +4x +  +4x +4x +4x +  +4x +4x +4x +4x +4x +276x +  +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +7x +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +7x +  +  +  +7x +  +7x +  +  +  +7x +  +  +  +  +  +  +7x +7x +7x +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +  +  +  +  +  +7x +  +  +  +  +7x +  +7x +  +  +7x +7x +7x +  +  +7x +  +7x +3x +3x +  +  +  +7x +7x +7x +  +  +7x +3x +4x +4x +  +  +  +7x +3x +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +7x +7x +  +  +7x +7x +  +7x +  +  +  +  +  +7x +  +  +  +  +  +  +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { existsSync, readFileSync } from 'node:fs'
+import * as fs from 'node:fs/promises'
+import * as fsPath from 'node:path'
+ 
+import express from 'express'
+import fileUpload from 'express-fileupload'
+import findRoot from 'find-root'
+ 
+import { DependencyRunner } from '@liquid-labs/dependency-runner'
+import { readFJSON } from '@liquid-labs/federated-json'
+import { WeakCache } from '@liquid-labs/weak-cache'
+ 
+import { handlers } from './handlers'
+import { findOwnHome } from './lib/find-own-home'
+import { getServerSettings } from './lib/get-server-settings'
+import { loadPlugins, registerHandlers } from './lib'
+import { clearRegistry, registerPathVar } from './lib/path-var-registry'
+import { Reporter } from './lib/reporter'
+ 
+const pkgRoot = findRoot(__dirname)
+const pkgJSONContents = readFileSync(fsPath.join(pkgRoot, 'package.json'))
+const pkgJSON = JSON.parse(pkgJSONContents)
+const serverVersion = pkgJSON.version
+ 
+/**
+* Initializes the express app.
+*
+* Options:
+* - `app` (opt): passed in when reloading
+* - `serverConfigRoot` (required): runtime configuration and data directory (e.g., ~/.config/comply-server). Used for settings,
+*    local configuration, and as the default dynamicPluginInstallDir.
+* - `explicitPlugins` (opt): array of NPM package names to explicitly load as plugins, regardless of whether they have
+*    the 'pluggable-endpoints' keyword. This supports transition from the previous separate plugins model. These plugins
+*    are loaded in addition to keyword-discovered plugins.
+* - `pluginPaths` (opt): additional (NPM package) directories from which to load additional plugins. This is in addition
+*    to the plugins found in the server package directory, unless `skipCorePlugins` is true. This option is primarily
+*    used for testing.
+* - `skipCorePlugins` (opt): if true, then the plugins in the server package directory are NOT loaded. This option is
+*    primarily used in conjunction with `pluginPaths` for testing.
+* - `dynamicPluginInstallDir` (opt): optional directory to install dynamically loaded plugins. If not provided, plugins
+*    are installed in the `serverConfigRoot/dynamic-plugins` directory.
+*/
+const appInit = async(initArgs) => {
+  let { app } = initArgs
+  const {
+    apiSpecPath,
+    explicitPlugins,
+    name,
+    noAPIUpdate = false,
+    pluginPaths,
+    dynamicPluginInstallDir,
+    reporter = new Reporter(),
+    serverConfigRoot = throw new Error("'serverConfigRoot' must be defined for appInit()."),
+    skipCorePlugins = false,
+    version
+  } = initArgs
+ 
+  // Clear and initialize path var registry
+  clearRegistry()
+ 
+  // Find the server package root (where the running server's package.json is)
+  // This is where core plugins are loaded from
+  const serverPackageRoot = await findOwnHome(process.argv[1])
+ 
+  app = app || express()
+ 
+  // Register core path variables
+  // Note: optionsFetcher still accesses app.ext.handlerPlugins for now
+  registerPathVar('serverPluginName', {
+    validationRe   : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)',
+    optionsFetcher : ({ app }) => {
+      return app.ext.handlerPlugins.map(({ npmName }) => npmName)
+    }
+  })
+ 
+  app.use(express.json())
+  app.use(express.urlencoded({ extended : true })) // handle POST body params
+  app.use(fileUpload({ parseNested : true }))
+ 
+  // setup app.ext
+  app.ext = {
+    commandPaths            : {},
+    errorsEphemeral         : [],
+    errorsRetained          : [],
+    constants               : {}, // what is this? is it used?
+    handlers                : [],
+    handlerPlugins          : [],
+    localSettings           : {},
+    name,
+    pendingHandlers         : [],
+    dynamicPluginInstallDir : dynamicPluginInstallDir || fsPath.join(serverConfigRoot, 'dynamic-plugins'),
+    serverConfigRoot,
+    serverSettings          : getServerSettings(serverConfigRoot),
+    serverVersion,
+    setupMethods            : [],
+    teardownMethods         : [],
+    version
+  }
+ 
+  // drop 'local-settings.yaml', it's really for the CLI, though we do currently keep 'OTP required' there
+  const localSettingsPath = fsPath.join(serverConfigRoot, 'local-settings.yaml')
+  Iif (existsSync(localSettingsPath)) {
+    app.ext.localSettings = readFJSON(localSettingsPath)
+  }
+  // done setting app.ext
+ 
+  // direct app extensions
+  app.reload = async() => {
+    app.router.stack = []
+    await appInit(Object.assign({}, initArgs, { app }))
+  }
+ 
+  app.addSetupTask = (entry) => app.ext.setupMethods.push(entry)
+  // end direct app extensions
+  const cache = new WeakCache()
+  // from here on out, we need to release the cache if we run into an exception which prevents us from returning it
+  // (in which case it is the responsibility of the caller to release the cache)
+  try {
+    reporter.log('Loading core handlers...')
+    registerHandlers(app, { cache, reporter, name : 'core', npmName : '@liquid-labs/pluggable-express', handlers })
+ 
+    // Track loaded plugins across all sources to prevent duplicates
+    const loadedPluginNames = new Set()
+ 
+    if (skipCorePlugins !== true) {
+      reporter.log(`Loading core plugins from '${serverPackageRoot}'...`)
+      await loadPlugins(app, { cache, reporter, searchPath : serverPackageRoot, explicitPlugins, loadedPluginNames, registerPathVar })
+    }
+ 
+    // Also load plugins from dynamicPluginInstallDir if it's different from serverPackageRoot
+    if (app.ext.dynamicPluginInstallDir !== serverPackageRoot) {
+      reporter.log(`Loading dynamic plugins from '${app.ext.dynamicPluginInstallDir}'...`)
+      await loadPlugins(app, { cache, reporter, searchPath : app.ext.dynamicPluginInstallDir, explicitPlugins, loadedPluginNames, registerPathVar })
+    }
+ 
+    if (pluginPaths?.length > 0) {
+      for (const pluginDir of pluginPaths) {
+        reporter.log(`Loading additional plugins from '${pluginDir}'...`)
+        await loadPlugins(app, { cache, reporter, searchPath : pluginDir, explicitPlugins, loadedPluginNames, registerPathVar })
+      }
+    }
+ 
+    for (const pendingHandler of app.ext.pendingHandlers) {
+      pendingHandler()
+    }
+ 
+    // log errors
+    app.use((error, req, res, next) => {
+      const errors = app.ext.errorsEphemeral
+      const errorID = makeID()
+      error.liqID = errorID
+      errors.push({
+        id        : errorID,
+        message   : error.message,
+        stack     : error.stack,
+        timestamp : new Date().getTime()
+      })
+      let i = 0
+      while (errors.length > 1000 && i < errors.length) {
+        errors.shift()
+        i += 1
+      }
+      process.stderr.write(error.stack + '\n')
+      Iif (error.cause) {
+        process.stderr.write('Cause:\n' + error.cause.stack + '\n')
+      }
+      next(error)
+    })
+    // generate user response
+    app.use((error, req, res, next) => {
+      Iif (res.headersSent) return next(error)
+ 
+      const status = error.status || 500
+      res.status(status)
+ 
+      const errorSource = status >= 400 && status < 500
+        ? 'Client'
+        : status >= 500 && status < 600
+          ? 'Server'
+          : 'Unknown'
+      let msg = `<error>${errorSource} error ${status}: ${statusText[status]}<rst>\n\n<em>${error.message}<rst>\n\n`
+      // if the error stack isn't registered, we display it here
+      if (error.liqID === undefined && error.stack) {
+        msg += error.stack
+      }
+      else {
+        msg += 'error ref: <code>/server/errors/' + error.liqID + '<rst>'
+      }
+ 
+      if (req.accepts('html')) {
+        next(error) // defer to default error handling
+      }
+      else {
+        if (req.accepts('text/terminal')) {
+          res.setHeader('content-type', 'text/terminal')
+        }
+        else {
+          msg = msg.replaceAll(/<[a-z]+>/g, '')
+          res.setHeader('content-type', 'text/plain')
+        }
+        res.send(msg)
+      }
+    })
+ 
+    app.ext.serverSettings = getServerSettings(serverConfigRoot)
+ 
+    const depRunner = new DependencyRunner({ runArgs : { app, cache, reporter }, waitTillComplete : true })
+    for (const setupMethod of app.ext.setupMethods) {
+      depRunner.enqueue(setupMethod)
+    }
+    depRunner.complete()
+    await depRunner.await()
+ 
+    Iif (noAPIUpdate !== true) {
+      reporter.log('Registering API...')
+      const apiSpecFile = apiSpecPath || fsPath.join(serverConfigRoot, 'core-api.json')
+      await fs.writeFile(apiSpecFile, JSON.stringify(app.ext.handlers, null, '  '))
+    }
+ 
+    return { app, cache }
+  }
+  catch (error) {
+    cache.release()
+    throw error
+  }
+}
+ 
+// TODO: credit from stackoverflow...
+const makeID = (length = 5) => {
+  let result = ''
+  // notice no 'l' or '1'
+  const characters = 'abcdefghijkmnopqrstuvwxyz023456789'
+  const charactersLength = characters.length
+  let counter = 0
+  while (counter < length) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength))
+    counter += 1
+  }
+  return result
+}
+ 
+const statusText = {
+  400 : 'BadRequest',
+  401 : 'Unauthorized',
+  402 : 'PaymentRequired',
+  403 : 'Forbidden',
+  404 : 'NotFound',
+  405 : 'MethodNotAllowed',
+  406 : 'NotAcceptable',
+  407 : 'ProxyAuthenticationRequired',
+  408 : 'RequestTimeout',
+  409 : 'Conflict',
+  410 : 'Gone',
+  411 : 'LengthRequired',
+  412 : 'PreconditionFailed',
+  413 : 'PayloadTooLarge',
+  414 : 'URITooLong',
+  415 : 'UnsupportedMediaType',
+  416 : 'RangeNotSatisfiable',
+  417 : 'ExpectationFailed',
+  418 : 'ImATeapot',
+  421 : 'MisdirectedRequest',
+  422 : 'UnprocessableEntity',
+  423 : 'Locked',
+  424 : 'FailedDependency',
+  425 : 'TooEarly',
+  426 : 'UpgradeRequired',
+  428 : 'PreconditionRequired',
+  429 : 'TooManyRequests',
+  431 : 'RequestHeaderFieldsTooLarge',
+  451 : 'UnavailableForLegalReasons',
+  500 : 'InternalServerError',
+  501 : 'NotImplemented',
+  502 : 'BadGateway',
+  503 : 'ServiceUnavailable',
+  504 : 'GatewayTimeout',
+  505 : 'HTTPVersionNotSupported',
+  506 : 'VariantAlsoNegotiates',
+  507 : 'InsufficientStorage',
+  508 : 'LoopDetected',
+  509 : 'BandwidthLimitExceeded',
+  510 : 'NotExtended',
+  511 : 'NetworkAuthenticationRequired'
+}
+ 
+export { appInit }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/heartbeat.mjs.html b/qa/coverage/src/handlers/heartbeat.mjs.html new file mode 100644 index 00000000..a76df294 --- /dev/null +++ b/qa/coverage/src/handlers/heartbeat.mjs.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for src/handlers/heartbeat.mjs + + + + + + + + + +
+
+

All files / src/handlers heartbeat.mjs

+
+ +
+ 70% + Statements + 7/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 66.66% + Lines + 6/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +184x +  +  +  +  +4x +4x +4x +  +7x +  +  +  +  +4x +  +  + 
const help = {
+  name    : 'server heartbeat',
+  summary : 'Endpoint to check that the server is up and listening.'
+}
+ 
+const method = 'get'
+const path = ['heartbeat']
+const parameters = []
+ 
+const func = ({ reporter }) => (req, res) => {
+  reporter.isolate()
+  reporter.push('heartbeat request')
+  res.json(true)
+  // res.json(app.ext.handlers)
+}
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/help.mjs.html b/qa/coverage/src/handlers/help/help.mjs.html new file mode 100644 index 00000000..a4b50146 --- /dev/null +++ b/qa/coverage/src/handlers/help/help.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/handlers/help/help.mjs + + + + + + + + + +
+
+

All files / src/handlers/help help.mjs

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +264x +  +4x +  +4x +4x +4x +  +  +  +  +  +  +  +  +4x +  +4x +  +  +  +  +4x +  +  + 
import { commonOutputParams } from '@liquid-labs/liq-handlers-lib'
+ 
+import { sendHelp } from './lib/send-help'
+ 
+const method = 'get'
+const path = ['help']
+const parameters = [
+  {
+    name        : 'summaryOnly',
+    isBoolean   : true,
+    required    : false,
+    description : 'Displays the endpoint name, path, and summary only. Use this option for prose output and the `fields` parameter to achive a similar effect for data output.'
+  },
+  ...commonOutputParams()
+]
+Object.freeze(parameters)
+ 
+const help = {
+  summary     : "To get help on a command/endpoint, you can prepend or append 'help' to the path or CLI command sequence.",
+  description : "The help system provides information about each command or endpoint. You can always get the path, basic and parameter information. Summary and description information is usually included as well. Finally, optional references may be listed.\n\nHelp is invoked by either prepending or appending 'help' to the URL or command sequence. e.g.: 'help orgs list' or 'orgs list help'. The default is for liq to retrieve help as a 'terminal' document for display in a command-line terminal with nice colored formatting. If this is causing problems, try setting `format=txt`. You can of course also use the `format` option to select markdown, or even data formats as well."
+}
+ 
+const func = sendHelp({ help, method, path, parameters })
+ 
+export { func, parameters, path, method }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/index.html b/qa/coverage/src/handlers/help/index.html new file mode 100644 index 00000000..1280d80f --- /dev/null +++ b/qa/coverage/src/handlers/help/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/handlers/help + + + + + + + + + +
+
+

All files src/handlers/help

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
help.mjs +
+
100%8/8100%0/0100%0/0100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html new file mode 100644 index 00000000..5d943a88 --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for src/handlers/help/lib/formatter-md.mjs + + + + + + + + + +
+
+

All files / src/handlers/help/lib formatter-md.mjs

+
+ +
+ 12.12% + Statements + 4/33 +
+ + +
+ 0% + Branches + 0/25 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 12.9% + Lines + 4/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +594x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  + 
import { printPath } from './print-path'
+ 
+const parameterCharacteristics = (p) => {
+  let output = '*' + (p.required ? 'REQUIRED' : 'OPTIONAL')
+  output += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
+  const type = p.isBoolean
+    ? 'boolean'
+    : p.isInteger
+      ? 'integer'
+      : p.isNumber
+        ? 'number'
+        : 'string'
+  output += ', ' + type + '*\n'
+  Iif (p.matcher) output += '*matcher: ' + p.matcher.toString() + '*'
+ 
+  return output
+}
+ 
+const mdFormatterGen = ({ nesting = 0 } = {}) => ({ name, path, summary, parameters, description, references }, title) => {
+  let output = `#${'#'.repeat(nesting)} ${title || name}\n*${printPath(path)}*\n\n`
+ 
+  Iif (summary) {
+    output += summary
+  }
+ 
+  Iif (parameters) {
+    output += `\n\n##${'#'.repeat(nesting)} Parameters\n`
+    parameters.reduce((output, p) => {
+      output += '- *' + p.name + '*: <br />\n'
+      output += parameterCharacteristics(p) + '\n\n'
+      output += p.description + '\n'
+      return output
+    }, output)
+  }
+ 
+  Iif (description) {
+    output += `\n##${'#'.repeat(nesting)} Description\n`
+    output += description + '\n'
+  }
+ 
+  Iif (references) {
+    output += `\n##${'#'.repeat(nesting)} References\n`
+    references.reduce((output, r) => {
+      if (r.url) {
+        output += `- [*${r.name}*](${r.url})` + (r.description ? `: ${r.description}` : '')
+      }
+      else {
+        output += `- *${r.name}*` + (r.description ? `: ${r.description}` : '')
+      }
+ 
+      return output
+    }, output)
+  }
+ 
+  return output
+}
+ 
+export { mdFormatterGen }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html new file mode 100644 index 00000000..b9e144c7 --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for src/handlers/help/lib/formatter-terminal.mjs + + + + + + + + + +
+
+

All files / src/handlers/help/lib formatter-terminal.mjs

+
+ +
+ 11.42% + Statements + 4/35 +
+ + +
+ 0% + Branches + 0/22 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 11.76% + Lines + 4/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  + 
// TODO: support nesting with incrementing headers and adding indent levels
+const parameterCharacteristics = (p) => {
+  let typeInfo = '<dim>' + (p.required ? '<underline>REQUIRED<rst><dim>' : 'optional')
+  typeInfo += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
+  const type = p.isBoolean
+    ? 'boolean'
+    : p.isInteger
+      ? 'integer'
+      : p.isNumber
+        ? 'number'
+        : 'string'
+  typeInfo += ', ' + type
+  typeInfo += p.matcher ? ': ' + p.matcher.toString() : ''
+ 
+  return typeInfo + '<rst>'
+}
+ 
+const indent = 2
+const terminalFormatterGen = ({ nesting = 0 } = {}) => {
+  const hLvl = (base) => base + nesting
+ 
+  return ({ data /* we ignore title */ }) => {
+    const { path, summary, parameters, description, references } = data
+ 
+    let output = `\n<h${hLvl(1)}><bold>/${path.join('/')}<rst>\n\n`
+ 
+    Iif (summary) {
+      output += summary
+    }
+ 
+    Iif (parameters) {
+      output += `\n\n<h${hLvl(2)}>Parameters<rst>`
+      output += parameters.reduce((output, p) => {
+        output += '\n- <code><underline>' + p.name + '<rst>: ('
+        output += parameterCharacteristics(p, { indent }) + ') '
+        output += p.description
+        return output
+      }, '')
+      output += '\n'
+    }
+ 
+    Iif (description) {
+      output += `\n<h${hLvl(2)}>Description<rst>\n`
+      output += description + '\n'
+    }
+ 
+    Iif (references) {
+      output += `\n<h${hLvl(2)}>References<rst>\n`
+      references.reduce((output, r) => {
+        output += `- <em>${r.name}<rst>${r.description ? ': ' : ''}${r.description}${r.description ? ' ' : ''}${r.url}`
+        return output
+      }, output)
+    }
+ 
+    output += '\n'
+ 
+    return output
+  }
+}
+ 
+export { terminalFormatterGen }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html new file mode 100644 index 00000000..e971d75e --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for src/handlers/help/lib/formatter-text.mjs + + + + + + + + + +
+
+

All files / src/handlers/help/lib formatter-text.mjs

+
+ +
+ 13.33% + Statements + 4/30 +
+ + +
+ 0% + Branches + 0/21 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 13.79% + Lines + 4/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +554x +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  + 
import { printPath } from './print-path'
+ 
+// TODO: support nesting with adding indent levels
+const parameterCharacteristics = (p) => {
+  let output = p.required ? 'REQUIRED' : 'OPTIONAL'
+  output += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
+  const type = p.isBoolean
+    ? 'boolean'
+    : p.isInteger
+      ? 'integer'
+      : p.isNumber
+        ? 'number'
+        : 'string'
+  output += ', ' + type + '\n'
+  Iif (p.matcher) output += 'matcher: ' + p.matcher.toString()
+ 
+  return output
+}
+ 
+const textFormatter = ({ name, path, summary, parameters, description, references }, title) => {
+  let output = `${title || name}\n${printPath(path)}\n\n`
+ 
+  Iif (summary) {
+    output += summary
+  }
+ 
+  Iif (parameters) {
+    output += '\n\nParameters'
+    parameters.reduce((output, p) => {
+      output += '\n- ' + p.name + '\n'
+      output += parameterCharacteristics(p) + '\n\n'
+      output += p.description
+ 
+      return output
+    }, output)
+  }
+ 
+  Iif (description) {
+    output += '\n\nDescription\n'
+    output += description
+  }
+ 
+  Iif (references) {
+    output += '\n\nReferences\n'
+    references.reduce((output, r) => {
+      output += `- ${r.name}${r.description ? ': ' : ''}${r.description}${r.description ? ' ' : ''}${r.url}`
+      return output
+    }, output)
+  }
+ 
+  return output
+}
+ 
+export { textFormatter }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/index.html b/qa/coverage/src/handlers/help/lib/index.html new file mode 100644 index 00000000..b11f62bd --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/handlers/help/lib + + + + + + + + + +
+
+

All files src/handlers/help/lib

+
+ +
+ 23.93% + Statements + 28/117 +
+ + +
+ 0% + Branches + 0/70 +
+ + +
+ 14.28% + Functions + 3/21 +
+ + +
+ 23.14% + Lines + 25/108 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
formatter-md.mjs +
+
12.12%4/330%0/250%0/512.9%4/31
formatter-terminal.mjs +
+
11.42%4/350%0/220%0/611.76%4/34
formatter-text.mjs +
+
13.33%4/300%0/210%0/413.79%4/29
print-path.mjs +
+
50%2/40%0/20%0/2100%1/1
send-help.mjs +
+
93.33%14/15100%0/075%3/492.3%12/13
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/print-path.mjs.html b/qa/coverage/src/handlers/help/lib/print-path.mjs.html new file mode 100644 index 00000000..f34753e8 --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/print-path.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for src/handlers/help/lib/print-path.mjs + + + + + + + + + +
+
+

All files / src/handlers/help/lib print-path.mjs

+
+ +
+ 50% + Statements + 2/4 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 100% + Lines + 1/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +44x +  +  + 
const printPath = (path) => '/' + (path ? path.map(p => p.replace(/[?]$/, '')).join('/') : '')
+ 
+export { printPath }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/send-help.mjs.html b/qa/coverage/src/handlers/help/lib/send-help.mjs.html new file mode 100644 index 00000000..824804b0 --- /dev/null +++ b/qa/coverage/src/handlers/help/lib/send-help.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/handlers/help/lib/send-help.mjs + + + + + + + + + +
+
+

All files / src/handlers/help/lib send-help.mjs

+
+ +
+ 93.33% + Statements + 14/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 92.3% + Lines + 12/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +354x +  +4x +4x +4x +  +4x +4x +  +4x +88x +122x +  +91x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +88x +4x +  +  + 
import { formatOutput } from '@liquid-labs/liq-handlers-lib'
+ 
+import { mdFormatterGen } from './formatter-md'
+import { terminalFormatterGen } from './formatter-terminal'
+import { textFormatter } from './formatter-text'
+ 
+const allHelpFields = ['description', 'method', 'parameters', 'path', 'references', 'summary']
+const defaultHelpFields = allHelpFields
+ 
+const sendHelp = ({ help, method, path, parameters }) => {
+  const sortedParameters = [...parameters]
+  sortedParameters.sort((a, b) => a.name.localeCompare(b.name))
+ 
+  const func = ({ model, reporter }) => (req, res, next) => {
+    formatOutput({
+      data              : { method, parameters : sortedParameters, path, ...help },
+      allFields         : allHelpFields,
+      defaultFields     : defaultHelpFields,
+      mdFormatter       : mdFormatterGen(),
+      terminalFormatter : terminalFormatterGen(),
+      textFormatter,
+      next,
+      noDateMark        : true,
+      reporter,
+      req,
+      res,
+      ...req.vars
+    })
+  }
+ 
+  return func
+}
+ 
+export { sendHelp }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/index.html b/qa/coverage/src/handlers/index.html new file mode 100644 index 00000000..13681cd1 --- /dev/null +++ b/qa/coverage/src/handlers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/handlers + + + + + + + + + +
+
+

All files src/handlers

+
+ +
+ 70% + Statements + 7/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 66.66% + Lines + 6/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
heartbeat.mjs +
+
70%7/10100%0/050%1/266.66%6/9
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/index.html b/qa/coverage/src/handlers/server/_lib/index.html new file mode 100644 index 00000000..87035589 --- /dev/null +++ b/qa/coverage/src/handlers/server/_lib/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/handlers/server/_lib + + + + + + + + + +
+
+

All files src/handlers/server/_lib

+
+ +
+ 95.34% + Statements + 82/86 +
+ + +
+ 90% + Branches + 54/60 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 97.22% + Lines + 70/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
next-options.mjs +
+
94.44%68/7289.09%49/55100%14/1496.55%56/58
options-tokenizer.mjs +
+
100%14/14100%5/5100%2/2100%14/14
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/next-options.mjs.html b/qa/coverage/src/handlers/server/_lib/next-options.mjs.html new file mode 100644 index 00000000..b53c2320 --- /dev/null +++ b/qa/coverage/src/handlers/server/_lib/next-options.mjs.html @@ -0,0 +1,538 @@ + + + + + + Code coverage report for src/handlers/server/_lib/next-options.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/_lib next-options.mjs

+
+ +
+ 94.44% + Statements + 68/72 +
+ + +
+ 89.09% + Branches + 49/55 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 96.55% + Lines + 56/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +1524x +  +4x +  +  +  +  +  +  +  +  +  +10x +  +10x +4x +4x +  +  +  +  +4x +4x +2x +  +  +2x +10x +  +  +  +  +  +  +  +  +4x +46x +46x +34x +8x +8x +  +26x +  +46x +  +  +4x +  +14x +84x +  +14x +  +  +14x +  +  +14x +48x +8x +36x +8x +  +  +8x +  +  +8x +40x +132x +  +  +  +  +6x +4x +  +  +12x +2x +10x +  +2x +  +  +  +  +14x +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +30x +2x +  +  +28x +2x +  +  +  +26x +26x +  +  +106x +26x +  +26x +2x +  +  +24x +10x +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +30x +4x +  +  + 
import { optionsTokenizer } from './options-tokenizer'
+ 
+const nextOptionValueOptions = async({
+  app,
+  cache,
+  lastOptionName,
+  lastOptionParamDef,
+  lastOptionValue,
+  model,
+  prevElements,
+  req
+}) => {
+  const fetcher = lastOptionParamDef.optionsFunc || lastOptionParamDef.optionsFetcher
+  // we expect to always get a param def, otherwise the param wouldn't have been matched to get to the value
+  if (fetcher === undefined) return []
+  let possibleValues = fetcher({ app, cache, lastOptionValue, model, req, ...prevElements })
+  Iif (possibleValues.then) possibleValues = await possibleValues
+  // The completion infrastructure itself will sort the options. Additionally, this will cause a problem if the options
+  // are a static array that's been Object.frozen()
+  // possibleValues.sort()
+ 
+  Iif (possibleValues.includes(lastOptionValue)) return [lastOptionValue]
+  else if (!lastOptionValue) {
+    return possibleValues
+  }
+  else {
+    const lastTokenBit = lastOptionValue.replace(/.*[=:]([^=:]*)/, '$1')
+    return possibleValues.filter((v) => v.startsWith(lastTokenBit))
+  }
+  /* else {
+    return !lastOptionValue
+      ? possibleValues // .map((v) => lastOptionName + '=' + v)
+      : possibleValues.filter((v) => v.startsWith(lastOptionValue))
+  } // .map((v) => lastOptionName + '=' + v) */
+}
+ 
+const parameterOptions = ({ paramDef }) => {
+  const options = []
+  if (paramDef.isBoolean) options.push(paramDef.name)
+  else if (paramDef.canBeEmpty) {
+    options.push(paramDef.name)
+    options.push(paramDef.name + '=')
+  }
+  else options.push(paramDef.name + '=')
+ 
+  return options
+}
+ 
+const residualOptions = ({ command, currOptNameAndValues, lastOptionName, lastOptionParamDef, paramsSpec }) => {
+  // we are listing options (not option value options), so the options are the options not already specified
+  const currOptNames = currOptNameAndValues.map((o) => o[0])
+  const parameterNames = paramsSpec.map((p) => p.name)
+ 
+  const options = []
+  // Remember 'command.endsWith("=")' is already handled.
+  // Is the command is locked in, then what params not already specified?
+  const lockedIn = command.endsWith(' ') // options always space separated; trivially locked in
+    // v if the last option is complete and a boolean, then it's done
+    || (command.endsWith(lastOptionName) && lastOptionParamDef?.isBoolean === true)
+  if (lockedIn) {
+    const residualOpts = parameterNames.filter((o) => !currOptNames.includes(o))
+    const exclusions = currOptNames.reduce((acc, o) => {
+      const excludes = paramsSpec.find((p) => p.name === o)?.excludes
+      Iif (excludes) {
+        acc.push(...excludes)
+      }
+      return acc
+    }, [])
+ 
+    for (const rOpt of residualOpts) {
+      if (!exclusions.includes(rOpt)) {
+        options.push(...parameterOptions({ paramDef : paramsSpec.find((p) => p.name === rOpt) }))
+      }
+    }
+  }
+  else { // check to see if we can match the last command
+    if (lastOptionParamDef) { // matched, but not locked in
+      options.push(...parameterOptions({ paramDef : lastOptionParamDef }))
+    }
+    else { // is it a partial match?
+      const possibleOptions = parameterNames.filter((p) => p.startsWith(lastOptionName))
+      for (const possibleOpt of possibleOptions) {
+        const paramDef = paramsSpec.find((p) => p.name === possibleOpt)
+        // paramDef guaranteed because we're using parameterNames built from the spec as the key
+        options.push(...parameterOptions({ paramDef }))
+      }
+    }
+  }
+ 
+  return options
+}
+ 
+const nextOptions = async({
+  app,
+  cache,
+  command,
+  lastCmd,
+  model,
+  nextCommands,
+  optionString,
+  paramsSpec,
+  prevElements,
+  req
+}) => {
+  if (optionString === undefined) { // possible start of options; also there may be other commands options
+    if (command.endsWith(' ')) nextCommands.splice(0, 0, '--') // '--' always separated by ' '
+    else EnextCommands = [lastCmd]
+  }
+  else if (optionString === '' && command.endsWith(' --')) {
+    nextCommands = ['--']
+  }
+  else {
+    // Generates a list of [ name, value ] tuples
+    const currOptNameAndValues = optionsTokenizer(optionString)
+    const lastOptionName = currOptNameAndValues.length === 0
+      ? ''
+      : currOptNameAndValues[currOptNameAndValues.length - 1][0]
+    const lastOptionParamDef = paramsSpec.find((p) => p.name === lastOptionName)
+    const lastOptionValue = lastOptionParamDef && currOptNameAndValues?.[currOptNameAndValues.length - 1][1]
+    // first we check if we have a '=' and calculated options
+    if (lastOptionParamDef && lastOptionParamDef.isBoolean && command.endsWith(lastOptionName)) {
+      nextCommands = [lastOptionName]
+    }
+    // else if (command.endsWith('=') || (lastOptionValue && command.endsWith(lastOptionValue))) {
+    else if (command.match(/[=:]$/) || (lastOptionValue && command.endsWith(lastOptionValue))) {
+      nextCommands = await nextOptionValueOptions({
+        app,
+        cache,
+        lastOptionName,
+        lastOptionParamDef,
+        lastOptionValue,
+        model,
+        prevElements,
+        req
+      })
+    }
+    else {
+      nextCommands = residualOptions({
+        command,
+        currOptNameAndValues,
+        lastOptionName,
+        lastOptionParamDef,
+        paramsSpec
+      })
+    }
+  }
+ 
+  return nextCommands
+}
+ 
+export { nextOptions }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html b/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html new file mode 100644 index 00000000..e53f68d3 --- /dev/null +++ b/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/handlers/server/_lib/options-tokenizer.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/_lib options-tokenizer.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +225x +5x +  +5x +32x +  +37x +37x +15x +15x +2x +2x +2x +2x +  +  +  +37x +5x +  +  + 
const paramPairRe = /[a-zA-Z0-9]+(?:=(?:'[^']*'|"[^"]*"|\S+))?/g
+const qtValueRe = /^(['"]).*\1$/
+ 
+const optionsTokenizer = (optionString) =>
+  (optionString.match(paramPairRe) || [])
+    .map((p) => {
+      let [name, value = null] = p.split('=')
+      if (value !== null) {
+        const match = value.match(qtValueRe)
+        if (match) {
+          value = value.slice(1, -1)
+          const qt = match[1]
+          const deEscapeRe = new RegExp('\\' + qt, 'g')
+          value = value.replace(deEscapeRe, qt)
+        }
+      }
+ 
+      return [name, value]
+    })
+ 
+export { optionsTokenizer }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/api.mjs.html b/qa/coverage/src/handlers/server/api.mjs.html new file mode 100644 index 00000000..c6b9f87c --- /dev/null +++ b/qa/coverage/src/handlers/server/api.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/handlers/server/api.mjs + + + + + + + + + +
+
+

All files / src/handlers/server api.mjs

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +164x +  +  +  +  +  +4x +4x +4x +  +7x +1x +4x +  +  + 
const help = {
+  name        : 'server API',
+  summary     : 'Creates a representation of the current API.',
+  description : 'Creates a representation of the current API based on the core endpoints and currently loaded plugins. The resulting data structure is an array of "handler" entries. Each entry contains the `npmName` of the source package, the `path` (as array of path components), the `routeablePath` actually used to match paths for service, the endpoint HTTP `method`, and `parameters` data.'
+}
+ 
+const method = 'get'
+const path = ['server', 'api']
+const parameters = []
+ 
+const func = ({ app }) => (req, res) => {
+  res.json(app.ext.handlers)
+}
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/detail.mjs.html b/qa/coverage/src/handlers/server/errors/detail.mjs.html new file mode 100644 index 00000000..9c7ae8cc --- /dev/null +++ b/qa/coverage/src/handlers/server/errors/detail.mjs.html @@ -0,0 +1,337 @@ + + + + + + Code coverage report for src/handlers/server/errors/detail.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/errors detail.mjs

+
+ +
+ 26.08% + Statements + 12/46 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 22.22% + Functions + 2/9 +
+ + +
+ 27.27% + Lines + 12/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +854x +  +4x +  +  +  +  +  +4x +  +4x +4x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +7x +4x +  +  +  +  +7x +  +  +  +  +  +  +  +4x +  +  + 
import yaml from 'js-yaml'
+ 
+const help = {
+  name        : 'Detail errors',
+  summary     : 'Provides detailed information on the refenced error.',
+  description : 'Error reports are stored (temporarily) by the server and this endpoint retrieves details regarding a particular error.'
+}
+ 
+const method = 'get'
+// const path = new RegExp('/orgs(?:/list)?[/#?]?$')
+const path = ['server', 'errors', ':errorKey', 'detail']
+const parameters = []
+ 
+const highlightYAML = (yaml) => {
+  let highlighted = ''
+  let inBlock = false
+  let indentLevel = 0
+  const lines = yaml.split('\n')
+ 
+  for (let line of lines) {
+    const currIndent = line.match(/^ */)[0].length
+    Iif (inBlock && currIndent < indentLevel) {
+      inBlock = false
+    }
+    Iif (!inBlock) {
+      line = line.replace(/^(\s*)([^:]+):/, '$1<h2>$2<rst>:')
+      line = line.replace(/(:\s*)(\d+\.?\d*|true|false|null|undefined)/i, '$1<code>$2<rst>')
+    }
+    Iif (line.match(/\|-$/)) {
+      line = line.replace(/(\|-)$/, '<em>$1<rst>')
+      inBlock = true
+    }
+ 
+    highlighted += line + '\n'
+ 
+    indentLevel = currIndent
+  }
+ 
+  return highlighted
+}
+ 
+const httpOut = ({ data, req, res }) => {
+  const format = req.accepts([
+    'application/json',
+    'text/terminal',
+    'text/plain'
+  ])
+ 
+  const json = JSON.stringify(data, null, '  ')
+  if (format === 'application/json') {
+    res.type('application/json').send(json)
+  }
+  else {
+    let yamlString = yaml.dump(data)
+    if (format === 'text/terminal') {
+      res.type('text/terminal')
+      yamlString = highlightYAML(yamlString)
+    }
+    else {
+      res.type('text/plain')
+    }
+ 
+    res.send(yamlString)
+  }
+}
+ 
+const func = ({ app, model, reporter, registerPathVar }) => {
+  registerPathVar('errorKey', {
+    optionsFetcher : () => app.ext.errorsRetained.map((e) => e.id)
+      .concat(app.ext.errorsEphemeral.map((e) => e.id)),
+    validationRe : '[a-z0-9]{5}'
+  })
+ 
+  return (req, res) => {
+    const { errorKey } = req.vars
+ 
+    const error = app.ext.errorsRetained.find((e) => e.id === errorKey)
+    || app.ext.errorsEphemeral.find((e) => e.id === errorKey)
+ 
+    httpOut({ data : error, req, res })
+  }
+}
+ 
+export { func, help, parameters, path, method }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/index.html b/qa/coverage/src/handlers/server/errors/index.html new file mode 100644 index 00000000..b59404e3 --- /dev/null +++ b/qa/coverage/src/handlers/server/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/handlers/server/errors + + + + + + + + + +
+
+

All files src/handlers/server/errors

+
+ +
+ 39.43% + Statements + 28/71 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 25% + Functions + 5/20 +
+ + +
+ 40.32% + Lines + 25/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
detail.mjs +
+
26.08%12/460%0/1122.22%2/927.27%12/44
list.mjs +
+
64%16/25100%0/027.27%3/1172.22%13/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/list.mjs.html b/qa/coverage/src/handlers/server/errors/list.mjs.html new file mode 100644 index 00000000..6603d27c --- /dev/null +++ b/qa/coverage/src/handlers/server/errors/list.mjs.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/handlers/server/errors/list.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/errors list.mjs

+
+ +
+ 64% + Statements + 16/25 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 27.27% + Functions + 3/11 +
+ + +
+ 72.22% + Lines + 13/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +464x +  +4x +  +  +  +  +  +4x +  +4x +4x +  +4x +4x +4x +  +4x +  +  +4x +  +  +4x +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  + 
import { commonOutputParams, formatOutput } from '@liquid-labs/liq-handlers-lib'
+ 
+const help = {
+  name        : 'List errors',
+  summary     : 'Lists known errors.',
+  description : 'The system will retain information on recent errors for a time. This endpoint lists the current known errors. Older error references may not be present.'
+}
+ 
+const method = 'get'
+// const path = new RegExp('/orgs(?:/list)?[/#?]?$')
+const path = ['server', 'errors', 'list?']
+const parameters = commonOutputParams() // option func setup on 'fields' below
+ 
+const defaultFields = ['id', 'message', 'protected', 'timestamp']
+const allFields = ['id', 'message', 'protected', 'stack', 'timestamp']
+parameters.find((o) => o.name === 'fields').optionsFunc = () => allFields
+ 
+const mdFormatter = (orgs, title) =>
+  `# ${title}\n\n${orgs.map((e) => `- ${e.id}: ${e.message} @${e.timestamp}`).join('\n')}\n`
+ 
+const terminalFormatter = (orgs) =>
+  orgs.map((e) => `- <code>${e.id}<rst>: <em>${e.message}<rst> @${e.timestamp}`).join('\n') + '\n'
+ 
+const textFormatter = (orgs) => terminalFormatter.replace(/<[a-z]+>/gm, '')
+ 
+const func = ({ app, model, reporter }) => (req, res) => {
+  const errors = app.ext.errorsRetained.map((e) => Object.assign({ protected : true }, e))
+    .concat(app.ext.errorsEphemeral.map((e) => Object.assign({ protected : false }, e)))
+ 
+  formatOutput({
+    basicTitle : 'Error Report',
+    data       : errors,
+    allFields,
+    defaultFields,
+    mdFormatter,
+    terminalFormatter,
+    textFormatter,
+    reporter,
+    req,
+    res,
+    ...req.vars
+  })
+}
+ 
+export { func, help, parameters, path, method }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/index.html b/qa/coverage/src/handlers/server/index.html new file mode 100644 index 00000000..7f332eaa --- /dev/null +++ b/qa/coverage/src/handlers/server/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/handlers/server + + + + + + + + + +
+
+

All files src/handlers/server

+
+ +
+ 75.36% + Statements + 104/138 +
+ + +
+ 64.06% + Branches + 41/64 +
+ + +
+ 84.61% + Functions + 11/13 +
+ + +
+ 78.22% + Lines + 97/124 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
api.mjs +
+
100%8/8100%0/0100%2/2100%7/7
next-commands.mjs +
+
73.11%68/9361.4%35/57100%4/478.57%66/84
reload.mjs +
+
77.77%7/9100%0/050%1/275%6/8
stop.mjs +
+
50%7/140%0/150%1/246.15%6/13
version.js +
+
100%14/14100%6/6100%3/3100%12/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/next-commands.mjs.html b/qa/coverage/src/handlers/server/next-commands.mjs.html new file mode 100644 index 00000000..524a4af1 --- /dev/null +++ b/qa/coverage/src/handlers/server/next-commands.mjs.html @@ -0,0 +1,592 @@ + + + + + + Code coverage report for src/handlers/server/next-commands.mjs + + + + + + + + + +
+
+

All files / src/handlers/server next-commands.mjs

+
+ +
+ 73.11% + Statements + 68/93 +
+ + +
+ 61.4% + Branches + 35/57 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 78.57% + Lines + 66/84 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +1704x +4x +  +4x +  +  +  +  +  +4x +4x +4x +  +  +  +  +  +  +4x +4x +  +7x +46x +46x +46x +  +46x +  +46x +46x +46x +  +  +46x +46x +46x +24x +24x +24x +  +  +22x +22x +22x +  +46x +7x +  +  +46x +  +46x +108x +108x +108x +  +108x +108x +102x +  +  +  +6x +6x +26x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +46x +26x +  +  +40x +40x +  +64x +64x +4x +4x +4x +4x +4x +  +  +  +  +60x +30x +  +30x +30x +  +  +  +64x +  +  +40x +  +40x +40x +30x +  +  +  +  +  +  +  +  +  +  +  +10x +2x +  +  +  +46x +  +  +  +46x +  +  +  +4x +  +  + 
import { getVarDef } from '../../lib/path-var-registry'
+import { nextOptions } from './_lib/next-options'
+ 
+const help = {
+  name        : 'Next commands',
+  summary     : 'Given a partial or incomplete command string, lists possible "next commands" to complete or follow the given partial.',
+  description : 'Given a partial or incomplete command string, lists possible "next commands" to complete or follow the given partial. The provided command string may be blank. This is used primarily to support the built-in shell tab-completion support, allowing the server to generate possible completions dynamically as plugins are loaded and removed.'
+}
+ 
+const method = 'get'
+const path = ['server', 'next-commands']
+const parameters = [
+  {
+    name        : 'command',
+    description : "The (URL) path so far and optional '--' plus options."
+  }
+]
+ 
+const CLI_STYLE = ' '
+const URL_STYLE = '/'
+ 
+const func = ({ app, cache }) => async(req, res) => {
+  try {
+    const format = req.accepts(['json', 'text'])
+    const { command = '/' } = req.query
+ 
+    const [commandPath, optionString] = command.split(/\s*--\s*/)
+ 
+    let frontier = app.ext.commandPaths
+    const cmdsWalked = []
+    const prevElements = {}
+    let cmdSep
+    let cmdsLeft
+    const firstSpace = commandPath.indexOf(' ')
+    const firstSlash = commandPath.indexOf('/')
+    if (commandPath.indexOf('/') === -1 || (firstSpace !== -1 && firstSpace < firstSlash)) { // then it's the CLI form
+      cmdSep = CLI_STYLE
+      cmdsLeft = commandPath.split(/\s+/)
+      cmdsLeft.shift() // drop the leading cli command that we see in this form
+    }
+    else { // command is in URL form
+      cmdSep = URL_STYLE
+      cmdsLeft = commandPath.split('/')
+      cmdsLeft.shift() // drop '' from leading '/'
+    }
+    if (cmdsLeft[cmdsLeft.length - 1]?.match(/^\s*$/)) { // TODO: this may not be necessary
+      cmdsLeft.pop()
+    }
+ 
+    let unmatchedFinalCommand = null
+    let finalOptions
+    while (cmdsLeft.length > 0) {
+      finalOptions = []
+      const commandBit = cmdsLeft.shift().replace(/\s+$/, '')
+      Iif (commandBit === '') break // TODO: ???
+ 
+      cmdsWalked.push(commandBit)
+      if (commandBit in frontier) {
+        frontier = frontier[commandBit]
+      }
+      else { // the frontier says ':orgKey' and we have 'orgA' or whatever
+      // TODO: document: you may only have one variable option element at any particular node in the tree
+        let foundVariablePathElement = null
+        for (const fKey of Object.keys(frontier)) {
+          Iif (fKey.startsWith(':')) {
+            /* We're going to try and relax this rule
+            if (foundVariablePathElement !== null) {
+              throw new Error(`Illegal multiple variable path branch possibilities: ${cmdsWalked.join(cmdSep)}${cmdSep}(${foundVariablePathElement}|${fKey})`)
+            } */
+            foundVariablePathElement = fKey
+            const typeKey = fKey.slice(1)
+            prevElements[typeKey] = commandBit // save the value of the variable
+            const elementConfig = getVarDef(typeKey)
+            const { validationRe, optionsFetcher } = elementConfig
+            let myOptions = optionsFetcher({ app, cache, currToken : commandBit, ...prevElements })
+            Iif (myOptions?.then) myOptions = await myOptions
+            Iif (myOptions?.length > 0) finalOptions.push(...myOptions)
+ 
+            if (validationRe
+                && commandBit.match(new RegExp('^' + validationRe + '$'))
+                && finalOptions.includes(commandBit)) {
+              frontier = frontier[fKey]
+              break // there may be other possibilities, but once we have a match, we move on.
+            }
+            else {
+              foundVariablePathElement = null
+            }
+          }
+        }
+ 
+        if (foundVariablePathElement === null) {
+          if (cmdsLeft.length === 0) {
+            unmatchedFinalCommand = commandBit
+          }
+          else E{ // we don't have anything for an unmatched middle command
+            switch (format) {
+            case 'text':
+              res.type('txt').send(); break
+            default: // json
+              res.json([])
+            }
+            return
+          }
+        }
+      }
+    }
+ 
+    let nextCommands
+    if (unmatchedFinalCommand && command.endsWith(unmatchedFinalCommand)) {
+      nextCommands = Object.keys(frontier).concat(finalOptions).filter((k) => k.startsWith(unmatchedFinalCommand))
+    }
+    else {
+      let maybeOptions = false
+      nextCommands = await Object.keys(frontier)
+        .reduce(async(acc, k) => {
+          acc = await acc
+          if (k.startsWith(':')) {
+            const elementConfig = getVarDef(k.slice(1)) // this should already be validated
+            const { optionsFetcher } = elementConfig
+            let fOpts = optionsFetcher({ app, cache, currToken : '', req, ...prevElements })
+            Iif (fOpts?.then) fOpts = await fOpts
+            acc.push(...fOpts)
+          // acc.push(...optionsFetcher({ currToken: '', ...prevElements }))
+          }
+          // the blank happens because the root command is '', but it doesn't make sense to reflect it back
+          // '_' vars are either hidden (if actually options) or internal vars
+          else if (k !== '' && !k.startsWith('_')) {
+            acc.push(k)
+          }
+          else if (k === '_parameters') {
+            maybeOptions = true
+          }
+          // else it's '' or a '_' var that isn't _parameters
+ 
+          return acc
+        }, [])
+      // TODO: v is that necessary? Doesn't '_parameters' occur on it's own?
+      nextCommands.sort() // nice, and also puts '_parameters' first (remmember, we require unique paths, so there is only ever one)
+ 
+      const lastCmd = cmdsWalked.length === 0 ? '' : cmdsWalked[cmdsWalked.length - 1]
+      if (maybeOptions === true) {
+        nextCommands = await nextOptions({
+          app,
+          cache,
+          command,
+          lastCmd,
+          nextCommands,
+          optionString,
+          paramsSpec : frontier._parameters(),
+          prevElements,
+          req
+        })
+      }
+      else if (!command.endsWith(cmdSep) && cmdsWalked.length > 0) {
+        nextCommands = [cmdsWalked.pop()]
+      }
+    }
+ 
+    switch (format) {
+    case 'text':
+      res.type('txt').send(nextCommands.join('\n')); break
+    default: // json
+      res.json(nextCommands)
+    }
+  }
+  catch (e) { console.error(e); throw e }
+}
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html new file mode 100644 index 00000000..2e9ff3ce --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/handlers/server/plugins/_lib/add-plugins.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins/_lib add-plugins.mjs

+
+ +
+ 0% + Statements + 0/9 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// Import the installPlugins function from the local library
+import { installPlugins } from './install-plugins'
+ 
+/**
+ * Adds plugins to the server.
+ *
+ * @param {Object} options
+ * @param {Object} options.app - The Express app object
+ * @param {Object} options.cache - Cache object
+ * @param {Array<string>} options.packages - Array of NPM package names to install
+ * @param {Object} options.reporter - Reporter for logging
+ * @returns {Promise<Object>} Result object with installation details
+ */
+const addPlugins = async({ app, cache, packages, reporter }) => {
+  const installedPlugins = app.ext.handlerPlugins || []
+  // Use dynamicPluginInstallDir if provided, otherwise use current working directory
+  const pluginPkgDir = app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot
+  const reloadFunc = () => app.reload()
+ 
+  const result = await installPlugins({
+    installedPlugins,
+    npmNames : packages,
+    pluginPkgDir,
+    reloadFunc,
+    reporter
+  })
+ 
+  return result
+}
+ 
+export { addPlugins }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html new file mode 100644 index 00000000..3d9c2fba --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html @@ -0,0 +1,418 @@ + + + + + + Code coverage report for src/handlers/server/plugins/_lib/error-utils.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins/_lib error-utils.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +1128x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  + 
import createError from 'http-errors'
+ 
+/**
+ * Standardized error creation utilities for the plugin system
+ *
+ * Error Types:
+ * - INVALID_INPUT (400): User provided invalid input
+ * - VALIDATION_ERROR (400): Specific field validation failed
+ * - ACCESS_ERROR (403): Permission/access issues
+ * - PARSING_ERROR (400): File parsing failures
+ * - DEPENDENCY_ERROR (400): Circular or invalid dependencies
+ * - RESOURCE_LIMIT_ERROR (400): DoS prevention limits hit
+ * - INTERNAL_ERROR (500): Unexpected server issues
+ *
+ * All errors include:
+ * - Consistent HTTP status codes
+ * - Proper exposure settings for security
+ * - Structured error details for API consumers
+ * - Type field for programmatic handling
+ */
+ 
+export const PluginError = {
+  /**
+   * Creates a client error (400) for invalid user input
+   */
+  invalidInput : (message, details = {}) => {
+    return createError(400, {
+      message,
+      expose : true,
+      type   : 'INVALID_INPUT',
+      ...details
+    })
+  },
+ 
+  /**
+   * Creates a validation error for specific field validation failures
+   */
+  validation : (field, value, expected, details = {}) => {
+    return createError(400, {
+      message : `Invalid ${field}: ${value}. Expected: ${expected}`,
+      expose  : true,
+      type    : 'VALIDATION_ERROR',
+      field,
+      value,
+      expected,
+      ...details
+    })
+  },
+ 
+  /**
+   * Creates an access error (403) for permission issues
+   */
+  access : (message, originalError = null) => {
+    return createError(403, originalError, {
+      message,
+      expose : false,
+      type   : 'ACCESS_ERROR'
+    })
+  },
+ 
+  /**
+   * Creates a parsing error (400) for YAML/JSON parsing issues
+   */
+  parsing : (filePath, originalError, exposeDetails = true) => {
+    return createError(400, originalError, {
+      message : `Error parsing file '${filePath}': ${exposeDetails ? originalError.message : 'parsing failed'}`,
+      expose  : exposeDetails,
+      type    : 'PARSING_ERROR',
+      filePath
+    })
+  },
+ 
+  /**
+   * Creates a dependency error (400) for circular/invalid dependencies
+   */
+  dependency : (message, cycle = null, packageName = null) => {
+    return createError(400, {
+      message,
+      expose : true,
+      type   : 'DEPENDENCY_ERROR',
+      cycle,
+      packageName
+    })
+  },
+ 
+  /**
+   * Creates a resource limit error (400) for DoS prevention
+   */
+  resourceLimit : (limitType, current, maximum, details = {}) => {
+    return createError(400, {
+      message : `${limitType} limit exceeded: ${current} > ${maximum}`,
+      expose  : true,
+      type    : 'RESOURCE_LIMIT_ERROR',
+      limitType,
+      current,
+      maximum,
+      ...details
+    })
+  },
+ 
+  /**
+   * Creates a server error (500) for unexpected internal issues
+   */
+  internal : (message, originalError = null, exposeMessage = false) => {
+    return createError(500, originalError, {
+      message,
+      expose : exposeMessage,
+      type   : 'INTERNAL_ERROR'
+    })
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/index.html b/qa/coverage/src/handlers/server/plugins/_lib/index.html new file mode 100644 index 00000000..b4c95f6c --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/_lib/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/handlers/server/plugins/_lib + + + + + + + + + +
+
+

All files src/handlers/server/plugins/_lib

+
+ +
+ 86.11% + Statements + 62/72 +
+ + +
+ 89.09% + Branches + 49/55 +
+ + +
+ 78.57% + Functions + 11/14 +
+ + +
+ 86.95% + Lines + 60/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
add-plugins.mjs +
+
0%0/90%0/40%0/20%0/8
error-utils.mjs +
+
100%9/9100%11/11100%7/7100%9/9
install-plugins.mjs +
+
100%51/51100%38/38100%4/4100%49/49
list-plugins.mjs +
+
66.66%2/30%0/20%0/166.66%2/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html new file mode 100644 index 00000000..54c0adfd --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html @@ -0,0 +1,466 @@ + + + + + + Code coverage report for src/handlers/server/plugins/_lib/install-plugins.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins/_lib install-plugins.mjs

+
+ +
+ 100% + Statements + 51/51 +
+ + +
+ 100% + Branches + 38/38 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +1289x +  +9x +  +396x +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +27x +27x +  +  +27x +35x +35x +  +35x +6x +  +  +29x +  +  +  +27x +27x +  +  +  +  +  +27x +24x +  +  +24x +  +  +23x +  +  +  +  +  +22x +27x +  +  +27x +27x +26x +  +26x +6x +  +  +  +1x +  +  +27x +  +  +  +  +  +  +27x +27x +  +  +  +22x +22x +22x +21x +  +  +  +21x +  +21x +21x +  +21x +3x +  +  +21x +  +  +3x +2x +  +  +1x +  +  +3x +  +9x +  +9x +  +9x +3x +1x +  +9x +  +  + 
import * as fs from 'node:fs/promises'
+ 
+import { install, view, getPackageOrgBasenameAndVersion } from '@liquid-labs/npm-toolkit'
+ 
+import { PluginError } from './error-utils'
+ 
+/**
+ * Installs plugins based on NPM package names
+ * Plugins are identified by the 'pluggable-endpoints' keyword in their package.json
+ * @param {Object} options - Installation options
+ * @param {Array} options.installedPlugins - Currently installed plugins
+ * @param {Array<string>} options.npmNames - NPM package names to install (with optional version specs)
+ * @param {string} options.pluginPkgDir - Directory where plugins should be installed
+ * @param {Function} options.reloadFunc - Function to call after installation to reload the app
+ * @param {Object} options.reporter - Reporter for logging
+ * @returns {Promise<{msg: string, data: Object}>} Installation result message and data
+ */
+const installPlugins = async({
+  installedPlugins,
+  npmNames,
+  pluginPkgDir,
+  reloadFunc,
+  reporter
+}) => {
+  const alreadyInstalled = []
+  const toInstall = []
+ 
+  // Filter out already installed packages
+  for (const testPackage of npmNames) {
+    const { name: testName } = await getPackageOrgBasenameAndVersion(testPackage)
+    const matched = installedPlugins.some(({ npmName }) => npmName === testName)
+ 
+    if (matched === true) {
+      alreadyInstalled.push(testName)
+    }
+    else {
+      toInstall.push(testPackage)
+    }
+  }
+ 
+  let msg = ''
+  const data = {
+    installedPlugins : [],
+    total            : 0,
+    production       : 0
+  }
+ 
+  if (toInstall.length > 0) {
+    reporter?.log(`To install: ${toInstall.join(', ')}`)
+ 
+    // Create plugin directory if it doesn't exist
+    await fs.mkdir(pluginPkgDir, { recursive : true })
+ 
+    // Install packages using npm
+    const { productionPackages } = await install({
+      packages    : toInstall,
+      projectPath : pluginPkgDir
+    })
+ 
+    // Process each installed package and verify it has the correct keyword
+    for (const pkgSpec of productionPackages) {
+      const { name, version } = await getPackageOrgBasenameAndVersion(pkgSpec)
+ 
+      // Verify the package has the 'pluggable-endpoints' keyword
+      try {
+        const packageData = await view({ packageName : name })
+        const keywords = packageData?.keywords || []
+ 
+        if (!keywords.includes('pluggable-endpoints')) {
+          reporter?.log(`Warning: Package '${name}' does not have the 'pluggable-endpoints' keyword and may not be a valid plugin`)
+        }
+      }
+      catch (error) {
+        reporter?.log(`Warning: Could not verify keywords for package '${name}': ${error.message}`)
+      }
+ 
+      const packageInfo = {
+        name,
+        version          : version || 'latest',
+        fromRegistry     : true,
+        hasPluginKeyword : true // Assuming valid if installed
+      }
+ 
+      data.installedPlugins.push(packageInfo)
+      data.production++
+    }
+ 
+    // Reload the app if reload function is provided
+    if (reloadFunc !== undefined) {
+      const reload = reloadFunc()
+      if (reload?.then) {
+        await reload
+      }
+    }
+ 
+    data.total = data.installedPlugins.length
+ 
+    if (productionPackages.length > 0) {
+      msg += '<em>Installed<rst> <code>' + productionPackages.join('<rst>, <code>') + '<rst> production packages\n'
+    }
+    if (alreadyInstalled.length > 0) {
+      msg += '<code>' + alreadyInstalled.join('<rst>, <code>') + '<rst> <em>already installed<rst>.'
+    }
+ 
+    return { msg, data }
+  }
+  else {
+    if (alreadyInstalled.length > 0) {
+      msg += '<code>' + alreadyInstalled.join('<rst>, <code>') + '<rst> <em>already installed<rst>.'
+    }
+    else {
+      msg = 'Nothing to install.'
+    }
+ 
+    return { msg, data }
+  }
+}
+ 
+const MAX_PACKAGES = 500
+ 
+const checkMaxPackages = (count) => {
+  if (count > MAX_PACKAGES) {
+    throw PluginError.resourceLimit('packages', count, MAX_PACKAGES)
+  }
+}
+ 
+export { installPlugins, checkMaxPackages }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html new file mode 100644 index 00000000..daaf9f2c --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/handlers/server/plugins/_lib/list-plugins.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins/_lib list-plugins.mjs

+
+ +
+ 66.66% + Statements + 2/3 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 66.66% + Lines + 2/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +  +  +  +  +5x +  +5x +  +  + 
/**
+ * Lists the installed plugins.
+ *
+ * @param {Object} options
+ * @param {Object} options.app - The Express app object
+ * @returns {Array} Array of installed plugin objects
+ */
+const listPlugins = ({ app }) => {
+  return app.ext.handlerPlugins || []
+}
+ 
+export { listPlugins }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/add.mjs.html b/qa/coverage/src/handlers/server/plugins/add.mjs.html new file mode 100644 index 00000000..eff16560 --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/add.mjs.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for src/handlers/server/plugins/add.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins add.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +445x +  +5x +  +  +5x +  +5x +  +  +  +  +  +5x +  +5x +  +  +  +  +  +  +  +5x +  +15x +8x +8x +  +8x +  +8x +  +  +  +1x +  +  +  +8x +5x +  +  + 
import { httpSmartResponse } from '@liquid-labs/http-smart-response'
+ 
+import { installPlugins } from './_lib/install-plugins'
+ 
+// Handler setup and implementation
+const pluginType = 'server'
+ 
+const help = {
+  name        : `add ${pluginType} plugins`,
+  summary     : `Installs one or more ${pluginType} plugins.`,
+  description : `Installs one or more ${pluginType} plugins.`
+}
+ 
+const method = 'put'
+ 
+const parameters = [
+  {
+    name         : 'npmNames',
+    isMultivalue : true,
+    description  : 'The plugins to install, by their NPM package name. Plugins must have the \'pluggable-endpoints\' keyword. Include multiple times to install multiple plugins.'
+  }
+]
+ 
+const path = ['server', 'plugins', 'add']
+ 
+const func = ({ app, reporter }) => async(req, res) => {
+  const installedPlugins = app.ext.handlerPlugins || []
+  const { npmNames } = req.vars
+  // Use dynamicPluginInstallDir if provided, otherwise use current working directory
+  const pluginPkgDir = app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot
+ 
+  const { msg, data } = await installPlugins({
+    installedPlugins,
+    npmNames,
+    pluginPkgDir,
+    reloadFunc : () => app.reload(),
+    reporter
+  })
+ 
+  httpSmartResponse({ data, msg, req, res })
+}
+ 
+export { func, help, method, parameters, path, installPlugins }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/details.mjs.html b/qa/coverage/src/handlers/server/plugins/details.mjs.html new file mode 100644 index 00000000..8755f8c9 --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/details.mjs.html @@ -0,0 +1,208 @@ + + + + + + Code coverage report for src/handlers/server/plugins/details.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins details.mjs

+
+ +
+ 100% + Statements + 24/24 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +425x +5x +  +5x +5x +  +  +  +  +5x +  +5x +  +5x +  +  +5x +15x +8x +8x +  +8x +8x +4x +  +  +  +4x +  +  +15x +  +5x +  +5x +  +8x +  +5x +  +  + 
import createError from 'http-errors'
+import { httpSmartResponse } from '@liquid-labs/http-smart-response'
+ 
+const detailsPluginSetup = ({ pluginsDesc }) => {
+  const help = {
+    name        : `${pluginsDesc} plugins details`,
+    summary     : 'Provides details on the named plugin.',
+    description : 'Provides details on the named plugin.'
+  }
+  const method = 'get'
+ 
+  const parameters = []
+ 
+  return { help, method, parameters }
+}
+ 
+const detailsPluginHandler = ({ installedPluginsRetriever, nameKey }) =>
+  ({ app, reporter }) => async(req, res) => {
+    const installedPlugins = installedPluginsRetriever({ app, req }) || []
+    const pluginName = req.vars[nameKey]
+ 
+    const pluginData = installedPlugins.find(({ npmName }) => pluginName === npmName)
+    if (!pluginData) {
+      throw createError.NotFound(`No such plugin '${pluginName}' found.`)
+    }
+    // else
+ 
+    httpSmartResponse({ data : pluginData, req, res })
+  }
+ 
+const { help, method, parameters } = detailsPluginSetup({ pluginsDesc : 'server endpoint' })
+ 
+const pluginNameKey = 'serverPluginName'
+ 
+const path = ['server', 'plugins', ':' + pluginNameKey, 'details']
+ 
+const installedPluginsRetriever = ({ app }) => app.ext.handlerPlugins
+ 
+const func = detailsPluginHandler({ installedPluginsRetriever, nameKey : pluginNameKey })
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/index.html b/qa/coverage/src/handlers/server/plugins/index.html new file mode 100644 index 00000000..b2b11b6e --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/handlers/server/plugins + + + + + + + + + +
+
+

All files src/handlers/server/plugins

+
+ +
+ 85% + Statements + 102/120 +
+ + +
+ 30.76% + Branches + 12/39 +
+ + +
+ 75.75% + Functions + 25/33 +
+ + +
+ 86.4% + Lines + 89/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
add.mjs +
+
100%16/16100%4/4100%3/3100%15/15
details.mjs +
+
100%24/24100%3/3100%6/6100%20/20
list.mjs +
+
63.04%29/467.4%2/2750%8/1665.78%25/38
remove.mjs +
+
97.05%33/3460%3/5100%8/896.66%29/30
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/list.mjs.html b/qa/coverage/src/handlers/server/plugins/list.mjs.html new file mode 100644 index 00000000..5fb867a0 --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/list.mjs.html @@ -0,0 +1,451 @@ + + + + + + Code coverage report for src/handlers/server/plugins/list.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins list.mjs

+
+ +
+ 63.04% + Statements + 29/46 +
+ + +
+ 7.4% + Branches + 2/27 +
+ + +
+ 50% + Functions + 8/16 +
+ + +
+ 65.78% + Lines + 25/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +1235x +  +5x +  +5x +  +5x +5x +  +  +  +  +5x +  +5x +  +  +5x +  +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +5x +13x +6x +  +6x +6x +8x +  +4x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +15x +  +5x +  +6x +  +5x +  +  + 
import { commonOutputParams, formatOutput } from '@liquid-labs/liq-handlers-lib'
+ 
+import { listPlugins } from './_lib/list-plugins'
+ 
+const allFields = ['npmName', 'installed', 'summary', 'handlerCount', 'provider', 'homepage', 'version']
+ 
+const listPluginsSetup = ({ pluginsDesc }) => {
+  const help = {
+    name        : `${pluginsDesc} plugins list`,
+    summary     : `Lists the installed ${pluginsDesc} plugins.`,
+    description : `Lists the installed ${pluginsDesc} plugins.`
+  }
+  const method = 'get'
+ 
+  const parameters = [
+    ...commonOutputParams() // option func setup on 'fields' below
+  ]
+  parameters.find((o) => o.name === 'fields').optionsFetcher = () => allFields
+ 
+  return { help, method, parameters }
+}
+ 
+const generateRowText = ({
+  codeClose,
+  codeOpen,
+  homepageClose = '',
+  homepageOpen = '',
+  installedClose = '',
+  installedOpen = '',
+  nameClose = '',
+  nameOpen = '',
+  p,
+  providerClose = '',
+  providerOpen = ''
+}) => {
+  let row = `- ${nameOpen}${p.npmName}${nameClose}`
+  Iif (p.provider !== undefined) {
+    row += ` from ${providerOpen}${p.provider}${providerClose}`
+  }
+  Iif (p.installed !== undefined || p.handlerCount !== undefined) {
+    row += ` (${p.installed !== undefined ? `${installedOpen}installed${installedClose}` + (p.handlerCount !== undefined ? '; ' : '') : ''}${p.handlerCount !== undefined ? `${p.handlerCount} handlers` : ''})`
+  }
+  Iif (p.summary !== undefined && p.summary.length > 0) {
+    row += ': ' + p.summary
+  }
+  Iif (p.homepage !== undefined) {
+    row += `\n  homepage: ${homepageOpen}${p.homepage}${homepageClose}`
+  }
+ 
+  return row
+}
+ 
+const mdFormatter = ({ data = [], title }) => `# ${title}\n\n`
+  + data.map((p) => generateRowText({
+    codeClose      : '`',
+    codeOpen       : '`',
+    homepageClose  : '_',
+    homepageOpen   : '_',
+    installedClose : '__',
+    installedOpen  : '__',
+    nameClose      : '___',
+    nameOpen       : '___',
+    p,
+    providerClose  : '__',
+    providerOpen   : '__'
+  })).join('\n')
+  // `- **${p.name}** (${ p.installed !== undefined ? 'installed' + (p.handlerCount !== undefined ? '; ' : '') : ''} ${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
+ 
+const terminalFormatter = ({ data = [] }) => {
+  return data.map((p) => generateRowText({
+    codeClose      : '<rst>',
+    codeOpen       : '<code>',
+    homepageClose  : '<rst>',
+    homepageOpen   : '<code>',
+    installedClose : '<rst>',
+    installedOpen  : '<em>',
+    nameClose      : '<rst>',
+    nameOpen       : '<h2>',
+    p,
+    providerClose  : '<rst>',
+    providerOpen   : '<bold>'
+  })).join('\n')
+}
+// `- <em>${p.name}<rst> (${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
+ 
+const textFormatter = ({ data = [] }) =>
+  data.map((p) => generateRowText({ p })).join('\n')
+// `- ${p.name} (${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
+ 
+const listPluginsHandler = ({ installedPluginsRetriever }) =>
+  ({ app, model, reporter }) => async(req, res) => {
+    const installedPlugins = installedPluginsRetriever({ app, model, req }) || []
+ 
+    const defaultFields = ['npmName', 'handlerCount', 'installed', 'summary', 'homepage']
+    const data = installedPlugins
+      .map((p) => ({ ...p, installed : true }))
+      .sort((a, b) =>
+        a.npmName.localeCompare(b.npmName)) // 1 and -1 are true-ish, only zero then fallsback to the secondary sort
+    formatOutput({
+      basicTitle : 'Plugins Report',
+      data,
+      allFields,
+      defaultFields,
+      mdFormatter,
+      terminalFormatter,
+      textFormatter,
+      reporter,
+      req,
+      res,
+      ...req.vars
+    })
+  }
+ 
+const { help, method, parameters } = listPluginsSetup({ pluginsDesc : 'server endpoint' })
+ 
+const path = ['server', 'plugins', 'list']
+ 
+const installedPluginsRetriever = ({ app }) => listPlugins({ app })
+ 
+const func = listPluginsHandler({ installedPluginsRetriever })
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/remove.mjs.html b/qa/coverage/src/handlers/server/plugins/remove.mjs.html new file mode 100644 index 00000000..7a379f50 --- /dev/null +++ b/qa/coverage/src/handlers/server/plugins/remove.mjs.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/handlers/server/plugins/remove.mjs + + + + + + + + + +
+
+

All files / src/handlers/server/plugins remove.mjs

+
+ +
+ 97.05% + Statements + 33/34 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 96.66% + Lines + 29/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +655x +5x +5x +  +5x +5x +  +  +  +  +  +5x +  +5x +  +5x +  +  +5x +12x +5x +5x +  +6x +5x +1x +  +  +  +4x +4x +  +  +4x +  +  +  +  +4x +4x +4x +  +  +  +  +4x +  +  +15x +  +5x +  +5x +  +5x +  +5x +  +  +4x +4x +  +  +  + 
import createError from 'http-errors'
+import { httpSmartResponse } from '@liquid-labs/http-smart-response'
+import { uninstall } from '@liquid-labs/npm-toolkit'
+ 
+const removePluginsSetup = ({ pluginsDesc }) => {
+  const help = {
+    name        : `remove ${pluginsDesc} plugins`,
+    summary     : 'Removes the named plugin.',
+    description : 'Removes the named plugin.'
+  }
+ 
+  const method = 'delete'
+ 
+  const parameters = []
+ 
+  return { help, method, parameters }
+}
+ 
+const removePluginsHandler = ({ installedPluginsRetriever, nameKey, pluginPkgDirRetriever, reloadFunc }) =>
+  ({ app, reporter }) => async(req, res) => {
+    const installedPlugins = installedPluginsRetriever({ app, req })
+    const pluginName = req.vars[nameKey]
+ 
+    const pluginData = installedPlugins.find(({ npmName }) => pluginName === npmName)
+    if (!pluginData) {
+      throw createError.NotFound(`No such plugin '${pluginName}' found.`)
+    }
+    // else
+ 
+    const npmName = pluginData.npmName
+    const pluginPkgDir = pluginPkgDirRetriever({ app, reporter, req })
+ 
+    // Use npm-toolkit's uninstall function for safe package removal
+    await uninstall({
+      packages    : [npmName],
+      projectPath : pluginPkgDir
+    })
+ 
+    if (reloadFunc !== undefined) {
+      const reload = reloadFunc({ app })
+      Iif (reload.then) {
+        await reload
+      }
+    }
+ 
+    httpSmartResponse({ msg : `<em>Removed<rst> <code>${pluginName}<rst> plugin. Server endpoints refreshed.`, req, res })
+  }
+ 
+const { help, method, parameters } = removePluginsSetup({ pluginsDesc : 'server endpoint' })
+ 
+const pluginNameKey = 'serverPluginName'
+ 
+const path = ['server', 'plugins', ':' + pluginNameKey, 'remove']
+ 
+const installedPluginsRetriever = ({ app }) => app.ext.handlerPlugins
+ 
+const func = removePluginsHandler({
+  installedPluginsRetriever,
+  nameKey               : pluginNameKey,
+  pluginPkgDirRetriever : ({ app }) => app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot,
+  reloadFunc            : ({ app }) => app.reload()
+})
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/reload.mjs.html b/qa/coverage/src/handlers/server/reload.mjs.html new file mode 100644 index 00000000..15ed7256 --- /dev/null +++ b/qa/coverage/src/handlers/server/reload.mjs.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for src/handlers/server/reload.mjs + + + + + + + + + +
+
+

All files / src/handlers/server reload.mjs

+
+ +
+ 77.77% + Statements + 7/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 75% + Lines + 6/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +184x +  +  +  +  +  +4x +4x +4x +  +7x +  +  +  +4x +  +  + 
const help = {
+  name        : 'Server reload',
+  summary     : 'Reloads the server settings and plugins from disk.',
+  description : 'Reloads the server settings and plugins from disk. This is necessary when changes are made to the state/data files outside of the server (e.g., through manual file edits). Generally, changes made through server endpoints should be re-loaded themselves.'
+}
+ 
+const method = 'put'
+const path = ['server', 'reload']
+const parameters = []
+ 
+const func = ({ app, cache, reporter }) => async(req, res) => {
+  app.reload()
+ 
+  res.json({ message : 'App reloaded.' })
+}
+ 
+export { func, help, method, parameters, path }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/stop.mjs.html b/qa/coverage/src/handlers/server/stop.mjs.html new file mode 100644 index 00000000..f04ddf25 --- /dev/null +++ b/qa/coverage/src/handlers/server/stop.mjs.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/handlers/server/stop.mjs + + + + + + + + + +
+
+

All files / src/handlers/server stop.mjs

+
+ +
+ 50% + Statements + 7/14 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 46.15% + Lines + 6/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +254x +  +  +  +  +4x +4x +4x +  +7x +  +  +  +  +  +  +  +  +  +  +  +4x +  +  + 
const help = {
+  name    : 'Server stop',
+  summary : 'Stops or shuts down the server.'
+}
+ 
+const method = 'unbind'
+const path = ['server', 'stop?']
+const parameters = []
+ 
+const func = ({ app, cache }) => async(req, res) => {
+  res.send('Shutting down...')
+ 
+  for (const teardownMethod of app.ext.teardownMethods) {
+    const ret = teardownMethod({ app })
+    Iif (ret.then) {
+      await ret
+    }
+  }
+ 
+  cache.release()
+  process.kill(process.pid, 'SIGTERM')
+}
+ 
+export { func, help, path, method, parameters }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/version.js.html b/qa/coverage/src/handlers/server/version.js.html new file mode 100644 index 00000000..ea4471ed --- /dev/null +++ b/qa/coverage/src/handlers/server/version.js.html @@ -0,0 +1,208 @@ + + + + + + Code coverage report for src/handlers/server/version.js + + + + + + + + + +
+
+

All files / src/handlers/server version.js

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +424x +4x +  +140x +  +4x +  +  +  +  +  +4x +4x +4x +  +7x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +3x +4x +  +  + 
import http from 'node:http'
+import * as os from 'node:os'
+ 
+import { httpSmartResponse } from '@liquid-labs/http-smart-response'
+ 
+const help = {
+  name        : 'Server version',
+  summary     : 'Provides version information for the server aand its components.',
+  descirption : "Provides version information for the server aand its components. This includes the underlying 'pluggable-server' version (which is used to determine plugin compatibility), as well as information on node and the platform where the server is running."
+}
+ 
+const method = 'get'
+const path = ['server', 'version']
+const parameters = []
+ 
+const func = ({ app, cache, reporter }) => (req, res) => {
+  const versionInfo = {
+    name                : app.ext.name,
+    version             : app.ext.version,
+    'pluggable-express' : app.ext.serverVersion,
+    node                : process.version,
+    fullNode            : process.versions,
+    platform            : `${os.type()} ${os.release()}`,
+    fullPlatform        : {
+      platform : os.platform(),
+      type     : os.type(),
+      version  : os.version(),
+      release  : os.release()
+    },
+    supportedMethods : http.METHODS
+  }
+ 
+  const msg = `${app.ext.name}: ${app.ext.version}
+pluggable-express: ${versionInfo.server}
+node: ${versionInfo.node}
+platform:${versionInfo.platform}
+`
+  httpSmartResponse({ msg, data : versionInfo, req, res })
+}
+ 
+export { func, help, path, method, parameters }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/index.html b/qa/coverage/src/index.html new file mode 100644 index 00000000..ee067da6 --- /dev/null +++ b/qa/coverage/src/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 48.48% + Statements + 64/132 +
+ + +
+ 32.69% + Branches + 17/52 +
+ + +
+ 14.28% + Functions + 2/14 +
+ + +
+ 49.21% + Lines + 63/128 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.js +
+
56.63%64/11335.41%17/4820%2/1057.79%63/109
server.mjs +
+
0%0/190%0/40%0/40%0/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/configurables.js.html b/qa/coverage/src/lib/configurables.js.html new file mode 100644 index 00000000..40b860b1 --- /dev/null +++ b/qa/coverage/src/lib/configurables.js.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for src/lib/configurables.js + + + + + + + + + +
+
+

All files / src/lib configurables.js

+
+ +
+ 66.66% + Statements + 2/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 100% + Lines + 1/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7  +  +  +4x +  +  + 
// TODO: make this a small project
+ 
+// TODO: support slurping in env variables between defaults
+const initializeConfiguration = (sources) => Object.assign({}, ...sources)
+ 
+export { initializeConfiguration }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/find-own-home.mjs.html b/qa/coverage/src/lib/find-own-home.mjs.html new file mode 100644 index 00000000..4cad584b --- /dev/null +++ b/qa/coverage/src/lib/find-own-home.mjs.html @@ -0,0 +1,319 @@ + + + + + + Code coverage report for src/lib/find-own-home.mjs + + + + + + + + + +
+
+

All files / src/lib find-own-home.mjs

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 25/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +795x +5x +5x +  +314x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +19x +3x +  +  +  +  +  +16x +16x +10x +10x +1x +  +  +  +  +6x +  +  +  +16x +7x +  +7x +6x +  +5x +5x +5x +1x +  +  +  +1x +  +  +  +3x +  +  +  +13x +5x +  +  + 
import { existsSync } from 'node:fs'
+import * as fs from 'node:fs/promises'
+import * as fsPath from 'node:path'
+ 
+import findRoot from 'find-root'
+ 
+/**
+ * Finds the package root directory of the currently running server executable.
+ *
+ * This function is used to locate where core plugins should be loaded from. It handles both
+ * regular executable paths and symlinked executables (e.g., when installed globally or via npm link).
+ *
+ * The function attempts two strategies:
+ * 1. First, tries to find the package root directly from the executable path using `findRoot()`
+ * 2. If that fails, resolves any symlinks using `fs.realpath()` and tries again
+ *
+ * @param {string} executablePath - The path to the executable (typically `process.argv[1]`)
+ * @returns {Promise<string>} The absolute path to the server package root directory
+ * @throws {Error} If executablePath is undefined, null, or empty
+ * @throws {Error} If package.json cannot be found in any parent directory
+ * @throws {Error} If the resolved package root doesn't contain a package.json file
+ *
+ * @example
+ * // Direct executable path
+ * const root = await findOwnHome('/usr/local/lib/node_modules/my-server/dist/server.js')
+ * // Returns: '/usr/local/lib/node_modules/my-server'
+ *
+ * @example
+ * // Symlinked executable (e.g., via npm link or global install)
+ * const root = await findOwnHome('/usr/local/bin/my-server')
+ * // Resolves symlink, then returns: '/home/user/projects/my-server'
+ */
+const findOwnHome = async(executablePath) => {
+  if (!executablePath) {
+    throw new Error('Cannot determine server package root: executablePath is undefined, null, or empty')
+  }
+ 
+  let serverPackageRoot
+ 
+  // First attempt: try to find root from the executable path directly
+  try {
+    serverPackageRoot = findRoot(executablePath)
+    const serverPackageJsonPath = fsPath.join(serverPackageRoot, 'package.json')
+    if (!existsSync(serverPackageJsonPath)) {
+      serverPackageRoot = null // Force fallback to symlink resolution
+    }
+  }
+  catch (error) {
+    // findRoot failed, will try symlink resolution
+    serverPackageRoot = null
+  }
+ 
+  // Second attempt: if the executable is a symlink, resolve it and try again
+  if (!serverPackageRoot) {
+    try {
+      // Resolve symlinks recursively using fs.realpath
+      const realPath = await fs.realpath(executablePath)
+      if (realPath !== executablePath) {
+        // It was a symlink, try finding root from the real path
+        serverPackageRoot = findRoot(realPath)
+        const serverPackageJsonPath = fsPath.join(serverPackageRoot, 'package.json')
+        if (!existsSync(serverPackageJsonPath)) {
+          throw new Error(`Package root found at '${serverPackageRoot}' but package.json does not exist`)
+        }
+      }
+      else { // it's not a symlink but we already looked for the package root based on the literal path
+        throw new Error(`Package root could not be resolved from '${executablePath}' directly or as a symlink`)
+      }
+    }
+    catch (error) {
+      throw new Error(`Could not determine server package root from '${executablePath}': ${error.message}`)
+    }
+  }
+ 
+  return serverPackageRoot
+}
+ 
+export { findOwnHome }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/get-server-settings.mjs.html b/qa/coverage/src/lib/get-server-settings.mjs.html new file mode 100644 index 00000000..4ca5a8f5 --- /dev/null +++ b/qa/coverage/src/lib/get-server-settings.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/lib/get-server-settings.mjs + + + + + + + + + +
+
+

All files / src/lib get-server-settings.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +234x +4x +  +116x +  +4x +  +  +14x +14x +7x +  +  +7x +  +7x +  +7x +  +4x +  +  + 
import { existsSync } from 'node:fs'
+import * as fsPath from 'node:path'
+ 
+import { readFJSON, writeFJSON } from '@liquid-labs/federated-json'
+ 
+const getServerSettings = (serverConfigRoot) => {
+  // TODO: this causes a race condition; should instead just try to read with federated JSON and ignore 'file not
+  // found' exceptions
+  const serverSettingsPath = fsPath.join(serverConfigRoot, 'server-settings.yaml')
+  if (existsSync(serverSettingsPath)) {
+    return readFJSON(serverSettingsPath) || {}
+  }
+  else {
+    const serverSettings = {}
+ 
+    writeFJSON({ file : serverSettingsPath, data : serverSettings })
+ 
+    return serverSettings
+  }
+}
+ 
+export { getServerSettings }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/index.html b/qa/coverage/src/lib/index.html new file mode 100644 index 00000000..589e0327 --- /dev/null +++ b/qa/coverage/src/lib/index.html @@ -0,0 +1,251 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 77.41% + Statements + 264/341 +
+ + +
+ 64.55% + Branches + 122/189 +
+ + +
+ 64.44% + Functions + 29/45 +
+ + +
+ 79.55% + Lines + 253/318 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
configurables.js +
+
66.66%2/3100%0/00%0/1100%1/1
find-own-home.mjs +
+
100%26/26100%12/12100%2/2100%25/25
get-server-settings.mjs +
+
100%12/1290%9/10100%2/2100%11/11
json-helpers.mjs +
+
0%0/170%0/90%0/30%0/15
load-plugins.js +
+
93.67%74/7981.66%49/60100%9/994.73%72/76
path-resolvers.js +
+
0%0/4100%0/00%0/20%0/3
path-to-re.mjs +
+
94.11%16/1780%4/5100%1/194.11%16/17
path-var-registry.mjs +
+
91.66%11/120%0/1100%3/391.66%11/12
register-handlers.js +
+
73.2%112/15353.57%45/8460%9/1575.35%107/142
reporter.js +
+
61.11%11/1837.5%3/842.85%3/762.5%10/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/json-helpers.mjs.html b/qa/coverage/src/lib/json-helpers.mjs.html new file mode 100644 index 00000000..11339c7b --- /dev/null +++ b/qa/coverage/src/lib/json-helpers.mjs.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/lib/json-helpers.mjs + + + + + + + + + +
+
+

All files / src/lib json-helpers.mjs

+
+ +
+ 0% + Statements + 0/17 +
+ + +
+ 0% + Branches + 0/9 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as fs from 'node:fs'
+import * as fsPath from 'node:path'I
+ 
+const readPackageJSON = (basePath) => {
+  const packageJSONPath = fsPath.join(basePath, 'package.json')
+  return safeJSONParse(packageJSONPath)
+}
+ 
+const safeJSONParse = (path) => {
+  Iif (!fs.existsSync(path)) return null
+ 
+  const bits = fs.readFileSync(path)
+  try {
+    return JSON.parse(bits)
+  }
+  catch (e) {
+    if (e instanceof SyntaxError) {
+      throw new SyntaxError(`${e.message} while processing ${path}`, { cause : e })
+    }
+    else {
+      throw e
+    }
+  }
+}
+ 
+export { readPackageJSON, safeJSONParse }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/load-plugins.js.html b/qa/coverage/src/lib/load-plugins.js.html new file mode 100644 index 00000000..e915aab9 --- /dev/null +++ b/qa/coverage/src/lib/load-plugins.js.html @@ -0,0 +1,574 @@ + + + + + + Code coverage report for src/lib/load-plugins.js + + + + + + + + + +
+
+

All files / src/lib load-plugins.js

+
+ +
+ 93.67% + Statements + 74/79 +
+ + +
+ 81.66% + Branches + 49/60 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 94.73% + Lines + 72/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +1644x +4x +4x +  +138x +  +  +  +  +4x +3x +  +  +3x +9x +3x +  +  +  +3x +3x +3x +  +  +  +3x +3x +3x +  +  +3x +  +  +  +  +  +  +  +  +  +4x +14x +14x +14x +  +14x +7x +  +14x +7x +7x +  +14x +7x +7x +  +  +7x +7x +  +  +  +  +  +  +  +  +  +4x +3x +3x +3x +  +3x +878x +  +  +3x +2x +  +3x +2x +2x +  +3x +1x +1x +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +14x +  +  +14x +3x +3x +  +3x +  +  +  +3x +1x +  +  +1x +  +  +  +  +1x +1x +  +  +  +  +14x +14x +  +  +14x +14x +4x +2x +2x +  +2x +  +  +  +14x +2x +  +  +14x +  +  +  +14x +2x +2x +  +4x +  +  + 
import { existsSync } from 'node:fs'
+import findPlugins from 'find-plugins'
+import * as path from 'path'
+ 
+import { registerHandlers } from './register-handlers'
+ 
+/**
+ * Loads a single plugin.
+ */
+const loadPlugin = async({ app, cache, reporter, registerPathVar, dir, pkg }) => {
+  const { main, name: npmName, description, version } = pkg
+  // Since we pull the 'summary' from the package.json description, there may be unecessary context which is clear when
+  // asking 'describe this plugin'. So, we look for this specific phrase and remove it.
+  const summary = description?.replace(/ +(?:for|in) a @liquid-labs\/pluggable-express server/, '')
+  const { handlers, setup } = await import(`${dir}/${main}`) || {}
+  Iif (handlers === undefined && setup === undefined) {
+    throw new Error(`Plugin from '${npmName}' does not export 'handlers' or 'setup'; bailing out.`)
+  }
+ 
+  Iif (setup !== undefined) reporter.log(`Running setup for ${npmName}@${version} plugin...`)
+  let setupData = setup?.({ app, cache, reporter, registerPathVar, serverConfigRoot : app.ext.serverConfigRoot })
+  Iif (setupData?.then !== undefined) {
+    setupData = await setupData
+  }
+ 
+  app.ext.pendingHandlers.push(() => {
+    if (handlers !== undefined) {
+      registerHandlers(app, { npmName, handlers, reporter, setupData, cache })
+    }
+ 
+    app.ext.handlerPlugins.push({ summary, npmName, version })
+  })
+}
+ 
+/**
+ * Discovers plugins by scanning dependencies for the 'pluggable-endpoints' keyword
+ * @param {string} searchPath - Directory to search for package.json and node_modules
+ * @param {Object} reporter - Reporter for logging
+ * @returns {Promise<Array>} Array of plugin objects with {dir, pkg} structure
+ */
+const discoverPluginsByKeyword = async(searchPath, reporter) => {
+  const packageJsonPath = path.join(searchPath, 'package.json')
+  const nodeModulesPath = path.join(searchPath, 'node_modules')
+  const findOptions = { keyword : 'pluggable-endpoints' }
+ 
+  if (existsSync(packageJsonPath)) {
+    findOptions.pkg = packageJsonPath
+  }
+  if (existsSync(nodeModulesPath)) {
+    findOptions.dir = nodeModulesPath
+    findOptions.scanAllDirs = true
+  }
+  if (findOptions.pkg === undefined && findOptions.dir === undefined) {
+    reporter?.warn(`Did not find package.json found at ${packageJsonPath} nor node_modules at ${nodeModulesPath}`)
+    return []
+  }
+ 
+  const results = await findPlugins(findOptions)
+  return results
+}
+ 
+/**
+ * Discovers explicit plugins by name, regardless of keyword
+ * @param {string} searchPath - Directory to search for package.json and node_modules
+ * @param {Array<string>} explicitPlugins - Array of package names to load
+ * @param {Object} reporter - Reporter for logging
+ * @returns {Promise<Array>} Array of plugin objects with {dir, pkg} structure
+ */
+const discoverExplicitPlugins = async(searchPath, explicitPlugins, reporter) => {
+  const packageJsonPath = path.join(searchPath, 'package.json')
+  const nodeModulesPath = path.join(searchPath, 'node_modules')
+  const explicitPluginSet = new Set(explicitPlugins)
+ 
+  const findOptions = {
+    filter : (pluginSummary) => explicitPluginSet.has(pluginSummary.pkg?.name)
+  }
+ 
+  if (existsSync(packageJsonPath)) {
+    findOptions.pkg = packageJsonPath
+  }
+  if (existsSync(nodeModulesPath)) {
+    findOptions.dir = nodeModulesPath
+    findOptions.scanAllDirs = true
+  }
+  if (findOptions.pkg === undefined && findOptions.dir === undefined) {
+    reporter?.warn(`Did not find package.json found at ${packageJsonPath} nor node_modules at ${nodeModulesPath}`)
+    return []
+  }
+ 
+  const results = await findPlugins(findOptions)
+  return results
+}
+ 
+/**
+ * Given an app, cache, reporter, and optional plugin path, loads plugins.
+ * If dynamicPluginInstallDir is provided, searches there. Otherwise searches in the current working directory.
+ * @param {Object} app - Express app instance
+ * @param {Object} options - Loading options
+ * @param {Object} options.cache - Cache instance
+ * @param {Object} options.reporter - Reporter for logging
+ * @param {Function} options.registerPathVar - Function to register path variables
+ * @param {string} options.searchPath - Directory to search for plugins
+ * @param {Array<string>} options.explicitPlugins - Optional array of package names to explicitly load
+ * @param {Set<string>} options.loadedPluginNames - Optional Set to track loaded plugins across multiple calls
+ * @returns {Promise<void>}
+ */
+const loadPlugins = async(app, { cache, reporter, registerPathVar, searchPath, explicitPlugins, loadedPluginNames }) => {
+  // Use provided Set or create a new one for this call
+  const pluginNames = loadedPluginNames || new Set()
+ 
+  // First, load explicit plugins if specified
+  if (explicitPlugins?.length > 0) {
+    reporter.log(`Searching for ${explicitPlugins.length} explicitly specified plugins (in ${searchPath})...`)
+    const explicitResults = await discoverExplicitPlugins(searchPath, explicitPlugins, reporter)
+ 
+    reporter.log(explicitResults.length === 0
+      ? 'No explicit plugins found.'
+      : `Found ${explicitResults.length} explicit plugins.`)
+ 
+    for (const plugin of explicitResults) {
+      const pluginName = plugin.pkg.name
+ 
+      // Check for duplicates and warn
+      Iif (pluginNames.has(pluginName)) {
+        reporter.log(`Warning: Plugin '${pluginName}' was already loaded from another source, skipping duplicate from '${searchPath}'`)
+        continue
+      }
+ 
+      await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin })
+      pluginNames.add(pluginName)
+    }
+  }
+ 
+  // Then discover and load keyword-based plugins
+  reporter.log(`Searching for handler plugins with 'pluggable-endpoints' keyword (in ${searchPath})...`)
+  const keywordPlugins = await discoverPluginsByKeyword(searchPath, reporter)
+ 
+  // Filter out already-loaded plugins to avoid duplicates
+  const duplicates = []
+  const newPlugins = keywordPlugins.filter(p => {
+    if (pluginNames.has(p.pkg.name)) {
+      duplicates.push(p.pkg.name)
+      return false
+    }
+    return true
+  })
+ 
+  // Warn about duplicates
+  if (duplicates.length > 0) {
+    reporter.log(`Warning: Found ${duplicates.length} plugin(s) already loaded from another source, skipping: ${duplicates.join(', ')}`)
+  }
+ 
+  reporter.log(newPlugins.length === 0
+    ? 'No additional keyword-based plugins found.'
+    : `Found ${newPlugins.length} keyword-based plugins.`)
+ 
+  for (const plugin of newPlugins) {
+    await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin })
+    pluginNames.add(plugin.pkg.name)
+  }
+}
+ 
+export { loadPlugins }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/path-resolvers.js.html b/qa/coverage/src/lib/path-resolvers.js.html new file mode 100644 index 00000000..d7148806 --- /dev/null +++ b/qa/coverage/src/lib/path-resolvers.js.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/path-resolvers.js + + + + + + + + + +
+
+

All files / src/lib path-resolvers.js

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +  +  +  +  +  +  +  + 
const serverPluginName = {
+  bitReString    : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)',
+  optionsFetcher : ({ app }) => {
+    return app.ext.handlerPlugins.map(({ npmName }) => npmName)
+  }
+}
+ 
+const commonPathResolvers = { serverPluginName }
+ 
+export { commonPathResolvers }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/path-to-re.mjs.html b/qa/coverage/src/lib/path-to-re.mjs.html new file mode 100644 index 00000000..aab0e27b --- /dev/null +++ b/qa/coverage/src/lib/path-to-re.mjs.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/lib/path-to-re.mjs + + + + + + + + + +
+
+

All files / src/lib path-to-re.mjs

+
+ +
+ 94.11% + Statements + 16/17 +
+ + +
+ 80% + Branches + 4/5 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 94.11% + Lines + 16/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38  +  +  +  +  +  +  +4x +175x +  +175x +539x +21x +21x +  +21x +  +  +  +21x +21x +  +518x +28x +28x +  +  +490x +  +  +  +175x +  +175x +4x +  +  + 
/**
+ * Converts a path array to a RegExp for route matching.
+ *
+ * @param {Array<string>} pathArr - Array of path segments, may include :vars and optional? segments
+ * @param {Function} getVarDef - Function to look up variable definitions by name
+ * @returns {RegExp} Regular expression for matching the path
+ */
+const pathToRe = (pathArr, getVarDef) => {
+  let reString = '^'
+ 
+  for (const pathBit of pathArr) {
+    if (pathBit.startsWith(':')) {
+      const pathVar = pathBit.slice(1)
+      const varDef = getVarDef(pathVar)
+ 
+      Iif (varDef === undefined) {
+        throw new Error(`Unknown variable path element type '${pathVar}' while processing path ${pathArr.join('/')}.`)
+      }
+ 
+      const { validationRe } = varDef
+      reString += `/(?<${pathVar}>${validationRe})`
+    }
+    else if (pathBit.endsWith('?')) {
+      const cleanBit = pathBit.slice(0, -1)
+      reString += `(?:/${cleanBit})?`
+    }
+    else {
+      reString += '/' + pathBit
+    }
+  }
+ 
+  reString += '[/#?]?$'
+ 
+  return new RegExp(reString)
+}
+ 
+export { pathToRe }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/path-var-registry.mjs.html b/qa/coverage/src/lib/path-var-registry.mjs.html new file mode 100644 index 00000000..ff5d549e --- /dev/null +++ b/qa/coverage/src/lib/path-var-registry.mjs.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/lib/path-var-registry.mjs + + + + + + + + + +
+
+

All files / src/lib path-var-registry.mjs

+
+ +
+ 91.66% + Statements + 11/12 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 91.66% + Lines + 11/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +4x +7x +  +  +4x +  +  +  +  +  +4x +14x +  +  +  +14x +  +  +4x +  +  +  +  +4x +25x +4x +  +  + 
/**
+ * Registry for path variable definitions.
+ * Path vars are used in handler paths (e.g., :serverPluginName) and need validation patterns.
+ *
+ * varDef structure:
+ * {
+ *   validationRe: string - Regular expression pattern to match the variable value
+ *   optionsFetcher: function - Optional function that returns available options for this var
+ * }
+ */
+ 
+// Module-level registry
+let registry = {}
+ 
+/**
+ * Clears the entire registry. Called at the start of appInit.
+ */
+const clearRegistry = () => {
+  registry = {}
+}
+ 
+/**
+ * Registers a path variable definition.
+ * @param {string} varName - Name of the variable (without leading colon)
+ * @param {Object} varDef - Definition object with { validationRe, optionsFetcher }
+ * @throws {Error} If varName is already registered
+ */
+const registerPathVar = (varName, varDef) => {
+  Iif (registry[varName] !== undefined) {
+    throw new Error(`Path variable '${varName}' is already registered.`)
+  }
+ 
+  registry[varName] = varDef
+}
+ 
+/**
+ * Retrieves a path variable definition.
+ * @param {string} varName - Name of the variable (without leading colon)
+ * @returns {Object|undefined} The varDef object, or undefined if not found
+ */
+const getVarDef = (varName) => {
+  return registry[varName]
+}
+ 
+export { clearRegistry, registerPathVar, getVarDef }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/register-handlers.js.html b/qa/coverage/src/lib/register-handlers.js.html new file mode 100644 index 00000000..0f7c6678 --- /dev/null +++ b/qa/coverage/src/lib/register-handlers.js.html @@ -0,0 +1,976 @@ + + + + + + Code coverage report for src/lib/register-handlers.js + + + + + + + + + +
+
+

All files / src/lib register-handlers.js

+
+ +
+ 73.2% + Statements + 112/153 +
+ + +
+ 53.57% + Branches + 45/84 +
+ + +
+ 60% + Functions + 9/15 +
+ + +
+ 75.35% + Lines + 107/142 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +2984x +4x +4x +  +4x +4x +4x +4x +  +4x +  +4x +4x +4x +4x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +178x +53x +  +  +  +  +53x +  +  +  +53x +50x +50x +100x +  +  +  +  +  +50x +  +53x +  +  +53x +  +  +53x +  +  +53x +53x +53x +  +  +  +  +53x +46x +46x +  +46x +  +46x +  +  +  +  +  +  +  +  +  +46x +  +  +  +46x +  +  +  +  +46x +  +  +53x +  +  +4x +175x +  +  +175x +539x +21x +  +518x +28x +28x +  +  +490x +  +  +  +  +175x +  +  +175x +175x +539x +245x +  +539x +  +  +175x +  +  +  +  +  +175x +  +175x +  +  +  +  +  +175x +  +4x +10x +94x +94x +  +94x +  +  +  +  +  +94x +  +  +94x +  +  +  +94x +  +  +94x +  +94x +94x +3x +  +  +94x +  +  +  +  +94x +  +94x +  +  +  +94x +  +  +  +  +  +  +94x +3x +3x +  +  +94x +44x +  +  +44x +  +  +  +44x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +44x +32x +32x +  +32x +  +  +  +  +94x +47x +20x +  +  +20x +  +  +20x +20x +  +  +  +  +94x +94x +94x +  +  +94x +  +  +  +  +  +  +  +  +  +94x +94x +94x +  +94x +84x +  +  +  +84x +84x +  +  +  +308x +  +84x +84x +84x +  +  +  +84x +  +  +  +  +  +  +  +84x +84x +  +  +  +4x +  +  +  +  + 
import createError from 'http-errors'
+import omit from 'lodash.omit'
+import { pathToRegexp } from 'path-to-regexp'
+ 
+import { commonOutputParams } from '@liquid-labs/liq-handlers-lib'
+import { sendHelp } from '../handlers/help/lib/send-help'
+import { getVarDef, registerPathVar } from './path-var-registry'
+import { pathToRe } from './path-to-re'
+ 
+const helpParameters = commonOutputParams()
+ 
+const falseParams = /n(o)?|f(alse)?|0/i
+const pathParamRegExp = /:[a-zA-Z0-9_]+/g
+const regexParamRegExp = /\?<[a-zA-Z0-9_]+>/g
+const trueParams = /y(es)?|t(rue)?|1/i
+ 
+const processBool = (value, name) => {
+  if (value.match(trueParams)) {
+    return true
+  }
+  else if (value.match(falseParams)) {
+    return false
+  }
+  else {
+    throw new Error(`Could not parse parameter '${name}' value '${value}' as boolean.`)
+  }
+}
+ 
+/**
+* Combine and verify parameters. Verified parameters collected on `req.vars`
+*/
+const processParams = ({ parameters = [], path }) => (req, res, next) => {
+  const vars = {} // this is where we will collect the combined path, body, and query parameters
+ 
+  // pull variables out of the path; path vars come in as positional, but in an object, like:
+  // { 0: 'path-value' }
+  // first, we decode the values
+  for (const k in Object.keys(req.params)) { // eslint-disable-line guard-for-in
+    vars[k] = decodeURIComponent(req.params[k])
+  }
+  // Now we map the values to their names by processing the path spec.
+  if (Array.isArray(path)) { // expects nested paths to be rolled out, so we're dealing with a flat path spec array
+    const mapArr = []
+    for (const pathBit of path) {
+      Iif (pathBit.startsWith(':')) {
+        const name = pathBit.slice(1)
+        mapArr.push(name)
+      }
+    }
+ 
+    mapArr.forEach((n, i, arr) => { vars[n] = vars[i] })
+  }
+  req.vars = vars
+ 
+  // Now we map the body or query parameters to vars
+  const source = req.method === 'POST'
+    ? req.body
+    : req.query
+  Iif (source === undefined) return true
+ 
+  // checks for unknown parameters and complain
+  const validParams = parameters && parameters.map(p => p.name)
+  const remainder = Object.keys(omit(source, validParams))
+  Iif (remainder.length > 0) {
+    throw new Error(`Unknown query parameters: ${remainder.join(', ')} while accessing ${req.path}.`)
+  }
+ 
+  // now process flagged variables
+  for (const p of parameters) {
+    let value = source[p.name]
+    Iif (value === undefined) continue
+ 
+    Iif (p.matcher !== undefined && !value.match(p.matcher)) { throw createError.BadRequest(`Parameter ${p.name} value '${value}' does not match ${p.matcher}.`) }
+ 
+    Iif (p.isMultivalue === true) {
+      // if we have a multivalue but only one instance, it will come in as a single value, we want to convert that to
+      // a single value array
+      Iif (!Array.isArray(value)) {
+        value = [value]
+      }
+      value = p.isBoolean === true
+        ? value.map((v) => processBool(v, p.name))
+        : value.map((v) => decodeURIComponent(v))
+    }
+    else Iif (Array.isArray(value)) {
+      throw new Error(`Non-multivalue parameter '${p.name}' cannot be specified more than once.`)
+    }
+    else { // single value var
+      value = p.isBoolean === true
+        ? processBool(value, p.name)
+        : decodeURIComponent(value)
+    }
+ 
+    vars[p.name] = value
+  }
+ 
+  next()
+}
+ 
+const processCommandPath = ({ app, model, pathArr, parameters }) => {
+  const commandPath = []
+ 
+  // Build command path array for commandPaths tree
+  for (const pathBit of pathArr) {
+    if (pathBit.startsWith(':')) {
+      commandPath.push(pathBit) // with leading ':'
+    }
+    else if (pathBit.endsWith('?')) {
+      const cleanBit = pathBit.slice(0, -1)
+      commandPath.push(cleanBit)
+    }
+    else {
+      commandPath.push(pathBit)
+    }
+  }
+ 
+  // Build the regex using the extracted pathToRe function
+  const pathRe = pathToRe(pathArr, getVarDef)
+ 
+  // Update commandPaths tree
+  let frontier = app.ext.commandPaths
+  for (const pathBit of commandPath) {
+    if (!(pathBit in frontier)) {
+      frontier[pathBit] = {}
+    }
+    frontier = frontier[pathBit]
+  }
+ 
+  Iif (frontier._parameters !== undefined) {
+    throw new Error(`Non-unique command path: ${commandPath.join('/')}`)
+  }
+ 
+  // 'parameters' are deep frozen, so safe to share. We use a function here to future proof in case we need to
+  // unfreeze and then maybe make copies here to prevent clients from changing the shared parameters data.
+  frontier._parameters = () => parameters
+ 
+  return pathRe
+}
+ 
+// express barfs if there are named capture groups in the path RE. However, we really want to use named capture groups
+// so we define our paths with them (for future use) and remove them here. The 'slice' removes the leading and trailing
+// '/'
+const cleanReForExpress = (pathRe) => new RegExp(pathRe.toString().replaceAll(regexParamRegExp, '').slice(1, -1))
+ 
+const registerHandlers = (app, { npmName, handlers, model, reporter, setupData, cache }) => {
+  for (const handler of handlers) {
+    const { func, help, method, parameters, path: aPath } = handler
+    const paths = handler.paths || [aPath] // we can now use regularized 'paths'
+ 
+    Iif (app.ext.noRegistries === true
+          && paths.some((p) => p[0] === 'server' && p[1] === 'plugins' && p[2] === 'registries')) {
+      // then it's a registry endpoint, but we're not using registries so we skip it
+      continue
+    }
+ 
+    Iif ((aPath === undefined && handler.paths === undefined) || method === undefined || func === undefined) {
+      throw new Error(`A handler from '${npmName}' does not fully define 'method', 'path', and/or 'func' exports.`)
+    }
+    Iif (aPath !== undefined && handler.paths !== undefined) {
+      throw new Error(`A handler from '${npmName}' specifies both 'path' and 'paths'; specify one or the other.`)
+    }
+ 
+    const methodUpper = method.toUpperCase()
+ 
+    // this must come before processCommandPath to give the function the option of registering variable name parameters
+    const handlerFunc = func({ parameters, app, cache, model, reporter, registerPathVar, setupData })
+ 
+    for (const path of paths) {
+      if (!Array.isArray(path)) {
+        reporter.warn(`Handler is using old style path: '${path}'. Should be converted to array style.`)
+      }
+ 
+      const routablePath = typeof path === 'string'
+        ? path
+        : Array.isArray(path)
+          ? cleanReForExpress(processCommandPath({ app, model, pathArr : path, parameters }))
+          : cleanReForExpress(path) // then it's a regular expression
+      reporter.log(`registering handler for path: ${methodUpper}:${routablePath}`)
+ 
+      app[method.toLowerCase()](routablePath,
+        processParams({ parameters, path }),
+        handlerFunc)
+      // for or own informational purposes
+      const endpointDef = Object.assign({
+        npmName,
+        routablePath : routablePath.toString()
+      },
+      handler
+      )
+ 
+      if (!parameters) {
+        reporter.warn(`Endpoint '${method}:${path}' does not define 'parameters'. An explicit '[]' value should be defined where there are no parameters.`)
+        endpointDef.parameters = []
+      }
+ 
+      if (!Object.isFrozen(parameters)) { // use parameters as a proxy instead of testing each param seperately
+        let i = 0
+        // TODO: see regex path note at top
+        // Build out any missing path parameters.
+        const pathParams = typeof path === 'string'
+          ? path.match(pathParamRegExp)
+          : path.toString().match(regexParamRegExp)
+ 
+        for (const pathParam of pathParams || []) {
+          const paramName = pathParam.startsWith(':')
+            ? pathParam.substring(1)
+            : pathParam.slice(2, -1)
+          let paramDef = endpointDef.parameters.find((p) => p.name === paramName)
+          Iif (paramDef === undefined) {
+            paramDef = { name : paramName }
+            endpointDef.parameters.push(paramDef) // TODO: I assume pushing and sorting more is quicker than unshift and sorting less
+          }
+          paramDef.required = true
+          paramDef.inPath = true
+          paramDef.position = i
+          paramDef.isSingleValue = true
+          i += 1
+        }
+ 
+        for (const paramDef of endpointDef.parameters) {
+          if (paramDef.inPath === undefined && paramDef.inQuery === undefined) {
+            paramDef.inQuery = true
+          }
+          Object.freeze(paramDef) // the paramDef is fully specified and shouldn't be changed here on out
+        }
+      }
+ 
+      // sort path parameters first
+      if (!Object.isFrozen(endpointDef.parameters)) { // This can happen while testing or reloading
+        endpointDef.parameters.sort((a, b) => {
+          Iif (a.inPath === true && b.inQuery === true) {
+            return -1
+          }
+          else Iif (b.inPath === true && a.inQuery === true) {
+            return 1
+          }
+          else Iif (a.inPath) /* sort by position */ return a.position > b.position ? 1 : -1 // position is never equal
+          else /* query param; sort by name */ return a.name.localeCompare(b.name)
+        })
+      }
+ 
+      // a little cleanup and annotation
+      endpointDef.method = methodUpper
+      delete endpointDef.func
+      try {
+        // endpointDef.matcher = '^\/' + endpointDef.path.replace(pathParamRegExp, '[^/]+') + '[/#?]?$'
+        // TODO: see regex path note at top
+        endpointDef.matcher = typeof routablePath === 'string'
+          ? pathToRegexp(routablePath).toString().slice(1, -2)
+          : routablePath.toString().slice(1, -1)
+      }
+      catch (e) {
+        reporter.error(`Exception while attempting to process path '${path}'. Perhaps there are special characters that need escaping; try '([*])' where '*' is your special character. Error message: ${e.message}`)
+        throw e
+      }
+ 
+      // lockdown our internal setup
+      Object.freeze(endpointDef)
+      Object.freeze(parameters)
+      app.ext.handlers.push(endpointDef)
+ 
+      if (help !== undefined) {
+        Iif (!Array.isArray(path)) {
+          throw new Error(`Endpoint '${path}' (from ${npmName}) defines help and must use an array style path.`)
+        }
+ 
+        const helpPathTemplate = [...path]
+        helpPathTemplate.unshift('help')
+        // const helpPostfix = [...path]
+        // helpPostfix.push('help')
+ 
+        const helpPath = helpPathTemplate.map((b) => b.startsWith(':') ? '-' + b.slice(1) + '-' : b)
+        const routableHelpPath =
+          cleanReForExpress(processCommandPath({ app, model, pathArr : helpPath, parameters : helpParameters }))
+        const helpFunc = sendHelp({ help, method, path, parameters }) // from the main endpoint
+        app.get(routableHelpPath,
+          processParams({ parameters : helpParameters, path : helpPath }),
+          helpFunc({ model, reporter }))
+ 
+        const helpEndpointDef = {
+          method        : 'GET',
+          parameters    : helpParameters,
+          path          : helpPathTemplate,
+          routabblePath : routableHelpPath.toString(),
+          npmName,
+          matcher       : routableHelpPath.toString().slice(1, -1)
+        }
+        Object.freeze(helpEndpointDef)
+        app.ext.handlers.push(helpEndpointDef)
+      } // load help 'if (help !== undefined)'
+    } // for (const path of paths || [ aPath ]) {...}
+  } // for (const handler of handlers) {...}
+}
+ 
+export {
+  registerHandlers
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/lib/reporter.js.html b/qa/coverage/src/lib/reporter.js.html new file mode 100644 index 00000000..93765aca --- /dev/null +++ b/qa/coverage/src/lib/reporter.js.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for src/lib/reporter.js + + + + + + + + + +
+
+

All files / src/lib reporter.js

+
+ +
+ 61.11% + Statements + 11/18 +
+ + +
+ 37.5% + Branches + 3/8 +
+ + +
+ 42.85% + Functions + 3/7 +
+ + +
+ 62.5% + Lines + 10/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51  +  +4x +  +  +  +  +  +  +  +  +4x +  +  +  +16x +8x +8x +  +8x +  +8x +48x +65x +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// import clc from 'chalk'
+ 
+const outputMethodNames = [
+  'debug',
+  'error',
+  'info',
+  'log',
+  'table',
+  'warn'
+]
+ 
+const Reporter = class {
+  #configuration
+  #taskReport
+ 
+  constructor({ _taskReport, ...configOptions } = {}) {
+    this.#configuration = { silent : false }
+    this.configure(configOptions)
+ 
+    this.#taskReport = [...(_taskReport || [])]
+ 
+    for (const methodName of outputMethodNames) {
+      this[methodName] = (...msgs) => {
+        if (this.#configuration.silent) return
+        // else, not silent
+        // TODO: color error and warning? Add 'noColor' option
+        console[methodName](...msgs)
+      }
+    }
+  }
+ 
+  configure(options = {}) {
+    this.#configuration = Object.assign(this.#configuration, options)
+  }
+ 
+  isolate() {
+    return new Reporter(Object.assign({}, this.#configuration, { _taskReport : this.#taskReport }))
+  }
+ 
+  push(msg, { noLog = false } = {}) {
+    this.#taskReport.push(msg)
+    Iif (noLog !== true) this.log(msg)
+  }
+ 
+  get taskReport() { return [...this.#taskReport] }
+ 
+  reset() { this.#taskReport = [] }
+}
+ 
+export { Reporter }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/coverage/src/server.mjs.html b/qa/coverage/src/server.mjs.html new file mode 100644 index 00000000..ae34a9fb --- /dev/null +++ b/qa/coverage/src/server.mjs.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/server.mjs + + + + + + + + + +
+
+

All files / src server.mjs

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Reporter } from './lib/reporter'
+ 
+const startServer = async({
+  appInit, // the init function
+  name,
+  reporter, // customized reporter
+  // the rest are app options
+  port
+}) => {
+  reporter = reporter || new Reporter()
+ 
+  Iif (!port) {
+    throw new Error("No 'port' provided; bailing out.")
+  }
+ 
+  const { app, cache } = await appInit({ reporter })
+ 
+  const server = app.listen(port, (err) => {
+    Iif (err) {
+      reporter.error(`Error while starting ${name} server.\n${err}`)
+      return
+    } // else good to go!
+ 
+    reporter.log(`Server listening on ${port}`)
+    reporter.log('Press Ctrl+C to quit.')
+  })
+ 
+  // support clean shutdown via sigterm
+  process.on('SIGTERM', () => {
+    server.close(() => {
+      cache.release()
+      reporter.log('Server shut down.')
+    })
+ 
+    // see https://github.com/liquid-labs/pluggable-express/issues/211
+    process.exit()
+  })
+ 
+  return server
+}
+ 
+export { startServer }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/qa/lint.txt b/qa/lint.txt new file mode 100644 index 00000000..b148801c --- /dev/null +++ b/qa/lint.txt @@ -0,0 +1 @@ +Test git rev: 137aaa8e7506637a1915e6fa5e3edffbcddbbcdf diff --git a/qa/unit-test.txt b/qa/unit-test.txt new file mode 100644 index 00000000..71d4ec7a --- /dev/null +++ b/qa/unit-test.txt @@ -0,0 +1,75 @@ +Test git rev: 137aaa8e7506637a1915e6fa5e3edffbcddbbcdf +(node:55997) [DEP0170] DeprecationWarning: The URL git+ssh://git@github.com:liquid-labs/regex-repo.git is invalid. Future versions of Node.js will throw an error. +(Use `node --trace-deprecation ...` to show where the warning was created) +PASS test/app.test.js +PASS handlers/server/test/next-commands.test.js +PASS handlers/server/test/version.test.js +PASS handlers/server/test/api.test.js +PASS handlers/server/plugins/_lib/test/install-plugins-errors.test.js +PASS handlers/server/plugins/_lib/test/error-utils.test.js +PASS lib/test/find-own-home.test.js +PASS handlers/server/plugins/_lib/test/install-plugins-data.test.js +PASS handlers/server/plugins/test/details.test.js +PASS handlers/server/plugins/test/add.test.js +PASS handlers/server/plugins/_lib/test/install-plugins-basic.test.js +PASS handlers/server/plugins/_lib/test/install-plugins-keyword.test.js +PASS handlers/server/plugins/test/remove.test.js +PASS handlers/server/plugins/test/list.test.js +PASS handlers/server/_lib/test/options-tokenizer.test.js +----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s +----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- +All files | 68.4 | 54.62 | 57.86 | 69.53 | + src | 48.48 | 32.69 | 14.28 | 49.21 | + app.js | 56.63 | 35.41 | 20 | 57.79 | 53,72,103,109-110,149-167,171-201,209,215-217,223-224,230-239 + server.mjs | 0 | 0 | 0 | 0 | 1-40 + src/handlers | 70 | 100 | 50 | 66.66 | + heartbeat.mjs | 70 | 100 | 50 | 66.66 | 11-13 + src/handlers/help | 100 | 100 | 100 | 100 | + help.mjs | 100 | 100 | 100 | 100 | + src/handlers/help/lib | 23.93 | 0 | 14.28 | 23.14 | + formatter-md.mjs | 12.12 | 0 | 0 | 12.9 | 4-16,20-55 + formatter-terminal.mjs | 11.42 | 0 | 0 | 11.76 | 3-15,20-57 + formatter-text.mjs | 13.33 | 0 | 0 | 13.79 | 5-17,21-51 + print-path.mjs | 50 | 0 | 0 | 100 | 1 + send-help.mjs | 93.33 | 100 | 75 | 92.3 | 15 + src/handlers/server | 75.36 | 64.06 | 84.61 | 78.22 | + api.mjs | 100 | 100 | 100 | 100 | + next-commands.mjs | 73.11 | 61.4 | 100 | 78.57 | 70-86,96-102,161,166 + reload.mjs | 77.77 | 100 | 50 | 75 | 12-14 + stop.mjs | 50 | 0 | 50 | 46.15 | 11-21 + version.js | 100 | 100 | 100 | 100 | + src/handlers/server/_lib | 95.34 | 90 | 100 | 97.22 | + next-options.mjs | 94.44 | 89.09 | 100 | 96.55 | 65,107 + options-tokenizer.mjs | 100 | 100 | 100 | 100 | + src/handlers/server/errors | 39.43 | 0 | 25 | 40.32 | + detail.mjs | 26.08 | 0 | 22.22 | 27.27 | 15-39,43-63,70,75-80 + list.mjs | 64 | 100 | 27.27 | 72.22 | 19,22,27-30 + src/handlers/server/plugins | 85 | 30.76 | 75.75 | 86.4 | + add.mjs | 100 | 100 | 100 | 100 | + details.mjs | 100 | 100 | 100 | 100 | + list.mjs | 63.04 | 7.4 | 50 | 65.78 | 36-50,54,70,87 + remove.mjs | 97.05 | 60 | 100 | 96.66 | 42 + src/handlers/server/plugins/_lib | 86.11 | 89.09 | 78.57 | 86.95 | + add-plugins.mjs | 0 | 0 | 0 | 0 | 2-29 + error-utils.mjs | 100 | 100 | 100 | 100 | + install-plugins.mjs | 100 | 100 | 100 | 100 | + list-plugins.mjs | 66.66 | 0 | 0 | 66.66 | 9 + src/lib | 77.41 | 64.55 | 64.44 | 79.55 | + configurables.js | 66.66 | 100 | 0 | 100 | + find-own-home.mjs | 100 | 100 | 100 | 100 | + get-server-settings.mjs | 100 | 90 | 100 | 100 | 11 + json-helpers.mjs | 0 | 0 | 0 | 0 | 1-24 + load-plugins.js | 93.67 | 81.66 | 100 | 94.73 | 17,23,125-126 + path-resolvers.js | 0 | 100 | 0 | 0 | 1-8 + path-to-re.mjs | 94.11 | 80 | 100 | 94.11 | 17 + path-var-registry.mjs | 91.66 | 0 | 100 | 91.66 | 30 + register-handlers.js | 73.2 | 53.57 | 60 | 75.35 | 18-25,39,46-47,65,78-83,86,130,151-153,157,160,205-217,232,235,253-254,264 + reporter.js | 61.11 | 37.5 | 42.85 | 62.5 | 27,37-47 +----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- + +Test Suites: 15 passed, 15 total +Tests: 173 passed, 173 total +Snapshots: 0 total +Time: 1.627 s, estimated 2 s +Ran all test suites. From 3951a3b3e59bac3ad39d4a25975d7f62d9209cdf Mon Sep 17 00:00:00 2001 From: Zane Rockenbaugh Date: Fri, 31 Oct 2025 12:12:30 -0500 Subject: [PATCH 4/4] removed QA files --- qa/coverage/base.css | 224 ---- qa/coverage/block-navigation.js | 87 -- qa/coverage/clover.xml | 1145 ----------------- qa/coverage/coverage-final.json | 37 - qa/coverage/favicon.png | Bin 445 -> 0 bytes qa/coverage/index.html | 251 ---- qa/coverage/prettify.css | 1 - qa/coverage/prettify.js | 2 - qa/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes qa/coverage/sorter.js | 196 --- qa/coverage/src/app.js.html | 943 -------------- qa/coverage/src/handlers/heartbeat.mjs.html | 136 -- qa/coverage/src/handlers/help/help.mjs.html | 160 --- qa/coverage/src/handlers/help/index.html | 116 -- .../handlers/help/lib/formatter-md.mjs.html | 259 ---- .../help/lib/formatter-terminal.mjs.html | 268 ---- .../handlers/help/lib/formatter-text.mjs.html | 247 ---- qa/coverage/src/handlers/help/lib/index.html | 176 --- .../src/handlers/help/lib/print-path.mjs.html | 94 -- .../src/handlers/help/lib/send-help.mjs.html | 187 --- qa/coverage/src/handlers/index.html | 116 -- .../src/handlers/server/_lib/index.html | 131 -- .../server/_lib/next-options.mjs.html | 538 -------- .../server/_lib/options-tokenizer.mjs.html | 148 --- qa/coverage/src/handlers/server/api.mjs.html | 130 -- .../handlers/server/errors/detail.mjs.html | 337 ----- .../src/handlers/server/errors/index.html | 131 -- .../src/handlers/server/errors/list.mjs.html | 220 ---- qa/coverage/src/handlers/server/index.html | 176 --- .../handlers/server/next-commands.mjs.html | 592 --------- .../server/plugins/_lib/add-plugins.mjs.html | 178 --- .../server/plugins/_lib/error-utils.mjs.html | 418 ------ .../handlers/server/plugins/_lib/index.html | 161 --- .../plugins/_lib/install-plugins.mjs.html | 466 ------- .../server/plugins/_lib/list-plugins.mjs.html | 121 -- .../src/handlers/server/plugins/add.mjs.html | 214 --- .../handlers/server/plugins/details.mjs.html | 208 --- .../src/handlers/server/plugins/index.html | 161 --- .../src/handlers/server/plugins/list.mjs.html | 451 ------- .../handlers/server/plugins/remove.mjs.html | 277 ---- .../src/handlers/server/reload.mjs.html | 136 -- qa/coverage/src/handlers/server/stop.mjs.html | 157 --- .../src/handlers/server/version.js.html | 208 --- qa/coverage/src/index.html | 131 -- qa/coverage/src/lib/configurables.js.html | 103 -- qa/coverage/src/lib/find-own-home.mjs.html | 319 ----- .../src/lib/get-server-settings.mjs.html | 151 --- qa/coverage/src/lib/index.html | 251 ---- qa/coverage/src/lib/json-helpers.mjs.html | 163 --- qa/coverage/src/lib/load-plugins.js.html | 574 --------- qa/coverage/src/lib/path-resolvers.js.html | 115 -- qa/coverage/src/lib/path-to-re.mjs.html | 196 --- .../src/lib/path-var-registry.mjs.html | 220 ---- qa/coverage/src/lib/register-handlers.js.html | 976 -------------- qa/coverage/src/lib/reporter.js.html | 235 ---- qa/coverage/src/server.mjs.html | 211 --- qa/lint.txt | 1 - qa/unit-test.txt | 75 -- 58 files changed, 13925 deletions(-) delete mode 100644 qa/coverage/base.css delete mode 100644 qa/coverage/block-navigation.js delete mode 100644 qa/coverage/clover.xml delete mode 100644 qa/coverage/coverage-final.json delete mode 100644 qa/coverage/favicon.png delete mode 100644 qa/coverage/index.html delete mode 100644 qa/coverage/prettify.css delete mode 100644 qa/coverage/prettify.js delete mode 100644 qa/coverage/sort-arrow-sprite.png delete mode 100644 qa/coverage/sorter.js delete mode 100644 qa/coverage/src/app.js.html delete mode 100644 qa/coverage/src/handlers/heartbeat.mjs.html delete mode 100644 qa/coverage/src/handlers/help/help.mjs.html delete mode 100644 qa/coverage/src/handlers/help/index.html delete mode 100644 qa/coverage/src/handlers/help/lib/formatter-md.mjs.html delete mode 100644 qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html delete mode 100644 qa/coverage/src/handlers/help/lib/formatter-text.mjs.html delete mode 100644 qa/coverage/src/handlers/help/lib/index.html delete mode 100644 qa/coverage/src/handlers/help/lib/print-path.mjs.html delete mode 100644 qa/coverage/src/handlers/help/lib/send-help.mjs.html delete mode 100644 qa/coverage/src/handlers/index.html delete mode 100644 qa/coverage/src/handlers/server/_lib/index.html delete mode 100644 qa/coverage/src/handlers/server/_lib/next-options.mjs.html delete mode 100644 qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html delete mode 100644 qa/coverage/src/handlers/server/api.mjs.html delete mode 100644 qa/coverage/src/handlers/server/errors/detail.mjs.html delete mode 100644 qa/coverage/src/handlers/server/errors/index.html delete mode 100644 qa/coverage/src/handlers/server/errors/list.mjs.html delete mode 100644 qa/coverage/src/handlers/server/index.html delete mode 100644 qa/coverage/src/handlers/server/next-commands.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/_lib/index.html delete mode 100644 qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/add.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/details.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/index.html delete mode 100644 qa/coverage/src/handlers/server/plugins/list.mjs.html delete mode 100644 qa/coverage/src/handlers/server/plugins/remove.mjs.html delete mode 100644 qa/coverage/src/handlers/server/reload.mjs.html delete mode 100644 qa/coverage/src/handlers/server/stop.mjs.html delete mode 100644 qa/coverage/src/handlers/server/version.js.html delete mode 100644 qa/coverage/src/index.html delete mode 100644 qa/coverage/src/lib/configurables.js.html delete mode 100644 qa/coverage/src/lib/find-own-home.mjs.html delete mode 100644 qa/coverage/src/lib/get-server-settings.mjs.html delete mode 100644 qa/coverage/src/lib/index.html delete mode 100644 qa/coverage/src/lib/json-helpers.mjs.html delete mode 100644 qa/coverage/src/lib/load-plugins.js.html delete mode 100644 qa/coverage/src/lib/path-resolvers.js.html delete mode 100644 qa/coverage/src/lib/path-to-re.mjs.html delete mode 100644 qa/coverage/src/lib/path-var-registry.mjs.html delete mode 100644 qa/coverage/src/lib/register-handlers.js.html delete mode 100644 qa/coverage/src/lib/reporter.js.html delete mode 100644 qa/coverage/src/server.mjs.html delete mode 100644 qa/lint.txt delete mode 100644 qa/unit-test.txt diff --git a/qa/coverage/base.css b/qa/coverage/base.css deleted file mode 100644 index f418035b..00000000 --- a/qa/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/qa/coverage/block-navigation.js b/qa/coverage/block-navigation.js deleted file mode 100644 index cc121302..00000000 --- a/qa/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/qa/coverage/clover.xml b/qa/coverage/clover.xml deleted file mode 100644 index 86c56fd1..00000000 --- a/qa/coverage/clover.xml +++ /dev/null @@ -1,1145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/qa/coverage/coverage-final.json b/qa/coverage/coverage-final.json deleted file mode 100644 index a98331c3..00000000 --- a/qa/coverage/coverage-final.json +++ /dev/null @@ -1,37 +0,0 @@ -{"/Users/zane/playground/liquid-labs/pluggable-express/src/app.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"10":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"11":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"12":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"13":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}},"14":{"start":{"line":18,"column":0},"end":{"line":18,"column":41}},"15":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"16":{"start":{"line":20,"column":16},"end":{"line":20,"column":35}},"17":{"start":{"line":21,"column":24},"end":{"line":21,"column":74}},"18":{"start":{"line":22,"column":16},"end":{"line":22,"column":43}},"19":{"start":{"line":23,"column":22},"end":{"line":23,"column":37}},"20":{"start":{"line":43,"column":16},"end":{"line":226,"column":1}},"21":{"start":{"line":44,"column":16},"end":{"line":44,"column":24}},"22":{"start":{"line":56,"column":6},"end":{"line":56,"column":14}},"23":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}},"24":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"25":{"start":{"line":63,"column":28},"end":{"line":63,"column":62}},"26":{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},"27":{"start":{"line":69,"column":2},"end":{"line":74,"column":null}},"28":{"start":{"line":72,"column":6},"end":{"line":72,"column":null}},"29":{"start":{"line":72,"column":57},"end":{"line":72,"column":64}},"30":{"start":{"line":76,"column":2},"end":{"line":76,"column":null}},"31":{"start":{"line":77,"column":2},"end":{"line":77,"column":51}},"32":{"start":{"line":78,"column":2},"end":{"line":78,"column":null}},"33":{"start":{"line":81,"column":2},"end":{"line":98,"column":null}},"34":{"start":{"line":101,"column":28},"end":{"line":101,"column":80}},"35":{"start":{"line":102,"column":2},"end":{"line":104,"column":null}},"36":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"37":{"start":{"line":108,"column":2},"end":{"line":111,"column":null}},"38":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"39":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"40":{"start":{"line":113,"column":2},"end":{"line":113,"column":null}},"41":{"start":{"line":113,"column":32},"end":{"line":113,"column":64}},"42":{"start":{"line":115,"column":16},"end":{"line":115,"column":31}},"43":{"start":{"line":118,"column":2},"end":{"line":225,"column":null}},"44":{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},"45":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"46":{"start":{"line":123,"column":30},"end":{"line":123,"column":39}},"47":{"start":{"line":125,"column":4},"end":{"line":128,"column":null}},"48":{"start":{"line":126,"column":6},"end":{"line":126,"column":null}},"49":{"start":{"line":127,"column":6},"end":{"line":127,"column":null}},"50":{"start":{"line":131,"column":4},"end":{"line":134,"column":null}},"51":{"start":{"line":132,"column":6},"end":{"line":132,"column":null}},"52":{"start":{"line":133,"column":6},"end":{"line":133,"column":null}},"53":{"start":{"line":136,"column":4},"end":{"line":141,"column":null}},"54":{"start":{"line":137,"column":6},"end":{"line":140,"column":null}},"55":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"56":{"start":{"line":139,"column":8},"end":{"line":139,"column":null}},"57":{"start":{"line":143,"column":4},"end":{"line":145,"column":null}},"58":{"start":{"line":144,"column":6},"end":{"line":144,"column":null}},"59":{"start":{"line":148,"column":4},"end":{"line":168,"column":null}},"60":{"start":{"line":149,"column":21},"end":{"line":149,"column":44}},"61":{"start":{"line":150,"column":22},"end":{"line":150,"column":30}},"62":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"63":{"start":{"line":152,"column":6},"end":{"line":157,"column":null}},"64":{"start":{"line":158,"column":14},"end":{"line":158,"column":15}},"65":{"start":{"line":159,"column":6},"end":{"line":162,"column":null}},"66":{"start":{"line":160,"column":8},"end":{"line":160,"column":null}},"67":{"start":{"line":161,"column":8},"end":{"line":161,"column":null}},"68":{"start":{"line":163,"column":6},"end":{"line":163,"column":null}},"69":{"start":{"line":164,"column":6},"end":{"line":166,"column":null}},"70":{"start":{"line":165,"column":8},"end":{"line":165,"column":null}},"71":{"start":{"line":167,"column":6},"end":{"line":167,"column":null}},"72":{"start":{"line":170,"column":4},"end":{"line":203,"column":null}},"73":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"74":{"start":{"line":171,"column":27},"end":{"line":171,"column":null}},"75":{"start":{"line":173,"column":21},"end":{"line":173,"column":40}},"76":{"start":{"line":174,"column":6},"end":{"line":174,"column":null}},"77":{"start":{"line":176,"column":26},"end":{"line":180,"column":21}},"78":{"start":{"line":181,"column":17},"end":{"line":181,"column":116}},"79":{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},"80":{"start":{"line":184,"column":8},"end":{"line":184,"column":null}},"81":{"start":{"line":187,"column":8},"end":{"line":187,"column":null}},"82":{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},"83":{"start":{"line":191,"column":8},"end":{"line":191,"column":20}},"84":{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},"85":{"start":{"line":195,"column":10},"end":{"line":195,"column":null}},"86":{"start":{"line":198,"column":10},"end":{"line":198,"column":null}},"87":{"start":{"line":199,"column":10},"end":{"line":199,"column":null}},"88":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"89":{"start":{"line":205,"column":4},"end":{"line":205,"column":null}},"90":{"start":{"line":207,"column":22},"end":{"line":207,"column":107}},"91":{"start":{"line":208,"column":4},"end":{"line":210,"column":null}},"92":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"93":{"start":{"line":211,"column":4},"end":{"line":211,"column":null}},"94":{"start":{"line":212,"column":4},"end":{"line":212,"column":null}},"95":{"start":{"line":214,"column":4},"end":{"line":218,"column":null}},"96":{"start":{"line":215,"column":6},"end":{"line":215,"column":null}},"97":{"start":{"line":216,"column":26},"end":{"line":216,"column":87}},"98":{"start":{"line":217,"column":6},"end":{"line":217,"column":null}},"99":{"start":{"line":220,"column":4},"end":{"line":220,"column":null}},"100":{"start":{"line":223,"column":4},"end":{"line":223,"column":null}},"101":{"start":{"line":224,"column":4},"end":{"line":224,"column":null}},"102":{"start":{"line":228,"column":0},"end":{"line":228,"column":null}},"103":{"start":{"line":229,"column":15},"end":{"line":240,"column":1}},"104":{"start":{"line":230,"column":15},"end":{"line":230,"column":17}},"105":{"start":{"line":232,"column":21},"end":{"line":232,"column":57}},"106":{"start":{"line":233,"column":27},"end":{"line":233,"column":44}},"107":{"start":{"line":234,"column":16},"end":{"line":234,"column":17}},"108":{"start":{"line":235,"column":2},"end":{"line":238,"column":null}},"109":{"start":{"line":236,"column":4},"end":{"line":236,"column":null}},"110":{"start":{"line":237,"column":4},"end":{"line":237,"column":null}},"111":{"start":{"line":239,"column":2},"end":{"line":239,"column":null}},"112":{"start":{"line":242,"column":19},"end":{"line":284,"column":1}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":43,"column":16},"end":{"line":43,"column":22}},"loc":{"start":{"line":43,"column":35},"end":{"line":226,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}},"loc":{"start":{"line":53,"column":20},"end":{"line":53,"column":29}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":21},"end":{"line":71,"column":22}},"loc":{"start":{"line":71,"column":34},"end":{"line":73,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":40},"end":{"line":72,"column":41}},"loc":{"start":{"line":72,"column":57},"end":{"line":72,"column":64}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":108,"column":15},"end":{"line":108,"column":26}},"loc":{"start":{"line":108,"column":26},"end":{"line":111,"column":3}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":113,"column":22},"end":{"line":113,"column":27}},"loc":{"start":{"line":113,"column":32},"end":{"line":113,"column":64}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":148,"column":12},"end":{"line":148,"column":13}},"loc":{"start":{"line":148,"column":39},"end":{"line":168,"column":5}}},"8":{"name":"(anonymous_9)","decl":{"start":{"line":170,"column":12},"end":{"line":170,"column":13}},"loc":{"start":{"line":170,"column":39},"end":{"line":203,"column":5}}},"9":{"name":"(anonymous_10)","decl":{"start":{"line":229,"column":15},"end":{"line":229,"column":16}},"loc":{"start":{"line":229,"column":31},"end":{"line":240,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"binary-expr","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"type":"cond-expr","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},{"start":{"line":18,"column":41},"end":{"line":18,"column":null}}]},"3":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":23}},"type":"default-arg","locations":[{"start":{"line":49,"column":18},"end":{"line":49,"column":23}}]},"4":{"loc":{"start":{"line":52,"column":4},"end":{"line":52,"column":29}},"type":"default-arg","locations":[{"start":{"line":52,"column":15},"end":{"line":52,"column":29}}]},"5":{"loc":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"type":"default-arg","locations":[{"start":{"line":53,"column":20},"end":{"line":53,"column":null}}]},"6":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":27}},"type":"default-arg","locations":[{"start":{"line":54,"column":22},"end":{"line":54,"column":27}}]},"7":{"loc":{"start":{"line":65,"column":8},"end":{"line":65,"column":24}},"type":"binary-expr","locations":[{"start":{"line":65,"column":8},"end":{"line":65,"column":11}},{"start":{"line":65,"column":15},"end":{"line":65,"column":24}}]},"8":{"loc":{"start":{"line":91,"column":30},"end":{"line":91,"column":105}},"type":"binary-expr","locations":[{"start":{"line":91,"column":30},"end":{"line":91,"column":53}},{"start":{"line":91,"column":57},"end":{"line":91,"column":105}}]},"9":{"loc":{"start":{"line":102,"column":2},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":2},"end":{"line":104,"column":null}}]},"10":{"loc":{"start":{"line":125,"column":4},"end":{"line":128,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":4},"end":{"line":128,"column":null}}]},"11":{"loc":{"start":{"line":131,"column":4},"end":{"line":134,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":4},"end":{"line":134,"column":null}}]},"12":{"loc":{"start":{"line":136,"column":4},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":141,"column":null}}]},"13":{"loc":{"start":{"line":136,"column":8},"end":{"line":136,"column":27}},"type":"cond-expr","locations":[{"start":{"line":136,"column":19},"end":{"line":136,"column":21}},{"start":{"line":136,"column":8},"end":{"line":136,"column":27}}]},"14":{"loc":{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},"type":"binary-expr","locations":[{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},{"start":{"line":136,"column":8},"end":{"line":136,"column":21}}]},"15":{"loc":{"start":{"line":159,"column":13},"end":{"line":159,"column":54}},"type":"binary-expr","locations":[{"start":{"line":159,"column":13},"end":{"line":159,"column":33}},{"start":{"line":159,"column":37},"end":{"line":159,"column":54}}]},"16":{"loc":{"start":{"line":164,"column":6},"end":{"line":166,"column":null}},"type":"if","locations":[{"start":{"line":164,"column":6},"end":{"line":166,"column":null}}]},"17":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"type":"if","locations":[{"start":{"line":171,"column":6},"end":{"line":171,"column":null}}]},"18":{"loc":{"start":{"line":173,"column":21},"end":{"line":173,"column":40}},"type":"binary-expr","locations":[{"start":{"line":173,"column":21},"end":{"line":173,"column":33}},{"start":{"line":173,"column":37},"end":{"line":173,"column":40}}]},"19":{"loc":{"start":{"line":176,"column":26},"end":{"line":180,"column":21}},"type":"cond-expr","locations":[{"start":{"line":177,"column":10},"end":{"line":177,"column":18}},{"start":{"line":178,"column":10},"end":{"line":180,"column":21}}]},"20":{"loc":{"start":{"line":176,"column":26},"end":{"line":176,"column":55}},"type":"binary-expr","locations":[{"start":{"line":176,"column":26},"end":{"line":176,"column":39}},{"start":{"line":176,"column":43},"end":{"line":176,"column":55}}]},"21":{"loc":{"start":{"line":178,"column":10},"end":{"line":180,"column":21}},"type":"cond-expr","locations":[{"start":{"line":179,"column":12},"end":{"line":179,"column":20}},{"start":{"line":180,"column":12},"end":{"line":180,"column":21}}]},"22":{"loc":{"start":{"line":178,"column":10},"end":{"line":178,"column":39}},"type":"binary-expr","locations":[{"start":{"line":178,"column":10},"end":{"line":178,"column":23}},{"start":{"line":178,"column":27},"end":{"line":178,"column":39}}]},"23":{"loc":{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":6},"end":{"line":188,"column":null}},{"start":{"line":186,"column":11},"end":{"line":188,"column":null}}]},"24":{"loc":{"start":{"line":183,"column":10},"end":{"line":183,"column":50}},"type":"binary-expr","locations":[{"start":{"line":183,"column":10},"end":{"line":183,"column":35}},{"start":{"line":183,"column":39},"end":{"line":183,"column":50}}]},"25":{"loc":{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":6},"end":{"line":202,"column":null}},{"start":{"line":193,"column":11},"end":{"line":202,"column":null}}]},"26":{"loc":{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":194,"column":8},"end":{"line":200,"column":null}},{"start":{"line":197,"column":13},"end":{"line":200,"column":null}}]},"27":{"loc":{"start":{"line":214,"column":4},"end":{"line":218,"column":null}},"type":"if","locations":[{"start":{"line":214,"column":4},"end":{"line":218,"column":null}}]},"28":{"loc":{"start":{"line":216,"column":26},"end":{"line":216,"column":87}},"type":"binary-expr","locations":[{"start":{"line":216,"column":26},"end":{"line":216,"column":37}},{"start":{"line":216,"column":41},"end":{"line":216,"column":87}}]},"29":{"loc":{"start":{"line":229,"column":16},"end":{"line":229,"column":26}},"type":"default-arg","locations":[{"start":{"line":229,"column":25},"end":{"line":229,"column":26}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":276,"16":4,"17":4,"18":4,"19":4,"20":4,"21":7,"22":7,"23":0,"24":7,"25":7,"26":7,"27":7,"28":0,"29":0,"30":7,"31":7,"32":7,"33":7,"34":7,"35":7,"36":0,"37":7,"38":0,"39":0,"40":7,"41":0,"42":7,"43":7,"44":7,"45":7,"46":7,"47":7,"48":3,"49":3,"50":7,"51":7,"52":7,"53":7,"54":3,"55":4,"56":4,"57":7,"58":3,"59":7,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":7,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":7,"90":7,"91":7,"92":0,"93":7,"94":7,"95":7,"96":0,"97":0,"98":0,"99":7,"100":0,"101":0,"102":4,"103":4,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":4},"f":{"0":12,"1":7,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[12],"1":[408,408,400],"2":[196,400],"3":[0],"4":[0],"5":[0],"6":[0],"7":[7,7],"8":[7,7],"9":[0],"10":[3],"11":[7],"12":[3],"13":[4,3],"14":[7,7],"15":[0,0],"16":[0],"17":[0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0],"28":[0,0],"29":[0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/server.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/server.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":20},"end":{"line":40,"column":1}},"2":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"3":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"4":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"5":{"start":{"line":16,"column":25},"end":{"line":16,"column":52}},"6":{"start":{"line":18,"column":17},"end":{"line":26,"column":4}},"7":{"start":{"line":19,"column":4},"end":{"line":22,"column":5}},"8":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"10":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"12":{"start":{"line":29,"column":2},"end":{"line":37,"column":null}},"13":{"start":{"line":30,"column":4},"end":{"line":33,"column":null}},"14":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"16":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"17":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"18":{"start":{"line":40,"column":1},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":26}},"loc":{"start":{"line":9,"column":6},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":35},"end":{"line":18,"column":38}},"loc":{"start":{"line":18,"column":43},"end":{"line":26,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":24},"end":{"line":29,"column":30}},"loc":{"start":{"line":29,"column":30},"end":{"line":37,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":17},"end":{"line":30,"column":23}},"loc":{"start":{"line":30,"column":23},"end":{"line":33,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":13},"end":{"line":10,"column":39}},"type":"binary-expr","locations":[{"start":{"line":10,"column":13},"end":{"line":10,"column":21}},{"start":{"line":10,"column":25},"end":{"line":10,"column":39}}]},"1":{"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":14,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":22,"column":5}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0],"2":[0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/heartbeat.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/heartbeat.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}},"1":{"start":{"line":6,"column":12},"end":{"line":6,"column":20}},"2":{"start":{"line":7,"column":10},"end":{"line":7,"column":26}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":21}},"4":{"start":{"line":10,"column":13},"end":{"line":15,"column":1}},"5":{"start":{"line":10,"column":31},"end":{"line":15,"column":1}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"8":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"9":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":31},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":31},"end":{"line":10,"column":32}},"loc":{"start":{"line":10,"column":45},"end":{"line":15,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":0,"9":4},"f":{"0":7,"1":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/help.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/help.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":12},"end":{"line":5,"column":20}},"3":{"start":{"line":6,"column":10},"end":{"line":6,"column":21}},"4":{"start":{"line":7,"column":16},"end":{"line":14,"column":null}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"6":{"start":{"line":18,"column":13},"end":{"line":21,"column":1}},"7":{"start":{"line":23,"column":10},"end":{"line":23,"column":57}}},"fnMap":{},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4},"f":{},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-md.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-md.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":34},"end":{"line":17,"column":1}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":59}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":15},"end":{"line":12,"column":18}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":14,"column":17},"end":{"line":14,"column":null}},"8":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"9":{"start":{"line":19,"column":23},"end":{"line":56,"column":1}},"10":{"start":{"line":19,"column":49},"end":{"line":56,"column":1}},"11":{"start":{"line":20,"column":16},"end":{"line":20,"column":83}},"12":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"13":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"14":{"start":{"line":26,"column":2},"end":{"line":34,"column":null}},"15":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"16":{"start":{"line":28,"column":4},"end":{"line":33,"column":null}},"17":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"18":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"19":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"20":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"21":{"start":{"line":36,"column":2},"end":{"line":39,"column":null}},"22":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"24":{"start":{"line":41,"column":2},"end":{"line":53,"column":null}},"25":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"26":{"start":{"line":43,"column":4},"end":{"line":52,"column":null}},"27":{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},"28":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"29":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"30":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"31":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"32":{"start":{"line":56,"column":1},"end":{"line":56,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":34},"end":{"line":3,"column":35}},"loc":{"start":{"line":3,"column":40},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":23},"end":{"line":19,"column":24}},"loc":{"start":{"line":19,"column":49},"end":{"line":56,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":49},"end":{"line":19,"column":50}},"loc":{"start":{"line":19,"column":122},"end":{"line":56,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":22},"end":{"line":28,"column":23}},"loc":{"start":{"line":28,"column":37},"end":{"line":33,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":22},"end":{"line":43,"column":23}},"loc":{"start":{"line":43,"column":37},"end":{"line":52,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":58}},"type":"cond-expr","locations":[{"start":{"line":4,"column":35},"end":{"line":4,"column":45}},{"start":{"line":4,"column":48},"end":{"line":4,"column":58}}]},"1":{"loc":{"start":{"line":5,"column":20},"end":{"line":5,"column":67}},"type":"cond-expr","locations":[{"start":{"line":5,"column":37},"end":{"line":5,"column":50}},{"start":{"line":5,"column":53},"end":{"line":5,"column":67}}]},"2":{"loc":{"start":{"line":6,"column":15},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":7,"column":6},"end":{"line":7,"column":15}},{"start":{"line":8,"column":6},"end":{"line":12,"column":18}}]},"3":{"loc":{"start":{"line":8,"column":6},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":9,"column":8},"end":{"line":9,"column":17}},{"start":{"line":10,"column":8},"end":{"line":12,"column":18}}]},"4":{"loc":{"start":{"line":10,"column":8},"end":{"line":12,"column":18}},"type":"cond-expr","locations":[{"start":{"line":11,"column":10},"end":{"line":11,"column":18}},{"start":{"line":12,"column":10},"end":{"line":12,"column":18}}]},"5":{"loc":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":14,"column":null}}]},"6":{"loc":{"start":{"line":19,"column":24},"end":{"line":19,"column":44}},"type":"default-arg","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":44}}]},"7":{"loc":{"start":{"line":19,"column":26},"end":{"line":19,"column":38}},"type":"default-arg","locations":[{"start":{"line":19,"column":36},"end":{"line":19,"column":38}}]},"8":{"loc":{"start":{"line":20,"column":42},"end":{"line":20,"column":56}},"type":"binary-expr","locations":[{"start":{"line":20,"column":42},"end":{"line":20,"column":47}},{"start":{"line":20,"column":51},"end":{"line":20,"column":56}}]},"9":{"loc":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":24,"column":null}}]},"10":{"loc":{"start":{"line":26,"column":2},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":34,"column":null}}]},"11":{"loc":{"start":{"line":36,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":39,"column":null}}]},"12":{"loc":{"start":{"line":41,"column":2},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":53,"column":null}}]},"13":{"loc":{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":6},"end":{"line":49,"column":null}},{"start":{"line":47,"column":11},"end":{"line":49,"column":null}}]},"14":{"loc":{"start":{"line":45,"column":49},"end":{"line":45,"column":90}},"type":"cond-expr","locations":[{"start":{"line":45,"column":66},"end":{"line":45,"column":85}},{"start":{"line":45,"column":88},"end":{"line":45,"column":90}}]},"15":{"loc":{"start":{"line":48,"column":37},"end":{"line":48,"column":78}},"type":"cond-expr","locations":[{"start":{"line":48,"column":54},"end":{"line":48,"column":73}},{"start":{"line":48,"column":76},"end":{"line":48,"column":78}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":4,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":4},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0],"7":[0],"8":[0,0],"9":[0],"10":[0],"11":[0],"12":[0],"13":[0,0],"14":[0,0],"15":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-terminal.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-terminal.mjs","statementMap":{"0":{"start":{"line":2,"column":34},"end":{"line":16,"column":1}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":86}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":15},"end":{"line":11,"column":18}},"4":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":15},"end":{"line":18,"column":16}},"8":{"start":{"line":19,"column":29},"end":{"line":59,"column":1}},"9":{"start":{"line":20,"column":16},"end":{"line":20,"column":39}},"10":{"start":{"line":20,"column":25},"end":{"line":20,"column":39}},"11":{"start":{"line":22,"column":2},"end":{"line":58,"column":null}},"12":{"start":{"line":23,"column":67},"end":{"line":23,"column":71}},"13":{"start":{"line":25,"column":18},"end":{"line":25,"column":67}},"14":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"15":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"16":{"start":{"line":31,"column":4},"end":{"line":40,"column":null}},"17":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":38,"column":null}},"19":{"start":{"line":34,"column":8},"end":{"line":34,"column":null}},"20":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"21":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"22":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"23":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"24":{"start":{"line":42,"column":4},"end":{"line":45,"column":null}},"25":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"26":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"27":{"start":{"line":47,"column":4},"end":{"line":53,"column":null}},"28":{"start":{"line":48,"column":6},"end":{"line":48,"column":null}},"29":{"start":{"line":49,"column":6},"end":{"line":52,"column":null}},"30":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"31":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"32":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"33":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"34":{"start":{"line":59,"column":1},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":34},"end":{"line":2,"column":35}},"loc":{"start":{"line":2,"column":40},"end":{"line":16,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":19,"column":55},"end":{"line":59,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":16},"end":{"line":20,"column":20}},"loc":{"start":{"line":20,"column":25},"end":{"line":20,"column":39}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":10}},"loc":{"start":{"line":22,"column":45},"end":{"line":58,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":33,"column":34},"end":{"line":33,"column":35}},"loc":{"start":{"line":33,"column":49},"end":{"line":38,"column":7}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":24},"end":{"line":49,"column":25}},"loc":{"start":{"line":49,"column":39},"end":{"line":52,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":28},"end":{"line":3,"column":85}},"type":"cond-expr","locations":[{"start":{"line":3,"column":41},"end":{"line":3,"column":72}},{"start":{"line":3,"column":75},"end":{"line":3,"column":85}}]},"1":{"loc":{"start":{"line":4,"column":22},"end":{"line":4,"column":69}},"type":"cond-expr","locations":[{"start":{"line":4,"column":39},"end":{"line":4,"column":52}},{"start":{"line":4,"column":55},"end":{"line":4,"column":69}}]},"2":{"loc":{"start":{"line":5,"column":15},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":6,"column":6},"end":{"line":6,"column":15}},{"start":{"line":7,"column":6},"end":{"line":11,"column":18}}]},"3":{"loc":{"start":{"line":7,"column":6},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":8,"column":8},"end":{"line":8,"column":17}},{"start":{"line":9,"column":8},"end":{"line":11,"column":18}}]},"4":{"loc":{"start":{"line":9,"column":8},"end":{"line":11,"column":18}},"type":"cond-expr","locations":[{"start":{"line":10,"column":10},"end":{"line":10,"column":18}},{"start":{"line":11,"column":10},"end":{"line":11,"column":18}}]},"5":{"loc":{"start":{"line":13,"column":14},"end":{"line":13,"column":58}},"type":"cond-expr","locations":[{"start":{"line":13,"column":26},"end":{"line":13,"column":53}},{"start":{"line":13,"column":56},"end":{"line":13,"column":58}}]},"6":{"loc":{"start":{"line":19,"column":30},"end":{"line":19,"column":50}},"type":"default-arg","locations":[{"start":{"line":19,"column":48},"end":{"line":19,"column":50}}]},"7":{"loc":{"start":{"line":19,"column":32},"end":{"line":19,"column":44}},"type":"default-arg","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":44}}]},"8":{"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":29,"column":null}}]},"9":{"loc":{"start":{"line":31,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":40,"column":null}}]},"10":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":45,"column":null}}]},"11":{"loc":{"start":{"line":47,"column":4},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":53,"column":null}}]},"12":{"loc":{"start":{"line":50,"column":41},"end":{"line":50,"column":67}},"type":"cond-expr","locations":[{"start":{"line":50,"column":57},"end":{"line":50,"column":61}},{"start":{"line":50,"column":64},"end":{"line":50,"column":67}}]},"13":{"loc":{"start":{"line":50,"column":85},"end":{"line":50,"column":110}},"type":"cond-expr","locations":[{"start":{"line":50,"column":101},"end":{"line":50,"column":104}},{"start":{"line":50,"column":107},"end":{"line":50,"column":110}}]}},"s":{"0":4,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":4,"8":4,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":4},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-text.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/formatter-text.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":34},"end":{"line":18,"column":1}},"2":{"start":{"line":5,"column":15},"end":{"line":5,"column":51}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":15},"end":{"line":13,"column":18}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":15,"column":17},"end":{"line":15,"column":null}},"8":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"9":{"start":{"line":20,"column":22},"end":{"line":52,"column":1}},"10":{"start":{"line":21,"column":16},"end":{"line":21,"column":57}},"11":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"12":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"13":{"start":{"line":27,"column":2},"end":{"line":36,"column":null}},"14":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":4},"end":{"line":35,"column":null}},"16":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"17":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"18":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"19":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"20":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"21":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"22":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"23":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"24":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"25":{"start":{"line":45,"column":4},"end":{"line":48,"column":null}},"26":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"27":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"28":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"29":{"start":{"line":52,"column":1},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":34},"end":{"line":4,"column":35}},"loc":{"start":{"line":4,"column":40},"end":{"line":18,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":22},"end":{"line":20,"column":23}},"loc":{"start":{"line":20,"column":95},"end":{"line":52,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":22},"end":{"line":29,"column":23}},"loc":{"start":{"line":29,"column":37},"end":{"line":35,"column":5}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":22},"end":{"line":45,"column":23}},"loc":{"start":{"line":45,"column":37},"end":{"line":48,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":15},"end":{"line":5,"column":51}},"type":"cond-expr","locations":[{"start":{"line":5,"column":28},"end":{"line":5,"column":38}},{"start":{"line":5,"column":41},"end":{"line":5,"column":51}}]},"1":{"loc":{"start":{"line":6,"column":20},"end":{"line":6,"column":67}},"type":"cond-expr","locations":[{"start":{"line":6,"column":37},"end":{"line":6,"column":50}},{"start":{"line":6,"column":53},"end":{"line":6,"column":67}}]},"2":{"loc":{"start":{"line":7,"column":15},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":8,"column":6},"end":{"line":8,"column":15}},{"start":{"line":9,"column":6},"end":{"line":13,"column":18}}]},"3":{"loc":{"start":{"line":9,"column":6},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":10,"column":8},"end":{"line":10,"column":17}},{"start":{"line":11,"column":8},"end":{"line":13,"column":18}}]},"4":{"loc":{"start":{"line":11,"column":8},"end":{"line":13,"column":18}},"type":"cond-expr","locations":[{"start":{"line":12,"column":10},"end":{"line":12,"column":18}},{"start":{"line":13,"column":10},"end":{"line":13,"column":18}}]},"5":{"loc":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":15,"column":null}}]},"6":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":32}},"type":"binary-expr","locations":[{"start":{"line":21,"column":18},"end":{"line":21,"column":23}},{"start":{"line":21,"column":27},"end":{"line":21,"column":32}}]},"7":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}}]},"8":{"loc":{"start":{"line":27,"column":2},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":36,"column":null}}]},"9":{"loc":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":41,"column":null}}]},"10":{"loc":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":49,"column":null}}]},"11":{"loc":{"start":{"line":46,"column":30},"end":{"line":46,"column":56}},"type":"cond-expr","locations":[{"start":{"line":46,"column":46},"end":{"line":46,"column":50}},{"start":{"line":46,"column":53},"end":{"line":46,"column":56}}]},"12":{"loc":{"start":{"line":46,"column":74},"end":{"line":46,"column":99}},"type":"cond-expr","locations":[{"start":{"line":46,"column":90},"end":{"line":46,"column":93}},{"start":{"line":46,"column":96},"end":{"line":46,"column":99}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":4,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":4},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0,0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0,0],"12":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/print-path.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/print-path.mjs","statementMap":{"0":{"start":{"line":1,"column":19},"end":{"line":1,"column":94}},"1":{"start":{"line":1,"column":28},"end":{"line":1,"column":94}},"2":{"start":{"line":1,"column":56},"end":{"line":1,"column":77}},"3":{"start":{"line":1,"column":94},"end":{"line":1,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":19},"end":{"line":1,"column":23}},"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":94}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":1,"column":51},"end":{"line":1,"column":52}},"loc":{"start":{"line":1,"column":56},"end":{"line":1,"column":77}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":35},"end":{"line":1,"column":93}},"type":"cond-expr","locations":[{"start":{"line":1,"column":42},"end":{"line":1,"column":88}},{"start":{"line":1,"column":91},"end":{"line":1,"column":93}}]}},"s":{"0":4,"1":0,"2":0,"3":4},"f":{"0":0,"1":0},"b":{"0":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/send-help.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/help/lib/send-help.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":7,"column":94}},"5":{"start":{"line":8,"column":26},"end":{"line":8,"column":39}},"6":{"start":{"line":10,"column":17},"end":{"line":32,"column":1}},"7":{"start":{"line":11,"column":27},"end":{"line":11,"column":42}},"8":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"9":{"start":{"line":12,"column":34},"end":{"line":12,"column":62}},"10":{"start":{"line":14,"column":15},"end":{"line":29,"column":3}},"11":{"start":{"line":14,"column":40},"end":{"line":29,"column":3}},"12":{"start":{"line":15,"column":4},"end":{"line":28,"column":null}},"13":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"14":{"start":{"line":32,"column":1},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":17},"end":{"line":10,"column":18}},"loc":{"start":{"line":10,"column":57},"end":{"line":32,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":24},"end":{"line":12,"column":25}},"loc":{"start":{"line":12,"column":34},"end":{"line":12,"column":62}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":15},"end":{"line":14,"column":16}},"loc":{"start":{"line":14,"column":40},"end":{"line":29,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":40},"end":{"line":14,"column":41}},"loc":{"start":{"line":14,"column":60},"end":{"line":29,"column":3}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":88,"8":88,"9":122,"10":88,"11":91,"12":0,"13":88,"14":4},"f":{"0":88,"1":122,"2":91,"3":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/api.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/api.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":5,"column":1}},"1":{"start":{"line":7,"column":12},"end":{"line":7,"column":20}},"2":{"start":{"line":8,"column":10},"end":{"line":8,"column":30}},"3":{"start":{"line":9,"column":16},"end":{"line":9,"column":21}},"4":{"start":{"line":11,"column":13},"end":{"line":13,"column":1}},"5":{"start":{"line":11,"column":26},"end":{"line":13,"column":1}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"7":{"start":{"line":13,"column":1},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":13},"end":{"line":11,"column":14}},"loc":{"start":{"line":11,"column":26},"end":{"line":13,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":26},"end":{"line":11,"column":27}},"loc":{"start":{"line":11,"column":40},"end":{"line":13,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":1,"7":4},"f":{"0":7,"1":1},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/next-commands.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/next-commands.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":10},"end":{"line":8,"column":1}},"3":{"start":{"line":10,"column":12},"end":{"line":10,"column":20}},"4":{"start":{"line":11,"column":10},"end":{"line":11,"column":40}},"5":{"start":{"line":12,"column":16},"end":{"line":16,"column":null}},"6":{"start":{"line":19,"column":18},"end":{"line":19,"column":21}},"7":{"start":{"line":20,"column":18},"end":{"line":20,"column":21}},"8":{"start":{"line":22,"column":13},"end":{"line":167,"column":1}},"9":{"start":{"line":22,"column":33},"end":{"line":167,"column":1}},"10":{"start":{"line":23,"column":2},"end":{"line":166,"column":null}},"11":{"start":{"line":24,"column":19},"end":{"line":24,"column":48}},"12":{"start":{"line":25,"column":30},"end":{"line":25,"column":39}},"13":{"start":{"line":27,"column":40},"end":{"line":27,"column":65}},"14":{"start":{"line":29,"column":19},"end":{"line":29,"column":39}},"15":{"start":{"line":30,"column":23},"end":{"line":30,"column":25}},"16":{"start":{"line":31,"column":25},"end":{"line":31,"column":27}},"17":{"start":{"line":34,"column":23},"end":{"line":34,"column":47}},"18":{"start":{"line":35,"column":23},"end":{"line":35,"column":47}},"19":{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},"20":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"21":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":39,"column":23}},"23":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"24":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"25":{"start":{"line":44,"column":6},"end":{"line":44,"column":23}},"26":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"27":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"28":{"start":{"line":50,"column":32},"end":{"line":50,"column":36}},"29":{"start":{"line":52,"column":4},"end":{"line":106,"column":null}},"30":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"31":{"start":{"line":54,"column":25},"end":{"line":54,"column":61}},"32":{"start":{"line":55,"column":6},"end":{"line":55,"column":34}},"33":{"start":{"line":55,"column":29},"end":{"line":55,"column":34}},"34":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"35":{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},"36":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"37":{"start":{"line":63,"column":39},"end":{"line":63,"column":43}},"38":{"start":{"line":64,"column":8},"end":{"line":89,"column":null}},"39":{"start":{"line":65,"column":10},"end":{"line":88,"column":null}},"40":{"start":{"line":70,"column":12},"end":{"line":70,"column":null}},"41":{"start":{"line":71,"column":28},"end":{"line":71,"column":41}},"42":{"start":{"line":72,"column":12},"end":{"line":72,"column":47}},"43":{"start":{"line":73,"column":34},"end":{"line":73,"column":52}},"44":{"start":{"line":74,"column":53},"end":{"line":74,"column":66}},"45":{"start":{"line":75,"column":28},"end":{"line":75,"column":99}},"46":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"47":{"start":{"line":76,"column":33},"end":{"line":76,"column":null}},"48":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"49":{"start":{"line":77,"column":39},"end":{"line":77,"column":null}},"50":{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},"51":{"start":{"line":82,"column":14},"end":{"line":82,"column":null}},"52":{"start":{"line":83,"column":14},"end":{"line":83,"column":19}},"53":{"start":{"line":86,"column":14},"end":{"line":86,"column":null}},"54":{"start":{"line":91,"column":8},"end":{"line":104,"column":null}},"55":{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},"56":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"57":{"start":{"line":96,"column":12},"end":{"line":101,"column":null}},"58":{"start":{"line":98,"column":14},"end":{"line":98,"column":38}},"59":{"start":{"line":98,"column":38},"end":{"line":98,"column":null}},"60":{"start":{"line":100,"column":14},"end":{"line":100,"column":null}},"61":{"start":{"line":102,"column":12},"end":{"line":102,"column":null}},"62":{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},"63":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"64":{"start":{"line":110,"column":78},"end":{"line":110,"column":113}},"65":{"start":{"line":113,"column":25},"end":{"line":113,"column":30}},"66":{"start":{"line":114,"column":6},"end":{"line":136,"column":null}},"67":{"start":{"line":116,"column":10},"end":{"line":116,"column":null}},"68":{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},"69":{"start":{"line":118,"column":34},"end":{"line":118,"column":55}},"70":{"start":{"line":119,"column":39},"end":{"line":119,"column":52}},"71":{"start":{"line":120,"column":24},"end":{"line":120,"column":92}},"72":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"73":{"start":{"line":121,"column":29},"end":{"line":121,"column":null}},"74":{"start":{"line":122,"column":12},"end":{"line":122,"column":null}},"75":{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},"76":{"start":{"line":128,"column":12},"end":{"line":128,"column":null}},"77":{"start":{"line":130,"column":15},"end":{"line":132,"column":null}},"78":{"start":{"line":131,"column":12},"end":{"line":131,"column":null}},"79":{"start":{"line":135,"column":10},"end":{"line":135,"column":null}},"80":{"start":{"line":138,"column":6},"end":{"line":138,"column":26}},"81":{"start":{"line":140,"column":22},"end":{"line":140,"column":86}},"82":{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},"83":{"start":{"line":142,"column":8},"end":{"line":152,"column":null}},"84":{"start":{"line":154,"column":11},"end":{"line":156,"column":null}},"85":{"start":{"line":155,"column":8},"end":{"line":155,"column":null}},"86":{"start":{"line":159,"column":4},"end":{"line":164,"column":null}},"87":{"start":{"line":161,"column":6},"end":{"line":161,"column":53}},"88":{"start":{"line":161,"column":53},"end":{"line":161,"column":null}},"89":{"start":{"line":163,"column":6},"end":{"line":163,"column":null}},"90":{"start":{"line":166,"column":14},"end":{"line":166,"column":32}},"91":{"start":{"line":166,"column":32},"end":{"line":166,"column":40}},"92":{"start":{"line":167,"column":1},"end":{"line":167,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":13},"end":{"line":22,"column":14}},"loc":{"start":{"line":22,"column":33},"end":{"line":167,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":33},"end":{"line":22,"column":39}},"loc":{"start":{"line":22,"column":52},"end":{"line":167,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":110,"column":72},"end":{"line":110,"column":73}},"loc":{"start":{"line":110,"column":78},"end":{"line":110,"column":113}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":115,"column":16},"end":{"line":115,"column":22}},"loc":{"start":{"line":115,"column":33},"end":{"line":136,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":12},"end":{"line":25,"column":26}},"type":"default-arg","locations":[{"start":{"line":25,"column":22},"end":{"line":25,"column":26}}]},"1":{"loc":{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":45,"column":null}},{"start":{"line":41,"column":9},"end":{"line":45,"column":null}}]},"2":{"loc":{"start":{"line":36,"column":8},"end":{"line":36,"column":89}},"type":"binary-expr","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":39}},{"start":{"line":36,"column":44},"end":{"line":36,"column":61}},{"start":{"line":36,"column":65},"end":{"line":36,"column":89}}]},"3":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}}]},"4":{"loc":{"start":{"line":46,"column":4},"end":{"line":46,"column":53}},"type":"binary-expr","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":39}},{"start":{"line":46,"column":37},"end":{"line":46,"column":39}},{"start":{"line":46,"column":8},"end":{"line":46,"column":53}}]},"5":{"loc":{"start":{"line":55,"column":6},"end":{"line":55,"column":34}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":55,"column":34}}]},"6":{"loc":{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":105,"column":null}},{"start":{"line":61,"column":11},"end":{"line":105,"column":null}}]},"7":{"loc":{"start":{"line":65,"column":10},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":10},"end":{"line":88,"column":null}}]},"8":{"loc":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":12},"end":{"line":76,"column":null}}]},"9":{"loc":{"start":{"line":76,"column":12},"end":{"line":76,"column":31}},"type":"binary-expr","locations":[{"start":{"line":76,"column":12},"end":{"line":76,"column":27}},{"start":{"line":76,"column":25},"end":{"line":76,"column":27}},{"start":{"line":76,"column":16},"end":{"line":76,"column":31}}]},"10":{"loc":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":12},"end":{"line":77,"column":null}}]},"11":{"loc":{"start":{"line":77,"column":16},"end":{"line":77,"column":33}},"type":"cond-expr","locations":[{"start":{"line":77,"column":25},"end":{"line":77,"column":27}},{"start":{"line":77,"column":16},"end":{"line":77,"column":33}}]},"12":{"loc":{"start":{"line":77,"column":16},"end":{"line":77,"column":27}},"type":"binary-expr","locations":[{"start":{"line":77,"column":16},"end":{"line":77,"column":27}},{"start":{"line":77,"column":25},"end":{"line":77,"column":27}}]},"13":{"loc":{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":12},"end":{"line":87,"column":null}},{"start":{"line":85,"column":17},"end":{"line":87,"column":null}}]},"14":{"loc":{"start":{"line":79,"column":16},"end":{"line":81,"column":52}},"type":"binary-expr","locations":[{"start":{"line":79,"column":16},"end":{"line":79,"column":28}},{"start":{"line":80,"column":19},"end":{"line":80,"column":73}},{"start":{"line":81,"column":19},"end":{"line":81,"column":52}}]},"15":{"loc":{"start":{"line":91,"column":8},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":8},"end":{"line":104,"column":null}}]},"16":{"loc":{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":10},"end":{"line":103,"column":null}},{"start":{"line":95,"column":15},"end":{"line":103,"column":null}}]},"17":{"loc":{"start":{"line":96,"column":12},"end":{"line":101,"column":null}},"type":"switch","locations":[{"start":{"line":97,"column":12},"end":{"line":98,"column":null}},{"start":{"line":99,"column":12},"end":{"line":100,"column":null}}]},"18":{"loc":{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":157,"column":null}},{"start":{"line":112,"column":9},"end":{"line":157,"column":null}}]},"19":{"loc":{"start":{"line":109,"column":8},"end":{"line":109,"column":72}},"type":"binary-expr","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":29}},{"start":{"line":109,"column":33},"end":{"line":109,"column":72}}]},"20":{"loc":{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":117,"column":10},"end":{"line":132,"column":null}},{"start":{"line":127,"column":15},"end":{"line":132,"column":null}}]},"21":{"loc":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":12},"end":{"line":121,"column":null}}]},"22":{"loc":{"start":{"line":121,"column":12},"end":{"line":121,"column":27}},"type":"binary-expr","locations":[{"start":{"line":121,"column":12},"end":{"line":121,"column":23}},{"start":{"line":121,"column":21},"end":{"line":121,"column":23}},{"start":{"line":121,"column":16},"end":{"line":121,"column":27}}]},"23":{"loc":{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":127,"column":15},"end":{"line":132,"column":null}},{"start":{"line":130,"column":15},"end":{"line":132,"column":null}}]},"24":{"loc":{"start":{"line":127,"column":19},"end":{"line":127,"column":49}},"type":"binary-expr","locations":[{"start":{"line":127,"column":19},"end":{"line":127,"column":27}},{"start":{"line":127,"column":31},"end":{"line":127,"column":49}}]},"25":{"loc":{"start":{"line":130,"column":15},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":130,"column":15},"end":{"line":132,"column":null}}]},"26":{"loc":{"start":{"line":140,"column":22},"end":{"line":140,"column":86}},"type":"cond-expr","locations":[{"start":{"line":140,"column":48},"end":{"line":140,"column":50}},{"start":{"line":140,"column":53},"end":{"line":140,"column":86}}]},"27":{"loc":{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":6},"end":{"line":156,"column":null}},{"start":{"line":154,"column":11},"end":{"line":156,"column":null}}]},"28":{"loc":{"start":{"line":154,"column":11},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":154,"column":11},"end":{"line":156,"column":null}}]},"29":{"loc":{"start":{"line":154,"column":15},"end":{"line":154,"column":65}},"type":"binary-expr","locations":[{"start":{"line":154,"column":15},"end":{"line":154,"column":40}},{"start":{"line":154,"column":44},"end":{"line":154,"column":65}}]},"30":{"loc":{"start":{"line":159,"column":4},"end":{"line":164,"column":null}},"type":"switch","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":null}},{"start":{"line":162,"column":4},"end":{"line":163,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":7,"10":46,"11":46,"12":46,"13":46,"14":46,"15":46,"16":46,"17":46,"18":46,"19":46,"20":24,"21":24,"22":24,"23":22,"24":22,"25":22,"26":46,"27":7,"28":46,"29":46,"30":108,"31":108,"32":108,"33":0,"34":108,"35":108,"36":102,"37":6,"38":6,"39":26,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":6,"55":6,"56":6,"57":0,"58":0,"59":0,"60":0,"61":0,"62":46,"63":6,"64":26,"65":40,"66":40,"67":64,"68":64,"69":4,"70":4,"71":4,"72":4,"73":0,"74":4,"75":60,"76":30,"77":30,"78":30,"79":64,"80":40,"81":40,"82":40,"83":30,"84":10,"85":2,"86":46,"87":0,"88":0,"89":46,"90":0,"91":0,"92":4},"f":{"0":7,"1":46,"2":26,"3":64},"b":{"0":[0],"1":[24,22],"2":[46,22,1],"3":[7],"4":[46,46,44],"5":[0],"6":[102,6],"7":[0],"8":[0],"9":[0,0,0],"10":[0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0,0],"15":[6],"16":[6,0],"17":[0,0],"18":[6,40],"19":[46,6],"20":[4,60],"21":[0],"22":[4,4,4],"23":[30,30],"24":[60,60],"25":[30],"26":[4,36],"27":[30,10],"28":[2],"29":[10,4],"30":[0,46]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/reload.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/reload.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":5,"column":1}},"1":{"start":{"line":7,"column":12},"end":{"line":7,"column":20}},"2":{"start":{"line":8,"column":10},"end":{"line":8,"column":33}},"3":{"start":{"line":9,"column":16},"end":{"line":9,"column":21}},"4":{"start":{"line":11,"column":13},"end":{"line":15,"column":1}},"5":{"start":{"line":11,"column":43},"end":{"line":15,"column":1}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"7":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"8":{"start":{"line":15,"column":1},"end":{"line":15,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":13},"end":{"line":11,"column":14}},"loc":{"start":{"line":11,"column":43},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":43},"end":{"line":11,"column":49}},"loc":{"start":{"line":11,"column":62},"end":{"line":15,"column":1}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":4},"f":{"0":7,"1":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/stop.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/stop.mjs","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":4,"column":1}},"1":{"start":{"line":6,"column":12},"end":{"line":6,"column":23}},"2":{"start":{"line":7,"column":10},"end":{"line":7,"column":32}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":21}},"4":{"start":{"line":10,"column":13},"end":{"line":22,"column":1}},"5":{"start":{"line":10,"column":33},"end":{"line":22,"column":1}},"6":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":13,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":14,"column":16},"end":{"line":14,"column":39}},"9":{"start":{"line":15,"column":4},"end":{"line":17,"column":null}},"10":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"11":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"12":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"13":{"start":{"line":22,"column":1},"end":{"line":22,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":33},"end":{"line":22,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":33},"end":{"line":10,"column":39}},"loc":{"start":{"line":10,"column":52},"end":{"line":22,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":4},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":17,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":7,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":4},"f":{"0":7,"1":0},"b":{"0":[0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/version.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/version.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"3":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":10},"end":{"line":10,"column":1}},"5":{"start":{"line":12,"column":12},"end":{"line":12,"column":20}},"6":{"start":{"line":13,"column":10},"end":{"line":13,"column":34}},"7":{"start":{"line":14,"column":16},"end":{"line":14,"column":21}},"8":{"start":{"line":16,"column":13},"end":{"line":39,"column":1}},"9":{"start":{"line":16,"column":43},"end":{"line":39,"column":1}},"10":{"start":{"line":17,"column":22},"end":{"line":31,"column":3}},"11":{"start":{"line":33,"column":15},"end":{"line":37,"column":1}},"12":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":1},"end":{"line":39,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":13},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":43},"end":{"line":39,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":16,"column":43},"end":{"line":16,"column":44}},"loc":{"start":{"line":16,"column":57},"end":{"line":39,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":68},"end":{"line":4,"column":null}},{"start":{"line":4,"column":68},"end":{"line":4,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":140,"4":4,"5":4,"6":4,"7":4,"8":4,"9":7,"10":3,"11":3,"12":3,"13":4},"f":{"0":8,"1":7,"2":3},"b":{"0":[8],"1":[192,192,188],"2":[92,188]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/next-options.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/next-options.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":31},"end":{"line":35,"column":1}},"2":{"start":{"line":13,"column":18},"end":{"line":13,"column":85}},"3":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"4":{"start":{"line":15,"column":29},"end":{"line":15,"column":null}},"5":{"start":{"line":16,"column":23},"end":{"line":16,"column":92}},"6":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"7":{"start":{"line":17,"column":27},"end":{"line":17,"column":null}},"8":{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},"9":{"start":{"line":22,"column":48},"end":{"line":22,"column":null}},"10":{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},"11":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"12":{"start":{"line":27,"column":25},"end":{"line":27,"column":72}},"13":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"14":{"start":{"line":28,"column":40},"end":{"line":28,"column":66}},"15":{"start":{"line":37,"column":25},"end":{"line":47,"column":1}},"16":{"start":{"line":38,"column":18},"end":{"line":38,"column":20}},"17":{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},"18":{"start":{"line":39,"column":26},"end":{"line":39,"column":null}},"19":{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},"20":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"21":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"22":{"start":{"line":44,"column":7},"end":{"line":44,"column":null}},"23":{"start":{"line":46,"column":2},"end":{"line":46,"column":null}},"24":{"start":{"line":49,"column":24},"end":{"line":91,"column":1}},"25":{"start":{"line":51,"column":23},"end":{"line":51,"column":60}},"26":{"start":{"line":51,"column":55},"end":{"line":51,"column":59}},"27":{"start":{"line":52,"column":25},"end":{"line":52,"column":54}},"28":{"start":{"line":52,"column":47},"end":{"line":52,"column":53}},"29":{"start":{"line":54,"column":18},"end":{"line":54,"column":20}},"30":{"start":{"line":57,"column":19},"end":{"line":59,"column":83}},"31":{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},"32":{"start":{"line":61,"column":25},"end":{"line":61,"column":80}},"33":{"start":{"line":61,"column":54},"end":{"line":61,"column":79}},"34":{"start":{"line":62,"column":23},"end":{"line":68,"column":10}},"35":{"start":{"line":63,"column":20},"end":{"line":63,"column":69}},"36":{"start":{"line":63,"column":46},"end":{"line":63,"column":58}},"37":{"start":{"line":64,"column":6},"end":{"line":66,"column":null}},"38":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"39":{"start":{"line":67,"column":6},"end":{"line":67,"column":null}},"40":{"start":{"line":70,"column":4},"end":{"line":74,"column":null}},"41":{"start":{"line":71,"column":6},"end":{"line":73,"column":null}},"42":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"43":{"start":{"line":72,"column":77},"end":{"line":72,"column":92}},"44":{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},"45":{"start":{"line":78,"column":6},"end":{"line":78,"column":null}},"46":{"start":{"line":81,"column":30},"end":{"line":81,"column":88}},"47":{"start":{"line":81,"column":59},"end":{"line":81,"column":87}},"48":{"start":{"line":82,"column":6},"end":{"line":86,"column":null}},"49":{"start":{"line":83,"column":25},"end":{"line":83,"column":71}},"50":{"start":{"line":83,"column":48},"end":{"line":83,"column":70}},"51":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"52":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"53":{"start":{"line":93,"column":20},"end":{"line":149,"column":1}},"54":{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},"55":{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},"56":{"start":{"line":106,"column":31},"end":{"line":106,"column":63}},"57":{"start":{"line":107,"column":9},"end":{"line":107,"column":null}},"58":{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},"59":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"60":{"start":{"line":114,"column":33},"end":{"line":114,"column":63}},"61":{"start":{"line":115,"column":27},"end":{"line":117,"column":64}},"62":{"start":{"line":118,"column":31},"end":{"line":118,"column":80}},"63":{"start":{"line":118,"column":54},"end":{"line":118,"column":79}},"64":{"start":{"line":119,"column":28},"end":{"line":119,"column":null}},"65":{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},"66":{"start":{"line":122,"column":6},"end":{"line":122,"column":null}},"67":{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},"68":{"start":{"line":126,"column":6},"end":{"line":135,"column":null}},"69":{"start":{"line":138,"column":6},"end":{"line":144,"column":null}},"70":{"start":{"line":148,"column":2},"end":{"line":148,"column":null}},"71":{"start":{"line":149,"column":1},"end":{"line":149,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":31},"end":{"line":3,"column":37}},"loc":{"start":{"line":12,"column":6},"end":{"line":35,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":34},"end":{"line":28,"column":35}},"loc":{"start":{"line":28,"column":40},"end":{"line":28,"column":66}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":25},"end":{"line":37,"column":26}},"loc":{"start":{"line":37,"column":43},"end":{"line":47,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":49,"column":24},"end":{"line":49,"column":25}},"loc":{"start":{"line":49,"column":111},"end":{"line":91,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":49},"end":{"line":51,"column":50}},"loc":{"start":{"line":51,"column":55},"end":{"line":51,"column":59}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":52,"column":41},"end":{"line":52,"column":42}},"loc":{"start":{"line":52,"column":47},"end":{"line":52,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":61,"column":48},"end":{"line":61,"column":49}},"loc":{"start":{"line":61,"column":54},"end":{"line":61,"column":79}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":43},"end":{"line":62,"column":44}},"loc":{"start":{"line":62,"column":55},"end":{"line":68,"column":5}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":40},"end":{"line":63,"column":41}},"loc":{"start":{"line":63,"column":46},"end":{"line":63,"column":58}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":72,"column":71},"end":{"line":72,"column":72}},"loc":{"start":{"line":72,"column":77},"end":{"line":72,"column":92}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":53},"end":{"line":81,"column":54}},"loc":{"start":{"line":81,"column":59},"end":{"line":81,"column":87}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":83,"column":42},"end":{"line":83,"column":43}},"loc":{"start":{"line":83,"column":48},"end":{"line":83,"column":70}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":93,"column":20},"end":{"line":93,"column":26}},"loc":{"start":{"line":104,"column":6},"end":{"line":149,"column":1}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":48},"end":{"line":118,"column":49}},"loc":{"start":{"line":118,"column":54},"end":{"line":118,"column":79}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":18},"end":{"line":13,"column":85}},"type":"binary-expr","locations":[{"start":{"line":13,"column":18},"end":{"line":13,"column":48}},{"start":{"line":13,"column":52},"end":{"line":13,"column":85}}]},"1":{"loc":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":15,"column":null}}]},"2":{"loc":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":17,"column":null}}]},"3":{"loc":{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":29,"column":null}},{"start":{"line":23,"column":7},"end":{"line":29,"column":null}}]},"4":{"loc":{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":7},"end":{"line":29,"column":null}},{"start":{"line":26,"column":7},"end":{"line":29,"column":null}}]},"5":{"loc":{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":44,"column":null}},{"start":{"line":40,"column":7},"end":{"line":44,"column":null}}]},"6":{"loc":{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":7},"end":{"line":44,"column":null}},{"start":{"line":44,"column":7},"end":{"line":44,"column":null}}]},"7":{"loc":{"start":{"line":57,"column":19},"end":{"line":59,"column":83}},"type":"binary-expr","locations":[{"start":{"line":57,"column":19},"end":{"line":57,"column":40}},{"start":{"line":59,"column":8},"end":{"line":59,"column":40}},{"start":{"line":59,"column":44},"end":{"line":59,"column":83}}]},"8":{"loc":{"start":{"line":59,"column":44},"end":{"line":59,"column":73}},"type":"cond-expr","locations":[{"start":{"line":59,"column":62},"end":{"line":59,"column":64}},{"start":{"line":59,"column":44},"end":{"line":59,"column":73}}]},"9":{"loc":{"start":{"line":59,"column":44},"end":{"line":59,"column":64}},"type":"binary-expr","locations":[{"start":{"line":59,"column":44},"end":{"line":59,"column":64}},{"start":{"line":59,"column":44},"end":{"line":59,"column":64}}]},"10":{"loc":{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":88,"column":null}},{"start":{"line":76,"column":7},"end":{"line":88,"column":null}}]},"11":{"loc":{"start":{"line":63,"column":20},"end":{"line":63,"column":69}},"type":"cond-expr","locations":[{"start":{"line":63,"column":59},"end":{"line":63,"column":61}},{"start":{"line":63,"column":23},"end":{"line":63,"column":69}}]},"12":{"loc":{"start":{"line":63,"column":20},"end":{"line":63,"column":61}},"type":"binary-expr","locations":[{"start":{"line":63,"column":20},"end":{"line":63,"column":61}},{"start":{"line":63,"column":59},"end":{"line":63,"column":61}}]},"13":{"loc":{"start":{"line":64,"column":6},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":6},"end":{"line":66,"column":null}}]},"14":{"loc":{"start":{"line":71,"column":6},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":6},"end":{"line":73,"column":null}}]},"15":{"loc":{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":4},"end":{"line":87,"column":null}},{"start":{"line":80,"column":9},"end":{"line":87,"column":null}}]},"16":{"loc":{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":146,"column":null}},{"start":{"line":109,"column":7},"end":{"line":146,"column":null}}]},"17":{"loc":{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":107,"column":null}},{"start":{"line":107,"column":9},"end":{"line":107,"column":null}}]},"18":{"loc":{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":7},"end":{"line":146,"column":null}},{"start":{"line":112,"column":7},"end":{"line":146,"column":null}}]},"19":{"loc":{"start":{"line":109,"column":11},"end":{"line":109,"column":57}},"type":"binary-expr","locations":[{"start":{"line":109,"column":11},"end":{"line":109,"column":30}},{"start":{"line":109,"column":34},"end":{"line":109,"column":57}}]},"20":{"loc":{"start":{"line":115,"column":27},"end":{"line":117,"column":64}},"type":"cond-expr","locations":[{"start":{"line":116,"column":8},"end":{"line":116,"column":10}},{"start":{"line":117,"column":8},"end":{"line":117,"column":64}}]},"21":{"loc":{"start":{"line":119,"column":28},"end":{"line":119,"column":null}},"type":"binary-expr","locations":[{"start":{"line":119,"column":28},"end":{"line":119,"column":46}},{"start":{"line":119,"column":50},"end":{"line":119,"column":108}}]},"22":{"loc":{"start":{"line":119,"column":50},"end":{"line":119,"column":108}},"type":"cond-expr","locations":[{"start":{"line":119,"column":70},"end":{"line":119,"column":73}},{"start":{"line":119,"column":50},"end":{"line":119,"column":108}}]},"23":{"loc":{"start":{"line":119,"column":50},"end":{"line":119,"column":73}},"type":"binary-expr","locations":[{"start":{"line":119,"column":50},"end":{"line":119,"column":73}},{"start":{"line":119,"column":50},"end":{"line":119,"column":73}}]},"24":{"loc":{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":4},"end":{"line":145,"column":null}},{"start":{"line":125,"column":9},"end":{"line":145,"column":null}}]},"25":{"loc":{"start":{"line":121,"column":8},"end":{"line":121,"column":94}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":26}},{"start":{"line":121,"column":30},"end":{"line":121,"column":58}},{"start":{"line":121,"column":62},"end":{"line":121,"column":94}}]},"26":{"loc":{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":9},"end":{"line":145,"column":null}},{"start":{"line":137,"column":9},"end":{"line":145,"column":null}}]},"27":{"loc":{"start":{"line":125,"column":13},"end":{"line":125,"column":93}},"type":"binary-expr","locations":[{"start":{"line":125,"column":13},"end":{"line":125,"column":35}},{"start":{"line":125,"column":40},"end":{"line":125,"column":55}},{"start":{"line":125,"column":59},"end":{"line":125,"column":93}}]}},"s":{"0":4,"1":4,"2":10,"3":10,"4":6,"5":4,"6":4,"7":0,"8":4,"9":0,"10":4,"11":2,"12":2,"13":2,"14":10,"15":4,"16":46,"17":46,"18":12,"19":34,"20":8,"21":8,"22":26,"23":46,"24":4,"25":14,"26":14,"27":14,"28":84,"29":14,"30":14,"31":14,"32":8,"33":48,"34":8,"35":8,"36":36,"37":8,"38":0,"39":8,"40":8,"41":40,"42":40,"43":132,"44":6,"45":4,"46":2,"47":12,"48":2,"49":2,"50":10,"51":2,"52":14,"53":4,"54":30,"55":2,"56":2,"57":0,"58":28,"59":2,"60":26,"61":26,"62":26,"63":106,"64":26,"65":26,"66":2,"67":24,"68":10,"69":14,"70":30,"71":4},"f":{"0":10,"1":10,"2":46,"3":14,"4":14,"5":84,"6":48,"7":8,"8":36,"9":132,"10":12,"11":10,"12":30,"13":106},"b":{"0":[10,6],"1":[6],"2":[0],"3":[0,4],"4":[2,2],"5":[12,34],"6":[8,26],"7":[14,6,6],"8":[2,4],"9":[6,6],"10":[8,6],"11":[0,8],"12":[8,8],"13":[0],"14":[40],"15":[4,2],"16":[2,28],"17":[2,0],"18":[2,26],"19":[28,4],"20":[2,24],"21":[26,22],"22":[0,22],"23":[22,22],"24":[2,24],"25":[26,22,4],"26":[10,14],"27":[24,20,10]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/options-tokenizer.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/_lib/options-tokenizer.mjs","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":64}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":26},"end":{"line":19,"column":6}},"3":{"start":{"line":5,"column":2},"end":{"line":19,"column":6}},"4":{"start":{"line":7,"column":33},"end":{"line":7,"column":45}},"5":{"start":{"line":8,"column":6},"end":{"line":16,"column":null}},"6":{"start":{"line":9,"column":22},"end":{"line":9,"column":44}},"7":{"start":{"line":10,"column":8},"end":{"line":15,"column":null}},"8":{"start":{"line":11,"column":10},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":21},"end":{"line":12,"column":29}},"10":{"start":{"line":13,"column":29},"end":{"line":13,"column":55}},"11":{"start":{"line":14,"column":10},"end":{"line":14,"column":null}},"12":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"13":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":26},"end":{"line":4,"column":38}},"loc":{"start":{"line":5,"column":2},"end":{"line":19,"column":6}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":10},"end":{"line":6,"column":11}},"loc":{"start":{"line":6,"column":16},"end":{"line":19,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":3},"end":{"line":5,"column":40}},"type":"binary-expr","locations":[{"start":{"line":5,"column":3},"end":{"line":5,"column":34}},{"start":{"line":5,"column":38},"end":{"line":5,"column":40}}]},"1":{"loc":{"start":{"line":7,"column":17},"end":{"line":7,"column":29}},"type":"default-arg","locations":[{"start":{"line":7,"column":25},"end":{"line":7,"column":29}}]},"2":{"loc":{"start":{"line":8,"column":6},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":6},"end":{"line":16,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":8},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":8},"end":{"line":15,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":32,"4":37,"5":37,"6":15,"7":15,"8":2,"9":2,"10":2,"11":2,"12":37,"13":5},"f":{"0":32,"1":37},"b":{"0":[32,2],"1":[22],"2":[15],"3":[2]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/detail.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/detail.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":10},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":12},"end":{"line":9,"column":20}},"3":{"start":{"line":11,"column":10},"end":{"line":11,"column":56}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":21}},"5":{"start":{"line":14,"column":23},"end":{"line":40,"column":1}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":22}},"7":{"start":{"line":16,"column":16},"end":{"line":16,"column":21}},"8":{"start":{"line":17,"column":20},"end":{"line":17,"column":21}},"9":{"start":{"line":18,"column":16},"end":{"line":18,"column":32}},"10":{"start":{"line":20,"column":2},"end":{"line":37,"column":null}},"11":{"start":{"line":21,"column":23},"end":{"line":21,"column":50}},"12":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"13":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"14":{"start":{"line":25,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"16":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"17":{"start":{"line":29,"column":4},"end":{"line":32,"column":null}},"18":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"19":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"20":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"21":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"22":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"23":{"start":{"line":42,"column":16},"end":{"line":65,"column":1}},"24":{"start":{"line":43,"column":17},"end":{"line":47,"column":4}},"25":{"start":{"line":49,"column":15},"end":{"line":49,"column":47}},"26":{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},"27":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"28":{"start":{"line":54,"column":21},"end":{"line":54,"column":36}},"29":{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},"30":{"start":{"line":56,"column":6},"end":{"line":56,"column":null}},"31":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"32":{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},"33":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"34":{"start":{"line":67,"column":13},"end":{"line":82,"column":1}},"35":{"start":{"line":68,"column":2},"end":{"line":72,"column":null}},"36":{"start":{"line":69,"column":27},"end":{"line":70,"column":55}},"37":{"start":{"line":69,"column":61},"end":{"line":69,"column":65}},"38":{"start":{"line":70,"column":49},"end":{"line":70,"column":53}},"39":{"start":{"line":74,"column":2},"end":{"line":81,"column":null}},"40":{"start":{"line":75,"column":25},"end":{"line":75,"column":33}},"41":{"start":{"line":77,"column":18},"end":{"line":78,"column":61}},"42":{"start":{"line":77,"column":53},"end":{"line":77,"column":70}},"43":{"start":{"line":78,"column":43},"end":{"line":78,"column":60}},"44":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"45":{"start":{"line":82,"column":1},"end":{"line":82,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":23},"end":{"line":14,"column":27}},"loc":{"start":{"line":14,"column":32},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":16},"end":{"line":42,"column":17}},"loc":{"start":{"line":42,"column":40},"end":{"line":65,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":67,"column":13},"end":{"line":67,"column":14}},"loc":{"start":{"line":67,"column":60},"end":{"line":82,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":69,"column":21},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":27},"end":{"line":70,"column":55}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":69,"column":55},"end":{"line":69,"column":56}},"loc":{"start":{"line":69,"column":61},"end":{"line":69,"column":65}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":70,"column":43},"end":{"line":70,"column":44}},"loc":{"start":{"line":70,"column":49},"end":{"line":70,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":74,"column":9},"end":{"line":74,"column":10}},"loc":{"start":{"line":74,"column":23},"end":{"line":81,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":47},"end":{"line":77,"column":48}},"loc":{"start":{"line":77,"column":53},"end":{"line":77,"column":70}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":78,"column":37},"end":{"line":78,"column":38}},"loc":{"start":{"line":78,"column":43},"end":{"line":78,"column":60}}}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":null}}]},"1":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":43}},"type":"binary-expr","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":15}},{"start":{"line":22,"column":19},"end":{"line":22,"column":43}}]},"2":{"loc":{"start":{"line":25,"column":4},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":28,"column":null}}]},"3":{"loc":{"start":{"line":29,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":32,"column":null}}]},"4":{"loc":{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":64,"column":null}},{"start":{"line":53,"column":7},"end":{"line":64,"column":null}}]},"5":{"loc":{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":4},"end":{"line":61,"column":null}},{"start":{"line":59,"column":9},"end":{"line":61,"column":null}}]},"6":{"loc":{"start":{"line":77,"column":18},"end":{"line":78,"column":61}},"type":"binary-expr","locations":[{"start":{"line":77,"column":18},"end":{"line":77,"column":71}},{"start":{"line":78,"column":7},"end":{"line":78,"column":61}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":4,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":4,"35":7,"36":4,"37":0,"38":0,"39":7,"40":0,"41":0,"42":0,"43":0,"44":0,"45":4},"f":{"0":0,"1":0,"2":7,"3":4,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0],"1":[0,0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/list.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/errors/list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":10},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":12},"end":{"line":9,"column":20}},"3":{"start":{"line":11,"column":10},"end":{"line":11,"column":42}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":39}},"5":{"start":{"line":14,"column":22},"end":{"line":14,"column":65}},"6":{"start":{"line":15,"column":18},"end":{"line":15,"column":70}},"7":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"8":{"start":{"line":16,"column":23},"end":{"line":16,"column":42}},"9":{"start":{"line":16,"column":64},"end":{"line":16,"column":73}},"10":{"start":{"line":18,"column":20},"end":{"line":19,"column":92}},"11":{"start":{"line":19,"column":3},"end":{"line":19,"column":92}},"12":{"start":{"line":19,"column":36},"end":{"line":19,"column":76}},"13":{"start":{"line":21,"column":27},"end":{"line":22,"column":98}},"14":{"start":{"line":22,"column":2},"end":{"line":22,"column":98}},"15":{"start":{"line":22,"column":19},"end":{"line":22,"column":79}},"16":{"start":{"line":24,"column":23},"end":{"line":24,"column":75}},"17":{"start":{"line":24,"column":32},"end":{"line":24,"column":75}},"18":{"start":{"line":26,"column":13},"end":{"line":43,"column":1}},"19":{"start":{"line":26,"column":43},"end":{"line":43,"column":1}},"20":{"start":{"line":27,"column":17},"end":{"line":28,"column":88}},"21":{"start":{"line":27,"column":51},"end":{"line":27,"column":89}},"22":{"start":{"line":28,"column":47},"end":{"line":28,"column":86}},"23":{"start":{"line":30,"column":2},"end":{"line":42,"column":null}},"24":{"start":{"line":43,"column":1},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":17},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":23},"end":{"line":16,"column":42}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":58},"end":{"line":16,"column":64}},"loc":{"start":{"line":16,"column":64},"end":{"line":16,"column":73}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":20},"end":{"line":18,"column":21}},"loc":{"start":{"line":19,"column":3},"end":{"line":19,"column":92}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":19,"column":36},"end":{"line":19,"column":76}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":21,"column":27},"end":{"line":21,"column":31}},"loc":{"start":{"line":22,"column":2},"end":{"line":22,"column":98}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":22,"column":12},"end":{"line":22,"column":13}},"loc":{"start":{"line":22,"column":19},"end":{"line":22,"column":79}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":24,"column":23},"end":{"line":24,"column":27}},"loc":{"start":{"line":24,"column":32},"end":{"line":24,"column":75}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":26,"column":13},"end":{"line":26,"column":14}},"loc":{"start":{"line":26,"column":43},"end":{"line":43,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":26,"column":43},"end":{"line":26,"column":44}},"loc":{"start":{"line":26,"column":57},"end":{"line":43,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":27,"column":45},"end":{"line":27,"column":46}},"loc":{"start":{"line":27,"column":51},"end":{"line":27,"column":89}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":28,"column":41},"end":{"line":28,"column":42}},"loc":{"start":{"line":28,"column":47},"end":{"line":28,"column":86}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":0,"12":0,"13":4,"14":0,"15":0,"16":4,"17":0,"18":4,"19":7,"20":0,"21":0,"22":0,"23":0,"24":4},"f":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":7,"8":0,"9":0,"10":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/add.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/add.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":19},"end":{"line":6,"column":27}},"3":{"start":{"line":8,"column":10},"end":{"line":12,"column":1}},"4":{"start":{"line":14,"column":12},"end":{"line":14,"column":20}},"5":{"start":{"line":16,"column":16},"end":{"line":21,"column":null}},"6":{"start":{"line":24,"column":10},"end":{"line":24,"column":41}},"7":{"start":{"line":26,"column":13},"end":{"line":41,"column":1}},"8":{"start":{"line":26,"column":36},"end":{"line":41,"column":1}},"9":{"start":{"line":27,"column":27},"end":{"line":27,"column":55}},"10":{"start":{"line":28,"column":23},"end":{"line":28,"column":31}},"11":{"start":{"line":30,"column":23},"end":{"line":30,"column":82}},"12":{"start":{"line":32,"column":24},"end":{"line":38,"column":4}},"13":{"start":{"line":36,"column":23},"end":{"line":36,"column":35}},"14":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"15":{"start":{"line":41,"column":1},"end":{"line":41,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":26,"column":13},"end":{"line":26,"column":14}},"loc":{"start":{"line":26,"column":36},"end":{"line":41,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":36},"end":{"line":26,"column":42}},"loc":{"start":{"line":26,"column":55},"end":{"line":41,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":17},"end":{"line":36,"column":23}},"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":35}}}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":27},"end":{"line":27,"column":55}},"type":"binary-expr","locations":[{"start":{"line":27,"column":27},"end":{"line":27,"column":49}},{"start":{"line":27,"column":53},"end":{"line":27,"column":55}}]},"1":{"loc":{"start":{"line":30,"column":23},"end":{"line":30,"column":82}},"type":"binary-expr","locations":[{"start":{"line":30,"column":23},"end":{"line":30,"column":54}},{"start":{"line":30,"column":58},"end":{"line":30,"column":82}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":15,"9":8,"10":8,"11":8,"12":8,"13":1,"14":8,"15":5},"f":{"0":15,"1":8,"2":1},"b":{"0":[8,1],"1":[8,2]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/details.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/details.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":27},"end":{"line":15,"column":1}},"3":{"start":{"line":5,"column":15},"end":{"line":9,"column":3}},"4":{"start":{"line":10,"column":17},"end":{"line":10,"column":22}},"5":{"start":{"line":12,"column":21},"end":{"line":12,"column":23}},"6":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"7":{"start":{"line":17,"column":29},"end":{"line":29,"column":3}},"8":{"start":{"line":18,"column":2},"end":{"line":29,"column":3}},"9":{"start":{"line":18,"column":25},"end":{"line":29,"column":3}},"10":{"start":{"line":19,"column":29},"end":{"line":19,"column":74}},"11":{"start":{"line":20,"column":23},"end":{"line":20,"column":40}},"12":{"start":{"line":22,"column":23},"end":{"line":22,"column":85}},"13":{"start":{"line":22,"column":62},"end":{"line":22,"column":84}},"14":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"15":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"16":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"17":{"start":{"line":31,"column":37},"end":{"line":31,"column":92}},"18":{"start":{"line":31,"column":92},"end":{"line":31,"column":null}},"19":{"start":{"line":33,"column":22},"end":{"line":33,"column":40}},"20":{"start":{"line":35,"column":10},"end":{"line":35,"column":66}},"21":{"start":{"line":37,"column":34},"end":{"line":37,"column":69}},"22":{"start":{"line":37,"column":47},"end":{"line":37,"column":69}},"23":{"start":{"line":39,"column":10},"end":{"line":39,"column":89}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":48},"end":{"line":15,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":29},"end":{"line":17,"column":30}},"loc":{"start":{"line":18,"column":2},"end":{"line":29,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":2},"end":{"line":18,"column":3}},"loc":{"start":{"line":18,"column":25},"end":{"line":29,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":25},"end":{"line":18,"column":31}},"loc":{"start":{"line":18,"column":44},"end":{"line":29,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":22,"column":45},"end":{"line":22,"column":46}},"loc":{"start":{"line":22,"column":62},"end":{"line":22,"column":84}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":37,"column":34},"end":{"line":37,"column":35}},"loc":{"start":{"line":37,"column":47},"end":{"line":37,"column":69}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":29},"end":{"line":19,"column":74}},"type":"binary-expr","locations":[{"start":{"line":19,"column":29},"end":{"line":19,"column":68}},{"start":{"line":19,"column":72},"end":{"line":19,"column":74}}]},"1":{"loc":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":25,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":15,"10":8,"11":8,"12":8,"13":7,"14":8,"15":4,"16":4,"17":5,"18":15,"19":5,"20":5,"21":5,"22":8,"23":5},"f":{"0":5,"1":5,"2":15,"3":8,"4":7,"5":8},"b":{"0":[8,2],"1":[4]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/list.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/list.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":104}},"3":{"start":{"line":7,"column":25},"end":{"line":21,"column":1}},"4":{"start":{"line":8,"column":15},"end":{"line":12,"column":3}},"5":{"start":{"line":13,"column":17},"end":{"line":13,"column":22}},"6":{"start":{"line":15,"column":21},"end":{"line":16,"column":null}},"7":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":18,"column":25},"end":{"line":18,"column":44}},"9":{"start":{"line":18,"column":69},"end":{"line":18,"column":78}},"10":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"11":{"start":{"line":23,"column":24},"end":{"line":51,"column":1}},"12":{"start":{"line":36,"column":13},"end":{"line":36,"column":51}},"13":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"14":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"15":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"16":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"17":{"start":{"line":43,"column":2},"end":{"line":45,"column":null}},"18":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"19":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"20":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"21":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"22":{"start":{"line":53,"column":20},"end":{"line":66,"column":16}},"23":{"start":{"line":53,"column":47},"end":{"line":66,"column":16}},"24":{"start":{"line":54,"column":20},"end":{"line":66,"column":4}},"25":{"start":{"line":69,"column":26},"end":{"line":83,"column":1}},"26":{"start":{"line":70,"column":2},"end":{"line":82,"column":null}},"27":{"start":{"line":70,"column":25},"end":{"line":82,"column":4}},"28":{"start":{"line":86,"column":22},"end":{"line":87,"column":52}},"29":{"start":{"line":87,"column":2},"end":{"line":87,"column":52}},"30":{"start":{"line":87,"column":18},"end":{"line":87,"column":40}},"31":{"start":{"line":90,"column":27},"end":{"line":112,"column":3}},"32":{"start":{"line":91,"column":2},"end":{"line":112,"column":3}},"33":{"start":{"line":91,"column":32},"end":{"line":112,"column":3}},"34":{"start":{"line":92,"column":29},"end":{"line":92,"column":81}},"35":{"start":{"line":94,"column":26},"end":{"line":94,"column":89}},"36":{"start":{"line":95,"column":17},"end":{"line":98,"column":43}},"37":{"start":{"line":96,"column":19},"end":{"line":96,"column":45}},"38":{"start":{"line":98,"column":8},"end":{"line":98,"column":42}},"39":{"start":{"line":99,"column":4},"end":{"line":111,"column":null}},"40":{"start":{"line":114,"column":37},"end":{"line":114,"column":90}},"41":{"start":{"line":114,"column":90},"end":{"line":114,"column":null}},"42":{"start":{"line":116,"column":10},"end":{"line":116,"column":42}},"43":{"start":{"line":118,"column":34},"end":{"line":118,"column":67}},"44":{"start":{"line":118,"column":47},"end":{"line":118,"column":67}},"45":{"start":{"line":120,"column":10},"end":{"line":120,"column":62}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":26}},"loc":{"start":{"line":7,"column":46},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":19},"end":{"line":18,"column":20}},"loc":{"start":{"line":18,"column":25},"end":{"line":18,"column":44}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":63},"end":{"line":18,"column":69}},"loc":{"start":{"line":18,"column":69},"end":{"line":18,"column":78}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":24},"end":{"line":23,"column":25}},"loc":{"start":{"line":35,"column":6},"end":{"line":51,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":21}},"loc":{"start":{"line":53,"column":47},"end":{"line":66,"column":16}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":54,"column":14},"end":{"line":54,"column":15}},"loc":{"start":{"line":54,"column":20},"end":{"line":66,"column":4}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":69,"column":26},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":45},"end":{"line":83,"column":1}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":70,"column":19},"end":{"line":70,"column":20}},"loc":{"start":{"line":70,"column":25},"end":{"line":82,"column":4}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":86,"column":22},"end":{"line":86,"column":23}},"loc":{"start":{"line":87,"column":2},"end":{"line":87,"column":52}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":87,"column":12},"end":{"line":87,"column":13}},"loc":{"start":{"line":87,"column":18},"end":{"line":87,"column":40}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":90,"column":27},"end":{"line":90,"column":28}},"loc":{"start":{"line":91,"column":2},"end":{"line":112,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":91,"column":2},"end":{"line":91,"column":3}},"loc":{"start":{"line":91,"column":32},"end":{"line":112,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":32},"end":{"line":91,"column":38}},"loc":{"start":{"line":91,"column":51},"end":{"line":112,"column":3}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":96,"column":12},"end":{"line":96,"column":13}},"loc":{"start":{"line":96,"column":19},"end":{"line":96,"column":45}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":97,"column":12},"end":{"line":97,"column":13}},"loc":{"start":{"line":98,"column":8},"end":{"line":98,"column":42}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":118,"column":34},"end":{"line":118,"column":35}},"loc":{"start":{"line":118,"column":47},"end":{"line":118,"column":67}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":26,"column":20}},"type":"default-arg","locations":[{"start":{"line":26,"column":18},"end":{"line":26,"column":20}}]},"1":{"loc":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}},"type":"default-arg","locations":[{"start":{"line":27,"column":17},"end":{"line":27,"column":19}}]},"2":{"loc":{"start":{"line":28,"column":2},"end":{"line":28,"column":21}},"type":"default-arg","locations":[{"start":{"line":28,"column":19},"end":{"line":28,"column":21}}]},"3":{"loc":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"type":"default-arg","locations":[{"start":{"line":29,"column":18},"end":{"line":29,"column":20}}]},"4":{"loc":{"start":{"line":30,"column":2},"end":{"line":30,"column":16}},"type":"default-arg","locations":[{"start":{"line":30,"column":14},"end":{"line":30,"column":16}}]},"5":{"loc":{"start":{"line":31,"column":2},"end":{"line":31,"column":15}},"type":"default-arg","locations":[{"start":{"line":31,"column":13},"end":{"line":31,"column":15}}]},"6":{"loc":{"start":{"line":33,"column":2},"end":{"line":33,"column":20}},"type":"default-arg","locations":[{"start":{"line":33,"column":18},"end":{"line":33,"column":20}}]},"7":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"type":"default-arg","locations":[{"start":{"line":34,"column":17},"end":{"line":34,"column":null}}]},"8":{"loc":{"start":{"line":37,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":39,"column":null}}]},"9":{"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":null}}]},"10":{"loc":{"start":{"line":40,"column":6},"end":{"line":40,"column":63}},"type":"binary-expr","locations":[{"start":{"line":40,"column":6},"end":{"line":40,"column":31}},{"start":{"line":40,"column":35},"end":{"line":40,"column":63}}]},"11":{"loc":{"start":{"line":41,"column":16},"end":{"line":41,"column":139}},"type":"cond-expr","locations":[{"start":{"line":41,"column":45},"end":{"line":41,"column":133}},{"start":{"line":41,"column":136},"end":{"line":41,"column":139}}]},"12":{"loc":{"start":{"line":41,"column":92},"end":{"line":41,"column":132}},"type":"cond-expr","locations":[{"start":{"line":41,"column":123},"end":{"line":41,"column":127}},{"start":{"line":41,"column":130},"end":{"line":41,"column":132}}]},"13":{"loc":{"start":{"line":41,"column":141},"end":{"line":41,"column":206}},"type":"cond-expr","locations":[{"start":{"line":41,"column":173},"end":{"line":41,"column":200}},{"start":{"line":41,"column":203},"end":{"line":41,"column":206}}]},"14":{"loc":{"start":{"line":43,"column":2},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":45,"column":null}}]},"15":{"loc":{"start":{"line":43,"column":6},"end":{"line":43,"column":53}},"type":"binary-expr","locations":[{"start":{"line":43,"column":6},"end":{"line":43,"column":29}},{"start":{"line":43,"column":33},"end":{"line":43,"column":53}}]},"16":{"loc":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":48,"column":null}}]},"17":{"loc":{"start":{"line":53,"column":23},"end":{"line":53,"column":32}},"type":"default-arg","locations":[{"start":{"line":53,"column":30},"end":{"line":53,"column":32}}]},"18":{"loc":{"start":{"line":69,"column":29},"end":{"line":69,"column":39}},"type":"default-arg","locations":[{"start":{"line":69,"column":36},"end":{"line":69,"column":39}}]},"19":{"loc":{"start":{"line":86,"column":25},"end":{"line":86,"column":35}},"type":"default-arg","locations":[{"start":{"line":86,"column":32},"end":{"line":86,"column":35}}]},"20":{"loc":{"start":{"line":92,"column":29},"end":{"line":92,"column":81}},"type":"binary-expr","locations":[{"start":{"line":92,"column":29},"end":{"line":92,"column":75}},{"start":{"line":92,"column":79},"end":{"line":92,"column":81}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":0,"10":5,"11":5,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":5,"23":0,"24":0,"25":5,"26":0,"27":0,"28":5,"29":0,"30":0,"31":5,"32":5,"33":13,"34":6,"35":6,"36":6,"37":8,"38":4,"39":6,"40":5,"41":15,"42":5,"43":5,"44":6,"45":5},"f":{"0":5,"1":5,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":5,"11":13,"12":6,"13":8,"14":4,"15":6},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0],"6":[0],"7":[0],"8":[0],"9":[0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0],"15":[0,0],"16":[0],"17":[0],"18":[0],"19":[0],"20":[6,1]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/remove.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/remove.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":27},"end":{"line":17,"column":1}},"4":{"start":{"line":6,"column":15},"end":{"line":10,"column":3}},"5":{"start":{"line":12,"column":17},"end":{"line":12,"column":25}},"6":{"start":{"line":14,"column":21},"end":{"line":14,"column":23}},"7":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"8":{"start":{"line":19,"column":29},"end":{"line":47,"column":3}},"9":{"start":{"line":20,"column":2},"end":{"line":47,"column":3}},"10":{"start":{"line":20,"column":25},"end":{"line":47,"column":3}},"11":{"start":{"line":21,"column":29},"end":{"line":21,"column":68}},"12":{"start":{"line":22,"column":23},"end":{"line":22,"column":40}},"13":{"start":{"line":24,"column":23},"end":{"line":24,"column":85}},"14":{"start":{"line":24,"column":62},"end":{"line":24,"column":84}},"15":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"16":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"17":{"start":{"line":30,"column":20},"end":{"line":30,"column":38}},"18":{"start":{"line":31,"column":25},"end":{"line":31,"column":70}},"19":{"start":{"line":34,"column":4},"end":{"line":37,"column":null}},"20":{"start":{"line":39,"column":4},"end":{"line":44,"column":null}},"21":{"start":{"line":40,"column":21},"end":{"line":40,"column":40}},"22":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"23":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"24":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"25":{"start":{"line":49,"column":37},"end":{"line":49,"column":92}},"26":{"start":{"line":49,"column":92},"end":{"line":49,"column":null}},"27":{"start":{"line":51,"column":22},"end":{"line":51,"column":40}},"28":{"start":{"line":53,"column":10},"end":{"line":53,"column":65}},"29":{"start":{"line":55,"column":34},"end":{"line":55,"column":69}},"30":{"start":{"line":55,"column":47},"end":{"line":55,"column":69}},"31":{"start":{"line":57,"column":10},"end":{"line":62,"column":2}},"32":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}},"33":{"start":{"line":61,"column":39},"end":{"line":61,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":27},"end":{"line":5,"column":28}},"loc":{"start":{"line":5,"column":48},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":20,"column":2},"end":{"line":47,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":3}},"loc":{"start":{"line":20,"column":25},"end":{"line":47,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":25},"end":{"line":20,"column":31}},"loc":{"start":{"line":20,"column":44},"end":{"line":47,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":24,"column":45},"end":{"line":24,"column":46}},"loc":{"start":{"line":24,"column":62},"end":{"line":24,"column":84}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":55,"column":34},"end":{"line":55,"column":35}},"loc":{"start":{"line":55,"column":47},"end":{"line":55,"column":69}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":60,"column":26},"end":{"line":60,"column":27}},"loc":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":61,"column":26},"end":{"line":61,"column":27}},"loc":{"start":{"line":61,"column":39},"end":{"line":61,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":null}}]},"1":{"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":44,"column":null}}]},"2":{"loc":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":43,"column":null}}]},"3":{"loc":{"start":{"line":60,"column":39},"end":{"line":60,"column":98}},"type":"binary-expr","locations":[{"start":{"line":60,"column":39},"end":{"line":60,"column":70}},{"start":{"line":60,"column":74},"end":{"line":60,"column":98}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":5,"10":12,"11":5,"12":5,"13":5,"14":6,"15":5,"16":1,"17":4,"18":4,"19":4,"20":4,"21":4,"22":4,"23":0,"24":4,"25":5,"26":15,"27":5,"28":5,"29":5,"30":5,"31":5,"32":4,"33":4},"f":{"0":5,"1":5,"2":12,"3":5,"4":6,"5":5,"6":4,"7":4},"b":{"0":[1],"1":[4],"2":[0],"3":[4,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/add-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/add-plugins.mjs","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":14,"column":19},"end":{"line":29,"column":1}},"2":{"start":{"line":15,"column":27},"end":{"line":15,"column":55}},"3":{"start":{"line":17,"column":23},"end":{"line":17,"column":82}},"4":{"start":{"line":18,"column":21},"end":{"line":18,"column":39}},"5":{"start":{"line":18,"column":27},"end":{"line":18,"column":39}},"6":{"start":{"line":20,"column":17},"end":{"line":26,"column":4}},"7":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"8":{"start":{"line":29,"column":1},"end":{"line":29,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":19},"end":{"line":14,"column":25}},"loc":{"start":{"line":14,"column":64},"end":{"line":29,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":21},"end":{"line":18,"column":27}},"loc":{"start":{"line":18,"column":27},"end":{"line":18,"column":39}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":27},"end":{"line":15,"column":55}},"type":"binary-expr","locations":[{"start":{"line":15,"column":27},"end":{"line":15,"column":49}},{"start":{"line":15,"column":53},"end":{"line":15,"column":55}}]},"1":{"loc":{"start":{"line":17,"column":23},"end":{"line":17,"column":82}},"type":"binary-expr","locations":[{"start":{"line":17,"column":23},"end":{"line":17,"column":54}},{"start":{"line":17,"column":58},"end":{"line":17,"column":82}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/error-utils.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/error-utils.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":22,"column":24},"end":{"line":111,"column":1}},"2":{"start":{"line":27,"column":4},"end":{"line":32,"column":null}},"3":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"4":{"start":{"line":54,"column":4},"end":{"line":58,"column":null}},"5":{"start":{"line":65,"column":4},"end":{"line":70,"column":null}},"6":{"start":{"line":77,"column":4},"end":{"line":83,"column":null}},"7":{"start":{"line":90,"column":4},"end":{"line":98,"column":null}},"8":{"start":{"line":105,"column":4},"end":{"line":109,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":17},"end":{"line":26,"column":18}},"loc":{"start":{"line":26,"column":44},"end":{"line":33,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":15},"end":{"line":38,"column":16}},"loc":{"start":{"line":38,"column":57},"end":{"line":48,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":53,"column":11},"end":{"line":53,"column":12}},"loc":{"start":{"line":53,"column":46},"end":{"line":59,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":12},"end":{"line":64,"column":13}},"loc":{"start":{"line":64,"column":63},"end":{"line":71,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":76,"column":15},"end":{"line":76,"column":16}},"loc":{"start":{"line":76,"column":62},"end":{"line":84,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":89,"column":18},"end":{"line":89,"column":19}},"loc":{"start":{"line":89,"column":65},"end":{"line":99,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":104,"column":13},"end":{"line":104,"column":14}},"loc":{"start":{"line":104,"column":71},"end":{"line":110,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":27},"end":{"line":26,"column":39}},"type":"default-arg","locations":[{"start":{"line":26,"column":37},"end":{"line":26,"column":39}}]},"1":{"loc":{"start":{"line":38,"column":40},"end":{"line":38,"column":52}},"type":"default-arg","locations":[{"start":{"line":38,"column":50},"end":{"line":38,"column":52}}]},"2":{"loc":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"type":"default-arg","locations":[{"start":{"line":53,"column":37},"end":{"line":53,"column":41}}]},"3":{"loc":{"start":{"line":64,"column":38},"end":{"line":64,"column":58}},"type":"default-arg","locations":[{"start":{"line":64,"column":54},"end":{"line":64,"column":58}}]},"4":{"loc":{"start":{"line":66,"column":53},"end":{"line":66,"column":110}},"type":"cond-expr","locations":[{"start":{"line":66,"column":69},"end":{"line":66,"column":90}},{"start":{"line":66,"column":93},"end":{"line":66,"column":110}}]},"5":{"loc":{"start":{"line":76,"column":25},"end":{"line":76,"column":37}},"type":"default-arg","locations":[{"start":{"line":76,"column":33},"end":{"line":76,"column":37}}]},"6":{"loc":{"start":{"line":76,"column":39},"end":{"line":76,"column":57}},"type":"default-arg","locations":[{"start":{"line":76,"column":53},"end":{"line":76,"column":57}}]},"7":{"loc":{"start":{"line":89,"column":48},"end":{"line":89,"column":60}},"type":"default-arg","locations":[{"start":{"line":89,"column":58},"end":{"line":89,"column":60}}]},"8":{"loc":{"start":{"line":104,"column":23},"end":{"line":104,"column":43}},"type":"default-arg","locations":[{"start":{"line":104,"column":39},"end":{"line":104,"column":43}}]},"9":{"loc":{"start":{"line":104,"column":45},"end":{"line":104,"column":66}},"type":"default-arg","locations":[{"start":{"line":104,"column":61},"end":{"line":104,"column":66}}]}},"s":{"0":8,"1":8,"2":4,"3":4,"4":4,"5":5,"6":4,"7":4,"8":6},"f":{"0":4,"1":4,"2":4,"3":5,"4":4,"5":4,"6":6},"b":{"0":[3],"1":[3],"2":[3],"3":[1],"4":[3,2],"5":[3],"6":[3],"7":[3],"8":[2],"9":[2]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/install-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/install-plugins.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":43}},"3":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"4":{"start":{"line":18,"column":23},"end":{"line":117,"column":1}},"5":{"start":{"line":25,"column":27},"end":{"line":25,"column":29}},"6":{"start":{"line":26,"column":20},"end":{"line":26,"column":22}},"7":{"start":{"line":29,"column":2},"end":{"line":39,"column":null}},"8":{"start":{"line":30,"column":31},"end":{"line":30,"column":81}},"9":{"start":{"line":31,"column":20},"end":{"line":31,"column":80}},"10":{"start":{"line":31,"column":59},"end":{"line":31,"column":79}},"11":{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},"12":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"13":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"14":{"start":{"line":41,"column":12},"end":{"line":41,"column":14}},"15":{"start":{"line":42,"column":15},"end":{"line":46,"column":3}},"16":{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},"17":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"19":{"start":{"line":55,"column":35},"end":{"line":58,"column":6}},"20":{"start":{"line":61,"column":4},"end":{"line":86,"column":null}},"21":{"start":{"line":62,"column":32},"end":{"line":62,"column":78}},"22":{"start":{"line":65,"column":6},"end":{"line":75,"column":null}},"23":{"start":{"line":66,"column":28},"end":{"line":66,"column":62}},"24":{"start":{"line":67,"column":25},"end":{"line":67,"column":52}},"25":{"start":{"line":69,"column":8},"end":{"line":71,"column":null}},"26":{"start":{"line":70,"column":10},"end":{"line":70,"column":null}},"27":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"28":{"start":{"line":77,"column":26},"end":{"line":82,"column":7}},"29":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"30":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"31":{"start":{"line":89,"column":4},"end":{"line":94,"column":null}},"32":{"start":{"line":90,"column":21},"end":{"line":90,"column":33}},"33":{"start":{"line":91,"column":6},"end":{"line":93,"column":null}},"34":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"35":{"start":{"line":96,"column":4},"end":{"line":96,"column":null}},"36":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"37":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"38":{"start":{"line":101,"column":4},"end":{"line":103,"column":null}},"39":{"start":{"line":102,"column":6},"end":{"line":102,"column":null}},"40":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"41":{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},"42":{"start":{"line":109,"column":6},"end":{"line":109,"column":null}},"43":{"start":{"line":112,"column":6},"end":{"line":112,"column":null}},"44":{"start":{"line":115,"column":4},"end":{"line":115,"column":null}},"45":{"start":{"line":117,"column":1},"end":{"line":117,"column":null}},"46":{"start":{"line":119,"column":21},"end":{"line":119,"column":24}},"47":{"start":{"line":121,"column":26},"end":{"line":125,"column":1}},"48":{"start":{"line":122,"column":2},"end":{"line":124,"column":null}},"49":{"start":{"line":123,"column":4},"end":{"line":123,"column":null}},"50":{"start":{"line":125,"column":1},"end":{"line":125,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":23},"end":{"line":18,"column":29}},"loc":{"start":{"line":24,"column":6},"end":{"line":117,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":42},"end":{"line":31,"column":43}},"loc":{"start":{"line":31,"column":59},"end":{"line":31,"column":79}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":121,"column":26},"end":{"line":121,"column":31}},"loc":{"start":{"line":121,"column":36},"end":{"line":125,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":null}},{"start":{"line":5,"column":43},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":38,"column":null}},{"start":{"line":36,"column":9},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":116,"column":null}},{"start":{"line":107,"column":7},"end":{"line":116,"column":null}}]},"5":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":56}},"type":"binary-expr","locations":[{"start":{"line":49,"column":4},"end":{"line":49,"column":14}},{"start":{"line":49,"column":4},"end":{"line":49,"column":14}},{"start":{"line":49,"column":4},"end":{"line":49,"column":56}}]},"6":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":52}},"type":"binary-expr","locations":[{"start":{"line":67,"column":25},"end":{"line":67,"column":46}},{"start":{"line":67,"column":50},"end":{"line":67,"column":52}}]},"7":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":46}},"type":"cond-expr","locations":[{"start":{"line":67,"column":36},"end":{"line":67,"column":38}},{"start":{"line":67,"column":25},"end":{"line":67,"column":46}}]},"8":{"loc":{"start":{"line":67,"column":25},"end":{"line":67,"column":38}},"type":"binary-expr","locations":[{"start":{"line":67,"column":25},"end":{"line":67,"column":38}},{"start":{"line":67,"column":25},"end":{"line":67,"column":38}}]},"9":{"loc":{"start":{"line":69,"column":8},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":8},"end":{"line":71,"column":null}}]},"10":{"loc":{"start":{"line":70,"column":10},"end":{"line":70,"column":131}},"type":"binary-expr","locations":[{"start":{"line":70,"column":10},"end":{"line":70,"column":20}},{"start":{"line":70,"column":10},"end":{"line":70,"column":20}},{"start":{"line":70,"column":10},"end":{"line":70,"column":131}}]},"11":{"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":99}},"type":"binary-expr","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},{"start":{"line":74,"column":8},"end":{"line":74,"column":99}}]},"12":{"loc":{"start":{"line":79,"column":27},"end":{"line":79,"column":46}},"type":"binary-expr","locations":[{"start":{"line":79,"column":27},"end":{"line":79,"column":34}},{"start":{"line":79,"column":38},"end":{"line":79,"column":46}}]},"13":{"loc":{"start":{"line":89,"column":4},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":4},"end":{"line":94,"column":null}}]},"14":{"loc":{"start":{"line":91,"column":6},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":6},"end":{"line":93,"column":null}}]},"15":{"loc":{"start":{"line":91,"column":10},"end":{"line":91,"column":22}},"type":"binary-expr","locations":[{"start":{"line":91,"column":10},"end":{"line":91,"column":18}},{"start":{"line":91,"column":10},"end":{"line":91,"column":18}},{"start":{"line":91,"column":10},"end":{"line":91,"column":22}}]},"16":{"loc":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":100,"column":null}}]},"17":{"loc":{"start":{"line":101,"column":4},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":103,"column":null}}]},"18":{"loc":{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":4},"end":{"line":113,"column":null}},{"start":{"line":111,"column":9},"end":{"line":113,"column":null}}]},"19":{"loc":{"start":{"line":122,"column":2},"end":{"line":124,"column":null}},"type":"if","locations":[{"start":{"line":122,"column":2},"end":{"line":124,"column":null}}]}},"s":{"0":9,"1":9,"2":9,"3":396,"4":9,"5":27,"6":27,"7":27,"8":35,"9":35,"10":13,"11":35,"12":6,"13":29,"14":27,"15":27,"16":27,"17":24,"18":24,"19":23,"20":22,"21":27,"22":27,"23":27,"24":26,"25":26,"26":6,"27":1,"28":27,"29":27,"30":27,"31":22,"32":22,"33":22,"34":21,"35":21,"36":21,"37":21,"38":21,"39":3,"40":21,"41":3,"42":2,"43":1,"44":3,"45":9,"46":9,"47":9,"48":3,"49":1,"50":9},"f":{"0":18,"1":27,"2":13,"3":3},"b":{"0":[18],"1":[594,594,585],"2":[288,585],"3":[6,29],"4":[24,3],"5":[24,24,24],"6":[26,3],"7":[1,25],"8":[26,26],"9":[6],"10":[6,6,6],"11":[1,1,1],"12":[27,23],"13":[22],"14":[21],"15":[22,22,22],"16":[21],"17":[3],"18":[2,1],"19":[1]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/list-plugins.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/handlers/server/plugins/_lib/list-plugins.mjs","statementMap":{"0":{"start":{"line":8,"column":20},"end":{"line":10,"column":1}},"1":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":1},"end":{"line":10,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":20},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":33},"end":{"line":10,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":9},"end":{"line":9,"column":37}},"type":"binary-expr","locations":[{"start":{"line":9,"column":9},"end":{"line":9,"column":31}},{"start":{"line":9,"column":35},"end":{"line":9,"column":37}}]}},"s":{"0":5,"1":0,"2":5},"f":{"0":0},"b":{"0":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/configurables.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/configurables.js","statementMap":{"0":{"start":{"line":4,"column":33},"end":{"line":4,"column":74}},"1":{"start":{"line":4,"column":45},"end":{"line":4,"column":74}},"2":{"start":{"line":4,"column":74},"end":{"line":4,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":33},"end":{"line":4,"column":40}},"loc":{"start":{"line":4,"column":45},"end":{"line":4,"column":74}}}},"branchMap":{},"s":{"0":4,"1":0,"2":4},"f":{"0":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/find-own-home.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/find-own-home.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":32}},"4":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"5":{"start":{"line":33,"column":20},"end":{"line":76,"column":1}},"6":{"start":{"line":34,"column":2},"end":{"line":36,"column":null}},"7":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"8":{"start":{"line":41,"column":2},"end":{"line":51,"column":null}},"9":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"10":{"start":{"line":43,"column":34},"end":{"line":43,"column":80}},"11":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"12":{"start":{"line":45,"column":6},"end":{"line":45,"column":31}},"13":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"14":{"start":{"line":54,"column":2},"end":{"line":73,"column":null}},"15":{"start":{"line":55,"column":4},"end":{"line":72,"column":null}},"16":{"start":{"line":57,"column":23},"end":{"line":57,"column":56}},"17":{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},"18":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"19":{"start":{"line":61,"column":38},"end":{"line":61,"column":84}},"20":{"start":{"line":62,"column":8},"end":{"line":64,"column":null}},"21":{"start":{"line":63,"column":10},"end":{"line":63,"column":null}},"22":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"23":{"start":{"line":71,"column":6},"end":{"line":71,"column":null}},"24":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"25":{"start":{"line":76,"column":1},"end":{"line":76,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":20},"end":{"line":33,"column":26}},"loc":{"start":{"line":33,"column":45},"end":{"line":76,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":32},"end":{"line":5,"column":null}},{"start":{"line":5,"column":32},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":null}}]},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}}]},"5":{"loc":{"start":{"line":54,"column":2},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":73,"column":null}}]},"6":{"loc":{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":68,"column":null}},{"start":{"line":66,"column":11},"end":{"line":68,"column":null}}]},"7":{"loc":{"start":{"line":62,"column":8},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":64,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":314,"5":5,"6":19,"7":3,"8":16,"9":16,"10":10,"11":10,"12":1,"13":6,"14":16,"15":7,"16":7,"17":6,"18":5,"19":5,"20":5,"21":1,"22":1,"23":3,"24":13,"25":5},"f":{"0":15,"1":19},"b":{"0":[15],"1":[448,448,438],"2":[214,438],"3":[3],"4":[1],"5":[7],"6":[5,1],"7":[1]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/get-server-settings.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/get-server-settings.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":67}},"3":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":27},"end":{"line":20,"column":1}},"5":{"start":{"line":9,"column":29},"end":{"line":9,"column":82}},"6":{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"8":{"start":{"line":14,"column":27},"end":{"line":14,"column":29}},"9":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"10":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"11":{"start":{"line":20,"column":1},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":6,"column":27},"end":{"line":6,"column":43}},"loc":{"start":{"line":6,"column":48},"end":{"line":20,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"1":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"binary-expr","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"2":{"loc":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"type":"cond-expr","locations":[{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},{"start":{"line":4,"column":67},"end":{"line":4,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":19,"column":null}},{"start":{"line":13,"column":7},"end":{"line":19,"column":null}}]},"4":{"loc":{"start":{"line":11,"column":11},"end":{"line":11,"column":46}},"type":"binary-expr","locations":[{"start":{"line":11,"column":11},"end":{"line":11,"column":40}},{"start":{"line":11,"column":44},"end":{"line":11,"column":46}}]}},"s":{"0":4,"1":4,"2":4,"3":116,"4":4,"5":14,"6":14,"7":7,"8":7,"9":7,"10":7,"11":4},"f":{"0":8,"1":14},"b":{"0":[8],"1":[144,144,140],"2":[68,140],"3":[7,7],"4":[7,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/json-helpers.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/json-helpers.mjs","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":35}},"2":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"3":{"start":{"line":4,"column":25},"end":{"line":7,"column":1}},"4":{"start":{"line":5,"column":26},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":1},"end":{"line":7,"column":null}},"7":{"start":{"line":9,"column":23},"end":{"line":24,"column":1}},"8":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"9":{"start":{"line":10,"column":28},"end":{"line":10,"column":null}},"10":{"start":{"line":12,"column":15},"end":{"line":12,"column":36}},"11":{"start":{"line":13,"column":2},"end":{"line":23,"column":null}},"12":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"13":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"14":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"15":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"16":{"start":{"line":24,"column":1},"end":{"line":24,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":4,"column":25},"end":{"line":4,"column":33}},"loc":{"start":{"line":4,"column":38},"end":{"line":7,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":23},"end":{"line":9,"column":27}},"loc":{"start":{"line":9,"column":32},"end":{"line":24,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"if","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"1":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"binary-expr","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"2":{"loc":{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},"type":"cond-expr","locations":[{"start":{"line":2,"column":35},"end":{"line":2,"column":null}},{"start":{"line":2,"column":35},"end":{"line":2,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":10,"column":null}}]},"4":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},{"start":{"line":20,"column":9},"end":{"line":22,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0],"1":[0,0,0],"2":[0,0],"3":[0],"4":[0,0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/load-plugins.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/load-plugins.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":54}},"4":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"5":{"start":{"line":10,"column":19},"end":{"line":33,"column":1}},"6":{"start":{"line":11,"column":56},"end":{"line":11,"column":59}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":99}},"8":{"start":{"line":15,"column":30},"end":{"line":15,"column":66}},"9":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}},"10":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"11":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"12":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"13":{"start":{"line":20,"column":27},"end":{"line":20,"column":null}},"14":{"start":{"line":21,"column":18},"end":{"line":21,"column":113}},"15":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"16":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"17":{"start":{"line":26,"column":2},"end":{"line":32,"column":null}},"18":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"19":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"20":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"21":{"start":{"line":41,"column":33},"end":{"line":60,"column":1}},"22":{"start":{"line":42,"column":26},"end":{"line":42,"column":63}},"23":{"start":{"line":43,"column":26},"end":{"line":43,"column":63}},"24":{"start":{"line":44,"column":22},"end":{"line":44,"column":57}},"25":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"26":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"27":{"start":{"line":49,"column":2},"end":{"line":52,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"29":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"30":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"31":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"32":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"33":{"start":{"line":58,"column":18},"end":{"line":58,"column":48}},"34":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"35":{"start":{"line":69,"column":32},"end":{"line":92,"column":1}},"36":{"start":{"line":70,"column":26},"end":{"line":70,"column":63}},"37":{"start":{"line":71,"column":26},"end":{"line":71,"column":63}},"38":{"start":{"line":72,"column":28},"end":{"line":72,"column":52}},"39":{"start":{"line":74,"column":22},"end":{"line":76,"column":3}},"40":{"start":{"line":75,"column":27},"end":{"line":75,"column":null}},"41":{"start":{"line":78,"column":2},"end":{"line":80,"column":null}},"42":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"43":{"start":{"line":81,"column":2},"end":{"line":84,"column":null}},"44":{"start":{"line":82,"column":4},"end":{"line":82,"column":null}},"45":{"start":{"line":83,"column":4},"end":{"line":83,"column":null}},"46":{"start":{"line":85,"column":2},"end":{"line":88,"column":null}},"47":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"48":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"49":{"start":{"line":90,"column":18},"end":{"line":90,"column":48}},"50":{"start":{"line":91,"column":2},"end":{"line":91,"column":null}},"51":{"start":{"line":107,"column":20},"end":{"line":161,"column":1}},"52":{"start":{"line":109,"column":22},"end":{"line":109,"column":52}},"53":{"start":{"line":112,"column":2},"end":{"line":132,"column":null}},"54":{"start":{"line":113,"column":4},"end":{"line":113,"column":null}},"55":{"start":{"line":114,"column":28},"end":{"line":114,"column":96}},"56":{"start":{"line":116,"column":4},"end":{"line":118,"column":null}},"57":{"start":{"line":120,"column":4},"end":{"line":131,"column":null}},"58":{"start":{"line":121,"column":25},"end":{"line":121,"column":40}},"59":{"start":{"line":124,"column":6},"end":{"line":127,"column":null}},"60":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"61":{"start":{"line":126,"column":8},"end":{"line":126,"column":null}},"62":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"63":{"start":{"line":130,"column":6},"end":{"line":130,"column":null}},"64":{"start":{"line":135,"column":2},"end":{"line":135,"column":null}},"65":{"start":{"line":136,"column":25},"end":{"line":136,"column":77}},"66":{"start":{"line":139,"column":21},"end":{"line":139,"column":23}},"67":{"start":{"line":140,"column":21},"end":{"line":146,"column":4}},"68":{"start":{"line":141,"column":4},"end":{"line":144,"column":null}},"69":{"start":{"line":142,"column":6},"end":{"line":142,"column":null}},"70":{"start":{"line":143,"column":6},"end":{"line":143,"column":null}},"71":{"start":{"line":145,"column":4},"end":{"line":145,"column":null}},"72":{"start":{"line":149,"column":2},"end":{"line":151,"column":null}},"73":{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},"74":{"start":{"line":153,"column":2},"end":{"line":155,"column":null}},"75":{"start":{"line":157,"column":2},"end":{"line":160,"column":null}},"76":{"start":{"line":158,"column":4},"end":{"line":158,"column":null}},"77":{"start":{"line":159,"column":4},"end":{"line":159,"column":null}},"78":{"start":{"line":161,"column":1},"end":{"line":161,"column":null}}},"fnMap":{"0":{"name":"_interopRequireWildcard","decl":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":19},"end":{"line":10,"column":25}},"loc":{"start":{"line":10,"column":81},"end":{"line":33,"column":1}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}},"loc":{"start":{"line":15,"column":30},"end":{"line":15,"column":44}}},"3":{"name":"(anonymous_6)","decl":{"start":{"line":26,"column":31},"end":{"line":26,"column":37}},"loc":{"start":{"line":26,"column":37},"end":{"line":32,"column":3}}},"4":{"name":"(anonymous_7)","decl":{"start":{"line":41,"column":33},"end":{"line":41,"column":39}},"loc":{"start":{"line":41,"column":64},"end":{"line":60,"column":1}}},"5":{"name":"(anonymous_8)","decl":{"start":{"line":69,"column":32},"end":{"line":69,"column":38}},"loc":{"start":{"line":69,"column":80},"end":{"line":92,"column":1}}},"6":{"name":"(anonymous_9)","decl":{"start":{"line":75,"column":14},"end":{"line":75,"column":27}},"loc":{"start":{"line":75,"column":27},"end":{"line":75,"column":null}}},"7":{"name":"(anonymous_10)","decl":{"start":{"line":107,"column":20},"end":{"line":107,"column":26}},"loc":{"start":{"line":107,"column":120},"end":{"line":161,"column":1}}},"8":{"name":"(anonymous_11)","decl":{"start":{"line":140,"column":43},"end":{"line":140,"column":44}},"loc":{"start":{"line":140,"column":48},"end":{"line":146,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"1":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"binary-expr","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"2":{"loc":{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},"type":"cond-expr","locations":[{"start":{"line":5,"column":54},"end":{"line":5,"column":null}},{"start":{"line":5,"column":54},"end":{"line":5,"column":null}}]},"3":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":99}},"type":"cond-expr","locations":[{"start":{"line":14,"column":29},"end":{"line":14,"column":31}},{"start":{"line":14,"column":18},"end":{"line":14,"column":99}}]},"4":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":31}},"type":"binary-expr","locations":[{"start":{"line":14,"column":18},"end":{"line":14,"column":31}},{"start":{"line":14,"column":18},"end":{"line":14,"column":31}}]},"5":{"loc":{"start":{"line":15,"column":30},"end":{"line":15,"column":66}},"type":"binary-expr","locations":[{"start":{"line":15,"column":30},"end":{"line":15,"column":60}},{"start":{"line":15,"column":64},"end":{"line":15,"column":66}}]},"6":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":null}}]},"7":{"loc":{"start":{"line":16,"column":6},"end":{"line":16,"column":51}},"type":"binary-expr","locations":[{"start":{"line":16,"column":6},"end":{"line":16,"column":28}},{"start":{"line":16,"column":32},"end":{"line":16,"column":51}}]},"8":{"loc":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":20,"column":null}}]},"9":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":113}},"type":"cond-expr","locations":[{"start":{"line":21,"column":23},"end":{"line":21,"column":26}},{"start":{"line":21,"column":18},"end":{"line":21,"column":113}}]},"10":{"loc":{"start":{"line":21,"column":18},"end":{"line":21,"column":26}},"type":"binary-expr","locations":[{"start":{"line":21,"column":18},"end":{"line":21,"column":26}},{"start":{"line":21,"column":18},"end":{"line":21,"column":26}}]},"11":{"loc":{"start":{"line":22,"column":2},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":24,"column":null}}]},"12":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":21}},"type":"cond-expr","locations":[{"start":{"line":22,"column":15},"end":{"line":22,"column":17}},{"start":{"line":22,"column":6},"end":{"line":22,"column":21}}]},"13":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":17}},"type":"binary-expr","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":17}},{"start":{"line":22,"column":15},"end":{"line":22,"column":17}}]},"14":{"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":29,"column":null}}]},"15":{"loc":{"start":{"line":46,"column":2},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":48,"column":null}}]},"16":{"loc":{"start":{"line":49,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":2},"end":{"line":52,"column":null}}]},"17":{"loc":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":56,"column":null}}]},"18":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":68}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":35}},{"start":{"line":53,"column":39},"end":{"line":53,"column":68}}]},"19":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":114}},"type":"binary-expr","locations":[{"start":{"line":54,"column":4},"end":{"line":54,"column":14}},{"start":{"line":54,"column":4},"end":{"line":54,"column":14}},{"start":{"line":54,"column":4},"end":{"line":54,"column":114}}]},"20":{"loc":{"start":{"line":75,"column":53},"end":{"line":75,"column":77}},"type":"cond-expr","locations":[{"start":{"line":75,"column":71},"end":{"line":75,"column":73}},{"start":{"line":75,"column":54},"end":{"line":75,"column":77}}]},"21":{"loc":{"start":{"line":75,"column":53},"end":{"line":75,"column":73}},"type":"binary-expr","locations":[{"start":{"line":75,"column":53},"end":{"line":75,"column":73}},{"start":{"line":75,"column":71},"end":{"line":75,"column":73}}]},"22":{"loc":{"start":{"line":78,"column":2},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":80,"column":null}}]},"23":{"loc":{"start":{"line":81,"column":2},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":84,"column":null}}]},"24":{"loc":{"start":{"line":85,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":88,"column":null}}]},"25":{"loc":{"start":{"line":85,"column":6},"end":{"line":85,"column":68}},"type":"binary-expr","locations":[{"start":{"line":85,"column":6},"end":{"line":85,"column":35}},{"start":{"line":85,"column":39},"end":{"line":85,"column":68}}]},"26":{"loc":{"start":{"line":86,"column":4},"end":{"line":86,"column":114}},"type":"binary-expr","locations":[{"start":{"line":86,"column":4},"end":{"line":86,"column":14}},{"start":{"line":86,"column":4},"end":{"line":86,"column":14}},{"start":{"line":86,"column":4},"end":{"line":86,"column":114}}]},"27":{"loc":{"start":{"line":109,"column":22},"end":{"line":109,"column":52}},"type":"binary-expr","locations":[{"start":{"line":109,"column":22},"end":{"line":109,"column":39}},{"start":{"line":109,"column":43},"end":{"line":109,"column":52}}]},"28":{"loc":{"start":{"line":112,"column":2},"end":{"line":132,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":2},"end":{"line":132,"column":null}}]},"29":{"loc":{"start":{"line":112,"column":6},"end":{"line":112,"column":29}},"type":"cond-expr","locations":[{"start":{"line":112,"column":21},"end":{"line":112,"column":23}},{"start":{"line":112,"column":6},"end":{"line":112,"column":29}}]},"30":{"loc":{"start":{"line":112,"column":6},"end":{"line":112,"column":23}},"type":"binary-expr","locations":[{"start":{"line":112,"column":6},"end":{"line":112,"column":23}},{"start":{"line":112,"column":6},"end":{"line":112,"column":23}}]},"31":{"loc":{"start":{"line":116,"column":17},"end":{"line":118,"column":59}},"type":"cond-expr","locations":[{"start":{"line":117,"column":8},"end":{"line":117,"column":36}},{"start":{"line":118,"column":9},"end":{"line":118,"column":59}}]},"32":{"loc":{"start":{"line":124,"column":6},"end":{"line":127,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":127,"column":null}}]},"33":{"loc":{"start":{"line":141,"column":4},"end":{"line":144,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":4},"end":{"line":144,"column":null}}]},"34":{"loc":{"start":{"line":149,"column":2},"end":{"line":151,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":151,"column":null}}]},"35":{"loc":{"start":{"line":153,"column":15},"end":{"line":155,"column":57}},"type":"cond-expr","locations":[{"start":{"line":154,"column":6},"end":{"line":154,"column":50}},{"start":{"line":155,"column":7},"end":{"line":155,"column":57}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":138,"5":4,"6":3,"7":3,"8":3,"9":9,"10":3,"11":0,"12":3,"13":0,"14":3,"15":3,"16":0,"17":3,"18":3,"19":3,"20":3,"21":4,"22":14,"23":14,"24":14,"25":14,"26":7,"27":14,"28":7,"29":7,"30":14,"31":7,"32":7,"33":7,"34":7,"35":4,"36":3,"37":3,"38":3,"39":3,"40":878,"41":3,"42":2,"43":3,"44":2,"45":2,"46":3,"47":1,"48":1,"49":2,"50":2,"51":4,"52":14,"53":14,"54":3,"55":3,"56":3,"57":3,"58":1,"59":1,"60":0,"61":0,"62":1,"63":1,"64":14,"65":14,"66":14,"67":14,"68":4,"69":2,"70":2,"71":2,"72":14,"73":2,"74":14,"75":14,"76":2,"77":2,"78":4},"f":{"0":11,"1":3,"2":9,"3":3,"4":14,"5":3,"6":878,"7":14,"8":4},"b":{"0":[13],"1":[154,154,147],"2":[70,147],"3":[3,0],"4":[3,3],"5":[3,0],"6":[0],"7":[3,0],"8":[0],"9":[3,0],"10":[3,3],"11":[0],"12":[3,0],"13":[3,3],"14":[3],"15":[7],"16":[7],"17":[7],"18":[14,7],"19":[7,7,7],"20":[0,878],"21":[878,878],"22":[2],"23":[2],"24":[1],"25":[3,1],"26":[1,1,1],"27":[14,0],"28":[3],"29":[11,3],"30":[14,14],"31":[2,1],"32":[0],"33":[2],"34":[2],"35":[12,2]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-resolvers.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-resolvers.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":6,"column":1}},"1":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"2":{"start":{"line":4,"column":55},"end":{"line":4,"column":62}},"3":{"start":{"line":8,"column":25},"end":{"line":8,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":32},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":38},"end":{"line":4,"column":39}},"loc":{"start":{"line":4,"column":55},"end":{"line":4,"column":62}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0,"1":0},"b":{}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-to-re.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-to-re.mjs","statementMap":{"0":{"start":{"line":8,"column":17},"end":{"line":35,"column":1}},"1":{"start":{"line":9,"column":17},"end":{"line":9,"column":20}},"2":{"start":{"line":11,"column":2},"end":{"line":30,"column":null}},"3":{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},"4":{"start":{"line":13,"column":22},"end":{"line":13,"column":38}},"5":{"start":{"line":14,"column":21},"end":{"line":14,"column":39}},"6":{"start":{"line":16,"column":6},"end":{"line":18,"column":null}},"7":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"8":{"start":{"line":20,"column":31},"end":{"line":20,"column":37}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"10":{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},"11":{"start":{"line":24,"column":23},"end":{"line":24,"column":43}},"12":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"13":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"14":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"15":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"16":{"start":{"line":35,"column":1},"end":{"line":35,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":41},"end":{"line":35,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":4},"end":{"line":29,"column":null}},{"start":{"line":23,"column":9},"end":{"line":29,"column":null}}]},"1":{"loc":{"start":{"line":16,"column":6},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":6},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":9},"end":{"line":29,"column":null}},{"start":{"line":27,"column":9},"end":{"line":29,"column":null}}]}},"s":{"0":4,"1":175,"2":175,"3":539,"4":21,"5":21,"6":21,"7":0,"8":21,"9":21,"10":518,"11":28,"12":28,"13":490,"14":175,"15":175,"16":4},"f":{"0":175},"b":{"0":[21,518],"1":[0],"2":[28,490]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-var-registry.mjs": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/path-var-registry.mjs","statementMap":{"0":{"start":{"line":13,"column":15},"end":{"line":13,"column":17}},"1":{"start":{"line":18,"column":22},"end":{"line":20,"column":1}},"2":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"3":{"start":{"line":22,"column":0},"end":{"line":22,"column":null}},"4":{"start":{"line":28,"column":24},"end":{"line":34,"column":1}},"5":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"6":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"7":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"8":{"start":{"line":36,"column":0},"end":{"line":36,"column":null}},"9":{"start":{"line":41,"column":19},"end":{"line":43,"column":1}},"10":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"11":{"start":{"line":43,"column":1},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":22},"end":{"line":18,"column":28}},"loc":{"start":{"line":18,"column":28},"end":{"line":20,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},"loc":{"start":{"line":28,"column":45},"end":{"line":34,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":19},"end":{"line":41,"column":26}},"loc":{"start":{"line":41,"column":31},"end":{"line":43,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":null}}]}},"s":{"0":4,"1":4,"2":7,"3":4,"4":4,"5":14,"6":0,"7":14,"8":4,"9":4,"10":25,"11":4},"f":{"0":7,"1":14,"2":25},"b":{"0":[0]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/register-handlers.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/register-handlers.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":10,"column":23},"end":{"line":10,"column":43}},"8":{"start":{"line":12,"column":20},"end":{"line":12,"column":39}},"9":{"start":{"line":13,"column":24},"end":{"line":13,"column":41}},"10":{"start":{"line":14,"column":25},"end":{"line":14,"column":45}},"11":{"start":{"line":15,"column":19},"end":{"line":15,"column":38}},"12":{"start":{"line":17,"column":20},"end":{"line":27,"column":1}},"13":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"14":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"15":{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},"16":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"17":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"18":{"start":{"line":32,"column":22},"end":{"line":98,"column":1}},"19":{"start":{"line":32,"column":53},"end":{"line":98,"column":1}},"20":{"start":{"line":33,"column":15},"end":{"line":33,"column":17}},"21":{"start":{"line":38,"column":2},"end":{"line":40,"column":null}},"22":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"23":{"start":{"line":42,"column":2},"end":{"line":52,"column":null}},"24":{"start":{"line":43,"column":19},"end":{"line":43,"column":21}},"25":{"start":{"line":44,"column":4},"end":{"line":49,"column":null}},"26":{"start":{"line":45,"column":6},"end":{"line":48,"column":null}},"27":{"start":{"line":46,"column":21},"end":{"line":46,"column":37}},"28":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"29":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"30":{"start":{"line":51,"column":36},"end":{"line":51,"column":54}},"31":{"start":{"line":53,"column":2},"end":{"line":53,"column":null}},"32":{"start":{"line":56,"column":17},"end":{"line":58,"column":15}},"33":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"34":{"start":{"line":59,"column":28},"end":{"line":59,"column":null}},"35":{"start":{"line":62,"column":22},"end":{"line":62,"column":63}},"36":{"start":{"line":62,"column":56},"end":{"line":62,"column":62}},"37":{"start":{"line":63,"column":20},"end":{"line":63,"column":58}},"38":{"start":{"line":64,"column":2},"end":{"line":66,"column":null}},"39":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"40":{"start":{"line":69,"column":2},"end":{"line":95,"column":null}},"41":{"start":{"line":70,"column":16},"end":{"line":70,"column":30}},"42":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"43":{"start":{"line":71,"column":29},"end":{"line":71,"column":null}},"44":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"45":{"start":{"line":73,"column":62},"end":{"line":73,"column":160}},"46":{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},"47":{"start":{"line":78,"column":6},"end":{"line":80,"column":null}},"48":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"49":{"start":{"line":81,"column":6},"end":{"line":83,"column":null}},"50":{"start":{"line":82,"column":27},"end":{"line":82,"column":49}},"51":{"start":{"line":83,"column":27},"end":{"line":83,"column":48}},"52":{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},"53":{"start":{"line":86,"column":6},"end":{"line":86,"column":null}},"54":{"start":{"line":89,"column":6},"end":{"line":91,"column":null}},"55":{"start":{"line":94,"column":4},"end":{"line":94,"column":null}},"56":{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},"57":{"start":{"line":100,"column":27},"end":{"line":138,"column":1}},"58":{"start":{"line":101,"column":22},"end":{"line":101,"column":24}},"59":{"start":{"line":104,"column":2},"end":{"line":115,"column":null}},"60":{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},"61":{"start":{"line":106,"column":6},"end":{"line":106,"column":32}},"62":{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},"63":{"start":{"line":109,"column":23},"end":{"line":109,"column":43}},"64":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"65":{"start":{"line":113,"column":6},"end":{"line":113,"column":null}},"66":{"start":{"line":118,"column":17},"end":{"line":118,"column":45}},"67":{"start":{"line":121,"column":17},"end":{"line":121,"column":37}},"68":{"start":{"line":122,"column":2},"end":{"line":127,"column":null}},"69":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"70":{"start":{"line":124,"column":6},"end":{"line":124,"column":null}},"71":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"72":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"73":{"start":{"line":130,"column":4},"end":{"line":130,"column":null}},"74":{"start":{"line":135,"column":2},"end":{"line":135,"column":null}},"75":{"start":{"line":135,"column":31},"end":{"line":135,"column":41}},"76":{"start":{"line":137,"column":2},"end":{"line":137,"column":null}},"77":{"start":{"line":143,"column":27},"end":{"line":143,"column":113}},"78":{"start":{"line":143,"column":38},"end":{"line":143,"column":113}},"79":{"start":{"line":145,"column":25},"end":{"line":293,"column":1}},"80":{"start":{"line":146,"column":2},"end":{"line":292,"column":3}},"81":{"start":{"line":147,"column":60},"end":{"line":147,"column":67}},"82":{"start":{"line":148,"column":18},"end":{"line":148,"column":42}},"83":{"start":{"line":150,"column":4},"end":{"line":154,"column":null}},"84":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}},"85":{"start":{"line":153,"column":6},"end":{"line":153,"column":null}},"86":{"start":{"line":156,"column":4},"end":{"line":158,"column":null}},"87":{"start":{"line":157,"column":6},"end":{"line":157,"column":null}},"88":{"start":{"line":159,"column":4},"end":{"line":161,"column":null}},"89":{"start":{"line":160,"column":6},"end":{"line":160,"column":null}},"90":{"start":{"line":163,"column":24},"end":{"line":163,"column":44}},"91":{"start":{"line":166,"column":24},"end":{"line":166,"column":101}},"92":{"start":{"line":168,"column":4},"end":{"line":291,"column":5}},"93":{"start":{"line":169,"column":6},"end":{"line":171,"column":null}},"94":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"95":{"start":{"line":173,"column":27},"end":{"line":177,"column":35}},"96":{"start":{"line":178,"column":6},"end":{"line":178,"column":null}},"97":{"start":{"line":180,"column":6},"end":{"line":182,"column":null}},"98":{"start":{"line":184,"column":26},"end":{"line":189,"column":7}},"99":{"start":{"line":191,"column":6},"end":{"line":194,"column":null}},"100":{"start":{"line":192,"column":8},"end":{"line":192,"column":null}},"101":{"start":{"line":193,"column":8},"end":{"line":193,"column":null}},"102":{"start":{"line":196,"column":6},"end":{"line":226,"column":null}},"103":{"start":{"line":197,"column":16},"end":{"line":197,"column":17}},"104":{"start":{"line":200,"column":27},"end":{"line":202,"column":51}},"105":{"start":{"line":204,"column":8},"end":{"line":218,"column":null}},"106":{"start":{"line":205,"column":28},"end":{"line":207,"column":36}},"107":{"start":{"line":208,"column":25},"end":{"line":208,"column":81}},"108":{"start":{"line":208,"column":60},"end":{"line":208,"column":80}},"109":{"start":{"line":209,"column":10},"end":{"line":212,"column":null}},"110":{"start":{"line":210,"column":12},"end":{"line":210,"column":null}},"111":{"start":{"line":211,"column":12},"end":{"line":211,"column":50}},"112":{"start":{"line":213,"column":10},"end":{"line":213,"column":null}},"113":{"start":{"line":214,"column":10},"end":{"line":214,"column":null}},"114":{"start":{"line":215,"column":10},"end":{"line":215,"column":null}},"115":{"start":{"line":216,"column":10},"end":{"line":216,"column":null}},"116":{"start":{"line":217,"column":10},"end":{"line":217,"column":null}},"117":{"start":{"line":220,"column":8},"end":{"line":225,"column":null}},"118":{"start":{"line":221,"column":10},"end":{"line":223,"column":null}},"119":{"start":{"line":222,"column":12},"end":{"line":222,"column":null}},"120":{"start":{"line":224,"column":10},"end":{"line":224,"column":34}},"121":{"start":{"line":229,"column":6},"end":{"line":240,"column":null}},"122":{"start":{"line":230,"column":8},"end":{"line":239,"column":null}},"123":{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},"124":{"start":{"line":232,"column":12},"end":{"line":232,"column":null}},"125":{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},"126":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"127":{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},"128":{"start":{"line":237,"column":52},"end":{"line":237,"column":92}},"129":{"start":{"line":238,"column":47},"end":{"line":238,"column":null}},"130":{"start":{"line":243,"column":6},"end":{"line":243,"column":null}},"131":{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},"132":{"start":{"line":245,"column":6},"end":{"line":255,"column":null}},"133":{"start":{"line":248,"column":8},"end":{"line":250,"column":null}},"134":{"start":{"line":253,"column":8},"end":{"line":253,"column":null}},"135":{"start":{"line":254,"column":8},"end":{"line":254,"column":null}},"136":{"start":{"line":258,"column":6},"end":{"line":258,"column":null}},"137":{"start":{"line":259,"column":6},"end":{"line":259,"column":null}},"138":{"start":{"line":260,"column":6},"end":{"line":260,"column":null}},"139":{"start":{"line":262,"column":6},"end":{"line":290,"column":7}},"140":{"start":{"line":263,"column":8},"end":{"line":265,"column":null}},"141":{"start":{"line":264,"column":10},"end":{"line":264,"column":null}},"142":{"start":{"line":267,"column":33},"end":{"line":267,"column":42}},"143":{"start":{"line":268,"column":8},"end":{"line":268,"column":null}},"144":{"start":{"line":272,"column":25},"end":{"line":272,"column":100}},"145":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}},"146":{"start":{"line":274,"column":10},"end":{"line":274,"column":112}},"147":{"start":{"line":275,"column":25},"end":{"line":275,"column":69}},"148":{"start":{"line":276,"column":8},"end":{"line":278,"column":null}},"149":{"start":{"line":280,"column":32},"end":{"line":287,"column":9}},"150":{"start":{"line":288,"column":8},"end":{"line":288,"column":null}},"151":{"start":{"line":289,"column":8},"end":{"line":289,"column":null}},"152":{"start":{"line":293,"column":1},"end":{"line":293,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":20},"end":{"line":17,"column":21}},"loc":{"start":{"line":17,"column":37},"end":{"line":27,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":22},"end":{"line":32,"column":23}},"loc":{"start":{"line":32,"column":53},"end":{"line":98,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":53},"end":{"line":32,"column":54}},"loc":{"start":{"line":32,"column":73},"end":{"line":98,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":19},"end":{"line":51,"column":20}},"loc":{"start":{"line":51,"column":34},"end":{"line":51,"column":55}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":51},"end":{"line":62,"column":52}},"loc":{"start":{"line":62,"column":56},"end":{"line":62,"column":62}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":21},"end":{"line":82,"column":22}},"loc":{"start":{"line":82,"column":27},"end":{"line":82,"column":49}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":83,"column":21},"end":{"line":83,"column":22}},"loc":{"start":{"line":83,"column":27},"end":{"line":83,"column":48}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":100,"column":27},"end":{"line":100,"column":28}},"loc":{"start":{"line":100,"column":68},"end":{"line":138,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":135,"column":25},"end":{"line":135,"column":31}},"loc":{"start":{"line":135,"column":31},"end":{"line":135,"column":41}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":143,"column":27},"end":{"line":143,"column":33}},"loc":{"start":{"line":143,"column":38},"end":{"line":143,"column":113}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":145,"column":25},"end":{"line":145,"column":26}},"loc":{"start":{"line":145,"column":92},"end":{"line":293,"column":1}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":151,"column":25},"end":{"line":151,"column":26}},"loc":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":208,"column":54},"end":{"line":208,"column":55}},"loc":{"start":{"line":208,"column":60},"end":{"line":208,"column":80}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":230,"column":36},"end":{"line":230,"column":37}},"loc":{"start":{"line":230,"column":46},"end":{"line":239,"column":9}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":272,"column":47},"end":{"line":272,"column":48}},"loc":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},{"start":{"line":21,"column":7},"end":{"line":26,"column":null}}]},"1":{"loc":{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":7},"end":{"line":26,"column":null}},{"start":{"line":24,"column":7},"end":{"line":26,"column":null}}]},"2":{"loc":{"start":{"line":32,"column":25},"end":{"line":32,"column":40}},"type":"default-arg","locations":[{"start":{"line":32,"column":38},"end":{"line":32,"column":40}}]},"3":{"loc":{"start":{"line":42,"column":2},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":52,"column":null}}]},"4":{"loc":{"start":{"line":45,"column":6},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":6},"end":{"line":48,"column":null}}]},"5":{"loc":{"start":{"line":56,"column":17},"end":{"line":58,"column":15}},"type":"cond-expr","locations":[{"start":{"line":57,"column":6},"end":{"line":57,"column":14}},{"start":{"line":58,"column":6},"end":{"line":58,"column":15}}]},"6":{"loc":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":59,"column":null}}]},"7":{"loc":{"start":{"line":62,"column":22},"end":{"line":62,"column":63}},"type":"binary-expr","locations":[{"start":{"line":62,"column":22},"end":{"line":62,"column":32}},{"start":{"line":62,"column":36},"end":{"line":62,"column":63}}]},"8":{"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":66,"column":null}}]},"9":{"loc":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":71,"column":null}}]},"10":{"loc":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":73,"column":null}}]},"11":{"loc":{"start":{"line":73,"column":8},"end":{"line":73,"column":58}},"type":"binary-expr","locations":[{"start":{"line":73,"column":8},"end":{"line":73,"column":31}},{"start":{"line":73,"column":35},"end":{"line":73,"column":58}}]},"12":{"loc":{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":92,"column":null}},{"start":{"line":85,"column":9},"end":{"line":92,"column":null}}]},"13":{"loc":{"start":{"line":78,"column":6},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":6},"end":{"line":80,"column":null}}]},"14":{"loc":{"start":{"line":81,"column":14},"end":{"line":83,"column":49}},"type":"cond-expr","locations":[{"start":{"line":82,"column":10},"end":{"line":82,"column":50}},{"start":{"line":83,"column":10},"end":{"line":83,"column":49}}]},"15":{"loc":{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":9},"end":{"line":92,"column":null}},{"start":{"line":88,"column":9},"end":{"line":92,"column":null}}]},"16":{"loc":{"start":{"line":89,"column":14},"end":{"line":91,"column":35}},"type":"cond-expr","locations":[{"start":{"line":90,"column":10},"end":{"line":90,"column":36}},{"start":{"line":91,"column":10},"end":{"line":91,"column":35}}]},"17":{"loc":{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":114,"column":null}},{"start":{"line":108,"column":9},"end":{"line":114,"column":null}}]},"18":{"loc":{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":9},"end":{"line":114,"column":null}},{"start":{"line":112,"column":9},"end":{"line":114,"column":null}}]},"19":{"loc":{"start":{"line":123,"column":4},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":125,"column":null}}]},"20":{"loc":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":129,"column":2},"end":{"line":131,"column":null}}]},"21":{"loc":{"start":{"line":148,"column":18},"end":{"line":148,"column":42}},"type":"binary-expr","locations":[{"start":{"line":148,"column":18},"end":{"line":148,"column":31}},{"start":{"line":148,"column":35},"end":{"line":148,"column":42}}]},"22":{"loc":{"start":{"line":150,"column":4},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":154,"column":null}}]},"23":{"loc":{"start":{"line":150,"column":8},"end":{"line":151,"column":96}},"type":"binary-expr","locations":[{"start":{"line":150,"column":8},"end":{"line":150,"column":37}},{"start":{"line":151,"column":13},"end":{"line":151,"column":96}}]},"24":{"loc":{"start":{"line":151,"column":31},"end":{"line":151,"column":95}},"type":"binary-expr","locations":[{"start":{"line":151,"column":31},"end":{"line":151,"column":48}},{"start":{"line":151,"column":52},"end":{"line":151,"column":70}},{"start":{"line":151,"column":74},"end":{"line":151,"column":95}}]},"25":{"loc":{"start":{"line":156,"column":4},"end":{"line":158,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":4},"end":{"line":158,"column":null}}]},"26":{"loc":{"start":{"line":156,"column":9},"end":{"line":156,"column":106}},"type":"binary-expr","locations":[{"start":{"line":156,"column":9},"end":{"line":156,"column":28}},{"start":{"line":156,"column":32},"end":{"line":156,"column":59}},{"start":{"line":156,"column":64},"end":{"line":156,"column":84}},{"start":{"line":156,"column":88},"end":{"line":156,"column":106}}]},"27":{"loc":{"start":{"line":159,"column":4},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":159,"column":4},"end":{"line":161,"column":null}}]},"28":{"loc":{"start":{"line":159,"column":8},"end":{"line":159,"column":58}},"type":"binary-expr","locations":[{"start":{"line":159,"column":8},"end":{"line":159,"column":27}},{"start":{"line":159,"column":31},"end":{"line":159,"column":58}}]},"29":{"loc":{"start":{"line":169,"column":6},"end":{"line":171,"column":null}},"type":"if","locations":[{"start":{"line":169,"column":6},"end":{"line":171,"column":null}}]},"30":{"loc":{"start":{"line":173,"column":27},"end":{"line":177,"column":35}},"type":"cond-expr","locations":[{"start":{"line":174,"column":10},"end":{"line":174,"column":14}},{"start":{"line":175,"column":10},"end":{"line":177,"column":35}}]},"31":{"loc":{"start":{"line":175,"column":10},"end":{"line":177,"column":35}},"type":"cond-expr","locations":[{"start":{"line":176,"column":12},"end":{"line":176,"column":93}},{"start":{"line":177,"column":12},"end":{"line":177,"column":35}}]},"32":{"loc":{"start":{"line":191,"column":6},"end":{"line":194,"column":null}},"type":"if","locations":[{"start":{"line":191,"column":6},"end":{"line":194,"column":null}}]},"33":{"loc":{"start":{"line":196,"column":6},"end":{"line":226,"column":null}},"type":"if","locations":[{"start":{"line":196,"column":6},"end":{"line":226,"column":null}}]},"34":{"loc":{"start":{"line":200,"column":27},"end":{"line":202,"column":51}},"type":"cond-expr","locations":[{"start":{"line":201,"column":12},"end":{"line":201,"column":39}},{"start":{"line":202,"column":12},"end":{"line":202,"column":51}}]},"35":{"loc":{"start":{"line":204,"column":32},"end":{"line":204,"column":48}},"type":"binary-expr","locations":[{"start":{"line":204,"column":32},"end":{"line":204,"column":42}},{"start":{"line":204,"column":46},"end":{"line":204,"column":48}}]},"36":{"loc":{"start":{"line":205,"column":28},"end":{"line":207,"column":36}},"type":"cond-expr","locations":[{"start":{"line":206,"column":14},"end":{"line":206,"column":36}},{"start":{"line":207,"column":14},"end":{"line":207,"column":36}}]},"37":{"loc":{"start":{"line":209,"column":10},"end":{"line":212,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":10},"end":{"line":212,"column":null}}]},"38":{"loc":{"start":{"line":221,"column":10},"end":{"line":223,"column":null}},"type":"if","locations":[{"start":{"line":221,"column":10},"end":{"line":223,"column":null}}]},"39":{"loc":{"start":{"line":221,"column":14},"end":{"line":221,"column":77}},"type":"binary-expr","locations":[{"start":{"line":221,"column":14},"end":{"line":221,"column":43}},{"start":{"line":221,"column":47},"end":{"line":221,"column":77}}]},"40":{"loc":{"start":{"line":229,"column":6},"end":{"line":240,"column":null}},"type":"if","locations":[{"start":{"line":229,"column":6},"end":{"line":240,"column":null}}]},"41":{"loc":{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":231,"column":10},"end":{"line":238,"column":null}},{"start":{"line":234,"column":15},"end":{"line":238,"column":null}}]},"42":{"loc":{"start":{"line":231,"column":14},"end":{"line":231,"column":53}},"type":"binary-expr","locations":[{"start":{"line":231,"column":14},"end":{"line":231,"column":31}},{"start":{"line":231,"column":35},"end":{"line":231,"column":53}}]},"43":{"loc":{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":234,"column":15},"end":{"line":238,"column":null}},{"start":{"line":237,"column":15},"end":{"line":238,"column":null}}]},"44":{"loc":{"start":{"line":234,"column":19},"end":{"line":234,"column":58}},"type":"binary-expr","locations":[{"start":{"line":234,"column":19},"end":{"line":234,"column":36}},{"start":{"line":234,"column":40},"end":{"line":234,"column":58}}]},"45":{"loc":{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},"type":"if","locations":[{"start":{"line":237,"column":15},"end":{"line":238,"column":null}},{"start":{"line":238,"column":47},"end":{"line":238,"column":null}}]},"46":{"loc":{"start":{"line":237,"column":59},"end":{"line":237,"column":91}},"type":"cond-expr","locations":[{"start":{"line":237,"column":85},"end":{"line":237,"column":86}},{"start":{"line":237,"column":89},"end":{"line":237,"column":91}}]},"47":{"loc":{"start":{"line":248,"column":30},"end":{"line":250,"column":48}},"type":"cond-expr","locations":[{"start":{"line":249,"column":12},"end":{"line":249,"column":62}},{"start":{"line":250,"column":12},"end":{"line":250,"column":48}}]},"48":{"loc":{"start":{"line":262,"column":6},"end":{"line":290,"column":7}},"type":"if","locations":[{"start":{"line":262,"column":6},"end":{"line":290,"column":7}}]},"49":{"loc":{"start":{"line":263,"column":8},"end":{"line":265,"column":null}},"type":"if","locations":[{"start":{"line":263,"column":8},"end":{"line":265,"column":null}}]},"50":{"loc":{"start":{"line":272,"column":53},"end":{"line":272,"column":99}},"type":"cond-expr","locations":[{"start":{"line":272,"column":73},"end":{"line":272,"column":95}},{"start":{"line":272,"column":98},"end":{"line":272,"column":99}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":0,"14":0,"15":0,"16":0,"17":0,"18":4,"19":178,"20":53,"21":53,"22":0,"23":53,"24":50,"25":50,"26":100,"27":0,"28":0,"29":50,"30":0,"31":53,"32":53,"33":53,"34":0,"35":53,"36":46,"37":53,"38":53,"39":0,"40":53,"41":46,"42":46,"43":0,"44":46,"45":0,"46":46,"47":0,"48":0,"49":0,"50":0,"51":0,"52":46,"53":0,"54":46,"55":46,"56":53,"57":4,"58":175,"59":175,"60":539,"61":21,"62":518,"63":28,"64":28,"65":490,"66":175,"67":175,"68":175,"69":539,"70":245,"71":539,"72":175,"73":0,"74":175,"75":30,"76":175,"77":4,"78":175,"79":4,"80":10,"81":94,"82":94,"83":94,"84":0,"85":0,"86":94,"87":0,"88":94,"89":0,"90":94,"91":94,"92":94,"93":94,"94":3,"95":94,"96":94,"97":94,"98":94,"99":94,"100":3,"101":3,"102":94,"103":44,"104":44,"105":44,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":44,"118":32,"119":32,"120":32,"121":94,"122":47,"123":20,"124":0,"125":20,"126":0,"127":20,"128":0,"129":20,"130":94,"131":94,"132":94,"133":94,"134":0,"135":0,"136":94,"137":94,"138":94,"139":94,"140":84,"141":0,"142":84,"143":84,"144":84,"145":308,"146":84,"147":84,"148":84,"149":84,"150":84,"151":84,"152":4},"f":{"0":0,"1":178,"2":53,"3":0,"4":46,"5":0,"6":0,"7":175,"8":30,"9":175,"10":10,"11":0,"12":0,"13":20,"14":308},"b":{"0":[0,0],"1":[0,0],"2":[3],"3":[50],"4":[0],"5":[0,53],"6":[0],"7":[53,53],"8":[0],"9":[0],"10":[0],"11":[46,0],"12":[0,46],"13":[0],"14":[0,0],"15":[0,46],"16":[0,46],"17":[21,518],"18":[28,490],"19":[245],"20":[0],"21":[94,94],"22":[0],"23":[94,0],"24":[0,0,0],"25":[0],"26":[94,0,94,94],"27":[0],"28":[94,94],"29":[3],"30":[3,91],"31":[91,0],"32":[3],"33":[44],"34":[0,44],"35":[44,44],"36":[0,0],"37":[0],"38":[32],"39":[32,32],"40":[47],"41":[0,20],"42":[20,0],"43":[0,20],"44":[20,0],"45":[0,20],"46":[0,0],"47":[3,91],"48":[84],"49":[0],"50":[21,287]}} -,"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/reporter.js": {"path":"/Users/zane/playground/liquid-labs/pluggable-express/src/lib/reporter.js","statementMap":{"0":{"start":{"line":3,"column":26},"end":{"line":9,"column":null}},"1":{"start":{"line":12,"column":14},"end":{"line":48,"column":null}},"2":{"start":{"line":16,"column":54},"end":{"line":16,"column":null}},"3":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"4":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"6":{"start":{"line":22,"column":4},"end":{"line":29,"column":null}},"7":{"start":{"line":23,"column":6},"end":{"line":28,"column":null}},"8":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"9":{"start":{"line":24,"column":40},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"11":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"12":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"13":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"14":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"15":{"start":{"line":42,"column":24},"end":{"line":42,"column":null}},"16":{"start":{"line":45,"column":21},"end":{"line":45,"column":50}},"17":{"start":{"line":47,"column":12},"end":{"line":47,"column":34}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":13}},"loc":{"start":{"line":16,"column":54},"end":{"line":30,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":25},"end":{"line":23,"column":26}},"loc":{"start":{"line":23,"column":38},"end":{"line":28,"column":7}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":11}},"loc":{"start":{"line":32,"column":26},"end":{"line":34,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":2},"end":{"line":36,"column":9}},"loc":{"start":{"line":36,"column":12},"end":{"line":38,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":2},"end":{"line":40,"column":6}},"loc":{"start":{"line":40,"column":36},"end":{"line":43,"column":null}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":6}},"loc":{"start":{"line":45,"column":19},"end":{"line":45,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":47,"column":2},"end":{"line":47,"column":7}},"loc":{"start":{"line":47,"column":10},"end":{"line":47,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":14},"end":{"line":16,"column":52}},"type":"default-arg","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":52}}]},"1":{"loc":{"start":{"line":20,"column":28},"end":{"line":20,"column":45}},"type":"binary-expr","locations":[{"start":{"line":20,"column":28},"end":{"line":20,"column":39}},{"start":{"line":20,"column":43},"end":{"line":20,"column":45}}]},"2":{"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":null}}]},"3":{"loc":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"type":"default-arg","locations":[{"start":{"line":32,"column":22},"end":{"line":32,"column":24}}]},"4":{"loc":{"start":{"line":40,"column":12},"end":{"line":40,"column":34}},"type":"default-arg","locations":[{"start":{"line":40,"column":32},"end":{"line":40,"column":34}}]},"5":{"loc":{"start":{"line":40,"column":14},"end":{"line":40,"column":28}},"type":"default-arg","locations":[{"start":{"line":40,"column":22},"end":{"line":40,"column":28}}]},"6":{"loc":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":null}}]}},"s":{"0":4,"1":4,"2":16,"3":8,"4":8,"5":8,"6":8,"7":48,"8":65,"9":65,"10":0,"11":8,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":8,"1":65,"2":8,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[8,8],"2":[65],"3":[0],"4":[0],"5":[0],"6":[0]}} -} diff --git a/qa/coverage/favicon.png b/qa/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 68.4% - Statements - 749/1095 -
- - -
- 54.62% - Branches - 295/540 -
- - -
- 57.86% - Functions - 103/178 -
- - -
- 69.53% - Lines - 696/1001 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
48.48%64/13232.69%17/5214.28%2/1449.21%63/128
src/handlers -
-
70%7/10100%0/050%1/266.66%6/9
src/handlers/help -
-
100%8/8100%0/0100%0/0100%8/8
src/handlers/help/lib -
-
23.93%28/1170%0/7014.28%3/2123.14%25/108
src/handlers/server -
-
75.36%104/13864.06%41/6484.61%11/1378.22%97/124
src/handlers/server/_lib -
-
95.34%82/8690%54/60100%16/1697.22%70/72
src/handlers/server/errors -
-
39.43%28/710%0/1125%5/2040.32%25/62
src/handlers/server/plugins -
-
85%102/12030.76%12/3975.75%25/3386.4%89/103
src/handlers/server/plugins/_lib -
-
86.11%62/7289.09%49/5578.57%11/1486.95%60/69
src/lib -
-
77.41%264/34164.55%122/18964.44%29/4579.55%253/318
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/prettify.css b/qa/coverage/prettify.css deleted file mode 100644 index b317a7cd..00000000 --- a/qa/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/qa/coverage/prettify.js b/qa/coverage/prettify.js deleted file mode 100644 index b3225238..00000000 --- a/qa/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/qa/coverage/sort-arrow-sprite.png b/qa/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/qa/coverage/sorter.js b/qa/coverage/sorter.js deleted file mode 100644 index 2bb296a8..00000000 --- a/qa/coverage/sorter.js +++ /dev/null @@ -1,196 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if ( - row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()) - ) { - row.style.display = ''; - } else { - row.style.display = 'none'; - } - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/qa/coverage/src/app.js.html b/qa/coverage/src/app.js.html deleted file mode 100644 index ea39e188..00000000 --- a/qa/coverage/src/app.js.html +++ /dev/null @@ -1,943 +0,0 @@ - - - - - - Code coverage report for src/app.js - - - - - - - - - -
-
-

All files / src app.js

-
- -
- 56.63% - Statements - 64/113 -
- - -
- 35.41% - Branches - 17/48 -
- - -
- 20% - Functions - 2/10 -
- - -
- 57.79% - Lines - 63/109 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -2874x -4x -4x -  -4x -4x -4x -  -4x -4x -4x -  -4x -4x -4x -4x -4x -276x -  -4x -4x -4x -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -7x -  -  -  -  -  -  -  -  -  -  -  -7x -  -  -7x -  -  -  -7x -  -7x -  -  -  -7x -  -  -  -  -  -  -7x -7x -7x -  -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -7x -7x -  -  -  -  -  -7x -  -  -  -  -7x -  -7x -  -  -7x -7x -7x -  -  -7x -  -7x -3x -3x -  -  -  -7x -7x -7x -  -  -7x -3x -4x -4x -  -  -  -7x -3x -  -  -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -7x -  -7x -7x -  -  -7x -7x -  -7x -  -  -  -  -  -7x -  -  -  -  -  -  -  -4x -4x -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { existsSync, readFileSync } from 'node:fs'
-import * as fs from 'node:fs/promises'
-import * as fsPath from 'node:path'
- 
-import express from 'express'
-import fileUpload from 'express-fileupload'
-import findRoot from 'find-root'
- 
-import { DependencyRunner } from '@liquid-labs/dependency-runner'
-import { readFJSON } from '@liquid-labs/federated-json'
-import { WeakCache } from '@liquid-labs/weak-cache'
- 
-import { handlers } from './handlers'
-import { findOwnHome } from './lib/find-own-home'
-import { getServerSettings } from './lib/get-server-settings'
-import { loadPlugins, registerHandlers } from './lib'
-import { clearRegistry, registerPathVar } from './lib/path-var-registry'
-import { Reporter } from './lib/reporter'
- 
-const pkgRoot = findRoot(__dirname)
-const pkgJSONContents = readFileSync(fsPath.join(pkgRoot, 'package.json'))
-const pkgJSON = JSON.parse(pkgJSONContents)
-const serverVersion = pkgJSON.version
- 
-/**
-* Initializes the express app.
-*
-* Options:
-* - `app` (opt): passed in when reloading
-* - `serverConfigRoot` (required): runtime configuration and data directory (e.g., ~/.config/comply-server). Used for settings,
-*    local configuration, and as the default dynamicPluginInstallDir.
-* - `explicitPlugins` (opt): array of NPM package names to explicitly load as plugins, regardless of whether they have
-*    the 'pluggable-endpoints' keyword. This supports transition from the previous separate plugins model. These plugins
-*    are loaded in addition to keyword-discovered plugins.
-* - `pluginPaths` (opt): additional (NPM package) directories from which to load additional plugins. This is in addition
-*    to the plugins found in the server package directory, unless `skipCorePlugins` is true. This option is primarily
-*    used for testing.
-* - `skipCorePlugins` (opt): if true, then the plugins in the server package directory are NOT loaded. This option is
-*    primarily used in conjunction with `pluginPaths` for testing.
-* - `dynamicPluginInstallDir` (opt): optional directory to install dynamically loaded plugins. If not provided, plugins
-*    are installed in the `serverConfigRoot/dynamic-plugins` directory.
-*/
-const appInit = async(initArgs) => {
-  let { app } = initArgs
-  const {
-    apiSpecPath,
-    explicitPlugins,
-    name,
-    noAPIUpdate = false,
-    pluginPaths,
-    dynamicPluginInstallDir,
-    reporter = new Reporter(),
-    serverConfigRoot = throw new Error("'serverConfigRoot' must be defined for appInit()."),
-    skipCorePlugins = false,
-    version
-  } = initArgs
- 
-  // Clear and initialize path var registry
-  clearRegistry()
- 
-  // Find the server package root (where the running server's package.json is)
-  // This is where core plugins are loaded from
-  const serverPackageRoot = await findOwnHome(process.argv[1])
- 
-  app = app || express()
- 
-  // Register core path variables
-  // Note: optionsFetcher still accesses app.ext.handlerPlugins for now
-  registerPathVar('serverPluginName', {
-    validationRe   : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)',
-    optionsFetcher : ({ app }) => {
-      return app.ext.handlerPlugins.map(({ npmName }) => npmName)
-    }
-  })
- 
-  app.use(express.json())
-  app.use(express.urlencoded({ extended : true })) // handle POST body params
-  app.use(fileUpload({ parseNested : true }))
- 
-  // setup app.ext
-  app.ext = {
-    commandPaths            : {},
-    errorsEphemeral         : [],
-    errorsRetained          : [],
-    constants               : {}, // what is this? is it used?
-    handlers                : [],
-    handlerPlugins          : [],
-    localSettings           : {},
-    name,
-    pendingHandlers         : [],
-    dynamicPluginInstallDir : dynamicPluginInstallDir || fsPath.join(serverConfigRoot, 'dynamic-plugins'),
-    serverConfigRoot,
-    serverSettings          : getServerSettings(serverConfigRoot),
-    serverVersion,
-    setupMethods            : [],
-    teardownMethods         : [],
-    version
-  }
- 
-  // drop 'local-settings.yaml', it's really for the CLI, though we do currently keep 'OTP required' there
-  const localSettingsPath = fsPath.join(serverConfigRoot, 'local-settings.yaml')
-  Iif (existsSync(localSettingsPath)) {
-    app.ext.localSettings = readFJSON(localSettingsPath)
-  }
-  // done setting app.ext
- 
-  // direct app extensions
-  app.reload = async() => {
-    app.router.stack = []
-    await appInit(Object.assign({}, initArgs, { app }))
-  }
- 
-  app.addSetupTask = (entry) => app.ext.setupMethods.push(entry)
-  // end direct app extensions
-  const cache = new WeakCache()
-  // from here on out, we need to release the cache if we run into an exception which prevents us from returning it
-  // (in which case it is the responsibility of the caller to release the cache)
-  try {
-    reporter.log('Loading core handlers...')
-    registerHandlers(app, { cache, reporter, name : 'core', npmName : '@liquid-labs/pluggable-express', handlers })
- 
-    // Track loaded plugins across all sources to prevent duplicates
-    const loadedPluginNames = new Set()
- 
-    if (skipCorePlugins !== true) {
-      reporter.log(`Loading core plugins from '${serverPackageRoot}'...`)
-      await loadPlugins(app, { cache, reporter, searchPath : serverPackageRoot, explicitPlugins, loadedPluginNames, registerPathVar })
-    }
- 
-    // Also load plugins from dynamicPluginInstallDir if it's different from serverPackageRoot
-    if (app.ext.dynamicPluginInstallDir !== serverPackageRoot) {
-      reporter.log(`Loading dynamic plugins from '${app.ext.dynamicPluginInstallDir}'...`)
-      await loadPlugins(app, { cache, reporter, searchPath : app.ext.dynamicPluginInstallDir, explicitPlugins, loadedPluginNames, registerPathVar })
-    }
- 
-    if (pluginPaths?.length > 0) {
-      for (const pluginDir of pluginPaths) {
-        reporter.log(`Loading additional plugins from '${pluginDir}'...`)
-        await loadPlugins(app, { cache, reporter, searchPath : pluginDir, explicitPlugins, loadedPluginNames, registerPathVar })
-      }
-    }
- 
-    for (const pendingHandler of app.ext.pendingHandlers) {
-      pendingHandler()
-    }
- 
-    // log errors
-    app.use((error, req, res, next) => {
-      const errors = app.ext.errorsEphemeral
-      const errorID = makeID()
-      error.liqID = errorID
-      errors.push({
-        id        : errorID,
-        message   : error.message,
-        stack     : error.stack,
-        timestamp : new Date().getTime()
-      })
-      let i = 0
-      while (errors.length > 1000 && i < errors.length) {
-        errors.shift()
-        i += 1
-      }
-      process.stderr.write(error.stack + '\n')
-      Iif (error.cause) {
-        process.stderr.write('Cause:\n' + error.cause.stack + '\n')
-      }
-      next(error)
-    })
-    // generate user response
-    app.use((error, req, res, next) => {
-      Iif (res.headersSent) return next(error)
- 
-      const status = error.status || 500
-      res.status(status)
- 
-      const errorSource = status >= 400 && status < 500
-        ? 'Client'
-        : status >= 500 && status < 600
-          ? 'Server'
-          : 'Unknown'
-      let msg = `<error>${errorSource} error ${status}: ${statusText[status]}<rst>\n\n<em>${error.message}<rst>\n\n`
-      // if the error stack isn't registered, we display it here
-      if (error.liqID === undefined && error.stack) {
-        msg += error.stack
-      }
-      else {
-        msg += 'error ref: <code>/server/errors/' + error.liqID + '<rst>'
-      }
- 
-      if (req.accepts('html')) {
-        next(error) // defer to default error handling
-      }
-      else {
-        if (req.accepts('text/terminal')) {
-          res.setHeader('content-type', 'text/terminal')
-        }
-        else {
-          msg = msg.replaceAll(/<[a-z]+>/g, '')
-          res.setHeader('content-type', 'text/plain')
-        }
-        res.send(msg)
-      }
-    })
- 
-    app.ext.serverSettings = getServerSettings(serverConfigRoot)
- 
-    const depRunner = new DependencyRunner({ runArgs : { app, cache, reporter }, waitTillComplete : true })
-    for (const setupMethod of app.ext.setupMethods) {
-      depRunner.enqueue(setupMethod)
-    }
-    depRunner.complete()
-    await depRunner.await()
- 
-    Iif (noAPIUpdate !== true) {
-      reporter.log('Registering API...')
-      const apiSpecFile = apiSpecPath || fsPath.join(serverConfigRoot, 'core-api.json')
-      await fs.writeFile(apiSpecFile, JSON.stringify(app.ext.handlers, null, '  '))
-    }
- 
-    return { app, cache }
-  }
-  catch (error) {
-    cache.release()
-    throw error
-  }
-}
- 
-// TODO: credit from stackoverflow...
-const makeID = (length = 5) => {
-  let result = ''
-  // notice no 'l' or '1'
-  const characters = 'abcdefghijkmnopqrstuvwxyz023456789'
-  const charactersLength = characters.length
-  let counter = 0
-  while (counter < length) {
-    result += characters.charAt(Math.floor(Math.random() * charactersLength))
-    counter += 1
-  }
-  return result
-}
- 
-const statusText = {
-  400 : 'BadRequest',
-  401 : 'Unauthorized',
-  402 : 'PaymentRequired',
-  403 : 'Forbidden',
-  404 : 'NotFound',
-  405 : 'MethodNotAllowed',
-  406 : 'NotAcceptable',
-  407 : 'ProxyAuthenticationRequired',
-  408 : 'RequestTimeout',
-  409 : 'Conflict',
-  410 : 'Gone',
-  411 : 'LengthRequired',
-  412 : 'PreconditionFailed',
-  413 : 'PayloadTooLarge',
-  414 : 'URITooLong',
-  415 : 'UnsupportedMediaType',
-  416 : 'RangeNotSatisfiable',
-  417 : 'ExpectationFailed',
-  418 : 'ImATeapot',
-  421 : 'MisdirectedRequest',
-  422 : 'UnprocessableEntity',
-  423 : 'Locked',
-  424 : 'FailedDependency',
-  425 : 'TooEarly',
-  426 : 'UpgradeRequired',
-  428 : 'PreconditionRequired',
-  429 : 'TooManyRequests',
-  431 : 'RequestHeaderFieldsTooLarge',
-  451 : 'UnavailableForLegalReasons',
-  500 : 'InternalServerError',
-  501 : 'NotImplemented',
-  502 : 'BadGateway',
-  503 : 'ServiceUnavailable',
-  504 : 'GatewayTimeout',
-  505 : 'HTTPVersionNotSupported',
-  506 : 'VariantAlsoNegotiates',
-  507 : 'InsufficientStorage',
-  508 : 'LoopDetected',
-  509 : 'BandwidthLimitExceeded',
-  510 : 'NotExtended',
-  511 : 'NetworkAuthenticationRequired'
-}
- 
-export { appInit }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/heartbeat.mjs.html b/qa/coverage/src/handlers/heartbeat.mjs.html deleted file mode 100644 index a76df294..00000000 --- a/qa/coverage/src/handlers/heartbeat.mjs.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for src/handlers/heartbeat.mjs - - - - - - - - - -
-
-

All files / src/handlers heartbeat.mjs

-
- -
- 70% - Statements - 7/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 1/2 -
- - -
- 66.66% - Lines - 6/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -184x -  -  -  -  -4x -4x -4x -  -7x -  -  -  -  -4x -  -  - 
const help = {
-  name    : 'server heartbeat',
-  summary : 'Endpoint to check that the server is up and listening.'
-}
- 
-const method = 'get'
-const path = ['heartbeat']
-const parameters = []
- 
-const func = ({ reporter }) => (req, res) => {
-  reporter.isolate()
-  reporter.push('heartbeat request')
-  res.json(true)
-  // res.json(app.ext.handlers)
-}
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/help.mjs.html b/qa/coverage/src/handlers/help/help.mjs.html deleted file mode 100644 index a4b50146..00000000 --- a/qa/coverage/src/handlers/help/help.mjs.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/help.mjs - - - - - - - - - -
-
-

All files / src/handlers/help help.mjs

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 8/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -264x -  -4x -  -4x -4x -4x -  -  -  -  -  -  -  -  -4x -  -4x -  -  -  -  -4x -  -  - 
import { commonOutputParams } from '@liquid-labs/liq-handlers-lib'
- 
-import { sendHelp } from './lib/send-help'
- 
-const method = 'get'
-const path = ['help']
-const parameters = [
-  {
-    name        : 'summaryOnly',
-    isBoolean   : true,
-    required    : false,
-    description : 'Displays the endpoint name, path, and summary only. Use this option for prose output and the `fields` parameter to achive a similar effect for data output.'
-  },
-  ...commonOutputParams()
-]
-Object.freeze(parameters)
- 
-const help = {
-  summary     : "To get help on a command/endpoint, you can prepend or append 'help' to the path or CLI command sequence.",
-  description : "The help system provides information about each command or endpoint. You can always get the path, basic and parameter information. Summary and description information is usually included as well. Finally, optional references may be listed.\n\nHelp is invoked by either prepending or appending 'help' to the URL or command sequence. e.g.: 'help orgs list' or 'orgs list help'. The default is for liq to retrieve help as a 'terminal' document for display in a command-line terminal with nice colored formatting. If this is causing problems, try setting `format=txt`. You can of course also use the `format` option to select markdown, or even data formats as well."
-}
- 
-const func = sendHelp({ help, method, path, parameters })
- 
-export { func, parameters, path, method }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/index.html b/qa/coverage/src/handlers/help/index.html deleted file mode 100644 index 1280d80f..00000000 --- a/qa/coverage/src/handlers/help/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/handlers/help - - - - - - - - - -
-
-

All files src/handlers/help

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 8/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
help.mjs -
-
100%8/8100%0/0100%0/0100%8/8
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html deleted file mode 100644 index 5d943a88..00000000 --- a/qa/coverage/src/handlers/help/lib/formatter-md.mjs.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib/formatter-md.mjs - - - - - - - - - -
-
-

All files / src/handlers/help/lib formatter-md.mjs

-
- -
- 12.12% - Statements - 4/33 -
- - -
- 0% - Branches - 0/25 -
- - -
- 0% - Functions - 0/5 -
- - -
- 12.9% - Lines - 4/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -594x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  - 
import { printPath } from './print-path'
- 
-const parameterCharacteristics = (p) => {
-  let output = '*' + (p.required ? 'REQUIRED' : 'OPTIONAL')
-  output += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
-  const type = p.isBoolean
-    ? 'boolean'
-    : p.isInteger
-      ? 'integer'
-      : p.isNumber
-        ? 'number'
-        : 'string'
-  output += ', ' + type + '*\n'
-  Iif (p.matcher) output += '*matcher: ' + p.matcher.toString() + '*'
- 
-  return output
-}
- 
-const mdFormatterGen = ({ nesting = 0 } = {}) => ({ name, path, summary, parameters, description, references }, title) => {
-  let output = `#${'#'.repeat(nesting)} ${title || name}\n*${printPath(path)}*\n\n`
- 
-  Iif (summary) {
-    output += summary
-  }
- 
-  Iif (parameters) {
-    output += `\n\n##${'#'.repeat(nesting)} Parameters\n`
-    parameters.reduce((output, p) => {
-      output += '- *' + p.name + '*: <br />\n'
-      output += parameterCharacteristics(p) + '\n\n'
-      output += p.description + '\n'
-      return output
-    }, output)
-  }
- 
-  Iif (description) {
-    output += `\n##${'#'.repeat(nesting)} Description\n`
-    output += description + '\n'
-  }
- 
-  Iif (references) {
-    output += `\n##${'#'.repeat(nesting)} References\n`
-    references.reduce((output, r) => {
-      if (r.url) {
-        output += `- [*${r.name}*](${r.url})` + (r.description ? `: ${r.description}` : '')
-      }
-      else {
-        output += `- *${r.name}*` + (r.description ? `: ${r.description}` : '')
-      }
- 
-      return output
-    }, output)
-  }
- 
-  return output
-}
- 
-export { mdFormatterGen }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html deleted file mode 100644 index b9e144c7..00000000 --- a/qa/coverage/src/handlers/help/lib/formatter-terminal.mjs.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib/formatter-terminal.mjs - - - - - - - - - -
-
-

All files / src/handlers/help/lib formatter-terminal.mjs

-
- -
- 11.42% - Statements - 4/35 -
- - -
- 0% - Branches - 0/22 -
- - -
- 0% - Functions - 0/6 -
- - -
- 11.76% - Lines - 4/34 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  - 
// TODO: support nesting with incrementing headers and adding indent levels
-const parameterCharacteristics = (p) => {
-  let typeInfo = '<dim>' + (p.required ? '<underline>REQUIRED<rst><dim>' : 'optional')
-  typeInfo += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
-  const type = p.isBoolean
-    ? 'boolean'
-    : p.isInteger
-      ? 'integer'
-      : p.isNumber
-        ? 'number'
-        : 'string'
-  typeInfo += ', ' + type
-  typeInfo += p.matcher ? ': ' + p.matcher.toString() : ''
- 
-  return typeInfo + '<rst>'
-}
- 
-const indent = 2
-const terminalFormatterGen = ({ nesting = 0 } = {}) => {
-  const hLvl = (base) => base + nesting
- 
-  return ({ data /* we ignore title */ }) => {
-    const { path, summary, parameters, description, references } = data
- 
-    let output = `\n<h${hLvl(1)}><bold>/${path.join('/')}<rst>\n\n`
- 
-    Iif (summary) {
-      output += summary
-    }
- 
-    Iif (parameters) {
-      output += `\n\n<h${hLvl(2)}>Parameters<rst>`
-      output += parameters.reduce((output, p) => {
-        output += '\n- <code><underline>' + p.name + '<rst>: ('
-        output += parameterCharacteristics(p, { indent }) + ') '
-        output += p.description
-        return output
-      }, '')
-      output += '\n'
-    }
- 
-    Iif (description) {
-      output += `\n<h${hLvl(2)}>Description<rst>\n`
-      output += description + '\n'
-    }
- 
-    Iif (references) {
-      output += `\n<h${hLvl(2)}>References<rst>\n`
-      references.reduce((output, r) => {
-        output += `- <em>${r.name}<rst>${r.description ? ': ' : ''}${r.description}${r.description ? ' ' : ''}${r.url}`
-        return output
-      }, output)
-    }
- 
-    output += '\n'
- 
-    return output
-  }
-}
- 
-export { terminalFormatterGen }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html b/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html deleted file mode 100644 index e971d75e..00000000 --- a/qa/coverage/src/handlers/help/lib/formatter-text.mjs.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib/formatter-text.mjs - - - - - - - - - -
-
-

All files / src/handlers/help/lib formatter-text.mjs

-
- -
- 13.33% - Statements - 4/30 -
- - -
- 0% - Branches - 0/21 -
- - -
- 0% - Functions - 0/4 -
- - -
- 13.79% - Lines - 4/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -554x -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  - 
import { printPath } from './print-path'
- 
-// TODO: support nesting with adding indent levels
-const parameterCharacteristics = (p) => {
-  let output = p.required ? 'REQUIRED' : 'OPTIONAL'
-  output += ', ' + (p.isMultivalue ? 'multi-value' : 'single value')
-  const type = p.isBoolean
-    ? 'boolean'
-    : p.isInteger
-      ? 'integer'
-      : p.isNumber
-        ? 'number'
-        : 'string'
-  output += ', ' + type + '\n'
-  Iif (p.matcher) output += 'matcher: ' + p.matcher.toString()
- 
-  return output
-}
- 
-const textFormatter = ({ name, path, summary, parameters, description, references }, title) => {
-  let output = `${title || name}\n${printPath(path)}\n\n`
- 
-  Iif (summary) {
-    output += summary
-  }
- 
-  Iif (parameters) {
-    output += '\n\nParameters'
-    parameters.reduce((output, p) => {
-      output += '\n- ' + p.name + '\n'
-      output += parameterCharacteristics(p) + '\n\n'
-      output += p.description
- 
-      return output
-    }, output)
-  }
- 
-  Iif (description) {
-    output += '\n\nDescription\n'
-    output += description
-  }
- 
-  Iif (references) {
-    output += '\n\nReferences\n'
-    references.reduce((output, r) => {
-      output += `- ${r.name}${r.description ? ': ' : ''}${r.description}${r.description ? ' ' : ''}${r.url}`
-      return output
-    }, output)
-  }
- 
-  return output
-}
- 
-export { textFormatter }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/index.html b/qa/coverage/src/handlers/help/lib/index.html deleted file mode 100644 index b11f62bd..00000000 --- a/qa/coverage/src/handlers/help/lib/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib - - - - - - - - - -
-
-

All files src/handlers/help/lib

-
- -
- 23.93% - Statements - 28/117 -
- - -
- 0% - Branches - 0/70 -
- - -
- 14.28% - Functions - 3/21 -
- - -
- 23.14% - Lines - 25/108 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
formatter-md.mjs -
-
12.12%4/330%0/250%0/512.9%4/31
formatter-terminal.mjs -
-
11.42%4/350%0/220%0/611.76%4/34
formatter-text.mjs -
-
13.33%4/300%0/210%0/413.79%4/29
print-path.mjs -
-
50%2/40%0/20%0/2100%1/1
send-help.mjs -
-
93.33%14/15100%0/075%3/492.3%12/13
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/print-path.mjs.html b/qa/coverage/src/handlers/help/lib/print-path.mjs.html deleted file mode 100644 index f34753e8..00000000 --- a/qa/coverage/src/handlers/help/lib/print-path.mjs.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib/print-path.mjs - - - - - - - - - -
-
-

All files / src/handlers/help/lib print-path.mjs

-
- -
- 50% - Statements - 2/4 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -44x -  -  - 
const printPath = (path) => '/' + (path ? path.map(p => p.replace(/[?]$/, '')).join('/') : '')
- 
-export { printPath }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/help/lib/send-help.mjs.html b/qa/coverage/src/handlers/help/lib/send-help.mjs.html deleted file mode 100644 index 824804b0..00000000 --- a/qa/coverage/src/handlers/help/lib/send-help.mjs.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for src/handlers/help/lib/send-help.mjs - - - - - - - - - -
-
-

All files / src/handlers/help/lib send-help.mjs

-
- -
- 93.33% - Statements - 14/15 -
- - -
- 100% - Branches - 0/0 -
- - -
- 75% - Functions - 3/4 -
- - -
- 92.3% - Lines - 12/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -354x -  -4x -4x -4x -  -4x -4x -  -4x -88x -122x -  -91x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -88x -4x -  -  - 
import { formatOutput } from '@liquid-labs/liq-handlers-lib'
- 
-import { mdFormatterGen } from './formatter-md'
-import { terminalFormatterGen } from './formatter-terminal'
-import { textFormatter } from './formatter-text'
- 
-const allHelpFields = ['description', 'method', 'parameters', 'path', 'references', 'summary']
-const defaultHelpFields = allHelpFields
- 
-const sendHelp = ({ help, method, path, parameters }) => {
-  const sortedParameters = [...parameters]
-  sortedParameters.sort((a, b) => a.name.localeCompare(b.name))
- 
-  const func = ({ model, reporter }) => (req, res, next) => {
-    formatOutput({
-      data              : { method, parameters : sortedParameters, path, ...help },
-      allFields         : allHelpFields,
-      defaultFields     : defaultHelpFields,
-      mdFormatter       : mdFormatterGen(),
-      terminalFormatter : terminalFormatterGen(),
-      textFormatter,
-      next,
-      noDateMark        : true,
-      reporter,
-      req,
-      res,
-      ...req.vars
-    })
-  }
- 
-  return func
-}
- 
-export { sendHelp }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/index.html b/qa/coverage/src/handlers/index.html deleted file mode 100644 index 13681cd1..00000000 --- a/qa/coverage/src/handlers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/handlers - - - - - - - - - -
-
-

All files src/handlers

-
- -
- 70% - Statements - 7/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 1/2 -
- - -
- 66.66% - Lines - 6/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
heartbeat.mjs -
-
70%7/10100%0/050%1/266.66%6/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/index.html b/qa/coverage/src/handlers/server/_lib/index.html deleted file mode 100644 index 87035589..00000000 --- a/qa/coverage/src/handlers/server/_lib/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/_lib - - - - - - - - - -
-
-

All files src/handlers/server/_lib

-
- -
- 95.34% - Statements - 82/86 -
- - -
- 90% - Branches - 54/60 -
- - -
- 100% - Functions - 16/16 -
- - -
- 97.22% - Lines - 70/72 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
next-options.mjs -
-
94.44%68/7289.09%49/55100%14/1496.55%56/58
options-tokenizer.mjs -
-
100%14/14100%5/5100%2/2100%14/14
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/next-options.mjs.html b/qa/coverage/src/handlers/server/_lib/next-options.mjs.html deleted file mode 100644 index b53c2320..00000000 --- a/qa/coverage/src/handlers/server/_lib/next-options.mjs.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/_lib/next-options.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/_lib next-options.mjs

-
- -
- 94.44% - Statements - 68/72 -
- - -
- 89.09% - Branches - 49/55 -
- - -
- 100% - Functions - 14/14 -
- - -
- 96.55% - Lines - 56/58 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -1524x -  -4x -  -  -  -  -  -  -  -  -  -10x -  -10x -4x -4x -  -  -  -  -4x -4x -2x -  -  -2x -10x -  -  -  -  -  -  -  -  -4x -46x -46x -34x -8x -8x -  -26x -  -46x -  -  -4x -  -14x -84x -  -14x -  -  -14x -  -  -14x -48x -8x -36x -8x -  -  -8x -  -  -8x -40x -132x -  -  -  -  -6x -4x -  -  -12x -2x -10x -  -2x -  -  -  -  -14x -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -30x -2x -  -  -28x -2x -  -  -  -26x -26x -  -  -106x -26x -  -26x -2x -  -  -24x -10x -  -  -  -  -  -  -  -  -  -  -  -14x -  -  -  -  -  -  -  -  -  -30x -4x -  -  - 
import { optionsTokenizer } from './options-tokenizer'
- 
-const nextOptionValueOptions = async({
-  app,
-  cache,
-  lastOptionName,
-  lastOptionParamDef,
-  lastOptionValue,
-  model,
-  prevElements,
-  req
-}) => {
-  const fetcher = lastOptionParamDef.optionsFunc || lastOptionParamDef.optionsFetcher
-  // we expect to always get a param def, otherwise the param wouldn't have been matched to get to the value
-  if (fetcher === undefined) return []
-  let possibleValues = fetcher({ app, cache, lastOptionValue, model, req, ...prevElements })
-  Iif (possibleValues.then) possibleValues = await possibleValues
-  // The completion infrastructure itself will sort the options. Additionally, this will cause a problem if the options
-  // are a static array that's been Object.frozen()
-  // possibleValues.sort()
- 
-  Iif (possibleValues.includes(lastOptionValue)) return [lastOptionValue]
-  else if (!lastOptionValue) {
-    return possibleValues
-  }
-  else {
-    const lastTokenBit = lastOptionValue.replace(/.*[=:]([^=:]*)/, '$1')
-    return possibleValues.filter((v) => v.startsWith(lastTokenBit))
-  }
-  /* else {
-    return !lastOptionValue
-      ? possibleValues // .map((v) => lastOptionName + '=' + v)
-      : possibleValues.filter((v) => v.startsWith(lastOptionValue))
-  } // .map((v) => lastOptionName + '=' + v) */
-}
- 
-const parameterOptions = ({ paramDef }) => {
-  const options = []
-  if (paramDef.isBoolean) options.push(paramDef.name)
-  else if (paramDef.canBeEmpty) {
-    options.push(paramDef.name)
-    options.push(paramDef.name + '=')
-  }
-  else options.push(paramDef.name + '=')
- 
-  return options
-}
- 
-const residualOptions = ({ command, currOptNameAndValues, lastOptionName, lastOptionParamDef, paramsSpec }) => {
-  // we are listing options (not option value options), so the options are the options not already specified
-  const currOptNames = currOptNameAndValues.map((o) => o[0])
-  const parameterNames = paramsSpec.map((p) => p.name)
- 
-  const options = []
-  // Remember 'command.endsWith("=")' is already handled.
-  // Is the command is locked in, then what params not already specified?
-  const lockedIn = command.endsWith(' ') // options always space separated; trivially locked in
-    // v if the last option is complete and a boolean, then it's done
-    || (command.endsWith(lastOptionName) && lastOptionParamDef?.isBoolean === true)
-  if (lockedIn) {
-    const residualOpts = parameterNames.filter((o) => !currOptNames.includes(o))
-    const exclusions = currOptNames.reduce((acc, o) => {
-      const excludes = paramsSpec.find((p) => p.name === o)?.excludes
-      Iif (excludes) {
-        acc.push(...excludes)
-      }
-      return acc
-    }, [])
- 
-    for (const rOpt of residualOpts) {
-      if (!exclusions.includes(rOpt)) {
-        options.push(...parameterOptions({ paramDef : paramsSpec.find((p) => p.name === rOpt) }))
-      }
-    }
-  }
-  else { // check to see if we can match the last command
-    if (lastOptionParamDef) { // matched, but not locked in
-      options.push(...parameterOptions({ paramDef : lastOptionParamDef }))
-    }
-    else { // is it a partial match?
-      const possibleOptions = parameterNames.filter((p) => p.startsWith(lastOptionName))
-      for (const possibleOpt of possibleOptions) {
-        const paramDef = paramsSpec.find((p) => p.name === possibleOpt)
-        // paramDef guaranteed because we're using parameterNames built from the spec as the key
-        options.push(...parameterOptions({ paramDef }))
-      }
-    }
-  }
- 
-  return options
-}
- 
-const nextOptions = async({
-  app,
-  cache,
-  command,
-  lastCmd,
-  model,
-  nextCommands,
-  optionString,
-  paramsSpec,
-  prevElements,
-  req
-}) => {
-  if (optionString === undefined) { // possible start of options; also there may be other commands options
-    if (command.endsWith(' ')) nextCommands.splice(0, 0, '--') // '--' always separated by ' '
-    else EnextCommands = [lastCmd]
-  }
-  else if (optionString === '' && command.endsWith(' --')) {
-    nextCommands = ['--']
-  }
-  else {
-    // Generates a list of [ name, value ] tuples
-    const currOptNameAndValues = optionsTokenizer(optionString)
-    const lastOptionName = currOptNameAndValues.length === 0
-      ? ''
-      : currOptNameAndValues[currOptNameAndValues.length - 1][0]
-    const lastOptionParamDef = paramsSpec.find((p) => p.name === lastOptionName)
-    const lastOptionValue = lastOptionParamDef && currOptNameAndValues?.[currOptNameAndValues.length - 1][1]
-    // first we check if we have a '=' and calculated options
-    if (lastOptionParamDef && lastOptionParamDef.isBoolean && command.endsWith(lastOptionName)) {
-      nextCommands = [lastOptionName]
-    }
-    // else if (command.endsWith('=') || (lastOptionValue && command.endsWith(lastOptionValue))) {
-    else if (command.match(/[=:]$/) || (lastOptionValue && command.endsWith(lastOptionValue))) {
-      nextCommands = await nextOptionValueOptions({
-        app,
-        cache,
-        lastOptionName,
-        lastOptionParamDef,
-        lastOptionValue,
-        model,
-        prevElements,
-        req
-      })
-    }
-    else {
-      nextCommands = residualOptions({
-        command,
-        currOptNameAndValues,
-        lastOptionName,
-        lastOptionParamDef,
-        paramsSpec
-      })
-    }
-  }
- 
-  return nextCommands
-}
- 
-export { nextOptions }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html b/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html deleted file mode 100644 index e53f68d3..00000000 --- a/qa/coverage/src/handlers/server/_lib/options-tokenizer.mjs.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/_lib/options-tokenizer.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/_lib options-tokenizer.mjs

-
- -
- 100% - Statements - 14/14 -
- - -
- 100% - Branches - 5/5 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 14/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -225x -5x -  -5x -32x -  -37x -37x -15x -15x -2x -2x -2x -2x -  -  -  -37x -5x -  -  - 
const paramPairRe = /[a-zA-Z0-9]+(?:=(?:'[^']*'|"[^"]*"|\S+))?/g
-const qtValueRe = /^(['"]).*\1$/
- 
-const optionsTokenizer = (optionString) =>
-  (optionString.match(paramPairRe) || [])
-    .map((p) => {
-      let [name, value = null] = p.split('=')
-      if (value !== null) {
-        const match = value.match(qtValueRe)
-        if (match) {
-          value = value.slice(1, -1)
-          const qt = match[1]
-          const deEscapeRe = new RegExp('\\' + qt, 'g')
-          value = value.replace(deEscapeRe, qt)
-        }
-      }
- 
-      return [name, value]
-    })
- 
-export { optionsTokenizer }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/api.mjs.html b/qa/coverage/src/handlers/server/api.mjs.html deleted file mode 100644 index c6b9f87c..00000000 --- a/qa/coverage/src/handlers/server/api.mjs.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/api.mjs - - - - - - - - - -
-
-

All files / src/handlers/server api.mjs

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 7/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -164x -  -  -  -  -  -4x -4x -4x -  -7x -1x -4x -  -  - 
const help = {
-  name        : 'server API',
-  summary     : 'Creates a representation of the current API.',
-  description : 'Creates a representation of the current API based on the core endpoints and currently loaded plugins. The resulting data structure is an array of "handler" entries. Each entry contains the `npmName` of the source package, the `path` (as array of path components), the `routeablePath` actually used to match paths for service, the endpoint HTTP `method`, and `parameters` data.'
-}
- 
-const method = 'get'
-const path = ['server', 'api']
-const parameters = []
- 
-const func = ({ app }) => (req, res) => {
-  res.json(app.ext.handlers)
-}
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/detail.mjs.html b/qa/coverage/src/handlers/server/errors/detail.mjs.html deleted file mode 100644 index 9c7ae8cc..00000000 --- a/qa/coverage/src/handlers/server/errors/detail.mjs.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/errors/detail.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/errors detail.mjs

-
- -
- 26.08% - Statements - 12/46 -
- - -
- 0% - Branches - 0/11 -
- - -
- 22.22% - Functions - 2/9 -
- - -
- 27.27% - Lines - 12/44 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -854x -  -4x -  -  -  -  -  -4x -  -4x -4x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -7x -4x -  -  -  -  -7x -  -  -  -  -  -  -  -4x -  -  - 
import yaml from 'js-yaml'
- 
-const help = {
-  name        : 'Detail errors',
-  summary     : 'Provides detailed information on the refenced error.',
-  description : 'Error reports are stored (temporarily) by the server and this endpoint retrieves details regarding a particular error.'
-}
- 
-const method = 'get'
-// const path = new RegExp('/orgs(?:/list)?[/#?]?$')
-const path = ['server', 'errors', ':errorKey', 'detail']
-const parameters = []
- 
-const highlightYAML = (yaml) => {
-  let highlighted = ''
-  let inBlock = false
-  let indentLevel = 0
-  const lines = yaml.split('\n')
- 
-  for (let line of lines) {
-    const currIndent = line.match(/^ */)[0].length
-    Iif (inBlock && currIndent < indentLevel) {
-      inBlock = false
-    }
-    Iif (!inBlock) {
-      line = line.replace(/^(\s*)([^:]+):/, '$1<h2>$2<rst>:')
-      line = line.replace(/(:\s*)(\d+\.?\d*|true|false|null|undefined)/i, '$1<code>$2<rst>')
-    }
-    Iif (line.match(/\|-$/)) {
-      line = line.replace(/(\|-)$/, '<em>$1<rst>')
-      inBlock = true
-    }
- 
-    highlighted += line + '\n'
- 
-    indentLevel = currIndent
-  }
- 
-  return highlighted
-}
- 
-const httpOut = ({ data, req, res }) => {
-  const format = req.accepts([
-    'application/json',
-    'text/terminal',
-    'text/plain'
-  ])
- 
-  const json = JSON.stringify(data, null, '  ')
-  if (format === 'application/json') {
-    res.type('application/json').send(json)
-  }
-  else {
-    let yamlString = yaml.dump(data)
-    if (format === 'text/terminal') {
-      res.type('text/terminal')
-      yamlString = highlightYAML(yamlString)
-    }
-    else {
-      res.type('text/plain')
-    }
- 
-    res.send(yamlString)
-  }
-}
- 
-const func = ({ app, model, reporter, registerPathVar }) => {
-  registerPathVar('errorKey', {
-    optionsFetcher : () => app.ext.errorsRetained.map((e) => e.id)
-      .concat(app.ext.errorsEphemeral.map((e) => e.id)),
-    validationRe : '[a-z0-9]{5}'
-  })
- 
-  return (req, res) => {
-    const { errorKey } = req.vars
- 
-    const error = app.ext.errorsRetained.find((e) => e.id === errorKey)
-    || app.ext.errorsEphemeral.find((e) => e.id === errorKey)
- 
-    httpOut({ data : error, req, res })
-  }
-}
- 
-export { func, help, parameters, path, method }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/index.html b/qa/coverage/src/handlers/server/errors/index.html deleted file mode 100644 index b59404e3..00000000 --- a/qa/coverage/src/handlers/server/errors/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/errors - - - - - - - - - -
-
-

All files src/handlers/server/errors

-
- -
- 39.43% - Statements - 28/71 -
- - -
- 0% - Branches - 0/11 -
- - -
- 25% - Functions - 5/20 -
- - -
- 40.32% - Lines - 25/62 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
detail.mjs -
-
26.08%12/460%0/1122.22%2/927.27%12/44
list.mjs -
-
64%16/25100%0/027.27%3/1172.22%13/18
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/errors/list.mjs.html b/qa/coverage/src/handlers/server/errors/list.mjs.html deleted file mode 100644 index 6603d27c..00000000 --- a/qa/coverage/src/handlers/server/errors/list.mjs.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/errors/list.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/errors list.mjs

-
- -
- 64% - Statements - 16/25 -
- - -
- 100% - Branches - 0/0 -
- - -
- 27.27% - Functions - 3/11 -
- - -
- 72.22% - Lines - 13/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -464x -  -4x -  -  -  -  -  -4x -  -4x -4x -  -4x -4x -4x -  -4x -  -  -4x -  -  -4x -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  - 
import { commonOutputParams, formatOutput } from '@liquid-labs/liq-handlers-lib'
- 
-const help = {
-  name        : 'List errors',
-  summary     : 'Lists known errors.',
-  description : 'The system will retain information on recent errors for a time. This endpoint lists the current known errors. Older error references may not be present.'
-}
- 
-const method = 'get'
-// const path = new RegExp('/orgs(?:/list)?[/#?]?$')
-const path = ['server', 'errors', 'list?']
-const parameters = commonOutputParams() // option func setup on 'fields' below
- 
-const defaultFields = ['id', 'message', 'protected', 'timestamp']
-const allFields = ['id', 'message', 'protected', 'stack', 'timestamp']
-parameters.find((o) => o.name === 'fields').optionsFunc = () => allFields
- 
-const mdFormatter = (orgs, title) =>
-  `# ${title}\n\n${orgs.map((e) => `- ${e.id}: ${e.message} @${e.timestamp}`).join('\n')}\n`
- 
-const terminalFormatter = (orgs) =>
-  orgs.map((e) => `- <code>${e.id}<rst>: <em>${e.message}<rst> @${e.timestamp}`).join('\n') + '\n'
- 
-const textFormatter = (orgs) => terminalFormatter.replace(/<[a-z]+>/gm, '')
- 
-const func = ({ app, model, reporter }) => (req, res) => {
-  const errors = app.ext.errorsRetained.map((e) => Object.assign({ protected : true }, e))
-    .concat(app.ext.errorsEphemeral.map((e) => Object.assign({ protected : false }, e)))
- 
-  formatOutput({
-    basicTitle : 'Error Report',
-    data       : errors,
-    allFields,
-    defaultFields,
-    mdFormatter,
-    terminalFormatter,
-    textFormatter,
-    reporter,
-    req,
-    res,
-    ...req.vars
-  })
-}
- 
-export { func, help, parameters, path, method }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/index.html b/qa/coverage/src/handlers/server/index.html deleted file mode 100644 index 7f332eaa..00000000 --- a/qa/coverage/src/handlers/server/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/handlers/server - - - - - - - - - -
-
-

All files src/handlers/server

-
- -
- 75.36% - Statements - 104/138 -
- - -
- 64.06% - Branches - 41/64 -
- - -
- 84.61% - Functions - 11/13 -
- - -
- 78.22% - Lines - 97/124 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
api.mjs -
-
100%8/8100%0/0100%2/2100%7/7
next-commands.mjs -
-
73.11%68/9361.4%35/57100%4/478.57%66/84
reload.mjs -
-
77.77%7/9100%0/050%1/275%6/8
stop.mjs -
-
50%7/140%0/150%1/246.15%6/13
version.js -
-
100%14/14100%6/6100%3/3100%12/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/next-commands.mjs.html b/qa/coverage/src/handlers/server/next-commands.mjs.html deleted file mode 100644 index 524a4af1..00000000 --- a/qa/coverage/src/handlers/server/next-commands.mjs.html +++ /dev/null @@ -1,592 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/next-commands.mjs - - - - - - - - - -
-
-

All files / src/handlers/server next-commands.mjs

-
- -
- 73.11% - Statements - 68/93 -
- - -
- 61.4% - Branches - 35/57 -
- - -
- 100% - Functions - 4/4 -
- - -
- 78.57% - Lines - 66/84 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -1704x -4x -  -4x -  -  -  -  -  -4x -4x -4x -  -  -  -  -  -  -4x -4x -  -7x -46x -46x -46x -  -46x -  -46x -46x -46x -  -  -46x -46x -46x -24x -24x -24x -  -  -22x -22x -22x -  -46x -7x -  -  -46x -  -46x -108x -108x -108x -  -108x -108x -102x -  -  -  -6x -6x -26x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -6x -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -46x -26x -  -  -40x -40x -  -64x -64x -4x -4x -4x -4x -4x -  -  -  -  -60x -30x -  -30x -30x -  -  -  -64x -  -  -40x -  -40x -40x -30x -  -  -  -  -  -  -  -  -  -  -  -10x -2x -  -  -  -46x -  -  -  -46x -  -  -  -4x -  -  - 
import { getVarDef } from '../../lib/path-var-registry'
-import { nextOptions } from './_lib/next-options'
- 
-const help = {
-  name        : 'Next commands',
-  summary     : 'Given a partial or incomplete command string, lists possible "next commands" to complete or follow the given partial.',
-  description : 'Given a partial or incomplete command string, lists possible "next commands" to complete or follow the given partial. The provided command string may be blank. This is used primarily to support the built-in shell tab-completion support, allowing the server to generate possible completions dynamically as plugins are loaded and removed.'
-}
- 
-const method = 'get'
-const path = ['server', 'next-commands']
-const parameters = [
-  {
-    name        : 'command',
-    description : "The (URL) path so far and optional '--' plus options."
-  }
-]
- 
-const CLI_STYLE = ' '
-const URL_STYLE = '/'
- 
-const func = ({ app, cache }) => async(req, res) => {
-  try {
-    const format = req.accepts(['json', 'text'])
-    const { command = '/' } = req.query
- 
-    const [commandPath, optionString] = command.split(/\s*--\s*/)
- 
-    let frontier = app.ext.commandPaths
-    const cmdsWalked = []
-    const prevElements = {}
-    let cmdSep
-    let cmdsLeft
-    const firstSpace = commandPath.indexOf(' ')
-    const firstSlash = commandPath.indexOf('/')
-    if (commandPath.indexOf('/') === -1 || (firstSpace !== -1 && firstSpace < firstSlash)) { // then it's the CLI form
-      cmdSep = CLI_STYLE
-      cmdsLeft = commandPath.split(/\s+/)
-      cmdsLeft.shift() // drop the leading cli command that we see in this form
-    }
-    else { // command is in URL form
-      cmdSep = URL_STYLE
-      cmdsLeft = commandPath.split('/')
-      cmdsLeft.shift() // drop '' from leading '/'
-    }
-    if (cmdsLeft[cmdsLeft.length - 1]?.match(/^\s*$/)) { // TODO: this may not be necessary
-      cmdsLeft.pop()
-    }
- 
-    let unmatchedFinalCommand = null
-    let finalOptions
-    while (cmdsLeft.length > 0) {
-      finalOptions = []
-      const commandBit = cmdsLeft.shift().replace(/\s+$/, '')
-      Iif (commandBit === '') break // TODO: ???
- 
-      cmdsWalked.push(commandBit)
-      if (commandBit in frontier) {
-        frontier = frontier[commandBit]
-      }
-      else { // the frontier says ':orgKey' and we have 'orgA' or whatever
-      // TODO: document: you may only have one variable option element at any particular node in the tree
-        let foundVariablePathElement = null
-        for (const fKey of Object.keys(frontier)) {
-          Iif (fKey.startsWith(':')) {
-            /* We're going to try and relax this rule
-            if (foundVariablePathElement !== null) {
-              throw new Error(`Illegal multiple variable path branch possibilities: ${cmdsWalked.join(cmdSep)}${cmdSep}(${foundVariablePathElement}|${fKey})`)
-            } */
-            foundVariablePathElement = fKey
-            const typeKey = fKey.slice(1)
-            prevElements[typeKey] = commandBit // save the value of the variable
-            const elementConfig = getVarDef(typeKey)
-            const { validationRe, optionsFetcher } = elementConfig
-            let myOptions = optionsFetcher({ app, cache, currToken : commandBit, ...prevElements })
-            Iif (myOptions?.then) myOptions = await myOptions
-            Iif (myOptions?.length > 0) finalOptions.push(...myOptions)
- 
-            if (validationRe
-                && commandBit.match(new RegExp('^' + validationRe + '$'))
-                && finalOptions.includes(commandBit)) {
-              frontier = frontier[fKey]
-              break // there may be other possibilities, but once we have a match, we move on.
-            }
-            else {
-              foundVariablePathElement = null
-            }
-          }
-        }
- 
-        if (foundVariablePathElement === null) {
-          if (cmdsLeft.length === 0) {
-            unmatchedFinalCommand = commandBit
-          }
-          else E{ // we don't have anything for an unmatched middle command
-            switch (format) {
-            case 'text':
-              res.type('txt').send(); break
-            default: // json
-              res.json([])
-            }
-            return
-          }
-        }
-      }
-    }
- 
-    let nextCommands
-    if (unmatchedFinalCommand && command.endsWith(unmatchedFinalCommand)) {
-      nextCommands = Object.keys(frontier).concat(finalOptions).filter((k) => k.startsWith(unmatchedFinalCommand))
-    }
-    else {
-      let maybeOptions = false
-      nextCommands = await Object.keys(frontier)
-        .reduce(async(acc, k) => {
-          acc = await acc
-          if (k.startsWith(':')) {
-            const elementConfig = getVarDef(k.slice(1)) // this should already be validated
-            const { optionsFetcher } = elementConfig
-            let fOpts = optionsFetcher({ app, cache, currToken : '', req, ...prevElements })
-            Iif (fOpts?.then) fOpts = await fOpts
-            acc.push(...fOpts)
-          // acc.push(...optionsFetcher({ currToken: '', ...prevElements }))
-          }
-          // the blank happens because the root command is '', but it doesn't make sense to reflect it back
-          // '_' vars are either hidden (if actually options) or internal vars
-          else if (k !== '' && !k.startsWith('_')) {
-            acc.push(k)
-          }
-          else if (k === '_parameters') {
-            maybeOptions = true
-          }
-          // else it's '' or a '_' var that isn't _parameters
- 
-          return acc
-        }, [])
-      // TODO: v is that necessary? Doesn't '_parameters' occur on it's own?
-      nextCommands.sort() // nice, and also puts '_parameters' first (remmember, we require unique paths, so there is only ever one)
- 
-      const lastCmd = cmdsWalked.length === 0 ? '' : cmdsWalked[cmdsWalked.length - 1]
-      if (maybeOptions === true) {
-        nextCommands = await nextOptions({
-          app,
-          cache,
-          command,
-          lastCmd,
-          nextCommands,
-          optionString,
-          paramsSpec : frontier._parameters(),
-          prevElements,
-          req
-        })
-      }
-      else if (!command.endsWith(cmdSep) && cmdsWalked.length > 0) {
-        nextCommands = [cmdsWalked.pop()]
-      }
-    }
- 
-    switch (format) {
-    case 'text':
-      res.type('txt').send(nextCommands.join('\n')); break
-    default: // json
-      res.json(nextCommands)
-    }
-  }
-  catch (e) { console.error(e); throw e }
-}
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html deleted file mode 100644 index 2e9ff3ce..00000000 --- a/qa/coverage/src/handlers/server/plugins/_lib/add-plugins.mjs.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/_lib/add-plugins.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins/_lib add-plugins.mjs

-
- -
- 0% - Statements - 0/9 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// Import the installPlugins function from the local library
-import { installPlugins } from './install-plugins'
- 
-/**
- * Adds plugins to the server.
- *
- * @param {Object} options
- * @param {Object} options.app - The Express app object
- * @param {Object} options.cache - Cache object
- * @param {Array<string>} options.packages - Array of NPM package names to install
- * @param {Object} options.reporter - Reporter for logging
- * @returns {Promise<Object>} Result object with installation details
- */
-const addPlugins = async({ app, cache, packages, reporter }) => {
-  const installedPlugins = app.ext.handlerPlugins || []
-  // Use dynamicPluginInstallDir if provided, otherwise use current working directory
-  const pluginPkgDir = app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot
-  const reloadFunc = () => app.reload()
- 
-  const result = await installPlugins({
-    installedPlugins,
-    npmNames : packages,
-    pluginPkgDir,
-    reloadFunc,
-    reporter
-  })
- 
-  return result
-}
- 
-export { addPlugins }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html deleted file mode 100644 index 3d9c2fba..00000000 --- a/qa/coverage/src/handlers/server/plugins/_lib/error-utils.mjs.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/_lib/error-utils.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins/_lib error-utils.mjs

-
- -
- 100% - Statements - 9/9 -
- - -
- 100% - Branches - 11/11 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 9/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -1128x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -8x -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -  -  -  -  - 
import createError from 'http-errors'
- 
-/**
- * Standardized error creation utilities for the plugin system
- *
- * Error Types:
- * - INVALID_INPUT (400): User provided invalid input
- * - VALIDATION_ERROR (400): Specific field validation failed
- * - ACCESS_ERROR (403): Permission/access issues
- * - PARSING_ERROR (400): File parsing failures
- * - DEPENDENCY_ERROR (400): Circular or invalid dependencies
- * - RESOURCE_LIMIT_ERROR (400): DoS prevention limits hit
- * - INTERNAL_ERROR (500): Unexpected server issues
- *
- * All errors include:
- * - Consistent HTTP status codes
- * - Proper exposure settings for security
- * - Structured error details for API consumers
- * - Type field for programmatic handling
- */
- 
-export const PluginError = {
-  /**
-   * Creates a client error (400) for invalid user input
-   */
-  invalidInput : (message, details = {}) => {
-    return createError(400, {
-      message,
-      expose : true,
-      type   : 'INVALID_INPUT',
-      ...details
-    })
-  },
- 
-  /**
-   * Creates a validation error for specific field validation failures
-   */
-  validation : (field, value, expected, details = {}) => {
-    return createError(400, {
-      message : `Invalid ${field}: ${value}. Expected: ${expected}`,
-      expose  : true,
-      type    : 'VALIDATION_ERROR',
-      field,
-      value,
-      expected,
-      ...details
-    })
-  },
- 
-  /**
-   * Creates an access error (403) for permission issues
-   */
-  access : (message, originalError = null) => {
-    return createError(403, originalError, {
-      message,
-      expose : false,
-      type   : 'ACCESS_ERROR'
-    })
-  },
- 
-  /**
-   * Creates a parsing error (400) for YAML/JSON parsing issues
-   */
-  parsing : (filePath, originalError, exposeDetails = true) => {
-    return createError(400, originalError, {
-      message : `Error parsing file '${filePath}': ${exposeDetails ? originalError.message : 'parsing failed'}`,
-      expose  : exposeDetails,
-      type    : 'PARSING_ERROR',
-      filePath
-    })
-  },
- 
-  /**
-   * Creates a dependency error (400) for circular/invalid dependencies
-   */
-  dependency : (message, cycle = null, packageName = null) => {
-    return createError(400, {
-      message,
-      expose : true,
-      type   : 'DEPENDENCY_ERROR',
-      cycle,
-      packageName
-    })
-  },
- 
-  /**
-   * Creates a resource limit error (400) for DoS prevention
-   */
-  resourceLimit : (limitType, current, maximum, details = {}) => {
-    return createError(400, {
-      message : `${limitType} limit exceeded: ${current} > ${maximum}`,
-      expose  : true,
-      type    : 'RESOURCE_LIMIT_ERROR',
-      limitType,
-      current,
-      maximum,
-      ...details
-    })
-  },
- 
-  /**
-   * Creates a server error (500) for unexpected internal issues
-   */
-  internal : (message, originalError = null, exposeMessage = false) => {
-    return createError(500, originalError, {
-      message,
-      expose : exposeMessage,
-      type   : 'INTERNAL_ERROR'
-    })
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/index.html b/qa/coverage/src/handlers/server/plugins/_lib/index.html deleted file mode 100644 index b4c95f6c..00000000 --- a/qa/coverage/src/handlers/server/plugins/_lib/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/_lib - - - - - - - - - -
-
-

All files src/handlers/server/plugins/_lib

-
- -
- 86.11% - Statements - 62/72 -
- - -
- 89.09% - Branches - 49/55 -
- - -
- 78.57% - Functions - 11/14 -
- - -
- 86.95% - Lines - 60/69 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
add-plugins.mjs -
-
0%0/90%0/40%0/20%0/8
error-utils.mjs -
-
100%9/9100%11/11100%7/7100%9/9
install-plugins.mjs -
-
100%51/51100%38/38100%4/4100%49/49
list-plugins.mjs -
-
66.66%2/30%0/20%0/166.66%2/3
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html deleted file mode 100644 index 54c0adfd..00000000 --- a/qa/coverage/src/handlers/server/plugins/_lib/install-plugins.mjs.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/_lib/install-plugins.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins/_lib install-plugins.mjs

-
- -
- 100% - Statements - 51/51 -
- - -
- 100% - Branches - 38/38 -
- - -
- 100% - Functions - 4/4 -
- - -
- 100% - Lines - 49/49 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -1289x -  -9x -  -396x -  -  -  -  -  -  -  -  -  -  -  -  -9x -  -  -  -  -  -  -27x -27x -  -  -27x -35x -35x -  -35x -6x -  -  -29x -  -  -  -27x -27x -  -  -  -  -  -27x -24x -  -  -24x -  -  -23x -  -  -  -  -  -22x -27x -  -  -27x -27x -26x -  -26x -6x -  -  -  -1x -  -  -27x -  -  -  -  -  -  -27x -27x -  -  -  -22x -22x -22x -21x -  -  -  -21x -  -21x -21x -  -21x -3x -  -  -21x -  -  -3x -2x -  -  -1x -  -  -3x -  -9x -  -9x -  -9x -3x -1x -  -9x -  -  - 
import * as fs from 'node:fs/promises'
- 
-import { install, view, getPackageOrgBasenameAndVersion } from '@liquid-labs/npm-toolkit'
- 
-import { PluginError } from './error-utils'
- 
-/**
- * Installs plugins based on NPM package names
- * Plugins are identified by the 'pluggable-endpoints' keyword in their package.json
- * @param {Object} options - Installation options
- * @param {Array} options.installedPlugins - Currently installed plugins
- * @param {Array<string>} options.npmNames - NPM package names to install (with optional version specs)
- * @param {string} options.pluginPkgDir - Directory where plugins should be installed
- * @param {Function} options.reloadFunc - Function to call after installation to reload the app
- * @param {Object} options.reporter - Reporter for logging
- * @returns {Promise<{msg: string, data: Object}>} Installation result message and data
- */
-const installPlugins = async({
-  installedPlugins,
-  npmNames,
-  pluginPkgDir,
-  reloadFunc,
-  reporter
-}) => {
-  const alreadyInstalled = []
-  const toInstall = []
- 
-  // Filter out already installed packages
-  for (const testPackage of npmNames) {
-    const { name: testName } = await getPackageOrgBasenameAndVersion(testPackage)
-    const matched = installedPlugins.some(({ npmName }) => npmName === testName)
- 
-    if (matched === true) {
-      alreadyInstalled.push(testName)
-    }
-    else {
-      toInstall.push(testPackage)
-    }
-  }
- 
-  let msg = ''
-  const data = {
-    installedPlugins : [],
-    total            : 0,
-    production       : 0
-  }
- 
-  if (toInstall.length > 0) {
-    reporter?.log(`To install: ${toInstall.join(', ')}`)
- 
-    // Create plugin directory if it doesn't exist
-    await fs.mkdir(pluginPkgDir, { recursive : true })
- 
-    // Install packages using npm
-    const { productionPackages } = await install({
-      packages    : toInstall,
-      projectPath : pluginPkgDir
-    })
- 
-    // Process each installed package and verify it has the correct keyword
-    for (const pkgSpec of productionPackages) {
-      const { name, version } = await getPackageOrgBasenameAndVersion(pkgSpec)
- 
-      // Verify the package has the 'pluggable-endpoints' keyword
-      try {
-        const packageData = await view({ packageName : name })
-        const keywords = packageData?.keywords || []
- 
-        if (!keywords.includes('pluggable-endpoints')) {
-          reporter?.log(`Warning: Package '${name}' does not have the 'pluggable-endpoints' keyword and may not be a valid plugin`)
-        }
-      }
-      catch (error) {
-        reporter?.log(`Warning: Could not verify keywords for package '${name}': ${error.message}`)
-      }
- 
-      const packageInfo = {
-        name,
-        version          : version || 'latest',
-        fromRegistry     : true,
-        hasPluginKeyword : true // Assuming valid if installed
-      }
- 
-      data.installedPlugins.push(packageInfo)
-      data.production++
-    }
- 
-    // Reload the app if reload function is provided
-    if (reloadFunc !== undefined) {
-      const reload = reloadFunc()
-      if (reload?.then) {
-        await reload
-      }
-    }
- 
-    data.total = data.installedPlugins.length
- 
-    if (productionPackages.length > 0) {
-      msg += '<em>Installed<rst> <code>' + productionPackages.join('<rst>, <code>') + '<rst> production packages\n'
-    }
-    if (alreadyInstalled.length > 0) {
-      msg += '<code>' + alreadyInstalled.join('<rst>, <code>') + '<rst> <em>already installed<rst>.'
-    }
- 
-    return { msg, data }
-  }
-  else {
-    if (alreadyInstalled.length > 0) {
-      msg += '<code>' + alreadyInstalled.join('<rst>, <code>') + '<rst> <em>already installed<rst>.'
-    }
-    else {
-      msg = 'Nothing to install.'
-    }
- 
-    return { msg, data }
-  }
-}
- 
-const MAX_PACKAGES = 500
- 
-const checkMaxPackages = (count) => {
-  if (count > MAX_PACKAGES) {
-    throw PluginError.resourceLimit('packages', count, MAX_PACKAGES)
-  }
-}
- 
-export { installPlugins, checkMaxPackages }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html b/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html deleted file mode 100644 index daaf9f2c..00000000 --- a/qa/coverage/src/handlers/server/plugins/_lib/list-plugins.mjs.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/_lib/list-plugins.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins/_lib list-plugins.mjs

-
- -
- 66.66% - Statements - 2/3 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 66.66% - Lines - 2/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -  -  -  -  -  -5x -  -5x -  -  - 
/**
- * Lists the installed plugins.
- *
- * @param {Object} options
- * @param {Object} options.app - The Express app object
- * @returns {Array} Array of installed plugin objects
- */
-const listPlugins = ({ app }) => {
-  return app.ext.handlerPlugins || []
-}
- 
-export { listPlugins }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/add.mjs.html b/qa/coverage/src/handlers/server/plugins/add.mjs.html deleted file mode 100644 index eff16560..00000000 --- a/qa/coverage/src/handlers/server/plugins/add.mjs.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/add.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins add.mjs

-
- -
- 100% - Statements - 16/16 -
- - -
- 100% - Branches - 4/4 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 15/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -445x -  -5x -  -  -5x -  -5x -  -  -  -  -  -5x -  -5x -  -  -  -  -  -  -  -5x -  -15x -8x -8x -  -8x -  -8x -  -  -  -1x -  -  -  -8x -5x -  -  - 
import { httpSmartResponse } from '@liquid-labs/http-smart-response'
- 
-import { installPlugins } from './_lib/install-plugins'
- 
-// Handler setup and implementation
-const pluginType = 'server'
- 
-const help = {
-  name        : `add ${pluginType} plugins`,
-  summary     : `Installs one or more ${pluginType} plugins.`,
-  description : `Installs one or more ${pluginType} plugins.`
-}
- 
-const method = 'put'
- 
-const parameters = [
-  {
-    name         : 'npmNames',
-    isMultivalue : true,
-    description  : 'The plugins to install, by their NPM package name. Plugins must have the \'pluggable-endpoints\' keyword. Include multiple times to install multiple plugins.'
-  }
-]
- 
-const path = ['server', 'plugins', 'add']
- 
-const func = ({ app, reporter }) => async(req, res) => {
-  const installedPlugins = app.ext.handlerPlugins || []
-  const { npmNames } = req.vars
-  // Use dynamicPluginInstallDir if provided, otherwise use current working directory
-  const pluginPkgDir = app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot
- 
-  const { msg, data } = await installPlugins({
-    installedPlugins,
-    npmNames,
-    pluginPkgDir,
-    reloadFunc : () => app.reload(),
-    reporter
-  })
- 
-  httpSmartResponse({ data, msg, req, res })
-}
- 
-export { func, help, method, parameters, path, installPlugins }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/details.mjs.html b/qa/coverage/src/handlers/server/plugins/details.mjs.html deleted file mode 100644 index 8755f8c9..00000000 --- a/qa/coverage/src/handlers/server/plugins/details.mjs.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/details.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins details.mjs

-
- -
- 100% - Statements - 24/24 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 6/6 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -425x -5x -  -5x -5x -  -  -  -  -5x -  -5x -  -5x -  -  -5x -15x -8x -8x -  -8x -8x -4x -  -  -  -4x -  -  -15x -  -5x -  -5x -  -8x -  -5x -  -  - 
import createError from 'http-errors'
-import { httpSmartResponse } from '@liquid-labs/http-smart-response'
- 
-const detailsPluginSetup = ({ pluginsDesc }) => {
-  const help = {
-    name        : `${pluginsDesc} plugins details`,
-    summary     : 'Provides details on the named plugin.',
-    description : 'Provides details on the named plugin.'
-  }
-  const method = 'get'
- 
-  const parameters = []
- 
-  return { help, method, parameters }
-}
- 
-const detailsPluginHandler = ({ installedPluginsRetriever, nameKey }) =>
-  ({ app, reporter }) => async(req, res) => {
-    const installedPlugins = installedPluginsRetriever({ app, req }) || []
-    const pluginName = req.vars[nameKey]
- 
-    const pluginData = installedPlugins.find(({ npmName }) => pluginName === npmName)
-    if (!pluginData) {
-      throw createError.NotFound(`No such plugin '${pluginName}' found.`)
-    }
-    // else
- 
-    httpSmartResponse({ data : pluginData, req, res })
-  }
- 
-const { help, method, parameters } = detailsPluginSetup({ pluginsDesc : 'server endpoint' })
- 
-const pluginNameKey = 'serverPluginName'
- 
-const path = ['server', 'plugins', ':' + pluginNameKey, 'details']
- 
-const installedPluginsRetriever = ({ app }) => app.ext.handlerPlugins
- 
-const func = detailsPluginHandler({ installedPluginsRetriever, nameKey : pluginNameKey })
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/index.html b/qa/coverage/src/handlers/server/plugins/index.html deleted file mode 100644 index b2b11b6e..00000000 --- a/qa/coverage/src/handlers/server/plugins/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins - - - - - - - - - -
-
-

All files src/handlers/server/plugins

-
- -
- 85% - Statements - 102/120 -
- - -
- 30.76% - Branches - 12/39 -
- - -
- 75.75% - Functions - 25/33 -
- - -
- 86.4% - Lines - 89/103 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
add.mjs -
-
100%16/16100%4/4100%3/3100%15/15
details.mjs -
-
100%24/24100%3/3100%6/6100%20/20
list.mjs -
-
63.04%29/467.4%2/2750%8/1665.78%25/38
remove.mjs -
-
97.05%33/3460%3/5100%8/896.66%29/30
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/list.mjs.html b/qa/coverage/src/handlers/server/plugins/list.mjs.html deleted file mode 100644 index 5fb867a0..00000000 --- a/qa/coverage/src/handlers/server/plugins/list.mjs.html +++ /dev/null @@ -1,451 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/list.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins list.mjs

-
- -
- 63.04% - Statements - 29/46 -
- - -
- 7.4% - Branches - 2/27 -
- - -
- 50% - Functions - 8/16 -
- - -
- 65.78% - Lines - 25/38 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -1235x -  -5x -  -5x -  -5x -5x -  -  -  -  -5x -  -5x -  -  -5x -  -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -5x -13x -6x -  -6x -6x -8x -  -4x -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -15x -  -5x -  -6x -  -5x -  -  - 
import { commonOutputParams, formatOutput } from '@liquid-labs/liq-handlers-lib'
- 
-import { listPlugins } from './_lib/list-plugins'
- 
-const allFields = ['npmName', 'installed', 'summary', 'handlerCount', 'provider', 'homepage', 'version']
- 
-const listPluginsSetup = ({ pluginsDesc }) => {
-  const help = {
-    name        : `${pluginsDesc} plugins list`,
-    summary     : `Lists the installed ${pluginsDesc} plugins.`,
-    description : `Lists the installed ${pluginsDesc} plugins.`
-  }
-  const method = 'get'
- 
-  const parameters = [
-    ...commonOutputParams() // option func setup on 'fields' below
-  ]
-  parameters.find((o) => o.name === 'fields').optionsFetcher = () => allFields
- 
-  return { help, method, parameters }
-}
- 
-const generateRowText = ({
-  codeClose,
-  codeOpen,
-  homepageClose = '',
-  homepageOpen = '',
-  installedClose = '',
-  installedOpen = '',
-  nameClose = '',
-  nameOpen = '',
-  p,
-  providerClose = '',
-  providerOpen = ''
-}) => {
-  let row = `- ${nameOpen}${p.npmName}${nameClose}`
-  Iif (p.provider !== undefined) {
-    row += ` from ${providerOpen}${p.provider}${providerClose}`
-  }
-  Iif (p.installed !== undefined || p.handlerCount !== undefined) {
-    row += ` (${p.installed !== undefined ? `${installedOpen}installed${installedClose}` + (p.handlerCount !== undefined ? '; ' : '') : ''}${p.handlerCount !== undefined ? `${p.handlerCount} handlers` : ''})`
-  }
-  Iif (p.summary !== undefined && p.summary.length > 0) {
-    row += ': ' + p.summary
-  }
-  Iif (p.homepage !== undefined) {
-    row += `\n  homepage: ${homepageOpen}${p.homepage}${homepageClose}`
-  }
- 
-  return row
-}
- 
-const mdFormatter = ({ data = [], title }) => `# ${title}\n\n`
-  + data.map((p) => generateRowText({
-    codeClose      : '`',
-    codeOpen       : '`',
-    homepageClose  : '_',
-    homepageOpen   : '_',
-    installedClose : '__',
-    installedOpen  : '__',
-    nameClose      : '___',
-    nameOpen       : '___',
-    p,
-    providerClose  : '__',
-    providerOpen   : '__'
-  })).join('\n')
-  // `- **${p.name}** (${ p.installed !== undefined ? 'installed' + (p.handlerCount !== undefined ? '; ' : '') : ''} ${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
- 
-const terminalFormatter = ({ data = [] }) => {
-  return data.map((p) => generateRowText({
-    codeClose      : '<rst>',
-    codeOpen       : '<code>',
-    homepageClose  : '<rst>',
-    homepageOpen   : '<code>',
-    installedClose : '<rst>',
-    installedOpen  : '<em>',
-    nameClose      : '<rst>',
-    nameOpen       : '<h2>',
-    p,
-    providerClose  : '<rst>',
-    providerOpen   : '<bold>'
-  })).join('\n')
-}
-// `- <em>${p.name}<rst> (${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
- 
-const textFormatter = ({ data = [] }) =>
-  data.map((p) => generateRowText({ p })).join('\n')
-// `- ${p.name} (${p.handlerCount} handlers): ${p.summary}`).join('\n') + '\n'
- 
-const listPluginsHandler = ({ installedPluginsRetriever }) =>
-  ({ app, model, reporter }) => async(req, res) => {
-    const installedPlugins = installedPluginsRetriever({ app, model, req }) || []
- 
-    const defaultFields = ['npmName', 'handlerCount', 'installed', 'summary', 'homepage']
-    const data = installedPlugins
-      .map((p) => ({ ...p, installed : true }))
-      .sort((a, b) =>
-        a.npmName.localeCompare(b.npmName)) // 1 and -1 are true-ish, only zero then fallsback to the secondary sort
-    formatOutput({
-      basicTitle : 'Plugins Report',
-      data,
-      allFields,
-      defaultFields,
-      mdFormatter,
-      terminalFormatter,
-      textFormatter,
-      reporter,
-      req,
-      res,
-      ...req.vars
-    })
-  }
- 
-const { help, method, parameters } = listPluginsSetup({ pluginsDesc : 'server endpoint' })
- 
-const path = ['server', 'plugins', 'list']
- 
-const installedPluginsRetriever = ({ app }) => listPlugins({ app })
- 
-const func = listPluginsHandler({ installedPluginsRetriever })
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/plugins/remove.mjs.html b/qa/coverage/src/handlers/server/plugins/remove.mjs.html deleted file mode 100644 index 7a379f50..00000000 --- a/qa/coverage/src/handlers/server/plugins/remove.mjs.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/plugins/remove.mjs - - - - - - - - - -
-
-

All files / src/handlers/server/plugins remove.mjs

-
- -
- 97.05% - Statements - 33/34 -
- - -
- 60% - Branches - 3/5 -
- - -
- 100% - Functions - 8/8 -
- - -
- 96.66% - Lines - 29/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -655x -5x -5x -  -5x -5x -  -  -  -  -  -5x -  -5x -  -5x -  -  -5x -12x -5x -5x -  -6x -5x -1x -  -  -  -4x -4x -  -  -4x -  -  -  -  -4x -4x -4x -  -  -  -  -4x -  -  -15x -  -5x -  -5x -  -5x -  -5x -  -  -4x -4x -  -  -  - 
import createError from 'http-errors'
-import { httpSmartResponse } from '@liquid-labs/http-smart-response'
-import { uninstall } from '@liquid-labs/npm-toolkit'
- 
-const removePluginsSetup = ({ pluginsDesc }) => {
-  const help = {
-    name        : `remove ${pluginsDesc} plugins`,
-    summary     : 'Removes the named plugin.',
-    description : 'Removes the named plugin.'
-  }
- 
-  const method = 'delete'
- 
-  const parameters = []
- 
-  return { help, method, parameters }
-}
- 
-const removePluginsHandler = ({ installedPluginsRetriever, nameKey, pluginPkgDirRetriever, reloadFunc }) =>
-  ({ app, reporter }) => async(req, res) => {
-    const installedPlugins = installedPluginsRetriever({ app, req })
-    const pluginName = req.vars[nameKey]
- 
-    const pluginData = installedPlugins.find(({ npmName }) => pluginName === npmName)
-    if (!pluginData) {
-      throw createError.NotFound(`No such plugin '${pluginName}' found.`)
-    }
-    // else
- 
-    const npmName = pluginData.npmName
-    const pluginPkgDir = pluginPkgDirRetriever({ app, reporter, req })
- 
-    // Use npm-toolkit's uninstall function for safe package removal
-    await uninstall({
-      packages    : [npmName],
-      projectPath : pluginPkgDir
-    })
- 
-    if (reloadFunc !== undefined) {
-      const reload = reloadFunc({ app })
-      Iif (reload.then) {
-        await reload
-      }
-    }
- 
-    httpSmartResponse({ msg : `<em>Removed<rst> <code>${pluginName}<rst> plugin. Server endpoints refreshed.`, req, res })
-  }
- 
-const { help, method, parameters } = removePluginsSetup({ pluginsDesc : 'server endpoint' })
- 
-const pluginNameKey = 'serverPluginName'
- 
-const path = ['server', 'plugins', ':' + pluginNameKey, 'remove']
- 
-const installedPluginsRetriever = ({ app }) => app.ext.handlerPlugins
- 
-const func = removePluginsHandler({
-  installedPluginsRetriever,
-  nameKey               : pluginNameKey,
-  pluginPkgDirRetriever : ({ app }) => app.ext.dynamicPluginInstallDir || app.ext.serverConfigRoot,
-  reloadFunc            : ({ app }) => app.reload()
-})
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/reload.mjs.html b/qa/coverage/src/handlers/server/reload.mjs.html deleted file mode 100644 index 15ed7256..00000000 --- a/qa/coverage/src/handlers/server/reload.mjs.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/reload.mjs - - - - - - - - - -
-
-

All files / src/handlers/server reload.mjs

-
- -
- 77.77% - Statements - 7/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 1/2 -
- - -
- 75% - Lines - 6/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -184x -  -  -  -  -  -4x -4x -4x -  -7x -  -  -  -4x -  -  - 
const help = {
-  name        : 'Server reload',
-  summary     : 'Reloads the server settings and plugins from disk.',
-  description : 'Reloads the server settings and plugins from disk. This is necessary when changes are made to the state/data files outside of the server (e.g., through manual file edits). Generally, changes made through server endpoints should be re-loaded themselves.'
-}
- 
-const method = 'put'
-const path = ['server', 'reload']
-const parameters = []
- 
-const func = ({ app, cache, reporter }) => async(req, res) => {
-  app.reload()
- 
-  res.json({ message : 'App reloaded.' })
-}
- 
-export { func, help, method, parameters, path }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/stop.mjs.html b/qa/coverage/src/handlers/server/stop.mjs.html deleted file mode 100644 index f04ddf25..00000000 --- a/qa/coverage/src/handlers/server/stop.mjs.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/stop.mjs - - - - - - - - - -
-
-

All files / src/handlers/server stop.mjs

-
- -
- 50% - Statements - 7/14 -
- - -
- 0% - Branches - 0/1 -
- - -
- 50% - Functions - 1/2 -
- - -
- 46.15% - Lines - 6/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -254x -  -  -  -  -4x -4x -4x -  -7x -  -  -  -  -  -  -  -  -  -  -  -4x -  -  - 
const help = {
-  name    : 'Server stop',
-  summary : 'Stops or shuts down the server.'
-}
- 
-const method = 'unbind'
-const path = ['server', 'stop?']
-const parameters = []
- 
-const func = ({ app, cache }) => async(req, res) => {
-  res.send('Shutting down...')
- 
-  for (const teardownMethod of app.ext.teardownMethods) {
-    const ret = teardownMethod({ app })
-    Iif (ret.then) {
-      await ret
-    }
-  }
- 
-  cache.release()
-  process.kill(process.pid, 'SIGTERM')
-}
- 
-export { func, help, path, method, parameters }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/handlers/server/version.js.html b/qa/coverage/src/handlers/server/version.js.html deleted file mode 100644 index ea4471ed..00000000 --- a/qa/coverage/src/handlers/server/version.js.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for src/handlers/server/version.js - - - - - - - - - -
-
-

All files / src/handlers/server version.js

-
- -
- 100% - Statements - 14/14 -
- - -
- 100% - Branches - 6/6 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 12/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -424x -4x -  -140x -  -4x -  -  -  -  -  -4x -4x -4x -  -7x -3x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3x -  -  -  -  -3x -4x -  -  - 
import http from 'node:http'
-import * as os from 'node:os'
- 
-import { httpSmartResponse } from '@liquid-labs/http-smart-response'
- 
-const help = {
-  name        : 'Server version',
-  summary     : 'Provides version information for the server aand its components.',
-  descirption : "Provides version information for the server aand its components. This includes the underlying 'pluggable-server' version (which is used to determine plugin compatibility), as well as information on node and the platform where the server is running."
-}
- 
-const method = 'get'
-const path = ['server', 'version']
-const parameters = []
- 
-const func = ({ app, cache, reporter }) => (req, res) => {
-  const versionInfo = {
-    name                : app.ext.name,
-    version             : app.ext.version,
-    'pluggable-express' : app.ext.serverVersion,
-    node                : process.version,
-    fullNode            : process.versions,
-    platform            : `${os.type()} ${os.release()}`,
-    fullPlatform        : {
-      platform : os.platform(),
-      type     : os.type(),
-      version  : os.version(),
-      release  : os.release()
-    },
-    supportedMethods : http.METHODS
-  }
- 
-  const msg = `${app.ext.name}: ${app.ext.version}
-pluggable-express: ${versionInfo.server}
-node: ${versionInfo.node}
-platform:${versionInfo.platform}
-`
-  httpSmartResponse({ msg, data : versionInfo, req, res })
-}
- 
-export { func, help, path, method, parameters }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/index.html b/qa/coverage/src/index.html deleted file mode 100644 index ee067da6..00000000 --- a/qa/coverage/src/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 48.48% - Statements - 64/132 -
- - -
- 32.69% - Branches - 17/52 -
- - -
- 14.28% - Functions - 2/14 -
- - -
- 49.21% - Lines - 63/128 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
app.js -
-
56.63%64/11335.41%17/4820%2/1057.79%63/109
server.mjs -
-
0%0/190%0/40%0/40%0/19
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/configurables.js.html b/qa/coverage/src/lib/configurables.js.html deleted file mode 100644 index 40b860b1..00000000 --- a/qa/coverage/src/lib/configurables.js.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Code coverage report for src/lib/configurables.js - - - - - - - - - -
-
-

All files / src/lib configurables.js

-
- -
- 66.66% - Statements - 2/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7  -  -  -4x -  -  - 
// TODO: make this a small project
- 
-// TODO: support slurping in env variables between defaults
-const initializeConfiguration = (sources) => Object.assign({}, ...sources)
- 
-export { initializeConfiguration }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/find-own-home.mjs.html b/qa/coverage/src/lib/find-own-home.mjs.html deleted file mode 100644 index 4cad584b..00000000 --- a/qa/coverage/src/lib/find-own-home.mjs.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - Code coverage report for src/lib/find-own-home.mjs - - - - - - - - - -
-
-

All files / src/lib find-own-home.mjs

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 12/12 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 25/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -795x -5x -5x -  -314x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -19x -3x -  -  -  -  -  -16x -16x -10x -10x -1x -  -  -  -  -6x -  -  -  -16x -7x -  -7x -6x -  -5x -5x -5x -1x -  -  -  -1x -  -  -  -3x -  -  -  -13x -5x -  -  - 
import { existsSync } from 'node:fs'
-import * as fs from 'node:fs/promises'
-import * as fsPath from 'node:path'
- 
-import findRoot from 'find-root'
- 
-/**
- * Finds the package root directory of the currently running server executable.
- *
- * This function is used to locate where core plugins should be loaded from. It handles both
- * regular executable paths and symlinked executables (e.g., when installed globally or via npm link).
- *
- * The function attempts two strategies:
- * 1. First, tries to find the package root directly from the executable path using `findRoot()`
- * 2. If that fails, resolves any symlinks using `fs.realpath()` and tries again
- *
- * @param {string} executablePath - The path to the executable (typically `process.argv[1]`)
- * @returns {Promise<string>} The absolute path to the server package root directory
- * @throws {Error} If executablePath is undefined, null, or empty
- * @throws {Error} If package.json cannot be found in any parent directory
- * @throws {Error} If the resolved package root doesn't contain a package.json file
- *
- * @example
- * // Direct executable path
- * const root = await findOwnHome('/usr/local/lib/node_modules/my-server/dist/server.js')
- * // Returns: '/usr/local/lib/node_modules/my-server'
- *
- * @example
- * // Symlinked executable (e.g., via npm link or global install)
- * const root = await findOwnHome('/usr/local/bin/my-server')
- * // Resolves symlink, then returns: '/home/user/projects/my-server'
- */
-const findOwnHome = async(executablePath) => {
-  if (!executablePath) {
-    throw new Error('Cannot determine server package root: executablePath is undefined, null, or empty')
-  }
- 
-  let serverPackageRoot
- 
-  // First attempt: try to find root from the executable path directly
-  try {
-    serverPackageRoot = findRoot(executablePath)
-    const serverPackageJsonPath = fsPath.join(serverPackageRoot, 'package.json')
-    if (!existsSync(serverPackageJsonPath)) {
-      serverPackageRoot = null // Force fallback to symlink resolution
-    }
-  }
-  catch (error) {
-    // findRoot failed, will try symlink resolution
-    serverPackageRoot = null
-  }
- 
-  // Second attempt: if the executable is a symlink, resolve it and try again
-  if (!serverPackageRoot) {
-    try {
-      // Resolve symlinks recursively using fs.realpath
-      const realPath = await fs.realpath(executablePath)
-      if (realPath !== executablePath) {
-        // It was a symlink, try finding root from the real path
-        serverPackageRoot = findRoot(realPath)
-        const serverPackageJsonPath = fsPath.join(serverPackageRoot, 'package.json')
-        if (!existsSync(serverPackageJsonPath)) {
-          throw new Error(`Package root found at '${serverPackageRoot}' but package.json does not exist`)
-        }
-      }
-      else { // it's not a symlink but we already looked for the package root based on the literal path
-        throw new Error(`Package root could not be resolved from '${executablePath}' directly or as a symlink`)
-      }
-    }
-    catch (error) {
-      throw new Error(`Could not determine server package root from '${executablePath}': ${error.message}`)
-    }
-  }
- 
-  return serverPackageRoot
-}
- 
-export { findOwnHome }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/get-server-settings.mjs.html b/qa/coverage/src/lib/get-server-settings.mjs.html deleted file mode 100644 index 4ca5a8f5..00000000 --- a/qa/coverage/src/lib/get-server-settings.mjs.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/lib/get-server-settings.mjs - - - - - - - - - -
-
-

All files / src/lib get-server-settings.mjs

-
- -
- 100% - Statements - 12/12 -
- - -
- 90% - Branches - 9/10 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 11/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -234x -4x -  -116x -  -4x -  -  -14x -14x -7x -  -  -7x -  -7x -  -7x -  -4x -  -  - 
import { existsSync } from 'node:fs'
-import * as fsPath from 'node:path'
- 
-import { readFJSON, writeFJSON } from '@liquid-labs/federated-json'
- 
-const getServerSettings = (serverConfigRoot) => {
-  // TODO: this causes a race condition; should instead just try to read with federated JSON and ignore 'file not
-  // found' exceptions
-  const serverSettingsPath = fsPath.join(serverConfigRoot, 'server-settings.yaml')
-  if (existsSync(serverSettingsPath)) {
-    return readFJSON(serverSettingsPath) || {}
-  }
-  else {
-    const serverSettings = {}
- 
-    writeFJSON({ file : serverSettingsPath, data : serverSettings })
- 
-    return serverSettings
-  }
-}
- 
-export { getServerSettings }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/index.html b/qa/coverage/src/lib/index.html deleted file mode 100644 index 589e0327..00000000 --- a/qa/coverage/src/lib/index.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - Code coverage report for src/lib - - - - - - - - - -
-
-

All files src/lib

-
- -
- 77.41% - Statements - 264/341 -
- - -
- 64.55% - Branches - 122/189 -
- - -
- 64.44% - Functions - 29/45 -
- - -
- 79.55% - Lines - 253/318 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
configurables.js -
-
66.66%2/3100%0/00%0/1100%1/1
find-own-home.mjs -
-
100%26/26100%12/12100%2/2100%25/25
get-server-settings.mjs -
-
100%12/1290%9/10100%2/2100%11/11
json-helpers.mjs -
-
0%0/170%0/90%0/30%0/15
load-plugins.js -
-
93.67%74/7981.66%49/60100%9/994.73%72/76
path-resolvers.js -
-
0%0/4100%0/00%0/20%0/3
path-to-re.mjs -
-
94.11%16/1780%4/5100%1/194.11%16/17
path-var-registry.mjs -
-
91.66%11/120%0/1100%3/391.66%11/12
register-handlers.js -
-
73.2%112/15353.57%45/8460%9/1575.35%107/142
reporter.js -
-
61.11%11/1837.5%3/842.85%3/762.5%10/16
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/json-helpers.mjs.html b/qa/coverage/src/lib/json-helpers.mjs.html deleted file mode 100644 index 11339c7b..00000000 --- a/qa/coverage/src/lib/json-helpers.mjs.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/lib/json-helpers.mjs - - - - - - - - - -
-
-

All files / src/lib json-helpers.mjs

-
- -
- 0% - Statements - 0/17 -
- - -
- 0% - Branches - 0/9 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as fs from 'node:fs'
-import * as fsPath from 'node:path'I
- 
-const readPackageJSON = (basePath) => {
-  const packageJSONPath = fsPath.join(basePath, 'package.json')
-  return safeJSONParse(packageJSONPath)
-}
- 
-const safeJSONParse = (path) => {
-  Iif (!fs.existsSync(path)) return null
- 
-  const bits = fs.readFileSync(path)
-  try {
-    return JSON.parse(bits)
-  }
-  catch (e) {
-    if (e instanceof SyntaxError) {
-      throw new SyntaxError(`${e.message} while processing ${path}`, { cause : e })
-    }
-    else {
-      throw e
-    }
-  }
-}
- 
-export { readPackageJSON, safeJSONParse }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/load-plugins.js.html b/qa/coverage/src/lib/load-plugins.js.html deleted file mode 100644 index e915aab9..00000000 --- a/qa/coverage/src/lib/load-plugins.js.html +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - Code coverage report for src/lib/load-plugins.js - - - - - - - - - -
-
-

All files / src/lib load-plugins.js

-
- -
- 93.67% - Statements - 74/79 -
- - -
- 81.66% - Branches - 49/60 -
- - -
- 100% - Functions - 9/9 -
- - -
- 94.73% - Lines - 72/76 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -1644x -4x -4x -  -138x -  -  -  -  -4x -3x -  -  -3x -9x -3x -  -  -  -3x -3x -3x -  -  -  -3x -3x -3x -  -  -3x -  -  -  -  -  -  -  -  -  -4x -14x -14x -14x -  -14x -7x -  -14x -7x -7x -  -14x -7x -7x -  -  -7x -7x -  -  -  -  -  -  -  -  -  -4x -3x -3x -3x -  -3x -878x -  -  -3x -2x -  -3x -2x -2x -  -3x -1x -1x -  -  -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -14x -  -  -14x -3x -3x -  -3x -  -  -  -3x -1x -  -  -1x -  -  -  -  -1x -1x -  -  -  -  -14x -14x -  -  -14x -14x -4x -2x -2x -  -2x -  -  -  -14x -2x -  -  -14x -  -  -  -14x -2x -2x -  -4x -  -  - 
import { existsSync } from 'node:fs'
-import findPlugins from 'find-plugins'
-import * as path from 'path'
- 
-import { registerHandlers } from './register-handlers'
- 
-/**
- * Loads a single plugin.
- */
-const loadPlugin = async({ app, cache, reporter, registerPathVar, dir, pkg }) => {
-  const { main, name: npmName, description, version } = pkg
-  // Since we pull the 'summary' from the package.json description, there may be unecessary context which is clear when
-  // asking 'describe this plugin'. So, we look for this specific phrase and remove it.
-  const summary = description?.replace(/ +(?:for|in) a @liquid-labs\/pluggable-express server/, '')
-  const { handlers, setup } = await import(`${dir}/${main}`) || {}
-  Iif (handlers === undefined && setup === undefined) {
-    throw new Error(`Plugin from '${npmName}' does not export 'handlers' or 'setup'; bailing out.`)
-  }
- 
-  Iif (setup !== undefined) reporter.log(`Running setup for ${npmName}@${version} plugin...`)
-  let setupData = setup?.({ app, cache, reporter, registerPathVar, serverConfigRoot : app.ext.serverConfigRoot })
-  Iif (setupData?.then !== undefined) {
-    setupData = await setupData
-  }
- 
-  app.ext.pendingHandlers.push(() => {
-    if (handlers !== undefined) {
-      registerHandlers(app, { npmName, handlers, reporter, setupData, cache })
-    }
- 
-    app.ext.handlerPlugins.push({ summary, npmName, version })
-  })
-}
- 
-/**
- * Discovers plugins by scanning dependencies for the 'pluggable-endpoints' keyword
- * @param {string} searchPath - Directory to search for package.json and node_modules
- * @param {Object} reporter - Reporter for logging
- * @returns {Promise<Array>} Array of plugin objects with {dir, pkg} structure
- */
-const discoverPluginsByKeyword = async(searchPath, reporter) => {
-  const packageJsonPath = path.join(searchPath, 'package.json')
-  const nodeModulesPath = path.join(searchPath, 'node_modules')
-  const findOptions = { keyword : 'pluggable-endpoints' }
- 
-  if (existsSync(packageJsonPath)) {
-    findOptions.pkg = packageJsonPath
-  }
-  if (existsSync(nodeModulesPath)) {
-    findOptions.dir = nodeModulesPath
-    findOptions.scanAllDirs = true
-  }
-  if (findOptions.pkg === undefined && findOptions.dir === undefined) {
-    reporter?.warn(`Did not find package.json found at ${packageJsonPath} nor node_modules at ${nodeModulesPath}`)
-    return []
-  }
- 
-  const results = await findPlugins(findOptions)
-  return results
-}
- 
-/**
- * Discovers explicit plugins by name, regardless of keyword
- * @param {string} searchPath - Directory to search for package.json and node_modules
- * @param {Array<string>} explicitPlugins - Array of package names to load
- * @param {Object} reporter - Reporter for logging
- * @returns {Promise<Array>} Array of plugin objects with {dir, pkg} structure
- */
-const discoverExplicitPlugins = async(searchPath, explicitPlugins, reporter) => {
-  const packageJsonPath = path.join(searchPath, 'package.json')
-  const nodeModulesPath = path.join(searchPath, 'node_modules')
-  const explicitPluginSet = new Set(explicitPlugins)
- 
-  const findOptions = {
-    filter : (pluginSummary) => explicitPluginSet.has(pluginSummary.pkg?.name)
-  }
- 
-  if (existsSync(packageJsonPath)) {
-    findOptions.pkg = packageJsonPath
-  }
-  if (existsSync(nodeModulesPath)) {
-    findOptions.dir = nodeModulesPath
-    findOptions.scanAllDirs = true
-  }
-  if (findOptions.pkg === undefined && findOptions.dir === undefined) {
-    reporter?.warn(`Did not find package.json found at ${packageJsonPath} nor node_modules at ${nodeModulesPath}`)
-    return []
-  }
- 
-  const results = await findPlugins(findOptions)
-  return results
-}
- 
-/**
- * Given an app, cache, reporter, and optional plugin path, loads plugins.
- * If dynamicPluginInstallDir is provided, searches there. Otherwise searches in the current working directory.
- * @param {Object} app - Express app instance
- * @param {Object} options - Loading options
- * @param {Object} options.cache - Cache instance
- * @param {Object} options.reporter - Reporter for logging
- * @param {Function} options.registerPathVar - Function to register path variables
- * @param {string} options.searchPath - Directory to search for plugins
- * @param {Array<string>} options.explicitPlugins - Optional array of package names to explicitly load
- * @param {Set<string>} options.loadedPluginNames - Optional Set to track loaded plugins across multiple calls
- * @returns {Promise<void>}
- */
-const loadPlugins = async(app, { cache, reporter, registerPathVar, searchPath, explicitPlugins, loadedPluginNames }) => {
-  // Use provided Set or create a new one for this call
-  const pluginNames = loadedPluginNames || new Set()
- 
-  // First, load explicit plugins if specified
-  if (explicitPlugins?.length > 0) {
-    reporter.log(`Searching for ${explicitPlugins.length} explicitly specified plugins (in ${searchPath})...`)
-    const explicitResults = await discoverExplicitPlugins(searchPath, explicitPlugins, reporter)
- 
-    reporter.log(explicitResults.length === 0
-      ? 'No explicit plugins found.'
-      : `Found ${explicitResults.length} explicit plugins.`)
- 
-    for (const plugin of explicitResults) {
-      const pluginName = plugin.pkg.name
- 
-      // Check for duplicates and warn
-      Iif (pluginNames.has(pluginName)) {
-        reporter.log(`Warning: Plugin '${pluginName}' was already loaded from another source, skipping duplicate from '${searchPath}'`)
-        continue
-      }
- 
-      await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin })
-      pluginNames.add(pluginName)
-    }
-  }
- 
-  // Then discover and load keyword-based plugins
-  reporter.log(`Searching for handler plugins with 'pluggable-endpoints' keyword (in ${searchPath})...`)
-  const keywordPlugins = await discoverPluginsByKeyword(searchPath, reporter)
- 
-  // Filter out already-loaded plugins to avoid duplicates
-  const duplicates = []
-  const newPlugins = keywordPlugins.filter(p => {
-    if (pluginNames.has(p.pkg.name)) {
-      duplicates.push(p.pkg.name)
-      return false
-    }
-    return true
-  })
- 
-  // Warn about duplicates
-  if (duplicates.length > 0) {
-    reporter.log(`Warning: Found ${duplicates.length} plugin(s) already loaded from another source, skipping: ${duplicates.join(', ')}`)
-  }
- 
-  reporter.log(newPlugins.length === 0
-    ? 'No additional keyword-based plugins found.'
-    : `Found ${newPlugins.length} keyword-based plugins.`)
- 
-  for (const plugin of newPlugins) {
-    await loadPlugin({ app, cache, reporter, registerPathVar, ...plugin })
-    pluginNames.add(plugin.pkg.name)
-  }
-}
- 
-export { loadPlugins }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/path-resolvers.js.html b/qa/coverage/src/lib/path-resolvers.js.html deleted file mode 100644 index d7148806..00000000 --- a/qa/coverage/src/lib/path-resolvers.js.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/lib/path-resolvers.js - - - - - - - - - -
-
-

All files / src/lib path-resolvers.js

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -  -  -  -  -  -  -  - 
const serverPluginName = {
-  bitReString    : '((?:@|%40)[a-z0-9-~][a-z0-9-._~]*(?:[/]|%2f|%2F))?([a-z0-9-~][a-z0-9-._~]*)',
-  optionsFetcher : ({ app }) => {
-    return app.ext.handlerPlugins.map(({ npmName }) => npmName)
-  }
-}
- 
-const commonPathResolvers = { serverPluginName }
- 
-export { commonPathResolvers }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/path-to-re.mjs.html b/qa/coverage/src/lib/path-to-re.mjs.html deleted file mode 100644 index aab0e27b..00000000 --- a/qa/coverage/src/lib/path-to-re.mjs.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - Code coverage report for src/lib/path-to-re.mjs - - - - - - - - - -
-
-

All files / src/lib path-to-re.mjs

-
- -
- 94.11% - Statements - 16/17 -
- - -
- 80% - Branches - 4/5 -
- - -
- 100% - Functions - 1/1 -
- - -
- 94.11% - Lines - 16/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38  -  -  -  -  -  -  -4x -175x -  -175x -539x -21x -21x -  -21x -  -  -  -21x -21x -  -518x -28x -28x -  -  -490x -  -  -  -175x -  -175x -4x -  -  - 
/**
- * Converts a path array to a RegExp for route matching.
- *
- * @param {Array<string>} pathArr - Array of path segments, may include :vars and optional? segments
- * @param {Function} getVarDef - Function to look up variable definitions by name
- * @returns {RegExp} Regular expression for matching the path
- */
-const pathToRe = (pathArr, getVarDef) => {
-  let reString = '^'
- 
-  for (const pathBit of pathArr) {
-    if (pathBit.startsWith(':')) {
-      const pathVar = pathBit.slice(1)
-      const varDef = getVarDef(pathVar)
- 
-      Iif (varDef === undefined) {
-        throw new Error(`Unknown variable path element type '${pathVar}' while processing path ${pathArr.join('/')}.`)
-      }
- 
-      const { validationRe } = varDef
-      reString += `/(?<${pathVar}>${validationRe})`
-    }
-    else if (pathBit.endsWith('?')) {
-      const cleanBit = pathBit.slice(0, -1)
-      reString += `(?:/${cleanBit})?`
-    }
-    else {
-      reString += '/' + pathBit
-    }
-  }
- 
-  reString += '[/#?]?$'
- 
-  return new RegExp(reString)
-}
- 
-export { pathToRe }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/path-var-registry.mjs.html b/qa/coverage/src/lib/path-var-registry.mjs.html deleted file mode 100644 index ff5d549e..00000000 --- a/qa/coverage/src/lib/path-var-registry.mjs.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - Code coverage report for src/lib/path-var-registry.mjs - - - - - - - - - -
-
-

All files / src/lib path-var-registry.mjs

-
- -
- 91.66% - Statements - 11/12 -
- - -
- 0% - Branches - 0/1 -
- - -
- 100% - Functions - 3/3 -
- - -
- 91.66% - Lines - 11/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -4x -7x -  -  -4x -  -  -  -  -  -4x -14x -  -  -  -14x -  -  -4x -  -  -  -  -4x -25x -4x -  -  - 
/**
- * Registry for path variable definitions.
- * Path vars are used in handler paths (e.g., :serverPluginName) and need validation patterns.
- *
- * varDef structure:
- * {
- *   validationRe: string - Regular expression pattern to match the variable value
- *   optionsFetcher: function - Optional function that returns available options for this var
- * }
- */
- 
-// Module-level registry
-let registry = {}
- 
-/**
- * Clears the entire registry. Called at the start of appInit.
- */
-const clearRegistry = () => {
-  registry = {}
-}
- 
-/**
- * Registers a path variable definition.
- * @param {string} varName - Name of the variable (without leading colon)
- * @param {Object} varDef - Definition object with { validationRe, optionsFetcher }
- * @throws {Error} If varName is already registered
- */
-const registerPathVar = (varName, varDef) => {
-  Iif (registry[varName] !== undefined) {
-    throw new Error(`Path variable '${varName}' is already registered.`)
-  }
- 
-  registry[varName] = varDef
-}
- 
-/**
- * Retrieves a path variable definition.
- * @param {string} varName - Name of the variable (without leading colon)
- * @returns {Object|undefined} The varDef object, or undefined if not found
- */
-const getVarDef = (varName) => {
-  return registry[varName]
-}
- 
-export { clearRegistry, registerPathVar, getVarDef }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/register-handlers.js.html b/qa/coverage/src/lib/register-handlers.js.html deleted file mode 100644 index 0f7c6678..00000000 --- a/qa/coverage/src/lib/register-handlers.js.html +++ /dev/null @@ -1,976 +0,0 @@ - - - - - - Code coverage report for src/lib/register-handlers.js - - - - - - - - - -
-
-

All files / src/lib register-handlers.js

-
- -
- 73.2% - Statements - 112/153 -
- - -
- 53.57% - Branches - 45/84 -
- - -
- 60% - Functions - 9/15 -
- - -
- 75.35% - Lines - 107/142 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -2984x -4x -4x -  -4x -4x -4x -4x -  -4x -  -4x -4x -4x -4x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -178x -53x -  -  -  -  -53x -  -  -  -53x -50x -50x -100x -  -  -  -  -  -50x -  -53x -  -  -53x -  -  -53x -  -  -53x -53x -53x -  -  -  -  -53x -46x -46x -  -46x -  -46x -  -  -  -  -  -  -  -  -  -46x -  -  -  -46x -  -  -  -  -46x -  -  -53x -  -  -4x -175x -  -  -175x -539x -21x -  -518x -28x -28x -  -  -490x -  -  -  -  -175x -  -  -175x -175x -539x -245x -  -539x -  -  -175x -  -  -  -  -  -175x -  -175x -  -  -  -  -  -175x -  -4x -10x -94x -94x -  -94x -  -  -  -  -  -94x -  -  -94x -  -  -  -94x -  -  -94x -  -94x -94x -3x -  -  -94x -  -  -  -  -94x -  -94x -  -  -  -94x -  -  -  -  -  -  -94x -3x -3x -  -  -94x -44x -  -  -44x -  -  -  -44x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -44x -32x -32x -  -32x -  -  -  -  -94x -47x -20x -  -  -20x -  -  -20x -20x -  -  -  -  -94x -94x -94x -  -  -94x -  -  -  -  -  -  -  -  -  -94x -94x -94x -  -94x -84x -  -  -  -84x -84x -  -  -  -308x -  -84x -84x -84x -  -  -  -84x -  -  -  -  -  -  -  -84x -84x -  -  -  -4x -  -  -  -  - 
import createError from 'http-errors'
-import omit from 'lodash.omit'
-import { pathToRegexp } from 'path-to-regexp'
- 
-import { commonOutputParams } from '@liquid-labs/liq-handlers-lib'
-import { sendHelp } from '../handlers/help/lib/send-help'
-import { getVarDef, registerPathVar } from './path-var-registry'
-import { pathToRe } from './path-to-re'
- 
-const helpParameters = commonOutputParams()
- 
-const falseParams = /n(o)?|f(alse)?|0/i
-const pathParamRegExp = /:[a-zA-Z0-9_]+/g
-const regexParamRegExp = /\?<[a-zA-Z0-9_]+>/g
-const trueParams = /y(es)?|t(rue)?|1/i
- 
-const processBool = (value, name) => {
-  if (value.match(trueParams)) {
-    return true
-  }
-  else if (value.match(falseParams)) {
-    return false
-  }
-  else {
-    throw new Error(`Could not parse parameter '${name}' value '${value}' as boolean.`)
-  }
-}
- 
-/**
-* Combine and verify parameters. Verified parameters collected on `req.vars`
-*/
-const processParams = ({ parameters = [], path }) => (req, res, next) => {
-  const vars = {} // this is where we will collect the combined path, body, and query parameters
- 
-  // pull variables out of the path; path vars come in as positional, but in an object, like:
-  // { 0: 'path-value' }
-  // first, we decode the values
-  for (const k in Object.keys(req.params)) { // eslint-disable-line guard-for-in
-    vars[k] = decodeURIComponent(req.params[k])
-  }
-  // Now we map the values to their names by processing the path spec.
-  if (Array.isArray(path)) { // expects nested paths to be rolled out, so we're dealing with a flat path spec array
-    const mapArr = []
-    for (const pathBit of path) {
-      Iif (pathBit.startsWith(':')) {
-        const name = pathBit.slice(1)
-        mapArr.push(name)
-      }
-    }
- 
-    mapArr.forEach((n, i, arr) => { vars[n] = vars[i] })
-  }
-  req.vars = vars
- 
-  // Now we map the body or query parameters to vars
-  const source = req.method === 'POST'
-    ? req.body
-    : req.query
-  Iif (source === undefined) return true
- 
-  // checks for unknown parameters and complain
-  const validParams = parameters && parameters.map(p => p.name)
-  const remainder = Object.keys(omit(source, validParams))
-  Iif (remainder.length > 0) {
-    throw new Error(`Unknown query parameters: ${remainder.join(', ')} while accessing ${req.path}.`)
-  }
- 
-  // now process flagged variables
-  for (const p of parameters) {
-    let value = source[p.name]
-    Iif (value === undefined) continue
- 
-    Iif (p.matcher !== undefined && !value.match(p.matcher)) { throw createError.BadRequest(`Parameter ${p.name} value '${value}' does not match ${p.matcher}.`) }
- 
-    Iif (p.isMultivalue === true) {
-      // if we have a multivalue but only one instance, it will come in as a single value, we want to convert that to
-      // a single value array
-      Iif (!Array.isArray(value)) {
-        value = [value]
-      }
-      value = p.isBoolean === true
-        ? value.map((v) => processBool(v, p.name))
-        : value.map((v) => decodeURIComponent(v))
-    }
-    else Iif (Array.isArray(value)) {
-      throw new Error(`Non-multivalue parameter '${p.name}' cannot be specified more than once.`)
-    }
-    else { // single value var
-      value = p.isBoolean === true
-        ? processBool(value, p.name)
-        : decodeURIComponent(value)
-    }
- 
-    vars[p.name] = value
-  }
- 
-  next()
-}
- 
-const processCommandPath = ({ app, model, pathArr, parameters }) => {
-  const commandPath = []
- 
-  // Build command path array for commandPaths tree
-  for (const pathBit of pathArr) {
-    if (pathBit.startsWith(':')) {
-      commandPath.push(pathBit) // with leading ':'
-    }
-    else if (pathBit.endsWith('?')) {
-      const cleanBit = pathBit.slice(0, -1)
-      commandPath.push(cleanBit)
-    }
-    else {
-      commandPath.push(pathBit)
-    }
-  }
- 
-  // Build the regex using the extracted pathToRe function
-  const pathRe = pathToRe(pathArr, getVarDef)
- 
-  // Update commandPaths tree
-  let frontier = app.ext.commandPaths
-  for (const pathBit of commandPath) {
-    if (!(pathBit in frontier)) {
-      frontier[pathBit] = {}
-    }
-    frontier = frontier[pathBit]
-  }
- 
-  Iif (frontier._parameters !== undefined) {
-    throw new Error(`Non-unique command path: ${commandPath.join('/')}`)
-  }
- 
-  // 'parameters' are deep frozen, so safe to share. We use a function here to future proof in case we need to
-  // unfreeze and then maybe make copies here to prevent clients from changing the shared parameters data.
-  frontier._parameters = () => parameters
- 
-  return pathRe
-}
- 
-// express barfs if there are named capture groups in the path RE. However, we really want to use named capture groups
-// so we define our paths with them (for future use) and remove them here. The 'slice' removes the leading and trailing
-// '/'
-const cleanReForExpress = (pathRe) => new RegExp(pathRe.toString().replaceAll(regexParamRegExp, '').slice(1, -1))
- 
-const registerHandlers = (app, { npmName, handlers, model, reporter, setupData, cache }) => {
-  for (const handler of handlers) {
-    const { func, help, method, parameters, path: aPath } = handler
-    const paths = handler.paths || [aPath] // we can now use regularized 'paths'
- 
-    Iif (app.ext.noRegistries === true
-          && paths.some((p) => p[0] === 'server' && p[1] === 'plugins' && p[2] === 'registries')) {
-      // then it's a registry endpoint, but we're not using registries so we skip it
-      continue
-    }
- 
-    Iif ((aPath === undefined && handler.paths === undefined) || method === undefined || func === undefined) {
-      throw new Error(`A handler from '${npmName}' does not fully define 'method', 'path', and/or 'func' exports.`)
-    }
-    Iif (aPath !== undefined && handler.paths !== undefined) {
-      throw new Error(`A handler from '${npmName}' specifies both 'path' and 'paths'; specify one or the other.`)
-    }
- 
-    const methodUpper = method.toUpperCase()
- 
-    // this must come before processCommandPath to give the function the option of registering variable name parameters
-    const handlerFunc = func({ parameters, app, cache, model, reporter, registerPathVar, setupData })
- 
-    for (const path of paths) {
-      if (!Array.isArray(path)) {
-        reporter.warn(`Handler is using old style path: '${path}'. Should be converted to array style.`)
-      }
- 
-      const routablePath = typeof path === 'string'
-        ? path
-        : Array.isArray(path)
-          ? cleanReForExpress(processCommandPath({ app, model, pathArr : path, parameters }))
-          : cleanReForExpress(path) // then it's a regular expression
-      reporter.log(`registering handler for path: ${methodUpper}:${routablePath}`)
- 
-      app[method.toLowerCase()](routablePath,
-        processParams({ parameters, path }),
-        handlerFunc)
-      // for or own informational purposes
-      const endpointDef = Object.assign({
-        npmName,
-        routablePath : routablePath.toString()
-      },
-      handler
-      )
- 
-      if (!parameters) {
-        reporter.warn(`Endpoint '${method}:${path}' does not define 'parameters'. An explicit '[]' value should be defined where there are no parameters.`)
-        endpointDef.parameters = []
-      }
- 
-      if (!Object.isFrozen(parameters)) { // use parameters as a proxy instead of testing each param seperately
-        let i = 0
-        // TODO: see regex path note at top
-        // Build out any missing path parameters.
-        const pathParams = typeof path === 'string'
-          ? path.match(pathParamRegExp)
-          : path.toString().match(regexParamRegExp)
- 
-        for (const pathParam of pathParams || []) {
-          const paramName = pathParam.startsWith(':')
-            ? pathParam.substring(1)
-            : pathParam.slice(2, -1)
-          let paramDef = endpointDef.parameters.find((p) => p.name === paramName)
-          Iif (paramDef === undefined) {
-            paramDef = { name : paramName }
-            endpointDef.parameters.push(paramDef) // TODO: I assume pushing and sorting more is quicker than unshift and sorting less
-          }
-          paramDef.required = true
-          paramDef.inPath = true
-          paramDef.position = i
-          paramDef.isSingleValue = true
-          i += 1
-        }
- 
-        for (const paramDef of endpointDef.parameters) {
-          if (paramDef.inPath === undefined && paramDef.inQuery === undefined) {
-            paramDef.inQuery = true
-          }
-          Object.freeze(paramDef) // the paramDef is fully specified and shouldn't be changed here on out
-        }
-      }
- 
-      // sort path parameters first
-      if (!Object.isFrozen(endpointDef.parameters)) { // This can happen while testing or reloading
-        endpointDef.parameters.sort((a, b) => {
-          Iif (a.inPath === true && b.inQuery === true) {
-            return -1
-          }
-          else Iif (b.inPath === true && a.inQuery === true) {
-            return 1
-          }
-          else Iif (a.inPath) /* sort by position */ return a.position > b.position ? 1 : -1 // position is never equal
-          else /* query param; sort by name */ return a.name.localeCompare(b.name)
-        })
-      }
- 
-      // a little cleanup and annotation
-      endpointDef.method = methodUpper
-      delete endpointDef.func
-      try {
-        // endpointDef.matcher = '^\/' + endpointDef.path.replace(pathParamRegExp, '[^/]+') + '[/#?]?$'
-        // TODO: see regex path note at top
-        endpointDef.matcher = typeof routablePath === 'string'
-          ? pathToRegexp(routablePath).toString().slice(1, -2)
-          : routablePath.toString().slice(1, -1)
-      }
-      catch (e) {
-        reporter.error(`Exception while attempting to process path '${path}'. Perhaps there are special characters that need escaping; try '([*])' where '*' is your special character. Error message: ${e.message}`)
-        throw e
-      }
- 
-      // lockdown our internal setup
-      Object.freeze(endpointDef)
-      Object.freeze(parameters)
-      app.ext.handlers.push(endpointDef)
- 
-      if (help !== undefined) {
-        Iif (!Array.isArray(path)) {
-          throw new Error(`Endpoint '${path}' (from ${npmName}) defines help and must use an array style path.`)
-        }
- 
-        const helpPathTemplate = [...path]
-        helpPathTemplate.unshift('help')
-        // const helpPostfix = [...path]
-        // helpPostfix.push('help')
- 
-        const helpPath = helpPathTemplate.map((b) => b.startsWith(':') ? '-' + b.slice(1) + '-' : b)
-        const routableHelpPath =
-          cleanReForExpress(processCommandPath({ app, model, pathArr : helpPath, parameters : helpParameters }))
-        const helpFunc = sendHelp({ help, method, path, parameters }) // from the main endpoint
-        app.get(routableHelpPath,
-          processParams({ parameters : helpParameters, path : helpPath }),
-          helpFunc({ model, reporter }))
- 
-        const helpEndpointDef = {
-          method        : 'GET',
-          parameters    : helpParameters,
-          path          : helpPathTemplate,
-          routabblePath : routableHelpPath.toString(),
-          npmName,
-          matcher       : routableHelpPath.toString().slice(1, -1)
-        }
-        Object.freeze(helpEndpointDef)
-        app.ext.handlers.push(helpEndpointDef)
-      } // load help 'if (help !== undefined)'
-    } // for (const path of paths || [ aPath ]) {...}
-  } // for (const handler of handlers) {...}
-}
- 
-export {
-  registerHandlers
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/lib/reporter.js.html b/qa/coverage/src/lib/reporter.js.html deleted file mode 100644 index 93765aca..00000000 --- a/qa/coverage/src/lib/reporter.js.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - Code coverage report for src/lib/reporter.js - - - - - - - - - -
-
-

All files / src/lib reporter.js

-
- -
- 61.11% - Statements - 11/18 -
- - -
- 37.5% - Branches - 3/8 -
- - -
- 42.85% - Functions - 3/7 -
- - -
- 62.5% - Lines - 10/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51  -  -4x -  -  -  -  -  -  -  -  -4x -  -  -  -16x -8x -8x -  -8x -  -8x -48x -65x -  -  -  -  -  -  -  -  -8x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// import clc from 'chalk'
- 
-const outputMethodNames = [
-  'debug',
-  'error',
-  'info',
-  'log',
-  'table',
-  'warn'
-]
- 
-const Reporter = class {
-  #configuration
-  #taskReport
- 
-  constructor({ _taskReport, ...configOptions } = {}) {
-    this.#configuration = { silent : false }
-    this.configure(configOptions)
- 
-    this.#taskReport = [...(_taskReport || [])]
- 
-    for (const methodName of outputMethodNames) {
-      this[methodName] = (...msgs) => {
-        if (this.#configuration.silent) return
-        // else, not silent
-        // TODO: color error and warning? Add 'noColor' option
-        console[methodName](...msgs)
-      }
-    }
-  }
- 
-  configure(options = {}) {
-    this.#configuration = Object.assign(this.#configuration, options)
-  }
- 
-  isolate() {
-    return new Reporter(Object.assign({}, this.#configuration, { _taskReport : this.#taskReport }))
-  }
- 
-  push(msg, { noLog = false } = {}) {
-    this.#taskReport.push(msg)
-    Iif (noLog !== true) this.log(msg)
-  }
- 
-  get taskReport() { return [...this.#taskReport] }
- 
-  reset() { this.#taskReport = [] }
-}
- 
-export { Reporter }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/coverage/src/server.mjs.html b/qa/coverage/src/server.mjs.html deleted file mode 100644 index ae34a9fb..00000000 --- a/qa/coverage/src/server.mjs.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/server.mjs - - - - - - - - - -
-
-

All files / src server.mjs

-
- -
- 0% - Statements - 0/19 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Reporter } from './lib/reporter'
- 
-const startServer = async({
-  appInit, // the init function
-  name,
-  reporter, // customized reporter
-  // the rest are app options
-  port
-}) => {
-  reporter = reporter || new Reporter()
- 
-  Iif (!port) {
-    throw new Error("No 'port' provided; bailing out.")
-  }
- 
-  const { app, cache } = await appInit({ reporter })
- 
-  const server = app.listen(port, (err) => {
-    Iif (err) {
-      reporter.error(`Error while starting ${name} server.\n${err}`)
-      return
-    } // else good to go!
- 
-    reporter.log(`Server listening on ${port}`)
-    reporter.log('Press Ctrl+C to quit.')
-  })
- 
-  // support clean shutdown via sigterm
-  process.on('SIGTERM', () => {
-    server.close(() => {
-      cache.release()
-      reporter.log('Server shut down.')
-    })
- 
-    // see https://github.com/liquid-labs/pluggable-express/issues/211
-    process.exit()
-  })
- 
-  return server
-}
- 
-export { startServer }
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/qa/lint.txt b/qa/lint.txt deleted file mode 100644 index b148801c..00000000 --- a/qa/lint.txt +++ /dev/null @@ -1 +0,0 @@ -Test git rev: 137aaa8e7506637a1915e6fa5e3edffbcddbbcdf diff --git a/qa/unit-test.txt b/qa/unit-test.txt deleted file mode 100644 index 71d4ec7a..00000000 --- a/qa/unit-test.txt +++ /dev/null @@ -1,75 +0,0 @@ -Test git rev: 137aaa8e7506637a1915e6fa5e3edffbcddbbcdf -(node:55997) [DEP0170] DeprecationWarning: The URL git+ssh://git@github.com:liquid-labs/regex-repo.git is invalid. Future versions of Node.js will throw an error. -(Use `node --trace-deprecation ...` to show where the warning was created) -PASS test/app.test.js -PASS handlers/server/test/next-commands.test.js -PASS handlers/server/test/version.test.js -PASS handlers/server/test/api.test.js -PASS handlers/server/plugins/_lib/test/install-plugins-errors.test.js -PASS handlers/server/plugins/_lib/test/error-utils.test.js -PASS lib/test/find-own-home.test.js -PASS handlers/server/plugins/_lib/test/install-plugins-data.test.js -PASS handlers/server/plugins/test/details.test.js -PASS handlers/server/plugins/test/add.test.js -PASS handlers/server/plugins/_lib/test/install-plugins-basic.test.js -PASS handlers/server/plugins/_lib/test/install-plugins-keyword.test.js -PASS handlers/server/plugins/test/remove.test.js -PASS handlers/server/plugins/test/list.test.js -PASS handlers/server/_lib/test/options-tokenizer.test.js -----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- -File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s -----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- -All files | 68.4 | 54.62 | 57.86 | 69.53 | - src | 48.48 | 32.69 | 14.28 | 49.21 | - app.js | 56.63 | 35.41 | 20 | 57.79 | 53,72,103,109-110,149-167,171-201,209,215-217,223-224,230-239 - server.mjs | 0 | 0 | 0 | 0 | 1-40 - src/handlers | 70 | 100 | 50 | 66.66 | - heartbeat.mjs | 70 | 100 | 50 | 66.66 | 11-13 - src/handlers/help | 100 | 100 | 100 | 100 | - help.mjs | 100 | 100 | 100 | 100 | - src/handlers/help/lib | 23.93 | 0 | 14.28 | 23.14 | - formatter-md.mjs | 12.12 | 0 | 0 | 12.9 | 4-16,20-55 - formatter-terminal.mjs | 11.42 | 0 | 0 | 11.76 | 3-15,20-57 - formatter-text.mjs | 13.33 | 0 | 0 | 13.79 | 5-17,21-51 - print-path.mjs | 50 | 0 | 0 | 100 | 1 - send-help.mjs | 93.33 | 100 | 75 | 92.3 | 15 - src/handlers/server | 75.36 | 64.06 | 84.61 | 78.22 | - api.mjs | 100 | 100 | 100 | 100 | - next-commands.mjs | 73.11 | 61.4 | 100 | 78.57 | 70-86,96-102,161,166 - reload.mjs | 77.77 | 100 | 50 | 75 | 12-14 - stop.mjs | 50 | 0 | 50 | 46.15 | 11-21 - version.js | 100 | 100 | 100 | 100 | - src/handlers/server/_lib | 95.34 | 90 | 100 | 97.22 | - next-options.mjs | 94.44 | 89.09 | 100 | 96.55 | 65,107 - options-tokenizer.mjs | 100 | 100 | 100 | 100 | - src/handlers/server/errors | 39.43 | 0 | 25 | 40.32 | - detail.mjs | 26.08 | 0 | 22.22 | 27.27 | 15-39,43-63,70,75-80 - list.mjs | 64 | 100 | 27.27 | 72.22 | 19,22,27-30 - src/handlers/server/plugins | 85 | 30.76 | 75.75 | 86.4 | - add.mjs | 100 | 100 | 100 | 100 | - details.mjs | 100 | 100 | 100 | 100 | - list.mjs | 63.04 | 7.4 | 50 | 65.78 | 36-50,54,70,87 - remove.mjs | 97.05 | 60 | 100 | 96.66 | 42 - src/handlers/server/plugins/_lib | 86.11 | 89.09 | 78.57 | 86.95 | - add-plugins.mjs | 0 | 0 | 0 | 0 | 2-29 - error-utils.mjs | 100 | 100 | 100 | 100 | - install-plugins.mjs | 100 | 100 | 100 | 100 | - list-plugins.mjs | 66.66 | 0 | 0 | 66.66 | 9 - src/lib | 77.41 | 64.55 | 64.44 | 79.55 | - configurables.js | 66.66 | 100 | 0 | 100 | - find-own-home.mjs | 100 | 100 | 100 | 100 | - get-server-settings.mjs | 100 | 90 | 100 | 100 | 11 - json-helpers.mjs | 0 | 0 | 0 | 0 | 1-24 - load-plugins.js | 93.67 | 81.66 | 100 | 94.73 | 17,23,125-126 - path-resolvers.js | 0 | 100 | 0 | 0 | 1-8 - path-to-re.mjs | 94.11 | 80 | 100 | 94.11 | 17 - path-var-registry.mjs | 91.66 | 0 | 100 | 91.66 | 30 - register-handlers.js | 73.2 | 53.57 | 60 | 75.35 | 18-25,39,46-47,65,78-83,86,130,151-153,157,160,205-217,232,235,253-254,264 - reporter.js | 61.11 | 37.5 | 42.85 | 62.5 | 27,37-47 -----------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------- - -Test Suites: 15 passed, 15 total -Tests: 173 passed, 173 total -Snapshots: 0 total -Time: 1.627 s, estimated 2 s -Ran all test suites.