@trackunit/react-table-base-components 2.11.7 → 2.12.4

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.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.copyableCellToCopyPair = void 0;
3
+ exports.copyableCellToCopyableValue = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const ts = tslib_1.__importStar(require("typescript"));
6
6
  const jsx_utils_1 = require("../utils/jsx-utils");
@@ -38,15 +38,16 @@ const secondaryTextExpression = (attr) => {
38
38
  }
39
39
  return null;
40
40
  };
41
- const renderPair = (textExpr, secondaryRow) => {
42
- const textProps = [
43
- `className="min-w-0 truncate${secondaryRow ? " text-neutral-500" : ""}"`,
44
- secondaryRow ? `size="small"` : null,
45
- `type="span"`,
41
+ const renderPair = (textExpr, secondaryRow, testIdText = null) => {
42
+ const props = [
43
+ testIdText !== null ? `data-testid=${testIdText}` : null,
44
+ `size="extraSmall"`,
45
+ secondaryRow ? `textSize="small"` : null,
46
+ `value={${textExpr}}`,
46
47
  ]
47
48
  .filter(Boolean)
48
49
  .join(" ");
49
- return `<div className="flex min-w-0 max-w-full items-center overflow-hidden"><Text ${textProps}>{${textExpr}}</Text><CopyButton className="shrink-0" size="extraSmall" value={${textExpr}} /></div>`;
50
+ return `<CopyableValue ${props} />`;
50
51
  };
51
52
  const attributeSourceText = (attr) => attr !== null && attr.initializer !== undefined ? attr.initializer.getText() : null;
52
53
  const removeNamedImport = (content, packageName, name) => {
@@ -136,10 +137,7 @@ const transformCopyableCellUsage = (filePath, content) => {
136
137
  const testIdText = attributeSourceText((0, jsx_utils_1.findJsxAttribute)(openingElement, "data-testid"));
137
138
  let replacement;
138
139
  if (secondaryAttr === null) {
139
- replacement = renderPair(textExpr, false);
140
- if (testIdText !== null) {
141
- replacement = replacement.replace(`<div className="flex min-w-0 max-w-full items-center overflow-hidden">`, `<div className="flex min-w-0 max-w-full items-center overflow-hidden" data-testid=${testIdText}>`);
142
- }
140
+ replacement = renderPair(textExpr, false, testIdText);
143
141
  }
144
142
  else {
145
143
  const secondaryExpr = secondaryTextExpression(secondaryAttr);
@@ -171,23 +169,23 @@ const transformCopyableCellUsage = (filePath, content) => {
171
169
  if (needsMultiRow) {
172
170
  updated = ensureNamedImport(updated, TABLE_PACKAGE, ["MultiRowTableCell"]);
173
171
  }
174
- updated = ensureNamedImport(updated, COMPONENTS_PACKAGE, ["Text", "CopyButton"]);
172
+ updated = ensureNamedImport(updated, COMPONENTS_PACKAGE, ["CopyableValue"]);
175
173
  return updated;
176
174
  };
177
175
  /**
178
176
  * Rewrites `<CopyableCell text={x} secondary={{ text: y }} …/>` (removed in
179
- * v3) into the value/copy pair used by table cells: a truncating `Text` next
180
- * to an `extraSmall` `CopyButton`, wrapped for two-row cells in
181
- * `MultiRowTableCell` with the `w-fit overflow-hidden` guard that keeps the
182
- * pair inside the cell's grid track. Usages with spreads, dynamic
177
+ * 2.8.0) into `CopyableValue` from `@trackunit/react-components` at the
178
+ * `extraSmall` table size, wrapped for two-row cells in `MultiRowTableCell`
179
+ * (with the `w-fit overflow-hidden` guard that keeps the pair inside the
180
+ * cell's grid track) and small text on the second row. Usages with spreads, dynamic
183
181
  * `secondary` values, forwarded classNames, or a referenced
184
182
  * `CopyableCellProps` type are left for manual review.
185
183
  */
186
- const copyableCellToCopyPair = (tree) => {
184
+ const copyableCellToCopyableValue = (tree) => {
187
185
  manualReviewCount = 0;
188
186
  const touched = (0, jsx_utils_1.visitTsxFiles)(tree, COMPONENT_NAME, transformCopyableCellUsage);
189
- (0, jsx_utils_1.logSummary)("copyablecell-to-copy-pair", touched, manualReviewCount);
187
+ (0, jsx_utils_1.logSummary)("copyablecell-to-copyablevalue", touched, manualReviewCount);
190
188
  };
191
- exports.copyableCellToCopyPair = copyableCellToCopyPair;
192
- exports.default = exports.copyableCellToCopyPair;
193
- //# sourceMappingURL=copyablecell-to-copy-pair.js.map
189
+ exports.copyableCellToCopyableValue = copyableCellToCopyableValue;
190
+ exports.default = exports.copyableCellToCopyableValue;
191
+ //# sourceMappingURL=copyablecell-to-copyablevalue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyablecell-to-copyablevalue.js","sourceRoot":"","sources":["../../../../../../libs/react/table-base-components/migrations/v2-8-0/copyablecell-to-copyablevalue.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Tree } from \"@nx/devkit\";\nimport * as ts from \"typescript\";\nimport {\n findJsxAttribute,\n findJsxElements,\n getImportedAliases,\n hasSpreadAttribute,\n logSummary,\n parseTsx,\n visitTsxFiles,\n} from \"../utils/jsx-utils\";\n\nconst TABLE_PACKAGE = \"@trackunit/react-table-base-components\";\nconst COMPONENTS_PACKAGE = \"@trackunit/react-components\";\nconst COMPONENT_NAME = \"CopyableCell\";\n\n/**\n * The expression a `text`-like attribute resolves to: `text=\"abc\"` yields\n * `\"abc\"`, `text={value}` yields `value`.\n */\nconst textExpression = (attr: ts.JsxAttribute): string | null => {\n const initializer = attr.initializer;\n if (initializer === undefined) return null;\n if (ts.isStringLiteral(initializer)) return initializer.getText();\n if (ts.isJsxExpression(initializer) && initializer.expression !== undefined) {\n return initializer.expression.getText();\n }\n return null;\n};\n\n/** For `secondary={{ text: X }}` returns the text of `X`; anything else is null. */\nconst secondaryTextExpression = (attr: ts.JsxAttribute): string | null => {\n const initializer = attr.initializer;\n if (initializer === undefined || !ts.isJsxExpression(initializer) || initializer.expression === undefined) {\n return null;\n }\n const expression = initializer.expression;\n if (!ts.isObjectLiteralExpression(expression)) return null;\n for (const prop of expression.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === \"text\") {\n return prop.initializer.getText();\n }\n }\n return null;\n};\n\nconst renderPair = (textExpr: string, secondaryRow: boolean, testIdText: string | null = null): string => {\n const props = [\n testIdText !== null ? `data-testid=${testIdText}` : null,\n `size=\"extraSmall\"`,\n secondaryRow ? `textSize=\"small\"` : null,\n `value={${textExpr}}`,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return `<CopyableValue ${props} />`;\n};\n\nconst attributeSourceText = (attr: ts.JsxAttribute | null): string | null =>\n attr !== null && attr.initializer !== undefined ? attr.initializer.getText() : null;\n\nconst removeNamedImport = (content: string, packageName: string, name: string): string => {\n const sourceFile = parseTsx(content, \"source.tsx\");\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n const moduleSpecifier = stmt.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier) || moduleSpecifier.text !== packageName) continue;\n\n const namedBindings = stmt.importClause?.namedBindings;\n if (namedBindings === undefined || !ts.isNamedImports(namedBindings)) continue;\n\n const remaining = namedBindings.elements.filter(el => (el.propertyName?.text ?? el.name.text) !== name);\n if (remaining.length === namedBindings.elements.length) continue;\n\n if (remaining.length === 0) {\n const start = stmt.getFullStart();\n const end = stmt.getEnd();\n const trailing = content.slice(end).startsWith(\"\\n\") ? end + 1 : end;\n return `${content.slice(0, start)}${content.slice(trailing)}`;\n }\n\n const elementsText = remaining.map(el => el.getText()).join(\", \");\n return `${content.slice(0, namedBindings.getStart())}{ ${elementsText} }${content.slice(namedBindings.getEnd())}`;\n }\n\n return content;\n};\n\nconst ensureNamedImport = (content: string, packageName: string, namesToAdd: ReadonlyArray<string>): string => {\n const sourceFile = parseTsx(content, \"source.tsx\");\n const aliases = getImportedAliases(sourceFile, packageName) ?? {};\n\n const missing = namesToAdd.filter(name => !Object.values(aliases).includes(name));\n if (missing.length === 0) return content;\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n const moduleSpecifier = stmt.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier) || moduleSpecifier.text !== packageName) continue;\n\n const namedBindings = stmt.importClause?.namedBindings;\n if (namedBindings === undefined || !ts.isNamedImports(namedBindings)) continue;\n\n const elementsText = namedBindings.elements.map(el => el.getText()).join(\", \");\n const merged = [elementsText, ...missing].join(\", \");\n return `${content.slice(0, namedBindings.getStart())}{ ${merged} }${content.slice(namedBindings.getEnd())}`;\n }\n\n const importLine = `import { ${missing.join(\", \")} } from \"${packageName}\";\\n`;\n return `${importLine}${content}`;\n};\n\nlet manualReviewCount = 0;\n\nconst transformCopyableCellUsage = (filePath: string, content: string): string | null => {\n const sourceFile = parseTsx(content, filePath);\n\n const aliases = getImportedAliases(sourceFile, TABLE_PACKAGE);\n if (aliases === null) return null;\n\n const cellAlias = Object.entries(aliases).find(([, name]) => name === COMPONENT_NAME)?.[0];\n if (cellAlias === undefined) return null;\n\n if (Object.values(aliases).includes(\"CopyableCellProps\")) {\n manualReviewCount += 1;\n return null;\n }\n\n const matches = findJsxElements(sourceFile, [cellAlias]);\n if (matches.length === 0) return null;\n\n type Edit = { start: number; end: number; replacement: string };\n const edits: Array<Edit> = [];\n let needsMultiRow = false;\n\n for (const { openingElement, element } of matches) {\n if (hasSpreadAttribute(openingElement)) {\n manualReviewCount += 1;\n continue;\n }\n\n const textAttr = findJsxAttribute(openingElement, \"text\");\n const textExpr = textAttr !== null ? textExpression(textAttr) : null;\n if (textExpr === null) {\n manualReviewCount += 1;\n continue;\n }\n\n const classNameAttr = findJsxAttribute(openingElement, \"className\");\n if (classNameAttr !== null) {\n // The old cell forwarded className to its own cva root; there is no\n // 1:1 slot for it on the pair, so leave these for a human.\n manualReviewCount += 1;\n continue;\n }\n\n const secondaryAttr = findJsxAttribute(openingElement, \"secondary\");\n const testIdText = attributeSourceText(findJsxAttribute(openingElement, \"data-testid\"));\n\n let replacement: string;\n if (secondaryAttr === null) {\n replacement = renderPair(textExpr, false, testIdText);\n } else {\n const secondaryExpr = secondaryTextExpression(secondaryAttr);\n if (secondaryExpr === null) {\n // `secondary` was something other than an inline `{{ text: … }}`.\n manualReviewCount += 1;\n continue;\n }\n needsMultiRow = true;\n const testIdProp = testIdText !== null ? ` data-testid=${testIdText}` : \"\";\n replacement = `<MultiRowTableCell className=\"w-fit overflow-hidden\"${testIdProp} main={${renderPair(textExpr, false)}} secondary={${renderPair(secondaryExpr, true)}} />`;\n }\n\n edits.push({ start: element.getStart(), end: element.getEnd(), replacement });\n }\n\n if (edits.length === 0) return null;\n\n edits.sort((a, b) => b.start - a.start);\n\n let updated = content;\n for (const { start, end, replacement } of edits) {\n updated = `${updated.slice(0, start)}${replacement}${updated.slice(end)}`;\n }\n\n const remaining = findJsxElements(parseTsx(updated, filePath), [cellAlias]);\n if (remaining.length === 0) {\n updated = removeNamedImport(updated, TABLE_PACKAGE, COMPONENT_NAME);\n } else {\n manualReviewCount += 1;\n }\n\n if (needsMultiRow) {\n updated = ensureNamedImport(updated, TABLE_PACKAGE, [\"MultiRowTableCell\"]);\n }\n updated = ensureNamedImport(updated, COMPONENTS_PACKAGE, [\"CopyableValue\"]);\n\n return updated;\n};\n\n/**\n * Rewrites `<CopyableCell text={x} secondary={{ text: y }} …/>` (removed in\n * 2.8.0) into `CopyableValue` from `@trackunit/react-components` at the\n * `extraSmall` table size, wrapped for two-row cells in `MultiRowTableCell`\n * (with the `w-fit overflow-hidden` guard that keeps the pair inside the\n * cell's grid track) and small text on the second row. Usages with spreads, dynamic\n * `secondary` values, forwarded classNames, or a referenced\n * `CopyableCellProps` type are left for manual review.\n */\nexport const copyableCellToCopyableValue = (tree: Tree): void => {\n manualReviewCount = 0;\n const touched = visitTsxFiles(tree, COMPONENT_NAME, transformCopyableCellUsage);\n logSummary(\"copyablecell-to-copyablevalue\", touched, manualReviewCount);\n};\n\nexport default copyableCellToCopyableValue;\n"]}
package/migrations.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "generators": {
3
- "v3-0-0-copyablecell-to-copy-pair": {
3
+ "v2-8-0-copyablecell-to-copyablevalue": {
4
4
  "version": "2.8.0",
5
- "description": "Replace the removed CopyableCell with the Text + CopyButton pair, wrapped in MultiRowTableCell for two-row cells.",
6
- "implementation": "./migrations/v3-0-0/copyablecell-to-copy-pair"
5
+ "description": "Replace the removed CopyableCell with CopyableValue from @trackunit/react-components, wrapped in MultiRowTableCell for two-row cells.",
6
+ "implementation": "./migrations/v2-8-0/copyablecell-to-copyablevalue"
7
7
  }
8
8
  }
9
9
  }
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@trackunit/react-table-base-components",
3
- "version": "2.11.7",
3
+ "version": "2.12.4",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
7
7
  "node": ">=24.x"
8
8
  },
9
9
  "dependencies": {
10
- "@trackunit/react-components": "3.5.6",
11
- "@trackunit/ui-icons": "1.16.4",
12
- "@trackunit/react-form-components": "2.9.6",
13
- "@trackunit/css-class-variance-utilities": "2.2.3",
14
- "@trackunit/date-and-time-utils": "1.16.3",
15
- "@trackunit/react-date-and-time-hooks": "2.9.6",
16
- "@trackunit/shared-utils": "1.18.3",
17
- "@trackunit/i18n-library-translation": "2.7.4",
10
+ "@trackunit/react-components": "3.7.3",
11
+ "@trackunit/ui-icons": "1.17.2",
12
+ "@trackunit/react-form-components": "2.10.4",
13
+ "@trackunit/css-class-variance-utilities": "2.3.2",
14
+ "@trackunit/date-and-time-utils": "1.17.2",
15
+ "@trackunit/react-date-and-time-hooks": "2.10.4",
16
+ "@trackunit/shared-utils": "1.19.2",
17
+ "@trackunit/i18n-library-translation": "2.8.2",
18
18
  "tailwind-merge": "^2.0.0"
19
19
  },
20
20
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"copyablecell-to-copy-pair.js","sourceRoot":"","sources":["../../../../../../libs/react/table-base-components/migrations/v3-0-0/copyablecell-to-copy-pair.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Tree } from \"@nx/devkit\";\nimport * as ts from \"typescript\";\nimport {\n findJsxAttribute,\n findJsxElements,\n getImportedAliases,\n hasSpreadAttribute,\n logSummary,\n parseTsx,\n visitTsxFiles,\n} from \"../utils/jsx-utils\";\n\nconst TABLE_PACKAGE = \"@trackunit/react-table-base-components\";\nconst COMPONENTS_PACKAGE = \"@trackunit/react-components\";\nconst COMPONENT_NAME = \"CopyableCell\";\n\n/**\n * The expression a `text`-like attribute resolves to: `text=\"abc\"` yields\n * `\"abc\"`, `text={value}` yields `value`.\n */\nconst textExpression = (attr: ts.JsxAttribute): string | null => {\n const initializer = attr.initializer;\n if (initializer === undefined) return null;\n if (ts.isStringLiteral(initializer)) return initializer.getText();\n if (ts.isJsxExpression(initializer) && initializer.expression !== undefined) {\n return initializer.expression.getText();\n }\n return null;\n};\n\n/** For `secondary={{ text: X }}` returns the text of `X`; anything else is null. */\nconst secondaryTextExpression = (attr: ts.JsxAttribute): string | null => {\n const initializer = attr.initializer;\n if (initializer === undefined || !ts.isJsxExpression(initializer) || initializer.expression === undefined) {\n return null;\n }\n const expression = initializer.expression;\n if (!ts.isObjectLiteralExpression(expression)) return null;\n for (const prop of expression.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === \"text\") {\n return prop.initializer.getText();\n }\n }\n return null;\n};\n\nconst renderPair = (textExpr: string, secondaryRow: boolean): string => {\n const textProps = [\n `className=\"min-w-0 truncate${secondaryRow ? \" text-neutral-500\" : \"\"}\"`,\n secondaryRow ? `size=\"small\"` : null,\n `type=\"span\"`,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return `<div className=\"flex min-w-0 max-w-full items-center overflow-hidden\"><Text ${textProps}>{${textExpr}}</Text><CopyButton className=\"shrink-0\" size=\"extraSmall\" value={${textExpr}} /></div>`;\n};\n\nconst attributeSourceText = (attr: ts.JsxAttribute | null): string | null =>\n attr !== null && attr.initializer !== undefined ? attr.initializer.getText() : null;\n\nconst removeNamedImport = (content: string, packageName: string, name: string): string => {\n const sourceFile = parseTsx(content, \"source.tsx\");\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n const moduleSpecifier = stmt.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier) || moduleSpecifier.text !== packageName) continue;\n\n const namedBindings = stmt.importClause?.namedBindings;\n if (namedBindings === undefined || !ts.isNamedImports(namedBindings)) continue;\n\n const remaining = namedBindings.elements.filter(el => (el.propertyName?.text ?? el.name.text) !== name);\n if (remaining.length === namedBindings.elements.length) continue;\n\n if (remaining.length === 0) {\n const start = stmt.getFullStart();\n const end = stmt.getEnd();\n const trailing = content.slice(end).startsWith(\"\\n\") ? end + 1 : end;\n return `${content.slice(0, start)}${content.slice(trailing)}`;\n }\n\n const elementsText = remaining.map(el => el.getText()).join(\", \");\n return `${content.slice(0, namedBindings.getStart())}{ ${elementsText} }${content.slice(namedBindings.getEnd())}`;\n }\n\n return content;\n};\n\nconst ensureNamedImport = (content: string, packageName: string, namesToAdd: ReadonlyArray<string>): string => {\n const sourceFile = parseTsx(content, \"source.tsx\");\n const aliases = getImportedAliases(sourceFile, packageName) ?? {};\n\n const missing = namesToAdd.filter(name => !Object.values(aliases).includes(name));\n if (missing.length === 0) return content;\n\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n const moduleSpecifier = stmt.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier) || moduleSpecifier.text !== packageName) continue;\n\n const namedBindings = stmt.importClause?.namedBindings;\n if (namedBindings === undefined || !ts.isNamedImports(namedBindings)) continue;\n\n const elementsText = namedBindings.elements.map(el => el.getText()).join(\", \");\n const merged = [elementsText, ...missing].join(\", \");\n return `${content.slice(0, namedBindings.getStart())}{ ${merged} }${content.slice(namedBindings.getEnd())}`;\n }\n\n const importLine = `import { ${missing.join(\", \")} } from \"${packageName}\";\\n`;\n return `${importLine}${content}`;\n};\n\nlet manualReviewCount = 0;\n\nconst transformCopyableCellUsage = (filePath: string, content: string): string | null => {\n const sourceFile = parseTsx(content, filePath);\n\n const aliases = getImportedAliases(sourceFile, TABLE_PACKAGE);\n if (aliases === null) return null;\n\n const cellAlias = Object.entries(aliases).find(([, name]) => name === COMPONENT_NAME)?.[0];\n if (cellAlias === undefined) return null;\n\n if (Object.values(aliases).includes(\"CopyableCellProps\")) {\n manualReviewCount += 1;\n return null;\n }\n\n const matches = findJsxElements(sourceFile, [cellAlias]);\n if (matches.length === 0) return null;\n\n type Edit = { start: number; end: number; replacement: string };\n const edits: Array<Edit> = [];\n let needsMultiRow = false;\n\n for (const { openingElement, element } of matches) {\n if (hasSpreadAttribute(openingElement)) {\n manualReviewCount += 1;\n continue;\n }\n\n const textAttr = findJsxAttribute(openingElement, \"text\");\n const textExpr = textAttr !== null ? textExpression(textAttr) : null;\n if (textExpr === null) {\n manualReviewCount += 1;\n continue;\n }\n\n const classNameAttr = findJsxAttribute(openingElement, \"className\");\n if (classNameAttr !== null) {\n // The old cell forwarded className to its own cva root; there is no\n // 1:1 slot for it on the pair, so leave these for a human.\n manualReviewCount += 1;\n continue;\n }\n\n const secondaryAttr = findJsxAttribute(openingElement, \"secondary\");\n const testIdText = attributeSourceText(findJsxAttribute(openingElement, \"data-testid\"));\n\n let replacement: string;\n if (secondaryAttr === null) {\n replacement = renderPair(textExpr, false);\n if (testIdText !== null) {\n replacement = replacement.replace(\n `<div className=\"flex min-w-0 max-w-full items-center overflow-hidden\">`,\n `<div className=\"flex min-w-0 max-w-full items-center overflow-hidden\" data-testid=${testIdText}>`\n );\n }\n } else {\n const secondaryExpr = secondaryTextExpression(secondaryAttr);\n if (secondaryExpr === null) {\n // `secondary` was something other than an inline `{{ text: … }}`.\n manualReviewCount += 1;\n continue;\n }\n needsMultiRow = true;\n const testIdProp = testIdText !== null ? ` data-testid=${testIdText}` : \"\";\n replacement = `<MultiRowTableCell className=\"w-fit overflow-hidden\"${testIdProp} main={${renderPair(textExpr, false)}} secondary={${renderPair(secondaryExpr, true)}} />`;\n }\n\n edits.push({ start: element.getStart(), end: element.getEnd(), replacement });\n }\n\n if (edits.length === 0) return null;\n\n edits.sort((a, b) => b.start - a.start);\n\n let updated = content;\n for (const { start, end, replacement } of edits) {\n updated = `${updated.slice(0, start)}${replacement}${updated.slice(end)}`;\n }\n\n const remaining = findJsxElements(parseTsx(updated, filePath), [cellAlias]);\n if (remaining.length === 0) {\n updated = removeNamedImport(updated, TABLE_PACKAGE, COMPONENT_NAME);\n } else {\n manualReviewCount += 1;\n }\n\n if (needsMultiRow) {\n updated = ensureNamedImport(updated, TABLE_PACKAGE, [\"MultiRowTableCell\"]);\n }\n updated = ensureNamedImport(updated, COMPONENTS_PACKAGE, [\"Text\", \"CopyButton\"]);\n\n return updated;\n};\n\n/**\n * Rewrites `<CopyableCell text={x} secondary={{ text: y }} …/>` (removed in\n * v3) into the value/copy pair used by table cells: a truncating `Text` next\n * to an `extraSmall` `CopyButton`, wrapped for two-row cells in\n * `MultiRowTableCell` with the `w-fit overflow-hidden` guard that keeps the\n * pair inside the cell's grid track. Usages with spreads, dynamic\n * `secondary` values, forwarded classNames, or a referenced\n * `CopyableCellProps` type are left for manual review.\n */\nexport const copyableCellToCopyPair = (tree: Tree): void => {\n manualReviewCount = 0;\n const touched = visitTsxFiles(tree, COMPONENT_NAME, transformCopyableCellUsage);\n logSummary(\"copyablecell-to-copy-pair\", touched, manualReviewCount);\n};\n\nexport default copyableCellToCopyPair;\n"]}