@preact-signals/safe-react
Version:
Manage state with style in React
111 lines (100 loc) • 2.94 kB
JavaScript
;
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.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;