weapp-tailwindcss
Version:
把 tailwindcss 原子化样式思想,带给小程序开发者们! bring tailwindcss to miniprogram developers!
422 lines (403 loc) • 15.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
var _chunkLSSLYD6Bjs = require('./chunk-LSSLYD6B.js');
var _chunkOGROHM4Ljs = require('./chunk-OGROHM4L.js');
var _chunkGRWK73SMjs = require('./chunk-GRWK73SM.js');
var _chunkPLMJW644js = require('./chunk-PLMJW644.js');
var _chunkO335YLYHjs = require('./chunk-O335YLYH.js');
// src/bundlers/vite/index.ts
var _htmltransform = require('@weapp-tailwindcss/postcss/html-transform'); var _htmltransform2 = _interopRequireDefault(_htmltransform);
// src/uni-app-x/index.ts
var _compilerdom = require('@vue/compiler-dom');
var _magicstring = require('magic-string'); var _magicstring2 = _interopRequireDefault(_magicstring);
var _compilersfc = require('vue/compiler-sfc');
function traverse(node, visitor) {
visitor(node);
if (node.children) {
node.children.forEach((child) => traverse(child, visitor));
}
}
var defaultCreateJsHandlerOptions = {
babelParserOptions: {
plugins: [
"typescript"
]
}
};
function transformUVue(code, id, jsHandler, runtimeSet) {
if (!/\.uvue(?:\?.*)?$/.test(id)) {
return;
}
const ms = new (0, _magicstring2.default)(code);
const { descriptor, errors } = _compilersfc.parse.call(void 0, code);
if (errors.length === 0) {
if (descriptor.template) {
let extractClassNames2 = function(node) {
if (node.type === _compilerdom.NodeTypes.ELEMENT) {
node.props.forEach((prop) => {
if (prop.type === _compilerdom.NodeTypes.ATTRIBUTE && prop.name === "class" && prop.value) {
ms.update(prop.value.loc.start.offset + 1, prop.value.loc.end.offset - 1, _chunkPLMJW644js.replaceWxml.call(void 0, prop.value.content));
}
if (prop.type === _compilerdom.NodeTypes.DIRECTIVE && prop.name === "bind" && _optionalChain([prop, 'access', _ => _.arg, 'optionalAccess', _2 => _2.type]) === _compilerdom.NodeTypes.SIMPLE_EXPRESSION && prop.arg.content === "class") {
if (_optionalChain([prop, 'access', _3 => _3.exp, 'optionalAccess', _4 => _4.type]) === _compilerdom.NodeTypes.SIMPLE_EXPRESSION) {
const code2 = _chunkGRWK73SMjs.generateCode.call(void 0, prop.exp.content, {
jsHandler,
runtimeSet
});
ms.update(prop.exp.loc.start.offset, prop.exp.loc.end.offset, code2);
}
}
});
}
};
var extractClassNames = extractClassNames2;
traverse(descriptor.template.ast, extractClassNames2);
}
if (descriptor.script) {
const { code: code2 } = jsHandler(descriptor.script.content, _nullishCoalesce(runtimeSet, () => ( /* @__PURE__ */ new Set())), defaultCreateJsHandlerOptions);
ms.update(descriptor.script.loc.start.offset, descriptor.script.loc.end.offset, code2);
}
if (descriptor.scriptSetup) {
const { code: code2 } = jsHandler(descriptor.scriptSetup.content, _nullishCoalesce(runtimeSet, () => ( /* @__PURE__ */ new Set())), defaultCreateJsHandlerOptions);
ms.update(descriptor.scriptSetup.loc.start.offset, descriptor.scriptSetup.loc.end.offset, code2);
}
}
return {
code: ms.toString(),
// @ts-ignore
get map() {
return ms.generateMap();
}
};
}
// src/bundlers/vite/query.ts
function parseVueRequest(id) {
const [filename, rawQuery] = id.split(`?`, 2);
const query = Object.fromEntries(new URLSearchParams(rawQuery));
if (query.vue != null) {
query.vue = true;
}
if (query.index != null) {
query.index = Number(query.index);
}
if (query.raw != null) {
query.raw = true;
}
if (query.url != null) {
query.url = true;
}
if (query.scoped != null) {
query.scoped = true;
}
return {
filename,
query
};
}
// src/bundlers/vite/utils.ts
var _path = require('path'); var _path2 = _interopRequireDefault(_path);
var _process = require('process'); var _process2 = _interopRequireDefault(_process);
function slash(p) {
return p.replace(/\\/g, "/");
}
var isWindows = _process2.default.platform === "win32";
var cssLangs = `\\.(css|less|sass|scss|styl|stylus|pcss|postcss)($|\\?)`;
var cssLangRE = new RegExp(cssLangs);
function isCSSRequest(request) {
return cssLangRE.test(request);
}
function normalizePath(id) {
return _path2.default.posix.normalize(isWindows ? slash(id) : id);
}
var postfixRE = /[?#].*$/;
function cleanUrl(url) {
return url.replace(postfixRE, "");
}
async function formatPostcssSourceMap(rawMap, file) {
const inputFileDir = _path2.default.dirname(file);
const sources = rawMap.sources.map((source) => {
const cleanSource = cleanUrl(decodeURIComponent(source));
if (cleanSource[0] === "<" && cleanSource.endsWith(">")) {
return `\0${cleanSource}`;
}
return normalizePath(_path2.default.resolve(inputFileDir, cleanSource));
});
return {
file,
mappings: rawMap.mappings,
names: rawMap.names,
sources,
sourcesContent: rawMap.sourcesContent,
version: rawMap.version
};
}
// src/bundlers/vite/index.ts
var debug = _chunkLSSLYD6Bjs.createDebug.call(void 0, );
function UnifiedViteWeappTailwindcssPlugin(options = {}) {
const opts = _chunkGRWK73SMjs.getCompilerContext.call(void 0, options);
const {
disabled,
onEnd,
onLoad,
onStart,
onUpdate,
templateHandler,
styleHandler,
jsHandler,
mainCssChunkMatcher,
appType,
setMangleRuntimeSet,
cache,
twPatcher,
uniAppX
} = opts;
if (disabled) {
return;
}
twPatcher.patch();
let runtimeSet;
onLoad();
const plugins = [
// {
// name: `${vitePluginName}:pre`,
// enforce: 'pre',
// },
{
name: `${_chunkOGROHM4Ljs.vitePluginName}:post`,
enforce: "post",
configResolved(config) {
if (typeof config.css.postcss === "object" && Array.isArray(config.css.postcss.plugins)) {
const idx = config.css.postcss.plugins.findIndex((x) => (
// @ts-ignore
x.postcssPlugin === "postcss-html-transform"
));
if (idx > -1) {
config.css.postcss.plugins.splice(idx, 1, _htmltransform2.default.call(void 0, ));
debug("remove postcss-html-transform plugin from vite config");
}
}
},
async generateBundle(_opt, bundle) {
debug("start");
onStart();
const entries = Object.entries(bundle);
const groupedEntries = _chunkO335YLYHjs.getGroupedEntries.call(void 0, entries, opts);
runtimeSet = await twPatcher.getClassSet();
setMangleRuntimeSet(runtimeSet);
debug("get runtimeSet, class count: %d", runtimeSet.size);
const promises = [];
if (Array.isArray(groupedEntries.html)) {
for (const element of groupedEntries.html) {
const [file, originalSource] = element;
const oldVal = originalSource.source.toString();
const hash = cache.computeHash(oldVal);
cache.calcHashValueChanged(file, hash);
promises.push(
cache.process(
file,
() => {
const source = cache.get(file);
if (source) {
originalSource.source = source;
debug("html cache hit: %s", file);
} else {
return false;
}
},
async () => {
originalSource.source = await templateHandler(oldVal, {
runtimeSet
});
onUpdate(file, oldVal, originalSource.source);
debug("html handle: %s", file);
return {
key: file,
source: originalSource.source
};
}
)
);
}
}
if (Array.isArray(groupedEntries.js)) {
for (const element of groupedEntries.js.filter((x) => x[1].type === "chunk")) {
const [file, originalSource] = element;
const rawSource = originalSource.code;
const hash = cache.computeHash(rawSource);
cache.calcHashValueChanged(file, hash);
promises.push(
cache.process(
file,
() => {
const source = cache.get(file);
if (source) {
originalSource.code = source;
debug("js cache hit: %s", file);
} else {
return false;
}
},
async () => {
const { code } = await jsHandler(rawSource, runtimeSet, {
// generateMap: hasSourceMap,
});
originalSource.code = code;
onUpdate(file, rawSource, code);
debug("js handle: %s", file);
return {
key: file,
source: code
};
}
)
);
}
if (uniAppX) {
for (const element of groupedEntries.js.filter((x) => x[1].type === "asset")) {
const [file, originalSource] = element;
const rawSource = originalSource.source.toString();
const hash = cache.computeHash(rawSource);
cache.calcHashValueChanged(file, hash);
promises.push(
cache.process(
file,
() => {
const source = cache.get(file);
if (source) {
originalSource.source = source;
debug("js cache hit: %s", file);
} else {
return false;
}
},
async () => {
const { code } = await jsHandler(rawSource, runtimeSet, {
// generateMap: hasSourceMap,
uniAppX,
babelParserOptions: {
plugins: [
"typescript"
],
sourceType: "unambiguous"
}
});
originalSource.source = code;
onUpdate(file, rawSource, code);
debug("js handle: %s", file);
return {
key: file,
source: code
};
}
)
);
}
}
}
if (Array.isArray(groupedEntries.css)) {
for (const element of groupedEntries.css) {
const [file, originalSource] = element;
const rawSource = originalSource.source.toString();
const hash = cache.computeHash(rawSource);
cache.calcHashValueChanged(file, hash);
promises.push(
cache.process(
file,
() => {
const source = cache.get(file);
if (source) {
originalSource.source = source;
debug("css cache hit: %s", file);
} else {
return false;
}
},
async () => {
const { css } = await styleHandler(rawSource, {
isMainChunk: mainCssChunkMatcher(originalSource.fileName, appType),
postcssOptions: {
options: {
from: file
}
},
majorVersion: twPatcher.majorVersion
});
originalSource.source = css;
onUpdate(file, rawSource, css);
debug("css handle: %s", file);
return {
key: file,
source: css
};
}
)
);
}
}
await Promise.all(promises);
onEnd();
debug("end");
}
}
];
if (uniAppX) {
;
[void 0, "pre"].forEach((enforce) => {
plugins.push(
{
name: `weapp-tailwindcss:uni-app-x:css${enforce ? `:${enforce}` : ""}`,
enforce,
async transform(code, id) {
const { query } = parseVueRequest(id);
if (isCSSRequest(id) || query.vue && query.type === "style") {
const postcssResult = await styleHandler(code, {
isMainChunk: mainCssChunkMatcher(id, appType),
postcssOptions: {
options: {
from: id,
map: {
inline: false,
annotation: false,
// postcss may return virtual files
// we cannot obtain content of them, so this needs to be enabled
sourcesContent: true
// when "prev: preprocessorMap", the result map may include duplicate filename in `postcssResult.map.sources`
// prev: preprocessorMap,
}
}
}
});
const rawPostcssMap = postcssResult.map.toJSON();
const postcssMap = await formatPostcssSourceMap(
// version property of rawPostcssMap is declared as string
// but actually it is a number
rawPostcssMap,
cleanUrl(id)
);
return {
code: postcssResult.css,
map: postcssMap
};
}
}
}
);
});
plugins.push(
{
name: "weapp-tailwindcss:uni-app-x:nvue",
enforce: "pre",
async buildStart() {
const res = await twPatcher.extract({ write: false });
if (res) {
runtimeSet = res.classSet;
}
},
transform(code, id) {
return transformUVue(code, id, jsHandler, runtimeSet);
}
}
);
}
return plugins;
}
exports.UnifiedViteWeappTailwindcssPlugin = UnifiedViteWeappTailwindcssPlugin;
;