@saykit/transform-jsx 0.0.0-beta-20260729112211 → 0.0.0-beta-20260729131250

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/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { generateSayJSXElement } from "./generator.mjs";
2
- import { isEquivalentElement, parseJSXElement } from "./parser.mjs";
2
+ import { parseJSXElement } from "./parser.mjs";
3
3
  import { generate } from "@babel/generator";
4
4
  import * as parser from "@babel/parser";
5
5
  import traverse_ from "@babel/traverse";
6
6
  import { assignSequenceIdentifiers } from "@saykit/config/features/messages";
7
7
  import { generateSayCallExpression } from "@saykit/transform-js/generator";
8
- import { parseExpression } from "@saykit/transform-js/parser";
8
+ import { isEquivalentPlaceholder, parseExpression } from "@saykit/transform-js/parser";
9
9
  //#region src/index.ts
10
10
  const traverse = traverse_.default || traverse_;
11
11
  function createProgram(code, id) {
@@ -40,7 +40,7 @@ function createJsxTransformer() {
40
40
  path.node.leadingComments = path.node.leadingComments ?? [];
41
41
  const message = parseExpression(path.node);
42
42
  if (message) {
43
- assignSequenceIdentifiers(message, { current: 0 }, isEquivalentElement);
43
+ assignSequenceIdentifiers(message, { current: 0 }, isEquivalentPlaceholder);
44
44
  messages.push(message);
45
45
  path.skip();
46
46
  }
@@ -49,7 +49,7 @@ function createJsxTransformer() {
49
49
  path.node.leadingComments = path.node.leadingComments ?? [];
50
50
  const message = parseJSXElement(path.node);
51
51
  if (message) {
52
- assignSequenceIdentifiers(message, { current: 0 }, isEquivalentElement);
52
+ assignSequenceIdentifiers(message, { current: 0 }, isEquivalentPlaceholder);
53
53
  messages.push(message);
54
54
  path.skip();
55
55
  }
@@ -71,7 +71,7 @@ function createJsxTransformer() {
71
71
  path.node.leadingComments = path.node.leadingComments ?? [];
72
72
  const message = parseExpression(path.node);
73
73
  if (message) {
74
- assignSequenceIdentifiers(message, { current: 0 }, isEquivalentElement);
74
+ assignSequenceIdentifiers(message, { current: 0 }, isEquivalentPlaceholder);
75
75
  const replacement = generateSayCallExpression(message);
76
76
  path.replaceWith(replacement);
77
77
  path.skip();
@@ -81,7 +81,7 @@ function createJsxTransformer() {
81
81
  path.node.leadingComments = path.node.leadingComments ?? [];
82
82
  const message = parseJSXElement(path.node);
83
83
  if (message) {
84
- assignSequenceIdentifiers(message, { current: 0 }, isEquivalentElement);
84
+ assignSequenceIdentifiers(message, { current: 0 }, isEquivalentPlaceholder);
85
85
  const replacement = generateSayJSXElement(message);
86
86
  path.replaceWith(replacement);
87
87
  path.skip();
package/dist/parser.d.mts CHANGED
@@ -5,12 +5,5 @@ declare function parseJSXContainerElement(element: t.JSXElement): CompositeMessa
5
5
  declare function parseJSXOpeningElement(element: t.JSXOpeningElement): CompositeMessage | null;
6
6
  declare function parseJSXElement(element: t.JSXElement, fallback?: false): CompositeMessage | null;
7
7
  declare function parseJSXElement(element: t.JSXElement, fallback: true): CompositeMessage | ElementMessage;
8
- /**
9
- * Whether two elements sharing a tag are the same element, and so compile to
10
- * one prop a translator can use interchangeably. `say-tag` has been stripped by
11
- * the time this runs, so it compares the element name and the props left over,
12
- * not the children: those come from the translation, not the source.
13
- */
14
- declare function isEquivalentElement(a: any, b: any): boolean;
15
8
  //#endregion
16
- export { isEquivalentElement, parseJSXContainerElement, parseJSXElement, parseJSXOpeningElement };
9
+ export { parseJSXContainerElement, parseJSXElement, parseJSXOpeningElement };
package/dist/parser.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AUTO_INCREMENT_IDENTIFIER, ArgumentMessage, ChoiceMessage, CompositeMessage, ElementMessage, LiteralMessage } from "@saykit/config/features/messages";
2
+ import { unwrapPlaceholder } from "@saykit/transform-js/parser";
2
3
  import * as t from "@babel/types";
3
4
  //#region src/parser.ts
4
5
  /**
@@ -23,7 +24,10 @@ function parseJSXContainerElement(element) {
23
24
  if (t.isJSXElement(c)) p.push(parseJSXElement(c, true));
24
25
  else if (t.isJSXFragment(c)) p.push(new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [], c));
25
26
  else if (t.isJSXExpressionContainer(c)) {
26
- if (t.isExpression(c.expression)) p.push(new ArgumentMessage(getExpressionAsIdentifier(c.expression), c.expression));
27
+ if (t.isExpression(c.expression)) {
28
+ const [identifier, value] = unwrapPlaceholder(c.expression);
29
+ p.push(new ArgumentMessage(identifier, value));
30
+ }
27
31
  }
28
32
  return p;
29
33
  }, []);
@@ -63,16 +67,20 @@ function parseJSXOpeningElement(element) {
63
67
  identifier,
64
68
  value: new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [], a.value.expression)
65
69
  });
66
- else if (t.isExpression(a.value.expression)) b.push({
67
- identifier,
68
- value: new ArgumentMessage(getExpressionAsIdentifier(a.value.expression), a.value.expression)
69
- });
70
+ else if (t.isExpression(a.value.expression)) {
71
+ const [name, value] = unwrapPlaceholder(a.value.expression);
72
+ b.push({
73
+ identifier,
74
+ value: new ArgumentMessage(name, value)
75
+ });
76
+ }
70
77
  }
71
78
  return b;
72
79
  }, []);
73
80
  const initialiser = findAttributeValueIfExpressionOrStringLiteral(element.attributes, "_");
74
81
  if (!initialiser) return null;
75
- const choice = new ChoiceMessage(kind, getExpressionAsIdentifier(initialiser), branches, initialiser);
82
+ const [identifier, selector] = unwrapPlaceholder(initialiser);
83
+ const choice = new ChoiceMessage(kind, identifier, branches, selector);
76
84
  return new CompositeMessage({
77
85
  id: findAttributeValueIfStringLiteralAsString(element.attributes, "id"),
78
86
  context: findAttributeValueIfStringLiteralAsString(element.attributes, "context")
@@ -111,16 +119,6 @@ function takeElementTag(element) {
111
119
  attributes.splice(index, 1);
112
120
  return tag;
113
121
  }
114
- /**
115
- * Whether two elements sharing a tag are the same element, and so compile to
116
- * one prop a translator can use interchangeably. `say-tag` has been stripped by
117
- * the time this runs, so it compares the element name and the props left over,
118
- * not the children: those come from the translation, not the source.
119
- */
120
- function isEquivalentElement(a, b) {
121
- if (!t.isJSXElement(a) || !t.isJSXElement(b)) return false;
122
- return t.isNodesEquivalent(a.openingElement, b.openingElement);
123
- }
124
122
  function getReferences(node) {
125
123
  if (!node.loc?.filename) return [];
126
124
  return [`${node.loc.filename}:${node.loc.start.line}`];
@@ -153,11 +151,5 @@ function findAttributeValueAsBoolean(attributes, identifier) {
153
151
  if (t.isJSXExpressionContainer(attribute.value) && t.isBooleanLiteral(attribute.value.expression)) return attribute.value.expression.value;
154
152
  }
155
153
  }
156
- function getExpressionAsIdentifier(node) {
157
- if (t.isIdentifier(node)) return node.name;
158
- /* v8 ignore next */
159
- if (t.isJSXIdentifier(node)) return node.name;
160
- return AUTO_INCREMENT_IDENTIFIER;
161
- }
162
154
  //#endregion
163
- export { isEquivalentElement, parseJSXContainerElement, parseJSXElement, parseJSXOpeningElement };
155
+ export { parseJSXContainerElement, parseJSXElement, parseJSXOpeningElement };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saykit/transform-jsx",
3
- "version": "0.0.0-beta-20260729112211",
3
+ "version": "0.0.0-beta-20260729131250",
4
4
  "description": "JSX and TSX source transformer for SayKit",
5
5
  "keywords": [
6
6
  "i18n",
@@ -47,8 +47,8 @@
47
47
  "@babel/parser": "^7.29.7",
48
48
  "@babel/traverse": "^7.29.7",
49
49
  "@babel/types": "^7.29.7",
50
- "@saykit/config": "^0.0.0-beta-20260729112211",
51
- "@saykit/transform-js": "^0.0.0-beta-20260729112211"
50
+ "@saykit/config": "^0.0.0-beta-20260729131250",
51
+ "@saykit/transform-js": "^0.0.0-beta-20260729131250"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@babel/core": "^7.29.7",