@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 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: rest,
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.0",
3
+ "version": "2.0.0-alpha.1",
4
4
  "type": "module",
5
5
  "dependencies": {
6
- "@wyw-in-js/shared": "2.0.0-alpha.0",
7
- "@wyw-in-js/transform": "2.0.0-alpha.0"
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: rest,
191
+ pluginOptions: {
192
+ ...rest,
193
+ oxcOptions: mergeOxcResolverAlias(rest.oxcOptions, nativeResolverAlias),
194
+ },
191
195
  prefixer,
192
196
  keepComments,
193
197
  preprocessor,