@wyw-in-js/esbuild 0.6.0 → 0.7.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.mjs CHANGED
@@ -5,13 +5,14 @@
5
5
  */
6
6
 
7
7
  import { readFileSync } from 'fs';
8
- import { basename, dirname, isAbsolute, join, parse, posix } from 'path';
8
+ import { dirname, isAbsolute, join, parse, posix } from 'path';
9
9
  import { transformSync } from 'esbuild';
10
10
  import { slugify, transform, TransformCacheCollection, createFileReporter } from '@wyw-in-js/transform';
11
11
  const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
12
12
  export default function wywInJS({
13
13
  debug,
14
14
  sourceMap,
15
+ prefixer,
15
16
  preprocessor,
16
17
  esbuildOptions,
17
18
  filter = /\.(js|jsx|ts|tsx)$/,
@@ -23,6 +24,7 @@ export default function wywInJS({
23
24
  name: 'wyw-in-js',
24
25
  setup(build) {
25
26
  const cssLookup = new Map();
27
+ const cssResolveDirs = new Map();
26
28
  const {
27
29
  emitter,
28
30
  onDone
@@ -56,7 +58,7 @@ export default function wywInJS({
56
58
  return {
57
59
  contents: cssLookup.get(args.path),
58
60
  loader: 'css',
59
- resolveDir: basename(args.path)
61
+ resolveDir: cssResolveDirs.get(args.path)
60
62
  };
61
63
  });
62
64
  const filterRegexp = typeof filter === 'string' ? new RegExp(filter) : filter;
@@ -100,19 +102,21 @@ export default function wywInJS({
100
102
  const transformServices = {
101
103
  options: {
102
104
  filename: args.path,
103
- root: process.cwd(),
105
+ pluginOptions: rest,
106
+ prefixer,
104
107
  preprocessor,
105
- pluginOptions: rest
108
+ root: process.cwd()
106
109
  },
107
110
  cache,
108
111
  eventEmitter: emitter
109
112
  };
110
113
  const result = await transform(transformServices, code, asyncResolve);
114
+ const resolveDir = dirname(args.path);
111
115
  if (!result.cssText) {
112
116
  return {
113
117
  contents: code,
114
118
  loader,
115
- resolveDir: dirname(args.path)
119
+ resolveDir
116
120
  };
117
121
  }
118
122
  let {
@@ -128,10 +132,11 @@ export default function wywInJS({
128
132
  contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
129
133
  }
130
134
  cssLookup.set(cssFilename, cssText);
135
+ cssResolveDirs.set(cssFilename, resolveDir);
131
136
  return {
132
137
  contents,
133
138
  loader,
134
- resolveDir: dirname(args.path)
139
+ resolveDir
135
140
  };
136
141
  });
137
142
  }
package/esm/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["readFileSync","basename","dirname","isAbsolute","join","parse","posix","transformSync","slugify","transform","TransformCacheCollection","createFileReporter","nodeModulesRegex","wywInJS","debug","sourceMap","preprocessor","esbuildOptions","filter","rest","options","cache","name","setup","build","cssLookup","Map","emitter","onDone","asyncResolve","token","importer","context","process","cwd","result","resolve","resolveDir","kind","errors","length","Error","path","replace","sep","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","filterRegexp","RegExp","rawCode","ext","filename","test","initialOptions","jsxFactory","jsxFragment","transformed","sourcefile","sourcemap","code","esbuildMap","Buffer","from","map","toString","transformServices","root","pluginOptions","eventEmitter","cssText","slug","cssFilename","JSON","stringify","cssSourceMapText","wywMap","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild 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 { readFileSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n} from '@wyw-in-js/transform';\n\ntype EsbuildPluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n debug,\n sourceMap,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const asyncResolve = async (\n token: string,\n importer: string\n ): Promise<string> => {\n const context = isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer));\n\n const result = await build.resolve(token, {\n resolveDir: context,\n kind: 'import-statement',\n });\n\n if (result.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return result.path.replace(/\\\\/g, posix.sep);\n };\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: basename(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string' ? new RegExp(filter) : filter;\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n const transformed = transformSync(rawCode, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n root: process.cwd(),\n preprocessor,\n pluginOptions: rest,\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n\n if (!result.cssText) {\n return {\n contents: code,\n loader,\n resolveDir: dirname(args.path),\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n\n return {\n contents,\n loader,\n resolveDir: dirname(args.path),\n };\n });\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["readFileSync","dirname","isAbsolute","join","parse","posix","transformSync","slugify","transform","TransformCacheCollection","createFileReporter","nodeModulesRegex","wywInJS","debug","sourceMap","prefixer","preprocessor","esbuildOptions","filter","rest","options","cache","name","setup","build","cssLookup","Map","cssResolveDirs","emitter","onDone","asyncResolve","token","importer","context","process","cwd","result","resolve","resolveDir","kind","errors","length","Error","path","replace","sep","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","filterRegexp","RegExp","rawCode","ext","filename","test","initialOptions","jsxFactory","jsxFragment","transformed","sourcefile","sourcemap","code","esbuildMap","Buffer","from","map","toString","transformServices","pluginOptions","root","eventEmitter","cssText","slug","cssFilename","JSON","stringify","cssSourceMapText","wywMap","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild 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 { readFileSync } from 'fs';\nimport { dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n} from '@wyw-in-js/transform';\n\ntype EsbuildPluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n debug,\n sourceMap,\n prefixer,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n const cssResolveDirs = new Map<string, string>();\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const asyncResolve = async (\n token: string,\n importer: string\n ): Promise<string> => {\n const context = isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer));\n\n const result = await build.resolve(token, {\n resolveDir: context,\n kind: 'import-statement',\n });\n\n if (result.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return result.path.replace(/\\\\/g, posix.sep);\n };\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: cssResolveDirs.get(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string' ? new RegExp(filter) : filter;\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n const transformed = transformSync(rawCode, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n pluginOptions: rest,\n prefixer,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n const resolveDir = dirname(args.path);\n\n if (!result.cssText) {\n return {\n contents: code,\n loader,\n resolveDir,\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n cssResolveDirs.set(cssFilename, resolveDir);\n\n return {\n contents,\n loader,\n resolveDir,\n };\n });\n },\n };\n}\n"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -18,6 +18,7 @@ const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
18
18
  function wywInJS({
19
19
  debug,
20
20
  sourceMap,
21
+ prefixer,
21
22
  preprocessor,
22
23
  esbuildOptions,
23
24
  filter = /\.(js|jsx|ts|tsx)$/,
@@ -29,6 +30,7 @@ function wywInJS({
29
30
  name: 'wyw-in-js',
30
31
  setup(build) {
31
32
  const cssLookup = new Map();
33
+ const cssResolveDirs = new Map();
32
34
  const {
33
35
  emitter,
34
36
  onDone
@@ -62,7 +64,7 @@ function wywInJS({
62
64
  return {
63
65
  contents: cssLookup.get(args.path),
64
66
  loader: 'css',
65
- resolveDir: (0, _path.basename)(args.path)
67
+ resolveDir: cssResolveDirs.get(args.path)
66
68
  };
67
69
  });
68
70
  const filterRegexp = typeof filter === 'string' ? new RegExp(filter) : filter;
@@ -106,19 +108,21 @@ function wywInJS({
106
108
  const transformServices = {
107
109
  options: {
108
110
  filename: args.path,
109
- root: process.cwd(),
111
+ pluginOptions: rest,
112
+ prefixer,
110
113
  preprocessor,
111
- pluginOptions: rest
114
+ root: process.cwd()
112
115
  },
113
116
  cache,
114
117
  eventEmitter: emitter
115
118
  };
116
119
  const result = await (0, _transform.transform)(transformServices, code, asyncResolve);
120
+ const resolveDir = (0, _path.dirname)(args.path);
117
121
  if (!result.cssText) {
118
122
  return {
119
123
  contents: code,
120
124
  loader,
121
- resolveDir: (0, _path.dirname)(args.path)
125
+ resolveDir
122
126
  };
123
127
  }
124
128
  let {
@@ -134,10 +138,11 @@ function wywInJS({
134
138
  contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
135
139
  }
136
140
  cssLookup.set(cssFilename, cssText);
141
+ cssResolveDirs.set(cssFilename, resolveDir);
137
142
  return {
138
143
  contents,
139
144
  loader,
140
- resolveDir: (0, _path.dirname)(args.path)
145
+ resolveDir
141
146
  };
142
147
  });
143
148
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_fs","require","_path","_esbuild","_transform","nodeModulesRegex","wywInJS","debug","sourceMap","preprocessor","esbuildOptions","filter","rest","options","cache","TransformCacheCollection","name","setup","build","cssLookup","Map","emitter","onDone","createFileReporter","asyncResolve","token","importer","context","isAbsolute","dirname","join","process","cwd","result","resolve","resolveDir","kind","errors","length","Error","path","replace","posix","sep","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","basename","filterRegexp","RegExp","rawCode","readFileSync","ext","filename","parse","test","initialOptions","jsxFactory","jsxFragment","transformed","transformSync","sourcefile","sourcemap","code","esbuildMap","Buffer","from","map","toString","transformServices","root","pluginOptions","eventEmitter","transform","cssText","slug","slugify","cssFilename","JSON","stringify","cssSourceMapText","wywMap","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild 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 { readFileSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n} from '@wyw-in-js/transform';\n\ntype EsbuildPluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n debug,\n sourceMap,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const asyncResolve = async (\n token: string,\n importer: string\n ): Promise<string> => {\n const context = isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer));\n\n const result = await build.resolve(token, {\n resolveDir: context,\n kind: 'import-statement',\n });\n\n if (result.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return result.path.replace(/\\\\/g, posix.sep);\n };\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: basename(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string' ? new RegExp(filter) : filter;\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n const transformed = transformSync(rawCode, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n root: process.cwd(),\n preprocessor,\n pluginOptions: rest,\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n\n if (!result.cssText) {\n return {\n contents: code,\n loader,\n resolveDir: dirname(args.path),\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n\n return {\n contents,\n loader,\n resolveDir: dirname(args.path),\n };\n });\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_fs","require","_path","_esbuild","_transform","nodeModulesRegex","wywInJS","debug","sourceMap","prefixer","preprocessor","esbuildOptions","filter","rest","options","cache","TransformCacheCollection","name","setup","build","cssLookup","Map","cssResolveDirs","emitter","onDone","createFileReporter","asyncResolve","token","importer","context","isAbsolute","dirname","join","process","cwd","result","resolve","resolveDir","kind","errors","length","Error","path","replace","posix","sep","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","filterRegexp","RegExp","rawCode","readFileSync","ext","filename","parse","test","initialOptions","jsxFactory","jsxFragment","transformed","transformSync","sourcefile","sourcemap","code","esbuildMap","Buffer","from","map","toString","transformServices","pluginOptions","root","eventEmitter","transform","cssText","slug","slugify","cssFilename","JSON","stringify","cssSourceMapText","wywMap","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild 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 { readFileSync } from 'fs';\nimport { dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n} from '@wyw-in-js/transform';\n\ntype EsbuildPluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n debug,\n sourceMap,\n prefixer,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n const cssResolveDirs = new Map<string, string>();\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const asyncResolve = async (\n token: string,\n importer: string\n ): Promise<string> => {\n const context = isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer));\n\n const result = await build.resolve(token, {\n resolveDir: context,\n kind: 'import-statement',\n });\n\n if (result.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return result.path.replace(/\\\\/g, posix.sep);\n };\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: cssResolveDirs.get(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string' ? new RegExp(filter) : filter;\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n const transformed = transformSync(rawCode, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n pluginOptions: rest,\n prefixer,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n const resolveDir = dirname(args.path);\n\n if (!result.cssText) {\n return {\n contents: code,\n loader,\n resolveDir,\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n cssResolveDirs.set(cssFilename, resolveDir);\n\n return {\n contents,\n loader,\n resolveDir,\n };\n });\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@wyw-in-js/esbuild",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "dependencies": {
5
- "@wyw-in-js/shared": "0.6.0",
6
- "@wyw-in-js/transform": "0.6.0"
5
+ "@wyw-in-js/shared": "0.7.0",
6
+ "@wyw-in-js/transform": "0.7.0"
7
7
  },
8
8
  "devDependencies": {
9
9
  "@types/node": "^16.18.55",
10
10
  "esbuild": "^0.15.16",
11
- "@wyw-in-js/babel-config": "0.6.0",
12
- "@wyw-in-js/eslint-config": "0.6.0",
13
- "@wyw-in-js/jest-preset": "0.6.0",
14
- "@wyw-in-js/ts-config": "0.6.0"
11
+ "@wyw-in-js/babel-config": "0.7.0",
12
+ "@wyw-in-js/eslint-config": "0.7.0",
13
+ "@wyw-in-js/jest-preset": "0.7.0",
14
+ "@wyw-in-js/ts-config": "0.7.0"
15
15
  },
16
16
  "engines": {
17
17
  "node": ">=16.0.0"
package/types/index.d.ts CHANGED
@@ -9,8 +9,9 @@ type EsbuildPluginOptions = {
9
9
  debug?: IFileReporterOptions | false | null | undefined;
10
10
  esbuildOptions?: TransformOptions;
11
11
  filter?: RegExp | string;
12
+ prefixer?: boolean;
12
13
  preprocessor?: Preprocessor;
13
14
  sourceMap?: boolean;
14
15
  } & Partial<PluginOptions>;
15
- export default function wywInJS({ debug, sourceMap, preprocessor, esbuildOptions, filter, ...rest }?: EsbuildPluginOptions): Plugin;
16
+ export default function wywInJS({ debug, sourceMap, prefixer, preprocessor, esbuildOptions, filter, ...rest }?: EsbuildPluginOptions): Plugin;
16
17
  export {};
package/types/index.js CHANGED
@@ -10,13 +10,14 @@ const path_1 = require("path");
10
10
  const esbuild_1 = require("esbuild");
11
11
  const transform_1 = require("@wyw-in-js/transform");
12
12
  const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
13
- function wywInJS({ debug, sourceMap, preprocessor, esbuildOptions, filter = /\.(js|jsx|ts|tsx)$/, ...rest } = {}) {
13
+ function wywInJS({ debug, sourceMap, prefixer, preprocessor, esbuildOptions, filter = /\.(js|jsx|ts|tsx)$/, ...rest } = {}) {
14
14
  let options = esbuildOptions;
15
15
  const cache = new transform_1.TransformCacheCollection();
16
16
  return {
17
17
  name: 'wyw-in-js',
18
18
  setup(build) {
19
19
  const cssLookup = new Map();
20
+ const cssResolveDirs = new Map();
20
21
  const { emitter, onDone } = (0, transform_1.createFileReporter)(debug ?? false);
21
22
  const asyncResolve = async (token, importer) => {
22
23
  const context = (0, path_1.isAbsolute)(importer)
@@ -44,7 +45,7 @@ function wywInJS({ debug, sourceMap, preprocessor, esbuildOptions, filter = /\.(
44
45
  return {
45
46
  contents: cssLookup.get(args.path),
46
47
  loader: 'css',
47
- resolveDir: (0, path_1.basename)(args.path),
48
+ resolveDir: cssResolveDirs.get(args.path),
48
49
  };
49
50
  });
50
51
  const filterRegexp = typeof filter === 'string' ? new RegExp(filter) : filter;
@@ -81,19 +82,21 @@ function wywInJS({ debug, sourceMap, preprocessor, esbuildOptions, filter = /\.(
81
82
  const transformServices = {
82
83
  options: {
83
84
  filename: args.path,
84
- root: process.cwd(),
85
- preprocessor,
86
85
  pluginOptions: rest,
86
+ prefixer,
87
+ preprocessor,
88
+ root: process.cwd(),
87
89
  },
88
90
  cache,
89
91
  eventEmitter: emitter,
90
92
  };
91
93
  const result = await (0, transform_1.transform)(transformServices, code, asyncResolve);
94
+ const resolveDir = (0, path_1.dirname)(args.path);
92
95
  if (!result.cssText) {
93
96
  return {
94
97
  contents: code,
95
98
  loader,
96
- resolveDir: (0, path_1.dirname)(args.path),
99
+ resolveDir,
97
100
  };
98
101
  }
99
102
  let { cssText } = result;
@@ -107,10 +110,11 @@ function wywInJS({ debug, sourceMap, preprocessor, esbuildOptions, filter = /\.(
107
110
  contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
108
111
  }
109
112
  cssLookup.set(cssFilename, cssText);
113
+ cssResolveDirs.set(cssFilename, resolveDir);
110
114
  return {
111
115
  contents,
112
116
  loader,
113
- resolveDir: (0, path_1.dirname)(args.path),
117
+ resolveDir,
114
118
  };
115
119
  });
116
120
  },