@beqa/unplugin-transform-react-slots
Version:
JSX to slot function transpilation plugin for some of the common build systems
118 lines (112 loc) • 4.27 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/webpack.ts
var webpack_exports = {};
__export(webpack_exports, {
default: () => webpack_default
});
module.exports = __toCommonJS(webpack_exports);
// src/index.ts
var import_unplugin = require("unplugin");
var import_pluginutils = require("@rollup/pluginutils");
// src/core/options.ts
var defaultInclude = /\.(js)|(jsx)|(cjs)|(cjsx)|(mjs)|(mjsx)|(tsx)|(ctsx)|(mtsx)/;
function resolveOption(options = {}) {
const include = options.include ?? defaultInclude;
let exclude = [/node_modules/];
if (options.exclude) {
exclude = exclude.concat(options.exclude);
}
return {
include,
exclude
};
}
// src/index.ts
var import_core = require("@babel/core");
var import_babel_plugin_transform_react_slots = __toESM(require("@beqa/babel-plugin-transform-react-slots"));
var import_plugin_syntax_typescript = __toESM(require("@babel/plugin-syntax-typescript"));
var isDisabledRegex = /^(?:\s*(?:\/\/[^\n\r]*|\/\*(?:.|[\n\r])*?\*\/))*\s*\/\/\s*@disable-transform-react-slots\W/;
function appendTestComment(code, isDisabled) {
if (isDisabled) {
code += "/* slot transformation skipped by unplugin-transform-react-slots */";
} else {
code += "/* slot transformation done by unplugin-transform-react-slots */";
}
return code;
}
var src_default = (0, import_unplugin.createUnplugin)((rawOptions) => {
const options = resolveOption(rawOptions);
const filter = (0, import_pluginutils.createFilter)(options.include, options.exclude);
return {
name: "unplugin-transform-react-slots",
enforce: "pre",
transformInclude(id) {
return filter(id);
},
async transform(code, id) {
if (id.endsWith(".ts")) {
return appendTestComment(code, true);
}
if (isDisabledRegex.test(code)) {
return appendTestComment(code, true);
}
if (!(code.includes("@beqa/react-slots") && code.includes("useSlot"))) {
return appendTestComment(code, true);
}
const transformed = await (0, import_core.transformAsync)(code, {
plugins: [
id.endsWith(".tsx") ? [import_plugin_syntax_typescript.default, { isTSX: true }] : "",
import_babel_plugin_transform_react_slots.default
].filter(Boolean),
filename: id
});
if (!transformed) {
throw new Error(
"unplugin-transform-react-slots failed to transform file: " + id
);
}
return transformed.code && appendTestComment(transformed.code, false);
},
esbuild: {
onLoadFilter: !!options.include && !Array.isArray(options.include) ? options.include : defaultInclude,
loader(code, id) {
if (id.endsWith("tsx")) {
return "tsx";
}
if (id.endsWith("ts")) {
return "ts";
}
return "jsx";
}
}
};
});
// src/webpack.ts
var webpack_default = src_default.webpack;