UNPKG

weapp-tailwindcss

Version:

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

252 lines (244 loc) 7.34 kB
import { resolveTailwindcssImport } from "./chunk-3SKEY32E.mjs"; import { pluginName } from "./chunk-4Z6MHSEO.mjs"; // src/shared/mpx.ts import path2 from "path"; // src/shared/tailwindcss-css-redirect.ts import Module from "module"; import path from "path"; var moduleWithMutableResolve = Module; var patched = /* @__PURE__ */ new WeakSet(); function installTailwindcssCssRedirect(pkgDir) { const target = path.join(pkgDir, "index.css"); const original = moduleWithMutableResolve._resolveFilename; if (patched.has(original)) { return; } const replacements = /* @__PURE__ */ new Set(["tailwindcss", "tailwindcss$"]); const resolveTailwindcssCss = (request, parent, isMain, options) => { if (replacements.has(request)) { return target; } if (request.startsWith("tailwindcss/")) { return path.join(pkgDir, request.slice("tailwindcss/".length)); } return original(request, parent, isMain, options); }; moduleWithMutableResolve._resolveFilename = resolveTailwindcssCss; patched.add(moduleWithMutableResolve._resolveFilename); } // src/shared/mpx.ts var MPX_STYLE_RESOURCE_QUERY_RE = /(?:^|[?&])type=styles(?:&|$)/; function isMpxStyleResourceQuery(query) { if (typeof query !== "string") { return false; } return MPX_STYLE_RESOURCE_QUERY_RE.test(query); } function isMpx(appType) { return appType === "mpx"; } function getTailwindcssCssEntry(pkgDir) { return path2.join(pkgDir, "index.css"); } function ensureMpxTailwindcssAliases(compiler, pkgDir) { const tailwindcssCssEntry = getTailwindcssCssEntry(pkgDir); compiler.options = compiler.options || {}; compiler.options.resolve = compiler.options.resolve || {}; const alias = compiler.options.resolve.alias ?? {}; if (Array.isArray(alias)) { alias.push( { name: "tailwindcss", alias: tailwindcssCssEntry }, { name: "tailwindcss$", alias: tailwindcssCssEntry } ); } else { compiler.options.resolve.alias = alias; alias.tailwindcss = tailwindcssCssEntry; alias.tailwindcss$ = tailwindcssCssEntry; } return tailwindcssCssEntry; } function patchMpxLoaderResolve(loaderContext, pkgDir, enabled) { if (!enabled || typeof loaderContext.resolve !== "function") { return; } const originalResolve = loaderContext.resolve; if (originalResolve.__weappTwPatched) { return; } const tailwindcssCssEntry = getTailwindcssCssEntry(pkgDir); const wrappedResolve = function(context, request, callback) { if (request === "tailwindcss" || request === "tailwindcss$") { return callback(null, tailwindcssCssEntry); } if (request?.startsWith("tailwindcss/")) { return callback(null, path2.join(pkgDir, request.slice("tailwindcss/".length))); } return originalResolve.call(this, context, request, callback); }; wrappedResolve.__weappTwPatched = true; loaderContext.resolve = wrappedResolve; } function setupMpxTailwindcssRedirect(pkgDir, enabled) { if (enabled) { installTailwindcssCssRedirect(pkgDir); } } function injectMpxCssRewritePreRules(compiler, loader, loaderOptions) { var _a; if (!loader) { return; } const moduleOptions = (_a = compiler.options).module ?? (_a.module = { rules: [] }); moduleOptions.rules = moduleOptions.rules || []; const createRule = (match) => ({ ...match, enforce: "pre", use: [ { loader, options: loaderOptions } ] }); moduleOptions.rules.unshift( createRule({ resourceQuery: (query) => isMpxStyleResourceQuery(query) }), createRule({ test: /\.css$/i, resourceQuery: (query) => !isMpxStyleResourceQuery(query) }) ); } // src/bundlers/webpack/shared/css-imports.ts var CSS_EXT_RE = /\.(?:css|scss|sass|less|styl|pcss)$/i; function stripResourceQuery(file) { let idx = file.indexOf("?"); if (idx === -1) { idx = file.indexOf("&"); } return idx === -1 ? file : file.slice(0, idx); } function rewriteTailwindcssRequestForCss(data, pkgDir, appType) { if (!data) { return; } const request = data.request; if (!request) { return; } if (request !== "tailwindcss" && request !== "tailwindcss$" && !request.startsWith("tailwindcss/")) { return; } const issuer = data.contextInfo?.issuer; if (!issuer) { return; } const normalizedIssuer = stripResourceQuery(issuer); if (!CSS_EXT_RE.test(normalizedIssuer)) { return; } const resolved = resolveTailwindcssImport(request, pkgDir, { appType }); if (!resolved) { return; } data.request = resolved; } function applyTailwindcssCssImportRewrite(compiler, options) { if (!options.enabled) { return; } compiler.hooks.normalModuleFactory.tap(pluginName, (factory) => { factory.hooks.beforeResolve.tap(pluginName, (data) => { rewriteTailwindcssRequestForCss(data, options.pkgDir, options.appType); }); }); } // src/bundlers/webpack/shared/loader-anchors.ts var MPX_STRIP_CONDITIONAL_LOADER = "@mpxjs/webpack-plugin/lib/style-compiler/strip-conditional-loader"; var MPX_STYLE_COMPILER_LOADER = "@mpxjs/webpack-plugin/lib/style-compiler/index"; var MPX_REWRITE_PRECEDENCE_LOADERS = [ MPX_STYLE_COMPILER_LOADER, MPX_STRIP_CONDITIONAL_LOADER ]; function createFinder(targets) { return (entries) => entries.findIndex( (entry) => targets.some((target) => entry?.loader?.includes?.(target)) ); } function createPrioritizedFinder(targets) { return (entries) => { for (const target of targets) { const idx = entries.findIndex((entry) => entry?.loader?.includes?.(target)); if (idx !== -1) { return idx; } } return -1; }; } function createLoaderAnchorFinders(appType) { if (isMpx(appType)) { return { findRewriteAnchor: createPrioritizedFinder(MPX_REWRITE_PRECEDENCE_LOADERS), findClassSetAnchor: createFinder([MPX_STYLE_COMPILER_LOADER]) }; } const fallbackFinder = createFinder(["postcss-loader"]); return { findRewriteAnchor: fallbackFinder, findClassSetAnchor: fallbackFinder }; } // src/bundlers/webpack/BaseUnifiedPlugin/shared.ts var MPX_STYLE_RESOURCE_QUERY_RE2 = /(?:\?|&)type=styles\b/; function getCacheKey(filename) { return filename; } function stripResourceQuery2(resource) { if (typeof resource !== "string") { return resource; } const queryIndex = resource.indexOf("?"); if (queryIndex !== -1) { return resource.slice(0, queryIndex); } const hashIndex = resource.indexOf("#"); if (hashIndex !== -1) { return resource.slice(0, hashIndex); } return resource; } function isCssLikeModuleResource(resource, cssMatcher, appType) { if (typeof resource !== "string") { return false; } const normalizedResource = stripResourceQuery2(resource); if (normalizedResource && cssMatcher(normalizedResource)) { return true; } if (appType === "mpx") { return MPX_STYLE_RESOURCE_QUERY_RE2.test(resource); } return false; } function hasLoaderEntry(entries, target) { if (!target) { return false; } return entries.some((entry) => entry.loader?.includes?.(target)); } export { isMpx, ensureMpxTailwindcssAliases, patchMpxLoaderResolve, setupMpxTailwindcssRedirect, injectMpxCssRewritePreRules, applyTailwindcssCssImportRewrite, createLoaderAnchorFinders, getCacheKey, isCssLikeModuleResource, hasLoaderEntry };