UNPKG

@tbruun/esbuild-plugin-polyfill-node

Version:

ESBuild plugin for polyfilling Node.js builtins for edge and Deno

267 lines (265 loc) 9.54 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/index.ts var src_exports = {}; __export(src_exports, { polyfillNode: () => polyfillNode, polyfillNodeForDeno: () => polyfillNodeForDeno }); module.exports = __toCommonJS(src_exports); var import_url = require("url"); var import_path = require("path"); var import_meta = {}; var filename = typeof __filename === "undefined" ? (0, import_url.fileURLToPath)(import_meta.url) : __filename; var importMetaUrl = import_meta.url ?? (0, import_url.pathToFileURL)(filename).href; function polyfillNode(options = {}) { const { globals: { buffer = true, process = true } = {}, polyfills = {} } = options; polyfills.fs = polyfills.fs ?? "empty"; polyfills.crypto = polyfills.crypto ?? "empty"; polyfills.dns = polyfills.dns ?? "empty"; polyfills.dgram = polyfills.dgram ?? "empty"; polyfills.cluster = polyfills.cluster ?? "empty"; polyfills.repl = polyfills.repl ?? "empty"; polyfills.tls = polyfills.tls ?? "empty"; const moduleNames = [ .../* @__PURE__ */ new Set([ ...Object.keys(npmPolyfillMap), ...emptyShims.keys(), ...Object.keys(polyfills), "inherits" ]) ]; const filter = new RegExp(`^(node:)?(${moduleNames.join("|")})$`); return { name: "node-polyfills", setup(build) { build.onResolve({ filter }, async ({ path, importer }) => { const [, , moduleName] = path.match(filter); const polyfill = polyfills[moduleName] ?? true; if (polyfill === false) { return; } else if (polyfill === "empty") { return { path: (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/empty.js") }; } else if (moduleName === "inherits" && importer === await resolveImport("util/util.js")) { return { path: (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/inherits.js") }; } else if (!npmPolyfillMap[moduleName]) { throw new Error("Cannot find polyfill for " + moduleName); } return { path: await resolveImport(npmPolyfillMap[moduleName]) }; }); build.initialOptions.inject = build.initialOptions.inject || []; build.initialOptions.inject.push( (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/global.js"), (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/__dirname.js"), (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/__filename.js") ); if (buffer) { build.initialOptions.inject.push( (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/buffer.js") ); } if (process) { build.initialOptions.inject.push( (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/process.js") ); } } }; } function polyfillNodeForDeno(options = {}) { const { stdVersion = "0.160.0", globals = true, polyfills = {} } = options; polyfills.dns = polyfills.dns ?? "empty"; polyfills.dgram = polyfills.dgram ?? "empty"; polyfills.cluster = polyfills.cluster ?? "empty"; polyfills.repl = polyfills.repl ?? "empty"; polyfills.tls = polyfills.tls ?? "empty"; const moduleNames = [ .../* @__PURE__ */ new Set([ ...Object.keys(npmPolyfillMap), ...emptyShims.keys(), ...Object.keys(polyfills), "inherits" ]) ]; const filter = new RegExp(`^(node:)?(${moduleNames.join("|")})$`); return { name: "node-polyfills", setup(build) { build.onResolve( { filter: /^virtual:deno-std-node-global$/ }, () => ({ path: `https://deno.land/std@${stdVersion}/node/global.ts`, external: true }) ); build.onResolve({ filter }, async ({ path, importer }) => { const [, , moduleName] = path.match(filter); const polyfill = polyfills[moduleName] ?? true; if (polyfill === false) { return; } else if (polyfill === "empty") { return { path: (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/empty.js") }; } else if (moduleName === "inherits" && polyfills.util === "npm" && importer === await resolveImport("util/util.js")) { return { path: (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/inherits.js") }; } else if (polyfill === true) { if (!denoPolyfills.has(moduleName)) { throw new Error("Cannot find the Deno polyfill for " + moduleName); } return { path: `https://deno.land/std@${stdVersion}/node/${moduleName}.ts`, external: true }; } if (!npmPolyfillMap[moduleName]) { throw new Error("Cannot find NPM polyfill for " + moduleName); } return { path: await resolveImport(npmPolyfillMap[moduleName]) }; }); build.onLoad({ namespace: "polyfillNodeForDeno", filter: /.*/ }, () => ({ contents: denoGlobalsContents(stdVersion) })); if (globals) { build.initialOptions.footer; build.initialOptions.inject = build.initialOptions.inject || []; build.initialOptions.inject.push( (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/global-for-deno.js"), (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/__dirname.js"), (0, import_path.resolve)((0, import_path.dirname)(filename), "../polyfills/__filename.js") ); } } }; } var npmPolyfillMap = { _buffer_list: "readable-stream/lib/internal/streams/buffer_list.js", _stream_passthrough: "readable-stream/lib/_stream_passthrough.js", _stream_readable: "readable-stream/lib/_stream_readable.js", _stream_transform: "readable-stream/lib/_stream_transform.js", _stream_writable: "readable-stream/lib/_stream_writable.js", assert: "assert/build/assert.js", buffer: "buffer-es6/index.js", console: "console-browserify/index.js", crypto: "crypto-browserify/index.js", domain: "domain-browser/source/index.js", events: "events/events.js", http: "stream-http/index.js", https: "stream-http/index.js", os: "os-browserify/browser.js", path: "path/path.js", process: "process-es6/browser.js", punycode: "punycode/punycode.es6.js", querystring: "querystring/index.js", stream: "stream-browserify/index.js", string_decoder: "string_decoder/lib/string_decoder.js", sys: "util/util.js", timers: "timers-browserify/main.js", tty: "tty-browserify/index.js", url: "url/url.js", util: "util/util.js", vm: "vm-browserify/index.js", zlib: "browserify-zlib/lib/index.js" }; var emptyShims = /* @__PURE__ */ new Set([ "dns", "dgram", "child_process", "cluster", "module", "net", "readline", "repl", "tls" ]); var denoPolyfills = /* @__PURE__ */ new Set([ "assert", "assert/strict", "buffer", "console", "constants", "crypto", "child_process", "dns", "events", "fs", "fs/promises", "http", "module", "net", "os", "path", "perf_hooks", "process", "querystring", "readline", "stream", "string_decoder", "sys", "timers", "timers/promises", "tty", "url", "util", "worker_threads" ]); var importMetaResolve; async function resolveImport(specifier) { if (!importMetaResolve) { importMetaResolve = (await import("import-meta-resolve")).resolve; } const resolved = await importMetaResolve(specifier, importMetaUrl); return (0, import_url.fileURLToPath)(resolved); } function denoGlobalsContents(stdVersion) { return ` import "https://deno.land/std@${stdVersion}/node/global.ts"; export const process = globalThis.process; export const Buffer = globalThis.Buffer; export const setImmediate = globalThis.setImmediate; export const clearImmediate = globalThis.clearImmediate; `; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { polyfillNode, polyfillNodeForDeno });