@wyw-in-js/webpack-loader 2.0.0-alpha.0 → 2.0.0-alpha.1
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/README.md +9 -0
- package/esm/index.js +6 -2
- package/esm/index.js.map +1 -1
- package/package.json +3 -3
- package/types/index.js +6 -2
package/README.md
CHANGED
|
@@ -33,6 +33,15 @@ module.exports = {
|
|
|
33
33
|
};
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
## Eval resolver modes
|
|
37
|
+
|
|
38
|
+
`eval.resolver: 'native'` and the native step of `eval.resolver: 'hybrid'` use `oxc-resolver` with automatic
|
|
39
|
+
`tsconfig.json` discovery. The loader also forwards static string entries from webpack `resolve.alias`.
|
|
40
|
+
|
|
41
|
+
Use `hybrid` when evaluated imports may rely on webpack resolver plugins, query handling, or non-string aliases. Use
|
|
42
|
+
`native` only when `oxc-resolver` can resolve all evaluated imports, or mirror webpack-only aliases in
|
|
43
|
+
`oxcOptions.resolver.alias`.
|
|
44
|
+
|
|
36
45
|
## Disabling vendor prefixing
|
|
37
46
|
|
|
38
47
|
Stylis adds vendor-prefixed CSS by default. To disable it (and reduce CSS size), pass `prefixer: false`:
|
package/esm/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import path from "path";
|
|
7
7
|
import crypto from "crypto";
|
|
8
8
|
import { fileURLToPath } from "url";
|
|
9
|
-
import { logger } from "@wyw-in-js/shared";
|
|
9
|
+
import { logger, mergeOxcResolverAlias, toNativeResolverAlias } from "@wyw-in-js/shared";
|
|
10
10
|
import { disposeEvalBroker, transform, TransformCacheCollection } from "@wyw-in-js/transform";
|
|
11
11
|
import { sharedState } from "./WYWinJSDebugPlugin.js";
|
|
12
12
|
import { getCacheInstance, registerCacheProvider } from "./cache.js";
|
|
@@ -167,6 +167,7 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
167
167
|
});
|
|
168
168
|
});
|
|
169
169
|
const { asyncResolve, cache: transformCache, key: asyncResolveKey } = compilerState;
|
|
170
|
+
const nativeResolverAlias = toNativeResolverAlias(compiler?.options?.resolve?.alias);
|
|
170
171
|
logger("loader %s", this.resourcePath);
|
|
171
172
|
const { sourceMap = undefined, preprocessor = undefined, keepComments = undefined, prefixer = undefined, extension = ".wyw-in-js.css", cssImport = "require", cacheProvider, ...rest } = this.getOptions() || {};
|
|
172
173
|
const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
|
|
@@ -174,7 +175,10 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
174
175
|
options: {
|
|
175
176
|
filename: this.resourcePath,
|
|
176
177
|
inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
|
|
177
|
-
pluginOptions:
|
|
178
|
+
pluginOptions: {
|
|
179
|
+
...rest,
|
|
180
|
+
oxcOptions: mergeOxcResolverAlias(rest.oxcOptions, nativeResolverAlias)
|
|
181
|
+
},
|
|
178
182
|
prefixer,
|
|
179
183
|
keepComments,
|
|
180
184
|
preprocessor,
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"}
|
|
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 {\n logger,\n mergeOxcResolverAlias,\n toNativeResolverAlias,\n} 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 const nativeResolverAlias = toNativeResolverAlias(\n compiler?.options?.resolve?.alias\n );\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: {\n ...rest,\n oxcOptions: mergeOxcResolverAlias(\n rest.oxcOptions,\n nativeResolverAlias\n ),\n },\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/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wyw-in-js/webpack-loader",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@wyw-in-js/shared": "2.0.0-alpha.
|
|
7
|
-
"@wyw-in-js/transform": "2.0.0-alpha.
|
|
6
|
+
"@wyw-in-js/shared": "2.0.0-alpha.1",
|
|
7
|
+
"@wyw-in-js/transform": "2.0.0-alpha.1"
|
|
8
8
|
},
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@types/node": "^22.0.0",
|
package/types/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import crypto from 'crypto';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
|
-
import { logger } from '@wyw-in-js/shared';
|
|
9
|
+
import { logger, mergeOxcResolverAlias, toNativeResolverAlias, } from '@wyw-in-js/shared';
|
|
10
10
|
import { disposeEvalBroker, transform, TransformCacheCollection, } from '@wyw-in-js/transform';
|
|
11
11
|
import { sharedState } from './WYWinJSDebugPlugin';
|
|
12
12
|
import { getCacheInstance, registerCacheProvider } from './cache';
|
|
@@ -180,6 +180,7 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
180
180
|
});
|
|
181
181
|
});
|
|
182
182
|
const { asyncResolve, cache: transformCache, key: asyncResolveKey, } = compilerState;
|
|
183
|
+
const nativeResolverAlias = toNativeResolverAlias(compiler?.options?.resolve?.alias);
|
|
183
184
|
logger('loader %s', this.resourcePath);
|
|
184
185
|
const { sourceMap = undefined, preprocessor = undefined, keepComments = undefined, prefixer = undefined, extension = '.wyw-in-js.css', cssImport = 'require', cacheProvider, ...rest } = this.getOptions() || {};
|
|
185
186
|
const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
|
|
@@ -187,7 +188,10 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
|
|
|
187
188
|
options: {
|
|
188
189
|
filename: this.resourcePath,
|
|
189
190
|
inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
|
|
190
|
-
pluginOptions:
|
|
191
|
+
pluginOptions: {
|
|
192
|
+
...rest,
|
|
193
|
+
oxcOptions: mergeOxcResolverAlias(rest.oxcOptions, nativeResolverAlias),
|
|
194
|
+
},
|
|
191
195
|
prefixer,
|
|
192
196
|
keepComments,
|
|
193
197
|
preprocessor,
|