@wyw-in-js/transform 0.3.0 → 0.4.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.
Files changed (42) hide show
  1. package/esm/index.js +1 -2
  2. package/esm/index.js.map +1 -1
  3. package/esm/plugins/collector.js +5 -11
  4. package/esm/plugins/collector.js.map +1 -1
  5. package/esm/plugins/preeval.js +11 -17
  6. package/esm/plugins/preeval.js.map +1 -1
  7. package/esm/transform/Entrypoint.js +2 -1
  8. package/esm/transform/Entrypoint.js.map +1 -1
  9. package/esm/transform/generators/createStylisPreprocessor.js +171 -51
  10. package/esm/transform/generators/createStylisPreprocessor.js.map +1 -1
  11. package/esm/utils/getTagProcessor.js +113 -51
  12. package/esm/utils/getTagProcessor.js.map +1 -1
  13. package/lib/index.js +7 -15
  14. package/lib/index.js.map +1 -1
  15. package/lib/plugins/collector.js +6 -12
  16. package/lib/plugins/collector.js.map +1 -1
  17. package/lib/plugins/preeval.js +12 -17
  18. package/lib/plugins/preeval.js.map +1 -1
  19. package/lib/transform/Entrypoint.js +2 -1
  20. package/lib/transform/Entrypoint.js.map +1 -1
  21. package/lib/transform/generators/createStylisPreprocessor.js +176 -51
  22. package/lib/transform/generators/createStylisPreprocessor.js.map +1 -1
  23. package/lib/utils/getTagProcessor.js +122 -53
  24. package/lib/utils/getTagProcessor.js.map +1 -1
  25. package/package.json +7 -7
  26. package/types/index.d.ts +1 -2
  27. package/types/index.js +2 -4
  28. package/types/plugins/collector.d.ts +5 -1
  29. package/types/plugins/collector.js +5 -10
  30. package/types/plugins/preeval.d.ts +3 -3
  31. package/types/plugins/preeval.js +11 -14
  32. package/types/transform/Entrypoint.js +4 -1
  33. package/types/transform/generators/createStylisPreprocessor.d.ts +4 -1
  34. package/types/transform/generators/createStylisPreprocessor.js +187 -59
  35. package/types/utils/getTagProcessor.d.ts +10 -3
  36. package/types/utils/getTagProcessor.js +108 -53
  37. package/esm/utils/processTemplateExpression.js +0 -11
  38. package/esm/utils/processTemplateExpression.js.map +0 -1
  39. package/lib/utils/processTemplateExpression.js +0 -18
  40. package/lib/utils/processTemplateExpression.js.map +0 -1
  41. package/types/utils/processTemplateExpression.d.ts +0 -5
  42. package/types/utils/processTemplateExpression.js +0 -17
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getTagProcessor = getTagProcessor;
6
+ exports.applyProcessors = applyProcessors;
7
+ exports.getDefinedProcessors = getDefinedProcessors;
8
+ exports.getProcessorForImport = getProcessorForImport;
7
9
  var _fs = require("fs");
8
10
  var _path = require("path");
9
11
  var _core = require("@babel/core");
@@ -76,53 +78,28 @@ function getProcessorFromFile(processorPath) {
76
78
  }
77
79
  return Processor;
78
80
  }
79
- function getProcessorForIdentifier(path, imports, filename, options) {
80
- var _options$tagResolver, _relatedImports$map$f;
81
- const pathBinding = path.scope.getBinding(path.node.name);
82
- if (!pathBinding) {
83
- // It's not a binding, so it's not a tag
84
- return [null, null, null];
85
- }
81
+ function getProcessorForImport({
82
+ imported,
83
+ source
84
+ }, filename, options) {
85
+ var _options$tagResolver;
86
86
  const tagResolver = (_options$tagResolver = options.tagResolver) !== null && _options$tagResolver !== void 0 ? _options$tagResolver : () => null;
87
-
88
- // FIXME: can be simplified
89
- const relatedImports = imports.map(i => {
90
- const {
91
- local
92
- } = i;
93
- if (local === path) {
94
- return [i, null];
95
- }
96
- if (!local.isIdentifier()) {
97
- if (path.isDescendant(local)) {
98
- return [i, local];
99
- }
100
- return null;
101
- }
102
- const binding = local.scope.getBinding(local.node.name);
103
- if (pathBinding === binding) {
104
- return [i, path];
105
- }
106
- return null;
107
- }).filter(_isNotNull.isNotNull).filter(i => i[1] === null || i[1].isExpression());
108
- if (relatedImports.length === 0) {
109
- return [null, null, null];
110
- }
111
- const [Processor = null, tagSource = null, tagPath = null] = (_relatedImports$map$f = relatedImports.map(([{
87
+ const customFile = tagResolver(source, imported);
88
+ const processor = customFile ? getProcessorFromFile(customFile) : getProcessorFromPackage(source, imported, filename);
89
+ return [processor, {
112
90
  imported,
113
91
  source
114
- }, p]) => {
115
- const customFile = tagResolver(source, imported);
116
- const processor = customFile ? getProcessorFromFile(customFile) : getProcessorFromPackage(source, imported, filename);
117
- return [processor, {
118
- imported,
119
- source
120
- }, p];
121
- }).find(([proc]) => proc)) !== null && _relatedImports$map$f !== void 0 ? _relatedImports$map$f : [];
122
- return Processor === null || tagSource === null || tagPath === null ? [null, null, null] : [Processor, tagSource, tagPath];
92
+ }];
123
93
  }
124
- function getBuilderForIdentifier(path, imports, filename, options) {
125
- const [Processor, tagSource, tagPath] = getProcessorForIdentifier(path, imports, filename, options);
94
+ function getBuilderForIdentifier(definedProcessor, path, imports, options) {
95
+ var _tagPath$parentPath;
96
+ const [Processor, tagSource] = definedProcessor;
97
+ let tagPath = path;
98
+ if ((_tagPath$parentPath = tagPath.parentPath) !== null && _tagPath$parentPath !== void 0 && _tagPath$parentPath.isMemberExpression({
99
+ property: tagPath.node
100
+ })) {
101
+ tagPath = tagPath.parentPath;
102
+ }
126
103
  if (!Processor || !tagSource || !tagPath) {
127
104
  return null;
128
105
  }
@@ -196,8 +173,7 @@ function getBuilderForIdentifier(path, imports, filename, options) {
196
173
  }
197
174
  });
198
175
  };
199
- const astService = {
200
- ..._core.types,
176
+ const importHelpers = {
201
177
  addDefaultImport: (importedSource, nameHint) => (0, _helperModuleImports.addDefault)(path, importedSource, {
202
178
  nameHint
203
179
  }),
@@ -205,6 +181,14 @@ function getBuilderForIdentifier(path, imports, filename, options) {
205
181
  nameHint
206
182
  })
207
183
  };
