artillery
Version:
Cloud-scale load testing. https://www.artillery.io
57 lines (50 loc) • 2.05 kB
text/typescript
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { createRequire } from 'node:module';
import path from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url';
const require = createRequire(import.meta.url);
// Built-in plugin & engine packages. They live as private workspace
// packages in the monorepo and are bundled into the published artillery
// package under dist/builtin-packages (see
// scripts/copy-builtin-packages.mjs). Their runtime dependencies are
// declared in artillery's own package.json - the copy script enforces
// this invariant at build time.
export const BUILTIN_PACKAGE_NAMES = [
'artillery-engine-playwright',
'artillery-plugin-apdex',
'artillery-plugin-ensure',
'artillery-plugin-expect',
'artillery-plugin-fake-data',
'artillery-plugin-metrics-by-endpoint',
'artillery-plugin-publish-metrics',
'artillery-plugin-slack'
];
// Compiled location of this file is dist/lib/builtin-packages.js, so the
// bundled packages sit one level up in dist/builtin-packages.
export const BUILTIN_PACKAGES_DIR = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
'..',
'builtin-packages'
);
// Resolution order: bare specifier first (a user-installed copy wins, and
// monorepo workspace symlinks resolve in dev), bundled copy second.
export function resolveBuiltinPackage(name: string): string {
try {
return require.resolve(name);
} catch (bareErr) {
try {
return require.resolve(path.join(BUILTIN_PACKAGES_DIR, name));
} catch (_builtinErr) {
throw bareErr;
}
}
}
// Resolve with CJS semantics, load with import() - handles both CJS and
// ESM packages. CJS: default === module.exports; ESM: named exports via
// the namespace.
export async function loadBuiltinPackage(name: string) {
const ns = await import(pathToFileURL(resolveBuiltinPackage(name)).href);
return ns.default ?? ns;
}