bestax-migrate 2.3.1 → 2.3.3

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.
@@ -60,6 +60,13 @@ export type LiteralValue = {
60
60
  } | {
61
61
  kind: 'expression';
62
62
  };
63
+ /**
64
+ * An attribute as the author wrote it, for a TODO that removes it. A dynamic
65
+ * value may be the only reference keeping an import alive, so the message has
66
+ * to carry it -- otherwise the destination is recoverable only from git.
67
+ * Returns '' if the printer cannot render the node.
68
+ */
69
+ export declare function attrSource(j: JSCodeshift, attr: any): string;
63
70
  /** Extract the literal value of a JSX attribute, if it has one. */
64
71
  export declare function literalValueOf(attr: any): LiteralValue;
65
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-utils.d.ts","sourceRoot":"","sources":["../../../src/sources/_shared/jsx-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsx-utils.d.ts","sourceRoot":"","sources":["../../../src/sources/_shared/jsx-utils.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,20 @@ export function addAttr(element, attr) {
54
54
  element.openingElement.attributes = element.openingElement.attributes ?? [];
55
55
  element.openingElement.attributes.push(attr);
56
56
  }
57
+ /**
58
+ * An attribute as the author wrote it, for a TODO that removes it. A dynamic
59
+ * value may be the only reference keeping an import alive, so the message has
60
+ * to carry it -- otherwise the destination is recoverable only from git.
61
+ * Returns '' if the printer cannot render the node.
62
+ */
63
+ export function attrSource(j, attr) {
64
+ try {
65
+ return j(attr).toSource();
66
+ }
67
+ catch {
68
+ return '';
69
+ }
70
+ }
57
71
  /** Extract the literal value of a JSX attribute, if it has one. */