184
+ const astService = new Proxy(_core.types, {
185
+ get(target, prop, receiver) {
186
+ if (prop in importHelpers) {
187
+ return importHelpers[prop];
188
+ }
189
+ return Reflect.get(target, prop, receiver);
190
+ }
191
+ });
208
192
  return (...args) => {
209
193
  var _tagPath$node$loc;
210
194
  return new Processor(params, tagSource, astService, (_tagPath$node$loc = tagPath.node.loc) !== null && _tagPath$node$loc !== void 0 ? _tagPath$node$loc : null, replacer, ...args);
@@ -281,16 +265,44 @@ const getNextIndex = state => {
281
265
  counters.set(state, counter + 1);
282
266
  return counter;
283
267
  };
284
- function getTagProcessor(path, fileContext, options) {
268
+ function getDefinedProcessors(imports, path, filename, options) {
269
+ const cache = (0, _traversalCache.getTraversalCache)(path, 'getDefinedProcessors');
270
+ if (!cache.has(path)) {
271
+ const defined = new Map();
272
+ imports.forEach(i => {
273
+ const [processor, tagSource] = getProcessorForImport(i, filename, options);
274
+ const {
275
+ local
276
+ } = i;
277
+ if (!processor) {
278
+ return;
279
+ }
280
+ let name = null;
281
+ if (local.isIdentifier()) {
282
+ name = local.node.name;
283
+ }
284
+ if (name === null && local.isMemberExpression()) {
285
+ const property = local.get('property');
286
+ const object = local.get('object');
287
+ if (property.isIdentifier() && object.isIdentifier()) {
288
+ name = `${object.node.name}.${property.node.name}`;
289
+ }
290
+ }
291
+ if (name === null) {
292
+ return;
293
+ }
294
+ defined.set(name, [processor, tagSource]);
295
+ });
296
+ cache.set(path, defined);
297
+ }
298
+ return cache.get(path);
299
+ }
300
+ function createProcessorInstance(definedProcessor, imports, path, fileContext, options) {
285
301
  var _cache$get;
286
- const cache = (0, _traversalCache.getTraversalCache)(path, 'getTagProcessor');
302
+ const cache = (0, _traversalCache.getTraversalCache)(path, 'createProcessorInstance');
287
303
  if (!cache.has(path.node)) {
288
- const root = path.scope.getProgramParent().path;
289
- const {
290
- imports
291
- } = (0, _collectExportsAndImports.collectExportsAndImports)(root);
292
304
  try {
293
- const builder = getBuilderForIdentifier(path, imports.filter(_collectExportsAndImports.explicitImport), fileContext.filename, options);
305
+ const builder = getBuilderForIdentifier(definedProcessor, path, imports, options);
294
306
  if (builder) {
295
307
  // Increment the index of the style we're processing
296
308
  // This is used for slug generation to prevent collision
@@ -315,4 +327,61 @@ function getTagProcessor(path, fileContext, options) {
315
327
  }
316
328
  return (_cache$get = cache.get(path.node)) !== null && _cache$get !== void 0 ? _cache$get : null;
317
329
  }
330
+ function applyProcessors(path, fileContext, options, callback) {
331
+ const imports = (0, _collectExportsAndImports.collectExportsAndImports)(path).imports.filter(_collectExportsAndImports.explicitImport);
332
+ const definedProcessors = getDefinedProcessors(imports, path, fileContext.filename, options);
333
+ const usages = [];
334
+ definedProcessors.forEach((processor, idName) => {
335
+ var _path$scope$getBindin;
336
+ if (idName.includes('.')) {
337
+ // It's a member expression
338
+ const [object, property] = idName.split('.');
339
+ const objBinding = path.scope.getBinding(object);
340
+ if (!objBinding) {
341
+ return;
342
+ }
343
+ objBinding.referencePaths.forEach(p => {
344
+ const parent = p.parentPath;
345
+ if (!(parent !== null && parent !== void 0 && parent.isMemberExpression())) {
346
+ return;
347
+ }
348
+ const identifier = parent.get('property');
349
+ if (identifier.isIdentifier({
350
+ name: property
351
+ })) {
352
+ usages.push({
353
+ identifier,
354
+ processor
355
+ });
356
+ }
357
+ });
358
+ return;
359
+ }
360
+ (_path$scope$getBindin = path.scope.getBinding(idName)) === null || _path$scope$getBindin === void 0 || _path$scope$getBindin.referencePaths.forEach(identifier => {
361
+ if (identifier.isIdentifier()) {
362
+ usages.push({
363
+ identifier,
364
+ processor
365
+ });
366
+ }
367
+ });
368
+ });
369
+
370
+ // The same order, the same slugs
371
+ usages.sort((a, b) => {
372
+ var _a$identifier$node$st, _b$identifier$node$st;
373
+ return ((_a$identifier$node$st = a.identifier.node.start) !== null && _a$identifier$node$st !== void 0 ? _a$identifier$node$st : 0) - ((_b$identifier$node$st = b.identifier.node.start) !== null && _b$identifier$node$st !== void 0 ? _b$identifier$node$st : 0);
374
+ });
375
+ usages.forEach(usage => {
376
+ const definedProcessor = usage.processor;
377
+ if (!definedProcessor) {
378
+ return;
379
+ }
380
+ const instance = createProcessorInstance(definedProcessor, imports, usage.identifier, fileContext, options);
381
+ if (instance === null) {
382
+ return;
383
+ }
384
+ callback(instance);
385
+ });
386
+ }
318
387
  //# sourceMappingURL=getTagProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getTagProcessor.js","names":["_fs","require","_path","_core","_helperModuleImports","_processorUtils","_shared","_collectExportsAndImports","_collectTemplateDependencies","_getSource","_isNotNull","_scopeHelpers","_traversalCache","last","arr","length","zip","arr1","arr2","result","i","push","buildCodeFrameError","path","message","Error","definedTagsCache","Map","getDefinedTagsFromPackage","pkgName","filename","_packageJSON$wywInJ","has","get","packageJSONPath","findPackageJSON","undefined","packageDir","dirname","packageJSON","JSON","parse","readFileSync","definedTags","tags","normalizedTags","Object","entries","reduce","acc","key","value","startsWith","join","resolve","paths","set","isValidProcessorClass","module","BaseProcessor","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForIdentifier","imports","options","_options$tagResolver","_relatedImports$map$f","pathBinding","scope","getBinding","node","name","tagResolver","relatedImports","map","local","isIdentifier","isDescendant","binding","filter","isNotNull","isExpression","tagSource","tagPath","imported","source","p","customFile","processor","find","proc","getBuilderForIdentifier","params","prev","current","parentPath","_current","_current2","_current3","_current4","isSequenceExpression","expressions","isCallExpression","callee","args","cookedArgs","arg","buildError","bind","type","getSource","extracted","extractExpression","evaluate","isMemberExpression","object","property","computed","isStringLiteral","isTaggedTemplateExpression","tag","quasis","expressionValues","collectTemplateDependencies","replacer","replacement","isPure","mutate","replaceWith","addComment","astService","t","addDefaultImport","importedSource","nameHint","addDefault","addNamedImport","addNamed","_tagPath$node$loc","loc","getDisplayName","idx","displayName","parent","findParent","isObjectProperty","isJSXOpeningElement","isVariableDeclarator","toString","keyPath","isJSXIdentifier","id","basename","test","replace","isTagReferenced","isReferenced","referencePaths","counters","WeakMap","getNextIndex","state","_counters$get","counter","getTagProcessor","fileContext","_cache$get","cache","getTraversalCache","root","getProgramParent","collectExportsAndImports","builder","explicitImport","e","SKIP"],"sources":["../../src/utils/getTagProcessor.ts"],"sourcesContent":["import { readFileSync } from 'fs';\nimport { basename, dirname, join } from 'path';\n\nimport { types as t } from '@babel/core';\nimport { addDefault, addNamed } from '@babel/helper-module-imports';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n SourceLocation,\n Identifier,\n MemberExpression,\n Program,\n} from '@babel/types';\n\nimport { BaseProcessor } from '@wyw-in-js/processor-utils';\nimport type {\n Param,\n Params,\n IFileContext,\n TagSource,\n} from '@wyw-in-js/processor-utils';\nimport { findPackageJSON } from '@wyw-in-js/shared';\nimport type { ExpressionValue, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { IImport } from './collectExportsAndImports';\nimport {\n collectExportsAndImports,\n explicitImport,\n} from './collectExportsAndImports';\nimport {\n collectTemplateDependencies,\n extractExpression,\n} from './collectTemplateDependencies';\nimport { getSource } from './getSource';\nimport { isNotNull } from './isNotNull';\nimport { mutate } from './scopeHelpers';\nimport { getTraversalCache } from './traversalCache';\n\ntype BuilderArgs = ConstructorParameters<typeof BaseProcessor> extends [\n Params,\n TagSource,\n typeof t,\n SourceLocation | null,\n (replacement: Expression, isPure: boolean) => void,\n ...infer T,\n]\n ? T\n : never;\n\ntype Builder = (...args: BuilderArgs) => BaseProcessor;\n\ntype ProcessorClass = new (\n ...args: ConstructorParameters<typeof BaseProcessor>\n) => BaseProcessor;\n\nconst last = <T>(arr: T[]): T | undefined => arr[arr.length - 1];\n\nfunction zip<T1, T2>(arr1: T1[], arr2: T2[]) {\n const result: (T1 | T2)[] = [];\n for (let i = 0; i < arr1.length; i++) {\n result.push(arr1[i]);\n if (arr2[i]) result.push(arr2[i]);\n }\n\n return result;\n}\n\nfunction buildCodeFrameError(path: NodePath, message: string): Error {\n try {\n return path.buildCodeFrameError(message);\n } catch {\n return new Error(message);\n }\n}\n\nconst definedTagsCache = new Map<string, Record<string, string> | undefined>();\nconst getDefinedTagsFromPackage = (\n pkgName: string,\n filename: string | null | undefined\n): Record<string, string> | undefined => {\n if (definedTagsCache.has(pkgName)) {\n return definedTagsCache.get(pkgName);\n }\n\n const packageJSONPath = findPackageJSON(pkgName, filename);\n if (!packageJSONPath) {\n return undefined;\n }\n\n const packageDir = dirname(packageJSONPath);\n const packageJSON = JSON.parse(readFileSync(packageJSONPath, 'utf8'));\n const definedTags: Record<string, string> | undefined =\n packageJSON['wyw-in-js']?.tags;\n\n const normalizedTags = definedTags\n ? Object.entries(definedTags).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: value.startsWith('.')\n ? join(packageDir, value)\n : require.resolve(value, { paths: [packageDir] }),\n }),\n {} as Record<string, string>\n )\n : undefined;\n\n definedTagsCache.set(pkgName, normalizedTags);\n\n return normalizedTags;\n};\n\nfunction isValidProcessorClass(module: unknown): module is ProcessorClass {\n return module instanceof BaseProcessor.constructor;\n}\n\nfunction getProcessorFromPackage(\n packageName: string,\n tagName: string,\n filename: string | null | undefined\n): ProcessorClass | null {\n const definedTags = getDefinedTagsFromPackage(packageName, filename);\n const processorPath = definedTags?.[tagName];\n if (!processorPath) {\n return null;\n }\n\n const Processor = require(processorPath).default;\n if (!isValidProcessorClass(Processor)) {\n return null;\n }\n\n return Processor;\n}\n\nfunction getProcessorFromFile(processorPath: string): ProcessorClass | null {\n const Processor = require(processorPath).default;\n if (!isValidProcessorClass(Processor)) {\n return null;\n }\n\n return Processor;\n}\n\nfunction getProcessorForIdentifier(\n path: NodePath<Identifier>,\n imports: IImport[],\n filename: string | null | undefined,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'\n >\n):\n | [ProcessorClass, TagSource, NodePath<Identifier | MemberExpression>]\n | [null, null, null] {\n const pathBinding = path.scope.getBinding(path.node.name);\n if (!pathBinding) {\n // It's not a binding, so it's not a tag\n return [null, null, null];\n }\n\n const tagResolver = options.tagResolver ?? (() => null);\n\n // FIXME: can be simplified\n const relatedImports = imports\n .map(\n (i): [IImport, NodePath<Identifier | MemberExpression> | null] | null => {\n const { local } = i;\n\n if (local === path) {\n return [i, null];\n }\n\n if (!local.isIdentifier()) {\n if (path.isDescendant(local)) {\n return [i, local];\n }\n\n return null;\n }\n\n const binding = local.scope.getBinding(local.node.name);\n if (pathBinding === binding) {\n return [i, path];\n }\n\n return null;\n }\n )\n .filter(isNotNull)\n .filter((i) => i[1] === null || i[1].isExpression());\n\n if (relatedImports.length === 0) {\n return [null, null, null];\n }\n\n const [Processor = null, tagSource = null, tagPath = null] =\n relatedImports\n .map(\n ([{ imported, source }, p]): [\n ProcessorClass | null,\n TagSource,\n NodePath<Identifier | MemberExpression> | null,\n ] => {\n const customFile = tagResolver(source, imported);\n const processor = customFile\n ? getProcessorFromFile(customFile)\n : getProcessorFromPackage(source, imported, filename);\n return [processor, { imported, source }, p];\n }\n )\n .find(([proc]) => proc) ?? [];\n\n return Processor === null || tagSource === null || tagPath === null\n ? [null, null, null]\n : [Processor, tagSource, tagPath];\n}\n\nfunction getBuilderForIdentifier(\n path: NodePath<Identifier>,\n imports: IImport[],\n filename: string | null | undefined,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'\n >\n): Builder | null {\n const [Processor, tagSource, tagPath] = getProcessorForIdentifier(\n path,\n imports,\n filename,\n options\n );\n\n if (!Processor || !tagSource || !tagPath) {\n return null;\n }\n\n const params: Param[] = [['callee', tagPath.node]];\n let prev: NodePath = tagPath;\n let current: NodePath | null = tagPath.parentPath;\n while (current && current !== path) {\n if (\n current?.isSequenceExpression() &&\n last(current.node.expressions) === prev.node\n ) {\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isCallExpression({ callee: prev.node })) {\n const args = current.get('arguments');\n const cookedArgs = args\n .map((arg) => {\n const buildError = arg.buildCodeFrameError.bind(arg);\n if (!arg.isExpression()) {\n throw buildError(`Unexpected type of an argument ${arg.type}`);\n }\n const source = getSource(arg);\n const extracted = extractExpression(arg, options.evaluate, imports);\n return {\n ...extracted,\n source,\n buildCodeFrameError: buildError,\n } as ExpressionValue;\n })\n .filter(isNotNull);\n\n params.push(['call', ...cookedArgs]);\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isMemberExpression({ object: prev.node })) {\n const property = current.get('property');\n if (property.isIdentifier() && !current.node.computed) {\n params.push(['member', property.node.name]);\n } else if (property.isStringLiteral()) {\n params.push(['member', property.node.value]);\n } else {\n throw property.buildCodeFrameError(`Unexpected type of a property`);\n }\n\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isTaggedTemplateExpression({ tag: prev.node })) {\n const [quasis, expressionValues] = collectTemplateDependencies(\n current,\n options.evaluate\n );\n params.push(['template', zip(quasis, expressionValues)]);\n\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n break;\n }\n\n const replacer = (replacement: Expression, isPure: boolean) => {\n mutate(prev, (p) => {\n p.replaceWith(replacement);\n if (isPure) {\n p.addComment('leading', '#__PURE__');\n }\n });\n };\n\n const astService = {\n ...t,\n addDefaultImport: (importedSource: string, nameHint?: string) =>\n addDefault(path, importedSource, { nameHint }),\n addNamedImport: (\n name: string,\n importedSource: string,\n nameHint: string = name\n ) => addNamed(path, name, importedSource, { nameHint }),\n };\n\n return (...args: BuilderArgs) =>\n new Processor(\n params,\n tagSource,\n astService,\n tagPath.node.loc ?? null,\n replacer,\n ...args\n );\n}\n\nfunction getDisplayName(\n path: NodePath<Identifier>,\n idx: number,\n filename?: string | null\n): string {\n let displayName: string | undefined;\n\n const parent = path.findParent(\n (p) =>\n p.isObjectProperty() ||\n p.isJSXOpeningElement() ||\n p.isVariableDeclarator()\n );\n\n if (parent) {\n if (parent.isObjectProperty()) {\n if ('name' in parent.node.key) {\n displayName = parent.node.key.name;\n } else if ('value' in parent.node.key) {\n displayName = parent.node.key.value.toString();\n } else {\n const keyPath = parent.get('key');\n displayName = getSource(keyPath);\n }\n } else if (parent.isJSXOpeningElement()) {\n const name = parent.get('name');\n if (name.isJSXIdentifier()) {\n displayName = name.node.name;\n }\n } else if (parent.isVariableDeclarator()) {\n const id = parent.get('id');\n if (id.isIdentifier()) {\n displayName = id.node.name;\n }\n }\n }\n\n if (!displayName) {\n // Try to derive the path from the filename\n displayName = basename(filename ?? 'unknown');\n\n if (filename && /^index\\.[a-z\\d]+$/.test(displayName)) {\n // If the file name is 'index', better to get name from parent folder\n displayName = basename(dirname(filename));\n }\n\n // Remove the file extension\n displayName = displayName.replace(/\\.[a-z\\d]+$/, '');\n\n if (displayName) {\n displayName += idx;\n } else {\n throw new Error(\n \"Couldn't determine a name for the component. Ensure that it's either:\\n\" +\n '- Assigned to a variable\\n' +\n '- Is an object property\\n' +\n '- Is a prop in a JSX element\\n'\n );\n }\n }\n\n return displayName;\n}\n\nfunction isTagReferenced(path: NodePath): boolean {\n // Check if the variable is referenced anywhere for basic DCE\n // Only works when it's assigned to a variable\n let isReferenced = true;\n\n const parent = path.findParent(\n (p) =>\n p.isObjectProperty() ||\n p.isJSXOpeningElement() ||\n p.isVariableDeclarator()\n );\n\n if (parent) {\n if (parent.isVariableDeclarator()) {\n const id = parent.get('id');\n // FIXME: replace with id.isReferencedIdentifier()\n if (id.isIdentifier()) {\n const { referencePaths } = path.scope.getBinding(id.node.name) || {\n referencePaths: [],\n };\n\n isReferenced = referencePaths.length !== 0;\n }\n }\n }\n\n return isReferenced;\n}\n\nconst counters = new WeakMap<IFileContext, number>();\nconst getNextIndex = (state: IFileContext) => {\n const counter = counters.get(state) ?? 0;\n counters.set(state, counter + 1);\n return counter;\n};\n\nexport function getTagProcessor(\n path: NodePath<Identifier>,\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'\n >\n): BaseProcessor | null {\n const cache = getTraversalCache<BaseProcessor | null, Identifier>(\n path,\n 'getTagProcessor'\n );\n\n if (!cache.has(path.node)) {\n const root = path.scope.getProgramParent().path as NodePath<Program>;\n const { imports } = collectExportsAndImports(root);\n try {\n const builder = getBuilderForIdentifier(\n path,\n imports.filter(explicitImport),\n fileContext.filename,\n options\n );\n if (builder) {\n // Increment the index of the style we're processing\n // This is used for slug generation to prevent collision\n // Also used for display name if it couldn't be determined\n const idx = getNextIndex(fileContext);\n\n const displayName = getDisplayName(path, idx, fileContext.filename);\n\n const processor = builder(\n displayName,\n isTagReferenced(path),\n idx,\n options,\n fileContext\n );\n\n cache.set(path.node, processor);\n } else {\n cache.set(path.node, null);\n }\n } catch (e) {\n if (e === BaseProcessor.SKIP) {\n cache.set(path.node, null);\n return null;\n }\n\n if (e instanceof Error) {\n throw buildCodeFrameError(path, e.message);\n }\n\n throw e;\n }\n }\n\n return cache.get(path.node) ?? null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getTagProcessor.js","names":["_fs","require","_path","_core","_helperModuleImports","_processorUtils","_shared","_collectExportsAndImports","_collectTemplateDependencies","_getSource","_isNotNull","_scopeHelpers","_traversalCache","last","arr","length","zip","arr1","arr2","result","i","push","buildCodeFrameError","path","message","Error","definedTagsCache","Map","getDefinedTagsFromPackage","pkgName","filename","_packageJSON$wywInJ","has","get","packageJSONPath","findPackageJSON","undefined","packageDir","dirname","packageJSON","JSON","parse","readFileSync","definedTags","tags","normalizedTags","Object","entries","reduce","acc","key","value","startsWith","join","resolve","paths","set","isValidProcessorClass","module","BaseProcessor","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForImport","imported","source","options","_options$tagResolver","tagResolver","customFile","processor","getBuilderForIdentifier","definedProcessor","imports","_tagPath$parentPath","tagSource","tagPath","parentPath","isMemberExpression","property","node","params","prev","current","_current","_current2","_current3","_current4","isSequenceExpression","expressions","isCallExpression","callee","args","cookedArgs","map","arg","buildError","bind","isExpression","type","getSource","extracted","extractExpression","evaluate","filter","isNotNull","object","isIdentifier","computed","name","isStringLiteral","isTaggedTemplateExpression","tag","quasis","expressionValues","collectTemplateDependencies","replacer","replacement","isPure","mutate","p","replaceWith","addComment","importHelpers","addDefaultImport","importedSource","nameHint","addDefault","addNamedImport","addNamed","astService","Proxy","t","target","prop","receiver","Reflect","_tagPath$node$loc","loc","getDisplayName","idx","displayName","parent","findParent","isObjectProperty","isJSXOpeningElement","isVariableDeclarator","toString","keyPath","isJSXIdentifier","id","basename","test","replace","isTagReferenced","isReferenced","referencePaths","scope","getBinding","counters","WeakMap","getNextIndex","state","_counters$get","counter","getDefinedProcessors","cache","getTraversalCache","defined","forEach","local","createProcessorInstance","fileContext","_cache$get","builder","e","SKIP","applyProcessors","callback","collectExportsAndImports","explicitImport","definedProcessors","usages","idName","_path$scope$getBindin","includes","split","objBinding","identifier","sort","a","b","_a$identifier$node$st","_b$identifier$node$st","start","usage","instance"],"sources":["../../src/utils/getTagProcessor.ts"],"sourcesContent":["import { readFileSync } from 'fs';\nimport { basename, dirname, join } from 'path';\n\nimport { types as t } from '@babel/core';\nimport { addDefault, addNamed } from '@babel/helper-module-imports';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n Identifier,\n MemberExpression,\n Program,\n SourceLocation,\n} from '@babel/types';\n\nimport { BaseProcessor } from '@wyw-in-js/processor-utils';\nimport type {\n Param,\n Params,\n IFileContext,\n TagSource,\n} from '@wyw-in-js/processor-utils';\nimport { findPackageJSON } from '@wyw-in-js/shared';\nimport type { ExpressionValue, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { IImport } from './collectExportsAndImports';\nimport {\n collectExportsAndImports,\n explicitImport,\n} from './collectExportsAndImports';\nimport {\n collectTemplateDependencies,\n extractExpression,\n} from './collectTemplateDependencies';\nimport { getSource } from './getSource';\nimport { isNotNull } from './isNotNull';\nimport { mutate } from './scopeHelpers';\nimport { getTraversalCache } from './traversalCache';\n\ntype BuilderArgs = ConstructorParameters<typeof BaseProcessor> extends [\n Params,\n TagSource,\n typeof t,\n SourceLocation | null,\n (replacement: Expression, isPure: boolean) => void,\n ...infer T,\n]\n ? T\n : never;\n\ntype Builder = (...args: BuilderArgs) => BaseProcessor;\n\ntype DefinedProcessor = [ProcessorClass, TagSource];\ntype DefinedProcessors = Map<string, DefinedProcessor>;\n\nexport type ProcessorClass = new (\n ...args: ConstructorParameters<typeof BaseProcessor>\n) => BaseProcessor;\n\nconst last = <T>(arr: T[]): T | undefined => arr[arr.length - 1];\n\nfunction zip<T1, T2>(arr1: T1[], arr2: T2[]) {\n const result: (T1 | T2)[] = [];\n for (let i = 0; i < arr1.length; i++) {\n result.push(arr1[i]);\n if (arr2[i]) result.push(arr2[i]);\n }\n\n return result;\n}\n\nfunction buildCodeFrameError(path: NodePath, message: string): Error {\n try {\n return path.buildCodeFrameError(message);\n } catch {\n return new Error(message);\n }\n}\n\nconst definedTagsCache = new Map<string, Record<string, string> | undefined>();\nconst getDefinedTagsFromPackage = (\n pkgName: string,\n filename: string | null | undefined\n): Record<string, string> | undefined => {\n if (definedTagsCache.has(pkgName)) {\n return definedTagsCache.get(pkgName);\n }\n\n const packageJSONPath = findPackageJSON(pkgName, filename);\n if (!packageJSONPath) {\n return undefined;\n }\n\n const packageDir = dirname(packageJSONPath);\n const packageJSON = JSON.parse(readFileSync(packageJSONPath, 'utf8'));\n const definedTags: Record<string, string> | undefined =\n packageJSON['wyw-in-js']?.tags;\n\n const normalizedTags = definedTags\n ? Object.entries(definedTags).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: value.startsWith('.')\n ? join(packageDir, value)\n : require.resolve(value, { paths: [packageDir] }),\n }),\n {} as Record<string, string>\n )\n : undefined;\n\n definedTagsCache.set(pkgName, normalizedTags);\n\n return normalizedTags;\n};\n\nfunction isValidProcessorClass(module: unknown): module is ProcessorClass {\n return module instanceof BaseProcessor.constructor;\n}\n\nfunction getProcessorFromPackage(\n packageName: string,\n tagName: string,\n filename: string | null | undefined\n): ProcessorClass | null {\n const definedTags = getDefinedTagsFromPackage(packageName, filename);\n const processorPath = definedTags?.[tagName];\n if (!processorPath) {\n return null;\n }\n\n const Processor = require(processorPath).default;\n if (!isValidProcessorClass(Processor)) {\n return null;\n }\n\n return Processor;\n}\n\nfunction getProcessorFromFile(processorPath: string): ProcessorClass | null {\n const Processor = require(processorPath).default;\n if (!isValidProcessorClass(Processor)) {\n return null;\n }\n\n return Processor;\n}\n\nexport function getProcessorForImport(\n { imported, source }: IImport,\n filename: string | null | undefined,\n options: Pick<StrictOptions, 'tagResolver'>\n): [ProcessorClass | null, TagSource] {\n const tagResolver = options.tagResolver ?? (() => null);\n\n const customFile = tagResolver(source, imported);\n const processor = customFile\n ? getProcessorFromFile(customFile)\n : getProcessorFromPackage(source, imported, filename);\n return [processor, { imported, source }];\n}\n\nfunction getBuilderForIdentifier(\n definedProcessor: DefinedProcessor,\n path: NodePath<Identifier>,\n imports: IImport[],\n options: Pick<StrictOptions, 'evaluate'>\n): Builder | null {\n const [Processor, tagSource] = definedProcessor;\n let tagPath: NodePath<Identifier | MemberExpression> = path;\n if (tagPath.parentPath?.isMemberExpression({ property: tagPath.node })) {\n tagPath = tagPath.parentPath;\n }\n\n if (!Processor || !tagSource || !tagPath) {\n return null;\n }\n\n const params: Param[] = [['callee', tagPath.node]];\n let prev: NodePath = tagPath;\n let current: NodePath | null = tagPath.parentPath;\n while (current && current !== path) {\n if (\n current?.isSequenceExpression() &&\n last(current.node.expressions) === prev.node\n ) {\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isCallExpression({ callee: prev.node })) {\n const args = current.get('arguments');\n const cookedArgs = args\n .map((arg) => {\n const buildError = arg.buildCodeFrameError.bind(arg);\n if (!arg.isExpression()) {\n throw buildError(`Unexpected type of an argument ${arg.type}`);\n }\n const source = getSource(arg);\n const extracted = extractExpression(arg, options.evaluate, imports);\n return {\n ...extracted,\n source,\n buildCodeFrameError: buildError,\n } as ExpressionValue;\n })\n .filter(isNotNull);\n\n params.push(['call', ...cookedArgs]);\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isMemberExpression({ object: prev.node })) {\n const property = current.get('property');\n if (property.isIdentifier() && !current.node.computed) {\n params.push(['member', property.node.name]);\n } else if (property.isStringLiteral()) {\n params.push(['member', property.node.value]);\n } else {\n throw property.buildCodeFrameError(`Unexpected type of a property`);\n }\n\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (current?.isTaggedTemplateExpression({ tag: prev.node })) {\n const [quasis, expressionValues] = collectTemplateDependencies(\n current,\n options.evaluate\n );\n params.push(['template', zip(quasis, expressionValues)]);\n\n prev = current;\n current = current.parentPath;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n break;\n }\n\n const replacer = (replacement: Expression, isPure: boolean) => {\n mutate(prev, (p) => {\n p.replaceWith(replacement);\n if (isPure) {\n p.addComment('leading', '#__PURE__');\n }\n });\n };\n\n const importHelpers = {\n addDefaultImport: (importedSource: string, nameHint?: string) =>\n addDefault(path, importedSource, { nameHint }),\n addNamedImport: (\n name: string,\n importedSource: string,\n nameHint: string = name\n ) => addNamed(path, name, importedSource, { nameHint }),\n };\n\n type AstService = typeof t & typeof importHelpers;\n\n const astService = new Proxy<AstService>(t as AstService, {\n get(target, prop, receiver) {\n if (prop in importHelpers) {\n return importHelpers[prop as keyof typeof importHelpers];\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n\n return (...args: BuilderArgs) =>\n new Processor(\n params,\n tagSource,\n astService,\n tagPath.node.loc ?? null,\n replacer,\n ...args\n );\n}\n\nfunction getDisplayName(\n path: NodePath<Identifier>,\n idx: number,\n filename?: string | null\n): string {\n let displayName: string | undefined;\n\n const parent = path.findParent(\n (p) =>\n p.isObjectProperty() ||\n p.isJSXOpeningElement() ||\n p.isVariableDeclarator()\n );\n\n if (parent) {\n if (parent.isObjectProperty()) {\n if ('name' in parent.node.key) {\n displayName = parent.node.key.name;\n } else if ('value' in parent.node.key) {\n displayName = parent.node.key.value.toString();\n } else {\n const keyPath = parent.get('key');\n displayName = getSource(keyPath);\n }\n } else if (parent.isJSXOpeningElement()) {\n const name = parent.get('name');\n if (name.isJSXIdentifier()) {\n displayName = name.node.name;\n }\n } else if (parent.isVariableDeclarator()) {\n const id = parent.get('id');\n if (id.isIdentifier()) {\n displayName = id.node.name;\n }\n }\n }\n\n if (!displayName) {\n // Try to derive the path from the filename\n displayName = basename(filename ?? 'unknown');\n\n if (filename && /^index\\.[a-z\\d]+$/.test(displayName)) {\n // If the file name is 'index', better to get name from parent folder\n displayName = basename(dirname(filename));\n }\n\n // Remove the file extension\n displayName = displayName.replace(/\\.[a-z\\d]+$/, '');\n\n if (displayName) {\n displayName += idx;\n } else {\n throw new Error(\n \"Couldn't determine a name for the component. Ensure that it's either:\\n\" +\n '- Assigned to a variable\\n' +\n '- Is an object property\\n' +\n '- Is a prop in a JSX element\\n'\n );\n }\n }\n\n return displayName;\n}\n\nfunction isTagReferenced(path: NodePath): boolean {\n // Check if the variable is referenced anywhere for basic DCE\n // Only works when it's assigned to a variable\n let isReferenced = true;\n\n const parent = path.findParent(\n (p) =>\n p.isObjectProperty() ||\n p.isJSXOpeningElement() ||\n p.isVariableDeclarator()\n );\n\n if (parent) {\n if (parent.isVariableDeclarator()) {\n const id = parent.get('id');\n // FIXME: replace with id.isReferencedIdentifier()\n if (id.isIdentifier()) {\n const { referencePaths } = path.scope.getBinding(id.node.name) || {\n referencePaths: [],\n };\n\n isReferenced = referencePaths.length !== 0;\n }\n }\n }\n\n return isReferenced;\n}\n\nconst counters = new WeakMap<IFileContext, number>();\nconst getNextIndex = (state: IFileContext) => {\n const counter = counters.get(state) ?? 0;\n counters.set(state, counter + 1);\n return counter;\n};\n\nexport function getDefinedProcessors(\n imports: IImport[],\n path: NodePath<Program>,\n filename: string | null | undefined,\n options: Pick<StrictOptions, 'tagResolver'>\n): DefinedProcessors {\n const cache = getTraversalCache<DefinedProcessors, NodePath<Program>>(\n path,\n 'getDefinedProcessors'\n );\n\n if (!cache.has(path)) {\n const defined: DefinedProcessors = new Map();\n\n imports.forEach((i) => {\n const [processor, tagSource] = getProcessorForImport(\n i,\n filename,\n options\n );\n const { local } = i;\n if (!processor) {\n return;\n }\n\n let name: string | null = null;\n if (local.isIdentifier()) {\n name = local.node.name;\n }\n\n if (name === null && local.isMemberExpression()) {\n const property = local.get('property');\n const object = local.get('object');\n if (property.isIdentifier() && object.isIdentifier()) {\n name = `${object.node.name}.${property.node.name}`;\n }\n }\n\n if (name === null) {\n return;\n }\n\n defined.set(name, [processor, tagSource]);\n });\n\n cache.set(path, defined);\n }\n\n return cache.get(path)!;\n}\n\nfunction createProcessorInstance(\n definedProcessor: [ProcessorClass, TagSource],\n imports: IImport[],\n path: NodePath<Identifier>,\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'\n >\n): BaseProcessor | null {\n const cache = getTraversalCache<BaseProcessor | null, Identifier>(\n path,\n 'createProcessorInstance'\n );\n\n if (!cache.has(path.node)) {\n try {\n const builder = getBuilderForIdentifier(\n definedProcessor,\n path,\n imports,\n options\n );\n if (builder) {\n // Increment the index of the style we're processing\n // This is used for slug generation to prevent collision\n // Also used for display name if it couldn't be determined\n const idx = getNextIndex(fileContext);\n\n const displayName = getDisplayName(path, idx, fileContext.filename);\n\n const processor = builder(\n displayName,\n isTagReferenced(path),\n idx,\n options,\n fileContext\n );\n\n cache.set(path.node, processor);\n } else {\n cache.set(path.node, null);\n }\n } catch (e) {\n if (e === BaseProcessor.SKIP) {\n cache.set(path.node, null);\n return null;\n }\n\n if (e instanceof Error) {\n throw buildCodeFrameError(path, e.message);\n }\n\n throw e;\n }\n }\n\n return cache.get(path.node) ?? null;\n}\n\nexport function applyProcessors(\n path: NodePath<Program>,\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'\n >,\n callback: (processor: BaseProcessor) => void\n) {\n const imports = collectExportsAndImports(path).imports.filter(explicitImport);\n\n const definedProcessors = getDefinedProcessors(\n imports,\n path,\n fileContext.filename,\n options\n );\n\n const usages: {\n identifier: NodePath<Identifier>;\n processor: DefinedProcessor;\n }[] = [];\n\n definedProcessors.forEach((processor, idName) => {\n if (idName.includes('.')) {\n // It's a member expression\n const [object, property] = idName.split('.');\n const objBinding = path.scope.getBinding(object);\n if (!objBinding) {\n return;\n }\n\n objBinding.referencePaths.forEach((p) => {\n const parent = p.parentPath;\n if (!parent?.isMemberExpression()) {\n return;\n }\n\n const identifier = parent.get('property');\n if (identifier.isIdentifier({ name: property })) {\n usages.push({\n identifier,\n processor,\n });\n }\n });\n\n return;\n }\n\n path.scope.getBinding(idName)?.referencePaths.forEach((identifier) => {\n if (identifier.isIdentifier()) {\n usages.push({\n identifier,\n processor,\n });\n }\n });\n });\n\n // The same order, the same slugs\n usages.sort(\n (a, b) => (a.identifier.node.start ?? 0) - (b.identifier.node.start ?? 0)\n );\n\n usages.forEach((usage) => {\n const definedProcessor = usage.processor;\n\n if (!definedProcessor) {\n return;\n }\n\n const instance = createProcessorInstance(\n definedProcessor,\n imports,\n usage.identifier,\n fileContext,\n options\n );\n\n if (instance === null) {\n return;\n }\n\n callback(instance);\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyw-in-js/transform",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "dependencies": {
5
5
  "@babel/core": "^7.23.5",
6
6
  "@babel/generator": "^7.23.5",
@@ -15,8 +15,8 @@
15
15
  "source-map": "^0.7.4",
16
16
  "stylis": "^4.3.0",
17
17
  "ts-invariant": "^0.10.3",
18
- "@wyw-in-js/processor-utils": "0.3.0",
19
- "@wyw-in-js/shared": "0.3.0"
18
+ "@wyw-in-js/processor-utils": "0.4.1",
19
+ "@wyw-in-js/shared": "0.4.1"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@babel/plugin-syntax-typescript": "^7.23.3",
@@ -37,10 +37,10 @@
37
37
  "glob": "^10.3.10",
38
38
  "strip-ansi": "^5.2.0",
39
39
  "typescript": "^5.2.2",
40
- "@wyw-in-js/babel-config": "0.3.0",
41
- "@wyw-in-js/eslint-config": "0.3.0",
42
- "@wyw-in-js/jest-preset": "0.3.0",
43
- "@wyw-in-js/ts-config": "0.3.0"
40
+ "@wyw-in-js/babel-config": "0.4.1",
41
+ "@wyw-in-js/eslint-config": "0.4.1",
42
+ "@wyw-in-js/jest-preset": "0.4.1",
43
+ "@wyw-in-js/ts-config": "0.4.1"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=16.0.0"
package/types/index.d.ts CHANGED
@@ -26,10 +26,9 @@ export { EventEmitter } from './utils/EventEmitter';
26
26
  export type { EntrypointEvent, OnEvent, OnActionStartArgs, OnActionFinishArgs, } from './utils/EventEmitter';
27
27
  export { isNode } from './utils/isNode';
28
28
  export { getFileIdx } from './utils/getFileIdx';
29
- export { getTagProcessor } from './utils/getTagProcessor';
29
+ export { applyProcessors } from './utils/getTagProcessor';
30
30
  export { getVisitorKeys } from './utils/getVisitorKeys';
31
31
  export type { VisitorKeys } from './utils/getVisitorKeys';
32
32
  export { peek } from './utils/peek';
33
- export { processTemplateExpression } from './utils/processTemplateExpression';
34
33
  export { TransformCacheCollection } from './cache';
35
34
  export { findIdentifiers } from './utils/findIdentifiers';
package/types/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.findIdentifiers = exports.TransformCacheCollection = exports.processTemplateExpression = exports.peek = exports.getVisitorKeys = exports.getTagProcessor = exports.getFileIdx = exports.isNode = exports.EventEmitter = exports.withDefaultServices = exports.loadWywOptions = exports.syncResolveImports = exports.asyncResolveImports = exports.transformUrl = exports.Entrypoint = exports.prepareCode = exports.baseHandlers = exports.parseFile = exports.EvaluatedEntrypoint = exports.UnprocessedEntrypointError = exports.isUnprocessedEntrypointError = exports.transform = exports.shaker = exports.DefaultModuleImplementation = exports.Module = exports.withTransformMetadata = exports.getTransformMetadata = exports.preeval = exports.babelTransformPlugin = exports.createFileReporter = exports.slugify = void 0;
20
+ exports.findIdentifiers = exports.TransformCacheCollection = exports.peek = exports.getVisitorKeys = exports.applyProcessors = exports.getFileIdx = exports.isNode = exports.EventEmitter = exports.withDefaultServices = exports.loadWywOptions = exports.syncResolveImports = exports.asyncResolveImports = exports.transformUrl = exports.Entrypoint = exports.prepareCode = exports.baseHandlers = exports.parseFile = exports.EvaluatedEntrypoint = exports.UnprocessedEntrypointError = exports.isUnprocessedEntrypointError = exports.transform = exports.shaker = exports.DefaultModuleImplementation = exports.Module = exports.withTransformMetadata = exports.getTransformMetadata = exports.preeval = exports.babelTransformPlugin = exports.createFileReporter = exports.slugify = void 0;
21
21
  var shared_1 = require("@wyw-in-js/shared");
22
22
  Object.defineProperty(exports, "slugify", { enumerable: true, get: function () { return shared_1.slugify; } });
23
23
  var fileReporter_1 = require("./debug/fileReporter");
@@ -66,13 +66,11 @@ Object.defineProperty(exports, "isNode", { enumerable: true, get: function () {
66
66
  var getFileIdx_1 = require("./utils/getFileIdx");
67
67
  Object.defineProperty(exports, "getFileIdx", { enumerable: true, get: function () { return getFileIdx_1.getFileIdx; } });
68
68
  var getTagProcessor_1 = require("./utils/getTagProcessor");
69
- Object.defineProperty(exports, "getTagProcessor", { enumerable: true, get: function () { return getTagProcessor_1.getTagProcessor; } });
69
+ Object.defineProperty(exports, "applyProcessors", { enumerable: true, get: function () { return getTagProcessor_1.applyProcessors; } });
70
70
  var getVisitorKeys_1 = require("./utils/getVisitorKeys");
71
71
  Object.defineProperty(exports, "getVisitorKeys", { enumerable: true, get: function () { return getVisitorKeys_1.getVisitorKeys; } });
72
72
  var peek_1 = require("./utils/peek");
73
73
  Object.defineProperty(exports, "peek", { enumerable: true, get: function () { return peek_1.peek; } });
74
- var processTemplateExpression_1 = require("./utils/processTemplateExpression");
75
- Object.defineProperty(exports, "processTemplateExpression", { enumerable: true, get: function () { return processTemplateExpression_1.processTemplateExpression; } });
76
74
  var cache_1 = require("./cache");
77
75
  Object.defineProperty(exports, "TransformCacheCollection", { enumerable: true, get: function () { return cache_1.TransformCacheCollection; } });
78
76
  var findIdentifiers_1 = require("./utils/findIdentifiers");
@@ -5,12 +5,16 @@
5
5
  import type { BabelFile, PluginObj } from '@babel/core';
6
6
  import type { ValueCache } from '@wyw-in-js/processor-utils';
7
7
  import type { StrictOptions } from '@wyw-in-js/shared';
8
+ import { EventEmitter } from '../utils/EventEmitter';
8
9
  import type { Core } from '../babel';
9
10
  import type { IPluginState } from '../types';
10
11
  export declare const filename: string;
11
- export declare function collector(file: BabelFile, options: Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'>, values: ValueCache): {
12
+ export declare function collector(file: BabelFile, options: Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'> & {
13
+ eventEmitter?: EventEmitter;
14
+ }, values: ValueCache): {
12
15
  artifacts: import("@wyw-in-js/shared").Artifact[];
13
16
  }[];
14
17
  export default function collectorPlugin(babel: Core, options: StrictOptions & {
18
+ eventEmitter?: EventEmitter;
15
19
  values?: ValueCache;
16
20
  }): PluginObj<IPluginState>;
@@ -6,21 +6,16 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.collector = exports.filename = void 0;
8
8
  const shared_1 = require("@wyw-in-js/shared");
9
- const processTemplateExpression_1 = require("../utils/processTemplateExpression");
9
+ const EventEmitter_1 = require("../utils/EventEmitter");
10
+ const getTagProcessor_1 = require("../utils/getTagProcessor");
10
11
  const scopeHelpers_1 = require("../utils/scopeHelpers");
11
12
  const traversalCache_1 = require("../utils/traversalCache");
12
13
  exports.filename = __filename;
13
14
  function collector(file, options, values) {
15
+ const eventEmitter = options.eventEmitter ?? EventEmitter_1.EventEmitter.dummy;
14
16
  const processors = [];
15
- const identifiers = [];
16
- file.path.traverse({
17
- Identifier: (p) => {
18
- identifiers.push(p);
19
- },
20
- });
21
- // TODO: process transformed literals
22
- identifiers.forEach((p) => {
23
- (0, processTemplateExpression_1.processTemplateExpression)(p, file.opts, options, (processor) => {
17
+ eventEmitter.perf('transform:collector:processTemplate', () => {
18
+ (0, getTagProcessor_1.applyProcessors)(file.path, file.opts, options, (processor) => {
24
19
  processor.build(values);
25
20
  processor.doRuntimeReplacement();
26
21
  processors.push(processor);
@@ -7,10 +7,10 @@ import type { StrictOptions } from '@wyw-in-js/shared';
7
7
  import type { Core } from '../babel';
8
8
  import type { IPluginState } from '../types';
9
9
  import { EventEmitter } from '../utils/EventEmitter';
10
- export type PreevalOptions = Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'features'> & {
11
- eventEmitter: EventEmitter;
10
+ export type PreevalOptions = Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'features' | 'tagResolver'> & {
11
+ eventEmitter?: EventEmitter;
12
12
  };
13
- export declare function preeval(babel: Core, { eventEmitter, ...options }: PreevalOptions): PluginObj<IPluginState & {
13
+ export declare function preeval(babel: Core, options: PreevalOptions): PluginObj<IPluginState & {
14
14
  onFinish: () => void;
15
15
  }>;
16
16
  export default preeval;
@@ -2,14 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.preeval = void 0;
4
4
  const shared_1 = require("@wyw-in-js/shared");
5
+ const getTagProcessor_1 = require("../utils/getTagProcessor");
5
6
  const EventEmitter_1 = require("../utils/EventEmitter");
6
7
  const addIdentifierToWywPreval_1 = require("../utils/addIdentifierToWywPreval");
7
8
  const getFileIdx_1 = require("../utils/getFileIdx");
8
- const processTemplateExpression_1 = require("../utils/processTemplateExpression");
9
9
  const removeDangerousCode_1 = require("../utils/removeDangerousCode");
10
10
  const traversalCache_1 = require("../utils/traversalCache");
11
- function preeval(babel, { eventEmitter = EventEmitter_1.EventEmitter.dummy, ...options }) {
11
+ function preeval(babel, options) {
12
12
  const { types: t } = babel;
13
+ const eventEmitter = options.eventEmitter ?? EventEmitter_1.EventEmitter.dummy;
13
14
  return {
14
15
  name: '@wyw-in-js/transform/preeval',
15
16
  pre(file) {
@@ -19,18 +20,14 @@ function preeval(babel, { eventEmitter = EventEmitter_1.EventEmitter.dummy, ...o
19
20
  const rootScope = file.scope;
20
21
  this.processors = [];
21
22
  eventEmitter.perf('transform:preeval:processTemplate', () => {
22
- file.path.traverse({
23
- Identifier: (p) => {
24
- (0, processTemplateExpression_1.processTemplateExpression)(p, file.opts, options, (processor) => {
25
- processor.dependencies.forEach((dependency) => {
26
- if (dependency.ex.type === 'Identifier') {
27
- (0, addIdentifierToWywPreval_1.addIdentifierToWywPreval)(rootScope, dependency.ex.name);
28
- }
29
- });
30
- processor.doEvaltimeReplacement();
31
- this.processors.push(processor);
32
- });
33
- },
23
+ (0, getTagProcessor_1.applyProcessors)(file.path, file.opts, options, (processor) => {
24
+ processor.dependencies.forEach((dependency) => {
25
+ if (dependency.ex.type === 'Identifier') {
26
+ (0, addIdentifierToWywPreval_1.addIdentifierToWywPreval)(rootScope, dependency.ex.name);
27
+ }
28
+ });
29
+ processor.doEvaltimeReplacement();
30
+ this.processors.push(processor);
34
31
  });
35
32
  });
36
33
  if ((0, shared_1.isFeatureEnabled)(options.features, 'dangerousCodeRemover', filename)) {
@@ -43,7 +43,10 @@ class Entrypoint extends BaseEntrypoint_1.BaseEntrypoint {
43
43
  if (this.loadedAndParsed.code !== undefined) {
44
44
  services.cache.invalidateIfChanged(name, this.loadedAndParsed.code);
45
45
  }
46
- this.log.extend('source')('created %s (%o)\n%s', name, only, this.originalCode || EMPTY_FILE);
46
+ const code = this.loadedAndParsed.evaluator === 'ignored'
47
+ ? '[IGNORED]'
48
+ : this.originalCode || EMPTY_FILE;
49
+ this.log.extend('source')('created %s (%o)\n%s', name, only, code);
47
50
  }
48
51
  get ignored() {
49
52
  return this.loadedAndParsed.evaluator === 'ignored';
@@ -8,4 +8,7 @@ export declare function transformUrl(url: string, outputFilename: string, source
8
8
  */
9
9
  export declare const stylisGlobalPlugin: Middleware;
10
10
  export declare function createStylisUrlReplacePlugin(filename: string, outputFilename: string | undefined): Middleware;
11
- export declare function createStylisPreprocessor(options: Options): (selector: string, text: string) => string;
11
+ export declare function createKeyframeSuffixerPlugin(): Middleware;
12
+ export declare function createStylisPreprocessor(options: Options & {
13
+ prefixer?: boolean;
14
+ }): (selector: string, text: string) => string;