UNPKG

weapp-tailwindcss

Version:

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

690 lines (689 loc) 29.2 kB
const require_rolldown_runtime = require("./rolldown-runtime-CVvi-lCc.cjs"); const require_generator = require("./generator-BE34PYSC.cjs"); const require_options = require("./options-hVsoTfwL.cjs"); const require_v4_generation_core = require("./v4-generation-core-CDI6ChiH.cjs"); const require_wxml = require("./wxml-DSMNuUaP.cjs"); const require_hmr_timing = require("./hmr-timing-Cye_A4mI.cjs"); const require_context = require("./context-OqD_eBxQ.cjs"); const require_tailwindcss = require("./tailwindcss-DcpiKvmJ.cjs"); const require_style_options = require("./style-options-B_ppaVIg.cjs"); let node_fs = require("node:fs"); node_fs = require_rolldown_runtime.__toESM(node_fs, 1); let node_path = require("node:path"); node_path = require_rolldown_runtime.__toESM(node_path, 1); let node_process = require("node:process"); node_process = require_rolldown_runtime.__toESM(node_process, 1); let node_buffer = require("node:buffer"); let node_stream = require("node:stream"); node_stream = require_rolldown_runtime.__toESM(node_stream, 1); let _weapp_tailwindcss_postcss = require("@weapp-tailwindcss/postcss"); //#region src/bundlers/gulp/module-graph.ts const MODULE_EXTENSIONS = [ ".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx" ]; function resolveWithExtensions(base) { for (const ext of MODULE_EXTENSIONS) { const candidate = `${base}${ext}`; try { if (node_fs.default.statSync(candidate).isFile()) return candidate; } catch { continue; } } } function resolveLocalModuleCandidate(base) { try { const stat = node_fs.default.statSync(base); if (stat.isFile()) return base; if (stat.isDirectory()) { const resolvedIndex = resolveWithExtensions(node_path.default.join(base, "index")); if (resolvedIndex) return resolvedIndex; } } catch {} if (!node_path.default.extname(base)) return resolveWithExtensions(base); } function createGulpModuleGraphOptions(opts) { return { resolve(specifier, importer) { if (!specifier) return; if (!specifier.startsWith(".") && !node_path.default.isAbsolute(specifier)) return; return resolveLocalModuleCandidate(node_path.default.resolve(node_path.default.dirname(importer), specifier)); }, load(id) { try { return node_fs.default.readFileSync(id, "utf8"); } catch { return; } }, filter(id) { const relative = node_path.default.relative(node_process.default.cwd(), id); return opts.jsMatcher?.(relative) === true || opts.wxsMatcher?.(relative) === true; } }; } //#endregion //#region src/bundlers/gulp/runtime-snapshot.ts function createGulpRuntimeSnapshot(runtimeSourcesByFile, state, computeHash, options = {}) { return require_hmr_timing.buildRuntimeCompilationSnapshot([...runtimeSourcesByFile.entries()].map(([file, entry]) => ({ file, runtimeCandidate: true, source: entry.source, type: entry.type })), state, { computeHash, createRuntimeAffectingSignature: require_v4_generation_core.createRuntimeAffectingSourceSignature, removedFiles: options.removedFiles }); } //#endregion //#region src/bundlers/gulp/shared/create-native-framework-plugins/cache-state.ts const GULP_RUNTIME_SOURCE_CACHE_MAX = 256; const GULP_PROCESS_CACHE_MAX = 512; function toMb(bytes) { return Math.round(bytes / 1024 / 1024); } function touchMapEntry(map, key, value) { map.delete(key); map.set(key, value); } function pruneGulpRuntimeSourceCaches(sourcesByFile) { const removedFiles = []; while (sourcesByFile.size > GULP_RUNTIME_SOURCE_CACHE_MAX) { const oldestKey = sourcesByFile.keys().next().value; if (typeof oldestKey !== "string") break; sourcesByFile.delete(oldestKey); removedFiles.push(oldestKey); } return removedFiles; } function rememberGulpProcessCacheKey(cacheKeys, key) { cacheKeys.delete(key); cacheKeys.add(key); while (cacheKeys.size > GULP_PROCESS_CACHE_MAX) { const oldestKey = cacheKeys.keys().next().value; if (typeof oldestKey !== "string") break; cacheKeys.delete(oldestKey); } } function pruneGulpProcessCache(cache, cacheKeys) { cache.prune?.({ cacheKeys, hashKeys: cacheKeys }); } function resolveGulpMemoryDebugStats(context) { if (node_process.default.env["WEAPP_TW_HMR_MEMORY_DEBUG"] !== "1") return; const memory = node_process.default.memoryUsage(); return { phase: context.phase, process: { rssMb: toMb(memory.rss), heapTotalMb: toMb(memory.heapTotal), heapUsedMb: toMb(memory.heapUsed), externalMb: toMb(memory.external), arrayBuffersMb: toMb(memory.arrayBuffers) }, runtime: { runtimeSet: context.runtimeSet.size, runtimeSourceHashByFile: context.runtimeSourceHashByFile.size, runtimeSourcesByFile: context.runtimeSourcesByFile.size, maxRuntimeSources: GULP_RUNTIME_SOURCE_CACHE_MAX }, processCache: { instance: context.cache.instance.size, hashMap: context.cache.hashMap.size, activeCacheKeys: context.gulpProcessCacheKeys.size, maxCacheKeys: GULP_PROCESS_CACHE_MAX }, gulpOptions: { defaultStyleHandlerOptions: context.defaultStyleHandlerOptionsCache.size }, tailwind: { v4: require_generator.getTailwindV4IncrementalGenerateCacheStats() } }; } //#endregion //#region src/bundlers/gulp/asset-emission-plan.ts function applyGulpAssetEmissionPlan(plan, options) { for (const operation of plan.operations()) { if (operation.kind === "delete") { options.deleteAsset(operation.assetId); continue; } options.writeAsset(operation.assetId, typeof operation.source === "string" ? node_buffer.Buffer.from(operation.source) : node_buffer.Buffer.from(operation.source)); } } function writeGulpFileAsset(file, source) { const plan = new require_v4_generation_core.AssetEmissionPlan(); plan.write(file.path, source); applyGulpAssetEmissionPlan(plan, { deleteAsset(assetId) { if (assetId === file.path) file.contents = null; }, writeAsset(assetId, contents) { if (assetId === file.path) file.contents = contents; } }); } //#endregion //#region src/bundlers/gulp/vinyl-transform.ts const Transform = node_stream.default.Transform; function createVinylTransform(phase, handler, getTimingDetails) { return new Transform({ objectMode: true, async transform(file, _encoding, callback) { const hmrTimingStartedAt = performance.now(); try { await handler(file); require_hmr_timing.emitHmrTiming("gulp", phase, performance.now() - hmrTimingStartedAt, { file: file.relative || node_path.default.basename(file.path), ...getTimingDetails?.(file) }); callback(null, file); } catch (error) { callback(error, file); } } }); } //#endregion //#region src/bundlers/gulp/shared/create-native-framework-plugins/file-transforms.ts function createGulpFileTransforms(context) { const { cache, createRuntimeSetHash, debug, generatedCssPreflightModeByFile, getCompilationDependencyRevision, getSourceCandidateGetter, getSourceCandidateSourceGetter, getRuntimeSet, gulpProcessCacheKeys, opts, refreshGulpV4SourceCandidates, refreshRuntimeSet, refreshRuntimeSetForSource, registerAutoCssSource, rememberCompilationScope, resolveGulpStyleOutputExtension, resolveGulpTransformTimingDetails, resolveModuleGraphOptions, resolveWxmlHandlerOptions, resolveWxssFileHandlerOptions, resolveWxssUserHandlerOptions, runtimeState } = context; const { templateHandler, styleHandler, jsHandler } = opts; function createWxssTransform(options, stage) { return createVinylTransform(`css:${stage}`, async (file) => { if (!file.contents) return; const rawSource = file.contents.toString(); const cssSourceChanged = await registerAutoCssSource(file, rawSource); const shouldUseGenerator = runtimeState.tailwindRuntime.majorVersion === 4; let gulpSourceCandidateGetter = getSourceCandidateGetter(); if (shouldUseGenerator) gulpSourceCandidateGetter = await refreshGulpV4SourceCandidates(cssSourceChanged); const nextRuntimeSet = await refreshRuntimeSet({ forceRefresh: cssSourceChanged, forceCollect: cssSourceChanged, clearCache: cssSourceChanged }); const sourceCandidateSourceGetter = getSourceCandidateSourceGetter(); const sourceTraceTokenSources = sourceCandidateSourceGetter ? require_v4_generation_core.createCssTokenSourceMap(sourceCandidateSourceGetter(void 0), opts) : void 0; const sourceTraceSignature = require_v4_generation_core.createCssSourceTraceCacheSignature(sourceTraceTokenSources, opts); const sourceCandidateSignature = gulpSourceCandidateGetter ? `gulp-source-candidates:1:${[...gulpSourceCandidateGetter(void 0)].sort().join("\n")}` : void 0; const styleOutputExtension = resolveGulpStyleOutputExtension(file); const cssHandlerOptions = resolveWxssFileHandlerOptions(file, rawSource, options); const outputFile = (file.relative || node_path.default.basename(file.path)).replaceAll(node_path.default.sep, "/"); const compilationScope = { id: outputFile, kind: cssHandlerOptions.isMainChunk ? "global" : "component" }; rememberCompilationScope(file.path, compilationScope.id); const compilationDependencyRevision = getCompilationDependencyRevision(compilationScope.id); const outputSignature = `${styleOutputExtension ? `gulp-output:1:${stage}:${styleOutputExtension}` : `gulp-output:0:${stage}`}:compiler-dependencies:${compilationDependencyRevision}`; await require_hmr_timing.processCachedTask({ cache, cacheKey: file.path, hash: createRuntimeSetHash(rawSource, nextRuntimeSet, sourceTraceSignature, sourceCandidateSignature, outputSignature), applyResult(source) { writeGulpFileAsset(file, source); }, onCacheHit() { debug("css cache hit: %s", file.path); }, async transform() { await runtimeState.readyPromise; const generated = shouldUseGenerator ? await require_v4_generation_core.generateTailwindV4Css({ opts, runtimeState, runtime: nextRuntimeSet, rawSource, file: file.path, outputFile, scope: compilationScope, cssHandlerOptions, cssUserHandlerOptions: resolveWxssUserHandlerOptions(options), getSourceCandidatesForEntries: gulpSourceCandidateGetter, styleHandler, debug, deferCssAdaptation: stage === "generate" }) : void 0; const transformedCss = generated?.css ?? (stage === "generate" ? rawSource : (await styleHandler(rawSource, cssHandlerOptions)).css); if (stage === "generate") { const preflightMode = generated?.metadata?.preflightMode; if (preflightMode) generatedCssPreflightModeByFile.set(file.path, preflightMode); else generatedCssPreflightModeByFile.delete(file.path); } const css = require_v4_generation_core.annotateCssSourceTrace(transformedCss, { opts, tokenSources: sourceTraceTokenSources }); const generatedCss = stage === "generate" && generated ? `${require_v4_generation_core.createBundlerGeneratedCssMarker("gulp", file.path)}\n${css}` : css; const outputCss = stage === "generate" ? generatedCss : (0, _weapp_tailwindcss_postcss.rewriteLocalCssImportRequestsForOutput)(generatedCss, { styleOutputExtension }); debug("css handle: %s", file.path); return { result: outputCss }; } }); rememberGulpProcessCacheKey(gulpProcessCacheKeys, file.path); pruneGulpProcessCache(cache, gulpProcessCacheKeys); }, () => resolveGulpTransformTimingDetails(`css:${stage}`)); } const generateWxss = (options = {}) => createWxssTransform(options, "generate"); const transformWxss = (options = {}) => createWxssTransform(options, "transform"); const adaptWxss = (options = {}) => createVinylTransform("css:adapt", async (file) => { if (!file.contents) return; const rawSource = file.contents.toString(); const generatedCss = require_v4_generation_core.hasBundlerGeneratedCssMarker(rawSource); const source = generatedCss ? require_v4_generation_core.stripBundlerGeneratedCssMarkers(rawSource) : rawSource; const styleOutputExtension = resolveGulpStyleOutputExtension(file); const cssHandlerOptions = resolveWxssFileHandlerOptions(file, source, options); const handled = await styleHandler(source, cssHandlerOptions); const preflightMode = generatedCssPreflightModeByFile.get(file.path); writeGulpFileAsset(file, (0, _weapp_tailwindcss_postcss.rewriteLocalCssImportRequestsForOutput)(generatedCss ? require_v4_generation_core.finalizeMiniProgramGeneratorCss(handled.css, "weapp", runtimeState.tailwindRuntime.majorVersion, opts.cssPreflight, { injectPreflight: preflightMode?.inject ?? cssHandlerOptions.isMainChunk, preservePreflight: preflightMode?.preserve ?? cssHandlerOptions.isMainChunk, styleOptions: cssHandlerOptions }) : handled.css, { styleOutputExtension })); debug("css adapt: %s", file.path); }, () => resolveGulpTransformTimingDetails("css:adapt")); const transformJs = (options = {}) => createVinylTransform("js", async (file) => { if (!file.contents) return; const filename = node_path.default.resolve(file.path); const rawSource = file.contents.toString(); await refreshRuntimeSetForSource(file, rawSource, "js"); await runtimeState.readyPromise; const moduleGraph = resolveModuleGraphOptions(options.moduleGraph); const handlerOptions = { ...options, generateMap: false, filename, moduleGraph, babelParserOptions: { ...options?.babelParserOptions ?? {}, sourceFilename: filename } }; if (runtimeState.tailwindRuntime.majorVersion !== void 0) handlerOptions.tailwindcssMajorVersion = runtimeState.tailwindRuntime.majorVersion; await require_hmr_timing.processCachedTask({ cache, cacheKey: file.path, rawSource, applyResult(source) { writeGulpFileAsset(file, source); }, onCacheHit() { debug("js cache hit: %s", file.path); }, async transform() { await runtimeState.readyPromise; const currentSource = file.contents?.toString() ?? rawSource; if (require_context.shouldSkipJsTransform(currentSource, { ...handlerOptions, classNameSet: getRuntimeSet() })) return { result: currentSource }; const { code } = await jsHandler(currentSource, getRuntimeSet(), handlerOptions); debug("js handle: %s", file.path); return { result: code }; } }); rememberGulpProcessCacheKey(gulpProcessCacheKeys, file.path); pruneGulpProcessCache(cache, gulpProcessCacheKeys); }, () => resolveGulpTransformTimingDetails("js")); const transformWxml = (options = {}) => createVinylTransform("html", async (file) => { if (!file.contents) return; const rawSource = file.contents.toString(); await refreshRuntimeSetForSource(file, rawSource, "html"); await runtimeState.readyPromise; await require_hmr_timing.processCachedTask({ cache, cacheKey: file.path, rawSource, applyResult(source) { writeGulpFileAsset(file, source); }, onCacheHit() { debug("html cache hit: %s", file.path); }, async transform() { await runtimeState.readyPromise; const code = await templateHandler(rawSource, resolveWxmlHandlerOptions(options)); debug("html handle: %s", file.path); return { result: code }; } }); rememberGulpProcessCacheKey(gulpProcessCacheKeys, file.path); pruneGulpProcessCache(cache, gulpProcessCacheKeys); }, () => resolveGulpTransformTimingDetails("html")); return { adaptWxss, generateWxss, transformWxss, transformWxml, transformJs }; } //#endregion //#region src/bundlers/gulp/shared/create-native-framework-plugins.ts const debug = require_wxml.createDebug(); const GULP_COMPILATION_SCOPE_CACHE_MAX = 512; /** * @name weapp-tw-gulp * @description native framework 的插件组合实现 * @link https://tw.icebreaker.top/docs/quick-start/frameworks/native */ function createNativeGulpPlugins(options = {}) { const hasInitialTailwindCssRoots = require_generator.hasConfiguredTailwindV4CssRoots(options); const opts = require_context.getCompilerContext({ ...options, __internalDeferMissingCssEntriesWarning: true }); const { cache } = opts; const initialTailwindRuntime = opts.tailwindRuntime; const refreshTailwindcssRuntime = opts.refreshTailwindcssRuntime; const readyPromise = require_context.createTailwindRuntimeReadyPromise(initialTailwindRuntime); let runtimeSet = /* @__PURE__ */ new Set(); const runtimeState = { tailwindRuntime: initialTailwindRuntime, readyPromise, refreshTailwindcssRuntime }; const defaultStyleHandlerOptionsCache = /* @__PURE__ */ new Map(); let cachedDefaultTemplateHandlerOptions; let cachedDefaultTemplateRuntimeSet; let cachedDefaultModuleGraphOptions; let cachedGulpSourceCandidateGetter; let cachedGulpSourceCandidateSourceGetter; let runtimeSetInitialized = false; let runtimeSetDirty = false; const runtimeSourcesByFile = /* @__PURE__ */ new Map(); const runtimeSnapshotState = require_hmr_timing.createRuntimeCompilationBuildState(); const generatedCssPreflightModeByFile = /* @__PURE__ */ new Map(); const compilationScopeBySourceFile = /* @__PURE__ */ new Map(); let cachedGulpSourceCandidateSignature; const gulpProcessCacheKeys = /* @__PURE__ */ new Set(); const bundleRuntimeClassSetManager = options.__internalGulpRuntimeClassSetManager ?? require_hmr_timing.createRuntimeClassSetManager(); function invalidateGulpSourceCandidates() { cachedGulpSourceCandidateSignature = void 0; cachedGulpSourceCandidateGetter = void 0; cachedGulpSourceCandidateSourceGetter = void 0; } async function refreshRuntimeSet(options = false) { const normalizedOptions = typeof options === "boolean" ? { forceRefresh: options, forceCollect: options, clearCache: options } : options; const forceRefresh = normalizedOptions.forceRefresh === true; const shouldForceCollect = normalizedOptions.forceCollect === true || runtimeSetDirty; const clearCache = normalizedOptions.clearCache === true || runtimeSetDirty; if (!forceRefresh && !shouldForceCollect && runtimeSetInitialized) return runtimeSet; runtimeSet = await require_context.ensureRuntimeClassSet(runtimeState, { forceRefresh, forceCollect: shouldForceCollect, clearCache, allowEmpty: false }); runtimeSetInitialized = true; runtimeSetDirty = false; return runtimeSet; } async function refreshRuntimeSetForSource(file, rawSource, type) { const filename = node_path.default.resolve(file.path); touchMapEntry(runtimeSourcesByFile, filename, { source: rawSource, type }); require_hmr_timing.removeRuntimeCompilationBuildStateFiles(runtimeSnapshotState, pruneGulpRuntimeSourceCaches(runtimeSourcesByFile)); const snapshot = createGulpRuntimeSnapshot(runtimeSourcesByFile, runtimeSnapshotState, (source) => cache.computeHash(source)); const changed = snapshot.changedByType[type].has(filename); require_hmr_timing.updateRuntimeCompilationBuildState(runtimeSnapshotState, snapshot, /* @__PURE__ */ new Map()); if (changed) invalidateGulpSourceCandidates(); if (!changed && runtimeSetInitialized) return runtimeSet; if (!runtimeSetDirty) try { runtimeSet = await bundleRuntimeClassSetManager.sync(runtimeState.tailwindRuntime, snapshot); runtimeSetInitialized = true; return runtimeSet; } catch (error) { debug("gulp incremental runtime set sync failed, fallback to collect: %O", error); await bundleRuntimeClassSetManager.reset(); } return refreshRuntimeSet({ forceCollect: true }); } async function refreshGulpV4SourceCandidates(forceRefresh = false) { const root = opts.tailwindcssBasedir ?? node_process.default.cwd(); const sourceScan = await require_options.resolveSourceScanEntries(opts, runtimeState.tailwindRuntime, { root }); const nextSignature = cache.computeHash(JSON.stringify({ root, entries: sourceScan?.entries, inlineCandidates: sourceScan?.inlineCandidates ? { included: [...sourceScan.inlineCandidates.included].sort(), excluded: [...sourceScan.inlineCandidates.excluded].sort() } : void 0, explicit: sourceScan?.explicit ?? false, dependencies: [...sourceScan?.dependencies ?? []].sort() })); if (!forceRefresh && cachedGulpSourceCandidateSignature === nextSignature && cachedGulpSourceCandidateGetter) return cachedGulpSourceCandidateGetter; const collector = require_v4_generation_core.createSourceCandidateCollector({ bareArbitraryValues: opts.arbitraryValues?.bareArbitraryValues, customAttributesEntities: opts.customAttributesEntities, disabledDefaultTemplateHandler: opts.disabledDefaultTemplateHandler }); await collector.scanRoot({ entries: sourceScan?.entries, explicit: sourceScan?.explicit, root }); collector.syncInline(sourceScan?.inlineCandidates); cachedGulpSourceCandidateSignature = nextSignature; cachedGulpSourceCandidateGetter = (entries) => collector.valuesForEntries(entries); cachedGulpSourceCandidateSourceGetter = (entries) => collector.sourcesForEntries(entries); return cachedGulpSourceCandidateGetter; } function createRuntimeSetHash(rawSource, nextRuntimeSet, sourceTraceSignature, sourceCandidateSignature, outputSignature) { return cache.computeHash([ rawSource, require_tailwindcss.getRuntimeClassSetSignature(runtimeState.tailwindRuntime), [...nextRuntimeSet].sort().join("\n"), sourceTraceSignature ?? "css-source-trace:0", sourceCandidateSignature ?? "gulp-source-candidates:0", outputSignature ?? "gulp-output:0" ].join("\n\n")); } async function registerAutoCssSource(file, rawSource) { if (hasInitialTailwindCssRoots || (runtimeState.tailwindRuntime.majorVersion ?? 0) < 4 || !file.path || !require_generator.hasTailwindRootDirectives(rawSource)) return false; const sourceFile = node_path.default.resolve(file.path); const sourceCss = require_generator.normalizeTailwindSourceForGenerator(require_generator.normalizeTailwindConfigDirectives(rawSource, node_path.default.dirname(sourceFile)), { importFallback: true }); const config = runtimeState.tailwindRuntime.options?.tailwindcss?.config; const generatorSourceCss = require_generator.prependConfigDirective((0, _weapp_tailwindcss_postcss.splitLocalCssImports)(sourceCss)?.source ?? sourceCss, config); if (!require_generator.upsertTailwindV4CssSource(opts, { file: sourceFile, base: node_path.default.dirname(sourceFile), css: generatorSourceCss })) return false; runtimeSetInitialized = false; runtimeSetDirty = true; await bundleRuntimeClassSetManager.reset(); debug("detected tailwindcss v4 css source from gulp css file: %s", file.path); return true; } function resolveModuleGraphOptions(moduleGraph) { if (moduleGraph) return moduleGraph; if (!cachedDefaultModuleGraphOptions) cachedDefaultModuleGraphOptions = createGulpModuleGraphOptions(opts); return cachedDefaultModuleGraphOptions; } function resolveWxssHandlerOptions(options) { const styleHandlerMajorVersion = require_style_options.normalizeStyleHandlerMajorVersion(runtimeState.tailwindRuntime.majorVersion); const majorVersion = styleHandlerMajorVersion ?? "unknown"; if (!options || Object.keys(options).length === 0) { let cached = defaultStyleHandlerOptionsCache.get(majorVersion); if (!cached) { cached = styleHandlerMajorVersion === void 0 ? {} : { majorVersion: styleHandlerMajorVersion }; defaultStyleHandlerOptionsCache.set(majorVersion, cached); } return cached; } return styleHandlerMajorVersion === void 0 ? { ...options } : { majorVersion: styleHandlerMajorVersion, ...options }; } function resolveGulpStyleOutputExtension(file) { return typeof opts.cssMatcher === "function" && opts.cssMatcher(node_path.default.basename(file.path)) ? node_path.default.extname(file.path) : void 0; } function resolveGulpMatcherName(file) { return (file.relative || node_path.default.basename(file.path)).replaceAll(node_path.default.sep, "/"); } function resolveWxssFileHandlerOptions(file, rawSource, options) { const resolved = resolveWxssHandlerOptions(options); const sourceFile = file.path ? node_path.default.resolve(file.path) : void 0; const sourceOptions = sourceFile ? { outputRoot: node_path.default.resolve(file.cwd ?? node_process.default.cwd()), sourceCss: rawSource, sourceFile } : void 0; if (resolved.isMainChunk !== void 0) return { ...resolved, postcssOptions: { ...resolved.postcssOptions, options: { ...resolved.postcssOptions?.options, ...sourceFile ? { from: sourceFile } : {} } }, ...sourceOptions ? { sourceOptions } : {} }; return { ...resolved, isMainChunk: opts.mainCssChunkMatcher(resolveGulpMatcherName(file), opts.appType), postcssOptions: { ...resolved.postcssOptions, options: { ...resolved.postcssOptions?.options, ...sourceFile ? { from: sourceFile } : {} } }, ...sourceOptions ? { sourceOptions } : {} }; } function resolveWxssUserHandlerOptions(options) { return { ...resolveWxssHandlerOptions(options), isMainChunk: false }; } function resolveWxmlHandlerOptions(options) { if (!options || Object.keys(options).length === 0) { if (cachedDefaultTemplateRuntimeSet !== runtimeSet || !cachedDefaultTemplateHandlerOptions) { cachedDefaultTemplateRuntimeSet = runtimeSet; cachedDefaultTemplateHandlerOptions = { runtimeSet }; } return cachedDefaultTemplateHandlerOptions; } return { runtimeSet, ...options }; } function resolveGulpTransformTimingDetails(phase) { return { memoryDebug: resolveGulpMemoryDebugStats({ cache, defaultStyleHandlerOptionsCache, gulpProcessCacheKeys, phase, runtimeSet, runtimeSourceHashByFile: runtimeSnapshotState.sourceHashByFile, runtimeSourcesByFile }) }; } function rememberCompilationScope(sourceFile, scopeId) { touchMapEntry(compilationScopeBySourceFile, node_path.default.resolve(sourceFile), scopeId); while (compilationScopeBySourceFile.size > GULP_COMPILATION_SCOPE_CACHE_MAX) { const oldestSourceFile = compilationScopeBySourceFile.keys().next().value; if (typeof oldestSourceFile !== "string") break; compilationScopeBySourceFile.delete(oldestSourceFile); } } /** 记录 Gulp watcher 提交的源码或生成依赖变化。 */ async function watchChange(id, change = { event: "update" }) { require_v4_generation_core.beginCompilerShadowRun(runtimeState); const file = node_path.default.resolve(id); const affectedScopes = require_v4_generation_core.recordCompilationDependencyChanges(runtimeState, require_v4_generation_core.createCompilationDependencyChanges([file])); invalidateGulpSourceCandidates(); if (change.event === "delete") { const removedRuntimeSource = runtimeSourcesByFile.delete(file); const removedCssSource = require_generator.removeTailwindV4CssSource(opts, file); const removedScopeId = compilationScopeBySourceFile.get(file); if (removedScopeId) { require_v4_generation_core.invalidateCompilationScope(runtimeState, removedScopeId); compilationScopeBySourceFile.delete(file); } require_hmr_timing.removeRuntimeCompilationBuildStateFiles(runtimeSnapshotState, [file]); generatedCssPreflightModeByFile.delete(file); gulpProcessCacheKeys.delete(file); cache.instance.delete(file); cache.hashMap.delete(file); if (removedRuntimeSource || removedCssSource) { runtimeSetInitialized = false; runtimeSetDirty = true; await bundleRuntimeClassSetManager.reset(); } } return affectedScopes; } return { ...createGulpFileTransforms({ cache, createRuntimeSetHash, debug, generatedCssPreflightModeByFile, getCompilationDependencyRevision: (scopeId) => require_v4_generation_core.getCompilationScopeDependencyRevision(runtimeState, scopeId), getSourceCandidateGetter: () => cachedGulpSourceCandidateGetter, getSourceCandidateSourceGetter: () => cachedGulpSourceCandidateSourceGetter, getRuntimeSet: () => runtimeSet, gulpProcessCacheKeys, opts, refreshGulpV4SourceCandidates, refreshRuntimeSet, refreshRuntimeSetForSource, registerAutoCssSource, rememberCompilationScope, resolveGulpStyleOutputExtension, resolveGulpTransformTimingDetails, resolveModuleGraphOptions, resolveWxmlHandlerOptions, resolveWxssFileHandlerOptions, resolveWxssUserHandlerOptions, runtimeState }), beginCompilerShadowRun: () => require_v4_generation_core.beginCompilerShadowRun(runtimeState), completeCompilerShadowRun: (revision) => require_hmr_timing.finalizeCompilerShadowRun(runtimeState, { revision }), async dispose() { await require_v4_generation_core.disposeCompilerOwner(runtimeState); await bundleRuntimeClassSetManager.reset(); }, getCompilerShadowRunSnapshot: () => require_v4_generation_core.getCompilerShadowRunSnapshot(runtimeState), watchChange }; } //#endregion //#region src/bundlers/gulp/frameworks/native/index.ts function createNativeGulpFrameworkPlugins(options = {}) { return createNativeGulpPlugins(options); } //#endregion //#region src/bundlers/gulp/index.ts /** * @name weapp-tw-gulp * @description Gulp 入口直接创建 native framework,具体 stream 组合由 frameworks/native 拥有。 * @link https://tw.icebreaker.top/docs/quick-start/frameworks/native */ function createPlugins(options = {}) { return createNativeGulpFrameworkPlugins(options); } //#endregion Object.defineProperty(exports, "createPlugins", { enumerable: true, get: function() { return createPlugins; } });