@wyw-in-js/transform 1.0.5 → 1.0.6

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.
@@ -28,6 +28,7 @@ function buildCodeFrameError(path, message) {
28
28
  }
29
29
  const definedTagsCache = new Map();
30
30
  const resolvedTagResolverSourceCache = new Map();
31
+ let didWarnSkipSymbolMismatch = false;
31
32
  const getResolvedTagResolverSource = (source, sourceFile) => {
32
33
  if (!sourceFile) {
33
34
  return undefined;
@@ -330,6 +331,15 @@ function createProcessorInstance(definedProcessor, imports, path, fileContext, o
330
331
  cache.set(path.node, null);
331
332
  return null;
332
333
  }
334
+ if (typeof e === 'symbol' && e.description === BaseProcessor.SKIP.description) {
335
+ if (!didWarnSkipSymbolMismatch) {
336
+ didWarnSkipSymbolMismatch = true;
337
+ // eslint-disable-next-line no-console
338
+ console.warn(["[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.", 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.', 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).'].join('\n'));
339
+ }
340
+ cache.set(path.node, null);
341
+ return null;
342
+ }
333
343
  if (e instanceof Error) {
334
344
  throw buildCodeFrameError(path, e.message);
335
345
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getTagProcessor.js","names":["readFileSync","basename","dirname","join","types","t","addDefault","addNamed","BaseProcessor","findPackageJSON","syncResolve","collectExportsAndImports","explicitImport","collectTemplateDependencies","extractExpression","getSource","isNotNull","mutate","getTraversalCache","last","arr","length","zip","arr1","arr2","result","i","push","buildCodeFrameError","path","message","Error","definedTagsCache","Map","resolvedTagResolverSourceCache","getResolvedTagResolverSource","source","sourceFile","undefined","key","has","get","resolved","set","getDefinedTagsFromPackage","pkgName","filename","packageJSONPath","packageDir","packageJSON","JSON","parse","definedTags","tags","normalizedTags","Object","entries","reduce","acc","value","startsWith","require","resolve","paths","isValidProcessorClass","module","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForImport","imported","options","tagResolver","customFile","tagResolverMeta","resolvedSource","processor","getBuilderForIdentifier","definedProcessor","imports","tagSource","tagPath","parentPath","isMemberExpression","property","node","params","prev","current","isSequenceExpression","expressions","isCallExpression","callee","args","cookedArgs","map","arg","buildError","bind","isExpression","type","extracted","evaluate","filter","object","isIdentifier","computed","name","isStringLiteral","isTaggedTemplateExpression","tag","quasis","expressionValues","replacer","replacement","isPure","p","next","replaceWith","isNewExpression","addComment","importHelpers","addDefaultImport","importedSource","nameHint","addNamedImport","astService","Proxy","target","prop","receiver","Reflect","loc","getDisplayName","idx","displayName","parent","findParent","isObjectProperty","isJSXOpeningElement","isVariableDeclarator","toString","keyPath","isJSXIdentifier","id","test","replace","isTagReferenced","isReferenced","referencePaths","scope","getBinding","counters","WeakMap","getNextIndex","state","counter","getDefinedProcessors","cache","defined","forEach","local","createProcessorInstance","fileContext","builder","e","SKIP","applyProcessors","callback","definedProcessors","usages","idName","includes","split","objBinding","identifier","sort","a","b","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, syncResolve } from '@wyw-in-js/shared';\nimport type {\n ExpressionValue,\n StrictOptions,\n TagResolverMeta,\n} 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 resolvedTagResolverSourceCache = new Map<string, string | undefined>();\n\nconst getResolvedTagResolverSource = (\n source: string,\n sourceFile: string | null | undefined\n): string | undefined => {\n if (!sourceFile) {\n return undefined;\n }\n\n const key = `${sourceFile}\\0${source}`;\n if (resolvedTagResolverSourceCache.has(key)) {\n return resolvedTagResolverSourceCache.get(key);\n }\n\n try {\n const resolved = syncResolve(source, sourceFile, []);\n resolvedTagResolverSourceCache.set(key, resolved);\n return resolved;\n } catch {\n resolvedTagResolverSourceCache.set(key, undefined);\n return undefined;\n }\n};\n\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;\n\n let customFile: string | null = null;\n if (tagResolver) {\n const tagResolverMeta: TagResolverMeta = {\n sourceFile: filename,\n resolvedSource: getResolvedTagResolverSource(source, filename),\n };\n\n customFile = tagResolver(source, imported, tagResolverMeta);\n }\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 = (\n replacement: Expression | ((tagPath: NodePath) => Expression),\n isPure: boolean\n ) => {\n mutate(prev, (p) => {\n const next =\n typeof replacement === 'function' ? replacement(p) : replacement;\n\n p.replaceWith(next);\n\n if (isPure && (p.isCallExpression() || p.isNewExpression())) {\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 } = id.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' | 'extensions' | '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' | 'extensions' | '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":"AAAA,SAASA,YAAY,QAAQ,IAAI;AACjC,SAASC,QAAQ,EAAEC,OAAO,EAAEC,IAAI,QAAQ,MAAM;AAE9C,SAASC,KAAK,IAAIC,CAAC,QAAQ,aAAa;AACxC,SAASC,UAAU,EAAEC,QAAQ,QAAQ,8BAA8B;AAUnE,SAASC,aAAa,QAAQ,4BAA4B;AAO1D,SAASC,eAAe,EAAEC,WAAW,QAAQ,mBAAmB;AAQhE,SACEC,wBAAwB,EACxBC,cAAc,QACT,4BAA4B;AACnC,SACEC,2BAA2B,EAC3BC,iBAAiB,QACZ,+BAA+B;AACtC,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,MAAM,QAAQ,gBAAgB;AACvC,SAASC,iBAAiB,QAAQ,kBAAkB;AAsBpD,MAAMC,IAAI,GAAOC,GAAQ,IAAoBA,GAAG,CAACA,GAAG,CAACC,MAAM,GAAG,CAAC,CAAC;AAEhE,SAASC,GAAGA,CAASC,IAAU,EAAEC,IAAU,EAAE;EAC3C,MAAMC,MAAmB,GAAG,EAAE;EAC9B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,IAAI,CAACF,MAAM,EAAEK,CAAC,EAAE,EAAE;IACpCD,MAAM,CAACE,IAAI,CAACJ,IAAI,CAACG,CAAC,CAAC,CAAC;IACpB,IAAIF,IAAI,CAACE,CAAC,CAAC,EAAED,MAAM,CAACE,IAAI,CAACH,IAAI,CAACE,CAAC,CAAC,CAAC;EACnC;EAEA,OAAOD,MAAM;AACf;AAEA,SAASG,mBAAmBA,CAACC,IAAc,EAAEC,OAAe,EAAS;EACnE,IAAI;IACF,OAAOD,IAAI,CAACD,mBAAmB,CAACE,OAAO,CAAC;EAC1C,CAAC,CAAC,MAAM;IACN,OAAO,IAAIC,KAAK,CAACD,OAAO,CAAC;EAC3B;AACF;AAEA,MAAME,gBAAgB,GAAG,IAAIC,GAAG,CAA6C,CAAC;AAC9E,MAAMC,8BAA8B,GAAG,IAAID,GAAG,CAA6B,CAAC;AAE5E,MAAME,4BAA4B,GAAGA,CACnCC,MAAc,EACdC,UAAqC,KACd;EACvB,IAAI,CAACA,UAAU,EAAE;IACf,OAAOC,SAAS;EAClB;EAEA,MAAMC,GAAG,GAAG,GAAGF,UAAU,KAAKD,MAAM,EAAE;EACtC,IAAIF,8BAA8B,CAACM,GAAG,CAACD,GAAG,CAAC,EAAE;IAC3C,OAAOL,8BAA8B,CAACO,GAAG,CAACF,GAAG,CAAC;EAChD;EAEA,IAAI;IACF,MAAMG,QAAQ,GAAGhC,WAAW,CAAC0B,MAAM,EAAEC,UAAU,EAAE,EAAE,CAAC;IACpDH,8BAA8B,CAACS,GAAG,CAACJ,GAAG,EAAEG,QAAQ,CAAC;IACjD,OAAOA,QAAQ;EACjB,CAAC,CAAC,MAAM;IACNR,8BAA8B,CAACS,GAAG,CAACJ,GAAG,EAAED,SAAS,CAAC;IAClD,OAAOA,SAAS;EAClB;AACF,CAAC;AAED,MAAMM,yBAAyB,GAAGA,CAChCC,OAAe,EACfC,QAAmC,KACI;EACvC,IAAId,gBAAgB,CAACQ,GAAG,CAACK,OAAO,CAAC,EAAE;IACjC,OAAOb,gBAAgB,CAACS,GAAG,CAACI,OAAO,CAAC;EACtC;EAEA,MAAME,eAAe,GAAGtC,eAAe,CAACoC,OAAO,EAAEC,QAAQ,CAAC;EAC1D,IAAI,CAACC,eAAe,EAAE;IACpB,OAAOT,SAAS;EAClB;EAEA,MAAMU,UAAU,GAAG9C,OAAO,CAAC6C,eAAe,CAAC;EAC3C,MAAME,WAAW,GAAGC,IAAI,CAACC,KAAK,CAACnD,YAAY,CAAC+C,eAAe,EAAE,MAAM,CAAC,CAAC;EACrE,MAAMK,WAA+C,GACnDH,WAAW,CAAC,WAAW,CAAC,EAAEI,IAAI;EAEhC,MAAMC,cAAc,GAAGF,WAAW,GAC9BG,MAAM,CAACC,OAAO,CAACJ,WAAW,CAAC,CAACK,MAAM,CAChC,CAACC,GAAG,EAAE,CAACnB,GAAG,EAAEoB,KAAK,CAAC,MAAM;IACtB,GAAGD,GAAG;IACN,CAACnB,GAAG,GAAGoB,KAAK,CAACC,UAAU,CAAC,GAAG,CAAC,GACxBzD,IAAI,CAAC6C,UAAU,EAAEW,KAAK,CAAC,GACvBE,OAAO,CAACC,OAAO,CAACH,KAAK,EAAE;MAAEI,KAAK,EAAE,CAACf,UAAU;IAAE,CAAC;EACpD,CAAC,CAAC,EACF,CAAC,CACH,CAAC,GACDV,SAAS;EAEbN,gBAAgB,CAACW,GAAG,CAACE,OAAO,EAAES,cAAc,CAAC;EAE7C,OAAOA,cAAc;AACvB,CAAC;AAED,SAASU,qBAAqBA,CAACC,MAAe,EAA4B;EACxE,OAAOA,MAAM,YAAYzD,aAAa,CAAC0D,WAAW;AACpD;AAEA,SAASC,uBAAuBA,CAC9BC,WAAmB,EACnBC,OAAe,EACfvB,QAAmC,EACZ;EACvB,MAAMM,WAAW,GAAGR,yBAAyB,CAACwB,WAAW,EAAEtB,QAAQ,CAAC;EACpE,MAAMwB,aAAa,GAAGlB,WAAW,GAAGiB,OAAO,CAAC;EAC5C,IAAI,CAACC,aAAa,EAAE;IAClB,OAAO,IAAI;EACb;EAEA,MAAMC,SAAS,GAAGV,OAAO,CAACS,aAAa,CAAC,CAACE,OAAO;EAChD,IAAI,CAACR,qBAAqB,CAACO,SAAS,CAAC,EAAE;IACrC,OAAO,IAAI;EACb;EAEA,OAAOA,SAAS;AAClB;AAEA,SAASE,oBAAoBA,CAACH,aAAqB,EAAyB;EAC1E,MAAMC,SAAS,GAAGV,OAAO,CAACS,aAAa,CAAC,CAACE,OAAO;EAChD,IAAI,CAACR,qBAAqB,CAACO,SAAS,CAAC,EAAE;IACrC,OAAO,IAAI;EACb;EAEA,OAAOA,SAAS;AAClB;AAEA,OAAO,SAASG,qBAAqBA,CACnC;EAAEC,QAAQ;EAAEvC;AAAgB,CAAC,EAC7BU,QAAmC,EACnC8B,OAA2C,EACP;EACpC,MAAM;IAAEC;EAAY,CAAC,GAAGD,OAAO;EAE/B,IAAIE,UAAyB,GAAG,IAAI;EACpC,IAAID,WAAW,EAAE;IACf,MAAME,eAAgC,GAAG;MACvC1C,UAAU,EAAES,QAAQ;MACpBkC,cAAc,EAAE7C,4BAA4B,CAACC,MAAM,EAAEU,QAAQ;IAC/D,CAAC;IAEDgC,UAAU,GAAGD,WAAW,CAACzC,MAAM,EAAEuC,QAAQ,EAAEI,eAAe,CAAC;EAC7D;EACA,MAAME,SAAS,GAAGH,UAAU,GACxBL,oBAAoB,CAACK,UAAU,CAAC,GAChCX,uBAAuB,CAAC/B,MAAM,EAAEuC,QAAQ,EAAE7B,QAAQ,CAAC;EACvD,OAAO,CAACmC,SAAS,EAAE;IAAEN,QAAQ;IAAEvC;EAAO,CAAC,CAAC;AAC1C;AAEA,SAAS8C,uBAAuBA,CAC9BC,gBAAkC,EAClCtD,IAA0B,EAC1BuD,OAAkB,EAClBR,OAAwC,EACxB;EAChB,MAAM,CAACL,SAAS,EAAEc,SAAS,CAAC,GAAGF,gBAAgB;EAC/C,IAAIG,OAAgD,GAAGzD,IAAI;EAC3D,IAAIyD,OAAO,CAACC,UAAU,EAAEC,kBAAkB,CAAC;IAAEC,QAAQ,EAAEH,OAAO,CAACI;EAAK,CAAC,CAAC,EAAE;IACtEJ,OAAO,GAAGA,OAAO,CAACC,UAAU;EAC9B;EAEA,IAAI,CAAChB,SAAS,IAAI,CAACc,SAAS,IAAI,CAACC,OAAO,EAAE;IACxC,OAAO,IAAI;EACb;EAEA,MAAMK,MAAe,GAAG,CAAC,CAAC,QAAQ,EAAEL,OAAO,CAACI,IAAI,CAAC,CAAC;EAClD,IAAIE,IAAc,GAAGN,OAAO;EAC5B,IAAIO,OAAwB,GAAGP,OAAO,CAACC,UAAU;EACjD,OAAOM,OAAO,IAAIA,OAAO,KAAKhE,IAAI,EAAE;IAClC,IACEgE,OAAO,EAAEC,oBAAoB,CAAC,CAAC,IAC/B3E,IAAI,CAAC0E,OAAO,CAACH,IAAI,CAACK,WAAW,CAAC,KAAKH,IAAI,CAACF,IAAI,EAC5C;MACAE,IAAI,GAAGC,OAAO;MACdA,OAAO,GAAGA,OAAO,CAACN,UAAU;MAC5B;MACA;IACF;IAEA,IAAIM,OAAO,EAAEG,gBAAgB,CAAC;MAAEC,MAAM,EAAEL,IAAI,CAACF;IAAK,CAAC,CAAC,EAAE;MACpD,MAAMQ,IAAI,GAAGL,OAAO,CAACpD,GAAG,CAAC,WAAW,CAAC;MACrC,MAAM0D,UAAU,GAAGD,IAAI,CACpBE,GAAG,CAAEC,GAAG,IAAK;QACZ,MAAMC,UAAU,GAAGD,GAAG,CAACzE,mBAAmB,CAAC2E,IAAI,CAACF,GAAG,CAAC;QACpD,IAAI,CAACA,GAAG,CAACG,YAAY,CAAC,CAAC,EAAE;UACvB,MAAMF,UAAU,CAAC,kCAAkCD,GAAG,CAACI,IAAI,EAAE,CAAC;QAChE;QACA,MAAMrE,MAAM,GAAGrB,SAAS,CAACsF,GAAG,CAAC;QAC7B,MAAMK,SAAS,GAAG5F,iBAAiB,CAACuF,GAAG,EAAEzB,OAAO,CAAC+B,QAAQ,EAAEvB,OAAO,CAAC;QACnE,OAAO;UACL,GAAGsB,SAAS;UACZtE,MAAM;UACNR,mBAAmB,EAAE0E;QACvB,CAAC;MACH,CAAC,CAAC,CACDM,MAAM,CAAC5F,SAAS,CAAC;MAEpB2E,MAAM,CAAChE,IAAI,CAAC,CAAC,MAAM,EAAE,GAAGwE,UAAU,CAAC,CAAC;MACpCP,IAAI,GAAGC,OAAO;MACdA,OAAO,GAAGA,OAAO,CAACN,UAAU;MAC5B;MACA;IACF;IAEA,IAAIM,OAAO,EAAEL,kBAAkB,CAAC;MAAEqB,MAAM,EAAEjB,IAAI,CAACF;IAAK,CAAC,CAAC,EAAE;MACtD,MAAMD,QAAQ,GAAGI,OAAO,CAACpD,GAAG,CAAC,UAAU,CAAC;MACxC,IAAIgD,QAAQ,CAACqB,YAAY,CAAC,CAAC,IAAI,CAACjB,OAAO,CAACH,IAAI,CAACqB,QAAQ,EAAE;QACrDpB,MAAM,CAAChE,IAAI,CAAC,CAAC,QAAQ,EAAE8D,QAAQ,CAACC,IAAI,CAACsB,IAAI,CAAC,CAAC;MAC7C,CAAC,MAAM,IAAIvB,QAAQ,CAACwB,eAAe,CAAC,CAAC,EAAE;QACrCtB,MAAM,CAAChE,IAAI,CAAC,CAAC,QAAQ,EAAE8D,QAAQ,CAACC,IAAI,CAAC/B,KAAK,CAAC,CAAC;MAC9C,CAAC,MAAM;QACL,MAAM8B,QAAQ,CAAC7D,mBAAmB,CAAC,+BAA+B,CAAC;MACrE;MAEAgE,IAAI,GAAGC,OAAO;MACdA,OAAO,GAAGA,OAAO,CAACN,UAAU;MAC5B;MACA;IACF;IAEA,IAAIM,OAAO,EAAEqB,0BAA0B,CAAC;MAAEC,GAAG,EAAEvB,IAAI,CAACF;IAAK,CAAC,CAAC,EAAE;MAC3D,MAAM,CAAC0B,MAAM,EAAEC,gBAAgB,CAAC,GAAGxG,2BAA2B,CAC5DgF,OAAO,EACPjB,OAAO,CAAC+B,QACV,CAAC;MACDhB,MAAM,CAAChE,IAAI,CAAC,CAAC,UAAU,EAAEL,GAAG,CAAC8F,MAAM,EAAEC,gBAAgB,CAAC,CAAC,CAAC;MAExDzB,IAAI,GAAGC,OAAO;MACdA,OAAO,GAAGA,OAAO,CAACN,UAAU;MAC5B;MACA;IACF;IAEA;EACF;EAEA,MAAM+B,QAAQ,GAAGA,CACfC,WAA6D,EAC7DC,MAAe,KACZ;IACHvG,MAAM,CAAC2E,IAAI,EAAG6B,CAAC,IAAK;MAClB,MAAMC,IAAI,GACR,OAAOH,WAAW,KAAK,UAAU,GAAGA,WAAW,CAACE,CAAC,CAAC,GAAGF,WAAW;MAElEE,CAAC,CAACE,WAAW,CAACD,IAAI,CAAC;MAEnB,IAAIF,MAAM,KAAKC,CAAC,CAACzB,gBAAgB,CAAC,CAAC,IAAIyB,CAAC,CAACG,eAAe,CAAC,CAAC,CAAC,EAAE;QAC3DH,CAAC,CAACI,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC;MACtC;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAMC,aAAa,GAAG;IACpBC,gBAAgB,EAAEA,CAACC,cAAsB,EAAEC,QAAiB,KAC1D3H,UAAU,CAACuB,IAAI,EAAEmG,cAAc,EAAE;MAAEC;IAAS,CAAC,CAAC;IAChDC,cAAc,EAAEA,CACdlB,IAAY,EACZgB,cAAsB,EACtBC,QAAgB,GAAGjB,IAAI,KACpBzG,QAAQ,CAACsB,IAAI,EAAEmF,IAAI,EAAEgB,cAAc,EAAE;MAAEC;IAAS,CAAC;EACxD,CAAC;EAID,MAAME,UAAU,GAAG,IAAIC,KAAK,CAAa/H,CAAC,EAAgB;IACxDoC,GAAGA,CAAC4F,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE;MAC1B,IAAID,IAAI,IAAIR,aAAa,EAAE;QACzB,OAAOA,aAAa,CAACQ,IAAI,CAA+B;MAC1D;MAEA,OAAOE,OAAO,CAAC/F,GAAG,CAAC4F,MAAM,EAAEC,IAAI,EAAEC,QAAQ,CAAC;IAC5C;EACF,CAAC,CAAC;EAEF,OAAO,CAAC,GAAGrC,IAAiB,KAC1B,IAAI3B,SAAS,CACXoB,MAAM,EACNN,SAAS,EACT8C,UAAU,EACV7C,OAAO,CAACI,IAAI,CAAC+C,GAAG,IAAI,IAAI,EACxBnB,QAAQ,EACR,GAAGpB,IACL,CAAC;AACL;AAEA,SAASwC,cAAcA,CACrB7G,IAA0B,EAC1B8G,GAAW,EACX7F,QAAwB,EAChB;EACR,IAAI8F,WAA+B;EAEnC,MAAMC,MAAM,GAAGhH,IAAI,CAACiH,UAAU,CAC3BrB,CAAC,IACAA,CAAC,CAACsB,gBAAgB,CAAC,CAAC,IACpBtB,CAAC,CAACuB,mBAAmB,CAAC,CAAC,IACvBvB,CAAC,CAACwB,oBAAoB,CAAC,CAC3B,CAAC;EAED,IAAIJ,MAAM,EAAE;IACV,IAAIA,MAAM,CAACE,gBAAgB,CAAC,CAAC,EAAE;MAC7B,IAAI,MAAM,IAAIF,MAAM,CAACnD,IAAI,CAACnD,GAAG,EAAE;QAC7BqG,WAAW,GAAGC,MAAM,CAACnD,IAAI,CAACnD,GAAG,CAACyE,IAAI;MACpC,CAAC,MAAM,IAAI,OAAO,IAAI6B,MAAM,CAACnD,IAAI,CAACnD,GAAG,EAAE;QACrCqG,WAAW,GAAGC,MAAM,CAACnD,IAAI,CAACnD,GAAG,CAACoB,KAAK,CAACuF,QAAQ,CAAC,CAAC;MAChD,CAAC,MAAM;QACL,MAAMC,OAAO,GAAGN,MAAM,CAACpG,GAAG,CAAC,KAAK,CAAC;QACjCmG,WAAW,GAAG7H,SAAS,CAACoI,OAAO,CAAC;MAClC;IACF,CAAC,MAAM,IAAIN,MAAM,CAACG,mBAAmB,CAAC,CAAC,EAAE;MACvC,MAAMhC,IAAI,GAAG6B,MAAM,CAACpG,GAAG,CAAC,MAAM,CAAC;MAC/B,IAAIuE,IAAI,CAACoC,eAAe,CAAC,CAAC,EAAE;QAC1BR,WAAW,GAAG5B,IAAI,CAACtB,IAAI,CAACsB,IAAI;MAC9B;IACF,CAAC,MAAM,IAAI6B,MAAM,CAACI,oBAAoB,CAAC,CAAC,EAAE;MACxC,MAAMI,EAAE,GAAGR,MAAM,CAACpG,GAAG,CAAC,IAAI,CAAC;MAC3B,IAAI4G,EAAE,CAACvC,YAAY,CAAC,CAAC,EAAE;QACrB8B,WAAW,GAAGS,EAAE,CAAC3D,IAAI,CAACsB,IAAI;MAC5B;IACF;EACF;EAEA,IAAI,CAAC4B,WAAW,EAAE;IAChB;IACAA,WAAW,GAAG3I,QAAQ,CAAC6C,QAAQ,IAAI,SAAS,CAAC;IAE7C,IAAIA,QAAQ,IAAI,mBAAmB,CAACwG,IAAI,CAACV,WAAW,CAAC,EAAE;MACrD;MACAA,WAAW,GAAG3I,QAAQ,CAACC,OAAO,CAAC4C,QAAQ,CAAC,CAAC;IAC3C;;IAEA;IACA8F,WAAW,GAAGA,WAAW,CAACW,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;IAEpD,IAAIX,WAAW,EAAE;MACfA,WAAW,IAAID,GAAG;IACpB,CAAC,MAAM;MACL,MAAM,IAAI5G,KAAK,CACb,yEAAyE,GACvE,4BAA4B,GAC5B,2BAA2B,GAC3B,gCACJ,CAAC;IACH;EACF;EAEA,OAAO6G,WAAW;AACpB;AAEA,SAASY,eAAeA,CAAC3H,IAAc,EAAW;EAChD;EACA;EACA,IAAI4H,YAAY,GAAG,IAAI;EAEvB,MAAMZ,MAAM,GAAGhH,IAAI,CAACiH,UAAU,CAC3BrB,CAAC,IACAA,CAAC,CAACsB,gBAAgB,CAAC,CAAC,IACpBtB,CAAC,CAACuB,mBAAmB,CAAC,CAAC,IACvBvB,CAAC,CAACwB,oBAAoB,CAAC,CAC3B,CAAC;EAED,IAAIJ,MAAM,EAAE;IACV,IAAIA,MAAM,CAACI,oBAAoB,CAAC,CAAC,EAAE;MACjC,MAAMI,EAAE,GAAGR,MAAM,CAACpG,GAAG,CAAC,IAAI,CAAC;MAC3B;MACA,IAAI4G,EAAE,CAACvC,YAAY,CAAC,CAAC,EAAE;QACrB,MAAM;UAAE4C;QAAe,CAAC,GAAGL,EAAE,CAACM,KAAK,CAACC,UAAU,CAACP,EAAE,CAAC3D,IAAI,CAACsB,IAAI,CAAC,IAAI;UAC9D0C,cAAc,EAAE;QAClB,CAAC;QAEDD,YAAY,GAAGC,cAAc,CAACrI,MAAM,KAAK,CAAC;MAC5C;IACF;EACF;EAEA,OAAOoI,YAAY;AACrB;AAEA,MAAMI,QAAQ,GAAG,IAAIC,OAAO,CAAuB,CAAC;AACpD,MAAMC,YAAY,GAAIC,KAAmB,IAAK;EAC5C,MAAMC,OAAO,GAAGJ,QAAQ,CAACpH,GAAG,CAACuH,KAAK,CAAC,IAAI,CAAC;EACxCH,QAAQ,CAAClH,GAAG,CAACqH,KAAK,EAAEC,OAAO,GAAG,CAAC,CAAC;EAChC,OAAOA,OAAO;AAChB,CAAC;AAED,OAAO,SAASC,oBAAoBA,CAClC9E,OAAkB,EAClBvD,IAAuB,EACvBiB,QAAmC,EACnC8B,OAA2C,EACxB;EACnB,MAAMuF,KAAK,GAAGjJ,iBAAiB,CAC7BW,IAAI,EACJ,sBACF,CAAC;EAED,IAAI,CAACsI,KAAK,CAAC3H,GAAG,CAACX,IAAI,CAAC,EAAE;IACpB,MAAMuI,OAA0B,GAAG,IAAInI,GAAG,CAAC,CAAC;IAE5CmD,OAAO,CAACiF,OAAO,CAAE3I,CAAC,IAAK;MACrB,MAAM,CAACuD,SAAS,EAAEI,SAAS,CAAC,GAAGX,qBAAqB,CAClDhD,CAAC,EACDoB,QAAQ,EACR8B,OACF,CAAC;MACD,MAAM;QAAE0F;MAAM,CAAC,GAAG5I,CAAC;MACnB,IAAI,CAACuD,SAAS,EAAE;QACd;MACF;MAEA,IAAI+B,IAAmB,GAAG,IAAI;MAC9B,IAAIsD,KAAK,CAACxD,YAAY,CAAC,CAAC,EAAE;QACxBE,IAAI,GAAGsD,KAAK,CAAC5E,IAAI,CAACsB,IAAI;MACxB;MAEA,IAAIA,IAAI,KAAK,IAAI,IAAIsD,KAAK,CAAC9E,kBAAkB,CAAC,CAAC,EAAE;QAC/C,MAAMC,QAAQ,GAAG6E,KAAK,CAAC7H,GAAG,CAAC,UAAU,CAAC;QACtC,MAAMoE,MAAM,GAAGyD,KAAK,CAAC7H,GAAG,CAAC,QAAQ,CAAC;QAClC,IAAIgD,QAAQ,CAACqB,YAAY,CAAC,CAAC,IAAID,MAAM,CAACC,YAAY,CAAC,CAAC,EAAE;UACpDE,IAAI,GAAG,GAAGH,MAAM,CAACnB,IAAI,CAACsB,IAAI,IAAIvB,QAAQ,CAACC,IAAI,CAACsB,IAAI,EAAE;QACpD;MACF;MAEA,IAAIA,IAAI,KAAK,IAAI,EAAE;QACjB;MACF;MAEAoD,OAAO,CAACzH,GAAG,CAACqE,IAAI,EAAE,CAAC/B,SAAS,EAAEI,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF8E,KAAK,CAACxH,GAAG,CAACd,IAAI,EAAEuI,OAAO,CAAC;EAC1B;EAEA,OAAOD,KAAK,CAAC1H,GAAG,CAACZ,IAAI,CAAC;AACxB;AAEA,SAAS0I,uBAAuBA,CAC9BpF,gBAA6C,EAC7CC,OAAkB,EAClBvD,IAA0B,EAC1B2I,WAAyB,EACzB5F,OAGC,EACqB;EACtB,MAAMuF,KAAK,GAAGjJ,iBAAiB,CAC7BW,IAAI,EACJ,yBACF,CAAC;EAED,IAAI,CAACsI,KAAK,CAAC3H,GAAG,CAACX,IAAI,CAAC6D,IAAI,CAAC,EAAE;IACzB,IAAI;MACF,MAAM+E,OAAO,GAAGvF,uBAAuB,CACrCC,gBAAgB,EAChBtD,IAAI,EACJuD,OAAO,EACPR,OACF,CAAC;MACD,IAAI6F,OAAO,EAAE;QACX;QACA;QACA;QACA,MAAM9B,GAAG,GAAGoB,YAAY,CAACS,WAAW,CAAC;QAErC,MAAM5B,WAAW,GAAGF,cAAc,CAAC7G,IAAI,EAAE8G,GAAG,EAAE6B,WAAW,CAAC1H,QAAQ,CAAC;QAEnE,MAAMmC,SAAS,GAAGwF,OAAO,CACvB7B,WAAW,EACXY,eAAe,CAAC3H,IAAI,CAAC,EACrB8G,GAAG,EACH/D,OAAO,EACP4F,WACF,CAAC;QAEDL,KAAK,CAACxH,GAAG,CAACd,IAAI,CAAC6D,IAAI,EAAET,SAAS,CAAC;MACjC,CAAC,MAAM;QACLkF,KAAK,CAACxH,GAAG,CAACd,IAAI,CAAC6D,IAAI,EAAE,IAAI,CAAC;MAC5B;IACF,CAAC,CAAC,OAAOgF,CAAC,EAAE;MACV,IAAIA,CAAC,KAAKlK,aAAa,CAACmK,IAAI,EAAE;QAC5BR,KAAK,CAACxH,GAAG,CAACd,IAAI,CAAC6D,IAAI,EAAE,IAAI,CAAC;QAC1B,OAAO,IAAI;MACb;MAEA,IAAIgF,CAAC,YAAY3I,KAAK,EAAE;QACtB,MAAMH,mBAAmB,CAACC,IAAI,EAAE6I,CAAC,CAAC5I,OAAO,CAAC;MAC5C;MAEA,MAAM4I,CAAC;IACT;EACF;EAEA,OAAOP,KAAK,CAAC1H,GAAG,CAACZ,IAAI,CAAC6D,IAAI,CAAC,IAAI,IAAI;AACrC;AAEA,OAAO,SAASkF,eAAeA,CAC7B/I,IAAuB,EACvB2I,WAAyB,EACzB5F,OAGC,EACDiG,QAA4C,EAC5C;EACA,MAAMzF,OAAO,GAAGzE,wBAAwB,CAACkB,IAAI,CAAC,CAACuD,OAAO,CAACwB,MAAM,CAAChG,cAAc,CAAC;EAE7E,MAAMkK,iBAAiB,GAAGZ,oBAAoB,CAC5C9E,OAAO,EACPvD,IAAI,EACJ2I,WAAW,CAAC1H,QAAQ,EACpB8B,OACF,CAAC;EAED,MAAMmG,MAGH,GAAG,EAAE;EAERD,iBAAiB,CAACT,OAAO,CAAC,CAACpF,SAAS,EAAE+F,MAAM,KAAK;IAC/C,IAAIA,MAAM,CAACC,QAAQ,CAAC,GAAG,CAAC,EAAE;MACxB;MACA,MAAM,CAACpE,MAAM,EAAEpB,QAAQ,CAAC,GAAGuF,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC;MAC5C,MAAMC,UAAU,GAAGtJ,IAAI,CAAC8H,KAAK,CAACC,UAAU,CAAC/C,MAAM,CAAC;MAChD,IAAI,CAACsE,UAAU,EAAE;QACf;MACF;MAEAA,UAAU,CAACzB,cAAc,CAACW,OAAO,CAAE5C,CAAC,IAAK;QACvC,MAAMoB,MAAM,GAAGpB,CAAC,CAAClC,UAAU;QAC3B,IAAI,CAACsD,MAAM,EAAErD,kBAAkB,CAAC,CAAC,EAAE;UACjC;QACF;QAEA,MAAM4F,UAAU,GAAGvC,MAAM,CAACpG,GAAG,CAAC,UAAU,CAAC;QACzC,IAAI2I,UAAU,CAACtE,YAAY,CAAC;UAAEE,IAAI,EAAEvB;QAAS,CAAC,CAAC,EAAE;UAC/CsF,MAAM,CAACpJ,IAAI,CAAC;YACVyJ,UAAU;YACVnG;UACF,CAAC,CAAC;QACJ;MACF,CAAC,CAAC;MAEF;IACF;IAEApD,IAAI,CAAC8H,KAAK,CAACC,UAAU,CAACoB,MAAM,CAAC,EAAEtB,cAAc,CAACW,OAAO,CAAEe,UAAU,IAAK;MACpE,IAAIA,UAAU,CAACtE,YAAY,CAAC,CAAC,EAAE;QAC7BiE,MAAM,CAACpJ,IAAI,CAAC;UACVyJ,UAAU;UACVnG;QACF,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACA8F,MAAM,CAACM,IAAI,CACT,CAACC,CAAC,EAAEC,CAAC,KAAK,CAACD,CAAC,CAACF,UAAU,CAAC1F,IAAI,CAAC8F,KAAK,IAAI,CAAC,KAAKD,CAAC,CAACH,UAAU,CAAC1F,IAAI,CAAC8F,KAAK,IAAI,CAAC,CAC1E,CAAC;EAEDT,MAAM,CAACV,OAAO,CAAEoB,KAAK,IAAK;IACxB,MAAMtG,gBAAgB,GAAGsG,KAAK,CAACxG,SAAS;IAExC,IAAI,CAACE,gBAAgB,EAAE;MACrB;IACF;IAEA,MAAMuG,QAAQ,GAAGnB,uBAAuB,CACtCpF,gBAAgB,EAChBC,OAAO,EACPqG,KAAK,CAACL,UAAU,EAChBZ,WAAW,EACX5F,OACF,CAAC;IAED,IAAI8G,QAAQ,KAAK,IAAI,EAAE;MACrB;IACF;IAEAb,QAAQ,CAACa,QAAQ,CAAC;EACpB,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"getTagProcessor.js","names":["readFileSync","basename","dirname","join","types","t","addDefault","addNamed","BaseProcessor","findPackageJSON","syncResolve","collectExportsAndImports","explicitImport","collectTemplateDependencies","extractExpression","getSource","isNotNull","mutate","getTraversalCache","last","arr","length","zip","arr1","arr2","result","i","push","buildCodeFrameError","path","message","Error","definedTagsCache","Map","resolvedTagResolverSourceCache","didWarnSkipSymbolMismatch","getResolvedTagResolverSource","source","sourceFile","undefined","key","has","get","resolved","set","getDefinedTagsFromPackage","pkgName","filename","packageJSONPath","packageDir","packageJSON","JSON","parse","definedTags","tags","normalizedTags","Object","entries","reduce","acc","value","startsWith","require","resolve","paths","isValidProcessorClass","module","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForImport","imported","options","tagResolver","customFile","tagResolverMeta","resolvedSource","processor","getBuilderForIdentifier","definedProcessor","imports","tagSource","tagPath","parentPath","isMemberExpression","property","node","params","prev","current","isSequenceExpression","expressions","isCallExpression","callee","args","cookedArgs","map","arg","buildError","bind","isExpression","type","extracted","evaluate","filter","object","isIdentifier","computed","name","isStringLiteral","isTaggedTemplateExpression","tag","quasis","expressionValues","replacer","replacement","isPure","p","next","replaceWith","isNewExpression","addComment","importHelpers","addDefaultImport","importedSource","nameHint","addNamedImport","astService","Proxy","target","prop","receiver","Reflect","loc","getDisplayName","idx","displayName","parent","findParent","isObjectProperty","isJSXOpeningElement","isVariableDeclarator","toString","keyPath","isJSXIdentifier","id","test","replace","isTagReferenced","isReferenced","referencePaths","scope","getBinding","counters","WeakMap","getNextIndex","state","counter","getDefinedProcessors","cache","defined","forEach","local","createProcessorInstance","fileContext","builder","e","SKIP","description","console","warn","applyProcessors","callback","definedProcessors","usages","idName","includes","split","objBinding","identifier","sort","a","b","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, syncResolve } from '@wyw-in-js/shared';\nimport type {\n ExpressionValue,\n StrictOptions,\n TagResolverMeta,\n} 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 resolvedTagResolverSourceCache = new Map<string, string | undefined>();\nlet didWarnSkipSymbolMismatch = false;\n\nconst getResolvedTagResolverSource = (\n source: string,\n sourceFile: string | null | undefined\n): string | undefined => {\n if (!sourceFile) {\n return undefined;\n }\n\n const key = `${sourceFile}\\0${source}`;\n if (resolvedTagResolverSourceCache.has(key)) {\n return resolvedTagResolverSourceCache.get(key);\n }\n\n try {\n const resolved = syncResolve(source, sourceFile, []);\n resolvedTagResolverSourceCache.set(key, resolved);\n return resolved;\n } catch {\n resolvedTagResolverSourceCache.set(key, undefined);\n return undefined;\n }\n};\n\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;\n\n let customFile: string | null = null;\n if (tagResolver) {\n const tagResolverMeta: TagResolverMeta = {\n sourceFile: filename,\n resolvedSource: getResolvedTagResolverSource(source, filename),\n };\n\n customFile = tagResolver(source, imported, tagResolverMeta);\n }\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 = (\n replacement: Expression | ((tagPath: NodePath) => Expression),\n isPure: boolean\n ) => {\n mutate(prev, (p) => {\n const next =\n typeof replacement === 'function' ? replacement(p) : replacement;\n\n p.replaceWith(next);\n\n if (isPure && (p.isCallExpression() || p.isNewExpression())) {\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 } = id.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' | 'extensions' | '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 (\n typeof e === 'symbol' &&\n e.description === BaseProcessor.SKIP.description\n ) {\n if (!didWarnSkipSymbolMismatch) {\n didWarnSkipSymbolMismatch = true;\n // eslint-disable-next-line no-console\n console.warn(\n [\n \"[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.\",\n 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',\n 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',\n ].join('\\n')\n );\n }\n\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' | 'extensions' | '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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","ignoreList":[]}
@@ -17,9 +17,16 @@ const isGlobal = id => {
17
17
  return !scope.hasBinding(name) && scope.hasGlobal(name);
18
18
  };
19
19
  const ssrCheckFields = new Set(['document', 'location', 'navigator', 'sessionStorage', 'localStorage', 'window']);
20
- const forbiddenGlobals = new Set([...ssrCheckFields, '$RefreshReg$', 'XMLHttpRequest', 'clearImmediate', 'clearInterval', 'clearTimeout', 'fetch', 'navigator', 'setImmediate', 'setInterval', 'setTimeout']);
20
+ const forbiddenGlobals = new Set([...ssrCheckFields, '$RefreshReg$', '$RefreshSig$', 'XMLHttpRequest', 'clearImmediate', 'clearInterval', 'clearTimeout', 'fetch', 'navigator', 'setImmediate', 'setInterval', 'setTimeout']);
21
+ const alwaysForbiddenIdentifiers = new Set(['$RefreshReg$', '$RefreshSig$']);
21
22
  const isBrowserGlobal = id => {
22
- return forbiddenGlobals.has(id.node.name) && isGlobal(id);
23
+ const {
24
+ name
25
+ } = id.node;
26
+ if (alwaysForbiddenIdentifiers.has(name)) {
27
+ return nonType(id);
28
+ }
29
+ return forbiddenGlobals.has(name) && isGlobal(id);
23
30
  };
24
31
  const isSSRCheckField = id => {
25
32
  return ssrCheckFields.has(id.node.name) && isGlobal(id);
@@ -1 +1 @@
1
- {"version":3,"file":"removeDangerousCode.js","names":["types","t","nonType","isUnnecessaryReactCall","applyAction","removeWithRelated","JSXElementsRemover","collectExportsAndImports","isGlobal","id","scope","name","node","hasBinding","hasGlobal","ssrCheckFields","Set","forbiddenGlobals","isBrowserGlobal","has","isSSRCheckField","promiseCallbackMethods","getPropertyName","path","isIdentifier","isStringLiteral","value","isPromiseCallbackArgument","ref","get","some","arg","isAncestor","findPromiseCallbackOwner","owner","findParent","parent","isNewExpression","callee","isCallExpression","isMemberExpression","propName","removeForbiddenGlobal","promiseOwner","getImport","programPath","p","isProgram","undefined","imports","binding","getBinding","matched","find","imp","imported","local","source","leftPath","rightPath","getTypeImport","isImportSpecifier","parentPath","isImportDeclaration","importDeclaration","importedNode","isTSQualifiedName","isImportDefaultSpecifier","isImportNamespaceSpecifier","isTypeMatch","typeAnnotation","isTSTypeAnnotation","typeReference","isTSTypeReference","typeName","matchedImport","includes","isHOC","hocs","calleePath","defaultPlaceholder","defaultReactComponentTypes","removeDangerousCode","options","componentTypes","react","Array","isArray","idx","indexOf","splice","traverse","CallExpression","enter","arrowFunctionExpression","nullLiteral","JSXElement","JSXFragment","MemberExpression","state","obj","prop","windowScoped","add","globals","filter","MetaProperty","Identifier","isUnaryExpression","operator","isTSTypeQuery","isClassProperty","key","push","UnaryExpression","type","VariableDeclarator","init","isExpression"],"sources":["../../src/utils/removeDangerousCode.ts"],"sourcesContent":["import type { NodePath } from '@babel/core';\nimport { types as t } from '@babel/core';\nimport type {\n CallExpression,\n Expression,\n Identifier,\n NewExpression,\n Program,\n V8IntrinsicIdentifier,\n} from '@babel/types';\n\nimport type { CodeRemoverOptions } from '@wyw-in-js/shared';\nimport { nonType } from './findIdentifiers';\nimport { isUnnecessaryReactCall } from './isUnnecessaryReactCall';\nimport { applyAction, removeWithRelated } from './scopeHelpers';\nimport { JSXElementsRemover } from './visitors/JSXElementsRemover';\nimport type { IImport } from './collectExportsAndImports';\nimport { collectExportsAndImports } from './collectExportsAndImports';\n\nconst isGlobal = (id: NodePath<Identifier>): boolean => {\n if (!nonType(id)) {\n return false;\n }\n\n const { scope } = id;\n const { name } = id.node;\n return !scope.hasBinding(name) && scope.hasGlobal(name);\n};\n\nconst ssrCheckFields = new Set([\n 'document',\n 'location',\n 'navigator',\n 'sessionStorage',\n 'localStorage',\n 'window',\n]);\n\nconst forbiddenGlobals = new Set([\n ...ssrCheckFields,\n '$RefreshReg$',\n 'XMLHttpRequest',\n 'clearImmediate',\n 'clearInterval',\n 'clearTimeout',\n 'fetch',\n 'navigator',\n 'setImmediate',\n 'setInterval',\n 'setTimeout',\n]);\n\nconst isBrowserGlobal = (id: NodePath<Identifier>) => {\n return forbiddenGlobals.has(id.node.name) && isGlobal(id);\n};\n\nconst isSSRCheckField = (id: NodePath<Identifier>) => {\n return ssrCheckFields.has(id.node.name) && isGlobal(id);\n};\n\nconst promiseCallbackMethods = new Set(['then', 'catch', 'finally']);\n\nconst getPropertyName = (path: NodePath): string | null => {\n if (path.isIdentifier()) {\n return path.node.name;\n }\n\n if (path.isStringLiteral()) {\n return path.node.value;\n }\n\n return null;\n};\n\nconst isPromiseCallbackArgument = (\n path: NodePath<CallExpression | NewExpression>,\n ref: NodePath\n) => {\n return path\n .get('arguments')\n .some((arg) => arg === ref || arg.isAncestor(ref));\n};\n\nconst findPromiseCallbackOwner = (\n path: NodePath\n): NodePath<CallExpression | NewExpression> | null => {\n const owner = path.findParent((parent) => {\n if (parent.isNewExpression()) {\n const callee = parent.get('callee');\n return (\n callee.isIdentifier({ name: 'Promise' }) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n if (parent.isCallExpression()) {\n const callee = parent.get('callee');\n if (!callee.isMemberExpression()) return false;\n const propName = getPropertyName(callee.get('property'));\n return (\n propName !== null &&\n promiseCallbackMethods.has(propName) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n return false;\n });\n\n return owner as NodePath<CallExpression | NewExpression> | null;\n};\n\nconst removeForbiddenGlobal = (path: NodePath) => {\n const promiseOwner = findPromiseCallbackOwner(path);\n if (promiseOwner) {\n removeWithRelated([promiseOwner]);\n } else {\n removeWithRelated([path]);\n }\n};\n\nconst getImport = (path: NodePath): [string, string] | undefined => {\n const programPath = path.findParent((p) => p.isProgram()) as\n | NodePath<Program>\n | undefined;\n if (!programPath) {\n return undefined;\n }\n\n const { imports } = collectExportsAndImports(programPath);\n\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, matched.imported];\n }\n }\n\n if (path.isMemberExpression()) {\n const leftPath = path.get('object');\n if (!leftPath.isIdentifier()) {\n // Nested member expression. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('property');\n if (!rightPath.isIdentifier()) {\n return undefined;\n }\n\n const binding = path.scope.getBinding(leftPath.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, rightPath.node.name];\n }\n }\n\n return undefined;\n};\n\nconst getTypeImport = (path: NodePath): [string, string] | undefined => {\n // We are looking for either Identifier or TSQualifiedName in path\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n !binding.path.isImportSpecifier() ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n const importDeclaration = binding.path.parentPath;\n const imported = binding.path.get('imported');\n const source = importDeclaration.node.source.value;\n const importedNode = imported.node;\n return [\n source,\n t.isIdentifier(importedNode) ? importedNode.name : importedNode.value,\n ];\n }\n\n if (path.isTSQualifiedName()) {\n const leftPath = path.get('left');\n if (!leftPath.isIdentifier()) {\n // Nested type. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('right');\n\n const binding = path.scope.getBinding(leftPath.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n (!binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()) ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n return [binding.path.parentPath.node.source.value, rightPath.node.name];\n }\n\n return undefined;\n};\n\nconst isTypeMatch = (\n id: NodePath<Identifier>,\n types: Record<string, string[]>\n): boolean => {\n const typeAnnotation = id.get('typeAnnotation');\n if (!typeAnnotation.isTSTypeAnnotation()) {\n return false;\n }\n\n const typeReference = typeAnnotation.get('typeAnnotation');\n if (!typeReference.isTSTypeReference()) {\n return false;\n }\n\n const typeName = typeReference.get('typeName');\n const matchedImport = getTypeImport(typeName);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in types &&\n types[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst isHOC = (\n path: NodePath<CallExpression>,\n hocs: Record<string, string[]>\n) => {\n let calleePath: NodePath<V8IntrinsicIdentifier | Expression> = path;\n while (calleePath.isCallExpression()) {\n calleePath = calleePath.get('callee');\n }\n\n const matchedImport = getImport(calleePath);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in hocs &&\n hocs[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst defaultPlaceholder = '...';\n\nconst defaultReactComponentTypes = [\n 'ExoticComponent',\n 'FC',\n 'ForwardRefExoticComponent',\n 'FunctionComponent',\n 'LazyExoticComponent',\n 'MemoExoticComponent',\n 'NamedExoticComponent',\n];\n\nexport const removeDangerousCode = (\n programPath: NodePath<Program>,\n options?: CodeRemoverOptions\n) => {\n const hocs = options?.hocs ?? {};\n\n const componentTypes = options?.componentTypes ?? {\n react: [defaultPlaceholder],\n };\n\n if (\n Array.isArray(componentTypes.react) &&\n componentTypes.react.includes(defaultPlaceholder)\n ) {\n const idx = componentTypes.react.indexOf(defaultPlaceholder);\n componentTypes.react = [...componentTypes.react];\n componentTypes.react.splice(idx, 1, ...defaultReactComponentTypes);\n }\n\n programPath.traverse(\n {\n // JSX can be replaced with a dummy value,\n // but we have to do it after we processed template tags.\n CallExpression: {\n enter(p) {\n if (isUnnecessaryReactCall(p)) {\n JSXElementsRemover(p);\n }\n\n if (isHOC(p, hocs)) {\n applyAction([\n 'replace',\n p,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n JSXElement: {\n enter: JSXElementsRemover,\n },\n JSXFragment: {\n enter: JSXElementsRemover,\n },\n MemberExpression(p, state) {\n const obj = p.get('object');\n const prop = p.get('property');\n if (!obj.isIdentifier({ name: 'window' })) {\n return;\n }\n\n const name = getPropertyName(prop);\n if (!name) {\n return;\n }\n\n state.windowScoped.add(name);\n // eslint-disable-next-line no-param-reassign\n state.globals = state.globals.filter((id) => {\n if (id.node.name === name) {\n removeWithRelated([id]);\n return false;\n }\n\n return true;\n });\n },\n MetaProperty(p) {\n // Remove all references to `import.meta`\n removeWithRelated([p]);\n },\n Identifier(p, state) {\n if (p.find((parent) => parent.isTSTypeReference())) {\n // don't mess with TS type references\n return;\n }\n if (isBrowserGlobal(p)) {\n if (\n p.find(\n (parentPath) =>\n parentPath.isUnaryExpression({ operator: 'typeof' }) ||\n parentPath.isTSTypeQuery()\n )\n ) {\n // Ignore `typeof window` expressions\n return;\n }\n\n if (p.parentPath.isClassProperty()) {\n // ignore class property decls\n return;\n }\n if (p.parentPath.isMemberExpression() && p.key === 'property') {\n // ignore e.g this.fetch()\n // window.fetch will be handled by the windowScoped block below\n return;\n }\n\n removeForbiddenGlobal(p);\n\n return;\n }\n\n if (state.windowScoped.has(p.node.name)) {\n removeForbiddenGlobal(p);\n } else if (isGlobal(p)) {\n state.globals.push(p);\n }\n },\n\n // Since we can use happy-dom, typical SSR checks may not work as expected.\n // We need to detect them and replace with an \"undefined\" literal.\n UnaryExpression(p) {\n if (p.node.operator !== 'typeof') {\n return;\n }\n const arg = p.get('argument');\n if (!arg.isIdentifier() || !isSSRCheckField(arg)) {\n return;\n }\n\n applyAction([\n 'replace',\n p,\n { type: 'StringLiteral', value: 'undefined' },\n ]);\n },\n VariableDeclarator(p) {\n const id = p.get('id');\n const init = p.get('init');\n if (\n id.isIdentifier() &&\n isTypeMatch(id, componentTypes) &&\n init.isExpression()\n ) {\n // Variable is typed as a React component. We can replace its value with a null-function.\n applyAction([\n 'replace',\n init,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n {\n globals: [] as NodePath<Identifier>[],\n windowScoped: new Set<string>(),\n }\n );\n};\n"],"mappings":"AACA,SAASA,KAAK,IAAIC,CAAC,QAAQ,aAAa;AAWxC,SAASC,OAAO,QAAQ,mBAAmB;AAC3C,SAASC,sBAAsB,QAAQ,0BAA0B;AACjE,SAASC,WAAW,EAAEC,iBAAiB,QAAQ,gBAAgB;AAC/D,SAASC,kBAAkB,QAAQ,+BAA+B;AAElE,SAASC,wBAAwB,QAAQ,4BAA4B;AAErE,MAAMC,QAAQ,GAAIC,EAAwB,IAAc;EACtD,IAAI,CAACP,OAAO,CAACO,EAAE,CAAC,EAAE;IAChB,OAAO,KAAK;EACd;EAEA,MAAM;IAAEC;EAAM,CAAC,GAAGD,EAAE;EACpB,MAAM;IAAEE;EAAK,CAAC,GAAGF,EAAE,CAACG,IAAI;EACxB,OAAO,CAACF,KAAK,CAACG,UAAU,CAACF,IAAI,CAAC,IAAID,KAAK,CAACI,SAAS,CAACH,IAAI,CAAC;AACzD,CAAC;AAED,MAAMI,cAAc,GAAG,IAAIC,GAAG,CAAC,CAC7B,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,QAAQ,CACT,CAAC;AAEF,MAAMC,gBAAgB,GAAG,IAAID,GAAG,CAAC,CAC/B,GAAGD,cAAc,EACjB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,OAAO,EACP,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,CACb,CAAC;AAEF,MAAMG,eAAe,GAAIT,EAAwB,IAAK;EACpD,OAAOQ,gBAAgB,CAACE,GAAG,CAACV,EAAE,CAACG,IAAI,CAACD,IAAI,CAAC,IAAIH,QAAQ,CAACC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAMW,eAAe,GAAIX,EAAwB,IAAK;EACpD,OAAOM,cAAc,CAACI,GAAG,CAACV,EAAE,CAACG,IAAI,CAACD,IAAI,CAAC,IAAIH,QAAQ,CAACC,EAAE,CAAC;AACzD,CAAC;AAED,MAAMY,sBAAsB,GAAG,IAAIL,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAEpE,MAAMM,eAAe,GAAIC,IAAc,IAAoB;EACzD,IAAIA,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,OAAOD,IAAI,CAACX,IAAI,CAACD,IAAI;EACvB;EAEA,IAAIY,IAAI,CAACE,eAAe,CAAC,CAAC,EAAE;IAC1B,OAAOF,IAAI,CAACX,IAAI,CAACc,KAAK;EACxB;EAEA,OAAO,IAAI;AACb,CAAC;AAED,MAAMC,yBAAyB,GAAGA,CAChCJ,IAA8C,EAC9CK,GAAa,KACV;EACH,OAAOL,IAAI,CACRM,GAAG,CAAC,WAAW,CAAC,CAChBC,IAAI,CAAEC,GAAG,IAAKA,GAAG,KAAKH,GAAG,IAAIG,GAAG,CAACC,UAAU,CAACJ,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAMK,wBAAwB,GAC5BV,IAAc,IACsC;EACpD,MAAMW,KAAK,GAAGX,IAAI,CAACY,UAAU,CAAEC,MAAM,IAAK;IACxC,IAAIA,MAAM,CAACC,eAAe,CAAC,CAAC,EAAE;MAC5B,MAAMC,MAAM,GAAGF,MAAM,CAACP,GAAG,CAAC,QAAQ,CAAC;MACnC,OACES,MAAM,CAACd,YAAY,CAAC;QAAEb,IAAI,EAAE;MAAU,CAAC,CAAC,IACxCgB,yBAAyB,CAACS,MAAM,EAAEb,IAAI,CAAC;IAE3C;IAEA,IAAIa,MAAM,CAACG,gBAAgB,CAAC,CAAC,EAAE;MAC7B,MAAMD,MAAM,GAAGF,MAAM,CAACP,GAAG,CAAC,QAAQ,CAAC;MACnC,IAAI,CAACS,MAAM,CAACE,kBAAkB,CAAC,CAAC,EAAE,OAAO,KAAK;MAC9C,MAAMC,QAAQ,GAAGnB,eAAe,CAACgB,MAAM,CAACT,GAAG,CAAC,UAAU,CAAC,CAAC;MACxD,OACEY,QAAQ,KAAK,IAAI,IACjBpB,sBAAsB,CAACF,GAAG,CAACsB,QAAQ,CAAC,IACpCd,yBAAyB,CAACS,MAAM,EAAEb,IAAI,CAAC;IAE3C;IAEA,OAAO,KAAK;EACd,CAAC,CAAC;EAEF,OAAOW,KAAK;AACd,CAAC;AAED,MAAMQ,qBAAqB,GAAInB,IAAc,IAAK;EAChD,MAAMoB,YAAY,GAAGV,wBAAwB,CAACV,IAAI,CAAC;EACnD,IAAIoB,YAAY,EAAE;IAChBtC,iBAAiB,CAAC,CAACsC,YAAY,CAAC,CAAC;EACnC,CAAC,MAAM;IACLtC,iBAAiB,CAAC,CAACkB,IAAI,CAAC,CAAC;EAC3B;AACF,CAAC;AAED,MAAMqB,SAAS,GAAIrB,IAAc,IAAmC;EAClE,MAAMsB,WAAW,GAAGtB,IAAI,CAACY,UAAU,CAAEW,CAAC,IAAKA,CAAC,CAACC,SAAS,CAAC,CAAC,CAE3C;EACb,IAAI,CAACF,WAAW,EAAE;IAChB,OAAOG,SAAS;EAClB;EAEA,MAAM;IAAEC;EAAQ,CAAC,GAAG1C,wBAAwB,CAACsC,WAAW,CAAC;EAEzD,IAAItB,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,MAAM0B,OAAO,GAAG3B,IAAI,CAACb,KAAK,CAACyC,UAAU,CAAC5B,IAAI,CAACX,IAAI,CAACD,IAAI,CAAC;IACrD,MAAMyC,OAAO,GACXF,OAAO,IACPD,OAAO,CAACI,IAAI,CACTC,GAAG,IACFA,GAAG,CAACC,QAAQ,KAAK,aAAa,IAAIL,OAAO,CAAC3B,IAAI,CAACS,UAAU,CAACsB,GAAG,CAACE,KAAK,CACvE,CAAC;IAEH,IAAIJ,OAAO,EAAE;MACX,OAAO,CAACA,OAAO,CAACK,MAAM,EAAEL,OAAO,CAACG,QAAQ,CAAC;IAC3C;EACF;EAEA,IAAIhC,IAAI,CAACiB,kBAAkB,CAAC,CAAC,EAAE;IAC7B,MAAMkB,QAAQ,GAAGnC,IAAI,CAACM,GAAG,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC6B,QAAQ,CAAClC,YAAY,CAAC,CAAC,EAAE;MAC5B;MACA,OAAOwB,SAAS;IAClB;IAEA,MAAMW,SAAS,GAAGpC,IAAI,CAACM,GAAG,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC8B,SAAS,CAACnC,YAAY,CAAC,CAAC,EAAE;MAC7B,OAAOwB,SAAS;IAClB;IAEA,MAAME,OAAO,GAAG3B,IAAI,CAACb,KAAK,CAACyC,UAAU,CAACO,QAAQ,CAAC9C,IAAI,CAACD,IAAI,CAAC;IACzD,MAAMyC,OAAO,GACXF,OAAO,IACPD,OAAO,CAACI,IAAI,CACTC,GAAG,IACFA,GAAG,CAACC,QAAQ,KAAK,aAAa,IAAIL,OAAO,CAAC3B,IAAI,CAACS,UAAU,CAACsB,GAAG,CAACE,KAAK,CACvE,CAAC;IAEH,IAAIJ,OAAO,EAAE;MACX,OAAO,CAACA,OAAO,CAACK,MAAM,EAAEE,SAAS,CAAC/C,IAAI,CAACD,IAAI,CAAC;IAC9C;EACF;EAEA,OAAOqC,SAAS;AAClB,CAAC;AAED,MAAMY,aAAa,GAAIrC,IAAc,IAAmC;EACtE;EACA,IAAIA,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,MAAM0B,OAAO,GAAG3B,IAAI,CAACb,KAAK,CAACyC,UAAU,CAAC5B,IAAI,CAACX,IAAI,CAACD,IAAI,CAAC;IACrD,IAAI,CAACuC,OAAO,EAAE;MACZ,OAAOF,SAAS;IAClB;IAEA,IACE,CAACE,OAAO,CAAC3B,IAAI,CAACsC,iBAAiB,CAAC,CAAC,IACjC,CAACX,OAAO,CAAC3B,IAAI,CAACuC,UAAU,CAACC,mBAAmB,CAAC,CAAC,EAC9C;MACA,OAAOf,SAAS;IAClB;IAEA,MAAMgB,iBAAiB,GAAGd,OAAO,CAAC3B,IAAI,CAACuC,UAAU;IACjD,MAAMP,QAAQ,GAAGL,OAAO,CAAC3B,IAAI,CAACM,GAAG,CAAC,UAAU,CAAC;IAC7C,MAAM4B,MAAM,GAAGO,iBAAiB,CAACpD,IAAI,CAAC6C,MAAM,CAAC/B,KAAK;IAClD,MAAMuC,YAAY,GAAGV,QAAQ,CAAC3C,IAAI;IAClC,OAAO,CACL6C,MAAM,EACNxD,CAAC,CAACuB,YAAY,CAACyC,YAAY,CAAC,GAAGA,YAAY,CAACtD,IAAI,GAAGsD,YAAY,CAACvC,KAAK,CACtE;EACH;EAEA,IAAIH,IAAI,CAAC2C,iBAAiB,CAAC,CAAC,EAAE;IAC5B,MAAMR,QAAQ,GAAGnC,IAAI,CAACM,GAAG,CAAC,MAAM,CAAC;IACjC,IAAI,CAAC6B,QAAQ,CAAClC,YAAY,CAAC,CAAC,EAAE;MAC5B;MACA,OAAOwB,SAAS;IAClB;IAEA,MAAMW,SAAS,GAAGpC,IAAI,CAACM,GAAG,CAAC,OAAO,CAAC;IAEnC,MAAMqB,OAAO,GAAG3B,IAAI,CAACb,KAAK,CAACyC,UAAU,CAACO,QAAQ,CAAC9C,IAAI,CAACD,IAAI,CAAC;IACzD,IAAI,CAACuC,OAAO,EAAE;MACZ,OAAOF,SAAS;IAClB;IAEA,IACG,CAACE,OAAO,CAAC3B,IAAI,CAAC4C,wBAAwB,CAAC,CAAC,IACvC,CAACjB,OAAO,CAAC3B,IAAI,CAAC6C,0BAA0B,CAAC,CAAC,IAC5C,CAAClB,OAAO,CAAC3B,IAAI,CAACuC,UAAU,CAACC,mBAAmB,CAAC,CAAC,EAC9C;MACA,OAAOf,SAAS;IAClB;IAEA,OAAO,CAACE,OAAO,CAAC3B,IAAI,CAACuC,UAAU,CAAClD,IAAI,CAAC6C,MAAM,CAAC/B,KAAK,EAAEiC,SAAS,CAAC/C,IAAI,CAACD,IAAI,CAAC;EACzE;EAEA,OAAOqC,SAAS;AAClB,CAAC;AAED,MAAMqB,WAAW,GAAGA,CAClB5D,EAAwB,EACxBT,KAA+B,KACnB;EACZ,MAAMsE,cAAc,GAAG7D,EAAE,CAACoB,GAAG,CAAC,gBAAgB,CAAC;EAC/C,IAAI,CAACyC,cAAc,CAACC,kBAAkB,CAAC,CAAC,EAAE;IACxC,OAAO,KAAK;EACd;EAEA,MAAMC,aAAa,GAAGF,cAAc,CAACzC,GAAG,CAAC,gBAAgB,CAAC;EAC1D,IAAI,CAAC2C,aAAa,CAACC,iBAAiB,CAAC,CAAC,EAAE;IACtC,OAAO,KAAK;EACd;EAEA,MAAMC,QAAQ,GAAGF,aAAa,CAAC3C,GAAG,CAAC,UAAU,CAAC;EAC9C,MAAM8C,aAAa,GAAGf,aAAa,CAACc,QAAQ,CAAC;EAC7C,OACEC,aAAa,KAAK3B,SAAS,IAC3B2B,aAAa,CAAC,CAAC,CAAC,IAAI3E,KAAK,IACzBA,KAAK,CAAC2E,aAAa,CAAC,CAAC,CAAC,CAAC,CAACC,QAAQ,CAACD,aAAa,CAAC,CAAC,CAAC,CAAC;AAEtD,CAAC;AAED,MAAME,KAAK,GAAGA,CACZtD,IAA8B,EAC9BuD,IAA8B,KAC3B;EACH,IAAIC,UAAwD,GAAGxD,IAAI;EACnE,OAAOwD,UAAU,CAACxC,gBAAgB,CAAC,CAAC,EAAE;IACpCwC,UAAU,GAAGA,UAAU,CAAClD,GAAG,CAAC,QAAQ,CAAC;EACvC;EAEA,MAAM8C,aAAa,GAAG/B,SAAS,CAACmC,UAAU,CAAC;EAC3C,OACEJ,aAAa,KAAK3B,SAAS,IAC3B2B,aAAa,CAAC,CAAC,CAAC,IAAIG,IAAI,IACxBA,IAAI,CAACH,aAAa,CAAC,CAAC,CAAC,CAAC,CAACC,QAAQ,CAACD,aAAa,CAAC,CAAC,CAAC,CAAC;AAErD,CAAC;AAED,MAAMK,kBAAkB,GAAG,KAAK;AAEhC,MAAMC,0BAA0B,GAAG,CACjC,iBAAiB,EACjB,IAAI,EACJ,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,CACvB;AAED,OAAO,MAAMC,mBAAmB,GAAGA,CACjCrC,WAA8B,EAC9BsC,OAA4B,KACzB;EACH,MAAML,IAAI,GAAGK,OAAO,EAAEL,IAAI,IAAI,CAAC,CAAC;EAEhC,MAAMM,cAAc,GAAGD,OAAO,EAAEC,cAAc,IAAI;IAChDC,KAAK,EAAE,CAACL,kBAAkB;EAC5B,CAAC;EAED,IACEM,KAAK,CAACC,OAAO,CAACH,cAAc,CAACC,KAAK,CAAC,IACnCD,cAAc,CAACC,KAAK,CAACT,QAAQ,CAACI,kBAAkB,CAAC,EACjD;IACA,MAAMQ,GAAG,GAAGJ,cAAc,CAACC,KAAK,CAACI,OAAO,CAACT,kBAAkB,CAAC;IAC5DI,cAAc,CAACC,KAAK,GAAG,CAAC,GAAGD,cAAc,CAACC,KAAK,CAAC;IAChDD,cAAc,CAACC,KAAK,CAACK,MAAM,CAACF,GAAG,EAAE,CAAC,EAAE,GAAGP,0BAA0B,CAAC;EACpE;EAEApC,WAAW,CAAC8C,QAAQ,CAClB;IACE;IACA;IACAC,cAAc,EAAE;MACdC,KAAKA,CAAC/C,CAAC,EAAE;QACP,IAAI3C,sBAAsB,CAAC2C,CAAC,CAAC,EAAE;UAC7BxC,kBAAkB,CAACwC,CAAC,CAAC;QACvB;QAEA,IAAI+B,KAAK,CAAC/B,CAAC,EAAEgC,IAAI,CAAC,EAAE;UAClB1E,WAAW,CAAC,CACV,SAAS,EACT0C,CAAC,EACD7C,CAAC,CAAC6F,uBAAuB,CAAC,EAAE,EAAE7F,CAAC,CAAC8F,WAAW,CAAC,CAAC,CAAC,CAC/C,CAAC;QACJ;MACF;IACF,CAAC;IACDC,UAAU,EAAE;MACVH,KAAK,EAAEvF;IACT,CAAC;IACD2F,WAAW,EAAE;MACXJ,KAAK,EAAEvF;IACT,CAAC;IACD4F,gBAAgBA,CAACpD,CAAC,EAAEqD,KAAK,EAAE;MACzB,MAAMC,GAAG,GAAGtD,CAAC,CAACjB,GAAG,CAAC,QAAQ,CAAC;MAC3B,MAAMwE,IAAI,GAAGvD,CAAC,CAACjB,GAAG,CAAC,UAAU,CAAC;MAC9B,IAAI,CAACuE,GAAG,CAAC5E,YAAY,CAAC;QAAEb,IAAI,EAAE;MAAS,CAAC,CAAC,EAAE;QACzC;MACF;MAEA,MAAMA,IAAI,GAAGW,eAAe,CAAC+E,IAAI,CAAC;MAClC,IAAI,CAAC1F,IAAI,EAAE;QACT;MACF;MAEAwF,KAAK,CAACG,YAAY,CAACC,GAAG,CAAC5F,IAAI,CAAC;MAC5B;MACAwF,KAAK,CAACK,OAAO,GAAGL,KAAK,CAACK,OAAO,CAACC,MAAM,CAAEhG,EAAE,IAAK;QAC3C,IAAIA,EAAE,CAACG,IAAI,CAACD,IAAI,KAAKA,IAAI,EAAE;UACzBN,iBAAiB,CAAC,CAACI,EAAE,CAAC,CAAC;UACvB,OAAO,KAAK;QACd;QAEA,OAAO,IAAI;MACb,CAAC,CAAC;IACJ,CAAC;IACDiG,YAAYA,CAAC5D,CAAC,EAAE;MACd;MACAzC,iBAAiB,CAAC,CAACyC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD6D,UAAUA,CAAC7D,CAAC,EAAEqD,KAAK,EAAE;MACnB,IAAIrD,CAAC,CAACO,IAAI,CAAEjB,MAAM,IAAKA,MAAM,CAACqC,iBAAiB,CAAC,CAAC,CAAC,EAAE;QAClD;QACA;MACF;MACA,IAAIvD,eAAe,CAAC4B,CAAC,CAAC,EAAE;QACtB,IACEA,CAAC,CAACO,IAAI,CACHS,UAAU,IACTA,UAAU,CAAC8C,iBAAiB,CAAC;UAAEC,QAAQ,EAAE;QAAS,CAAC,CAAC,IACpD/C,UAAU,CAACgD,aAAa,CAAC,CAC7B,CAAC,EACD;UACA;UACA;QACF;QAEA,IAAIhE,CAAC,CAACgB,UAAU,CAACiD,eAAe,CAAC,CAAC,EAAE;UAClC;UACA;QACF;QACA,IAAIjE,CAAC,CAACgB,UAAU,CAACtB,kBAAkB,CAAC,CAAC,IAAIM,CAAC,CAACkE,GAAG,KAAK,UAAU,EAAE;UAC7D;UACA;UACA;QACF;QAEAtE,qBAAqB,CAACI,CAAC,CAAC;QAExB;MACF;MAEA,IAAIqD,KAAK,CAACG,YAAY,CAACnF,GAAG,CAAC2B,CAAC,CAAClC,IAAI,CAACD,IAAI,CAAC,EAAE;QACvC+B,qBAAqB,CAACI,CAAC,CAAC;MAC1B,CAAC,MAAM,IAAItC,QAAQ,CAACsC,CAAC,CAAC,EAAE;QACtBqD,KAAK,CAACK,OAAO,CAACS,IAAI,CAACnE,CAAC,CAAC;MACvB;IACF,CAAC;IAED;IACA;IACAoE,eAAeA,CAACpE,CAAC,EAAE;MACjB,IAAIA,CAAC,CAAClC,IAAI,CAACiG,QAAQ,KAAK,QAAQ,EAAE;QAChC;MACF;MACA,MAAM9E,GAAG,GAAGe,CAAC,CAACjB,GAAG,CAAC,UAAU,CAAC;MAC7B,IAAI,CAACE,GAAG,CAACP,YAAY,CAAC,CAAC,IAAI,CAACJ,eAAe,CAACW,GAAG,CAAC,EAAE;QAChD;MACF;MAEA3B,WAAW,CAAC,CACV,SAAS,EACT0C,CAAC,EACD;QAAEqE,IAAI,EAAE,eAAe;QAAEzF,KAAK,EAAE;MAAY,CAAC,CAC9C,CAAC;IACJ,CAAC;IACD0F,kBAAkBA,CAACtE,CAAC,EAAE;MACpB,MAAMrC,EAAE,GAAGqC,CAAC,CAACjB,GAAG,CAAC,IAAI,CAAC;MACtB,MAAMwF,IAAI,GAAGvE,CAAC,CAACjB,GAAG,CAAC,MAAM,CAAC;MAC1B,IACEpB,EAAE,CAACe,YAAY,CAAC,CAAC,IACjB6C,WAAW,CAAC5D,EAAE,EAAE2E,cAAc,CAAC,IAC/BiC,IAAI,CAACC,YAAY,CAAC,CAAC,EACnB;QACA;QACAlH,WAAW,CAAC,CACV,SAAS,EACTiH,IAAI,EACJpH,CAAC,CAAC6F,uBAAuB,CAAC,EAAE,EAAE7F,CAAC,CAAC8F,WAAW,CAAC,CAAC,CAAC,CAC/C,CAAC;MACJ;IACF;EACF,CAAC,EACD;IACES,OAAO,EAAE,EAA4B;IACrCF,YAAY,EAAE,IAAItF,GAAG,CAAS;EAChC,CACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"removeDangerousCode.js","names":["types","t","nonType","isUnnecessaryReactCall","applyAction","removeWithRelated","JSXElementsRemover","collectExportsAndImports","isGlobal","id","scope","name","node","hasBinding","hasGlobal","ssrCheckFields","Set","forbiddenGlobals","alwaysForbiddenIdentifiers","isBrowserGlobal","has","isSSRCheckField","promiseCallbackMethods","getPropertyName","path","isIdentifier","isStringLiteral","value","isPromiseCallbackArgument","ref","get","some","arg","isAncestor","findPromiseCallbackOwner","owner","findParent","parent","isNewExpression","callee","isCallExpression","isMemberExpression","propName","removeForbiddenGlobal","promiseOwner","getImport","programPath","p","isProgram","undefined","imports","binding","getBinding","matched","find","imp","imported","local","source","leftPath","rightPath","getTypeImport","isImportSpecifier","parentPath","isImportDeclaration","importDeclaration","importedNode","isTSQualifiedName","isImportDefaultSpecifier","isImportNamespaceSpecifier","isTypeMatch","typeAnnotation","isTSTypeAnnotation","typeReference","isTSTypeReference","typeName","matchedImport","includes","isHOC","hocs","calleePath","defaultPlaceholder","defaultReactComponentTypes","removeDangerousCode","options","componentTypes","react","Array","isArray","idx","indexOf","splice","traverse","CallExpression","enter","arrowFunctionExpression","nullLiteral","JSXElement","JSXFragment","MemberExpression","state","obj","prop","windowScoped","add","globals","filter","MetaProperty","Identifier","isUnaryExpression","operator","isTSTypeQuery","isClassProperty","key","push","UnaryExpression","type","VariableDeclarator","init","isExpression"],"sources":["../../src/utils/removeDangerousCode.ts"],"sourcesContent":["import type { NodePath } from '@babel/core';\nimport { types as t } from '@babel/core';\nimport type {\n CallExpression,\n Expression,\n Identifier,\n NewExpression,\n Program,\n V8IntrinsicIdentifier,\n} from '@babel/types';\n\nimport type { CodeRemoverOptions } from '@wyw-in-js/shared';\nimport { nonType } from './findIdentifiers';\nimport { isUnnecessaryReactCall } from './isUnnecessaryReactCall';\nimport { applyAction, removeWithRelated } from './scopeHelpers';\nimport { JSXElementsRemover } from './visitors/JSXElementsRemover';\nimport type { IImport } from './collectExportsAndImports';\nimport { collectExportsAndImports } from './collectExportsAndImports';\n\nconst isGlobal = (id: NodePath<Identifier>): boolean => {\n if (!nonType(id)) {\n return false;\n }\n\n const { scope } = id;\n const { name } = id.node;\n return !scope.hasBinding(name) && scope.hasGlobal(name);\n};\n\nconst ssrCheckFields = new Set([\n 'document',\n 'location',\n 'navigator',\n 'sessionStorage',\n 'localStorage',\n 'window',\n]);\n\nconst forbiddenGlobals = new Set([\n ...ssrCheckFields,\n '$RefreshReg$',\n '$RefreshSig$',\n 'XMLHttpRequest',\n 'clearImmediate',\n 'clearInterval',\n 'clearTimeout',\n 'fetch',\n 'navigator',\n 'setImmediate',\n 'setInterval',\n 'setTimeout',\n]);\n\nconst alwaysForbiddenIdentifiers = new Set(['$RefreshReg$', '$RefreshSig$']);\n\nconst isBrowserGlobal = (id: NodePath<Identifier>) => {\n const { name } = id.node;\n if (alwaysForbiddenIdentifiers.has(name)) {\n return nonType(id);\n }\n\n return forbiddenGlobals.has(name) && isGlobal(id);\n};\n\nconst isSSRCheckField = (id: NodePath<Identifier>) => {\n return ssrCheckFields.has(id.node.name) && isGlobal(id);\n};\n\nconst promiseCallbackMethods = new Set(['then', 'catch', 'finally']);\n\nconst getPropertyName = (path: NodePath): string | null => {\n if (path.isIdentifier()) {\n return path.node.name;\n }\n\n if (path.isStringLiteral()) {\n return path.node.value;\n }\n\n return null;\n};\n\nconst isPromiseCallbackArgument = (\n path: NodePath<CallExpression | NewExpression>,\n ref: NodePath\n) => {\n return path\n .get('arguments')\n .some((arg) => arg === ref || arg.isAncestor(ref));\n};\n\nconst findPromiseCallbackOwner = (\n path: NodePath\n): NodePath<CallExpression | NewExpression> | null => {\n const owner = path.findParent((parent) => {\n if (parent.isNewExpression()) {\n const callee = parent.get('callee');\n return (\n callee.isIdentifier({ name: 'Promise' }) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n if (parent.isCallExpression()) {\n const callee = parent.get('callee');\n if (!callee.isMemberExpression()) return false;\n const propName = getPropertyName(callee.get('property'));\n return (\n propName !== null &&\n promiseCallbackMethods.has(propName) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n return false;\n });\n\n return owner as NodePath<CallExpression | NewExpression> | null;\n};\n\nconst removeForbiddenGlobal = (path: NodePath) => {\n const promiseOwner = findPromiseCallbackOwner(path);\n if (promiseOwner) {\n removeWithRelated([promiseOwner]);\n } else {\n removeWithRelated([path]);\n }\n};\n\nconst getImport = (path: NodePath): [string, string] | undefined => {\n const programPath = path.findParent((p) => p.isProgram()) as\n | NodePath<Program>\n | undefined;\n if (!programPath) {\n return undefined;\n }\n\n const { imports } = collectExportsAndImports(programPath);\n\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, matched.imported];\n }\n }\n\n if (path.isMemberExpression()) {\n const leftPath = path.get('object');\n if (!leftPath.isIdentifier()) {\n // Nested member expression. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('property');\n if (!rightPath.isIdentifier()) {\n return undefined;\n }\n\n const binding = path.scope.getBinding(leftPath.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, rightPath.node.name];\n }\n }\n\n return undefined;\n};\n\nconst getTypeImport = (path: NodePath): [string, string] | undefined => {\n // We are looking for either Identifier or TSQualifiedName in path\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n !binding.path.isImportSpecifier() ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n const importDeclaration = binding.path.parentPath;\n const imported = binding.path.get('imported');\n const source = importDeclaration.node.source.value;\n const importedNode = imported.node;\n return [\n source,\n t.isIdentifier(importedNode) ? importedNode.name : importedNode.value,\n ];\n }\n\n if (path.isTSQualifiedName()) {\n const leftPath = path.get('left');\n if (!leftPath.isIdentifier()) {\n // Nested type. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('right');\n\n const binding = path.scope.getBinding(leftPath.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n (!binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()) ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n return [binding.path.parentPath.node.source.value, rightPath.node.name];\n }\n\n return undefined;\n};\n\nconst isTypeMatch = (\n id: NodePath<Identifier>,\n types: Record<string, string[]>\n): boolean => {\n const typeAnnotation = id.get('typeAnnotation');\n if (!typeAnnotation.isTSTypeAnnotation()) {\n return false;\n }\n\n const typeReference = typeAnnotation.get('typeAnnotation');\n if (!typeReference.isTSTypeReference()) {\n return false;\n }\n\n const typeName = typeReference.get('typeName');\n const matchedImport = getTypeImport(typeName);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in types &&\n types[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst isHOC = (\n path: NodePath<CallExpression>,\n hocs: Record<string, string[]>\n) => {\n let calleePath: NodePath<V8IntrinsicIdentifier | Expression> = path;\n while (calleePath.isCallExpression()) {\n calleePath = calleePath.get('callee');\n }\n\n const matchedImport = getImport(calleePath);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in hocs &&\n hocs[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst defaultPlaceholder = '...';\n\nconst defaultReactComponentTypes = [\n 'ExoticComponent',\n 'FC',\n 'ForwardRefExoticComponent',\n 'FunctionComponent',\n 'LazyExoticComponent',\n 'MemoExoticComponent',\n 'NamedExoticComponent',\n];\n\nexport const removeDangerousCode = (\n programPath: NodePath<Program>,\n options?: CodeRemoverOptions\n) => {\n const hocs = options?.hocs ?? {};\n\n const componentTypes = options?.componentTypes ?? {\n react: [defaultPlaceholder],\n };\n\n if (\n Array.isArray(componentTypes.react) &&\n componentTypes.react.includes(defaultPlaceholder)\n ) {\n const idx = componentTypes.react.indexOf(defaultPlaceholder);\n componentTypes.react = [...componentTypes.react];\n componentTypes.react.splice(idx, 1, ...defaultReactComponentTypes);\n }\n\n programPath.traverse(\n {\n // JSX can be replaced with a dummy value,\n // but we have to do it after we processed template tags.\n CallExpression: {\n enter(p) {\n if (isUnnecessaryReactCall(p)) {\n JSXElementsRemover(p);\n }\n\n if (isHOC(p, hocs)) {\n applyAction([\n 'replace',\n p,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n JSXElement: {\n enter: JSXElementsRemover,\n },\n JSXFragment: {\n enter: JSXElementsRemover,\n },\n MemberExpression(p, state) {\n const obj = p.get('object');\n const prop = p.get('property');\n if (!obj.isIdentifier({ name: 'window' })) {\n return;\n }\n\n const name = getPropertyName(prop);\n if (!name) {\n return;\n }\n\n state.windowScoped.add(name);\n // eslint-disable-next-line no-param-reassign\n state.globals = state.globals.filter((id) => {\n if (id.node.name === name) {\n removeWithRelated([id]);\n return false;\n }\n\n return true;\n });\n },\n MetaProperty(p) {\n // Remove all references to `import.meta`\n removeWithRelated([p]);\n },\n Identifier(p, state) {\n if (p.find((parent) => parent.isTSTypeReference())) {\n // don't mess with TS type references\n return;\n }\n if (isBrowserGlobal(p)) {\n if (\n p.find(\n (parentPath) =>\n parentPath.isUnaryExpression({ operator: 'typeof' }) ||\n parentPath.isTSTypeQuery()\n )\n ) {\n // Ignore `typeof window` expressions\n return;\n }\n\n if (p.parentPath.isClassProperty()) {\n // ignore class property decls\n return;\n }\n if (p.parentPath.isMemberExpression() && p.key === 'property') {\n // ignore e.g this.fetch()\n // window.fetch will be handled by the windowScoped block below\n return;\n }\n\n removeForbiddenGlobal(p);\n\n return;\n }\n\n if (state.windowScoped.has(p.node.name)) {\n removeForbiddenGlobal(p);\n } else if (isGlobal(p)) {\n state.globals.push(p);\n }\n },\n\n // Since we can use happy-dom, typical SSR checks may not work as expected.\n // We need to detect them and replace with an \"undefined\" literal.\n UnaryExpression(p) {\n if (p.node.operator !== 'typeof') {\n return;\n }\n const arg = p.get('argument');\n if (!arg.isIdentifier() || !isSSRCheckField(arg)) {\n return;\n }\n\n applyAction([\n 'replace',\n p,\n { type: 'StringLiteral', value: 'undefined' },\n ]);\n },\n VariableDeclarator(p) {\n const id = p.get('id');\n const init = p.get('init');\n if (\n id.isIdentifier() &&\n isTypeMatch(id, componentTypes) &&\n init.isExpression()\n ) {\n // Variable is typed as a React component. We can replace its value with a null-function.\n applyAction([\n 'replace',\n init,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n {\n globals: [] as NodePath<Identifier>[],\n windowScoped: new Set<string>(),\n }\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -36,6 +36,7 @@ function buildCodeFrameError(path, message) {
36
36
  }
37
37
  const definedTagsCache = new Map();
38
38
  const resolvedTagResolverSourceCache = new Map();
39
+ let didWarnSkipSymbolMismatch = false;
39
40
  const getResolvedTagResolverSource = (source, sourceFile) => {
40
41
  if (!sourceFile) {
41
42
  return undefined;
@@ -346,6 +347,15 @@ function createProcessorInstance(definedProcessor, imports, path, fileContext, o
346
347
  cache.set(path.node, null);
347
348
  return null;
348
349
  }
350
+ if (typeof e === 'symbol' && e.description === _processorUtils.BaseProcessor.SKIP.description) {
351
+ if (!didWarnSkipSymbolMismatch) {
352
+ didWarnSkipSymbolMismatch = true;
353
+ // eslint-disable-next-line no-console
354
+ console.warn(["[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.", 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.', 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).'].join('\n'));
355
+ }
356
+ cache.set(path.node, null);
357
+ return null;
358
+ }
349
359
  if (e instanceof Error) {
350
360
  throw buildCodeFrameError(path, e.message);
351
361
  }
@@ -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","resolvedTagResolverSourceCache","getResolvedTagResolverSource","source","sourceFile","undefined","key","has","get","resolved","syncResolve","set","getDefinedTagsFromPackage","pkgName","filename","_packageJSON$wywInJ","packageJSONPath","findPackageJSON","packageDir","dirname","packageJSON","JSON","parse","readFileSync","definedTags","tags","normalizedTags","Object","entries","reduce","acc","value","startsWith","join","resolve","paths","isValidProcessorClass","module","BaseProcessor","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForImport","imported","options","tagResolver","customFile","tagResolverMeta","resolvedSource","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","next","replaceWith","isNewExpression","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, syncResolve } from '@wyw-in-js/shared';\nimport type {\n ExpressionValue,\n StrictOptions,\n TagResolverMeta,\n} 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 resolvedTagResolverSourceCache = new Map<string, string | undefined>();\n\nconst getResolvedTagResolverSource = (\n source: string,\n sourceFile: string | null | undefined\n): string | undefined => {\n if (!sourceFile) {\n return undefined;\n }\n\n const key = `${sourceFile}\\0${source}`;\n if (resolvedTagResolverSourceCache.has(key)) {\n return resolvedTagResolverSourceCache.get(key);\n }\n\n try {\n const resolved = syncResolve(source, sourceFile, []);\n resolvedTagResolverSourceCache.set(key, resolved);\n return resolved;\n } catch {\n resolvedTagResolverSourceCache.set(key, undefined);\n return undefined;\n }\n};\n\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;\n\n let customFile: string | null = null;\n if (tagResolver) {\n const tagResolverMeta: TagResolverMeta = {\n sourceFile: filename,\n resolvedSource: getResolvedTagResolverSource(source, filename),\n };\n\n customFile = tagResolver(source, imported, tagResolverMeta);\n }\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 = (\n replacement: Expression | ((tagPath: NodePath) => Expression),\n isPure: boolean\n ) => {\n mutate(prev, (p) => {\n const next =\n typeof replacement === 'function' ? replacement(p) : replacement;\n\n p.replaceWith(next);\n\n if (isPure && (p.isCallExpression() || p.isNewExpression())) {\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 } = id.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' | 'extensions' | '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' | 'extensions' | '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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","ignoreList":[]}
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","resolvedTagResolverSourceCache","didWarnSkipSymbolMismatch","getResolvedTagResolverSource","source","sourceFile","undefined","key","has","get","resolved","syncResolve","set","getDefinedTagsFromPackage","pkgName","filename","_packageJSON$wywInJ","packageJSONPath","findPackageJSON","packageDir","dirname","packageJSON","JSON","parse","readFileSync","definedTags","tags","normalizedTags","Object","entries","reduce","acc","value","startsWith","join","resolve","paths","isValidProcessorClass","module","BaseProcessor","constructor","getProcessorFromPackage","packageName","tagName","processorPath","Processor","default","getProcessorFromFile","getProcessorForImport","imported","options","tagResolver","customFile","tagResolverMeta","resolvedSource","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","next","replaceWith","isNewExpression","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","description","console","warn","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, syncResolve } from '@wyw-in-js/shared';\nimport type {\n ExpressionValue,\n StrictOptions,\n TagResolverMeta,\n} 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 resolvedTagResolverSourceCache = new Map<string, string | undefined>();\nlet didWarnSkipSymbolMismatch = false;\n\nconst getResolvedTagResolverSource = (\n source: string,\n sourceFile: string | null | undefined\n): string | undefined => {\n if (!sourceFile) {\n return undefined;\n }\n\n const key = `${sourceFile}\\0${source}`;\n if (resolvedTagResolverSourceCache.has(key)) {\n return resolvedTagResolverSourceCache.get(key);\n }\n\n try {\n const resolved = syncResolve(source, sourceFile, []);\n resolvedTagResolverSourceCache.set(key, resolved);\n return resolved;\n } catch {\n resolvedTagResolverSourceCache.set(key, undefined);\n return undefined;\n }\n};\n\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;\n\n let customFile: string | null = null;\n if (tagResolver) {\n const tagResolverMeta: TagResolverMeta = {\n sourceFile: filename,\n resolvedSource: getResolvedTagResolverSource(source, filename),\n };\n\n customFile = tagResolver(source, imported, tagResolverMeta);\n }\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 = (\n replacement: Expression | ((tagPath: NodePath) => Expression),\n isPure: boolean\n ) => {\n mutate(prev, (p) => {\n const next =\n typeof replacement === 'function' ? replacement(p) : replacement;\n\n p.replaceWith(next);\n\n if (isPure && (p.isCallExpression() || p.isNewExpression())) {\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 } = id.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' | 'extensions' | '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 (\n typeof e === 'symbol' &&\n e.description === BaseProcessor.SKIP.description\n ) {\n if (!didWarnSkipSymbolMismatch) {\n didWarnSkipSymbolMismatch = true;\n // eslint-disable-next-line no-console\n console.warn(\n [\n \"[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.\",\n 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',\n 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',\n ].join('\\n')\n );\n }\n\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' | 'extensions' | '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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","ignoreList":[]}
@@ -23,9 +23,16 @@ const isGlobal = id => {
23
23
  return !scope.hasBinding(name) && scope.hasGlobal(name);
24
24
  };
25
25
  const ssrCheckFields = new Set(['document', 'location', 'navigator', 'sessionStorage', 'localStorage', 'window']);
26
- const forbiddenGlobals = new Set([...ssrCheckFields, '$RefreshReg$', 'XMLHttpRequest', 'clearImmediate', 'clearInterval', 'clearTimeout', 'fetch', 'navigator', 'setImmediate', 'setInterval', 'setTimeout']);
26
+ const forbiddenGlobals = new Set([...ssrCheckFields, '$RefreshReg$', '$RefreshSig$', 'XMLHttpRequest', 'clearImmediate', 'clearInterval', 'clearTimeout', 'fetch', 'navigator', 'setImmediate', 'setInterval', 'setTimeout']);
27
+ const alwaysForbiddenIdentifiers = new Set(['$RefreshReg$', '$RefreshSig$']);
27
28
  const isBrowserGlobal = id => {
28
- return forbiddenGlobals.has(id.node.name) && isGlobal(id);
29
+ const {
30
+ name
31
+ } = id.node;
32
+ if (alwaysForbiddenIdentifiers.has(name)) {
33
+ return (0, _findIdentifiers.nonType)(id);
34
+ }
35
+ return forbiddenGlobals.has(name) && isGlobal(id);
29
36
  };
30
37
  const isSSRCheckField = id => {
31
38
  return ssrCheckFields.has(id.node.name) && isGlobal(id);
@@ -1 +1 @@
1
- {"version":3,"file":"removeDangerousCode.js","names":["_core","require","_findIdentifiers","_isUnnecessaryReactCall","_scopeHelpers","_JSXElementsRemover","_collectExportsAndImports","isGlobal","id","nonType","scope","name","node","hasBinding","hasGlobal","ssrCheckFields","Set","forbiddenGlobals","isBrowserGlobal","has","isSSRCheckField","promiseCallbackMethods","getPropertyName","path","isIdentifier","isStringLiteral","value","isPromiseCallbackArgument","ref","get","some","arg","isAncestor","findPromiseCallbackOwner","owner","findParent","parent","isNewExpression","callee","isCallExpression","isMemberExpression","propName","removeForbiddenGlobal","promiseOwner","removeWithRelated","getImport","programPath","p","isProgram","undefined","imports","collectExportsAndImports","binding","getBinding","matched","find","imp","imported","local","source","leftPath","rightPath","getTypeImport","isImportSpecifier","parentPath","isImportDeclaration","importDeclaration","importedNode","t","isTSQualifiedName","isImportDefaultSpecifier","isImportNamespaceSpecifier","isTypeMatch","types","typeAnnotation","isTSTypeAnnotation","typeReference","isTSTypeReference","typeName","matchedImport","includes","isHOC","hocs","calleePath","defaultPlaceholder","defaultReactComponentTypes","removeDangerousCode","options","_options$hocs","_options$componentTyp","componentTypes","react","Array","isArray","idx","indexOf","splice","traverse","CallExpression","enter","isUnnecessaryReactCall","JSXElementsRemover","applyAction","arrowFunctionExpression","nullLiteral","JSXElement","JSXFragment","MemberExpression","state","obj","prop","windowScoped","add","globals","filter","MetaProperty","Identifier","isUnaryExpression","operator","isTSTypeQuery","isClassProperty","key","push","UnaryExpression","type","VariableDeclarator","init","isExpression","exports"],"sources":["../../src/utils/removeDangerousCode.ts"],"sourcesContent":["import type { NodePath } from '@babel/core';\nimport { types as t } from '@babel/core';\nimport type {\n CallExpression,\n Expression,\n Identifier,\n NewExpression,\n Program,\n V8IntrinsicIdentifier,\n} from '@babel/types';\n\nimport type { CodeRemoverOptions } from '@wyw-in-js/shared';\nimport { nonType } from './findIdentifiers';\nimport { isUnnecessaryReactCall } from './isUnnecessaryReactCall';\nimport { applyAction, removeWithRelated } from './scopeHelpers';\nimport { JSXElementsRemover } from './visitors/JSXElementsRemover';\nimport type { IImport } from './collectExportsAndImports';\nimport { collectExportsAndImports } from './collectExportsAndImports';\n\nconst isGlobal = (id: NodePath<Identifier>): boolean => {\n if (!nonType(id)) {\n return false;\n }\n\n const { scope } = id;\n const { name } = id.node;\n return !scope.hasBinding(name) && scope.hasGlobal(name);\n};\n\nconst ssrCheckFields = new Set([\n 'document',\n 'location',\n 'navigator',\n 'sessionStorage',\n 'localStorage',\n 'window',\n]);\n\nconst forbiddenGlobals = new Set([\n ...ssrCheckFields,\n '$RefreshReg$',\n 'XMLHttpRequest',\n 'clearImmediate',\n 'clearInterval',\n 'clearTimeout',\n 'fetch',\n 'navigator',\n 'setImmediate',\n 'setInterval',\n 'setTimeout',\n]);\n\nconst isBrowserGlobal = (id: NodePath<Identifier>) => {\n return forbiddenGlobals.has(id.node.name) && isGlobal(id);\n};\n\nconst isSSRCheckField = (id: NodePath<Identifier>) => {\n return ssrCheckFields.has(id.node.name) && isGlobal(id);\n};\n\nconst promiseCallbackMethods = new Set(['then', 'catch', 'finally']);\n\nconst getPropertyName = (path: NodePath): string | null => {\n if (path.isIdentifier()) {\n return path.node.name;\n }\n\n if (path.isStringLiteral()) {\n return path.node.value;\n }\n\n return null;\n};\n\nconst isPromiseCallbackArgument = (\n path: NodePath<CallExpression | NewExpression>,\n ref: NodePath\n) => {\n return path\n .get('arguments')\n .some((arg) => arg === ref || arg.isAncestor(ref));\n};\n\nconst findPromiseCallbackOwner = (\n path: NodePath\n): NodePath<CallExpression | NewExpression> | null => {\n const owner = path.findParent((parent) => {\n if (parent.isNewExpression()) {\n const callee = parent.get('callee');\n return (\n callee.isIdentifier({ name: 'Promise' }) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n if (parent.isCallExpression()) {\n const callee = parent.get('callee');\n if (!callee.isMemberExpression()) return false;\n const propName = getPropertyName(callee.get('property'));\n return (\n propName !== null &&\n promiseCallbackMethods.has(propName) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n return false;\n });\n\n return owner as NodePath<CallExpression | NewExpression> | null;\n};\n\nconst removeForbiddenGlobal = (path: NodePath) => {\n const promiseOwner = findPromiseCallbackOwner(path);\n if (promiseOwner) {\n removeWithRelated([promiseOwner]);\n } else {\n removeWithRelated([path]);\n }\n};\n\nconst getImport = (path: NodePath): [string, string] | undefined => {\n const programPath = path.findParent((p) => p.isProgram()) as\n | NodePath<Program>\n | undefined;\n if (!programPath) {\n return undefined;\n }\n\n const { imports } = collectExportsAndImports(programPath);\n\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, matched.imported];\n }\n }\n\n if (path.isMemberExpression()) {\n const leftPath = path.get('object');\n if (!leftPath.isIdentifier()) {\n // Nested member expression. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('property');\n if (!rightPath.isIdentifier()) {\n return undefined;\n }\n\n const binding = path.scope.getBinding(leftPath.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, rightPath.node.name];\n }\n }\n\n return undefined;\n};\n\nconst getTypeImport = (path: NodePath): [string, string] | undefined => {\n // We are looking for either Identifier or TSQualifiedName in path\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n !binding.path.isImportSpecifier() ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n const importDeclaration = binding.path.parentPath;\n const imported = binding.path.get('imported');\n const source = importDeclaration.node.source.value;\n const importedNode = imported.node;\n return [\n source,\n t.isIdentifier(importedNode) ? importedNode.name : importedNode.value,\n ];\n }\n\n if (path.isTSQualifiedName()) {\n const leftPath = path.get('left');\n if (!leftPath.isIdentifier()) {\n // Nested type. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('right');\n\n const binding = path.scope.getBinding(leftPath.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n (!binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()) ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n return [binding.path.parentPath.node.source.value, rightPath.node.name];\n }\n\n return undefined;\n};\n\nconst isTypeMatch = (\n id: NodePath<Identifier>,\n types: Record<string, string[]>\n): boolean => {\n const typeAnnotation = id.get('typeAnnotation');\n if (!typeAnnotation.isTSTypeAnnotation()) {\n return false;\n }\n\n const typeReference = typeAnnotation.get('typeAnnotation');\n if (!typeReference.isTSTypeReference()) {\n return false;\n }\n\n const typeName = typeReference.get('typeName');\n const matchedImport = getTypeImport(typeName);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in types &&\n types[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst isHOC = (\n path: NodePath<CallExpression>,\n hocs: Record<string, string[]>\n) => {\n let calleePath: NodePath<V8IntrinsicIdentifier | Expression> = path;\n while (calleePath.isCallExpression()) {\n calleePath = calleePath.get('callee');\n }\n\n const matchedImport = getImport(calleePath);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in hocs &&\n hocs[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst defaultPlaceholder = '...';\n\nconst defaultReactComponentTypes = [\n 'ExoticComponent',\n 'FC',\n 'ForwardRefExoticComponent',\n 'FunctionComponent',\n 'LazyExoticComponent',\n 'MemoExoticComponent',\n 'NamedExoticComponent',\n];\n\nexport const removeDangerousCode = (\n programPath: NodePath<Program>,\n options?: CodeRemoverOptions\n) => {\n const hocs = options?.hocs ?? {};\n\n const componentTypes = options?.componentTypes ?? {\n react: [defaultPlaceholder],\n };\n\n if (\n Array.isArray(componentTypes.react) &&\n componentTypes.react.includes(defaultPlaceholder)\n ) {\n const idx = componentTypes.react.indexOf(defaultPlaceholder);\n componentTypes.react = [...componentTypes.react];\n componentTypes.react.splice(idx, 1, ...defaultReactComponentTypes);\n }\n\n programPath.traverse(\n {\n // JSX can be replaced with a dummy value,\n // but we have to do it after we processed template tags.\n CallExpression: {\n enter(p) {\n if (isUnnecessaryReactCall(p)) {\n JSXElementsRemover(p);\n }\n\n if (isHOC(p, hocs)) {\n applyAction([\n 'replace',\n p,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n JSXElement: {\n enter: JSXElementsRemover,\n },\n JSXFragment: {\n enter: JSXElementsRemover,\n },\n MemberExpression(p, state) {\n const obj = p.get('object');\n const prop = p.get('property');\n if (!obj.isIdentifier({ name: 'window' })) {\n return;\n }\n\n const name = getPropertyName(prop);\n if (!name) {\n return;\n }\n\n state.windowScoped.add(name);\n // eslint-disable-next-line no-param-reassign\n state.globals = state.globals.filter((id) => {\n if (id.node.name === name) {\n removeWithRelated([id]);\n return false;\n }\n\n return true;\n });\n },\n MetaProperty(p) {\n // Remove all references to `import.meta`\n removeWithRelated([p]);\n },\n Identifier(p, state) {\n if (p.find((parent) => parent.isTSTypeReference())) {\n // don't mess with TS type references\n return;\n }\n if (isBrowserGlobal(p)) {\n if (\n p.find(\n (parentPath) =>\n parentPath.isUnaryExpression({ operator: 'typeof' }) ||\n parentPath.isTSTypeQuery()\n )\n ) {\n // Ignore `typeof window` expressions\n return;\n }\n\n if (p.parentPath.isClassProperty()) {\n // ignore class property decls\n return;\n }\n if (p.parentPath.isMemberExpression() && p.key === 'property') {\n // ignore e.g this.fetch()\n // window.fetch will be handled by the windowScoped block below\n return;\n }\n\n removeForbiddenGlobal(p);\n\n return;\n }\n\n if (state.windowScoped.has(p.node.name)) {\n removeForbiddenGlobal(p);\n } else if (isGlobal(p)) {\n state.globals.push(p);\n }\n },\n\n // Since we can use happy-dom, typical SSR checks may not work as expected.\n // We need to detect them and replace with an \"undefined\" literal.\n UnaryExpression(p) {\n if (p.node.operator !== 'typeof') {\n return;\n }\n const arg = p.get('argument');\n if (!arg.isIdentifier() || !isSSRCheckField(arg)) {\n return;\n }\n\n applyAction([\n 'replace',\n p,\n { type: 'StringLiteral', value: 'undefined' },\n ]);\n },\n VariableDeclarator(p) {\n const id = p.get('id');\n const init = p.get('init');\n if (\n id.isIdentifier() &&\n isTypeMatch(id, componentTypes) &&\n init.isExpression()\n ) {\n // Variable is typed as a React component. We can replace its value with a null-function.\n applyAction([\n 'replace',\n init,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n {\n globals: [] as NodePath<Identifier>[],\n windowScoped: new Set<string>(),\n }\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"removeDangerousCode.js","names":["_core","require","_findIdentifiers","_isUnnecessaryReactCall","_scopeHelpers","_JSXElementsRemover","_collectExportsAndImports","isGlobal","id","nonType","scope","name","node","hasBinding","hasGlobal","ssrCheckFields","Set","forbiddenGlobals","alwaysForbiddenIdentifiers","isBrowserGlobal","has","isSSRCheckField","promiseCallbackMethods","getPropertyName","path","isIdentifier","isStringLiteral","value","isPromiseCallbackArgument","ref","get","some","arg","isAncestor","findPromiseCallbackOwner","owner","findParent","parent","isNewExpression","callee","isCallExpression","isMemberExpression","propName","removeForbiddenGlobal","promiseOwner","removeWithRelated","getImport","programPath","p","isProgram","undefined","imports","collectExportsAndImports","binding","getBinding","matched","find","imp","imported","local","source","leftPath","rightPath","getTypeImport","isImportSpecifier","parentPath","isImportDeclaration","importDeclaration","importedNode","t","isTSQualifiedName","isImportDefaultSpecifier","isImportNamespaceSpecifier","isTypeMatch","types","typeAnnotation","isTSTypeAnnotation","typeReference","isTSTypeReference","typeName","matchedImport","includes","isHOC","hocs","calleePath","defaultPlaceholder","defaultReactComponentTypes","removeDangerousCode","options","_options$hocs","_options$componentTyp","componentTypes","react","Array","isArray","idx","indexOf","splice","traverse","CallExpression","enter","isUnnecessaryReactCall","JSXElementsRemover","applyAction","arrowFunctionExpression","nullLiteral","JSXElement","JSXFragment","MemberExpression","state","obj","prop","windowScoped","add","globals","filter","MetaProperty","Identifier","isUnaryExpression","operator","isTSTypeQuery","isClassProperty","key","push","UnaryExpression","type","VariableDeclarator","init","isExpression","exports"],"sources":["../../src/utils/removeDangerousCode.ts"],"sourcesContent":["import type { NodePath } from '@babel/core';\nimport { types as t } from '@babel/core';\nimport type {\n CallExpression,\n Expression,\n Identifier,\n NewExpression,\n Program,\n V8IntrinsicIdentifier,\n} from '@babel/types';\n\nimport type { CodeRemoverOptions } from '@wyw-in-js/shared';\nimport { nonType } from './findIdentifiers';\nimport { isUnnecessaryReactCall } from './isUnnecessaryReactCall';\nimport { applyAction, removeWithRelated } from './scopeHelpers';\nimport { JSXElementsRemover } from './visitors/JSXElementsRemover';\nimport type { IImport } from './collectExportsAndImports';\nimport { collectExportsAndImports } from './collectExportsAndImports';\n\nconst isGlobal = (id: NodePath<Identifier>): boolean => {\n if (!nonType(id)) {\n return false;\n }\n\n const { scope } = id;\n const { name } = id.node;\n return !scope.hasBinding(name) && scope.hasGlobal(name);\n};\n\nconst ssrCheckFields = new Set([\n 'document',\n 'location',\n 'navigator',\n 'sessionStorage',\n 'localStorage',\n 'window',\n]);\n\nconst forbiddenGlobals = new Set([\n ...ssrCheckFields,\n '$RefreshReg$',\n '$RefreshSig$',\n 'XMLHttpRequest',\n 'clearImmediate',\n 'clearInterval',\n 'clearTimeout',\n 'fetch',\n 'navigator',\n 'setImmediate',\n 'setInterval',\n 'setTimeout',\n]);\n\nconst alwaysForbiddenIdentifiers = new Set(['$RefreshReg$', '$RefreshSig$']);\n\nconst isBrowserGlobal = (id: NodePath<Identifier>) => {\n const { name } = id.node;\n if (alwaysForbiddenIdentifiers.has(name)) {\n return nonType(id);\n }\n\n return forbiddenGlobals.has(name) && isGlobal(id);\n};\n\nconst isSSRCheckField = (id: NodePath<Identifier>) => {\n return ssrCheckFields.has(id.node.name) && isGlobal(id);\n};\n\nconst promiseCallbackMethods = new Set(['then', 'catch', 'finally']);\n\nconst getPropertyName = (path: NodePath): string | null => {\n if (path.isIdentifier()) {\n return path.node.name;\n }\n\n if (path.isStringLiteral()) {\n return path.node.value;\n }\n\n return null;\n};\n\nconst isPromiseCallbackArgument = (\n path: NodePath<CallExpression | NewExpression>,\n ref: NodePath\n) => {\n return path\n .get('arguments')\n .some((arg) => arg === ref || arg.isAncestor(ref));\n};\n\nconst findPromiseCallbackOwner = (\n path: NodePath\n): NodePath<CallExpression | NewExpression> | null => {\n const owner = path.findParent((parent) => {\n if (parent.isNewExpression()) {\n const callee = parent.get('callee');\n return (\n callee.isIdentifier({ name: 'Promise' }) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n if (parent.isCallExpression()) {\n const callee = parent.get('callee');\n if (!callee.isMemberExpression()) return false;\n const propName = getPropertyName(callee.get('property'));\n return (\n propName !== null &&\n promiseCallbackMethods.has(propName) &&\n isPromiseCallbackArgument(parent, path)\n );\n }\n\n return false;\n });\n\n return owner as NodePath<CallExpression | NewExpression> | null;\n};\n\nconst removeForbiddenGlobal = (path: NodePath) => {\n const promiseOwner = findPromiseCallbackOwner(path);\n if (promiseOwner) {\n removeWithRelated([promiseOwner]);\n } else {\n removeWithRelated([path]);\n }\n};\n\nconst getImport = (path: NodePath): [string, string] | undefined => {\n const programPath = path.findParent((p) => p.isProgram()) as\n | NodePath<Program>\n | undefined;\n if (!programPath) {\n return undefined;\n }\n\n const { imports } = collectExportsAndImports(programPath);\n\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, matched.imported];\n }\n }\n\n if (path.isMemberExpression()) {\n const leftPath = path.get('object');\n if (!leftPath.isIdentifier()) {\n // Nested member expression. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('property');\n if (!rightPath.isIdentifier()) {\n return undefined;\n }\n\n const binding = path.scope.getBinding(leftPath.node.name);\n const matched =\n binding &&\n imports.find(\n (imp): imp is IImport =>\n imp.imported !== 'side-effect' && binding.path.isAncestor(imp.local)\n );\n\n if (matched) {\n return [matched.source, rightPath.node.name];\n }\n }\n\n return undefined;\n};\n\nconst getTypeImport = (path: NodePath): [string, string] | undefined => {\n // We are looking for either Identifier or TSQualifiedName in path\n if (path.isIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n !binding.path.isImportSpecifier() ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n const importDeclaration = binding.path.parentPath;\n const imported = binding.path.get('imported');\n const source = importDeclaration.node.source.value;\n const importedNode = imported.node;\n return [\n source,\n t.isIdentifier(importedNode) ? importedNode.name : importedNode.value,\n ];\n }\n\n if (path.isTSQualifiedName()) {\n const leftPath = path.get('left');\n if (!leftPath.isIdentifier()) {\n // Nested type. Not supported yet.\n return undefined;\n }\n\n const rightPath = path.get('right');\n\n const binding = path.scope.getBinding(leftPath.node.name);\n if (!binding) {\n return undefined;\n }\n\n if (\n (!binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()) ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n return undefined;\n }\n\n return [binding.path.parentPath.node.source.value, rightPath.node.name];\n }\n\n return undefined;\n};\n\nconst isTypeMatch = (\n id: NodePath<Identifier>,\n types: Record<string, string[]>\n): boolean => {\n const typeAnnotation = id.get('typeAnnotation');\n if (!typeAnnotation.isTSTypeAnnotation()) {\n return false;\n }\n\n const typeReference = typeAnnotation.get('typeAnnotation');\n if (!typeReference.isTSTypeReference()) {\n return false;\n }\n\n const typeName = typeReference.get('typeName');\n const matchedImport = getTypeImport(typeName);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in types &&\n types[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst isHOC = (\n path: NodePath<CallExpression>,\n hocs: Record<string, string[]>\n) => {\n let calleePath: NodePath<V8IntrinsicIdentifier | Expression> = path;\n while (calleePath.isCallExpression()) {\n calleePath = calleePath.get('callee');\n }\n\n const matchedImport = getImport(calleePath);\n return (\n matchedImport !== undefined &&\n matchedImport[0] in hocs &&\n hocs[matchedImport[0]].includes(matchedImport[1])\n );\n};\n\nconst defaultPlaceholder = '...';\n\nconst defaultReactComponentTypes = [\n 'ExoticComponent',\n 'FC',\n 'ForwardRefExoticComponent',\n 'FunctionComponent',\n 'LazyExoticComponent',\n 'MemoExoticComponent',\n 'NamedExoticComponent',\n];\n\nexport const removeDangerousCode = (\n programPath: NodePath<Program>,\n options?: CodeRemoverOptions\n) => {\n const hocs = options?.hocs ?? {};\n\n const componentTypes = options?.componentTypes ?? {\n react: [defaultPlaceholder],\n };\n\n if (\n Array.isArray(componentTypes.react) &&\n componentTypes.react.includes(defaultPlaceholder)\n ) {\n const idx = componentTypes.react.indexOf(defaultPlaceholder);\n componentTypes.react = [...componentTypes.react];\n componentTypes.react.splice(idx, 1, ...defaultReactComponentTypes);\n }\n\n programPath.traverse(\n {\n // JSX can be replaced with a dummy value,\n // but we have to do it after we processed template tags.\n CallExpression: {\n enter(p) {\n if (isUnnecessaryReactCall(p)) {\n JSXElementsRemover(p);\n }\n\n if (isHOC(p, hocs)) {\n applyAction([\n 'replace',\n p,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n JSXElement: {\n enter: JSXElementsRemover,\n },\n JSXFragment: {\n enter: JSXElementsRemover,\n },\n MemberExpression(p, state) {\n const obj = p.get('object');\n const prop = p.get('property');\n if (!obj.isIdentifier({ name: 'window' })) {\n return;\n }\n\n const name = getPropertyName(prop);\n if (!name) {\n return;\n }\n\n state.windowScoped.add(name);\n // eslint-disable-next-line no-param-reassign\n state.globals = state.globals.filter((id) => {\n if (id.node.name === name) {\n removeWithRelated([id]);\n return false;\n }\n\n return true;\n });\n },\n MetaProperty(p) {\n // Remove all references to `import.meta`\n removeWithRelated([p]);\n },\n Identifier(p, state) {\n if (p.find((parent) => parent.isTSTypeReference())) {\n // don't mess with TS type references\n return;\n }\n if (isBrowserGlobal(p)) {\n if (\n p.find(\n (parentPath) =>\n parentPath.isUnaryExpression({ operator: 'typeof' }) ||\n parentPath.isTSTypeQuery()\n )\n ) {\n // Ignore `typeof window` expressions\n return;\n }\n\n if (p.parentPath.isClassProperty()) {\n // ignore class property decls\n return;\n }\n if (p.parentPath.isMemberExpression() && p.key === 'property') {\n // ignore e.g this.fetch()\n // window.fetch will be handled by the windowScoped block below\n return;\n }\n\n removeForbiddenGlobal(p);\n\n return;\n }\n\n if (state.windowScoped.has(p.node.name)) {\n removeForbiddenGlobal(p);\n } else if (isGlobal(p)) {\n state.globals.push(p);\n }\n },\n\n // Since we can use happy-dom, typical SSR checks may not work as expected.\n // We need to detect them and replace with an \"undefined\" literal.\n UnaryExpression(p) {\n if (p.node.operator !== 'typeof') {\n return;\n }\n const arg = p.get('argument');\n if (!arg.isIdentifier() || !isSSRCheckField(arg)) {\n return;\n }\n\n applyAction([\n 'replace',\n p,\n { type: 'StringLiteral', value: 'undefined' },\n ]);\n },\n VariableDeclarator(p) {\n const id = p.get('id');\n const init = p.get('init');\n if (\n id.isIdentifier() &&\n isTypeMatch(id, componentTypes) &&\n init.isExpression()\n ) {\n // Variable is typed as a React component. We can replace its value with a null-function.\n applyAction([\n 'replace',\n init,\n t.arrowFunctionExpression([], t.nullLiteral()),\n ]);\n }\n },\n },\n {\n globals: [] as NodePath<Identifier>[],\n windowScoped: new Set<string>(),\n }\n );\n};\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAWA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,uBAAA,GAAAF,OAAA;AACA,IAAAG,aAAA,GAAAH,OAAA;AACA,IAAAI,mBAAA,GAAAJ,OAAA;AAEA,IAAAK,yBAAA,GAAAL,OAAA;AAEA,MAAMM,QAAQ,GAAIC,EAAwB,IAAc;EACtD,IAAI,CAAC,IAAAC,wBAAO,EAACD,EAAE,CAAC,EAAE;IAChB,OAAO,KAAK;EACd;EAEA,MAAM;IAAEE;EAAM,CAAC,GAAGF,EAAE;EACpB,MAAM;IAAEG;EAAK,CAAC,GAAGH,EAAE,CAACI,IAAI;EACxB,OAAO,CAACF,KAAK,CAACG,UAAU,CAACF,IAAI,CAAC,IAAID,KAAK,CAACI,SAAS,CAACH,IAAI,CAAC;AACzD,CAAC;AAED,MAAMI,cAAc,GAAG,IAAIC,GAAG,CAAC,CAC7B,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,QAAQ,CACT,CAAC;AAEF,MAAMC,gBAAgB,GAAG,IAAID,GAAG,CAAC,CAC/B,GAAGD,cAAc,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,OAAO,EACP,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,CACb,CAAC;AAEF,MAAMG,0BAA0B,GAAG,IAAIF,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAE5E,MAAMG,eAAe,GAAIX,EAAwB,IAAK;EACpD,MAAM;IAAEG;EAAK,CAAC,GAAGH,EAAE,CAACI,IAAI;EACxB,IAAIM,0BAA0B,CAACE,GAAG,CAACT,IAAI,CAAC,EAAE;IACxC,OAAO,IAAAF,wBAAO,EAACD,EAAE,CAAC;EACpB;EAEA,OAAOS,gBAAgB,CAACG,GAAG,CAACT,IAAI,CAAC,IAAIJ,QAAQ,CAACC,EAAE,CAAC;AACnD,CAAC;AAED,MAAMa,eAAe,GAAIb,EAAwB,IAAK;EACpD,OAAOO,cAAc,CAACK,GAAG,CAACZ,EAAE,CAACI,IAAI,CAACD,IAAI,CAAC,IAAIJ,QAAQ,CAACC,EAAE,CAAC;AACzD,CAAC;AAED,MAAMc,sBAAsB,GAAG,IAAIN,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAEpE,MAAMO,eAAe,GAAIC,IAAc,IAAoB;EACzD,IAAIA,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,OAAOD,IAAI,CAACZ,IAAI,CAACD,IAAI;EACvB;EAEA,IAAIa,IAAI,CAACE,eAAe,CAAC,CAAC,EAAE;IAC1B,OAAOF,IAAI,CAACZ,IAAI,CAACe,KAAK;EACxB;EAEA,OAAO,IAAI;AACb,CAAC;AAED,MAAMC,yBAAyB,GAAGA,CAChCJ,IAA8C,EAC9CK,GAAa,KACV;EACH,OAAOL,IAAI,CACRM,GAAG,CAAC,WAAW,CAAC,CAChBC,IAAI,CAAEC,GAAG,IAAKA,GAAG,KAAKH,GAAG,IAAIG,GAAG,CAACC,UAAU,CAACJ,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAMK,wBAAwB,GAC5BV,IAAc,IACsC;EACpD,MAAMW,KAAK,GAAGX,IAAI,CAACY,UAAU,CAAEC,MAAM,IAAK;IACxC,IAAIA,MAAM,CAACC,eAAe,CAAC,CAAC,EAAE;MAC5B,MAAMC,MAAM,GAAGF,MAAM,CAACP,GAAG,CAAC,QAAQ,CAAC;MACnC,OACES,MAAM,CAACd,YAAY,CAAC;QAAEd,IAAI,EAAE;MAAU,CAAC,CAAC,IACxCiB,yBAAyB,CAACS,MAAM,EAAEb,IAAI,CAAC;IAE3C;IAEA,IAAIa,MAAM,CAACG,gBAAgB,CAAC,CAAC,EAAE;MAC7B,MAAMD,MAAM,GAAGF,MAAM,CAACP,GAAG,CAAC,QAAQ,CAAC;MACnC,IAAI,CAACS,MAAM,CAACE,kBAAkB,CAAC,CAAC,EAAE,OAAO,KAAK;MAC9C,MAAMC,QAAQ,GAAGnB,eAAe,CAACgB,MAAM,CAACT,GAAG,CAAC,UAAU,CAAC,CAAC;MACxD,OACEY,QAAQ,KAAK,IAAI,IACjBpB,sBAAsB,CAACF,GAAG,CAACsB,QAAQ,CAAC,IACpCd,yBAAyB,CAACS,MAAM,EAAEb,IAAI,CAAC;IAE3C;IAEA,OAAO,KAAK;EACd,CAAC,CAAC;EAEF,OAAOW,KAAK;AACd,CAAC;AAED,MAAMQ,qBAAqB,GAAInB,IAAc,IAAK;EAChD,MAAMoB,YAAY,GAAGV,wBAAwB,CAACV,IAAI,CAAC;EACnD,IAAIoB,YAAY,EAAE;IAChB,IAAAC,+BAAiB,EAAC,CAACD,YAAY,CAAC,CAAC;EACnC,CAAC,MAAM;IACL,IAAAC,+BAAiB,EAAC,CAACrB,IAAI,CAAC,CAAC;EAC3B;AACF,CAAC;AAED,MAAMsB,SAAS,GAAItB,IAAc,IAAmC;EAClE,MAAMuB,WAAW,GAAGvB,IAAI,CAACY,UAAU,CAAEY,CAAC,IAAKA,CAAC,CAACC,SAAS,CAAC,CAAC,CAE3C;EACb,IAAI,CAACF,WAAW,EAAE;IAChB,OAAOG,SAAS;EAClB;EAEA,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAAC,kDAAwB,EAACL,WAAW,CAAC;EAEzD,IAAIvB,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,MAAM4B,OAAO,GAAG7B,IAAI,CAACd,KAAK,CAAC4C,UAAU,CAAC9B,IAAI,CAACZ,IAAI,CAACD,IAAI,CAAC;IACrD,MAAM4C,OAAO,GACXF,OAAO,IACPF,OAAO,CAACK,IAAI,CACTC,GAAG,IACFA,GAAG,CAACC,QAAQ,KAAK,aAAa,IAAIL,OAAO,CAAC7B,IAAI,CAACS,UAAU,CAACwB,GAAG,CAACE,KAAK,CACvE,CAAC;IAEH,IAAIJ,OAAO,EAAE;MACX,OAAO,CAACA,OAAO,CAACK,MAAM,EAAEL,OAAO,CAACG,QAAQ,CAAC;IAC3C;EACF;EAEA,IAAIlC,IAAI,CAACiB,kBAAkB,CAAC,CAAC,EAAE;IAC7B,MAAMoB,QAAQ,GAAGrC,IAAI,CAACM,GAAG,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC+B,QAAQ,CAACpC,YAAY,CAAC,CAAC,EAAE;MAC5B;MACA,OAAOyB,SAAS;IAClB;IAEA,MAAMY,SAAS,GAAGtC,IAAI,CAACM,GAAG,CAAC,UAAU,CAAC;IACtC,IAAI,CAACgC,SAAS,CAACrC,YAAY,CAAC,CAAC,EAAE;MAC7B,OAAOyB,SAAS;IAClB;IAEA,MAAMG,OAAO,GAAG7B,IAAI,CAACd,KAAK,CAAC4C,UAAU,CAACO,QAAQ,CAACjD,IAAI,CAACD,IAAI,CAAC;IACzD,MAAM4C,OAAO,GACXF,OAAO,IACPF,OAAO,CAACK,IAAI,CACTC,GAAG,IACFA,GAAG,CAACC,QAAQ,KAAK,aAAa,IAAIL,OAAO,CAAC7B,IAAI,CAACS,UAAU,CAACwB,GAAG,CAACE,KAAK,CACvE,CAAC;IAEH,IAAIJ,OAAO,EAAE;MACX,OAAO,CAACA,OAAO,CAACK,MAAM,EAAEE,SAAS,CAAClD,IAAI,CAACD,IAAI,CAAC;IAC9C;EACF;EAEA,OAAOuC,SAAS;AAClB,CAAC;AAED,MAAMa,aAAa,GAAIvC,IAAc,IAAmC;EACtE;EACA,IAAIA,IAAI,CAACC,YAAY,CAAC,CAAC,EAAE;IACvB,MAAM4B,OAAO,GAAG7B,IAAI,CAACd,KAAK,CAAC4C,UAAU,CAAC9B,IAAI,CAACZ,IAAI,CAACD,IAAI,CAAC;IACrD,IAAI,CAAC0C,OAAO,EAAE;MACZ,OAAOH,SAAS;IAClB;IAEA,IACE,CAACG,OAAO,CAAC7B,IAAI,CAACwC,iBAAiB,CAAC,CAAC,IACjC,CAACX,OAAO,CAAC7B,IAAI,CAACyC,UAAU,CAACC,mBAAmB,CAAC,CAAC,EAC9C;MACA,OAAOhB,SAAS;IAClB;IAEA,MAAMiB,iBAAiB,GAAGd,OAAO,CAAC7B,IAAI,CAACyC,UAAU;IACjD,MAAMP,QAAQ,GAAGL,OAAO,CAAC7B,IAAI,CAACM,GAAG,CAAC,UAAU,CAAC;IAC7C,MAAM8B,MAAM,GAAGO,iBAAiB,CAACvD,IAAI,CAACgD,MAAM,CAACjC,KAAK;IAClD,MAAMyC,YAAY,GAAGV,QAAQ,CAAC9C,IAAI;IAClC,OAAO,CACLgD,MAAM,EACNS,WAAC,CAAC5C,YAAY,CAAC2C,YAAY,CAAC,GAAGA,YAAY,CAACzD,IAAI,GAAGyD,YAAY,CAACzC,KAAK,CACtE;EACH;EAEA,IAAIH,IAAI,CAAC8C,iBAAiB,CAAC,CAAC,EAAE;IAC5B,MAAMT,QAAQ,GAAGrC,IAAI,CAACM,GAAG,CAAC,MAAM,CAAC;IACjC,IAAI,CAAC+B,QAAQ,CAACpC,YAAY,CAAC,CAAC,EAAE;MAC5B;MACA,OAAOyB,SAAS;IAClB;IAEA,MAAMY,SAAS,GAAGtC,IAAI,CAACM,GAAG,CAAC,OAAO,CAAC;IAEnC,MAAMuB,OAAO,GAAG7B,IAAI,CAACd,KAAK,CAAC4C,UAAU,CAACO,QAAQ,CAACjD,IAAI,CAACD,IAAI,CAAC;IACzD,IAAI,CAAC0C,OAAO,EAAE;MACZ,OAAOH,SAAS;IAClB;IAEA,IACG,CAACG,OAAO,CAAC7B,IAAI,CAAC+C,wBAAwB,CAAC,CAAC,IACvC,CAAClB,OAAO,CAAC7B,IAAI,CAACgD,0BAA0B,CAAC,CAAC,IAC5C,CAACnB,OAAO,CAAC7B,IAAI,CAACyC,UAAU,CAACC,mBAAmB,CAAC,CAAC,EAC9C;MACA,OAAOhB,SAAS;IAClB;IAEA,OAAO,CAACG,OAAO,CAAC7B,IAAI,CAACyC,UAAU,CAACrD,IAAI,CAACgD,MAAM,CAACjC,KAAK,EAAEmC,SAAS,CAAClD,IAAI,CAACD,IAAI,CAAC;EACzE;EAEA,OAAOuC,SAAS;AAClB,CAAC;AAED,MAAMuB,WAAW,GAAGA,CAClBjE,EAAwB,EACxBkE,KAA+B,KACnB;EACZ,MAAMC,cAAc,GAAGnE,EAAE,CAACsB,GAAG,CAAC,gBAAgB,CAAC;EAC/C,IAAI,CAAC6C,cAAc,CAACC,kBAAkB,CAAC,CAAC,EAAE;IACxC,OAAO,KAAK;EACd;EAEA,MAAMC,aAAa,GAAGF,cAAc,CAAC7C,GAAG,CAAC,gBAAgB,CAAC;EAC1D,IAAI,CAAC+C,aAAa,CAACC,iBAAiB,CAAC,CAAC,EAAE;IACtC,OAAO,KAAK;EACd;EAEA,MAAMC,QAAQ,GAAGF,aAAa,CAAC/C,GAAG,CAAC,UAAU,CAAC;EAC9C,MAAMkD,aAAa,GAAGjB,aAAa,CAACgB,QAAQ,CAAC;EAC7C,OACEC,aAAa,KAAK9B,SAAS,IAC3B8B,aAAa,CAAC,CAAC,CAAC,IAAIN,KAAK,IACzBA,KAAK,CAACM,aAAa,CAAC,CAAC,CAAC,CAAC,CAACC,QAAQ,CAACD,aAAa,CAAC,CAAC,CAAC,CAAC;AAEtD,CAAC;AAED,MAAME,KAAK,GAAGA,CACZ1D,IAA8B,EAC9B2D,IAA8B,KAC3B;EACH,IAAIC,UAAwD,GAAG5D,IAAI;EACnE,OAAO4D,UAAU,CAAC5C,gBAAgB,CAAC,CAAC,EAAE;IACpC4C,UAAU,GAAGA,UAAU,CAACtD,GAAG,CAAC,QAAQ,CAAC;EACvC;EAEA,MAAMkD,aAAa,GAAGlC,SAAS,CAACsC,UAAU,CAAC;EAC3C,OACEJ,aAAa,KAAK9B,SAAS,IAC3B8B,aAAa,CAAC,CAAC,CAAC,IAAIG,IAAI,IACxBA,IAAI,CAACH,aAAa,CAAC,CAAC,CAAC,CAAC,CAACC,QAAQ,CAACD,aAAa,CAAC,CAAC,CAAC,CAAC;AAErD,CAAC;AAED,MAAMK,kBAAkB,GAAG,KAAK;AAEhC,MAAMC,0BAA0B,GAAG,CACjC,iBAAiB,EACjB,IAAI,EACJ,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,CACvB;AAEM,MAAMC,mBAAmB,GAAGA,CACjCxC,WAA8B,EAC9ByC,OAA4B,KACzB;EAAA,IAAAC,aAAA,EAAAC,qBAAA;EACH,MAAMP,IAAI,IAAAM,aAAA,GAAGD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEL,IAAI,cAAAM,aAAA,cAAAA,aAAA,GAAI,CAAC,CAAC;EAEhC,MAAME,cAAc,IAAAD,qBAAA,GAAGF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEG,cAAc,cAAAD,qBAAA,cAAAA,qBAAA,GAAI;IAChDE,KAAK,EAAE,CAACP,kBAAkB;EAC5B,CAAC;EAED,IACEQ,KAAK,CAACC,OAAO,CAACH,cAAc,CAACC,KAAK,CAAC,IACnCD,cAAc,CAACC,KAAK,CAACX,QAAQ,CAACI,kBAAkB,CAAC,EACjD;IACA,MAAMU,GAAG,GAAGJ,cAAc,CAACC,KAAK,CAACI,OAAO,CAACX,kBAAkB,CAAC;IAC5DM,cAAc,CAACC,KAAK,GAAG,CAAC,GAAGD,cAAc,CAACC,KAAK,CAAC;IAChDD,cAAc,CAACC,KAAK,CAACK,MAAM,CAACF,GAAG,EAAE,CAAC,EAAE,GAAGT,0BAA0B,CAAC;EACpE;EAEAvC,WAAW,CAACmD,QAAQ,CAClB;IACE;IACA;IACAC,cAAc,EAAE;MACdC,KAAKA,CAACpD,CAAC,EAAE;QACP,IAAI,IAAAqD,8CAAsB,EAACrD,CAAC,CAAC,EAAE;UAC7B,IAAAsD,sCAAkB,EAACtD,CAAC,CAAC;QACvB;QAEA,IAAIkC,KAAK,CAAClC,CAAC,EAAEmC,IAAI,CAAC,EAAE;UAClB,IAAAoB,yBAAW,EAAC,CACV,SAAS,EACTvD,CAAC,EACDqB,WAAC,CAACmC,uBAAuB,CAAC,EAAE,EAAEnC,WAAC,CAACoC,WAAW,CAAC,CAAC,CAAC,CAC/C,CAAC;QACJ;MACF;IACF,CAAC;IACDC,UAAU,EAAE;MACVN,KAAK,EAAEE;IACT,CAAC;IACDK,WAAW,EAAE;MACXP,KAAK,EAAEE;IACT,CAAC;IACDM,gBAAgBA,CAAC5D,CAAC,EAAE6D,KAAK,EAAE;MACzB,MAAMC,GAAG,GAAG9D,CAAC,CAAClB,GAAG,CAAC,QAAQ,CAAC;MAC3B,MAAMiF,IAAI,GAAG/D,CAAC,CAAClB,GAAG,CAAC,UAAU,CAAC;MAC9B,IAAI,CAACgF,GAAG,CAACrF,YAAY,CAAC;QAAEd,IAAI,EAAE;MAAS,CAAC,CAAC,EAAE;QACzC;MACF;MAEA,MAAMA,IAAI,GAAGY,eAAe,CAACwF,IAAI,CAAC;MAClC,IAAI,CAACpG,IAAI,EAAE;QACT;MACF;MAEAkG,KAAK,CAACG,YAAY,CAACC,GAAG,CAACtG,IAAI,CAAC;MAC5B;MACAkG,KAAK,CAACK,OAAO,GAAGL,KAAK,CAACK,OAAO,CAACC,MAAM,CAAE3G,EAAE,IAAK;QAC3C,IAAIA,EAAE,CAACI,IAAI,CAACD,IAAI,KAAKA,IAAI,EAAE;UACzB,IAAAkC,+BAAiB,EAAC,CAACrC,EAAE,CAAC,CAAC;UACvB,OAAO,KAAK;QACd;QAEA,OAAO,IAAI;MACb,CAAC,CAAC;IACJ,CAAC;IACD4G,YAAYA,CAACpE,CAAC,EAAE;MACd;MACA,IAAAH,+BAAiB,EAAC,CAACG,CAAC,CAAC,CAAC;IACxB,CAAC;IACDqE,UAAUA,CAACrE,CAAC,EAAE6D,KAAK,EAAE;MACnB,IAAI7D,CAAC,CAACQ,IAAI,CAAEnB,MAAM,IAAKA,MAAM,CAACyC,iBAAiB,CAAC,CAAC,CAAC,EAAE;QAClD;QACA;MACF;MACA,IAAI3D,eAAe,CAAC6B,CAAC,CAAC,EAAE;QACtB,IACEA,CAAC,CAACQ,IAAI,CACHS,UAAU,IACTA,UAAU,CAACqD,iBAAiB,CAAC;UAAEC,QAAQ,EAAE;QAAS,CAAC,CAAC,IACpDtD,UAAU,CAACuD,aAAa,CAAC,CAC7B,CAAC,EACD;UACA;UACA;QACF;QAEA,IAAIxE,CAAC,CAACiB,UAAU,CAACwD,eAAe,CAAC,CAAC,EAAE;UAClC;UACA;QACF;QACA,IAAIzE,CAAC,CAACiB,UAAU,CAACxB,kBAAkB,CAAC,CAAC,IAAIO,CAAC,CAAC0E,GAAG,KAAK,UAAU,EAAE;UAC7D;UACA;UACA;QACF;QAEA/E,qBAAqB,CAACK,CAAC,CAAC;QAExB;MACF;MAEA,IAAI6D,KAAK,CAACG,YAAY,CAAC5F,GAAG,CAAC4B,CAAC,CAACpC,IAAI,CAACD,IAAI,CAAC,EAAE;QACvCgC,qBAAqB,CAACK,CAAC,CAAC;MAC1B,CAAC,MAAM,IAAIzC,QAAQ,CAACyC,CAAC,CAAC,EAAE;QACtB6D,KAAK,CAACK,OAAO,CAACS,IAAI,CAAC3E,CAAC,CAAC;MACvB;IACF,CAAC;IAED;IACA;IACA4E,eAAeA,CAAC5E,CAAC,EAAE;MACjB,IAAIA,CAAC,CAACpC,IAAI,CAAC2G,QAAQ,KAAK,QAAQ,EAAE;QAChC;MACF;MACA,MAAMvF,GAAG,GAAGgB,CAAC,CAAClB,GAAG,CAAC,UAAU,CAAC;MAC7B,IAAI,CAACE,GAAG,CAACP,YAAY,CAAC,CAAC,IAAI,CAACJ,eAAe,CAACW,GAAG,CAAC,EAAE;QAChD;MACF;MAEA,IAAAuE,yBAAW,EAAC,CACV,SAAS,EACTvD,CAAC,EACD;QAAE6E,IAAI,EAAE,eAAe;QAAElG,KAAK,EAAE;MAAY,CAAC,CAC9C,CAAC;IACJ,CAAC;IACDmG,kBAAkBA,CAAC9E,CAAC,EAAE;MACpB,MAAMxC,EAAE,GAAGwC,CAAC,CAAClB,GAAG,CAAC,IAAI,CAAC;MACtB,MAAMiG,IAAI,GAAG/E,CAAC,CAAClB,GAAG,CAAC,MAAM,CAAC;MAC1B,IACEtB,EAAE,CAACiB,YAAY,CAAC,CAAC,IACjBgD,WAAW,CAACjE,EAAE,EAAEmF,cAAc,CAAC,IAC/BoC,IAAI,CAACC,YAAY,CAAC,CAAC,EACnB;QACA;QACA,IAAAzB,yBAAW,EAAC,CACV,SAAS,EACTwB,IAAI,EACJ1D,WAAC,CAACmC,uBAAuB,CAAC,EAAE,EAAEnC,WAAC,CAACoC,WAAW,CAAC,CAAC,CAAC,CAC/C,CAAC;MACJ;IACF;EACF,CAAC,EACD;IACES,OAAO,EAAE,EAA4B;IACrCF,YAAY,EAAE,IAAIhG,GAAG,CAAS;EAChC,CACF,CAAC;AACH,CAAC;AAACiH,OAAA,CAAA1C,mBAAA,GAAAA,mBAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyw-in-js/transform",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "dependencies": {
5
5
  "@babel/core": "^7.23.5",
6
6
  "@babel/generator": "^7.23.5",
@@ -35,6 +35,7 @@ function buildCodeFrameError(path, message) {
35
35
  }
36
36
  const definedTagsCache = new Map();
37
37
  const resolvedTagResolverSourceCache = new Map();
38
+ let didWarnSkipSymbolMismatch = false;
38
39
  const getResolvedTagResolverSource = (source, sourceFile) => {
39
40
  if (!sourceFile) {
40
41
  return undefined;
@@ -336,6 +337,20 @@ function createProcessorInstance(definedProcessor, imports, path, fileContext, o
336
337
  cache.set(path.node, null);
337
338
  return null;
338
339
  }
340
+ if (typeof e === 'symbol' &&
341
+ e.description === processor_utils_1.BaseProcessor.SKIP.description) {
342
+ if (!didWarnSkipSymbolMismatch) {
343
+ didWarnSkipSymbolMismatch = true;
344
+ // eslint-disable-next-line no-console
345
+ console.warn([
346
+ "[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.",
347
+ 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',
348
+ 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',
349
+ ].join('\n'));
350
+ }
351
+ cache.set(path.node, null);
352
+ return null;
353
+ }
339
354
  if (e instanceof Error) {
340
355
  throw buildCodeFrameError(path, e.message);
341
356
  }
@@ -26,6 +26,7 @@ const ssrCheckFields = new Set([
26
26
  const forbiddenGlobals = new Set([
27
27
  ...ssrCheckFields,
28
28
  '$RefreshReg$',
29
+ '$RefreshSig$',
29
30
  'XMLHttpRequest',
30
31
  'clearImmediate',
31
32
  'clearInterval',
@@ -36,8 +37,13 @@ const forbiddenGlobals = new Set([
36
37
  'setInterval',
37
38
  'setTimeout',
38
39
  ]);
40
+ const alwaysForbiddenIdentifiers = new Set(['$RefreshReg$', '$RefreshSig$']);
39
41
  const isBrowserGlobal = (id) => {
40
- return forbiddenGlobals.has(id.node.name) && isGlobal(id);
42
+ const { name } = id.node;
43
+ if (alwaysForbiddenIdentifiers.has(name)) {
44
+ return (0, findIdentifiers_1.nonType)(id);
45
+ }
46
+ return forbiddenGlobals.has(name) && isGlobal(id);
41
47
  };
42
48
  const isSSRCheckField = (id) => {
43
49
  return ssrCheckFields.has(id.node.name) && isGlobal(id);