@wyw-in-js/webpack-loader 1.0.8 → 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/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":"AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,IAAI,MAAM,MAAM;AACvB,OAAOC,MAAM,MAAM,QAAQ;AAK3B,SAASC,MAAM,QAAQ,mBAAmB;AAE1C,SAASC,SAAS,EAAEC,wBAAwB,QAAQ,sBAAsB;AAE1E,SAASC,WAAW,QAAQ,sBAAsB;AAElD,SAASC,gBAAgB,EAAEC,qBAAqB,QAAQ,SAAS;AAEjE,SAASC,kBAAkB,QAAQ,sBAAsB;AAEzD,MAAMC,eAAe,GAAGC,OAAO,CAACC,OAAO,CAAC,mBAAmB,CAAC;AAE5D,MAAMC,iBAAiB,GAAIC,OAAe,IAAK;EAC7C,MAAMC,QAAQ,GAAGD,OAAO,CAACE,OAAO,CAAC,GAAG,CAAC;EACrC,MAAMC,OAAO,GAAGH,OAAO,CAACE,OAAO,CAAC,GAAG,CAAC;EAEpC,IAAID,QAAQ,KAAK,CAAC,CAAC,EAAE;IACnB,OAAOE,OAAO,KAAK,CAAC,CAAC,GAAGH,OAAO,GAAGA,OAAO,CAACI,KAAK,CAAC,CAAC,EAAED,OAAO,CAAC;EAC7D;EACA,IAAIA,OAAO,KAAK,CAAC,CAAC,EAAE,OAAOH,OAAO,CAACI,KAAK,CAAC,CAAC,EAAEH,QAAQ,CAAC;EAErD,OAAOD,OAAO,CAACI,KAAK,CAAC,CAAC,EAAEC,IAAI,CAACC,GAAG,CAACL,QAAQ,EAAEE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,MAAMI,QAAQ,GAAIC,IAAY,IAC5BpB,MAAM,CAACqB,UAAU,CAAC,QAAQ,CAAC,CAACC,MAAM,CAACF,IAAI,CAAC,CAACG,MAAM,CAAC,KAAK,CAAC,CAACP,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAarE,MAAMQ,KAAK,GAAG,IAAIrB,wBAAwB,CAAC,CAAC;AAQ5C,MAAMsB,SAAqC,GAAG,CAAC,CAAC;AAEhD,MAAMC,cAAc,GAAGA,CAACC,QAAgB,EAAEC,KAAe,KAAa;EACpE,MAAMC,IAAI,GAAGD,KAAK,CAACE,MAAM,GAAGF,KAAK,CAACA,KAAK,CAACE,MAAM,GAAG,CAAC,CAAC,GAAGH,QAAQ;EAC9D,OAAOhB,iBAAiB,CAACkB,IAAI,CAAC;AAChC,CAAC;AAED,MAAME,kBAAkB,GAAIC,GAAW,IAAiB;EACtD,MAAMC,OAAO,GAAGR,SAAS,CAACO,GAAG,CAAC;EAC9B,OAAOC,OAAO,EAAEH,MAAM,GAAGG,OAAO,GAAG,EAAE;AACvC,CAAC;AAED,MAAMC,kBAAkB,GAAIC,YAAoB,IAAK;EACnD,MAAMC,kBAAkB,GAAGzB,iBAAiB,CAACwB,YAAY,CAAC;EAE1D,OAAO,CACLE,IAAY,EACZV,QAAgB,EAChBC,KAAe,GAAG,CAACD,QAAQ,CAAC,KACR;IACpB,MAAMW,eAAe,GAAGZ,cAAc,CAACC,QAAQ,EAAEC,KAAK,CAAC;IACvD,MAAMW,aAAa,GAAGR,kBAAkB,CAACO,eAAe,CAAC;IACzD,MAAME,QAAQ,GACZD,aAAa,CAACT,MAAM,GAAG,CAAC,GACpBS,aAAa,GACbR,kBAAkB,CAACK,kBAAkB,CAAC;IAE5C,IAAII,QAAQ,CAACV,MAAM,KAAK,CAAC,EAAE;MACzB,MAAM,IAAIW,KAAK,CAAC,mBAAmB,CAAC;IACtC;;IAEA;IACA;IACA,OAAOC,OAAO,CAACC,GAAG,CAACH,QAAQ,CAACI,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACR,IAAI,EAAEV,QAAQ,EAAEC,KAAK,CAAC,CAAC,CAAC,CAACkB,IAAI,CACnEC,OAAO,IAAK;MACX,MAAMC,WAAW,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC9B,IAAIA,OAAO,CAACE,IAAI,CAAEJ,CAAC,IAAKA,CAAC,KAAKG,WAAW,CAAC,EAAE;QAC1C,MAAM,IAAIP,KAAK,CAAC,sCAAsC,CAAC;MACzD;MAEA,OAAOO,WAAW;IACpB,CACF,CAAC;EACH,CAAC;AACH,CAAC;AAED,SAASE,WAAWA,CAACf,YAAoB,EAAEK,QAAkB,EAAE;EAC7D,IAAI,CAACf,SAAS,CAACU,YAAY,CAAC,EAAE;IAC5BV,SAAS,CAACU,YAAY,CAAC,GAAG,EAAE;EAC9B;EAEAV,SAAS,CAACU,YAAY,CAAC,CAACgB,IAAI,CAACX,QAAQ,CAAC;EAEtC,OAAO,MAAM;IACXf,SAAS,CAACU,YAAY,CAAC,GAAGV,SAAS,CAACU,YAAY,CAAC,CAACiB,MAAM,CACrDP,CAAC,IAAKA,CAAC,KAAKL,QACf,CAAC;EACH,CAAC;AACH;AAEA,MAAMa,cAAsB,GAAG,SAASC,oBAAoBA,CAC1DC,OAAO,EACPC,cAAc,EACd;EACA,SAASC,gBAAgBA,CACvBC,KAA4B,EAC5BC,QAAgB,EACU;IAC1B,IAAI,OAAOD,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,EAAE;MACvC,OAAOE,SAAS;IAClB;IAEA,OAAO;MACL,GAAGF,KAAK;MACRG,IAAI,EAAEH,KAAK,CAACG,IAAI,IAAIF,QAAQ;MAC5BG,QAAQ,EAAEJ,KAAK,CAACI,QAAQ,IAAI,EAAE;MAC9BC,KAAK,EAAEL,KAAK,CAACK,KAAK,IAAI,EAAE;MACxBC,OAAO,EAAEN,KAAK,CAACM,OAAO,IAAI,EAAE;MAC5BC,OAAO,EAAEP,KAAK,CAACO,OAAO,IAAI;IAC5B,CAAC;EACH;;EAEA;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EAEZ,MAAMC,cAAc,GAAG;IAAEC,cAAc,EAAE;EAAM,CAAC;EAEhD,MAAMC,aAIM,GAAG,IAAI,CAACC,UAAU,CAACH,cAAc,CAAC;EAE9C,MAAMI,aAAa,GAAIb,KAAc,IACnC,OAAQA,KAAK,EAAgCZ,IAAI,KAAK,UAAU;EAElE,MAAM0B,kBAAkB,GAAGA,CAACC,OAAe,EAAE7D,OAAe,KAC1D,IAAI8B,OAAO,CAAS,CAAChC,OAAO,EAAEgE,MAAM,KAAK;IACvC,IAAIC,OAAO,GAAG,KAAK;IACnB,MAAMC,MAAM,GAAGA,CAACC,GAAY,EAAEC,MAAe,KAAK;MAChD,IAAIH,OAAO,EAAE;MACbA,OAAO,GAAG,IAAI;MAEd,IAAIE,GAAG,EAAE;QACPH,MAAM,CAACG,GAAG,CAAC;QACX;MACF;MAEA,IAAI,OAAOC,MAAM,KAAK,QAAQ,EAAE;QAC9BpE,OAAO,CAACoE,MAAM,CAAC;QACf;MACF;MAEAJ,MAAM,CAAC,IAAIjC,KAAK,CAAC,kBAAkB7B,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI;MACF,MAAMmE,YAAY,GAAGV,aAAa,CAACI,OAAO,EAAE7D,OAAO,EAAEgE,MAAM,CAAC;MAC5D,IAAIL,aAAa,CAACQ,YAAY,CAAC,EAAE;QAC/BA,YAAY,CAACjC,IAAI,CACdgC,MAAM,IAAKF,MAAM,CAAC,IAAI,EAAEE,MAAM,CAAC,EAC/BD,GAAG,IAAKD,MAAM,CAACC,GAAG,EAAE,IAAI,CAC3B,CAAC;MACH;IACF,CAAC,CAAC,OAAOA,GAAG,EAAE;MACZD,MAAM,CAACC,GAAG,EAAE,IAAI,CAAC;IACnB;EACF,CAAC,CAAC;EAEJ,MAAMG,cAAc,GAAG9B,WAAW,CAAC,IAAI,CAACf,YAAY,EAAE,CAACE,IAAI,EAAEV,QAAQ,KAAK;IACxE,MAAMsD,YAAY,GAAGtE,iBAAiB,CAACgB,QAAQ,CAAC;IAChD,MAAM8C,OAAO,GAAG1E,IAAI,CAACmF,UAAU,CAACD,YAAY,CAAC,GACzClF,IAAI,CAACoF,OAAO,CAACF,YAAY,CAAC,GAC1BlF,IAAI,CAACqF,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEvF,IAAI,CAACoF,OAAO,CAACF,YAAY,CAAC,CAAC;IAExD,OAAOT,kBAAkB,CAACC,OAAO,EAAEpC,IAAI,CAAC,CAACS,IAAI,CAAEgC,MAAM,IAAK;MACxD,MAAMS,QAAQ,GAAG5E,iBAAiB,CAACmE,MAAM,CAAC;MAC1C,IAAI/E,IAAI,CAACmF,UAAU,CAACK,QAAQ,CAAC,EAAE;QAC7B,IAAI,CAACC,aAAa,CAACD,QAAQ,CAAC;MAC9B;MAEA,OAAOT,MAAM;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,MAAMW,YAAY,GAAGvD,kBAAkB,CAAC,IAAI,CAACC,YAAY,CAAC;EAE1DlC,MAAM,CAAC,WAAW,EAAE,IAAI,CAACkC,YAAY,CAAC;EAEtC,MAAM;IACJuD,SAAS,GAAG9B,SAAS;IACrB+B,YAAY,GAAG/B,SAAS;IACxBgC,YAAY,GAAGhC,SAAS;IACxBiC,QAAQ,GAAGjC,SAAS;IACpBkC,SAAS,GAAG,gBAAgB;IAC5BC,SAAS,GAAG,SAAS;IACrBC,aAAa;IACb,GAAGC;EACL,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;EAE3B,MAAMC,cAAc,GAAG,IAAI,CAAChE,YAAY,CAACiE,OAAO,CAAC,UAAU,EAAEN,SAAS,CAAC;EAEvE,MAAMO,iBAAiB,GAAG;IACxBC,OAAO,EAAE;MACP3C,QAAQ,EAAE,IAAI,CAACxB,YAAY;MAC3BqB,cAAc,EAAEC,gBAAgB,CAACD,cAAc,EAAE,IAAI,CAACrB,YAAY,CAAC;MACnEoE,aAAa,EAAEN,IAAI;MACnBJ,QAAQ;MACRD,YAAY;MACZD,YAAY;MACZ9D,IAAI,EAAEwD,OAAO,CAACC,GAAG,CAAC;IACpB,CAAC;IACD9D,KAAK;IACLgF,WAAW,EAAGC,OAAe,IAAK,IAAI,CAACD,WAAW,CAAC,IAAI/D,KAAK,CAACgE,OAAO,CAAC,CAAC;IACtEC,YAAY,EAAEtG,WAAW,CAACuG;EAC5B,CAAC;EAEDzG,SAAS,CAACmG,iBAAiB,EAAE9C,OAAO,CAACqD,QAAQ,CAAC,CAAC,EAAEnB,YAAY,CAAC,CAC3D3C,IAAI,CACH,MAAOgC,MAAc,IAAK;IACxB,IAAI;MACF,IAAIA,MAAM,CAAC+B,OAAO,EAAE;QAClB,IAAI;UAAEA;QAAQ,CAAC,GAAG/B,MAAM;QAExB,IAAIY,SAAS,EAAE;UACbmB,OAAO,IAAI,qDAAqDC,MAAM,CAACC,IAAI,CACzEjC,MAAM,CAACkC,gBAAgB,IAAI,EAC7B,CAAC,CAACJ,QAAQ,CAAC,QAAQ,CAAC,IAAI;QAC1B;QAEA,MAAMlE,OAAO,CAACC,GAAG,CACfmC,MAAM,CAACmC,YAAY,EAAErE,GAAG,CAAEsE,GAAG,IAC3BzB,YAAY,CAACyB,GAAG,EAAE,IAAI,CAAC/E,YAAY,CACrC,CAAC,IAAI,EACP,CAAC;QAED,MAAMgF,aAAa,GAAG,MAAM9G,gBAAgB,CAAC2F,aAAa,CAAC;QAC3D,MAAMoB,eAAe,GACnBpB,aAAa,IAAI,OAAOA,aAAa,KAAK,QAAQ,GAC9C1F,qBAAqB,CAAC6G,aAAa,CAAC,GACpC,EAAE;QAER,MAAMA,aAAa,CAACE,GAAG,CAAC,IAAI,CAAClF,YAAY,EAAE0E,OAAO,CAAC;QAEnD,MAAMM,aAAa,CAACG,eAAe,GACjC,IAAI,CAACnF,YAAY,EACjB,IAAI,CAACoF,eAAe,CAAC,CACvB,CAAC;QAED,MAAMC,QAAQ,GAAG,CACf,OAAOC,kBAAkB,CAAC3B,SAAS,CAACM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAC1D;QAED,IAAI,IAAI,CAACsB,GAAG,EAAE;UACZF,QAAQ,CAACrE,IAAI,CAAC,KAAKsE,kBAAkB,CAACtG,QAAQ,CAAC0F,OAAO,CAAC,CAAC,EAAE,CAAC;QAC7D;QAEA,MAAMc,qBAAqB,GAAG,GAAG,IAAI,CAACxF,YAAY,IAAIqF,QAAQ,CAACpC,IAAI,CACjE,GACF,CAAC,EAAE;QAEH,MAAMxE,OAAO,GAAG,GAAGuF,cAAc,MAAM3F,eAAe,kBAAkBiH,kBAAkB,CACxF,OAAOzB,aAAa,KAAK,QAAQ,GAAGA,aAAa,GAAG,EACtD,CAAC,oBAAoByB,kBAAkB,CACrCL,eACF,CAAC,IAAIO,qBAAqB,EAAE;QAC5B,MAAMC,kBAAkB,GAAGC,IAAI,CAACC,SAAS,CACvC,IAAI,CAACC,KAAK,CAACC,UAAU,CAAC,IAAI,CAACvD,OAAO,IAAI,IAAI,CAACwD,WAAW,EAAErH,OAAO,CACjE,CAAC;QAED,MAAMsH,SAAS,GACbnC,SAAS,KAAK,QAAQ,GAClB,UAAU6B,kBAAkB,GAAG,GAC/B,WAAWA,kBAAkB,IAAI;QAEvC,IAAI,CAACO,QAAQ,CACX,IAAI,EACJ,GAAGrD,MAAM,CAACsD,IAAI,OAAOF,SAAS,EAAE,EAChCpD,MAAM,CAACY,SAAS,IAAI9B,SACtB,CAAC;QAED;MACF;MAEA,IAAI,CAACuE,QAAQ,CAAC,IAAI,EAAErD,MAAM,CAACsD,IAAI,EAAEtD,MAAM,CAACY,SAAS,IAAI9B,SAAS,CAAC;IACjE,CAAC,CAAC,OAAOiB,GAAG,EAAE;MACZ,IAAI,CAACsD,QAAQ,CAACtD,GAAY,CAAC;IAC7B;EACF,CAAC,EACAA,GAAU,IAAK;IACd,IAAI,CAACsD,QAAQ,CAACtD,GAAG,CAAC;EACpB,CACF,CAAC,CACAwD,KAAK,CAAExD,GAAU,IAAK,IAAI,CAACsD,QAAQ,CAACtD,GAAG,CAAC,CAAC,CACzCyD,OAAO,CAACtD,cAAc,CAAC;AAC5B,CAAC;AAED,eAAe3B,cAAc","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"}
@@ -1,20 +1,17 @@
1
- import { getCacheInstance } from './cache';
1
+ import { getCacheInstance } from "./cache.js";
2
2
  export default async function outputCssLoader() {
3
- this.async();
4
- const {
5
- cacheProvider,
6
- cacheProviderId
7
- } = this.getOptions();
8
- try {
9
- const cacheInstance = await getCacheInstance(cacheProvider, cacheProviderId);
10
- const result = await cacheInstance.get(this.resourcePath);
11
- const dependencies = (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];
12
- dependencies.forEach(dependency => {
13
- this.addDependency(dependency);
14
- });
15
- this.callback(null, result);
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
- {"version":3,"file":"outputCssLoader.js","names":["getCacheInstance","outputCssLoader","async","cacheProvider","cacheProviderId","getOptions","cacheInstance","result","get","resourcePath","dependencies","getDependencies","forEach","dependency","addDependency","callback","err"],"sources":["../src/outputCssLoader.ts"],"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"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,SAAS;AAE1C,eAAe,eAAeC,eAAeA,CAAA,EAK3C;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAM;IAAEC,aAAa;IAAEC;EAAgB,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;EAE5D,IAAI;IACF,MAAMC,aAAa,GAAG,MAAMN,gBAAgB,CAC1CG,aAAa,EACbC,eACF,CAAC;IAED,MAAMG,MAAM,GAAG,MAAMD,aAAa,CAACE,GAAG,CAAC,IAAI,CAACC,YAAY,CAAC;IACzD,MAAMC,YAAY,GAChB,CAAC,MAAMJ,aAAa,CAACK,eAAe,GAAG,IAAI,CAACF,YAAY,CAAC,KAAK,EAAE;IAElEC,YAAY,CAACE,OAAO,CAAEC,UAAU,IAAK;MACnC,IAAI,CAACC,aAAa,CAACD,UAAU,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,CAACE,QAAQ,CAAC,IAAI,EAAER,MAAM,CAAC;EAC7B,CAAC,CAAC,OAAOS,GAAG,EAAE;IACZ,IAAI,CAACD,QAAQ,CAACC,GAAY,CAAC;EAC7B;AACF","ignoreList":[]}
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": "1.0.8",
3
+ "version": "2.0.0-alpha.0",
4
+ "type": "module",
4
5
  "dependencies": {
5
- "@wyw-in-js/shared": "1.0.5",
6
- "@wyw-in-js/transform": "1.0.8"
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": "^16.18.55",
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": ">=20.0.0"
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": "lib/index.js",
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": "babel src --out-dir esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WYWinJSDebugPlugin = exports.sharedState = void 0;
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 } = (0, transform_1.createFileReporter)(options ?? false);
10
- exports.sharedState.emitter = emitter;
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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
- exports.memoryCache = new MemoryCache();
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 exports.memoryCache;
51
+ return memoryCache;
54
52
  }
55
53
  if (typeof cacheProvider === 'string') {
56
- return require(cacheProvider);
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
- var __importDefault = (this && this.__importDefault) || function (mod) {
8
- return (mod && mod.__esModule) ? mod : { "default": mod };
9
- };
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.WYWinJSDebugPlugin = void 0;
12
- const path_1 = __importDefault(require("path"));
13
- const crypto_1 = __importDefault(require("crypto"));
14
- const shared_1 = require("@wyw-in-js/shared");
15
- const transform_1 = require("@wyw-in-js/transform");
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) => crypto_1.default.createHash('sha256').update(text).digest('hex').slice(0, 12);
32
- const cache = new transform_1.TransformCacheCollection();
33
- const resolvers = {};
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 getActiveResolvers = (key) => {
39
- const entries = resolvers[key];
40
- return entries?.length ? entries : [];
41
- };
42
- const createAsyncResolve = (resourcePath) => {
43
- const currentResolverKey = stripQueryAndHash(resourcePath);
44
- return (what, importer, stack = [importer]) => {
45
- const rootResolverKey = getResolverKey(importer, stack);
46
- const rootResolvers = getActiveResolvers(rootResolverKey);
47
- const resolver = rootResolvers.length > 0
48
- ? rootResolvers
49
- : getActiveResolvers(currentResolverKey);
50
- if (resolver.length === 0) {
51
- throw new Error('No resolver found');
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
- return firstResult;
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
- function addResolver(resourcePath, resolver) {
65
- if (!resolvers[resourcePath]) {
66
- resolvers[resourcePath] = [];
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
- resolvers[resourcePath].push(resolver);
69
- return () => {
70
- resolvers[resourcePath] = resolvers[resourcePath].filter((r) => r !== resolver);
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 removeResolver = addResolver(this.resourcePath, (what, importer) => {
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 = path_1.default.isAbsolute(importerPath)
121
- ? path_1.default.dirname(importerPath)
122
- : path_1.default.join(process.cwd(), path_1.default.dirname(importerPath));
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 (path_1.default.isAbsolute(filePath)) {
176
+ if (path.isAbsolute(filePath)) {
126
177
  this.addDependency(filePath);
127
178
  }
128
179
  return result;
129
180
  });
130
181
  });
131
- const asyncResolve = createAsyncResolve(this.resourcePath);
132
- (0, shared_1.logger)('loader %s', this.resourcePath);
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
- cache,
146
- emitWarning: (message) => this.emitWarning(new Error(message)),
147
- eventEmitter: WYWinJSDebugPlugin_1.sharedState.emitter,
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
- (0, transform_1.transform)(transformServices, content.toString(), asyncResolve)
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 (0, cache_1.getCacheInstance)(cacheProvider);
217
+ const cacheInstance = await getCacheInstance(cacheProvider);
159
218
  const cacheProviderId = cacheProvider && typeof cacheProvider === 'object'
160
- ? (0, cache_1.registerCacheProvider)(cacheInstance)
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(removeResolver);
247
+ .finally(() => {
248
+ if (!compiler) {
249
+ compilerState.dispose();
250
+ }
251
+ });
189
252
  };
190
- exports.default = webpack5Loader;
253
+ export default webpack5Loader;
@@ -1,12 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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 (0, cache_1.getCacheInstance)(cacheProvider, cacheProviderId);
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