UNPKG

@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
"use strict"; 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