weapp-tailwindcss
Version:
把 tailwindcss 原子化样式思想,带给小程序开发者们! bring tailwindcss to miniprogram developers!
141 lines (140 loc) • 5.65 kB
JavaScript
import { l as createTailwindRuntimeReadyPromise, o as shouldSkipJsTransform, t as getCompilerContext, u as ensureRuntimeClassSet } from "./context-YAvTyPV2.js";
import { defuOverrideArray } from "@weapp-tailwindcss/shared";
//#region src/core.ts
const DEFAULT_MAIN_CHUNK_STYLE_OPTIONS = Object.freeze({ isMainChunk: true });
function resolveTransformWxssOptions(options) {
if (!options) return DEFAULT_MAIN_CHUNK_STYLE_OPTIONS;
if (options.isMainChunk === true) return options;
return defuOverrideArray(options, DEFAULT_MAIN_CHUNK_STYLE_OPTIONS);
}
/**
* 创建一个上下文对象,用于处理小程序的模板、样式和脚本转换。
* @param options - 用户定义的选项对象
* @returns 返回一个包含 transformWxss、transformWxml 和 transformJs 方法的对象
*/
function createContext(options = {}) {
const opts = getCompilerContext(options);
const { templateHandler, styleHandler, jsHandler } = opts;
const initialTailwindRuntime = opts.tailwindRuntime;
const refreshTailwindcssRuntime = opts.refreshTailwindcssRuntime;
const readyPromise = createTailwindRuntimeReadyPromise(initialTailwindRuntime);
let runtimeSet = /* @__PURE__ */ new Set();
const runtimeState = {
tailwindRuntime: initialTailwindRuntime,
readyPromise,
refreshTailwindcssRuntime
};
const defaultJsHandlerOptionsCache = /* @__PURE__ */ new Map();
function getDefaultJsHandlerOptions(majorVersion = runtimeState.tailwindRuntime.majorVersion) {
if (typeof majorVersion !== "number") return;
let cached = defaultJsHandlerOptionsCache.get(majorVersion);
if (!cached) {
cached = { tailwindcssMajorVersion: majorVersion };
defaultJsHandlerOptionsCache.set(majorVersion, cached);
}
return cached;
}
function withRuntimeTailwindMajorVersion(options) {
if (!options) return getDefaultJsHandlerOptions();
if (typeof options.tailwindcssMajorVersion === "number") return options;
const majorVersion = runtimeState.tailwindRuntime.majorVersion;
if (typeof majorVersion !== "number") return options;
return {
...options,
tailwindcssMajorVersion: majorVersion
};
}
function resolveTransformJsOptions(options) {
if (!options) return getDefaultJsHandlerOptions();
let hasHandlerOption = false;
let runtimeSetProvided = false;
for (const key in options) {
if (key === "runtimeSet") {
runtimeSetProvided = true;
continue;
}
hasHandlerOption = true;
break;
}
if (!hasHandlerOption) return getDefaultJsHandlerOptions();
if (!runtimeSetProvided && typeof options.tailwindcssMajorVersion === "number") return options;
if (runtimeSetProvided) {
const { runtimeSet: _runtimeSet, ...handlerOptions } = options;
return withRuntimeTailwindMajorVersion(handlerOptions);
}
return withRuntimeTailwindMajorVersion(options);
}
const runtimeAwareTemplateJsHandler = (source, runtime, handlerOptions) => {
return jsHandler(source, runtime, withRuntimeTailwindMajorVersion(handlerOptions));
};
let cachedDefaultTemplateHandlerOptions;
let cachedDefaultTemplateRuntimeSet;
let cachedRuntimeOnlyTemplateHandlerOptions;
let cachedRuntimeOnlyTemplateRuntimeSet;
function getDefaultTemplateHandlerOptions() {
if (cachedDefaultTemplateRuntimeSet !== runtimeSet || !cachedDefaultTemplateHandlerOptions) {
cachedDefaultTemplateRuntimeSet = runtimeSet;
cachedDefaultTemplateHandlerOptions = {
runtimeSet,
jsHandler: runtimeAwareTemplateJsHandler
};
}
return cachedDefaultTemplateHandlerOptions;
}
function resolveTransformWxmlOptions(options) {
if (!options) return getDefaultTemplateHandlerOptions();
let hasOverride = false;
for (const key in options) if (key !== "runtimeSet") {
hasOverride = true;
break;
}
if (!hasOverride) {
const runtimeOverride = options.runtimeSet;
if (runtimeOverride === void 0 || runtimeOverride === runtimeSet) return getDefaultTemplateHandlerOptions();
if (cachedRuntimeOnlyTemplateRuntimeSet !== runtimeOverride || !cachedRuntimeOnlyTemplateHandlerOptions) {
cachedRuntimeOnlyTemplateRuntimeSet = runtimeOverride;
cachedRuntimeOnlyTemplateHandlerOptions = {
runtimeSet: runtimeOverride,
jsHandler: runtimeAwareTemplateJsHandler
};
}
return cachedRuntimeOnlyTemplateHandlerOptions;
}
return defuOverrideArray(options, {
runtimeSet,
jsHandler: runtimeAwareTemplateJsHandler
});
}
async function transformWxss(rawCss, options) {
await runtimeState.readyPromise;
const result = await styleHandler(rawCss, resolveTransformWxssOptions(options));
runtimeSet = await ensureRuntimeClassSet(runtimeState);
return result;
}
async function getRuntimeSet(options) {
await runtimeState.readyPromise;
runtimeSet = await ensureRuntimeClassSet(runtimeState, options);
return runtimeSet;
}
async function transformJs(rawJs, options) {
await runtimeState.readyPromise;
if (options?.runtimeSet) runtimeSet = options.runtimeSet;
else if (runtimeSet.size === 0) runtimeSet = await ensureRuntimeClassSet(runtimeState, { forceCollect: true });
const resolvedOptions = resolveTransformJsOptions(options);
if (shouldSkipJsTransform(rawJs, resolvedOptions)) return { code: rawJs };
return await jsHandler(rawJs, runtimeSet, resolvedOptions);
}
async function transformWxml(rawWxml, options) {
await runtimeState.readyPromise;
if (!options?.runtimeSet && runtimeSet.size === 0) runtimeSet = await ensureRuntimeClassSet(runtimeState, { forceCollect: true });
return templateHandler(rawWxml, resolveTransformWxmlOptions(options));
}
return {
getRuntimeSet,
transformWxss,
transformWxml,
transformJs
};
}
//#endregion
export { createContext };