@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 +6 -6
- package/dist/parser.d.mts +1 -8
- package/dist/parser.mjs +15 -23
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { generateSayJSXElement } from "./generator.mjs";
|
|
2
|
-
import {
|
|
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 },
|
|
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 },
|
|
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 },
|
|
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 },
|
|
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 {
|
|
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))
|
|
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))
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
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 {
|
|
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-
|
|
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-
|
|
51
|
-
"@saykit/transform-js": "^0.0.0-beta-
|
|
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",
|