58
72
  export function literalValueOf(attr) {
59
73
  if (attr.value == null)
@@ -162,7 +176,16 @@ export function addTodo(ctx, path, rule, message) {
162
176
  /^Export(Named|Default)Declaration$/.test(statement.parent.node.type)) {
163
177
  statement = statement.parent;
164
178
  }
165
- const text = ` TODO(bestax-migrate): ${message}`;
179
+ // A `//` comment ends at the first newline, so any line break inside the
180
+ // message would leave the rest of it as bare code and the file unparseable.
181
+ // Messages quote source text -- an attribute value, a tag name -- and JSX
182
+ // permits a newline inside both, so this is folded here rather than at each
183
+ // of the callers that interpolate one.
184
+ //
185
+ // Line terminators only. Collapsing all whitespace rewrote the very thing
186
+ // the quote exists to preserve: `href="/a b"` came back as `href="/a b"`,
187
+ // a different URL.
188
+ const text = ` TODO(bestax-migrate): ${message.replace(/[\r\n\u2028\u2029]+/g, ' ').trim()}`;
166
189
  if (statement) {
167
190
  const node = statement.node;
168
191
  node.comments = node.comments ?? [];
@@ -0,0 +1,107 @@
1
+ /**
2
+ * bestax's DOM props follow `as`: an element's attributes are the attributes
3
+ * of whatever `as` renders, and a few components narrow `as` to a literal
4
+ * union of the elements Bulma's markup allows there. Every source library
5
+ * this package migrates from is looser — rbx and react-bulma-components take
6
+ * any tag, bloomer took any `tag` — so a faithful prop-for-prop rename emits
7
+ * shapes that do not compile against the library:
8
+ *
9
+ * - an `as` naming an element the bestax component does not offer;
10
+ * - an `href` beside an `as` that is not an `<a>`;
11
+ * - an `href` on a component that declares none at any `as`;
12
+ * - `target` and its siblings on an element, or a component, without them.
13
+ *
14
+ * All are dropped with a TODO rather than carried, because carrying them
15
+ * hands the user a project that does not typecheck, which is the one thing a
16
+ * codemod must not do.
17
+ *
18
+ * What that costs differs by case, and each TODO says so. Dropping an `href`
19
+ * or a `target` costs nothing the source had: they sat on a `<span>` or a
20
+ * `<div>`, where no browser acts on them. Dropping an `as` does change the
21
+ * element — every source here rendered the tag it was given, and bestax
22
+ * renders its own instead — so that TODO names the tag to restore rather than
23
+ * claiming nothing moved.
24
+ *
25
+ * Source-agnostic: what it knows is bestax's side of the rename, so all three
26
+ * sources run it over every element after their prop passes.
27
+ */
28
+ import type { ASTPath } from 'jscodeshift';
29
+ import { type TransformContext } from './jsx-utils.js';
30
+ export declare const AS_UNIONS: Record<string, readonly string[]>;
31
+ /**
32
+ * What to do with a link the element refuses. `carry` is true for an attribute
33
+ * that has to land ON the anchor to do anything (`target`, `download`, …) and
34
+ * false where the anchor itself IS the remedy (a bare `href`).
35
+ *
36
+ * Four answers, because "put an <a> inside" is wrong in three different ways:
37
+ * an anchor inside interactive content is invalid, an anchor inside a void
38
+ * element is impossible, and an anchor around a context-bound element puts it
39
+ * somewhere its parent may not be.
40
+ *
41
+ * Exported because `specials-utils.ts` reaches the same question from the plain
42
+ * markup side, and `bestax-migrate/CLAUDE.md` puts a rule two transforms need in
43
+ * `_shared/` rather than in one of them.
44
+ */
45
+ export declare const nestOrClick: (rendered: string | undefined, carry?: boolean) => string;
46
+ /** The targets whose `as` this pass may believe. */
47
+ export declare function declaresAs(target: string): boolean;
48
+ /** The rows the type test holds to the library. */
49
+ export declare const HREF_TABLE: Record<string, string>;
50
+ export declare const AS_ANY_TARGETS: readonly string[];
51
+ /** The rows the type test holds to the library. */
52
+ export declare const TARGET_LINK_ATTR_TABLE: Record<string, readonly string[]>;
53
+ /**
54
+ * The intrinsic elements React types an `href` onto.
55
+ *
56
+ * Only relevant to plain markup. On a bestax component the anchor is the only
57
+ * `as` that keeps an `href`, because the components disagree about what they
58
+ * forward (see `ANCHOR` below) -- but a plain `<area href>` has no component
59
+ * in the way, and it is valid.
60
+ */
61
+ export declare const HREF_ELEMENTS: readonly string[];
62
+ /**
63
+ * The HTML half of `JSX.IntrinsicElements`, as of `@types/react` 19.
64
+ *
65
+ * Regenerate by reading the keys between `interface IntrinsicElements {` and
66
+ * the `// SVG` comment in `@types/react/index.d.ts`. `as-unions.test.ts`
67
+ * holds the link tables to this set, so it is checked rather than trusted.
68
+ *
69
+ * SVG is excluded deliberately: `SVGAttributes` declares `href`, `media` and
70
+ * `target`, so every SVG tag would join those rows. What that means for a
71
+ * plain rewrite is `tagRejectsHref`'s problem, not a reason to widen this.
72
+ */
73
+ export declare const HTML_INTRINSICS: readonly string[];
74
+ /**
75
+ * Whether a plain tag is known NOT to take an `href`.
76
+ *
77
+ * `HREF_ELEMENTS` is the HTML answer, and bloomer's `plainTag` can return any
78
+ * literal the source wrote -- including an SVG tag, where `SVGAttributes`
79
+ * declares `href`. Treating "not in the HTML list" as "takes no href" lost a
80
+ * working `href` off `<TabLink tag="use" href="#icon">`. An unrecognised tag
81
+ * is left alone: this pass removes attributes it can prove are dead, and it
82
+ * cannot prove that here.
83
+ */
84
+ export declare function tagRejectsHref(tag: string): boolean;
85
+ /** Whether `element` renders `attr` legally -- exported for the plain-markup path. */
86
+ export declare function elementTakesLinkAttr(name: string, element: string): boolean;
87
+ /** The link attributes, for callers that iterate them. */
88
+ export declare const LINK_ATTRS: readonly string[];
89
+ /** The rows the type test holds to React. */
90
+ export declare const LINK_ATTR_TABLE: Record<string, readonly string[]>;
91
+ /**
92
+ * The whole-element pass each source runs after its prop passes, once the
93
+ * bestax `target` and the final `as` are both known.
94
+ */
95
+ export declare function enforcePolymorphicProps(ctx: TransformContext, path: ASTPath<any>, element: any, target: string,
96
+ /**
97
+ * Whether a spread on this element could be carrying an `as`.
98
+ *
99
+ * Only where the SOURCE spells its element prop `as`, which is rbx alone.
100
+ * bloomer's is `tag` and react-bulma-components' is `renderAs`, and the
101
+ * rename only ever touches a literal attribute -- a `renderAs` key inside
102
+ * `{...rest}` never becomes an `as`. Guessing `true` everywhere let
103
+ * `<Button renderAs="span" {...rest} href="/x">` through untouched, which
104
+ * is the shape this pass exists to remove.
105
+ */
106
+ spreadCanCarryAs?: boolean): void;
107
+ //# sourceMappingURL=polymorphic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polymorphic.d.ts","sourceRoot":"","sources":["../../../src/sources/_shared/polymorphic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AA0BxB,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAkB,CAAC;AAmK3E;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,GAAG,SAAS,EAC5B,eAAa,KACZ,MAmBF,CAAC;AAMF,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAQD,mDAAmD;AACnD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAW,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAuB,CAAC;AAuEpE,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAClD,CAAC;AAEpB;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAAkC,CAAC;AAE9E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAwH5C,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AASD,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAG3E;AAED,0DAA0D;AAC1D,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAAoC,CAAC;AAE7E,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAC1C,CAAC;AAuLrB;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAClB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM;AACd;;;;;;;;;GASG;AACH,gBAAgB,UAAQ,GACvB,IAAI,CAsEN"}