UNPKG

weapp-tailwindcss

Version:

把 tailwindcss 原子化样式思想,带给小程序开发者们! bring tailwindcss to miniprogram developers!

422 lines (403 loc) 15.1 kB
"use strict";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;