UNPKG

@preact-signals/safe-react

Version:
111 lines (100 loc) 3 kB
'use strict'; var node_module = require('node:module'); var core = require('@swc/core'); var path = require('node:path'); var fs = require('node:fs'); var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null; // @ts-check const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('vite.cjs', document.baseURI).href))); /** * * @returns {import('vite').Alias} * @deprecated Since `@preact/signals-react@2.0.0` dropped support of auto signals destructure and this is not typesafe. It's not recommended to use */ const createReactAlias = () => { return { find: /^react$/, replacement: "@preact-signals/safe-react/react", customResolver(source, importer) { if (!importer) { return require$1.resolve(source); } return path.normalize(importer) === require$1.resolve("@preact-signals/safe-react/react") ? require$1.resolve("react") : require$1.resolve("@preact-signals/safe-react/react"); }, }; }; /** * * @param {string} code * @param {string} filename * @returns */ const transformSignals = (code, filename) => core.transform(code, { filename: filename, jsc: { target: "esnext", parser: { syntax: "typescript", tsx: true, }, experimental: { plugins: [["@preact-signals/safe-react/swc", { mode: "manual" }]], }, }, }); /** * * @param {{filter: (id: string) => boolean;}} options * @returns {import('esbuild').Plugin} */ const esbuildPluginBabel = (options) => ({ name: "swc", setup(build) { build.onLoad({ filter: /.*/ }, async (args) => { if (!options.filter(args.path)) return; const contents = await fs.promises.readFile(args.path, "utf8"); if (!contents.includes("@useSignals")) { return { contents }; } return transformSignals(contents, args.path).then((it) => ({ contents: it.code, })); }); }, }); /** * * @param {{filter: (id: string) => boolean}} param0 * @returns {import('vite').PluginOption} */ const createSWCTransformDepsPlugin = ({ filter }) => [ { enforce: "pre", name: "vite:preact-signals-safe-react", config() { return { optimizeDeps: { esbuildOptions: { plugins: [esbuildPluginBabel({ filter })], }, }, }; }, transform(code, id) { if (filter(id) && code.includes("@useSignals")) { this.debug(`transforming ${id}`); return transformSignals(code, id).then((it) => ({ code: it.code, map: it.map, })); } }, }, ]; exports.createReactAlias = createReactAlias; exports.createSWCTransformDepsPlugin = createSWCTransformDepsPlugin; exports.esbuildPluginBabel = esbuildPluginBabel;