Socket
Socket
Sign inDemoInstall

avvio

Package Overview
Dependencies
Maintainers
9
Versions
83
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

avvio - npm Package Compare versions

Comparing version 8.2.1 to 8.3.0

.gitattributes

393

boot.js
'use strict'
const fastq = require('fastq')
const EE = require('events').EventEmitter
const inherits = require('util').inherits
const EE = require('node:events').EventEmitter
const inherits = require('node:util').inherits
const {
AVV_ERR_EXPOSE_ALREADY_DEFINED,
AVV_ERR_CALLBACK_NOT_FN,
AVV_ERR_PLUGIN_NOT_VALID,
AVV_ERR_ROOT_PLG_BOOTED,
AVV_ERR_READY_TIMEOUT
AVV_ERR_READY_TIMEOUT,
AVV_ERR_ATTRIBUTE_ALREADY_DEFINED
} = require('./lib/errors')
const TimeTree = require('./time-tree')
const Plugin = require('./plugin')
const debug = require('debug')('avvio')
const kAvvio = Symbol('kAvvio')
const kThenifyDoNotWrap = Symbol('kThenifyDoNotWrap')
const {
kAvvio,
kIsOnCloseHandler
} = require('./lib/symbols')
const { TimeTree } = require('./lib/time-tree')
const { Plugin } = require('./lib/plugin')
const { debug } = require('./lib/debug')
const { validatePlugin } = require('./lib/validate-plugin')
const { isBundledOrTypescriptPlugin } = require('./lib/is-bundled-or-typescript-plugin')
const { isPromiseLike } = require('./lib/is-promise-like')
const { thenify } = require('./lib/thenify')
const { executeWithThenable } = require('./lib/execute-with-thenable')
function wrap (server, opts, instance) {
const expose = opts.expose || {}
const useKey = expose.use || 'use'
const afterKey = expose.after || 'after'
const readyKey = expose.ready || 'ready'
const onCloseKey = expose.onClose || 'onClose'
const closeKey = expose.close || 'close'
if (server[useKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(useKey)
}
if (server[afterKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(afterKey)
}
if (server[readyKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(readyKey)
}
server[useKey] = function (fn, opts) {
instance.use(fn, opts)
return this
}
Object.defineProperty(server, 'then', { get: thenify.bind(instance) })
server[kAvvio] = true
server[afterKey] = function (func) {
if (typeof func !== 'function') {
return instance._loadRegistered()
}
instance.after(encapsulateThreeParam(func, this))
return this
}
server[readyKey] = function (func) {
if (func && typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(readyKey, typeof func)
}
return instance.ready(func ? encapsulateThreeParam(func, this) : undefined)
}
server[onCloseKey] = function (func) {
if (typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(onCloseKey, typeof func)
}
instance.onClose(encapsulateTwoParam(func, this))
return this
}
server[closeKey] = function (func) {
if (func && typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(closeKey, typeof func)
}
if (func) {
instance.close(encapsulateThreeParam(func, this))
return this
}
// this is a Promise
return instance.close()
}
}
function Boot (server, opts, done) {

@@ -98,24 +39,24 @@ if (typeof server === 'function' && arguments.length === 1) {

opts = opts || {}
opts.autostart = opts.autostart !== false
opts.timeout = Number(opts.timeout) || 0
opts.expose = opts.expose || {}
if (!(this instanceof Boot)) {
const instance = new Boot(server, opts, done)
if (!new.target) {
return new Boot(server, opts, done)
}
if (server) {
wrap(server, opts, instance)
}
this._server = server || this
this._opts = opts
return instance
if (server) {
this._expose()
}
if (opts.autostart !== false) {
opts.autostart = true
}
/**
* @type {Array<Plugin>}
*/
this._current = []
server = server || this
this._error = null
this._timeout = Number(opts.timeout) || 0
this._server = server
this._current = []
this._error = null
this._isOnCloseHandlerKey = Symbol('isOnCloseHandler')
this._lastUsed = null

@@ -150,11 +91,12 @@

this._doStart = null
this._root = new Plugin(this, root.bind(this), opts, false, 0)
this._root.once('start', (serverName, funcName, time) => {
const nodeId = this.pluginTree.start(null, funcName, time)
this._root.once('loaded', (serverName, funcName, time) => {
this.pluginTree.stop(nodeId, time)
})
})
Plugin.loadPlugin.call(this, this._root, (err) => {
const instance = this
this._root = new Plugin(fastq(this, this._loadPluginNextTick, 1), function root (server, opts, done) {
instance._doStart = done
opts.autostart && instance.start()
}, opts, false, 0)
this._trackPluginLoading(this._root)
this._loadPlugin(this._root, (err) => {
debug('root plugin ready')

@@ -164,4 +106,4 @@ try {

this._root = null
} catch (prereadyError) {
err = err || this._error || prereadyError
} catch (preReadyError) {
err = err || this._error || preReadyError
}

@@ -181,9 +123,2 @@

function root (s, opts, done) {
this._doStart = done
if (opts.autostart) {
this.start()
}
}
inherits(Boot, EE)

@@ -204,14 +139,2 @@

function assertPlugin (plugin) {
// Faux modules are modules built with TypeScript
// or Babel that they export a .default property.
if (plugin && typeof plugin === 'object' && typeof plugin.default === 'function') {
plugin = plugin.default
}
if (!(plugin && (typeof plugin === 'function' || typeof plugin.then === 'function'))) {
throw new AVV_ERR_PLUGIN_NOT_VALID(typeof plugin)
}
return plugin
}
Boot.prototype[kAvvio] = true

@@ -230,5 +153,5 @@

// if the root plugin is not loaded, let's resume that
// so one can use after() befor calling ready
// so one can use after() before calling ready
if (weNeedToStart) {
process.nextTick(() => this._root.q.resume())
process.nextTick(() => this._root.queue.resume())
}

@@ -245,4 +168,7 @@

Boot.prototype._addPlugin = function (plugin, opts, isAfter) {
plugin = assertPlugin(plugin)
Boot.prototype._addPlugin = function (pluginFn, opts, isAfter) {
if (isBundledOrTypescriptPlugin(pluginFn)) {
pluginFn = pluginFn.default
}
validatePlugin(pluginFn)
opts = opts || {}

@@ -257,22 +183,89 @@

const obj = new Plugin(this, plugin, opts, isAfter)
obj.once('start', (serverName, funcName, time) => {
const nodeId = this.pluginTree.start(current.name, funcName, time)
obj.once('loaded', (serverName, funcName, time) => {
this.pluginTree.stop(nodeId, time)
})
})
const plugin = new Plugin(fastq(this, this._loadPluginNextTick, 1), pluginFn, opts, isAfter, this._opts.timeout)
this._trackPluginLoading(plugin)
if (current.loaded) {
throw new Error(obj.name, current.name)
throw new Error(plugin.name, current.name)
}
// we add the plugin to be loaded at the end of the current queue
current.enqueue(obj, (err) => {
if (err) {
this._error = err
current.enqueue(plugin, (err) => { err && (this._error = err) })
return plugin
}
Boot.prototype._expose = function _expose () {
const instance = this
const server = instance._server
const {
use: useKey = 'use',
after: afterKey = 'after',
ready: readyKey = 'ready',
onClose: onCloseKey = 'onClose',
close: closeKey = 'close'
} = this._opts.expose
if (server[useKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(useKey, 'use')
}
server[useKey] = function (fn, opts) {
instance.use(fn, opts)
return this
}
if (server[afterKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(afterKey, 'after')
}
server[afterKey] = function (func) {
if (typeof func !== 'function') {
return instance._loadRegistered()
}
})
instance.after(encapsulateThreeParam(func, this))
return this
}
return obj
if (server[readyKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(readyKey, 'ready')
}
server[readyKey] = function (func) {
if (func && typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(readyKey, typeof func)
}
return instance.ready(func ? encapsulateThreeParam(func, this) : undefined)
}
if (server[onCloseKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(onCloseKey, 'onClose')
}
server[onCloseKey] = function (func) {
if (typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(onCloseKey, typeof func)
}
instance.onClose(encapsulateTwoParam(func, this))
return this
}
if (server[closeKey]) {
throw new AVV_ERR_EXPOSE_ALREADY_DEFINED(closeKey, 'close')
}
server[closeKey] = function (func) {
if (func && typeof func !== 'function') {
throw new AVV_ERR_CALLBACK_NOT_FN(closeKey, typeof func)
}
if (func) {
instance.close(encapsulateThreeParam(func, this))
return this
}
// this is a Promise
return instance.close()
}
if (server.then) {
throw new AVV_ERR_ATTRIBUTE_ALREADY_DEFINED('then')
}
Object.defineProperty(server, 'then', { get: thenify.bind(instance) })
server[kAvvio] = true
}

@@ -299,12 +292,8 @@

if (typeof func !== 'function') {
throw new Error('not a function')
throw new AVV_ERR_CALLBACK_NOT_FN('onClose', typeof func)
}
func[this._isOnCloseHandlerKey] = true
this._closeQ.unshift(func, callback.bind(this))
func[kIsOnCloseHandler] = true
this._closeQ.unshift(func, (err) => { err && (this._error = err) })
function callback (err) {
if (err) this._error = err
}
return this

@@ -374,4 +363,18 @@ }

/**
* @param {Plugin} plugin
* @returns {void}
*/
Boot.prototype._trackPluginLoading = function (plugin) {
const parentName = this._current[0]?.name || null
plugin.once('start', (serverName, funcName, time) => {
const nodeId = this.pluginTree.start(parentName || null, funcName, time)
plugin.once('loaded', (serverName, funcName, time) => {
this.pluginTree.stop(nodeId, time)
})
})
}
Boot.prototype.prettyPrint = function () {
return this.pluginTree.prittyPrint()
return this.pluginTree.prettyPrint()
}

@@ -383,38 +386,72 @@

function noop () { }
/**
* @callback LoadPluginCallback
* @param {Error} [err]
*/
function thenify () {
// If the instance is ready, then there is
// nothing to await. This is true during
// await server.ready() as ready() resolves
// with the server, end we will end up here
// because of automatic promise chaining.
if (this.booted) {
debug('thenify returning null because we are already booted')
/**
* Load a plugin
*
* @param {Plugin} plugin
* @param {LoadPluginCallback} callback
*/
Boot.prototype._loadPlugin = function (plugin, callback) {
const instance = this
if (isPromiseLike(plugin.func)) {
plugin.func.then((fn) => {
if (typeof fn.default === 'function') {
fn = fn.default
}
plugin.func = fn
this._loadPlugin(plugin, callback)
}, callback)
return
}
// Calling resolve(this._server) would fetch the then
// property on the server, which will lead it here.
// If we do not break the recursion, we will loop
// forever.
if (this[kThenifyDoNotWrap]) {
this[kThenifyDoNotWrap] = false
const last = instance._current[0]
// place the plugin at the top of _current
instance._current.unshift(plugin)
if (instance._error && !plugin.isAfter) {
debug('skipping loading of plugin as instance errored and it is not an after', plugin.name)
process.nextTick(execCallback)
return
}
debug('thenify')
return (resolve, reject) => {
const p = this._loadRegistered()
return p.then(() => {
this[kThenifyDoNotWrap] = true
return resolve(this._server)
}, reject)
let server = (last && last.server) || instance._server
if (!plugin.isAfter) {
// Skip override for after
try {
server = instance.override(server, plugin.func, plugin.options)
} catch (overrideErr) {
debug('override errored', plugin.name)
return execCallback(overrideErr)
}
}
plugin.exec(server, execCallback)
function execCallback (err) {
plugin.finish(err, (err) => {
instance._current.shift()
callback(err)
})
}
}
/**
* Delays plugin loading until the next tick to ensure any bound `_after` callbacks have a chance
* to run prior to executing the next plugin
*/
Boot.prototype._loadPluginNextTick = function (plugin, callback) {
process.nextTick(this._loadPlugin.bind(this), plugin, callback)
}
function noop () { }
function callWithCbOrNextTick (func, cb) {
const context = this._server
const err = this._error
let res

@@ -425,17 +462,7 @@ // with this the error will appear just in the next after/ready callback

this._error = err
res = func()
if (res && !res[kAvvio] && typeof res.then === 'function') {
res.then(() => process.nextTick(cb), (e) => process.nextTick(cb, e))
} else {
process.nextTick(cb)
}
executeWithThenable(func, [], cb)
} else if (func.length === 1) {
res = func(err)
if (res && !res[kAvvio] && typeof res.then === 'function') {
res.then(() => process.nextTick(cb), (e) => process.nextTick(cb, e))
} else {
process.nextTick(cb)
}
executeWithThenable(func, [err], cb)
} else {
if (this._timeout === 0) {
if (this._opts.timeout === 0) {
const wrapCb = (err) => {

@@ -459,3 +486,3 @@ this._error = err

const name = func.name
debug('setting up ready timeout', name, this._timeout)
debug('setting up ready timeout', name, this._opts.timeout)
let timer = setTimeout(() => {

@@ -468,3 +495,3 @@ debug('timed out', name)

cb(toutErr)
}, this._timeout)
}, this._opts.timeout)

@@ -491,3 +518,3 @@ if (func.length === 2) {

const context = this._server
const isOnCloseHandler = func[this._isOnCloseHandlerKey]
const isOnCloseHandler = func[kIsOnCloseHandler]
if (func.length === 0 || func.length === 1) {

@@ -494,0 +521,0 @@ let promise

@@ -68,3 +68,3 @@ import { EventEmitter } from "events";

interface Use<I, C = context<I>> {
<O>(fn: avvio.Plugin<O, I>, options?: O): C;
<O>(fn: avvio.Plugin<O, I>, options?: O | ((server: C) => O)): C;
}

@@ -71,0 +71,0 @@

'use strict'
// Code inherited from fastify-error
const { inherits, format } = require('util')
function createError (code, message, Base = Error) {
if (!code) throw new Error('Avvio error code must not be empty')
if (!message) throw new Error('Avvio base error message must not be empty')
const { createError } = require('@fastify/error')
function AvvioError (a, b, c) {
if (!new.target) {
return new AvvioError(a, b, c)
}
Error.captureStackTrace(this, AvvioError)
this.code = code
this.message = message
this.name = 'AvvioError'
// more performant than spread (...) operator
if (a && b && c) {
this.message = format(message, a, b, c)
} else if (a && b) {
this.message = format(message, a, b)
} else if (a) {
this.message = format(message, a)
} else {
this.message = message
}
}
AvvioError.prototype[Symbol.toStringTag] = 'Error'
AvvioError.prototype.toString = function () {
return `${this.name} [${this.code}]: ${this.message}`
}
inherits(AvvioError, Base)
return AvvioError
}
module.exports = {
createError,
AVV_ERR_EXPOSE_ALREADY_DEFINED: createError(
'AVV_ERR_EXPOSE_ALREADY_DEFINED',
"'%s' () is already defined, specify an expose option"
"'%s' is already defined, specify an expose option for '%s'"
),
AVV_ERR_ATTRIBUTE_ALREADY_DEFINED: createError(
'AVV_ERR_ATTRIBUTE_ALREADY_DEFINED',
"'%s' is already defined"
),
AVV_ERR_CALLBACK_NOT_FN: createError(

@@ -57,3 +23,3 @@ 'AVV_ERR_CALLBACK_NOT_FN',

AVV_ERR_ROOT_PLG_BOOTED: createError(
'AVV_ERR_PLUGIN_NOT_VALID',
'AVV_ERR_ROOT_PLG_BOOTED',
'Root plugin has already booted'

@@ -68,3 +34,7 @@ ),

"Plugin did not start in time: '%s'. You may have forgotten to call 'done' function or to resolve a Promise"
),
AVV_ERR_PLUGIN_EXEC_TIMEOUT: createError(
'AVV_ERR_PLUGIN_EXEC_TIMEOUT',
"Plugin did not start in time: '%s'. You may have forgotten to call 'done' function or to resolve a Promise"
)
}
{
"name": "avvio",
"version": "8.2.1",
"version": "8.3.0",
"description": "Asynchronous bootstrapping of Node applications",
"main": "boot.js",
"type": "commonjs",
"scripts": {
"test": "standard && tap -J test/*test.js && npm run typescript",
"typescript": "tsc --project ./test/types/tsconfig.json"
"lint": "standard",
"lint:fix": "standard --fix",
"test": "npm run test:unit && npm run test:typescript",
"test:unit": "tap",
"test:typescript": "tsc --project ./test/types/tsconfig.json"
},
"precommit": "test",
"precommit": [
"lint",
"test"
],
"repository": {

@@ -35,15 +42,14 @@ "type": "git",

"@fastify/pre-commit": "^2.0.2",
"@types/node": "^18.0.0",
"@types/node": "^20.1.0",
"express": "^4.17.1",
"semver": "^7.1.3",
"standard": "^17.0.0",
"tap": "^16.0.0",
"then-sleep": "^1.0.1",
"typescript": "^4.0.2"
"typescript": "^5.0.2"
},
"dependencies": {
"@fastify/error": "^3.3.0",
"archy": "^1.0.0",
"debug": "^4.0.0",
"fastq": "^1.6.1"
"fastq": "^1.17.1"
}
}

@@ -475,3 +475,3 @@ # avvio

```js
const assert = require('assert')
const assert = require('node:assert')
const server = { count: 0 }

@@ -620,7 +620,7 @@ const app = require('avvio')(server)

{
"label": "bound root",
"label": "root",
"start": 1550245184665,
"nodes": [
{
"parent": "bound root",
"parent": "root",
"start": 1550245184665,

@@ -642,3 +642,3 @@ "label": "first",

{
"parent": "bound root",
"parent": "root",
"start": 1550245184709,

@@ -691,2 +691,2 @@ "label": "third",

[MIT]: ./LICENSE
[example]: ./example.js
[example]: ./examples/example.js

@@ -6,3 +6,7 @@ 'use strict'

const { test } = require('tap')
const sleep = require('then-sleep')
const sleep = function (ms) {
return new Promise(function (resolve) {
setTimeout(resolve, ms)
})
}

@@ -9,0 +13,0 @@ const boot = require('..')

@@ -5,6 +5,6 @@ 'use strict'

const boot = require('..')
const { promisify } = require('util')
const { promisify } = require('node:util')
const sleep = promisify(setTimeout)
const fs = require('fs').promises
const path = require('path')
const fs = require('node:fs').promises
const path = require('node:path')

@@ -11,0 +11,0 @@ test('await after - nested plugins with same tick callbacks', async (t) => {

'use strict'
const { test } = require('tap')
const { promisify } = require('util')
const { promisify } = require('node:util')
const sleep = promisify(setTimeout)

@@ -6,0 +6,0 @@ const boot = require('..')

@@ -64,3 +64,3 @@ 'use strict'

test('boot an app with a plugin and a callback', (t) => {
test('boot an app with a plugin and a callback /1', (t) => {
t.plan(2)

@@ -78,2 +78,15 @@

test('boot an app with a plugin and a callback /2', (t) => {
t.plan(2)
const app = boot({}, () => {
t.pass('booted')
})
app.use(function (server, opts, done) {
t.pass('plugin loaded')
done()
})
})
test('boot a plugin with a custom server', (t) => {

@@ -102,3 +115,3 @@ t.plan(4)

test('custom instance should inherits avvio methods', (t) => {
test('custom instance should inherits avvio methods /1', (t) => {
t.plan(6)

@@ -132,2 +145,31 @@

test('custom instance should inherits avvio methods /2', (t) => {
t.plan(6)
const server = {}
const app = new boot(server, {}) // eslint-disable-line new-cap
server.use(function (s, opts, done) {
t.equal(s, server, 'the first argument is the server')
t.same(opts, {}, 'no options')
done()
}).after(() => {
t.ok('after called')
})
server.onClose(() => {
t.ok('onClose called')
})
server.ready(() => {
t.ok('ready called')
})
app.on('start', () => {
server.close(() => {
t.pass('booted')
})
})
})
test('boot a plugin with options', (t) => {

@@ -134,0 +176,0 @@ t.plan(3)

@@ -43,32 +43,2 @@ 'use strict'

;['use', 'after', 'ready'].forEach((key) => {
test('throws if ' + key + ' is already there', (t) => {
t.plan(1)
const app = {}
app[key] = () => {}
try {
boot(app)
t.fail('error must happen')
} catch (err) {
t.equal(err.message, `'${key}' () is already defined, specify an expose option`)
}
})
test('support expose for ' + key, (t) => {
const app = {}
app[key] = () => {}
const expose = {}
expose[key] = 'muahah'
boot(app, {
expose
})
t.end()
})
})
test('chainable standalone with server', (t) => {

@@ -75,0 +45,0 @@ t.plan(6)

@@ -5,2 +5,3 @@ 'use strict'

const boot = require('..')
const { AVV_ERR_CALLBACK_NOT_FN } = require('../lib/errors')

@@ -498,3 +499,3 @@ test('boot an app with a plugin', (t) => {

app.use(function (server, opts, done) {
t.throws(() => app.onClose({}), { message: 'not a function' })
t.throws(() => app.onClose({}), new AVV_ERR_CALLBACK_NOT_FN('onClose', 'object'))
done()

@@ -501,0 +502,0 @@ })

'use strict'
const { test } = require('tap')
const { createError } = require('../lib/errors')
const errors = require('../lib/errors')
const expectedErrorName = 'AvvioError'
test('Correct codes of AvvioErrors', t => {
const testcases = [
'AVV_ERR_EXPOSE_ALREADY_DEFINED',
'AVV_ERR_ATTRIBUTE_ALREADY_DEFINED',
'AVV_ERR_CALLBACK_NOT_FN',
'AVV_ERR_PLUGIN_NOT_VALID',
'AVV_ERR_ROOT_PLG_BOOTED',
'AVV_ERR_PARENT_PLG_LOADED',
'AVV_ERR_READY_TIMEOUT',
'AVV_ERR_PLUGIN_EXEC_TIMEOUT'
]
test('Create error with zero parameter', t => {
t.plan(5)
const NewError = createError('CODE', 'Not available')
const err = new NewError()
t.ok(err instanceof Error)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'Not available')
t.equal(err.code, 'CODE')
})
t.plan(testcases.length + 1)
// errors.js exposes errors and the createError fn
t.equal(testcases.length, Object.keys(errors).length)
test('Create error with 1 parameter', t => {
t.plan(5)
const NewError = createError('CODE', 'hey %s')
const err = new NewError('alice')
t.ok(err instanceof Error)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'hey alice')
t.equal(err.code, 'CODE')
})
test('Create error with 2 parameters', t => {
t.plan(5)
const NewError = createError('CODE', 'hey %s, I like your %s')
const err = new NewError('alice', 'attitude')
t.ok(err instanceof Error)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'hey alice, I like your attitude')
t.equal(err.code, 'CODE')
})
test('Create error with 3 parameters', t => {
t.plan(5)
const NewError = createError('CODE', 'hey %s, I like your %s %s')
const err = new NewError('alice', 'attitude', 'see you')
t.ok(err instanceof Error)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'hey alice, I like your attitude see you')
t.equal(err.code, 'CODE')
})
test('Should throw when error code has no Avvio code', t => {
t.plan(1)
try {
createError()
} catch (err) {
t.equal(err.message, 'Avvio error code must not be empty')
for (const testcase of testcases) {
const error = new errors[testcase]()
t.equal(error.code, testcase)
}
})
test('Should throw when error code has no message', t => {
t.plan(1)
try {
createError('code')
} catch (err) {
t.equal(err.message, 'Avvio base error message must not be empty')
}
})
test('Create error with different base', t => {
t.plan(6)
const NewError = createError('CODE', 'hey %s', TypeError)
const err = new NewError('dude')
t.ok(err instanceof Error)
t.ok(err instanceof TypeError)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'hey dude')
t.equal(err.code, 'CODE')
})
test('AvvioError.toString returns code', t => {
t.plan(1)
const NewError = createError('CODE', 'foo')
const err = new NewError()
t.equal(err.toString(), 'AvvioError [CODE]: foo')
})
test('Create the error without the new keyword', t => {
t.plan(5)
const NewError = createError('CODE', 'Not available')
const err = NewError()
t.ok(err instanceof Error)
t.ok(err.stack)
t.equal(err.name, expectedErrorName)
t.equal(err.message, 'Not available')
t.equal(err.code, 'CODE')
})
'use strict'
const { test } = require('tap')
const semver = require('semver')
test('support import', { skip: semver.lt(process.versions.node, '13.3.0') }, (t) => {
test('support esm import', (t) => {
import('./esm.mjs').then(() => {

@@ -8,0 +7,0 @@ t.pass('esm is supported')

@@ -5,3 +5,3 @@ 'use strict'

const express = require('express')
const http = require('http')
const http = require('node:http')
const boot = require('..')

@@ -8,0 +8,0 @@

@@ -5,2 +5,3 @@ 'use strict'

const boot = require('..')
const { kPluginMeta } = require('../lib/symbols')

@@ -12,3 +13,3 @@ test('plugins get a name from the plugin metadata if it is set', async (t) => {

const func = (app, opts, next) => next()
func[Symbol.for('plugin-meta')] = { name: 'a-test-plugin' }
func[kPluginMeta] = { name: 'a-test-plugin' }
app.use(func)

@@ -18,3 +19,3 @@ await app.ready()

t.match(app.toJSON(), {
label: 'bound root',
label: 'root',
nodes: [

@@ -35,3 +36,3 @@ { label: 'a-test-plugin' }

t.match(app.toJSON(), {
label: 'bound root',
label: 'root',
nodes: [

@@ -52,3 +53,3 @@ { label: 'test registration options name' }

t.match(app.toJSON(), {
label: 'bound root',
label: 'root',
nodes: [

@@ -68,3 +69,3 @@ { label: 'testPlugin' }

t.match(app.toJSON(), {
label: 'bound root',
label: 'root',
nodes: [

@@ -71,0 +72,0 @@ { label: '(app, opts, next) => next()' }

@@ -21,3 +21,3 @@ 'use strict'

t.equal(err.message, message('one'))
t.equal(err.code, 'AVV_ERR_READY_TIMEOUT')
t.equal(err.code, 'AVV_ERR_PLUGIN_EXEC_TIMEOUT')
})

@@ -41,3 +41,3 @@ })

t.equal(err.message, message('two'))
t.equal(err.code, 'AVV_ERR_READY_TIMEOUT')
t.equal(err.code, 'AVV_ERR_PLUGIN_EXEC_TIMEOUT')
})

@@ -55,3 +55,3 @@ })

t.equal(err.message, message('noNext'))
t.equal(err.code, 'AVV_ERR_READY_TIMEOUT')
t.equal(err.code, 'AVV_ERR_PLUGIN_EXEC_TIMEOUT')
})

@@ -72,3 +72,3 @@ })

t.equal(err.message, message('function (app, opts, next) { -- // do not call next on purpose - code as name'))
t.equal(err.code, 'AVV_ERR_READY_TIMEOUT')
t.equal(err.code, 'AVV_ERR_PLUGIN_EXEC_TIMEOUT')
})

@@ -75,0 +75,0 @@ })

@@ -18,19 +18,19 @@ 'use strict'

const linesExpected = [/bound root \d+ ms/,
/├── first \d+ ms/,
/├─┬ duplicate \d+ ms/,
/│ └─┬ duplicate \d+ ms/,
/│ {3}└─┬ duplicate \d+ ms/,
/│ {5}└── duplicate \d+ ms/,
/├── second \d+ ms/,
/├─┬ bound _after \d+ ms/,
/│ └── afterInsider \d+ ms/,
/├── bound _after \d+ ms/,
/├─┬ duplicate \d+ ms/,
/│ └─┬ duplicate \d+ ms/,
/│ {3}└── duplicate \d+ ms/,
/├── third \d+ ms/,
/├── bound _after \d+ ms/,
/└─┬ duplicate \d+ ms/,
/ {2}└── duplicate \d+ ms/,
const linesExpected = [/^root \d+ ms$/,
/^├── first \d+ ms$/,
/^├─┬ duplicate \d+ ms$/,
/^│ └─┬ duplicate \d+ ms$/,
/^│ {3}└─┬ duplicate \d+ ms$/,
/^│ {5}└── duplicate \d+ ms$/,
/^├── second \d+ ms$/,
/^├─┬ bound _after \d+ ms$/,
/^│ └── afterInsider \d+ ms$/,
/^├── bound _after \d+ ms$/,
/^├─┬ duplicate \d+ ms$/,
/^│ └─┬ duplicate \d+ ms$/,
/^│ {3}└── duplicate \d+ ms$/,
/^├── third \d+ ms$/,
/^├── bound _after \d+ ms$/,
/^└─┬ duplicate \d+ ms$/,
/^ {2}└── duplicate \d+ ms$/,
''

@@ -37,0 +37,0 @@ ]

@@ -17,3 +17,3 @@ 'use strict'

id: 'root',
label: 'bound root',
label: 'root',
start: /\d+/,

@@ -73,3 +73,3 @@ nodes: []

id: 'root',
label: 'bound root',
label: 'root',
start: /\d+/,

@@ -79,3 +79,3 @@ nodes: [

id: /.+/,
parent: 'bound root',
parent: 'root',
start: /\d+/,

@@ -82,0 +82,0 @@ label: 'first',

@@ -38,2 +38,14 @@ import * as avvio from "../../";

app.use(async (server, options) => {},
(server) => {
server.use;
server.after;
server.ready;
server.on;
server.start;
server.override;
server.onClose;
server.close;
});
app.after(err => {

@@ -160,2 +172,14 @@ if (err) throw err;

app.use(async (server, options) => {},
(server) => {
server.use;
server.after;
server.ready;
server.on;
server.start;
server.override;
server.onClose;
server.close;
});
app.after(err => {

@@ -275,2 +299,10 @@ if (err) throw err;

app.use(async (server, options) => {},
((server) => {
server.use;
server.after;
server.ready;
server.typescriptIs;
}));
app.after(err => {

@@ -277,0 +309,0 @@ if (err) throw err;

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc