react-code-locator 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/babel.cjs +6 -5
- package/dist/babel.cjs.map +1 -1
- package/dist/babel.js +6 -5
- package/dist/babel.js.map +1 -1
- package/dist/babelInjectComponentSource.cjs +0 -3
- package/dist/babelInjectComponentSource.cjs.map +1 -1
- package/dist/babelInjectComponentSource.js +0 -3
- package/dist/babelInjectComponentSource.js.map +1 -1
- package/dist/client.cjs +0 -3
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +0 -3
- package/dist/client.js.map +1 -1
- package/dist/esbuild.cjs +8 -7
- package/dist/esbuild.cjs.map +1 -1
- package/dist/esbuild.js +8 -7
- package/dist/esbuild.js.map +1 -1
- package/dist/index.cjs +29 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +29 -13
- package/dist/index.js.map +1 -1
- package/dist/swc.cjs +8 -7
- package/dist/swc.cjs.map +1 -1
- package/dist/swc.js +8 -7
- package/dist/swc.js.map +1 -1
- package/dist/vite.cjs +11 -7
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.js +11 -7
- package/dist/vite.js.map +1 -1
- package/dist/webpackRuntimeEntry.cjs +0 -3
- package/dist/webpackRuntimeEntry.cjs.map +1 -1
- package/dist/webpackRuntimeEntry.js +0 -3
- package/dist/webpackRuntimeEntry.js.map +1 -1
- package/package.json +1 -1
package/dist/esbuild.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/esbuild.ts","../src/sourceAdapter.ts","../src/sourceTransform.ts","../src/babelInjectComponentSource.ts","../src/constants.ts","../src/sourceMetadata.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { defineSourceAdapter, type SourceInjectionOptions } from \"./sourceAdapter\";\nimport { transformSourceWithLocator } from \"./sourceTransform\";\n\ntype EsbuildOnLoadResult = {\n contents: string;\n loader: \"js\" | \"jsx\" | \"ts\" | \"tsx\";\n};\n\ntype EsbuildPluginBuild = {\n onLoad: (\n options: { filter: RegExp },\n callback: (args: { path: string }) => Promise<EsbuildOnLoadResult | null>,\n ) => void;\n};\n\nexport type EsbuildPlugin = {\n name: string;\n setup: (build: EsbuildPluginBuild) => void;\n};\n\nexport type EsbuildSourceAdapterConfig = {\n plugins: EsbuildPlugin[];\n};\n\nfunction getEsbuildLoader(filename: string): EsbuildOnLoadResult[\"loader\"] {\n if (filename.endsWith(\".tsx\")) {\n return \"tsx\";\n }\n\n if (filename.endsWith(\".ts\")) {\n return \"ts\";\n }\n\n if (filename.endsWith(\".jsx\")) {\n return \"jsx\";\n }\n\n return \"js\";\n}\n\nexport function esbuildSourceTransformPlugin(\n options: SourceInjectionOptions = {},\n): EsbuildPlugin {\n return {\n name: \"react-code-locator-source-transform\",\n setup(build) {\n build.onLoad({ filter: /\\.[mc]?[jt]sx?$/ }, async ({ path }) => {\n if (path.includes(\"/node_modules/\")) {\n return null;\n }\n\n const code = await readFile(path, \"utf8\");\n const result = await transformSourceWithLocator(code, {\n filename: path,\n ...options,\n });\n\n return {\n contents: result.code,\n loader: getEsbuildLoader(path),\n };\n });\n },\n };\n}\n\nexport function createEsbuildSourceAdapter(options: SourceInjectionOptions = {}) {\n return defineSourceAdapter<EsbuildSourceAdapterConfig>({\n kind: \"esbuild\",\n name: \"react-code-locator/esbuild\",\n options,\n config: {\n plugins: [esbuildSourceTransformPlugin(options)],\n },\n });\n}\n\nexport const esbuildSourceAdapter = createEsbuildSourceAdapter();\n","export type SourceInjectionOptions = {\n injectJsxSource?: boolean;\n injectComponentSource?: boolean;\n projectRoot?: string;\n};\n\nexport type SourceAdapterKind = \"babel\" | \"vite\" | \"esbuild\" | \"swc\";\n\nexport type SourceAdapterDescriptor<TConfig = unknown, TOptions = SourceInjectionOptions> = {\n kind: SourceAdapterKind;\n name: string;\n options: TOptions;\n config: TConfig;\n};\n\nexport function defineSourceAdapter<TConfig = unknown, TOptions = SourceInjectionOptions>(\n descriptor: SourceAdapterDescriptor<TConfig, TOptions>,\n) {\n return descriptor;\n}\n","import { transformAsync } from \"@babel/core\";\nimport { babelInjectComponentSource, type BabelInjectComponentSourceOptions } from \"./babelInjectComponentSource\";\n\nexport type SourceTransformOptions = BabelInjectComponentSourceOptions & {\n filename: string;\n sourceMaps?: boolean;\n};\n\nexport async function transformSourceWithLocator(\n code: string,\n options: SourceTransformOptions,\n) {\n const { filename, sourceMaps = true, ...pluginOptions } = options;\n const result = await transformAsync(code, {\n filename,\n babelrc: false,\n configFile: false,\n sourceMaps,\n parserOpts: {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n },\n generatorOpts: {\n retainLines: true,\n },\n plugins: [[babelInjectComponentSource, pluginOptions]],\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map ?? null,\n };\n}\n","import { types as t, type NodePath, type PluginObj } from \"@babel/core\";\nimport {\n JSX_SOURCE_PROP,\n JSX_SOURCE_REGISTRY_SYMBOL,\n SOURCE_PROP,\n} from \"./constants\";\nimport type { SourceInjectionOptions } from \"./sourceAdapter\";\nimport {\n isExternalToProjectRoot,\n toRelativeSource,\n} from \"./sourceMetadata\";\n\nexport type BabelInjectComponentSourceOptions = SourceInjectionOptions;\n\ntype BabelState = {\n file?: {\n opts?: {\n filename?: string;\n };\n };\n injectedIntrinsicHelper?: boolean;\n};\n\ntype BindingLike = {\n path: NodePath;\n};\n\nconst SOURCE_PROP_LOCAL = \"_componentSourceLoc\";\nconst SOURCE_PROPS_REST = \"__reactCodeLocatorProps\";\n\nfunction isComponentName(name: string) {\n return /^[A-Z]/.test(name);\n}\n\nfunction isCustomComponentTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n if (t.isJSXIdentifier(name)) {\n return isComponentName(name.name);\n }\n\n if (t.isJSXMemberExpression(name)) {\n return true;\n }\n\n return false;\n}\n\nfunction isIntrinsicElementTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n return t.isJSXIdentifier(name) && /^[a-z]/.test(name.name);\n}\n\nfunction isElementFactoryIdentifier(name: string) {\n return (\n name === \"jsx\" ||\n name === \"jsxs\" ||\n name === \"jsxDEV\" ||\n name === \"_jsx\" ||\n name === \"_jsxs\" ||\n name === \"_jsxDEV\" ||\n name === \"createElement\"\n );\n}\n\nfunction isReactElementFactoryCall(pathNode: NodePath<t.CallExpression>) {\n const callee = pathNode.node.callee;\n\n if (t.isIdentifier(callee)) {\n return isElementFactoryIdentifier(callee.name);\n }\n\n return (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object, { name: \"React\" }) &&\n t.isIdentifier(callee.property, { name: \"createElement\" })\n );\n}\n\nfunction getRootJsxIdentifierName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n\n if (t.isJSXMemberExpression(name)) {\n return getRootJsxIdentifierName(name.object);\n }\n\n return null;\n}\n\nfunction isStyledModuleImport(binding: BindingLike | undefined) {\n if (!binding) {\n return false;\n }\n\n if (\n !binding.path.isImportSpecifier() &&\n !binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()\n ) {\n return false;\n }\n\n const source = binding.path.parentPath.isImportDeclaration()\n ? binding.path.parentPath.node.source.value\n : null;\n if (typeof source !== \"string\") {\n return false;\n }\n\n const normalized = source.replace(/\\\\/g, \"/\");\n return (\n normalized === \"./styled\" ||\n normalized === \"../styled\" ||\n normalized.endsWith(\"/styled\")\n );\n}\n\nfunction isSupportedComponentInit(\n node: t.Expression | null | undefined,\n): boolean {\n if (!node) {\n return false;\n }\n\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return true;\n }\n\n if (!t.isCallExpression(node)) {\n return false;\n }\n\n if (\n t.isIdentifier(node.callee) &&\n (node.callee.name === \"memo\" || node.callee.name === \"forwardRef\")\n ) {\n return true;\n }\n\n return (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object, { name: \"React\" }) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === \"memo\" ||\n node.callee.property.name === \"forwardRef\")\n );\n}\n\nfunction hasSourcePropBinding(pattern: t.ObjectPattern) {\n return pattern.properties.some((property: t.ObjectPattern[\"properties\"][number]) => {\n if (!t.isObjectProperty(property)) {\n return false;\n }\n\n return (\n t.isIdentifier(property.key) && property.key.name === JSX_SOURCE_PROP\n );\n });\n}\n\nfunction injectSourcePropBinding(pattern: t.ObjectPattern) {\n if (hasSourcePropBinding(pattern)) {\n return;\n }\n\n const sourceBinding = t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n );\n\n const restIndex = pattern.properties.findIndex((property: t.ObjectPattern[\"properties\"][number]) =>\n t.isRestElement(property),\n );\n if (restIndex === -1) {\n pattern.properties.push(sourceBinding);\n return;\n }\n\n pattern.properties.splice(restIndex, 0, sourceBinding);\n}\n\nfunction injectSourcePropIntoIdentifierParam(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n param: t.Identifier,\n) {\n if (!t.isBlockStatement(node.body)) {\n node.body = t.blockStatement([t.returnStatement(node.body)]);\n }\n\n const alreadyInjected = node.body.body.some(\n (statement: t.Statement) =>\n t.isVariableDeclaration(statement) &&\n statement.declarations.some(\n (declaration: t.VariableDeclarator) =>\n t.isIdentifier(declaration.id) &&\n declaration.id.name === SOURCE_PROPS_REST,\n ),\n );\n if (alreadyInjected) {\n return;\n }\n\n node.body.body.unshift(\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.objectPattern([\n t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n ),\n t.restElement(t.identifier(SOURCE_PROPS_REST)),\n ]),\n param,\n ),\n ]),\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(param.name),\n t.identifier(SOURCE_PROPS_REST),\n ),\n ),\n );\n}\n\nfunction injectSourcePropIntoFunctionParams(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n) {\n const firstParam = node.params[0];\n if (!firstParam) {\n return;\n }\n\n if (t.isObjectPattern(firstParam)) {\n injectSourcePropBinding(firstParam);\n return;\n }\n\n if (t.isIdentifier(firstParam)) {\n injectSourcePropIntoIdentifierParam(node, firstParam);\n }\n}\n\nfunction injectSourcePropIntoExpression(node: t.Expression | null | undefined) {\n if (!node) {\n return;\n }\n\n if (t.isFunctionExpression(node) || t.isArrowFunctionExpression(node)) {\n injectSourcePropIntoFunctionParams(node);\n return;\n }\n\n if (!t.isCallExpression(node)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (\n firstArg &&\n !t.isSpreadElement(firstArg) &&\n (t.isFunctionExpression(firstArg) || t.isArrowFunctionExpression(firstArg))\n ) {\n injectSourcePropIntoFunctionParams(firstArg);\n }\n}\n\nfunction getSourceValue(\n state: BabelState,\n loc: { line: number; column: number } | null | undefined,\n projectRoot?: string,\n) {\n const filename = state.file?.opts?.filename;\n if (!filename || !loc) {\n return null;\n }\n\n return toRelativeSource(filename, loc, projectRoot);\n}\n\nfunction buildAssignment(name: string, sourceValue: string) {\n return t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(name), t.identifier(SOURCE_PROP)),\n t.stringLiteral(sourceValue),\n ),\n );\n}\n\nfunction buildIntrinsicSourceHelper() {\n return t.functionDeclaration(\n t.identifier(\"_markIntrinsicElementSource\"),\n [t.identifier(\"element\"), t.identifier(\"source\")],\n t.blockStatement([\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"registryKey\"),\n t.callExpression(\n t.memberExpression(t.identifier(\"Symbol\"), t.identifier(\"for\")),\n [t.stringLiteral(JSX_SOURCE_REGISTRY_SYMBOL)],\n ),\n ),\n ]),\n t.variableDeclaration(\"let\", [\n t.variableDeclarator(\n t.identifier(\"registry\"),\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n ),\n ]),\n t.ifStatement(\n t.unaryExpression(\n \"!\",\n t.binaryExpression(\"instanceof\", t.identifier(\"registry\"), t.identifier(\"WeakMap\")),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(\"registry\"),\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n t.newExpression(t.identifier(\"WeakMap\"), []),\n ),\n ),\n ),\n ]),\n ),\n t.ifStatement(\n t.logicalExpression(\n \"&&\",\n t.identifier(\"element\"),\n t.logicalExpression(\n \"&&\",\n t.binaryExpression(\"===\", t.unaryExpression(\"typeof\", t.identifier(\"element\")), t.stringLiteral(\"object\")),\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\"))),\n t.stringLiteral(\"object\"),\n ),\n ),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.callExpression(\n t.memberExpression(t.identifier(\"registry\"), t.identifier(\"set\")),\n [t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\")), t.identifier(\"source\")],\n ),\n ),\n ]),\n ),\n t.returnStatement(t.identifier(\"element\")),\n ]),\n );\n}\n\nfunction ensureIntrinsicSourceHelper(programPath: NodePath<t.Program>, state: BabelState) {\n if (state.injectedIntrinsicHelper) {\n return;\n }\n\n const alreadyExists = programPath.node.body.some(\n (node: t.Statement) =>\n t.isFunctionDeclaration(node) && t.isIdentifier(node.id, { name: \"_markIntrinsicElementSource\" }),\n );\n if (!alreadyExists) {\n programPath.unshiftContainer(\"body\", buildIntrinsicSourceHelper());\n }\n\n state.injectedIntrinsicHelper = true;\n}\n\nfunction visitDeclaration(\n declarationPath: NodePath,\n insertAfterPath: NodePath,\n state: BabelState,\n seen: Set<string>,\n projectRoot?: string,\n) {\n if (\n declarationPath.isFunctionDeclaration() ||\n declarationPath.isClassDeclaration()\n ) {\n const name = declarationPath.node.id?.name;\n if (!name || !isComponentName(name) || seen.has(name)) {\n return;\n }\n\n if (declarationPath.isFunctionDeclaration()) {\n injectSourcePropIntoFunctionParams(declarationPath.node);\n }\n\n const sourceValue = getSourceValue(\n state,\n declarationPath.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n seen.add(name);\n insertAfterPath.insertAfter(buildAssignment(name, sourceValue));\n return;\n }\n\n if (!declarationPath.isVariableDeclaration()) {\n return;\n }\n\n const assignments = declarationPath.node.declarations.flatMap(\n (declarator: t.VariableDeclarator) => {\n if (\n !t.isIdentifier(declarator.id) ||\n !isComponentName(declarator.id.name) ||\n seen.has(declarator.id.name)\n ) {\n return [];\n }\n\n if (!declarator.init) {\n return [];\n }\n\n if (!isSupportedComponentInit(declarator.init)) {\n return [];\n }\n\n injectSourcePropIntoExpression(declarator.init);\n\n const sourceValue = getSourceValue(\n state,\n declarator.loc?.start ?? declarator.init.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return [];\n }\n\n seen.add(declarator.id.name);\n return [buildAssignment(declarator.id.name, sourceValue)];\n },\n );\n\n if (assignments.length > 0) {\n insertAfterPath.insertAfter(assignments);\n }\n}\n\nexport function babelInjectComponentSource(\n options: BabelInjectComponentSourceOptions = {},\n): PluginObj<BabelState> {\n const {\n injectJsxSource = true,\n injectComponentSource = true,\n projectRoot,\n } = options;\n\n return {\n name: \"babel-inject-component-source\",\n visitor: {\n CallExpression(pathNode: NodePath<t.CallExpression>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isReactElementFactoryCall(pathNode)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, {\n name: \"_markIntrinsicElementSource\",\n })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n pathNode.replaceWith(\n t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]),\n );\n pathNode.skip();\n },\n JSXElement: {\n exit(pathNode: NodePath<t.JSXElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isIntrinsicElementTag(pathNode.node.openingElement.name)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, { name: \"_markIntrinsicElementSource\" })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.openingElement.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n\n const wrappedNode = t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]);\n\n if (pathNode.parentPath.isJSXElement() || pathNode.parentPath.isJSXFragment()) {\n pathNode.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n if (pathNode.parentPath.isJSXExpressionContainer()) {\n pathNode.parentPath.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n pathNode.replaceWith(wrappedNode);\n },\n },\n JSXOpeningElement(pathNode: NodePath<t.JSXOpeningElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isCustomComponentTag(pathNode.node.name)) {\n return;\n }\n\n const rootIdentifierName = getRootJsxIdentifierName(pathNode.node.name);\n if (\n rootIdentifierName &&\n isExternalToProjectRoot(state.file?.opts?.filename, projectRoot) &&\n isStyledModuleImport(pathNode.scope.getBinding(rootIdentifierName))\n ) {\n return;\n }\n\n const hasSourceProp = pathNode.node.attributes.some(\n (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === JSX_SOURCE_PROP,\n );\n if (hasSourceProp) {\n return;\n }\n\n const filename = state.file?.opts?.filename;\n const loc = pathNode.node.loc?.start;\n if (!filename || !loc) {\n return;\n }\n\n pathNode.node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(JSX_SOURCE_PROP),\n t.stringLiteral(\n getSourceValue(state, loc, projectRoot) ??\n `${filename.replace(/\\\\/g, \"/\")}:${loc.line}:${loc.column + 1}`,\n ),\n ),\n );\n },\n Program(programPath: NodePath<t.Program>, state: BabelState) {\n if (!injectComponentSource) {\n return;\n }\n\n const seen = new Set<string>();\n\n for (const childPath of programPath.get(\"body\")) {\n if (\n childPath.isExportNamedDeclaration() ||\n childPath.isExportDefaultDeclaration()\n ) {\n const declarationPath = childPath.get(\"declaration\");\n if (!Array.isArray(declarationPath) && declarationPath.node) {\n visitDeclaration(declarationPath, childPath, state, seen, projectRoot);\n }\n continue;\n }\n\n visitDeclaration(childPath, childPath, state, seen, projectRoot);\n }\n },\n },\n };\n}\n","export const SOURCE_PROP = \"__componentSourceLoc\";\nexport const JSX_SOURCE_PROP = \"$componentSourceLoc\";\nexport const JSX_SOURCE_REGISTRY_SYMBOL = \"react-code-locator.jsxSourceRegistry\";\n","export type SourceLocation = {\n line: number;\n column: number;\n};\n\nfunction normalizeSlashes(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction trimTrailingSlash(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction splitPathSegments(value: string) {\n return normalizeSlashes(value).split(\"/\").filter(Boolean);\n}\n\nfunction computeRelativePath(fromPath: string, toPath: string) {\n const fromSegments = splitPathSegments(fromPath);\n const toSegments = splitPathSegments(toPath);\n\n let sharedIndex = 0;\n while (\n sharedIndex < fromSegments.length &&\n sharedIndex < toSegments.length &&\n fromSegments[sharedIndex] === toSegments[sharedIndex]\n ) {\n sharedIndex += 1;\n }\n\n const upSegments = new Array(Math.max(0, fromSegments.length - sharedIndex)).fill(\"..\");\n const downSegments = toSegments.slice(sharedIndex);\n const relativeSegments = [...upSegments, ...downSegments];\n return relativeSegments.length > 0 ? relativeSegments.join(\"/\") : \".\";\n}\n\nexport function normalizeProjectRoot(projectRoot?: string) {\n if (projectRoot) {\n return trimTrailingSlash(normalizeSlashes(projectRoot));\n }\n\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return trimTrailingSlash(normalizeSlashes(process.cwd()));\n }\n\n return \"\";\n}\n\nexport function toRelativeSource(\n filename: string | undefined,\n loc: SourceLocation | null | undefined,\n projectRoot?: string,\n) {\n if (!filename || !loc) {\n return null;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n const relPath =\n root && normalizedFilename.startsWith(`${root}/`)\n ? normalizedFilename.slice(root.length + 1)\n : root\n ? computeRelativePath(root, normalizedFilename)\n : normalizedFilename;\n return `${relPath}:${loc.line}:${loc.column + 1}`;\n}\n\nexport function getSourceFile(source: string | null) {\n if (!source) {\n return null;\n }\n\n const match = source.match(/^(.*):\\d+:\\d+$/);\n return match?.[1] ?? null;\n}\n\nexport function isProjectLocalFile(filename: string | undefined, projectRoot?: string) {\n if (!filename) {\n return false;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n\n if (!root) {\n return (\n !normalizedFilename.startsWith(\"../\") &&\n !normalizedFilename.startsWith(\"/\") &&\n !/^[A-Za-z]:\\//.test(normalizedFilename)\n );\n }\n\n if (normalizedFilename.startsWith(`${root}/`) || normalizedFilename === root) {\n return true;\n }\n\n const relativePath = computeRelativePath(root, normalizedFilename);\n return !relativePath.startsWith(\"../\");\n}\n\nexport function isExternalToProjectRoot(filename: string | undefined, projectRoot?: string) {\n return !isProjectLocalFile(filename, projectRoot);\n}\n\nexport function isProjectLocalSource(source: string, projectRoot?: string) {\n const file = getSourceFile(source);\n return isProjectLocalFile(file ?? undefined, projectRoot);\n}\n"],"mappings":"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","names":["import_core","t"]}
|
|
1
|
+
{"version":3,"sources":["../src/esbuild.ts","../src/sourceAdapter.ts","../src/sourceTransform.ts","../src/babelInjectComponentSource.ts","../src/constants.ts","../src/sourceMetadata.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { defineSourceAdapter, type SourceInjectionOptions } from \"./sourceAdapter\";\nimport { transformSourceWithLocator } from \"./sourceTransform\";\n\ntype EsbuildOnLoadResult = {\n contents: string;\n loader: \"js\" | \"jsx\" | \"ts\" | \"tsx\";\n};\n\ntype EsbuildPluginBuild = {\n onLoad: (\n options: { filter: RegExp },\n callback: (args: { path: string }) => Promise<EsbuildOnLoadResult | null>,\n ) => void;\n};\n\nexport type EsbuildPlugin = {\n name: string;\n setup: (build: EsbuildPluginBuild) => void;\n};\n\nexport type EsbuildSourceAdapterConfig = {\n plugins: EsbuildPlugin[];\n};\n\nfunction getEsbuildLoader(filename: string): EsbuildOnLoadResult[\"loader\"] {\n if (filename.endsWith(\".tsx\")) {\n return \"tsx\";\n }\n\n if (filename.endsWith(\".ts\")) {\n return \"ts\";\n }\n\n if (filename.endsWith(\".jsx\")) {\n return \"jsx\";\n }\n\n return \"js\";\n}\n\nexport function esbuildSourceTransformPlugin(\n options: SourceInjectionOptions = {},\n): EsbuildPlugin {\n return {\n name: \"react-code-locator-source-transform\",\n setup(build) {\n build.onLoad({ filter: /\\.[mc]?[jt]sx?$/ }, async ({ path }) => {\n if (path.includes(\"/node_modules/\")) {\n return null;\n }\n\n const code = await readFile(path, \"utf8\");\n const result = await transformSourceWithLocator(code, {\n filename: path,\n ...options,\n });\n\n return {\n contents: result.code,\n loader: getEsbuildLoader(path),\n };\n });\n },\n };\n}\n\nexport function createEsbuildSourceAdapter(options: SourceInjectionOptions = {}) {\n const resolvedOptions = {\n projectRoot: process.cwd(),\n ...options,\n };\n\n return defineSourceAdapter<EsbuildSourceAdapterConfig>({\n kind: \"esbuild\",\n name: \"react-code-locator/esbuild\",\n options: resolvedOptions,\n config: {\n plugins: [esbuildSourceTransformPlugin(resolvedOptions)],\n },\n });\n}\n\nexport const esbuildSourceAdapter = createEsbuildSourceAdapter();\n","export type SourceInjectionOptions = {\n injectJsxSource?: boolean;\n injectComponentSource?: boolean;\n projectRoot?: string;\n};\n\nexport type SourceAdapterKind = \"babel\" | \"vite\" | \"esbuild\" | \"swc\";\n\nexport type SourceAdapterDescriptor<TConfig = unknown, TOptions = SourceInjectionOptions> = {\n kind: SourceAdapterKind;\n name: string;\n options: TOptions;\n config: TConfig;\n};\n\nexport function defineSourceAdapter<TConfig = unknown, TOptions = SourceInjectionOptions>(\n descriptor: SourceAdapterDescriptor<TConfig, TOptions>,\n) {\n return descriptor;\n}\n","import { transformAsync } from \"@babel/core\";\nimport { babelInjectComponentSource, type BabelInjectComponentSourceOptions } from \"./babelInjectComponentSource\";\n\nexport type SourceTransformOptions = BabelInjectComponentSourceOptions & {\n filename: string;\n sourceMaps?: boolean;\n};\n\nexport async function transformSourceWithLocator(\n code: string,\n options: SourceTransformOptions,\n) {\n const { filename, sourceMaps = true, projectRoot = process.cwd(), ...pluginOptions } = options;\n const result = await transformAsync(code, {\n filename,\n babelrc: false,\n configFile: false,\n sourceMaps,\n parserOpts: {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n },\n generatorOpts: {\n retainLines: true,\n },\n plugins: [[babelInjectComponentSource, { ...pluginOptions, projectRoot }]],\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map ?? null,\n };\n}\n","import { types as t, type NodePath, type PluginObj } from \"@babel/core\";\nimport {\n JSX_SOURCE_PROP,\n JSX_SOURCE_REGISTRY_SYMBOL,\n SOURCE_PROP,\n} from \"./constants\";\nimport type { SourceInjectionOptions } from \"./sourceAdapter\";\nimport {\n isExternalToProjectRoot,\n toRelativeSource,\n} from \"./sourceMetadata\";\n\nexport type BabelInjectComponentSourceOptions = SourceInjectionOptions;\n\ntype BabelState = {\n file?: {\n opts?: {\n filename?: string;\n };\n };\n injectedIntrinsicHelper?: boolean;\n};\n\ntype BindingLike = {\n path: NodePath;\n};\n\nconst SOURCE_PROP_LOCAL = \"_componentSourceLoc\";\nconst SOURCE_PROPS_REST = \"__reactCodeLocatorProps\";\n\nfunction isComponentName(name: string) {\n return /^[A-Z]/.test(name);\n}\n\nfunction isCustomComponentTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n if (t.isJSXIdentifier(name)) {\n return isComponentName(name.name);\n }\n\n if (t.isJSXMemberExpression(name)) {\n return true;\n }\n\n return false;\n}\n\nfunction isIntrinsicElementTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n return t.isJSXIdentifier(name) && /^[a-z]/.test(name.name);\n}\n\nfunction isElementFactoryIdentifier(name: string) {\n return (\n name === \"jsx\" ||\n name === \"jsxs\" ||\n name === \"jsxDEV\" ||\n name === \"_jsx\" ||\n name === \"_jsxs\" ||\n name === \"_jsxDEV\" ||\n name === \"createElement\"\n );\n}\n\nfunction isReactElementFactoryCall(pathNode: NodePath<t.CallExpression>) {\n const callee = pathNode.node.callee;\n\n if (t.isIdentifier(callee)) {\n return isElementFactoryIdentifier(callee.name);\n }\n\n return (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object, { name: \"React\" }) &&\n t.isIdentifier(callee.property, { name: \"createElement\" })\n );\n}\n\nfunction getRootJsxIdentifierName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n\n if (t.isJSXMemberExpression(name)) {\n return getRootJsxIdentifierName(name.object);\n }\n\n return null;\n}\n\nfunction isStyledModuleImport(binding: BindingLike | undefined) {\n if (!binding) {\n return false;\n }\n\n if (\n !binding.path.isImportSpecifier() &&\n !binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()\n ) {\n return false;\n }\n\n const source = binding.path.parentPath.isImportDeclaration()\n ? binding.path.parentPath.node.source.value\n : null;\n if (typeof source !== \"string\") {\n return false;\n }\n\n const normalized = source.replace(/\\\\/g, \"/\");\n return (\n normalized === \"./styled\" ||\n normalized === \"../styled\" ||\n normalized.endsWith(\"/styled\")\n );\n}\n\nfunction isSupportedComponentInit(\n node: t.Expression | null | undefined,\n): boolean {\n if (!node) {\n return false;\n }\n\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return true;\n }\n\n if (!t.isCallExpression(node)) {\n return false;\n }\n\n if (\n t.isIdentifier(node.callee) &&\n (node.callee.name === \"memo\" || node.callee.name === \"forwardRef\")\n ) {\n return true;\n }\n\n return (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object, { name: \"React\" }) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === \"memo\" ||\n node.callee.property.name === \"forwardRef\")\n );\n}\n\nfunction hasSourcePropBinding(pattern: t.ObjectPattern) {\n return pattern.properties.some((property: t.ObjectPattern[\"properties\"][number]) => {\n if (!t.isObjectProperty(property)) {\n return false;\n }\n\n return (\n t.isIdentifier(property.key) && property.key.name === JSX_SOURCE_PROP\n );\n });\n}\n\nfunction injectSourcePropBinding(pattern: t.ObjectPattern) {\n if (hasSourcePropBinding(pattern)) {\n return;\n }\n\n const sourceBinding = t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n );\n\n const restIndex = pattern.properties.findIndex((property: t.ObjectPattern[\"properties\"][number]) =>\n t.isRestElement(property),\n );\n if (restIndex === -1) {\n pattern.properties.push(sourceBinding);\n return;\n }\n\n pattern.properties.splice(restIndex, 0, sourceBinding);\n}\n\nfunction injectSourcePropIntoIdentifierParam(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n param: t.Identifier,\n) {\n if (!t.isBlockStatement(node.body)) {\n node.body = t.blockStatement([t.returnStatement(node.body)]);\n }\n\n const alreadyInjected = node.body.body.some(\n (statement: t.Statement) =>\n t.isVariableDeclaration(statement) &&\n statement.declarations.some(\n (declaration: t.VariableDeclarator) =>\n t.isIdentifier(declaration.id) &&\n declaration.id.name === SOURCE_PROPS_REST,\n ),\n );\n if (alreadyInjected) {\n return;\n }\n\n node.body.body.unshift(\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.objectPattern([\n t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n ),\n t.restElement(t.identifier(SOURCE_PROPS_REST)),\n ]),\n param,\n ),\n ]),\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(param.name),\n t.identifier(SOURCE_PROPS_REST),\n ),\n ),\n );\n}\n\nfunction injectSourcePropIntoFunctionParams(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n) {\n const firstParam = node.params[0];\n if (!firstParam) {\n return;\n }\n\n if (t.isObjectPattern(firstParam)) {\n injectSourcePropBinding(firstParam);\n return;\n }\n\n if (t.isIdentifier(firstParam)) {\n injectSourcePropIntoIdentifierParam(node, firstParam);\n }\n}\n\nfunction injectSourcePropIntoExpression(node: t.Expression | null | undefined) {\n if (!node) {\n return;\n }\n\n if (t.isFunctionExpression(node) || t.isArrowFunctionExpression(node)) {\n injectSourcePropIntoFunctionParams(node);\n return;\n }\n\n if (!t.isCallExpression(node)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (\n firstArg &&\n !t.isSpreadElement(firstArg) &&\n (t.isFunctionExpression(firstArg) || t.isArrowFunctionExpression(firstArg))\n ) {\n injectSourcePropIntoFunctionParams(firstArg);\n }\n}\n\nfunction getSourceValue(\n state: BabelState,\n loc: { line: number; column: number } | null | undefined,\n projectRoot?: string,\n) {\n const filename = state.file?.opts?.filename;\n if (!filename || !loc) {\n return null;\n }\n\n return toRelativeSource(filename, loc, projectRoot);\n}\n\nfunction buildAssignment(name: string, sourceValue: string) {\n return t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(name), t.identifier(SOURCE_PROP)),\n t.stringLiteral(sourceValue),\n ),\n );\n}\n\nfunction buildIntrinsicSourceHelper() {\n return t.functionDeclaration(\n t.identifier(\"_markIntrinsicElementSource\"),\n [t.identifier(\"element\"), t.identifier(\"source\")],\n t.blockStatement([\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"registryKey\"),\n t.callExpression(\n t.memberExpression(t.identifier(\"Symbol\"), t.identifier(\"for\")),\n [t.stringLiteral(JSX_SOURCE_REGISTRY_SYMBOL)],\n ),\n ),\n ]),\n t.variableDeclaration(\"let\", [\n t.variableDeclarator(\n t.identifier(\"registry\"),\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n ),\n ]),\n t.ifStatement(\n t.unaryExpression(\n \"!\",\n t.binaryExpression(\"instanceof\", t.identifier(\"registry\"), t.identifier(\"WeakMap\")),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(\"registry\"),\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n t.newExpression(t.identifier(\"WeakMap\"), []),\n ),\n ),\n ),\n ]),\n ),\n t.ifStatement(\n t.logicalExpression(\n \"&&\",\n t.identifier(\"element\"),\n t.logicalExpression(\n \"&&\",\n t.binaryExpression(\"===\", t.unaryExpression(\"typeof\", t.identifier(\"element\")), t.stringLiteral(\"object\")),\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\"))),\n t.stringLiteral(\"object\"),\n ),\n ),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.callExpression(\n t.memberExpression(t.identifier(\"registry\"), t.identifier(\"set\")),\n [t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\")), t.identifier(\"source\")],\n ),\n ),\n ]),\n ),\n t.returnStatement(t.identifier(\"element\")),\n ]),\n );\n}\n\nfunction ensureIntrinsicSourceHelper(programPath: NodePath<t.Program>, state: BabelState) {\n if (state.injectedIntrinsicHelper) {\n return;\n }\n\n const alreadyExists = programPath.node.body.some(\n (node: t.Statement) =>\n t.isFunctionDeclaration(node) && t.isIdentifier(node.id, { name: \"_markIntrinsicElementSource\" }),\n );\n if (!alreadyExists) {\n programPath.unshiftContainer(\"body\", buildIntrinsicSourceHelper());\n }\n\n state.injectedIntrinsicHelper = true;\n}\n\nfunction visitDeclaration(\n declarationPath: NodePath,\n insertAfterPath: NodePath,\n state: BabelState,\n seen: Set<string>,\n projectRoot?: string,\n) {\n if (\n declarationPath.isFunctionDeclaration() ||\n declarationPath.isClassDeclaration()\n ) {\n const name = declarationPath.node.id?.name;\n if (!name || !isComponentName(name) || seen.has(name)) {\n return;\n }\n\n if (declarationPath.isFunctionDeclaration()) {\n injectSourcePropIntoFunctionParams(declarationPath.node);\n }\n\n const sourceValue = getSourceValue(\n state,\n declarationPath.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n seen.add(name);\n insertAfterPath.insertAfter(buildAssignment(name, sourceValue));\n return;\n }\n\n if (!declarationPath.isVariableDeclaration()) {\n return;\n }\n\n const assignments = declarationPath.node.declarations.flatMap(\n (declarator: t.VariableDeclarator) => {\n if (\n !t.isIdentifier(declarator.id) ||\n !isComponentName(declarator.id.name) ||\n seen.has(declarator.id.name)\n ) {\n return [];\n }\n\n if (!declarator.init) {\n return [];\n }\n\n if (!isSupportedComponentInit(declarator.init)) {\n return [];\n }\n\n injectSourcePropIntoExpression(declarator.init);\n\n const sourceValue = getSourceValue(\n state,\n declarator.loc?.start ?? declarator.init.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return [];\n }\n\n seen.add(declarator.id.name);\n return [buildAssignment(declarator.id.name, sourceValue)];\n },\n );\n\n if (assignments.length > 0) {\n insertAfterPath.insertAfter(assignments);\n }\n}\n\nexport function babelInjectComponentSource(\n options: BabelInjectComponentSourceOptions = {},\n): PluginObj<BabelState> {\n const {\n injectJsxSource = true,\n injectComponentSource = true,\n projectRoot,\n } = options;\n\n return {\n name: \"babel-inject-component-source\",\n visitor: {\n CallExpression(pathNode: NodePath<t.CallExpression>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isReactElementFactoryCall(pathNode)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, {\n name: \"_markIntrinsicElementSource\",\n })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n pathNode.replaceWith(\n t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]),\n );\n pathNode.skip();\n },\n JSXElement: {\n exit(pathNode: NodePath<t.JSXElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isIntrinsicElementTag(pathNode.node.openingElement.name)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, { name: \"_markIntrinsicElementSource\" })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.openingElement.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n\n const wrappedNode = t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]);\n\n if (pathNode.parentPath.isJSXElement() || pathNode.parentPath.isJSXFragment()) {\n pathNode.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n if (pathNode.parentPath.isJSXExpressionContainer()) {\n pathNode.parentPath.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n pathNode.replaceWith(wrappedNode);\n },\n },\n JSXOpeningElement(pathNode: NodePath<t.JSXOpeningElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isCustomComponentTag(pathNode.node.name)) {\n return;\n }\n\n const rootIdentifierName = getRootJsxIdentifierName(pathNode.node.name);\n if (\n rootIdentifierName &&\n isExternalToProjectRoot(state.file?.opts?.filename, projectRoot) &&\n isStyledModuleImport(pathNode.scope.getBinding(rootIdentifierName))\n ) {\n return;\n }\n\n const hasSourceProp = pathNode.node.attributes.some(\n (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === JSX_SOURCE_PROP,\n );\n if (hasSourceProp) {\n return;\n }\n\n const filename = state.file?.opts?.filename;\n const loc = pathNode.node.loc?.start;\n if (!filename || !loc) {\n return;\n }\n\n pathNode.node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(JSX_SOURCE_PROP),\n t.stringLiteral(\n getSourceValue(state, loc, projectRoot) ??\n `${filename.replace(/\\\\/g, \"/\")}:${loc.line}:${loc.column + 1}`,\n ),\n ),\n );\n },\n Program(programPath: NodePath<t.Program>, state: BabelState) {\n if (!injectComponentSource) {\n return;\n }\n\n const seen = new Set<string>();\n\n for (const childPath of programPath.get(\"body\")) {\n if (\n childPath.isExportNamedDeclaration() ||\n childPath.isExportDefaultDeclaration()\n ) {\n const declarationPath = childPath.get(\"declaration\");\n if (!Array.isArray(declarationPath) && declarationPath.node) {\n visitDeclaration(declarationPath, childPath, state, seen, projectRoot);\n }\n continue;\n }\n\n visitDeclaration(childPath, childPath, state, seen, projectRoot);\n }\n },\n },\n };\n}\n","export const SOURCE_PROP = \"__componentSourceLoc\";\nexport const JSX_SOURCE_PROP = \"$componentSourceLoc\";\nexport const JSX_SOURCE_REGISTRY_SYMBOL = \"react-code-locator.jsxSourceRegistry\";\n","export type SourceLocation = {\n line: number;\n column: number;\n};\n\nfunction normalizeSlashes(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction trimTrailingSlash(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction splitPathSegments(value: string) {\n return normalizeSlashes(value).split(\"/\").filter(Boolean);\n}\n\nfunction computeRelativePath(fromPath: string, toPath: string) {\n const fromSegments = splitPathSegments(fromPath);\n const toSegments = splitPathSegments(toPath);\n\n let sharedIndex = 0;\n while (\n sharedIndex < fromSegments.length &&\n sharedIndex < toSegments.length &&\n fromSegments[sharedIndex] === toSegments[sharedIndex]\n ) {\n sharedIndex += 1;\n }\n\n const upSegments = new Array(Math.max(0, fromSegments.length - sharedIndex)).fill(\"..\");\n const downSegments = toSegments.slice(sharedIndex);\n const relativeSegments = [...upSegments, ...downSegments];\n return relativeSegments.length > 0 ? relativeSegments.join(\"/\") : \".\";\n}\n\nexport function normalizeProjectRoot(projectRoot?: string) {\n if (projectRoot) {\n return trimTrailingSlash(normalizeSlashes(projectRoot));\n }\n return \"\";\n}\n\nexport function toRelativeSource(\n filename: string | undefined,\n loc: SourceLocation | null | undefined,\n projectRoot?: string,\n) {\n if (!filename || !loc) {\n return null;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n const relPath =\n root && normalizedFilename.startsWith(`${root}/`)\n ? normalizedFilename.slice(root.length + 1)\n : root\n ? computeRelativePath(root, normalizedFilename)\n : normalizedFilename;\n return `${relPath}:${loc.line}:${loc.column + 1}`;\n}\n\nexport function getSourceFile(source: string | null) {\n if (!source) {\n return null;\n }\n\n const match = source.match(/^(.*):\\d+:\\d+$/);\n return match?.[1] ?? null;\n}\n\nexport function isProjectLocalFile(filename: string | undefined, projectRoot?: string) {\n if (!filename) {\n return false;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n\n if (!root) {\n return (\n !normalizedFilename.startsWith(\"../\") &&\n !normalizedFilename.startsWith(\"/\") &&\n !/^[A-Za-z]:\\//.test(normalizedFilename)\n );\n }\n\n if (normalizedFilename.startsWith(`${root}/`) || normalizedFilename === root) {\n return true;\n }\n\n const relativePath = computeRelativePath(root, normalizedFilename);\n return !relativePath.startsWith(\"../\");\n}\n\nexport function isExternalToProjectRoot(filename: string | undefined, projectRoot?: string) {\n return !isProjectLocalFile(filename, projectRoot);\n}\n\nexport function isProjectLocalSource(source: string, projectRoot?: string) {\n const file = getSourceFile(source);\n return isProjectLocalFile(file ?? undefined, projectRoot);\n}\n"],"mappings":"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","names":["import_core","t"]}
|
package/dist/esbuild.js
CHANGED
|
@@ -43,9 +43,6 @@ function normalizeProjectRoot(projectRoot) {
|
|
|
43
43
|
if (projectRoot) {
|
|
44
44
|
return trimTrailingSlash(normalizeSlashes(projectRoot));
|
|
45
45
|
}
|
|
46
|
-
if (typeof process !== "undefined" && typeof process.cwd === "function") {
|
|
47
|
-
return trimTrailingSlash(normalizeSlashes(process.cwd()));
|
|
48
|
-
}
|
|
49
46
|
return "";
|
|
50
47
|
}
|
|
51
48
|
function toRelativeSource(filename, loc, projectRoot) {
|
|
@@ -514,7 +511,7 @@ function babelInjectComponentSource(options = {}) {
|
|
|
514
511
|
|
|
515
512
|
// src/sourceTransform.ts
|
|
516
513
|
async function transformSourceWithLocator(code, options) {
|
|
517
|
-
const { filename, sourceMaps = true, ...pluginOptions } = options;
|
|
514
|
+
const { filename, sourceMaps = true, projectRoot = process.cwd(), ...pluginOptions } = options;
|
|
518
515
|
const result = await transformAsync(code, {
|
|
519
516
|
filename,
|
|
520
517
|
babelrc: false,
|
|
@@ -527,7 +524,7 @@ async function transformSourceWithLocator(code, options) {
|
|
|
527
524
|
generatorOpts: {
|
|
528
525
|
retainLines: true
|
|
529
526
|
},
|
|
530
|
-
plugins: [[babelInjectComponentSource, pluginOptions]]
|
|
527
|
+
plugins: [[babelInjectComponentSource, { ...pluginOptions, projectRoot }]]
|
|
531
528
|
});
|
|
532
529
|
return {
|
|
533
530
|
code: result?.code ?? code,
|
|
@@ -570,12 +567,16 @@ function esbuildSourceTransformPlugin(options = {}) {
|
|
|
570
567
|
};
|
|
571
568
|
}
|
|
572
569
|
function createEsbuildSourceAdapter(options = {}) {
|
|
570
|
+
const resolvedOptions = {
|
|
571
|
+
projectRoot: process.cwd(),
|
|
572
|
+
...options
|
|
573
|
+
};
|
|
573
574
|
return defineSourceAdapter({
|
|
574
575
|
kind: "esbuild",
|
|
575
576
|
name: "react-code-locator/esbuild",
|
|
576
|
-
options,
|
|
577
|
+
options: resolvedOptions,
|
|
577
578
|
config: {
|
|
578
|
-
plugins: [esbuildSourceTransformPlugin(
|
|
579
|
+
plugins: [esbuildSourceTransformPlugin(resolvedOptions)]
|
|
579
580
|
}
|
|
580
581
|
});
|
|
581
582
|
}
|
package/dist/esbuild.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/esbuild.ts","../src/sourceAdapter.ts","../src/sourceTransform.ts","../src/babelInjectComponentSource.ts","../src/constants.ts","../src/sourceMetadata.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { defineSourceAdapter, type SourceInjectionOptions } from \"./sourceAdapter\";\nimport { transformSourceWithLocator } from \"./sourceTransform\";\n\ntype EsbuildOnLoadResult = {\n contents: string;\n loader: \"js\" | \"jsx\" | \"ts\" | \"tsx\";\n};\n\ntype EsbuildPluginBuild = {\n onLoad: (\n options: { filter: RegExp },\n callback: (args: { path: string }) => Promise<EsbuildOnLoadResult | null>,\n ) => void;\n};\n\nexport type EsbuildPlugin = {\n name: string;\n setup: (build: EsbuildPluginBuild) => void;\n};\n\nexport type EsbuildSourceAdapterConfig = {\n plugins: EsbuildPlugin[];\n};\n\nfunction getEsbuildLoader(filename: string): EsbuildOnLoadResult[\"loader\"] {\n if (filename.endsWith(\".tsx\")) {\n return \"tsx\";\n }\n\n if (filename.endsWith(\".ts\")) {\n return \"ts\";\n }\n\n if (filename.endsWith(\".jsx\")) {\n return \"jsx\";\n }\n\n return \"js\";\n}\n\nexport function esbuildSourceTransformPlugin(\n options: SourceInjectionOptions = {},\n): EsbuildPlugin {\n return {\n name: \"react-code-locator-source-transform\",\n setup(build) {\n build.onLoad({ filter: /\\.[mc]?[jt]sx?$/ }, async ({ path }) => {\n if (path.includes(\"/node_modules/\")) {\n return null;\n }\n\n const code = await readFile(path, \"utf8\");\n const result = await transformSourceWithLocator(code, {\n filename: path,\n ...options,\n });\n\n return {\n contents: result.code,\n loader: getEsbuildLoader(path),\n };\n });\n },\n };\n}\n\nexport function createEsbuildSourceAdapter(options: SourceInjectionOptions = {}) {\n return defineSourceAdapter<EsbuildSourceAdapterConfig>({\n kind: \"esbuild\",\n name: \"react-code-locator/esbuild\",\n options,\n config: {\n plugins: [esbuildSourceTransformPlugin(options)],\n },\n });\n}\n\nexport const esbuildSourceAdapter = createEsbuildSourceAdapter();\n","export type SourceInjectionOptions = {\n injectJsxSource?: boolean;\n injectComponentSource?: boolean;\n projectRoot?: string;\n};\n\nexport type SourceAdapterKind = \"babel\" | \"vite\" | \"esbuild\" | \"swc\";\n\nexport type SourceAdapterDescriptor<TConfig = unknown, TOptions = SourceInjectionOptions> = {\n kind: SourceAdapterKind;\n name: string;\n options: TOptions;\n config: TConfig;\n};\n\nexport function defineSourceAdapter<TConfig = unknown, TOptions = SourceInjectionOptions>(\n descriptor: SourceAdapterDescriptor<TConfig, TOptions>,\n) {\n return descriptor;\n}\n","import { transformAsync } from \"@babel/core\";\nimport { babelInjectComponentSource, type BabelInjectComponentSourceOptions } from \"./babelInjectComponentSource\";\n\nexport type SourceTransformOptions = BabelInjectComponentSourceOptions & {\n filename: string;\n sourceMaps?: boolean;\n};\n\nexport async function transformSourceWithLocator(\n code: string,\n options: SourceTransformOptions,\n) {\n const { filename, sourceMaps = true, ...pluginOptions } = options;\n const result = await transformAsync(code, {\n filename,\n babelrc: false,\n configFile: false,\n sourceMaps,\n parserOpts: {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n },\n generatorOpts: {\n retainLines: true,\n },\n plugins: [[babelInjectComponentSource, pluginOptions]],\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map ?? null,\n };\n}\n","import { types as t, type NodePath, type PluginObj } from \"@babel/core\";\nimport {\n JSX_SOURCE_PROP,\n JSX_SOURCE_REGISTRY_SYMBOL,\n SOURCE_PROP,\n} from \"./constants\";\nimport type { SourceInjectionOptions } from \"./sourceAdapter\";\nimport {\n isExternalToProjectRoot,\n toRelativeSource,\n} from \"./sourceMetadata\";\n\nexport type BabelInjectComponentSourceOptions = SourceInjectionOptions;\n\ntype BabelState = {\n file?: {\n opts?: {\n filename?: string;\n };\n };\n injectedIntrinsicHelper?: boolean;\n};\n\ntype BindingLike = {\n path: NodePath;\n};\n\nconst SOURCE_PROP_LOCAL = \"_componentSourceLoc\";\nconst SOURCE_PROPS_REST = \"__reactCodeLocatorProps\";\n\nfunction isComponentName(name: string) {\n return /^[A-Z]/.test(name);\n}\n\nfunction isCustomComponentTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n if (t.isJSXIdentifier(name)) {\n return isComponentName(name.name);\n }\n\n if (t.isJSXMemberExpression(name)) {\n return true;\n }\n\n return false;\n}\n\nfunction isIntrinsicElementTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n return t.isJSXIdentifier(name) && /^[a-z]/.test(name.name);\n}\n\nfunction isElementFactoryIdentifier(name: string) {\n return (\n name === \"jsx\" ||\n name === \"jsxs\" ||\n name === \"jsxDEV\" ||\n name === \"_jsx\" ||\n name === \"_jsxs\" ||\n name === \"_jsxDEV\" ||\n name === \"createElement\"\n );\n}\n\nfunction isReactElementFactoryCall(pathNode: NodePath<t.CallExpression>) {\n const callee = pathNode.node.callee;\n\n if (t.isIdentifier(callee)) {\n return isElementFactoryIdentifier(callee.name);\n }\n\n return (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object, { name: \"React\" }) &&\n t.isIdentifier(callee.property, { name: \"createElement\" })\n );\n}\n\nfunction getRootJsxIdentifierName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n\n if (t.isJSXMemberExpression(name)) {\n return getRootJsxIdentifierName(name.object);\n }\n\n return null;\n}\n\nfunction isStyledModuleImport(binding: BindingLike | undefined) {\n if (!binding) {\n return false;\n }\n\n if (\n !binding.path.isImportSpecifier() &&\n !binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()\n ) {\n return false;\n }\n\n const source = binding.path.parentPath.isImportDeclaration()\n ? binding.path.parentPath.node.source.value\n : null;\n if (typeof source !== \"string\") {\n return false;\n }\n\n const normalized = source.replace(/\\\\/g, \"/\");\n return (\n normalized === \"./styled\" ||\n normalized === \"../styled\" ||\n normalized.endsWith(\"/styled\")\n );\n}\n\nfunction isSupportedComponentInit(\n node: t.Expression | null | undefined,\n): boolean {\n if (!node) {\n return false;\n }\n\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return true;\n }\n\n if (!t.isCallExpression(node)) {\n return false;\n }\n\n if (\n t.isIdentifier(node.callee) &&\n (node.callee.name === \"memo\" || node.callee.name === \"forwardRef\")\n ) {\n return true;\n }\n\n return (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object, { name: \"React\" }) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === \"memo\" ||\n node.callee.property.name === \"forwardRef\")\n );\n}\n\nfunction hasSourcePropBinding(pattern: t.ObjectPattern) {\n return pattern.properties.some((property: t.ObjectPattern[\"properties\"][number]) => {\n if (!t.isObjectProperty(property)) {\n return false;\n }\n\n return (\n t.isIdentifier(property.key) && property.key.name === JSX_SOURCE_PROP\n );\n });\n}\n\nfunction injectSourcePropBinding(pattern: t.ObjectPattern) {\n if (hasSourcePropBinding(pattern)) {\n return;\n }\n\n const sourceBinding = t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n );\n\n const restIndex = pattern.properties.findIndex((property: t.ObjectPattern[\"properties\"][number]) =>\n t.isRestElement(property),\n );\n if (restIndex === -1) {\n pattern.properties.push(sourceBinding);\n return;\n }\n\n pattern.properties.splice(restIndex, 0, sourceBinding);\n}\n\nfunction injectSourcePropIntoIdentifierParam(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n param: t.Identifier,\n) {\n if (!t.isBlockStatement(node.body)) {\n node.body = t.blockStatement([t.returnStatement(node.body)]);\n }\n\n const alreadyInjected = node.body.body.some(\n (statement: t.Statement) =>\n t.isVariableDeclaration(statement) &&\n statement.declarations.some(\n (declaration: t.VariableDeclarator) =>\n t.isIdentifier(declaration.id) &&\n declaration.id.name === SOURCE_PROPS_REST,\n ),\n );\n if (alreadyInjected) {\n return;\n }\n\n node.body.body.unshift(\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.objectPattern([\n t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n ),\n t.restElement(t.identifier(SOURCE_PROPS_REST)),\n ]),\n param,\n ),\n ]),\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(param.name),\n t.identifier(SOURCE_PROPS_REST),\n ),\n ),\n );\n}\n\nfunction injectSourcePropIntoFunctionParams(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n) {\n const firstParam = node.params[0];\n if (!firstParam) {\n return;\n }\n\n if (t.isObjectPattern(firstParam)) {\n injectSourcePropBinding(firstParam);\n return;\n }\n\n if (t.isIdentifier(firstParam)) {\n injectSourcePropIntoIdentifierParam(node, firstParam);\n }\n}\n\nfunction injectSourcePropIntoExpression(node: t.Expression | null | undefined) {\n if (!node) {\n return;\n }\n\n if (t.isFunctionExpression(node) || t.isArrowFunctionExpression(node)) {\n injectSourcePropIntoFunctionParams(node);\n return;\n }\n\n if (!t.isCallExpression(node)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (\n firstArg &&\n !t.isSpreadElement(firstArg) &&\n (t.isFunctionExpression(firstArg) || t.isArrowFunctionExpression(firstArg))\n ) {\n injectSourcePropIntoFunctionParams(firstArg);\n }\n}\n\nfunction getSourceValue(\n state: BabelState,\n loc: { line: number; column: number } | null | undefined,\n projectRoot?: string,\n) {\n const filename = state.file?.opts?.filename;\n if (!filename || !loc) {\n return null;\n }\n\n return toRelativeSource(filename, loc, projectRoot);\n}\n\nfunction buildAssignment(name: string, sourceValue: string) {\n return t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(name), t.identifier(SOURCE_PROP)),\n t.stringLiteral(sourceValue),\n ),\n );\n}\n\nfunction buildIntrinsicSourceHelper() {\n return t.functionDeclaration(\n t.identifier(\"_markIntrinsicElementSource\"),\n [t.identifier(\"element\"), t.identifier(\"source\")],\n t.blockStatement([\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"registryKey\"),\n t.callExpression(\n t.memberExpression(t.identifier(\"Symbol\"), t.identifier(\"for\")),\n [t.stringLiteral(JSX_SOURCE_REGISTRY_SYMBOL)],\n ),\n ),\n ]),\n t.variableDeclaration(\"let\", [\n t.variableDeclarator(\n t.identifier(\"registry\"),\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n ),\n ]),\n t.ifStatement(\n t.unaryExpression(\n \"!\",\n t.binaryExpression(\"instanceof\", t.identifier(\"registry\"), t.identifier(\"WeakMap\")),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(\"registry\"),\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n t.newExpression(t.identifier(\"WeakMap\"), []),\n ),\n ),\n ),\n ]),\n ),\n t.ifStatement(\n t.logicalExpression(\n \"&&\",\n t.identifier(\"element\"),\n t.logicalExpression(\n \"&&\",\n t.binaryExpression(\"===\", t.unaryExpression(\"typeof\", t.identifier(\"element\")), t.stringLiteral(\"object\")),\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\"))),\n t.stringLiteral(\"object\"),\n ),\n ),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.callExpression(\n t.memberExpression(t.identifier(\"registry\"), t.identifier(\"set\")),\n [t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\")), t.identifier(\"source\")],\n ),\n ),\n ]),\n ),\n t.returnStatement(t.identifier(\"element\")),\n ]),\n );\n}\n\nfunction ensureIntrinsicSourceHelper(programPath: NodePath<t.Program>, state: BabelState) {\n if (state.injectedIntrinsicHelper) {\n return;\n }\n\n const alreadyExists = programPath.node.body.some(\n (node: t.Statement) =>\n t.isFunctionDeclaration(node) && t.isIdentifier(node.id, { name: \"_markIntrinsicElementSource\" }),\n );\n if (!alreadyExists) {\n programPath.unshiftContainer(\"body\", buildIntrinsicSourceHelper());\n }\n\n state.injectedIntrinsicHelper = true;\n}\n\nfunction visitDeclaration(\n declarationPath: NodePath,\n insertAfterPath: NodePath,\n state: BabelState,\n seen: Set<string>,\n projectRoot?: string,\n) {\n if (\n declarationPath.isFunctionDeclaration() ||\n declarationPath.isClassDeclaration()\n ) {\n const name = declarationPath.node.id?.name;\n if (!name || !isComponentName(name) || seen.has(name)) {\n return;\n }\n\n if (declarationPath.isFunctionDeclaration()) {\n injectSourcePropIntoFunctionParams(declarationPath.node);\n }\n\n const sourceValue = getSourceValue(\n state,\n declarationPath.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n seen.add(name);\n insertAfterPath.insertAfter(buildAssignment(name, sourceValue));\n return;\n }\n\n if (!declarationPath.isVariableDeclaration()) {\n return;\n }\n\n const assignments = declarationPath.node.declarations.flatMap(\n (declarator: t.VariableDeclarator) => {\n if (\n !t.isIdentifier(declarator.id) ||\n !isComponentName(declarator.id.name) ||\n seen.has(declarator.id.name)\n ) {\n return [];\n }\n\n if (!declarator.init) {\n return [];\n }\n\n if (!isSupportedComponentInit(declarator.init)) {\n return [];\n }\n\n injectSourcePropIntoExpression(declarator.init);\n\n const sourceValue = getSourceValue(\n state,\n declarator.loc?.start ?? declarator.init.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return [];\n }\n\n seen.add(declarator.id.name);\n return [buildAssignment(declarator.id.name, sourceValue)];\n },\n );\n\n if (assignments.length > 0) {\n insertAfterPath.insertAfter(assignments);\n }\n}\n\nexport function babelInjectComponentSource(\n options: BabelInjectComponentSourceOptions = {},\n): PluginObj<BabelState> {\n const {\n injectJsxSource = true,\n injectComponentSource = true,\n projectRoot,\n } = options;\n\n return {\n name: \"babel-inject-component-source\",\n visitor: {\n CallExpression(pathNode: NodePath<t.CallExpression>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isReactElementFactoryCall(pathNode)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, {\n name: \"_markIntrinsicElementSource\",\n })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n pathNode.replaceWith(\n t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]),\n );\n pathNode.skip();\n },\n JSXElement: {\n exit(pathNode: NodePath<t.JSXElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isIntrinsicElementTag(pathNode.node.openingElement.name)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, { name: \"_markIntrinsicElementSource\" })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.openingElement.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n\n const wrappedNode = t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]);\n\n if (pathNode.parentPath.isJSXElement() || pathNode.parentPath.isJSXFragment()) {\n pathNode.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n if (pathNode.parentPath.isJSXExpressionContainer()) {\n pathNode.parentPath.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n pathNode.replaceWith(wrappedNode);\n },\n },\n JSXOpeningElement(pathNode: NodePath<t.JSXOpeningElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isCustomComponentTag(pathNode.node.name)) {\n return;\n }\n\n const rootIdentifierName = getRootJsxIdentifierName(pathNode.node.name);\n if (\n rootIdentifierName &&\n isExternalToProjectRoot(state.file?.opts?.filename, projectRoot) &&\n isStyledModuleImport(pathNode.scope.getBinding(rootIdentifierName))\n ) {\n return;\n }\n\n const hasSourceProp = pathNode.node.attributes.some(\n (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === JSX_SOURCE_PROP,\n );\n if (hasSourceProp) {\n return;\n }\n\n const filename = state.file?.opts?.filename;\n const loc = pathNode.node.loc?.start;\n if (!filename || !loc) {\n return;\n }\n\n pathNode.node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(JSX_SOURCE_PROP),\n t.stringLiteral(\n getSourceValue(state, loc, projectRoot) ??\n `${filename.replace(/\\\\/g, \"/\")}:${loc.line}:${loc.column + 1}`,\n ),\n ),\n );\n },\n Program(programPath: NodePath<t.Program>, state: BabelState) {\n if (!injectComponentSource) {\n return;\n }\n\n const seen = new Set<string>();\n\n for (const childPath of programPath.get(\"body\")) {\n if (\n childPath.isExportNamedDeclaration() ||\n childPath.isExportDefaultDeclaration()\n ) {\n const declarationPath = childPath.get(\"declaration\");\n if (!Array.isArray(declarationPath) && declarationPath.node) {\n visitDeclaration(declarationPath, childPath, state, seen, projectRoot);\n }\n continue;\n }\n\n visitDeclaration(childPath, childPath, state, seen, projectRoot);\n }\n },\n },\n };\n}\n","export const SOURCE_PROP = \"__componentSourceLoc\";\nexport const JSX_SOURCE_PROP = \"$componentSourceLoc\";\nexport const JSX_SOURCE_REGISTRY_SYMBOL = \"react-code-locator.jsxSourceRegistry\";\n","export type SourceLocation = {\n line: number;\n column: number;\n};\n\nfunction normalizeSlashes(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction trimTrailingSlash(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction splitPathSegments(value: string) {\n return normalizeSlashes(value).split(\"/\").filter(Boolean);\n}\n\nfunction computeRelativePath(fromPath: string, toPath: string) {\n const fromSegments = splitPathSegments(fromPath);\n const toSegments = splitPathSegments(toPath);\n\n let sharedIndex = 0;\n while (\n sharedIndex < fromSegments.length &&\n sharedIndex < toSegments.length &&\n fromSegments[sharedIndex] === toSegments[sharedIndex]\n ) {\n sharedIndex += 1;\n }\n\n const upSegments = new Array(Math.max(0, fromSegments.length - sharedIndex)).fill(\"..\");\n const downSegments = toSegments.slice(sharedIndex);\n const relativeSegments = [...upSegments, ...downSegments];\n return relativeSegments.length > 0 ? relativeSegments.join(\"/\") : \".\";\n}\n\nexport function normalizeProjectRoot(projectRoot?: string) {\n if (projectRoot) {\n return trimTrailingSlash(normalizeSlashes(projectRoot));\n }\n\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return trimTrailingSlash(normalizeSlashes(process.cwd()));\n }\n\n return \"\";\n}\n\nexport function toRelativeSource(\n filename: string | undefined,\n loc: SourceLocation | null | undefined,\n projectRoot?: string,\n) {\n if (!filename || !loc) {\n return null;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n const relPath =\n root && normalizedFilename.startsWith(`${root}/`)\n ? normalizedFilename.slice(root.length + 1)\n : root\n ? computeRelativePath(root, normalizedFilename)\n : normalizedFilename;\n return `${relPath}:${loc.line}:${loc.column + 1}`;\n}\n\nexport function getSourceFile(source: string | null) {\n if (!source) {\n return null;\n }\n\n const match = source.match(/^(.*):\\d+:\\d+$/);\n return match?.[1] ?? null;\n}\n\nexport function isProjectLocalFile(filename: string | undefined, projectRoot?: string) {\n if (!filename) {\n return false;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n\n if (!root) {\n return (\n !normalizedFilename.startsWith(\"../\") &&\n !normalizedFilename.startsWith(\"/\") &&\n !/^[A-Za-z]:\\//.test(normalizedFilename)\n );\n }\n\n if (normalizedFilename.startsWith(`${root}/`) || normalizedFilename === root) {\n return true;\n }\n\n const relativePath = computeRelativePath(root, normalizedFilename);\n return !relativePath.startsWith(\"../\");\n}\n\nexport function isExternalToProjectRoot(filename: string | undefined, projectRoot?: string) {\n return !isProjectLocalFile(filename, projectRoot);\n}\n\nexport function isProjectLocalSource(source: string, projectRoot?: string) {\n const file = getSourceFile(source);\n return isProjectLocalFile(file ?? undefined, projectRoot);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/esbuild.ts","../src/sourceAdapter.ts","../src/sourceTransform.ts","../src/babelInjectComponentSource.ts","../src/constants.ts","../src/sourceMetadata.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { defineSourceAdapter, type SourceInjectionOptions } from \"./sourceAdapter\";\nimport { transformSourceWithLocator } from \"./sourceTransform\";\n\ntype EsbuildOnLoadResult = {\n contents: string;\n loader: \"js\" | \"jsx\" | \"ts\" | \"tsx\";\n};\n\ntype EsbuildPluginBuild = {\n onLoad: (\n options: { filter: RegExp },\n callback: (args: { path: string }) => Promise<EsbuildOnLoadResult | null>,\n ) => void;\n};\n\nexport type EsbuildPlugin = {\n name: string;\n setup: (build: EsbuildPluginBuild) => void;\n};\n\nexport type EsbuildSourceAdapterConfig = {\n plugins: EsbuildPlugin[];\n};\n\nfunction getEsbuildLoader(filename: string): EsbuildOnLoadResult[\"loader\"] {\n if (filename.endsWith(\".tsx\")) {\n return \"tsx\";\n }\n\n if (filename.endsWith(\".ts\")) {\n return \"ts\";\n }\n\n if (filename.endsWith(\".jsx\")) {\n return \"jsx\";\n }\n\n return \"js\";\n}\n\nexport function esbuildSourceTransformPlugin(\n options: SourceInjectionOptions = {},\n): EsbuildPlugin {\n return {\n name: \"react-code-locator-source-transform\",\n setup(build) {\n build.onLoad({ filter: /\\.[mc]?[jt]sx?$/ }, async ({ path }) => {\n if (path.includes(\"/node_modules/\")) {\n return null;\n }\n\n const code = await readFile(path, \"utf8\");\n const result = await transformSourceWithLocator(code, {\n filename: path,\n ...options,\n });\n\n return {\n contents: result.code,\n loader: getEsbuildLoader(path),\n };\n });\n },\n };\n}\n\nexport function createEsbuildSourceAdapter(options: SourceInjectionOptions = {}) {\n const resolvedOptions = {\n projectRoot: process.cwd(),\n ...options,\n };\n\n return defineSourceAdapter<EsbuildSourceAdapterConfig>({\n kind: \"esbuild\",\n name: \"react-code-locator/esbuild\",\n options: resolvedOptions,\n config: {\n plugins: [esbuildSourceTransformPlugin(resolvedOptions)],\n },\n });\n}\n\nexport const esbuildSourceAdapter = createEsbuildSourceAdapter();\n","export type SourceInjectionOptions = {\n injectJsxSource?: boolean;\n injectComponentSource?: boolean;\n projectRoot?: string;\n};\n\nexport type SourceAdapterKind = \"babel\" | \"vite\" | \"esbuild\" | \"swc\";\n\nexport type SourceAdapterDescriptor<TConfig = unknown, TOptions = SourceInjectionOptions> = {\n kind: SourceAdapterKind;\n name: string;\n options: TOptions;\n config: TConfig;\n};\n\nexport function defineSourceAdapter<TConfig = unknown, TOptions = SourceInjectionOptions>(\n descriptor: SourceAdapterDescriptor<TConfig, TOptions>,\n) {\n return descriptor;\n}\n","import { transformAsync } from \"@babel/core\";\nimport { babelInjectComponentSource, type BabelInjectComponentSourceOptions } from \"./babelInjectComponentSource\";\n\nexport type SourceTransformOptions = BabelInjectComponentSourceOptions & {\n filename: string;\n sourceMaps?: boolean;\n};\n\nexport async function transformSourceWithLocator(\n code: string,\n options: SourceTransformOptions,\n) {\n const { filename, sourceMaps = true, projectRoot = process.cwd(), ...pluginOptions } = options;\n const result = await transformAsync(code, {\n filename,\n babelrc: false,\n configFile: false,\n sourceMaps,\n parserOpts: {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n },\n generatorOpts: {\n retainLines: true,\n },\n plugins: [[babelInjectComponentSource, { ...pluginOptions, projectRoot }]],\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map ?? null,\n };\n}\n","import { types as t, type NodePath, type PluginObj } from \"@babel/core\";\nimport {\n JSX_SOURCE_PROP,\n JSX_SOURCE_REGISTRY_SYMBOL,\n SOURCE_PROP,\n} from \"./constants\";\nimport type { SourceInjectionOptions } from \"./sourceAdapter\";\nimport {\n isExternalToProjectRoot,\n toRelativeSource,\n} from \"./sourceMetadata\";\n\nexport type BabelInjectComponentSourceOptions = SourceInjectionOptions;\n\ntype BabelState = {\n file?: {\n opts?: {\n filename?: string;\n };\n };\n injectedIntrinsicHelper?: boolean;\n};\n\ntype BindingLike = {\n path: NodePath;\n};\n\nconst SOURCE_PROP_LOCAL = \"_componentSourceLoc\";\nconst SOURCE_PROPS_REST = \"__reactCodeLocatorProps\";\n\nfunction isComponentName(name: string) {\n return /^[A-Z]/.test(name);\n}\n\nfunction isCustomComponentTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n if (t.isJSXIdentifier(name)) {\n return isComponentName(name.name);\n }\n\n if (t.isJSXMemberExpression(name)) {\n return true;\n }\n\n return false;\n}\n\nfunction isIntrinsicElementTag(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n) {\n return t.isJSXIdentifier(name) && /^[a-z]/.test(name.name);\n}\n\nfunction isElementFactoryIdentifier(name: string) {\n return (\n name === \"jsx\" ||\n name === \"jsxs\" ||\n name === \"jsxDEV\" ||\n name === \"_jsx\" ||\n name === \"_jsxs\" ||\n name === \"_jsxDEV\" ||\n name === \"createElement\"\n );\n}\n\nfunction isReactElementFactoryCall(pathNode: NodePath<t.CallExpression>) {\n const callee = pathNode.node.callee;\n\n if (t.isIdentifier(callee)) {\n return isElementFactoryIdentifier(callee.name);\n }\n\n return (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object, { name: \"React\" }) &&\n t.isIdentifier(callee.property, { name: \"createElement\" })\n );\n}\n\nfunction getRootJsxIdentifierName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n\n if (t.isJSXMemberExpression(name)) {\n return getRootJsxIdentifierName(name.object);\n }\n\n return null;\n}\n\nfunction isStyledModuleImport(binding: BindingLike | undefined) {\n if (!binding) {\n return false;\n }\n\n if (\n !binding.path.isImportSpecifier() &&\n !binding.path.isImportDefaultSpecifier() &&\n !binding.path.isImportNamespaceSpecifier()\n ) {\n return false;\n }\n\n const source = binding.path.parentPath.isImportDeclaration()\n ? binding.path.parentPath.node.source.value\n : null;\n if (typeof source !== \"string\") {\n return false;\n }\n\n const normalized = source.replace(/\\\\/g, \"/\");\n return (\n normalized === \"./styled\" ||\n normalized === \"../styled\" ||\n normalized.endsWith(\"/styled\")\n );\n}\n\nfunction isSupportedComponentInit(\n node: t.Expression | null | undefined,\n): boolean {\n if (!node) {\n return false;\n }\n\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return true;\n }\n\n if (!t.isCallExpression(node)) {\n return false;\n }\n\n if (\n t.isIdentifier(node.callee) &&\n (node.callee.name === \"memo\" || node.callee.name === \"forwardRef\")\n ) {\n return true;\n }\n\n return (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object, { name: \"React\" }) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === \"memo\" ||\n node.callee.property.name === \"forwardRef\")\n );\n}\n\nfunction hasSourcePropBinding(pattern: t.ObjectPattern) {\n return pattern.properties.some((property: t.ObjectPattern[\"properties\"][number]) => {\n if (!t.isObjectProperty(property)) {\n return false;\n }\n\n return (\n t.isIdentifier(property.key) && property.key.name === JSX_SOURCE_PROP\n );\n });\n}\n\nfunction injectSourcePropBinding(pattern: t.ObjectPattern) {\n if (hasSourcePropBinding(pattern)) {\n return;\n }\n\n const sourceBinding = t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n );\n\n const restIndex = pattern.properties.findIndex((property: t.ObjectPattern[\"properties\"][number]) =>\n t.isRestElement(property),\n );\n if (restIndex === -1) {\n pattern.properties.push(sourceBinding);\n return;\n }\n\n pattern.properties.splice(restIndex, 0, sourceBinding);\n}\n\nfunction injectSourcePropIntoIdentifierParam(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n param: t.Identifier,\n) {\n if (!t.isBlockStatement(node.body)) {\n node.body = t.blockStatement([t.returnStatement(node.body)]);\n }\n\n const alreadyInjected = node.body.body.some(\n (statement: t.Statement) =>\n t.isVariableDeclaration(statement) &&\n statement.declarations.some(\n (declaration: t.VariableDeclarator) =>\n t.isIdentifier(declaration.id) &&\n declaration.id.name === SOURCE_PROPS_REST,\n ),\n );\n if (alreadyInjected) {\n return;\n }\n\n node.body.body.unshift(\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.objectPattern([\n t.objectProperty(\n t.identifier(JSX_SOURCE_PROP),\n t.identifier(SOURCE_PROP_LOCAL),\n false,\n false,\n ),\n t.restElement(t.identifier(SOURCE_PROPS_REST)),\n ]),\n param,\n ),\n ]),\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(param.name),\n t.identifier(SOURCE_PROPS_REST),\n ),\n ),\n );\n}\n\nfunction injectSourcePropIntoFunctionParams(\n node:\n | t.FunctionDeclaration\n | t.FunctionExpression\n | t.ArrowFunctionExpression,\n) {\n const firstParam = node.params[0];\n if (!firstParam) {\n return;\n }\n\n if (t.isObjectPattern(firstParam)) {\n injectSourcePropBinding(firstParam);\n return;\n }\n\n if (t.isIdentifier(firstParam)) {\n injectSourcePropIntoIdentifierParam(node, firstParam);\n }\n}\n\nfunction injectSourcePropIntoExpression(node: t.Expression | null | undefined) {\n if (!node) {\n return;\n }\n\n if (t.isFunctionExpression(node) || t.isArrowFunctionExpression(node)) {\n injectSourcePropIntoFunctionParams(node);\n return;\n }\n\n if (!t.isCallExpression(node)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (\n firstArg &&\n !t.isSpreadElement(firstArg) &&\n (t.isFunctionExpression(firstArg) || t.isArrowFunctionExpression(firstArg))\n ) {\n injectSourcePropIntoFunctionParams(firstArg);\n }\n}\n\nfunction getSourceValue(\n state: BabelState,\n loc: { line: number; column: number } | null | undefined,\n projectRoot?: string,\n) {\n const filename = state.file?.opts?.filename;\n if (!filename || !loc) {\n return null;\n }\n\n return toRelativeSource(filename, loc, projectRoot);\n}\n\nfunction buildAssignment(name: string, sourceValue: string) {\n return t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(name), t.identifier(SOURCE_PROP)),\n t.stringLiteral(sourceValue),\n ),\n );\n}\n\nfunction buildIntrinsicSourceHelper() {\n return t.functionDeclaration(\n t.identifier(\"_markIntrinsicElementSource\"),\n [t.identifier(\"element\"), t.identifier(\"source\")],\n t.blockStatement([\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"registryKey\"),\n t.callExpression(\n t.memberExpression(t.identifier(\"Symbol\"), t.identifier(\"for\")),\n [t.stringLiteral(JSX_SOURCE_REGISTRY_SYMBOL)],\n ),\n ),\n ]),\n t.variableDeclaration(\"let\", [\n t.variableDeclarator(\n t.identifier(\"registry\"),\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n ),\n ]),\n t.ifStatement(\n t.unaryExpression(\n \"!\",\n t.binaryExpression(\"instanceof\", t.identifier(\"registry\"), t.identifier(\"WeakMap\")),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.assignmentExpression(\n \"=\",\n t.identifier(\"registry\"),\n t.assignmentExpression(\n \"=\",\n t.memberExpression(t.identifier(\"globalThis\"), t.identifier(\"registryKey\"), true),\n t.newExpression(t.identifier(\"WeakMap\"), []),\n ),\n ),\n ),\n ]),\n ),\n t.ifStatement(\n t.logicalExpression(\n \"&&\",\n t.identifier(\"element\"),\n t.logicalExpression(\n \"&&\",\n t.binaryExpression(\"===\", t.unaryExpression(\"typeof\", t.identifier(\"element\")), t.stringLiteral(\"object\")),\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\"))),\n t.stringLiteral(\"object\"),\n ),\n ),\n ),\n t.blockStatement([\n t.expressionStatement(\n t.callExpression(\n t.memberExpression(t.identifier(\"registry\"), t.identifier(\"set\")),\n [t.memberExpression(t.identifier(\"element\"), t.identifier(\"props\")), t.identifier(\"source\")],\n ),\n ),\n ]),\n ),\n t.returnStatement(t.identifier(\"element\")),\n ]),\n );\n}\n\nfunction ensureIntrinsicSourceHelper(programPath: NodePath<t.Program>, state: BabelState) {\n if (state.injectedIntrinsicHelper) {\n return;\n }\n\n const alreadyExists = programPath.node.body.some(\n (node: t.Statement) =>\n t.isFunctionDeclaration(node) && t.isIdentifier(node.id, { name: \"_markIntrinsicElementSource\" }),\n );\n if (!alreadyExists) {\n programPath.unshiftContainer(\"body\", buildIntrinsicSourceHelper());\n }\n\n state.injectedIntrinsicHelper = true;\n}\n\nfunction visitDeclaration(\n declarationPath: NodePath,\n insertAfterPath: NodePath,\n state: BabelState,\n seen: Set<string>,\n projectRoot?: string,\n) {\n if (\n declarationPath.isFunctionDeclaration() ||\n declarationPath.isClassDeclaration()\n ) {\n const name = declarationPath.node.id?.name;\n if (!name || !isComponentName(name) || seen.has(name)) {\n return;\n }\n\n if (declarationPath.isFunctionDeclaration()) {\n injectSourcePropIntoFunctionParams(declarationPath.node);\n }\n\n const sourceValue = getSourceValue(\n state,\n declarationPath.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n seen.add(name);\n insertAfterPath.insertAfter(buildAssignment(name, sourceValue));\n return;\n }\n\n if (!declarationPath.isVariableDeclaration()) {\n return;\n }\n\n const assignments = declarationPath.node.declarations.flatMap(\n (declarator: t.VariableDeclarator) => {\n if (\n !t.isIdentifier(declarator.id) ||\n !isComponentName(declarator.id.name) ||\n seen.has(declarator.id.name)\n ) {\n return [];\n }\n\n if (!declarator.init) {\n return [];\n }\n\n if (!isSupportedComponentInit(declarator.init)) {\n return [];\n }\n\n injectSourcePropIntoExpression(declarator.init);\n\n const sourceValue = getSourceValue(\n state,\n declarator.loc?.start ?? declarator.init.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return [];\n }\n\n seen.add(declarator.id.name);\n return [buildAssignment(declarator.id.name, sourceValue)];\n },\n );\n\n if (assignments.length > 0) {\n insertAfterPath.insertAfter(assignments);\n }\n}\n\nexport function babelInjectComponentSource(\n options: BabelInjectComponentSourceOptions = {},\n): PluginObj<BabelState> {\n const {\n injectJsxSource = true,\n injectComponentSource = true,\n projectRoot,\n } = options;\n\n return {\n name: \"babel-inject-component-source\",\n visitor: {\n CallExpression(pathNode: NodePath<t.CallExpression>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isReactElementFactoryCall(pathNode)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, {\n name: \"_markIntrinsicElementSource\",\n })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n pathNode.replaceWith(\n t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]),\n );\n pathNode.skip();\n },\n JSXElement: {\n exit(pathNode: NodePath<t.JSXElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isIntrinsicElementTag(pathNode.node.openingElement.name)) {\n return;\n }\n\n if (\n pathNode.parentPath.isCallExpression() &&\n t.isIdentifier(pathNode.parentPath.node.callee, { name: \"_markIntrinsicElementSource\" })\n ) {\n return;\n }\n\n const sourceValue = getSourceValue(\n state,\n pathNode.node.openingElement.loc?.start,\n projectRoot,\n );\n if (!sourceValue) {\n return;\n }\n\n const programPath = pathNode.findParent((parent: NodePath) => parent.isProgram());\n if (!programPath || !programPath.isProgram()) {\n return;\n }\n\n ensureIntrinsicSourceHelper(programPath, state);\n\n const wrappedNode = t.callExpression(t.identifier(\"_markIntrinsicElementSource\"), [\n pathNode.node,\n t.stringLiteral(sourceValue),\n ]);\n\n if (pathNode.parentPath.isJSXElement() || pathNode.parentPath.isJSXFragment()) {\n pathNode.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n if (pathNode.parentPath.isJSXExpressionContainer()) {\n pathNode.parentPath.replaceWith(t.jsxExpressionContainer(wrappedNode));\n return;\n }\n\n pathNode.replaceWith(wrappedNode);\n },\n },\n JSXOpeningElement(pathNode: NodePath<t.JSXOpeningElement>, state: BabelState) {\n if (!injectJsxSource) {\n return;\n }\n\n if (!isCustomComponentTag(pathNode.node.name)) {\n return;\n }\n\n const rootIdentifierName = getRootJsxIdentifierName(pathNode.node.name);\n if (\n rootIdentifierName &&\n isExternalToProjectRoot(state.file?.opts?.filename, projectRoot) &&\n isStyledModuleImport(pathNode.scope.getBinding(rootIdentifierName))\n ) {\n return;\n }\n\n const hasSourceProp = pathNode.node.attributes.some(\n (attr: t.JSXAttribute | t.JSXSpreadAttribute) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === JSX_SOURCE_PROP,\n );\n if (hasSourceProp) {\n return;\n }\n\n const filename = state.file?.opts?.filename;\n const loc = pathNode.node.loc?.start;\n if (!filename || !loc) {\n return;\n }\n\n pathNode.node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(JSX_SOURCE_PROP),\n t.stringLiteral(\n getSourceValue(state, loc, projectRoot) ??\n `${filename.replace(/\\\\/g, \"/\")}:${loc.line}:${loc.column + 1}`,\n ),\n ),\n );\n },\n Program(programPath: NodePath<t.Program>, state: BabelState) {\n if (!injectComponentSource) {\n return;\n }\n\n const seen = new Set<string>();\n\n for (const childPath of programPath.get(\"body\")) {\n if (\n childPath.isExportNamedDeclaration() ||\n childPath.isExportDefaultDeclaration()\n ) {\n const declarationPath = childPath.get(\"declaration\");\n if (!Array.isArray(declarationPath) && declarationPath.node) {\n visitDeclaration(declarationPath, childPath, state, seen, projectRoot);\n }\n continue;\n }\n\n visitDeclaration(childPath, childPath, state, seen, projectRoot);\n }\n },\n },\n };\n}\n","export const SOURCE_PROP = \"__componentSourceLoc\";\nexport const JSX_SOURCE_PROP = \"$componentSourceLoc\";\nexport const JSX_SOURCE_REGISTRY_SYMBOL = \"react-code-locator.jsxSourceRegistry\";\n","export type SourceLocation = {\n line: number;\n column: number;\n};\n\nfunction normalizeSlashes(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction trimTrailingSlash(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction splitPathSegments(value: string) {\n return normalizeSlashes(value).split(\"/\").filter(Boolean);\n}\n\nfunction computeRelativePath(fromPath: string, toPath: string) {\n const fromSegments = splitPathSegments(fromPath);\n const toSegments = splitPathSegments(toPath);\n\n let sharedIndex = 0;\n while (\n sharedIndex < fromSegments.length &&\n sharedIndex < toSegments.length &&\n fromSegments[sharedIndex] === toSegments[sharedIndex]\n ) {\n sharedIndex += 1;\n }\n\n const upSegments = new Array(Math.max(0, fromSegments.length - sharedIndex)).fill(\"..\");\n const downSegments = toSegments.slice(sharedIndex);\n const relativeSegments = [...upSegments, ...downSegments];\n return relativeSegments.length > 0 ? relativeSegments.join(\"/\") : \".\";\n}\n\nexport function normalizeProjectRoot(projectRoot?: string) {\n if (projectRoot) {\n return trimTrailingSlash(normalizeSlashes(projectRoot));\n }\n return \"\";\n}\n\nexport function toRelativeSource(\n filename: string | undefined,\n loc: SourceLocation | null | undefined,\n projectRoot?: string,\n) {\n if (!filename || !loc) {\n return null;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n const relPath =\n root && normalizedFilename.startsWith(`${root}/`)\n ? normalizedFilename.slice(root.length + 1)\n : root\n ? computeRelativePath(root, normalizedFilename)\n : normalizedFilename;\n return `${relPath}:${loc.line}:${loc.column + 1}`;\n}\n\nexport function getSourceFile(source: string | null) {\n if (!source) {\n return null;\n }\n\n const match = source.match(/^(.*):\\d+:\\d+$/);\n return match?.[1] ?? null;\n}\n\nexport function isProjectLocalFile(filename: string | undefined, projectRoot?: string) {\n if (!filename) {\n return false;\n }\n\n const root = normalizeProjectRoot(projectRoot);\n const normalizedFilename = normalizeSlashes(filename);\n\n if (!root) {\n return (\n !normalizedFilename.startsWith(\"../\") &&\n !normalizedFilename.startsWith(\"/\") &&\n !/^[A-Za-z]:\\//.test(normalizedFilename)\n );\n }\n\n if (normalizedFilename.startsWith(`${root}/`) || normalizedFilename === root) {\n return true;\n }\n\n const relativePath = computeRelativePath(root, normalizedFilename);\n return !relativePath.startsWith(\"../\");\n}\n\nexport function isExternalToProjectRoot(filename: string | undefined, projectRoot?: string) {\n return !isProjectLocalFile(filename, projectRoot);\n}\n\nexport function isProjectLocalSource(source: string, projectRoot?: string) {\n const file = getSourceFile(source);\n return isProjectLocalFile(file ?? undefined, projectRoot);\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -68,9 +68,6 @@ function normalizeProjectRoot(projectRoot) {
|
|
|
68
68
|
if (projectRoot) {
|
|
69
69
|
return trimTrailingSlash(normalizeSlashes(projectRoot));
|
|
70
70
|
}
|
|
71
|
-
if (typeof process !== "undefined" && typeof process.cwd === "function") {
|
|
72
|
-
return trimTrailingSlash(normalizeSlashes(process.cwd()));
|
|
73
|
-
}
|
|
74
71
|
return "";
|
|
75
72
|
}
|
|
76
73
|
function toRelativeSource(filename, loc, projectRoot) {
|
|
@@ -864,12 +861,16 @@ function babelInjectComponentSource(options = {}) {
|
|
|
864
861
|
|
|
865
862
|
// src/babel.ts
|
|
866
863
|
function createBabelSourceAdapter(options = {}) {
|
|
864
|
+
const resolvedOptions = {
|
|
865
|
+
projectRoot: process.cwd(),
|
|
866
|
+
...options
|
|
867
|
+
};
|
|
867
868
|
return defineSourceAdapter({
|
|
868
869
|
kind: "babel",
|
|
869
870
|
name: "react-code-locator/babel",
|
|
870
|
-
options,
|
|
871
|
+
options: resolvedOptions,
|
|
871
872
|
config: {
|
|
872
|
-
plugins: [[babelInjectComponentSource,
|
|
873
|
+
plugins: [[babelInjectComponentSource, resolvedOptions]]
|
|
873
874
|
}
|
|
874
875
|
});
|
|
875
876
|
}
|
|
@@ -878,7 +879,7 @@ var babelSourceAdapter = createBabelSourceAdapter();
|
|
|
878
879
|
// src/sourceTransform.ts
|
|
879
880
|
var import_core2 = require("@babel/core");
|
|
880
881
|
async function transformSourceWithLocator(code, options) {
|
|
881
|
-
const { filename, sourceMaps = true, ...pluginOptions } = options;
|
|
882
|
+
const { filename, sourceMaps = true, projectRoot = process.cwd(), ...pluginOptions } = options;
|
|
882
883
|
const result = await (0, import_core2.transformAsync)(code, {
|
|
883
884
|
filename,
|
|
884
885
|
babelrc: false,
|
|
@@ -891,7 +892,7 @@ async function transformSourceWithLocator(code, options) {
|
|
|
891
892
|
generatorOpts: {
|
|
892
893
|
retainLines: true
|
|
893
894
|
},
|
|
894
|
-
plugins: [[babelInjectComponentSource, pluginOptions]]
|
|
895
|
+
plugins: [[babelInjectComponentSource, { ...pluginOptions, projectRoot }]]
|
|
895
896
|
});
|
|
896
897
|
return {
|
|
897
898
|
code: result?.code ?? code,
|
|
@@ -967,14 +968,21 @@ function viteSourceTransformPlugin(options = {}) {
|
|
|
967
968
|
}
|
|
968
969
|
function createViteSourceAdapter(options = {}) {
|
|
969
970
|
const { babel = {}, ...viteOptions } = options;
|
|
971
|
+
const resolvedBabelOptions = {
|
|
972
|
+
projectRoot: process.cwd(),
|
|
973
|
+
...babel
|
|
974
|
+
};
|
|
970
975
|
const plugins = [
|
|
971
|
-
viteSourceTransformPlugin(
|
|
976
|
+
viteSourceTransformPlugin(resolvedBabelOptions),
|
|
972
977
|
...createViteClientInjector(viteOptions)
|
|
973
978
|
].filter(Boolean);
|
|
974
979
|
return defineSourceAdapter({
|
|
975
980
|
kind: "vite",
|
|
976
981
|
name: "react-code-locator/vite",
|
|
977
|
-
options
|
|
982
|
+
options: {
|
|
983
|
+
...viteOptions,
|
|
984
|
+
babel: resolvedBabelOptions
|
|
985
|
+
},
|
|
978
986
|
config: {
|
|
979
987
|
plugins
|
|
980
988
|
}
|
|
@@ -1018,12 +1026,16 @@ function esbuildSourceTransformPlugin(options = {}) {
|
|
|
1018
1026
|
};
|
|
1019
1027
|
}
|
|
1020
1028
|
function createEsbuildSourceAdapter(options = {}) {
|
|
1029
|
+
const resolvedOptions = {
|
|
1030
|
+
projectRoot: process.cwd(),
|
|
1031
|
+
...options
|
|
1032
|
+
};
|
|
1021
1033
|
return defineSourceAdapter({
|
|
1022
1034
|
kind: "esbuild",
|
|
1023
1035
|
name: "react-code-locator/esbuild",
|
|
1024
|
-
options,
|
|
1036
|
+
options: resolvedOptions,
|
|
1025
1037
|
config: {
|
|
1026
|
-
plugins: [esbuildSourceTransformPlugin(
|
|
1038
|
+
plugins: [esbuildSourceTransformPlugin(resolvedOptions)]
|
|
1027
1039
|
}
|
|
1028
1040
|
});
|
|
1029
1041
|
}
|
|
@@ -1034,14 +1046,18 @@ async function transformSourceWithSwcLocator(code, options) {
|
|
|
1034
1046
|
return transformSourceWithLocator(code, options);
|
|
1035
1047
|
}
|
|
1036
1048
|
function createSwcSourceAdapter(options = {}) {
|
|
1049
|
+
const resolvedOptions = {
|
|
1050
|
+
projectRoot: process.cwd(),
|
|
1051
|
+
...options
|
|
1052
|
+
};
|
|
1037
1053
|
const transform = (code, transformOptions) => transformSourceWithSwcLocator(code, {
|
|
1038
|
-
...
|
|
1054
|
+
...resolvedOptions,
|
|
1039
1055
|
...transformOptions
|
|
1040
1056
|
});
|
|
1041
1057
|
return defineSourceAdapter({
|
|
1042
1058
|
kind: "swc",
|
|
1043
1059
|
name: "react-code-locator/swc",
|
|
1044
|
-
options,
|
|
1060
|
+
options: resolvedOptions,
|
|
1045
1061
|
config: {
|
|
1046
1062
|
transform
|
|
1047
1063
|
}
|