@wyw-in-js/webpack-loader 1.1.0 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/WYWinJSDebugPlugin.js +13 -15
- package/esm/WYWinJSDebugPlugin.js.map +1 -1
- package/esm/cache.js +50 -51
- package/esm/cache.js.map +1 -1
- package/esm/index.js +222 -174
- package/esm/index.js.map +1 -1
- package/esm/outputCssLoader.js +15 -18
- package/esm/outputCssLoader.js.map +1 -1
- package/package.json +14 -10
- package/types/WYWinJSDebugPlugin.js +5 -9
- package/types/cache.js +7 -10
- package/types/index.js +126 -63
- package/types/outputCssLoader.js +3 -6
- package/lib/WYWinJSDebugPlugin.js +0 -25
- package/lib/WYWinJSDebugPlugin.js.map +0 -1
- package/lib/cache.js +0 -71
- package/lib/cache.js.map +0 -1
- package/lib/index.js +0 -198
- package/lib/index.js.map +0 -1
- package/lib/outputCssLoader.js +0 -27
- package/lib/outputCssLoader.js.map +0 -1
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["path","crypto","logger","transform","TransformCacheCollection","sharedState","getCacheInstance","registerCacheProvider","WYWinJSDebugPlugin","outputCssLoader","require","resolve","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","hashText","text","createHash","update","digest","cache","resolvers","getResolverKey","importer","stack","root","length","getActiveResolvers","key","entries","createAsyncResolve","resourcePath","currentResolverKey","what","rootResolverKey","rootResolvers","resolver","Error","Promise","all","map","r","then","results","firstResult","some","addResolver","push","filter","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","undefined","file","mappings","names","sources","version","async","resolveOptions","dependencyType","resolveModule","getResolve","isPromiseLike","resolveModuleAsync","context","reject","settled","finish","err","result","maybePromise","removeResolver","importerPath","isAbsolute","dirname","join","process","cwd","filePath","addDependency","asyncResolve","sourceMap","preprocessor","keepComments","prefixer","extension","cssImport","cacheProvider","rest","getOptions","outputFileName","replace","transformServices","options","pluginOptions","emitWarning","message","eventEmitter","emitter","toString","cssText","Buffer","from","cssSourceMapText","dependencies","dep","cacheInstance","cacheProviderId","set","setDependencies","getDependencies","wywQuery","encodeURIComponent","hot","resourcePathWithQuery","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","importCss","callback","code","catch","finally"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\n\ntype Resolver = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string>;\n\nconst resolvers: Record<string, Resolver[]> = {};\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst getActiveResolvers = (key: string): Resolver[] => {\n const entries = resolvers[key];\n return entries?.length ? entries : [];\n};\n\nconst createAsyncResolve = (resourcePath: string) => {\n const currentResolverKey = stripQueryAndHash(resourcePath);\n\n return (\n what: string,\n importer: string,\n stack: string[] = [importer]\n ): Promise<string> => {\n const rootResolverKey = getResolverKey(importer, stack);\n const rootResolvers = getActiveResolvers(rootResolverKey);\n const resolver =\n rootResolvers.length > 0\n ? rootResolvers\n : getActiveResolvers(currentResolverKey);\n\n if (resolver.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Every resolver should return the same result, but we need to call all of them\n // to ensure that all side effects are executed (e.g. adding dependencies)\n return Promise.all(resolver.map((r) => r(what, importer, stack))).then(\n (results) => {\n const firstResult = results[0];\n if (results.some((r) => r !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n }\n );\n };\n};\n\nfunction addResolver(resourcePath: string, resolver: Resolver) {\n if (!resolvers[resourcePath]) {\n resolvers[resourcePath] = [];\n }\n\n resolvers[resourcePath].push(resolver);\n\n return () => {\n resolvers[resourcePath] = resolvers[resourcePath].filter(\n (r) => r !== resolver\n );\n };\n}\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const removeResolver = addResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n const asyncResolve = createAsyncResolve(this.resourcePath);\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => this.emitWarning(new Error(message)),\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(removeResolver);\n};\n\nexport default webpack5Loader;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\nimport { fileURLToPath } from 'url';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { Compiler, RawLoaderDefinitionFunction, Stats } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport {\n disposeEvalBroker,\n transform,\n TransformCacheCollection,\n} from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = fileURLToPath(\n new URL('./outputCssLoader.js', import.meta.url)\n);\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\ntype Resolver = (\n what: string,\n importer: string,\n stack?: string[]\n) => Promise<string>;\n\ntype DoneHook = {\n tap: (name: string, handler: (stats: Stats) => void) => void;\n};\n\ntype VoidHook = {\n tap: (name: string, handler: () => void) => void;\n};\n\ntype FailedHook = {\n tap: (name: string, handler: (error: Error) => void) => void;\n};\n\ntype CompilerHooks = {\n done?: DoneHook;\n failed?: FailedHook;\n shutdown?: VoidHook;\n watchClose?: VoidHook;\n};\n\ntype CompilerLike = Compiler & {\n hooks: CompilerHooks;\n};\n\ntype LoaderContextWithCompiler = {\n _compiler?: CompilerLike;\n};\n\ntype ResolverScope = {\n asyncResolve: Resolver;\n cache: TransformCacheCollection;\n dispose: () => void;\n key: string;\n replaceResolver: (resourcePath: string, resolver: Resolver) => void;\n};\n\ntype CompilerState = ResolverScope & {\n clearResolvers: () => void;\n hooksInstalled: boolean;\n};\n\nconst COMPILER_SCOPE_NAME = 'WYWinJSResolverScope';\nlet compilerScopeId = 0;\nconst compilerStates = new WeakMap<CompilerLike, CompilerState>();\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst createResolverScope = (): ResolverScope => {\n const resolvers = new Map<string, Resolver>();\n compilerScopeId += 1;\n const key = `webpack:${compilerScopeId}`;\n\n return {\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[] = [importer]\n ): Promise<string> => {\n const resolverKeys = [\n getResolverKey(importer, stack),\n stripQueryAndHash(importer),\n ].filter((candidate, idx, all) => all.indexOf(candidate) === idx);\n\n const selectedResolvers = resolverKeys\n .map((resolverKey) => resolvers.get(resolverKey))\n .filter((resolver): resolver is Resolver => Boolean(resolver));\n\n if (selectedResolvers.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Root and importer resolver side effects both matter for dependency\n // tracking, so keep them aligned and verify they agree on the answer.\n return Promise.all(\n selectedResolvers.map((resolver) => resolver(what, importer, stack))\n ).then((results) => {\n const firstResult = results[0];\n if (results.some((result) => result !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n });\n },\n cache: new TransformCacheCollection(),\n dispose: () => {\n resolvers.clear();\n },\n key,\n replaceResolver: (resourcePath: string, resolver: Resolver) => {\n resolvers.set(stripQueryAndHash(resourcePath), resolver);\n },\n };\n};\n\nconst disposeCompilerState = (state: CompilerState) => {\n state.clearResolvers();\n disposeEvalBroker(state.cache);\n};\n\nconst getCompilerState = (compiler: CompilerLike): CompilerState => {\n const cached = compilerStates.get(compiler);\n if (cached) {\n return cached;\n }\n\n // Resolver identity must stay stable across files within one compiler or we\n // churn both the shared transform cache salt and the eval broker/runner.\n const scope = createResolverScope();\n const state: CompilerState = {\n ...scope,\n clearResolvers: scope.dispose,\n dispose: () => disposeCompilerState(state),\n hooksInstalled: false,\n };\n\n const installHooks = () => {\n if (state.hooksInstalled) return;\n state.hooksInstalled = true;\n\n compiler.hooks.done?.tap(COMPILER_SCOPE_NAME, () => {\n state.clearResolvers();\n });\n compiler.hooks.failed?.tap(COMPILER_SCOPE_NAME, () => {\n state.clearResolvers();\n });\n compiler.hooks.watchClose?.tap(COMPILER_SCOPE_NAME, () => {\n state.dispose();\n compilerStates.delete(compiler);\n });\n compiler.hooks.shutdown?.tap(COMPILER_SCOPE_NAME, () => {\n state.dispose();\n compilerStates.delete(compiler);\n });\n };\n\n installHooks();\n compilerStates.set(compiler, state);\n return state;\n};\n\nconst createInvocationScope = (): ResolverScope => {\n const scope = createResolverScope();\n return {\n ...scope,\n dispose: () => {\n scope.dispose();\n disposeEvalBroker(scope.cache);\n },\n };\n};\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const { _compiler: compiler } = this as LoaderContextWithCompiler;\n const compilerState = compiler\n ? getCompilerState(compiler)\n : createInvocationScope();\n\n compilerState.replaceResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n const {\n asyncResolve,\n cache: transformCache,\n key: asyncResolveKey,\n } = compilerState;\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n asyncResolveKey,\n cache: transformCache,\n emitWarning: (message: string) => {\n const warning = new Error(message);\n // Remove the stack so webpack's ModuleWarning doesn't copy it into\n // `details`, which causes the message to render twice (once from\n // .message, once from .details containing \"Error: <same message>\").\n delete warning.stack;\n this.emitWarning(warning);\n },\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(() => {\n if (!compiler) {\n compilerState.dispose();\n }\n });\n};\n\nexport default webpack5Loader;\n"],"file":"index.js"}
|
package/esm/outputCssLoader.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
import { getCacheInstance } from
|
|
1
|
+
import { getCacheInstance } from "./cache.js";
|
|
2
2
|
export default async function outputCssLoader() {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
} catch (err) {
|
|
17
|
-
this.callback(err);
|
|
18
|
-
}
|
|
3
|
+
this.async();
|
|
4
|
+
const { cacheProvider, cacheProviderId } = this.getOptions();
|
|
5
|
+
try {
|
|
6
|
+
const cacheInstance = await getCacheInstance(cacheProvider, cacheProviderId);
|
|
7
|
+
const result = await cacheInstance.get(this.resourcePath);
|
|
8
|
+
const dependencies = await cacheInstance.getDependencies?.(this.resourcePath) ?? [];
|
|
9
|
+
dependencies.forEach((dependency) => {
|
|
10
|
+
this.addDependency(dependency);
|
|
11
|
+
});
|
|
12
|
+
this.callback(null, result);
|
|
13
|
+
} catch (err) {
|
|
14
|
+
this.callback(err);
|
|
15
|
+
}
|
|
19
16
|
}
|
|
20
|
-
//# sourceMappingURL=outputCssLoader.js.map
|
|
17
|
+
//# sourceMappingURL=outputCssLoader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"mappings":"AAGA,SAAS,wBAAwB;AAEjC,eAAe,eAAe,kBAK5B;AACA,MAAK,OAAO;CACZ,MAAM,EAAE,eAAe,oBAAoB,KAAK,YAAY;AAE5D,KAAI;EACF,MAAM,gBAAgB,MAAM,iBAC1B,eACA,gBACD;EAED,MAAM,SAAS,MAAM,cAAc,IAAI,KAAK,aAAa;EACzD,MAAM,eACH,MAAM,cAAc,kBAAkB,KAAK,aAAa,IAAK,EAAE;AAElE,eAAa,SAAS,eAAe;AACnC,QAAK,cAAc,WAAW;IAC9B;AAEF,OAAK,SAAS,MAAM,OAAO;UACpB,KAAK;AACZ,OAAK,SAAS,IAAa","names":[],"sources":["../src/outputCssLoader.ts"],"version":3,"sourcesContent":["import type webpack from 'webpack';\n\nimport type { ICache } from './cache';\nimport { getCacheInstance } from './cache';\n\nexport default async function outputCssLoader(\n this: webpack.LoaderContext<{\n cacheProvider: string | ICache | undefined;\n cacheProviderId?: string | undefined;\n }>\n) {\n this.async();\n const { cacheProvider, cacheProviderId } = this.getOptions();\n\n try {\n const cacheInstance = await getCacheInstance(\n cacheProvider,\n cacheProviderId\n );\n\n const result = await cacheInstance.get(this.resourcePath);\n const dependencies =\n (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];\n\n dependencies.forEach((dependency) => {\n this.addDependency(dependency);\n });\n\n this.callback(null, result);\n } catch (err) {\n this.callback(err as Error);\n }\n}\n"],"file":"outputCssLoader.js"}
|
package/package.json
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wyw-in-js/webpack-loader",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.0",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"dependencies": {
|
|
5
|
-
"@wyw-in-js/shared": "
|
|
6
|
-
"@wyw-in-js/transform": "
|
|
6
|
+
"@wyw-in-js/shared": "2.0.0-alpha.0",
|
|
7
|
+
"@wyw-in-js/transform": "2.0.0-alpha.0"
|
|
7
8
|
},
|
|
8
9
|
"devDependencies": {
|
|
9
|
-
"@types/node": "^
|
|
10
|
-
"@wyw-in-js/babel-config": "workspace:*",
|
|
10
|
+
"@types/node": "^22.0.0",
|
|
11
11
|
"@wyw-in-js/eslint-config": "workspace:*",
|
|
12
12
|
"@wyw-in-js/ts-config": "workspace:*",
|
|
13
13
|
"source-map": "^0.7.4",
|
|
14
14
|
"webpack": "^5.76.0"
|
|
15
15
|
},
|
|
16
16
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
17
|
+
"node": ">=22.0.0"
|
|
18
|
+
},
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./types/index.d.ts",
|
|
22
|
+
"default": "./esm/index.js"
|
|
23
|
+
}
|
|
18
24
|
},
|
|
19
25
|
"files": [
|
|
20
26
|
"esm/",
|
|
21
|
-
"lib/",
|
|
22
27
|
"types/"
|
|
23
28
|
],
|
|
24
29
|
"license": "MIT",
|
|
25
|
-
"main": "
|
|
30
|
+
"main": "esm/index.js",
|
|
26
31
|
"module": "esm/index.js",
|
|
27
32
|
"peerDependencies": {
|
|
28
33
|
"webpack": "^5.76.0"
|
|
@@ -31,8 +36,7 @@
|
|
|
31
36
|
"access": "public"
|
|
32
37
|
},
|
|
33
38
|
"scripts": {
|
|
34
|
-
"build:esm": "
|
|
35
|
-
"build:lib": "cross-env NODE_ENV=legacy babel src --out-dir lib --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
|
|
39
|
+
"build:esm": "node ../../scripts/build-esm-oxc.mjs",
|
|
36
40
|
"build:types": "tsc --project ./tsconfig.lib.json --baseUrl . --rootDir ./src",
|
|
37
41
|
"lint": "eslint --ext .js,.ts .",
|
|
38
42
|
"test": "bun test src"
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const transform_1 = require("@wyw-in-js/transform");
|
|
5
|
-
exports.sharedState = {};
|
|
6
|
-
class WYWinJSDebugPlugin {
|
|
1
|
+
import { createFileReporter } from '@wyw-in-js/transform';
|
|
2
|
+
export const sharedState = {};
|
|
3
|
+
export class WYWinJSDebugPlugin {
|
|
7
4
|
onDone;
|
|
8
5
|
constructor(options) {
|
|
9
|
-
const { emitter, onDone } =
|
|
10
|
-
|
|
6
|
+
const { emitter, onDone } = createFileReporter(options ?? false);
|
|
7
|
+
sharedState.emitter = emitter;
|
|
11
8
|
this.onDone = onDone;
|
|
12
9
|
}
|
|
13
10
|
apply(compiler) {
|
|
@@ -16,4 +13,3 @@ class WYWinJSDebugPlugin {
|
|
|
16
13
|
});
|
|
17
14
|
}
|
|
18
15
|
}
|
|
19
|
-
exports.WYWinJSDebugPlugin = WYWinJSDebugPlugin;
|
package/types/cache.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.getCacheInstance = exports.memoryCache = exports.registerCacheProvider = void 0;
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
const nodeRequire = createRequire(import.meta.url);
|
|
4
3
|
let cacheProviderSeq = 0;
|
|
5
4
|
const cacheProviderIds = new WeakMap();
|
|
6
5
|
const cacheProvidersById = new Map();
|
|
7
|
-
const registerCacheProvider = (cacheProvider) => {
|
|
6
|
+
export const registerCacheProvider = (cacheProvider) => {
|
|
8
7
|
const knownId = cacheProviderIds.get(cacheProvider);
|
|
9
8
|
if (knownId) {
|
|
10
9
|
return knownId;
|
|
@@ -15,7 +14,6 @@ const registerCacheProvider = (cacheProvider) => {
|
|
|
15
14
|
cacheProvidersById.set(id, cacheProvider);
|
|
16
15
|
return id;
|
|
17
16
|
};
|
|
18
|
-
exports.registerCacheProvider = registerCacheProvider;
|
|
19
17
|
// memory cache, which is the default cache implementation in WYW-in-JS
|
|
20
18
|
class MemoryCache {
|
|
21
19
|
cache = new Map();
|
|
@@ -35,13 +33,13 @@ class MemoryCache {
|
|
|
35
33
|
return Promise.resolve();
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
|
-
|
|
36
|
+
export const memoryCache = new MemoryCache();
|
|
39
37
|
/**
|
|
40
38
|
* return cache instance from `options.cacheProvider`
|
|
41
39
|
* @param cacheProvider string | ICache | undefined
|
|
42
40
|
* @returns ICache instance
|
|
43
41
|
*/
|
|
44
|
-
const getCacheInstance = async (cacheProvider, cacheProviderId) => {
|
|
42
|
+
export const getCacheInstance = async (cacheProvider, cacheProviderId) => {
|
|
45
43
|
if (cacheProviderId) {
|
|
46
44
|
const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);
|
|
47
45
|
if (!cacheProviderInstance) {
|
|
@@ -50,10 +48,10 @@ const getCacheInstance = async (cacheProvider, cacheProviderId) => {
|
|
|
50
48
|
return cacheProviderInstance;
|
|
51
49
|
}
|
|
52
50
|
if (!cacheProvider) {
|
|
53
|
-
return
|
|
51
|
+
return memoryCache;
|
|
54
52
|
}
|
|
55
53
|
if (typeof cacheProvider === 'string') {
|
|
56
|
-
return
|
|
54
|
+
return nodeRequire(cacheProvider);
|
|
57
55
|
}
|
|
58
56
|
if (typeof cacheProvider === 'object' &&
|
|
59
57
|
'get' in cacheProvider &&
|
|
@@ -62,4 +60,3 @@ const getCacheInstance = async (cacheProvider, cacheProviderId) => {
|
|
|
62
60
|
}
|
|
63
61
|
throw new Error(`Invalid cache provider: ${cacheProvider}`);
|
|
64
62
|
};
|
|
65
|
-
exports.getCacheInstance = getCacheInstance;
|
package/types/index.js
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* This file contains a Webpack loader for WYW-in-JS.
|
|
4
3
|
* It uses the transform.ts function to generate class names from source code,
|
|
5
4
|
* returns transformed code without template literals and attaches generated source maps
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const WYWinJSDebugPlugin_1 = require("./WYWinJSDebugPlugin");
|
|
17
|
-
const cache_1 = require("./cache");
|
|
18
|
-
var WYWinJSDebugPlugin_2 = require("./WYWinJSDebugPlugin");
|
|
19
|
-
Object.defineProperty(exports, "WYWinJSDebugPlugin", { enumerable: true, get: function () { return WYWinJSDebugPlugin_2.WYWinJSDebugPlugin; } });
|
|
20
|
-
const outputCssLoader = require.resolve('./outputCssLoader');
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import crypto from 'crypto';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { logger } from '@wyw-in-js/shared';
|
|
10
|
+
import { disposeEvalBroker, transform, TransformCacheCollection, } from '@wyw-in-js/transform';
|
|
11
|
+
import { sharedState } from './WYWinJSDebugPlugin';
|
|
12
|
+
import { getCacheInstance, registerCacheProvider } from './cache';
|
|
13
|
+
export { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';
|
|
14
|
+
const outputCssLoader = fileURLToPath(new URL('./outputCssLoader.js', import.meta.url));
|
|
21
15
|
const stripQueryAndHash = (request) => {
|
|
22
16
|
const queryIdx = request.indexOf('?');
|
|
23
17
|
const hashIdx = request.indexOf('#');
|
|
@@ -28,48 +22,101 @@ const stripQueryAndHash = (request) => {
|
|
|
28
22
|
return request.slice(0, queryIdx);
|
|
29
23
|
return request.slice(0, Math.min(queryIdx, hashIdx));
|
|
30
24
|
};
|
|
31
|
-
const hashText = (text) =>
|
|
32
|
-
const
|
|
33
|
-
|
|
25
|
+
const hashText = (text) => crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);
|
|
26
|
+
const COMPILER_SCOPE_NAME = 'WYWinJSResolverScope';
|
|
27
|
+
let compilerScopeId = 0;
|
|
28
|
+
const compilerStates = new WeakMap();
|
|
34
29
|
const getResolverKey = (importer, stack) => {
|
|
35
30
|
const root = stack.length ? stack[stack.length - 1] : importer;
|
|
36
31
|
return stripQueryAndHash(root);
|
|
37
32
|
};
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Every resolver should return the same result, but we need to call all of them
|
|
54
|
-
// to ensure that all side effects are executed (e.g. adding dependencies)
|
|
55
|
-
return Promise.all(resolver.map((r) => r(what, importer, stack))).then((results) => {
|
|
56
|
-
const firstResult = results[0];
|
|
57
|
-
if (results.some((r) => r !== firstResult)) {
|
|
58
|
-
throw new Error('Resolvers returned different results');
|
|
33
|
+
const createResolverScope = () => {
|
|
34
|
+
const resolvers = new Map();
|
|
35
|
+
compilerScopeId += 1;
|
|
36
|
+
const key = `webpack:${compilerScopeId}`;
|
|
37
|
+
return {
|
|
38
|
+
asyncResolve: (what, importer, stack = [importer]) => {
|
|
39
|
+
const resolverKeys = [
|
|
40
|
+
getResolverKey(importer, stack),
|
|
41
|
+
stripQueryAndHash(importer),
|
|
42
|
+
].filter((candidate, idx, all) => all.indexOf(candidate) === idx);
|
|
43
|
+
const selectedResolvers = resolverKeys
|
|
44
|
+
.map((resolverKey) => resolvers.get(resolverKey))
|
|
45
|
+
.filter((resolver) => Boolean(resolver));
|
|
46
|
+
if (selectedResolvers.length === 0) {
|
|
47
|
+
throw new Error('No resolver found');
|
|
59
48
|
}
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
// Root and importer resolver side effects both matter for dependency
|
|
50
|
+
// tracking, so keep them aligned and verify they agree on the answer.
|
|
51
|
+
return Promise.all(selectedResolvers.map((resolver) => resolver(what, importer, stack))).then((results) => {
|
|
52
|
+
const firstResult = results[0];
|
|
53
|
+
if (results.some((result) => result !== firstResult)) {
|
|
54
|
+
throw new Error('Resolvers returned different results');
|
|
55
|
+
}
|
|
56
|
+
return firstResult;
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
cache: new TransformCacheCollection(),
|
|
60
|
+
dispose: () => {
|
|
61
|
+
resolvers.clear();
|
|
62
|
+
},
|
|
63
|
+
key,
|
|
64
|
+
replaceResolver: (resourcePath, resolver) => {
|
|
65
|
+
resolvers.set(stripQueryAndHash(resourcePath), resolver);
|
|
66
|
+
},
|
|
62
67
|
};
|
|
63
68
|
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
69
|
+
const disposeCompilerState = (state) => {
|
|
70
|
+
state.clearResolvers();
|
|
71
|
+
disposeEvalBroker(state.cache);
|
|
72
|
+
};
|
|
73
|
+
const getCompilerState = (compiler) => {
|
|
74
|
+
const cached = compilerStates.get(compiler);
|
|
75
|
+
if (cached) {
|
|
76
|
+
return cached;
|
|
67
77
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
78
|
+
// Resolver identity must stay stable across files within one compiler or we
|
|
79
|
+
// churn both the shared transform cache salt and the eval broker/runner.
|
|
80
|
+
const scope = createResolverScope();
|
|
81
|
+
const state = {
|
|
82
|
+
...scope,
|
|
83
|
+
clearResolvers: scope.dispose,
|
|
84
|
+
dispose: () => disposeCompilerState(state),
|
|
85
|
+
hooksInstalled: false,
|
|
71
86
|
};
|
|
72
|
-
|
|
87
|
+
const installHooks = () => {
|
|
88
|
+
if (state.hooksInstalled)
|
|
89
|
+
return;
|
|
90
|
+
state.hooksInstalled = true;
|
|
91
|
+
compiler.hooks.done?.tap(COMPILER_SCOPE_NAME, () => {
|
|
92
|
+
state.clearResolvers();
|
|
93
|
+
});
|
|
94
|
+
compiler.hooks.failed?.tap(COMPILER_SCOPE_NAME, () => {
|
|
95
|
+
state.clearResolvers();
|
|
96
|
+
});
|
|
97
|
+
compiler.hooks.watchClose?.tap(COMPILER_SCOPE_NAME, () => {
|
|
98
|
+
state.dispose();
|
|
99
|
+
compilerStates.delete(compiler);
|
|
100
|
+
});
|
|
101
|
+
compiler.hooks.shutdown?.tap(COMPILER_SCOPE_NAME, () => {
|
|
102
|
+
state.dispose();
|
|
103
|
+
compilerStates.delete(compiler);
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
installHooks();
|
|
107
|
+
compilerStates.set(compiler, state);
|
|
108
|
+
return state;
|
|
109
|
+
};
|
|
110
|
+
const createInvocationScope = () => {
|
|
111
|
+
const scope = createResolverScope();
|
|
112
|
+
return {
|
|
113
|
+
...scope,
|
|
114
|
+
dispose: () => {
|
|
115
|
+
scope.dispose();
|
|
116
|
+
disposeEvalBroker(scope.cache);
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
};
|
|
73
120
|
const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
74
121
|
function convertSourceMap(value, filename) {
|
|
75
122
|
if (typeof value === 'string' || !value) {
|
|
@@ -115,21 +162,25 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
115
162
|
finish(err, null);
|
|
116
163
|
}
|
|
117
164
|
});
|
|
118
|
-
const
|
|
165
|
+
const { _compiler: compiler } = this;
|
|
166
|
+
const compilerState = compiler
|
|
167
|
+
? getCompilerState(compiler)
|
|
168
|
+
: createInvocationScope();
|
|
169
|
+
compilerState.replaceResolver(this.resourcePath, (what, importer) => {
|
|
119
170
|
const importerPath = stripQueryAndHash(importer);
|
|
120
|
-
const context =
|
|
121
|
-
?
|
|
122
|
-
:
|
|
171
|
+
const context = path.isAbsolute(importerPath)
|
|
172
|
+
? path.dirname(importerPath)
|
|
173
|
+
: path.join(process.cwd(), path.dirname(importerPath));
|
|
123
174
|
return resolveModuleAsync(context, what).then((result) => {
|
|
124
175
|
const filePath = stripQueryAndHash(result);
|
|
125
|
-
if (
|
|
176
|
+
if (path.isAbsolute(filePath)) {
|
|
126
177
|
this.addDependency(filePath);
|
|
127
178
|
}
|
|
128
179
|
return result;
|
|
129
180
|
});
|
|
130
181
|
});
|
|
131
|
-
const asyncResolve =
|
|
132
|
-
|
|
182
|
+
const { asyncResolve, cache: transformCache, key: asyncResolveKey, } = compilerState;
|
|
183
|
+
logger('loader %s', this.resourcePath);
|
|
133
184
|
const { sourceMap = undefined, preprocessor = undefined, keepComments = undefined, prefixer = undefined, extension = '.wyw-in-js.css', cssImport = 'require', cacheProvider, ...rest } = this.getOptions() || {};
|
|
134
185
|
const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
|
|
135
186
|
const transformServices = {
|
|
@@ -142,11 +193,19 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
142
193
|
preprocessor,
|
|
143
194
|
root: process.cwd(),
|
|
144
195
|
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
196
|
+
asyncResolveKey,
|
|
197
|
+
cache: transformCache,
|
|
198
|
+
emitWarning: (message) => {
|
|
199
|
+
const warning = new Error(message);
|
|
200
|
+
// Remove the stack so webpack's ModuleWarning doesn't copy it into
|
|
201
|
+
// `details`, which causes the message to render twice (once from
|
|
202
|
+
// .message, once from .details containing "Error: <same message>").
|
|
203
|
+
delete warning.stack;
|
|
204
|
+
this.emitWarning(warning);
|
|
205
|
+
},
|
|
206
|
+
eventEmitter: sharedState.emitter,
|
|
148
207
|
};
|
|
149
|
-
|
|
208
|
+
transform(transformServices, content.toString(), asyncResolve)
|
|
150
209
|
.then(async (result) => {
|
|
151
210
|
try {
|
|
152
211
|
if (result.cssText) {
|
|
@@ -155,9 +214,9 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
155
214
|
cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
|
|
156
215
|
}
|
|
157
216
|
await Promise.all(result.dependencies?.map((dep) => asyncResolve(dep, this.resourcePath)) ?? []);
|
|
158
|
-
const cacheInstance = await
|
|
217
|
+
const cacheInstance = await getCacheInstance(cacheProvider);
|
|
159
218
|
const cacheProviderId = cacheProvider && typeof cacheProvider === 'object'
|
|
160
|
-
?
|
|
219
|
+
? registerCacheProvider(cacheInstance)
|
|
161
220
|
: '';
|
|
162
221
|
await cacheInstance.set(this.resourcePath, cssText);
|
|
163
222
|
await cacheInstance.setDependencies?.(this.resourcePath, this.getDependencies());
|
|
@@ -185,6 +244,10 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
185
244
|
this.callback(err);
|
|
186
245
|
})
|
|
187
246
|
.catch((err) => this.callback(err))
|
|
188
|
-
.finally(
|
|
247
|
+
.finally(() => {
|
|
248
|
+
if (!compiler) {
|
|
249
|
+
compilerState.dispose();
|
|
250
|
+
}
|
|
251
|
+
});
|
|
189
252
|
};
|
|
190
|
-
|
|
253
|
+
export default webpack5Loader;
|
package/types/outputCssLoader.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.default = outputCssLoader;
|
|
4
|
-
const cache_1 = require("./cache");
|
|
5
|
-
async function outputCssLoader() {
|
|
1
|
+
import { getCacheInstance } from './cache';
|
|
2
|
+
export default async function outputCssLoader() {
|
|
6
3
|
this.async();
|
|
7
4
|
const { cacheProvider, cacheProviderId } = this.getOptions();
|
|
8
5
|
try {
|
|
9
|
-
const cacheInstance = await
|
|
6
|
+
const cacheInstance = await getCacheInstance(cacheProvider, cacheProviderId);
|
|
10
7
|
const result = await cacheInstance.get(this.resourcePath);
|
|
11
8
|
const dependencies = (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];
|
|
12
9
|
dependencies.forEach((dependency) => {
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.sharedState = exports.WYWinJSDebugPlugin = void 0;
|
|
7
|
-
var _transform = require("@wyw-in-js/transform");
|
|
8
|
-
const sharedState = exports.sharedState = {};
|
|
9
|
-
class WYWinJSDebugPlugin {
|
|
10
|
-
constructor(options) {
|
|
11
|
-
const {
|
|
12
|
-
emitter,
|
|
13
|
-
onDone
|
|
14
|
-
} = (0, _transform.createFileReporter)(options !== null && options !== void 0 ? options : false);
|
|
15
|
-
sharedState.emitter = emitter;
|
|
16
|
-
this.onDone = onDone;
|
|
17
|
-
}
|
|
18
|
-
apply(compiler) {
|
|
19
|
-
compiler.hooks.shutdown.tap('WYWinJSDebug', () => {
|
|
20
|
-
this.onDone(process.cwd());
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
exports.WYWinJSDebugPlugin = WYWinJSDebugPlugin;
|
|
25
|
-
//# sourceMappingURL=WYWinJSDebugPlugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WYWinJSDebugPlugin.js","names":["_transform","require","sharedState","exports","WYWinJSDebugPlugin","constructor","options","emitter","onDone","createFileReporter","apply","compiler","hooks","shutdown","tap","process","cwd"],"sources":["../src/WYWinJSDebugPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\n\nimport type { EventEmitter, IFileReporterOptions } from '@wyw-in-js/transform';\nimport { createFileReporter } from '@wyw-in-js/transform';\n\nexport const sharedState: {\n emitter?: EventEmitter;\n} = {};\n\nexport class WYWinJSDebugPlugin {\n private readonly onDone: (root: string) => void;\n\n constructor(options?: IFileReporterOptions) {\n const { emitter, onDone } = createFileReporter(options ?? false);\n sharedState.emitter = emitter;\n this.onDone = onDone;\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.shutdown.tap('WYWinJSDebug', () => {\n this.onDone(process.cwd());\n });\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,WAEZ,GAAAC,OAAA,CAAAD,WAAA,GAAG,CAAC,CAAC;AAEC,MAAME,kBAAkB,CAAC;EAG9BC,WAAWA,CAACC,OAA8B,EAAE;IAC1C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAG,IAAAC,6BAAkB,EAACH,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,KAAK,CAAC;IAChEJ,WAAW,CAACK,OAAO,GAAGA,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAE,KAAKA,CAACC,QAAkB,EAAE;IACxBA,QAAQ,CAACC,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,cAAc,EAAE,MAAM;MAChD,IAAI,CAACN,MAAM,CAACO,OAAO,CAACC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;EACJ;AACF;AAACb,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
|
package/lib/cache.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.registerCacheProvider = exports.memoryCache = exports.getCacheInstance = void 0;
|
|
7
|
-
let cacheProviderSeq = 0;
|
|
8
|
-
const cacheProviderIds = new WeakMap();
|
|
9
|
-
const cacheProvidersById = new Map();
|
|
10
|
-
const registerCacheProvider = cacheProvider => {
|
|
11
|
-
const knownId = cacheProviderIds.get(cacheProvider);
|
|
12
|
-
if (knownId) {
|
|
13
|
-
return knownId;
|
|
14
|
-
}
|
|
15
|
-
cacheProviderSeq += 1;
|
|
16
|
-
const id = `${cacheProviderSeq}`;
|
|
17
|
-
cacheProviderIds.set(cacheProvider, id);
|
|
18
|
-
cacheProvidersById.set(id, cacheProvider);
|
|
19
|
-
return id;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// memory cache, which is the default cache implementation in WYW-in-JS
|
|
23
|
-
exports.registerCacheProvider = registerCacheProvider;
|
|
24
|
-
class MemoryCache {
|
|
25
|
-
cache = new Map();
|
|
26
|
-
dependenciesCache = new Map();
|
|
27
|
-
get(key) {
|
|
28
|
-
var _this$cache$get;
|
|
29
|
-
return Promise.resolve((_this$cache$get = this.cache.get(key)) !== null && _this$cache$get !== void 0 ? _this$cache$get : '');
|
|
30
|
-
}
|
|
31
|
-
getDependencies(key) {
|
|
32
|
-
var _this$dependenciesCac;
|
|
33
|
-
return Promise.resolve((_this$dependenciesCac = this.dependenciesCache.get(key)) !== null && _this$dependenciesCac !== void 0 ? _this$dependenciesCac : []);
|
|
34
|
-
}
|
|
35
|
-
set(key, value) {
|
|
36
|
-
this.cache.set(key, value);
|
|
37
|
-
return Promise.resolve();
|
|
38
|
-
}
|
|
39
|
-
setDependencies(key, value) {
|
|
40
|
-
this.dependenciesCache.set(key, value);
|
|
41
|
-
return Promise.resolve();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const memoryCache = exports.memoryCache = new MemoryCache();
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* return cache instance from `options.cacheProvider`
|
|
48
|
-
* @param cacheProvider string | ICache | undefined
|
|
49
|
-
* @returns ICache instance
|
|
50
|
-
*/
|
|
51
|
-
const getCacheInstance = async (cacheProvider, cacheProviderId) => {
|
|
52
|
-
if (cacheProviderId) {
|
|
53
|
-
const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);
|
|
54
|
-
if (!cacheProviderInstance) {
|
|
55
|
-
throw new Error(`Invalid cache provider id: ${cacheProviderId}`);
|
|
56
|
-
}
|
|
57
|
-
return cacheProviderInstance;
|
|
58
|
-
}
|
|
59
|
-
if (!cacheProvider) {
|
|
60
|
-
return memoryCache;
|
|
61
|
-
}
|
|
62
|
-
if (typeof cacheProvider === 'string') {
|
|
63
|
-
return require(cacheProvider);
|
|
64
|
-
}
|
|
65
|
-
if (typeof cacheProvider === 'object' && 'get' in cacheProvider && 'set' in cacheProvider) {
|
|
66
|
-
return cacheProvider;
|
|
67
|
-
}
|
|
68
|
-
throw new Error(`Invalid cache provider: ${cacheProvider}`);
|
|
69
|
-
};
|
|
70
|
-
exports.getCacheInstance = getCacheInstance;
|
|
71
|
-
//# sourceMappingURL=cache.js.map
|