@cloudflare/vitest-pool-workers
Version:
Workers Vitest integration for writing Vitest unit and integration tests that run inside the Workers runtime
226 lines (218 loc) • 11.4 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/config/index.ts
var config_exports = {};
__export(config_exports, {
buildPagesASSETSBinding: () => buildPagesASSETSBinding,
defineWorkersConfig: () => defineWorkersConfig,
defineWorkersProject: () => defineWorkersProject,
readD1Migrations: () => readD1Migrations
});
module.exports = __toCommonJS(config_exports);
// <define:VITEST_POOL_WORKERS_DEFINE_BUILTIN_MODULES>
var define_VITEST_POOL_WORKERS_DEFINE_BUILTIN_MODULES_default = ["workerd:compatibility-flags", "node-internal:async_hooks", "node-internal:buffer", "node-internal:crypto", "node-internal:module", "node-internal:util", "node-internal:diagnostics_channel", "node-internal:zlib", "node-internal:url", "node-internal:dns", "node-internal:timers", "node:_stream_duplex", "node:_stream_passthrough", "node:_stream_readable", "node:_stream_transform", "node:_stream_writable", "node:_tls_common", "node:_tls_wrap", "node:assert", "node:assert/strict", "node:async_hooks", "node:buffer", "node:crypto", "node:diagnostics_channel", "node:dns", "node:dns/promises", "node:events", "node:module", "node:net", "node:path", "node:path/posix", "node:path/win32", "node:process", "node:querystring", "node:stream", "node:stream/consumers", "node:stream/promises", "node:stream/web", "node:string_decoder", "node:test", "node:timers", "node:timers/promises", "node:tls", "node:url", "node:util", "node:util/types", "node:zlib", "node-internal:constants", "node-internal:crypto_cipher", "node-internal:crypto_dh", "node-internal:crypto_hash", "node-internal:crypto_hkdf", "node-internal:crypto_keys", "node-internal:crypto_pbkdf2", "node-internal:crypto_random", "node-internal:crypto_scrypt", "node-internal:crypto_sign", "node-internal:crypto_spkac", "node-internal:crypto_util", "node-internal:crypto_x509", "node-internal:debuglog", "node-internal:events", "node-internal:internal_assert", "node-internal:internal_assertionerror", "node-internal:internal_buffer", "node-internal:internal_comparisons", "node-internal:internal_diffs", "node-internal:internal_dns", "node-internal:internal_dns_client", "node-internal:internal_dns_constants", "node-internal:internal_dns_promises", "node-internal:internal_errors", "node-internal:internal_inspect", "node-internal:internal_net", "node-internal:internal_path", "node-internal:internal_querystring", "node-internal:internal_stringdecoder", "node-internal:internal_timers", "node-internal:internal_timers_promises", "node-internal:internal_tls", "node-internal:internal_tls_common", "node-internal:internal_tls_wrap", "node-internal:internal_types", "node-internal:internal_url", "node-internal:internal_utils", "node-internal:internal_zlib", "node-internal:internal_zlib_base", "node-internal:internal_zlib_constants", "node-internal:legacy_url", "node-internal:mock", "node-internal:process", "node-internal:streams_adapters", "node-internal:streams_compose", "node-internal:streams_duplex", "node-internal:streams_legacy", "node-internal:streams_pipeline", "node-internal:streams_promises", "node-internal:streams_readable", "node-internal:streams_transform", "node-internal:streams_util", "node-internal:streams_writable", "node-internal:validators", "internal:unsafe-eval", "cloudflare-internal:sockets", "cloudflare:ai", "cloudflare:br", "cloudflare:email", "cloudflare:pipelines", "cloudflare:sockets", "cloudflare:vectorize", "cloudflare:workers", "cloudflare:workflows", "cloudflare-internal:ai-api", "cloudflare-internal:aig-api", "cloudflare-internal:autorag-api", "cloudflare-internal:br-api", "cloudflare-internal:d1-api", "cloudflare-internal:images-api", "cloudflare-internal:pipeline-transform", "cloudflare-internal:vectorize-api", "cloudflare-internal:workflows-api", "cloudflare-internal:workers", "cloudflare-internal:env", "workerd:unsafe"];
// src/config/index.ts
var import_node_assert = __toESM(require("node:assert"));
var import_node_crypto = __toESM(require("node:crypto"));
var import_promises = __toESM(require("node:fs/promises"));
var import_node_module = require("node:module");
var import_node_path2 = __toESM(require("node:path"));
var import_node_worker_threads = require("node:worker_threads");
// src/shared/builtin-modules.ts
var workerdBuiltinModules = /* @__PURE__ */ new Set([
...define_VITEST_POOL_WORKERS_DEFINE_BUILTIN_MODULES_default,
"__STATIC_CONTENT_MANIFEST"
]);
// src/config/d1.ts
var import_node_fs = __toESM(require("node:fs"));
var import_node_path = __toESM(require("node:path"));
async function readD1Migrations(migrationsPath) {
if (typeof migrationsPath !== "string") {
throw new TypeError(
"Failed to execute 'readD1Migrations': parameter 1 is not of type 'string'."
);
}
const { unstable_splitSqlQuery } = await import("wrangler");
const names = import_node_fs.default.readdirSync(migrationsPath).filter((name) => name.endsWith(".sql"));
names.sort((a, b) => {
const aNumber = parseInt(a.split("_")[0]);
const bNumber = parseInt(b.split("_")[0]);
return aNumber - bNumber;
});
return names.map((name) => {
const migrationPath = import_node_path.default.join(migrationsPath, name);
const migration = import_node_fs.default.readFileSync(migrationPath, "utf8");
const queries = unstable_splitSqlQuery(migration);
return { name, queries };
});
}
// src/config/pages.ts
async function buildPagesASSETSBinding(assetsPath) {
if (typeof assetsPath !== "string") {
throw new TypeError(
"Failed to execute 'buildPagesASSETSBinding': parameter 1 is not of type 'string'."
);
}
const { unstable_generateASSETSBinding } = await import("wrangler");
const log = {
...console,
debugWithSanitization: console.debug,
loggerLevel: "info",
columns: process.stdout.columns
};
return unstable_generateASSETSBinding({ log, directory: assetsPath });
}
// src/config/index.ts
var cloudflareTestPath = import_node_path2.default.resolve(
__dirname,
"../worker/lib/cloudflare/test.mjs"
);
var channel;
globalThis.structuredClone ??= function(value, options) {
channel ??= new import_node_worker_threads.MessageChannel();
channel.port1.unref();
channel.port2.unref();
channel.port1.postMessage(value, options?.transfer);
const message = (0, import_node_worker_threads.receiveMessageOnPort)(channel.port2);
(0, import_node_assert.default)(message !== void 0);
return message.message;
};
function mapAnyConfigExport(f, config) {
if (typeof config === "function") {
return (env) => {
const t = config(env);
if (t instanceof Promise) {
return t.then(f);
} else {
return f(t);
}
};
} else if (config instanceof Promise) {
return config.then(f);
} else {
return f(config);
}
}
function ensureArrayIncludes(array, items) {
for (const item of items) {
if (!array.includes(item)) {
array.push(item);
}
}
}
function ensureArrayExcludes(array, items) {
for (let i = 0; i < array.length; i++) {
if (items.includes(array[i])) {
array.splice(i, 1);
i--;
}
}
}
var requiredConditions = ["workerd", "worker", "browser"];
var requiredMainFields = ["browser", "module", "jsnext:main", "jsnext"];
function createConfigPlugin() {
const uuid = import_node_crypto.default.randomUUID();
let main;
return {
name: "@cloudflare/vitest-pool-workers:config",
api: {
setMain(newMain) {
main = newMain;
}
},
// Run after `vitest:project` plugin:
// https://github.com/vitest-dev/vitest/blob/v3.0.5/packages/vitest/src/node/plugins/workspace.ts#L37
config(config) {
config.resolve ??= {};
config.resolve.conditions ??= [];
config.resolve.mainFields ??= [];
config.ssr ??= {};
config.test ??= {};
ensureArrayExcludes(config.resolve.conditions, ["node"]);
ensureArrayIncludes(config.resolve.conditions, requiredConditions);
ensureArrayIncludes(config.resolve.mainFields, requiredMainFields);
config.ssr.target = "webworker";
config.test.deps ??= {};
config.test.deps.optimizer ??= {};
config.test.deps.optimizer.ssr ??= {};
config.test.deps.optimizer.ssr.enabled ??= true;
config.test.deps.optimizer.ssr.include ??= [];
ensureArrayIncludes(config.test.deps.optimizer.ssr.include, ["chai"]);
config.test.deps.optimizer.ssr.exclude ??= [];
ensureArrayIncludes(config.test.deps.optimizer.ssr.exclude, [
...workerdBuiltinModules,
...import_node_module.builtinModules.concat(import_node_module.builtinModules.map((m) => `node:${m}`))
]);
config.test.pool ??= "@cloudflare/vitest-pool-workers";
},
resolveId(id) {
if (id === "cloudflare:test") {
return `\0cloudflare:test-${uuid}`;
}
},
async load(id) {
if (id === `\0cloudflare:test-${uuid}`) {
let contents = await import_promises.default.readFile(cloudflareTestPath, "utf8");
if (main !== void 0) {
contents += `import ${JSON.stringify(main)};`;
}
return contents;
}
}
};
}
function ensureWorkersConfig(config) {
config.plugins ??= [];
config.plugins.push(createConfigPlugin());
return config;
}
function defineWorkersConfig(config) {
if (typeof config === "function") {
return mapAnyConfigExport(ensureWorkersConfig, config);
} else if (config instanceof Promise) {
return mapAnyConfigExport(ensureWorkersConfig, config);
}
return mapAnyConfigExport(ensureWorkersConfig, config);
}
function defineWorkersProject(config) {
if (typeof config === "function") {
return mapAnyConfigExport(ensureWorkersConfig, config);
} else if (config instanceof Promise) {
return mapAnyConfigExport(ensureWorkersConfig, config);
}
return mapAnyConfigExport(ensureWorkersConfig, config);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
buildPagesASSETSBinding,
defineWorkersConfig,
defineWorkersProject,
readD1Migrations
});
//# sourceMappingURL=index.cjs.map