@tolgee/cli 2.0.3 → 2.1.0
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/cli.js +15 -23
- package/dist/commands/extract/check.js +2 -6
- package/dist/commands/extract/print.js +2 -6
- package/dist/commands/pull.js +2 -4
- package/dist/commands/sync/compare.js +2 -6
- package/dist/commands/sync/sync.js +1 -5
- package/dist/commands/tag.js +1 -5
- package/dist/config/tolgeerc.js +4 -6
- package/dist/extractor/extractor.js +40 -66
- package/dist/extractor/parser/extractComment.js +78 -0
- package/dist/extractor/parser/generalMapper.js +82 -0
- package/dist/extractor/parser/generateReport.js +161 -0
- package/dist/extractor/parser/iterator.js +37 -0
- package/dist/extractor/parser/mergerMachine.js +66 -0
- package/dist/extractor/parser/nodeUtils.js +21 -0
- package/dist/extractor/parser/parser.js +129 -0
- package/dist/extractor/parser/rules/tComponentGeneral.js +45 -0
- package/dist/extractor/parser/rules/tFunctionGeneral.js +41 -0
- package/dist/extractor/parser/rules/tNsSourceGeneral.js +36 -0
- package/dist/extractor/parser/tokenMergers/closingTagMerger.js +27 -0
- package/dist/extractor/parser/tokenMergers/commentsMerger.js +36 -0
- package/dist/extractor/parser/tokenMergers/stringMerger.js +50 -0
- package/dist/extractor/parser/tokenMergers/templateStringMerger.js +55 -0
- package/dist/extractor/parser/tokenMergers/typesAsMergerer.js +40 -0
- package/dist/extractor/parser/tokenMergers/typesCastMerger.js +28 -0
- package/dist/extractor/parser/tree/getTranslateProps.js +54 -0
- package/dist/extractor/parser/tree/getValue.js +17 -0
- package/dist/extractor/parser/tree/parseGeneral.js +51 -0
- package/dist/extractor/parser/tree/parseList.js +33 -0
- package/dist/extractor/parser/tree/parseObject.js +130 -0
- package/dist/extractor/parser/tree/parseProps.js +56 -0
- package/dist/extractor/parser/tree/parseTag.js +26 -0
- package/dist/extractor/parser/types.js +1 -0
- package/dist/extractor/parserReact/ParserReact.js +30 -0
- package/dist/extractor/parserReact/jsxMapper.js +24 -0
- package/dist/extractor/parserReact/rules/createElement.js +62 -0
- package/dist/extractor/parserReact/rules/tComponent.js +9 -0
- package/dist/extractor/parserReact/rules/tFunction.js +7 -0
- package/dist/extractor/parserReact/rules/useTranslate.js +7 -0
- package/dist/extractor/parserReact/tokenMergers/createElementMerger.js +35 -0
- package/dist/extractor/parserReact/tokenMergers/tComponentMerger.js +20 -0
- package/dist/extractor/parserReact/tokenMergers/tFunctionMerger.js +23 -0
- package/dist/extractor/parserReact/tokenMergers/useTranslateMerger.js +20 -0
- package/dist/extractor/parserSvelte/ParserSvelte.js +32 -0
- package/dist/extractor/parserSvelte/contextConstants.js +1 -0
- package/dist/extractor/parserSvelte/rules/scriptTag.js +26 -0
- package/dist/extractor/parserSvelte/rules/tComponent.js +9 -0
- package/dist/extractor/parserSvelte/rules/tFunction.js +7 -0
- package/dist/extractor/parserSvelte/rules/useTranslate.js +7 -0
- package/dist/extractor/parserSvelte/svelteMapper.js +39 -0
- package/dist/extractor/parserSvelte/svelteTreeTransform.js +38 -0
- package/dist/extractor/parserSvelte/tokenMergers/getTranslateMerger.js +20 -0
- package/dist/extractor/parserSvelte/tokenMergers/scriptTagMerger.js +20 -0
- package/dist/extractor/parserSvelte/tokenMergers/tComponentMerger.js +20 -0
- package/dist/extractor/parserSvelte/tokenMergers/tFunctionMerger.js +29 -0
- package/dist/extractor/parserVue/ParserVue.js +45 -0
- package/dist/extractor/parserVue/contextConstants.js +3 -0
- package/dist/extractor/parserVue/rules/exportDefaultObject.js +14 -0
- package/dist/extractor/parserVue/rules/globalTFunction.js +7 -0
- package/dist/extractor/parserVue/rules/scriptTag.js +31 -0
- package/dist/extractor/parserVue/rules/tComponent.js +9 -0
- package/dist/extractor/parserVue/rules/tFunction.js +7 -0
- package/dist/extractor/parserVue/rules/useTranslate.js +7 -0
- package/dist/extractor/parserVue/tokenMergers/exportDefaultObjectMerger.js +25 -0
- package/dist/extractor/parserVue/tokenMergers/globalTFunctionMerger.js +36 -0
- package/dist/extractor/parserVue/tokenMergers/scriptTagMerger.js +20 -0
- package/dist/extractor/parserVue/tokenMergers/tComponentMerger.js +20 -0
- package/dist/extractor/parserVue/tokenMergers/tFunctionMerger.js +37 -0
- package/dist/extractor/parserVue/tokenMergers/useTranslateMerger.js +20 -0
- package/dist/extractor/parserVue/vueMapper.js +51 -0
- package/dist/extractor/parserVue/vueTreeTransform.js +109 -0
- package/dist/extractor/runner.js +52 -4
- package/dist/extractor/visualizers/printTokens.js +7 -0
- package/dist/extractor/visualizers/tokensToString.js +28 -0
- package/dist/extractor/visualizers/visualizeRules.js +40 -0
- package/dist/extractor/warnings.js +4 -0
- package/dist/extractor/worker.js +10 -7
- package/dist/options.js +5 -0
- package/extractor.d.ts +8 -1
- package/package.json +2 -4
- package/schema.json +18 -6
- package/dist/client/internal/requester.js +0 -130
- package/dist/extractor/machines/comments.js +0 -78
- package/dist/extractor/machines/react.js +0 -705
- package/dist/extractor/machines/shared/comments.js +0 -79
- package/dist/extractor/machines/shared/properties.js +0 -380
- package/dist/extractor/machines/shared/translateCall.js +0 -141
- package/dist/extractor/machines/svelte.js +0 -429
- package/dist/extractor/machines/vue/decoder.js +0 -194
- package/dist/extractor/machines/vue/extract.js +0 -491
- package/dist/extractor/processors/vueSfc.js +0 -55
@@ -0,0 +1,17 @@
|
|
1
|
+
import { parseGeneral } from './parseGeneral.js';
|
2
|
+
export function getValue(context) {
|
3
|
+
const token = context.tokens.current();
|
4
|
+
const line = context.getCurrentLine();
|
5
|
+
switch (token?.customType) {
|
6
|
+
case 'string':
|
7
|
+
case 'primitive.null':
|
8
|
+
return { type: 'primitive', line, value: token.token };
|
9
|
+
case 'expression.begin':
|
10
|
+
context.tokens.next();
|
11
|
+
return parseGeneral(context, {
|
12
|
+
end: ['expression.end'],
|
13
|
+
});
|
14
|
+
default:
|
15
|
+
return { type: 'expr', line, values: [] };
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { simplifyNode } from '../nodeUtils.js';
|
2
|
+
import { getValue } from './getValue.js';
|
3
|
+
import { parseList } from './parseList.js';
|
4
|
+
import { parseObject } from './parseObject.js';
|
5
|
+
export function parseGeneral(context, options) {
|
6
|
+
const { tokens, ruleMap, withLabel, blocks } = context;
|
7
|
+
const { end, keepNested } = options;
|
8
|
+
const result = {
|
9
|
+
type: 'expr',
|
10
|
+
line: context.getCurrentLine(),
|
11
|
+
values: [],
|
12
|
+
};
|
13
|
+
let token;
|
14
|
+
while ((token = tokens.current())) {
|
15
|
+
const type = token.customType;
|
16
|
+
if (!token || (end && end.includes(token.customType))) {
|
17
|
+
break;
|
18
|
+
}
|
19
|
+
if (!type) {
|
20
|
+
result.values.push(getValue(context));
|
21
|
+
tokens.next();
|
22
|
+
}
|
23
|
+
else if (ruleMap.has(type)) {
|
24
|
+
result.values.push(withLabel(ruleMap.get(type))(context));
|
25
|
+
if (token === tokens.current()) {
|
26
|
+
throw new Error(`SYSTEM ERROR: Rule "${type}" didn't consume any tokens`);
|
27
|
+
}
|
28
|
+
// not loading new token when rule ended
|
29
|
+
}
|
30
|
+
else if (type === 'block.begin') {
|
31
|
+
result.values.push(withLabel(parseObject)(context));
|
32
|
+
}
|
33
|
+
else if (type === 'list.begin') {
|
34
|
+
result.values.push(withLabel(parseList)(context, 'list.end'));
|
35
|
+
// list consumes last token, so no loading next
|
36
|
+
}
|
37
|
+
else if (blocks[type]) {
|
38
|
+
withLabel(tokens.next)();
|
39
|
+
result.values.push(withLabel(parseGeneral)(context, {
|
40
|
+
end: blocks[type],
|
41
|
+
keepNested,
|
42
|
+
}));
|
43
|
+
withLabel(tokens.next)();
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
result.values.push(getValue(context));
|
47
|
+
tokens.next();
|
48
|
+
}
|
49
|
+
}
|
50
|
+
return keepNested ? result : simplifyNode(result);
|
51
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { parseGeneral } from './parseGeneral.js';
|
2
|
+
/*
|
3
|
+
* React.createElement(T, { keyName: 'key1' }, "default value")
|
4
|
+
* ^--------------------------------------^
|
5
|
+
*
|
6
|
+
* or
|
7
|
+
*
|
8
|
+
* ['item', 'item']
|
9
|
+
* ^--------------^
|
10
|
+
*/
|
11
|
+
export function parseList(context, end) {
|
12
|
+
const { tokens, getCurrentLine } = context;
|
13
|
+
const line = getCurrentLine();
|
14
|
+
tokens.next();
|
15
|
+
const result = [];
|
16
|
+
let token;
|
17
|
+
while ((token = tokens.current())) {
|
18
|
+
if (end && end === token.customType) {
|
19
|
+
tokens.next();
|
20
|
+
break;
|
21
|
+
}
|
22
|
+
switch (token.customType) {
|
23
|
+
case 'separator.comma':
|
24
|
+
tokens.next();
|
25
|
+
break;
|
26
|
+
default:
|
27
|
+
result.push(parseGeneral(context, {
|
28
|
+
end: ['separator.comma', end],
|
29
|
+
}));
|
30
|
+
}
|
31
|
+
}
|
32
|
+
return { type: 'array', line, values: result };
|
33
|
+
}
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import { extractString, isString } from '../nodeUtils.js';
|
2
|
+
import { parseGeneral } from './parseGeneral.js';
|
3
|
+
// { key: 'value', ... }
|
4
|
+
// ^-------------------^
|
5
|
+
export function parseObject(context) {
|
6
|
+
const { tokens, getCurrentLine } = context;
|
7
|
+
const line = getCurrentLine();
|
8
|
+
const result = { type: 'dict', line, value: {}, unknown: [] };
|
9
|
+
tokens.next();
|
10
|
+
let token;
|
11
|
+
let state = 0 /* S.ExpectProperty */;
|
12
|
+
let lastKey;
|
13
|
+
function fallbackToBlock() {
|
14
|
+
const combinedResult = {
|
15
|
+
type: 'expr',
|
16
|
+
line,
|
17
|
+
values: [...Object.values(result.value), ...result.unknown],
|
18
|
+
};
|
19
|
+
const parsedContent = parseGeneral(context, {
|
20
|
+
end: ['block.end'],
|
21
|
+
});
|
22
|
+
tokens.next();
|
23
|
+
if (parsedContent.type === 'expr') {
|
24
|
+
// avoid nesting
|
25
|
+
combinedResult.values.push(...parsedContent.values);
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
combinedResult.values.push(parsedContent);
|
29
|
+
}
|
30
|
+
return combinedResult;
|
31
|
+
}
|
32
|
+
loop: while ((token = tokens.current())) {
|
33
|
+
const type = token.customType;
|
34
|
+
if (type === 'block.end') {
|
35
|
+
tokens.next();
|
36
|
+
break loop;
|
37
|
+
}
|
38
|
+
switch (state) {
|
39
|
+
case 0 /* S.ExpectProperty */:
|
40
|
+
if (type === 'object.key') {
|
41
|
+
state = 1 /* S.ExpectDoubleColon */;
|
42
|
+
lastKey = token.token;
|
43
|
+
}
|
44
|
+
else if (type === 'variable') {
|
45
|
+
result.value[token.token] = {
|
46
|
+
type: 'expr',
|
47
|
+
line: getCurrentLine(),
|
48
|
+
values: [],
|
49
|
+
};
|
50
|
+
state = 3 /* S.ExpectComma */;
|
51
|
+
}
|
52
|
+
else if (type === 'list.begin') {
|
53
|
+
// dynamic key name '[value]: ...'
|
54
|
+
tokens.next();
|
55
|
+
const inside = parseGeneral(context, {
|
56
|
+
end: ['list.end'],
|
57
|
+
});
|
58
|
+
if (isString(inside)) {
|
59
|
+
lastKey = extractString(inside);
|
60
|
+
}
|
61
|
+
else {
|
62
|
+
// dynamic keyname
|
63
|
+
result.unknown.push(inside);
|
64
|
+
lastKey = undefined;
|
65
|
+
}
|
66
|
+
state = 1 /* S.ExpectDoubleColon */;
|
67
|
+
}
|
68
|
+
else if (type === 'kw.async') {
|
69
|
+
// there might be async function call,
|
70
|
+
// we can just ignore this keyword
|
71
|
+
}
|
72
|
+
else if (type === 'function.call') {
|
73
|
+
// shorthand for function definition, treat as dynamic value
|
74
|
+
result.value[token.token] = parseGeneral(context, {
|
75
|
+
end: ['separator.comma', 'block.end'],
|
76
|
+
});
|
77
|
+
state = 3 /* S.ExpectComma */;
|
78
|
+
// don't load next token, it was loaded by extract
|
79
|
+
continue;
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
// it's not object, but block
|
83
|
+
// just somehow stich together already loaded values
|
84
|
+
// and the rest
|
85
|
+
return fallbackToBlock();
|
86
|
+
}
|
87
|
+
break;
|
88
|
+
case 1 /* S.ExpectDoubleColon */:
|
89
|
+
if (type === 'acessor.doublecolon') {
|
90
|
+
state = 2 /* S.ExpectValue */;
|
91
|
+
}
|
92
|
+
else {
|
93
|
+
// it's not object, but block
|
94
|
+
// just somehow stich together already loaded values
|
95
|
+
// and the rest
|
96
|
+
return fallbackToBlock();
|
97
|
+
}
|
98
|
+
break;
|
99
|
+
case 2 /* S.ExpectValue */: {
|
100
|
+
const value = parseGeneral(context, {
|
101
|
+
end: ['separator.comma', 'block.end'],
|
102
|
+
});
|
103
|
+
if (lastKey) {
|
104
|
+
result.value[lastKey] = value;
|
105
|
+
}
|
106
|
+
else {
|
107
|
+
// unknown key name
|
108
|
+
result.unknown.push(value);
|
109
|
+
}
|
110
|
+
lastKey = undefined;
|
111
|
+
state = 3 /* S.ExpectComma */;
|
112
|
+
// don't load next token, it was loaded by extract
|
113
|
+
continue;
|
114
|
+
}
|
115
|
+
case 3 /* S.ExpectComma */:
|
116
|
+
if (type === 'separator.comma') {
|
117
|
+
state = 0 /* S.ExpectProperty */;
|
118
|
+
}
|
119
|
+
else {
|
120
|
+
// it's not object, but block
|
121
|
+
// just somehow stich together already loaded values
|
122
|
+
// and the rest
|
123
|
+
return fallbackToBlock();
|
124
|
+
}
|
125
|
+
break;
|
126
|
+
}
|
127
|
+
tokens.next();
|
128
|
+
}
|
129
|
+
return result;
|
130
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import { parseGeneral } from './parseGeneral.js';
|
2
|
+
// <T keyName="key1" defaultValue="default value" />
|
3
|
+
// ^^–––––––––––––––––––––––––––––^^^^^^^^^^^^^^^
|
4
|
+
export function extractProps(context) {
|
5
|
+
function getShortHandValue() {
|
6
|
+
return { type: 'primitive', line: getCurrentLine(), value: true };
|
7
|
+
}
|
8
|
+
const { tokens, getCurrentLine } = context;
|
9
|
+
const line = getCurrentLine();
|
10
|
+
tokens.next();
|
11
|
+
const result = { type: 'dict', line, value: {}, unknown: [] };
|
12
|
+
let token;
|
13
|
+
let state = 0 /* S.ExpectAttribute */;
|
14
|
+
let lastKey;
|
15
|
+
while ((token = tokens.current())) {
|
16
|
+
const type = token.customType;
|
17
|
+
if (type === 'tag.self-closing.end' || type === 'tag.regular.end') {
|
18
|
+
break;
|
19
|
+
}
|
20
|
+
switch (state) {
|
21
|
+
case 0 /* S.ExpectAttribute */:
|
22
|
+
if (type === 'tag.attribute.name') {
|
23
|
+
lastKey = token.token;
|
24
|
+
state = 1 /* S.ExpectAssign */;
|
25
|
+
// assign in case it's shorthand
|
26
|
+
result.value[lastKey] = getShortHandValue();
|
27
|
+
}
|
28
|
+
break;
|
29
|
+
case 1 /* S.ExpectAssign */:
|
30
|
+
if (type === 'operator.assignment') {
|
31
|
+
state = 2 /* S.ExpectValue */;
|
32
|
+
}
|
33
|
+
else if (type === 'tag.attribute.name') {
|
34
|
+
// last one was shorthand
|
35
|
+
lastKey = token.token;
|
36
|
+
state = 1 /* S.ExpectAssign */;
|
37
|
+
// assign in case it's shorthand
|
38
|
+
result.value[lastKey] = getShortHandValue();
|
39
|
+
}
|
40
|
+
break;
|
41
|
+
case 2 /* S.ExpectValue */:
|
42
|
+
result.value[lastKey] = parseGeneral(context, {
|
43
|
+
end: [
|
44
|
+
'tag.attribute.name',
|
45
|
+
'tag.self-closing.end',
|
46
|
+
'tag.regular.end',
|
47
|
+
],
|
48
|
+
});
|
49
|
+
state = 0 /* S.ExpectAttribute */;
|
50
|
+
lastKey = undefined;
|
51
|
+
continue;
|
52
|
+
}
|
53
|
+
tokens.next();
|
54
|
+
}
|
55
|
+
return result;
|
56
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { isEmptyExpr, simplifyNode } from '../nodeUtils.js';
|
2
|
+
import { parseGeneral } from './parseGeneral.js';
|
3
|
+
import { extractProps } from './parseProps.js';
|
4
|
+
// <T keyName="test">Default</T>
|
5
|
+
// ^^-----------------------^^^^
|
6
|
+
export const parseTag = (context) => {
|
7
|
+
const { tokens } = context;
|
8
|
+
const props = extractProps(context);
|
9
|
+
let child;
|
10
|
+
const currentTag = tokens.current();
|
11
|
+
if (currentTag?.customType === 'tag.regular.end') {
|
12
|
+
tokens.next();
|
13
|
+
// it's not self-closing and there are children
|
14
|
+
const extracted = parseGeneral(context, {
|
15
|
+
end: ['tag.closing'],
|
16
|
+
// don't simplify here, to see, if there are any children
|
17
|
+
keepNested: true,
|
18
|
+
});
|
19
|
+
if (!isEmptyExpr(extracted)) {
|
20
|
+
// there are some children
|
21
|
+
child = simplifyNode(extracted);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
tokens.next();
|
25
|
+
return { props, child };
|
26
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { pipeMachines } from '../parser/mergerMachine.js';
|
2
|
+
import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
|
3
|
+
import { generalMapper } from '../parser/generalMapper.js';
|
4
|
+
import { reactMapper } from './jsxMapper.js';
|
5
|
+
import { createElementMerger } from './tokenMergers/createElementMerger.js';
|
6
|
+
import { tComponentMerger } from './tokenMergers/tComponentMerger.js';
|
7
|
+
import { tFunctionMerger } from './tokenMergers/tFunctionMerger.js';
|
8
|
+
import { useTranslateMerger } from './tokenMergers/useTranslateMerger.js';
|
9
|
+
import { reactCreateElement } from './rules/createElement.js';
|
10
|
+
import { tComponent } from './rules/tComponent.js';
|
11
|
+
import { tFunction } from './rules/tFunction.js';
|
12
|
+
import { useTranslate } from './rules/useTranslate.js';
|
13
|
+
const reactMappers = [generalMapper, reactMapper];
|
14
|
+
export const reactMergers = pipeMachines([
|
15
|
+
...DEFAULT_MERGERERS,
|
16
|
+
createElementMerger,
|
17
|
+
useTranslateMerger,
|
18
|
+
tFunctionMerger,
|
19
|
+
tComponentMerger,
|
20
|
+
]);
|
21
|
+
export const ParserReact = () => {
|
22
|
+
return Parser({
|
23
|
+
mappers: [generalMapper, reactMapper],
|
24
|
+
blocks: {
|
25
|
+
...DEFAULT_BLOCKS,
|
26
|
+
},
|
27
|
+
rules: [reactCreateElement, tComponent, tFunction, useTranslate],
|
28
|
+
merger: reactMergers,
|
29
|
+
});
|
30
|
+
};
|
@@ -0,0 +1,24 @@
|
|
1
|
+
export const reactMapper = (token) => {
|
2
|
+
switch (token.type) {
|
3
|
+
// JSX string children
|
4
|
+
case 'meta.jsx.children.tsx':
|
5
|
+
return 'string.template';
|
6
|
+
// template strings - treating as expression
|
7
|
+
case 'punctuation.definition.template-expression.begin.ts':
|
8
|
+
case 'punctuation.section.embedded.begin.tsx':
|
9
|
+
return 'expression.template.begin';
|
10
|
+
case 'punctuation.definition.template-expression.end.ts':
|
11
|
+
case 'punctuation.section.embedded.end.tsx':
|
12
|
+
return 'expression.template.end';
|
13
|
+
// react tags
|
14
|
+
case 'punctuation.definition.tag.begin.tsx':
|
15
|
+
return token.token === '</' ? 'tag.closing.begin' : 'tag.regular.begin';
|
16
|
+
case 'punctuation.definition.tag.end.tsx':
|
17
|
+
return token.token === '/>' ? 'tag.self-closing.end' : 'tag.regular.end';
|
18
|
+
case 'support.class.component.tsx':
|
19
|
+
case 'entity.name.tag.tsx':
|
20
|
+
return 'tag.name';
|
21
|
+
case 'entity.other.attribute-name.tsx':
|
22
|
+
return 'tag.attribute.name';
|
23
|
+
}
|
24
|
+
};
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { parseList } from '../../parser/tree/parseList.js';
|
2
|
+
// React.createElement(T, { keyName: 'key1' }, "default value")
|
3
|
+
// ^^^^^^^^^^^^^^^^^^^^^--------------------------------------^
|
4
|
+
export const reactCreateElement = {
|
5
|
+
trigger: 'trigger.react.create.t.element',
|
6
|
+
call(context) {
|
7
|
+
const line = context.getCurrentLine();
|
8
|
+
const args = parseList(context, 'expression.end');
|
9
|
+
if (args.type !== 'array') {
|
10
|
+
// invalid arguments
|
11
|
+
return args;
|
12
|
+
}
|
13
|
+
const result = {
|
14
|
+
type: 'keyInfo',
|
15
|
+
line,
|
16
|
+
dependsOnContext: false,
|
17
|
+
values: [],
|
18
|
+
};
|
19
|
+
const [props, ...children] = args.values;
|
20
|
+
// read props
|
21
|
+
if (props.type === 'dict') {
|
22
|
+
for (const [key, value] of Object.entries(props.value)) {
|
23
|
+
switch (key) {
|
24
|
+
case 'keyName':
|
25
|
+
result.keyName = value;
|
26
|
+
break;
|
27
|
+
case 'defaultValue':
|
28
|
+
result.defaultValue = value;
|
29
|
+
break;
|
30
|
+
case 'ns':
|
31
|
+
result.namespace = value;
|
32
|
+
break;
|
33
|
+
default:
|
34
|
+
// unknown parameter
|
35
|
+
result.values.push(value);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
let child;
|
40
|
+
// if there is multiple children, wrap them in array
|
41
|
+
if (children.length === 1) {
|
42
|
+
child = children[0];
|
43
|
+
}
|
44
|
+
else if (children.length > 1) {
|
45
|
+
child = { type: 'array', line: children[0].line, values: children };
|
46
|
+
}
|
47
|
+
// read children
|
48
|
+
if (child) {
|
49
|
+
if (!result.keyName) {
|
50
|
+
result.keyName = child;
|
51
|
+
}
|
52
|
+
else if (!result.defaultValue) {
|
53
|
+
result.defaultValue = child;
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
// child has no semantic meaning
|
57
|
+
result.values.push(child);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
return result;
|
61
|
+
},
|
62
|
+
};
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { tComponentGeneral } from '../../parser/rules/tComponentGeneral.js';
|
2
|
+
// <T keyName="test">Default</T>
|
3
|
+
// ^^-----------------------^^^^
|
4
|
+
export const tComponent = {
|
5
|
+
trigger: 'trigger.t.component',
|
6
|
+
call(context) {
|
7
|
+
return tComponentGeneral(context);
|
8
|
+
},
|
9
|
+
};
|
@@ -0,0 +1,35 @@
|
|
1
|
+
// React.createElement(T,
|
2
|
+
export const createElementMerger = {
|
3
|
+
initial: 0 /* S.Idle */,
|
4
|
+
step: (state, t, end) => {
|
5
|
+
const type = t.customType;
|
6
|
+
const token = t.token;
|
7
|
+
switch (state) {
|
8
|
+
case 0 /* S.Idle */:
|
9
|
+
if (type === 'variable' && token === 'React') {
|
10
|
+
return 1 /* S.ExpectDot */;
|
11
|
+
}
|
12
|
+
break;
|
13
|
+
case 1 /* S.ExpectDot */:
|
14
|
+
if (type === 'acessor.dot') {
|
15
|
+
return 2 /* S.ExpectCall */;
|
16
|
+
}
|
17
|
+
break;
|
18
|
+
case 2 /* S.ExpectCall */:
|
19
|
+
if (type === 'function.call') {
|
20
|
+
return 3 /* S.ExpectBracket */;
|
21
|
+
}
|
22
|
+
break;
|
23
|
+
case 3 /* S.ExpectBracket */:
|
24
|
+
if (type === 'expression.begin') {
|
25
|
+
return 4 /* S.ExpectT */;
|
26
|
+
}
|
27
|
+
break;
|
28
|
+
case 4 /* S.ExpectT */:
|
29
|
+
if (type === 'variable' && token === 'T') {
|
30
|
+
return end.MERGE_ALL;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
},
|
34
|
+
customType: 'trigger.react.create.t.element',
|
35
|
+
};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// <T
|
2
|
+
export const tComponentMerger = {
|
3
|
+
initial: 0 /* S.Idle */,
|
4
|
+
step: (state, t, end) => {
|
5
|
+
const type = t.customType;
|
6
|
+
const token = t.token;
|
7
|
+
switch (state) {
|
8
|
+
case 0 /* S.Idle */:
|
9
|
+
if (type === 'tag.regular.begin') {
|
10
|
+
return 1 /* S.ExpectT */;
|
11
|
+
}
|
12
|
+
break;
|
13
|
+
case 1 /* S.ExpectT */:
|
14
|
+
if (type === 'tag.name' && token === 'T') {
|
15
|
+
return end.MERGE_ALL;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
},
|
19
|
+
customType: 'trigger.t.component',
|
20
|
+
};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
// t(
|
2
|
+
export const tFunctionMerger = {
|
3
|
+
initial: 0 /* S.Idle */,
|
4
|
+
step: (state, t, end) => {
|
5
|
+
const type = t.customType;
|
6
|
+
const token = t.token;
|
7
|
+
switch (state) {
|
8
|
+
case 0 /* S.Idle */:
|
9
|
+
if (type === 'function.call' && token === 't') {
|
10
|
+
return 1 /* S.ExpectBracket */;
|
11
|
+
}
|
12
|
+
else if (type === 'acessor.dot') {
|
13
|
+
return 2 /* S.Ignore */;
|
14
|
+
}
|
15
|
+
break;
|
16
|
+
case 1 /* S.ExpectBracket */:
|
17
|
+
if (type === 'expression.begin') {
|
18
|
+
return end.MERGE_ALL;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
},
|
22
|
+
customType: 'trigger.t.function',
|
23
|
+
};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// useTranslate(
|
2
|
+
export const useTranslateMerger = {
|
3
|
+
initial: 0 /* S.Idle */,
|
4
|
+
step: (state, t, end) => {
|
5
|
+
const type = t.customType;
|
6
|
+
const token = t.token;
|
7
|
+
switch (state) {
|
8
|
+
case 0 /* S.Idle */:
|
9
|
+
if (type === 'function.call' && token === 'useTranslate') {
|
10
|
+
return 1 /* S.ExpectBracket */;
|
11
|
+
}
|
12
|
+
break;
|
13
|
+
case 1 /* S.ExpectBracket */:
|
14
|
+
if (type === 'expression.begin') {
|
15
|
+
return end.MERGE_ALL;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
},
|
19
|
+
customType: 'trigger.use.translate',
|
20
|
+
};
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { pipeMachines } from '../parser/mergerMachine.js';
|
2
|
+
import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
|
3
|
+
import { svelteMapper } from './svelteMapper.js';
|
4
|
+
import { generalMapper } from '../parser/generalMapper.js';
|
5
|
+
import { tFunctionMerger } from './tokenMergers/tFunctionMerger.js';
|
6
|
+
import { getTranslateMerger } from './tokenMergers/getTranslateMerger.js';
|
7
|
+
import { scriptTagMerger } from './tokenMergers/scriptTagMerger.js';
|
8
|
+
import { tComponentMerger } from './tokenMergers/tComponentMerger.js';
|
9
|
+
import { tFunction } from './rules/tFunction.js';
|
10
|
+
import { getTranslate } from './rules/useTranslate.js';
|
11
|
+
import { tComponent } from './rules/tComponent.js';
|
12
|
+
import { scriptTag } from './rules/scriptTag.js';
|
13
|
+
import { svelteTreeTransform } from './svelteTreeTransform.js';
|
14
|
+
const svelteMappers = [generalMapper, svelteMapper];
|
15
|
+
export const svelteMergers = pipeMachines([
|
16
|
+
...DEFAULT_MERGERERS,
|
17
|
+
tFunctionMerger,
|
18
|
+
getTranslateMerger,
|
19
|
+
tComponentMerger,
|
20
|
+
scriptTagMerger,
|
21
|
+
]);
|
22
|
+
export const ParserSvelte = () => {
|
23
|
+
return Parser({
|
24
|
+
mappers: svelteMappers,
|
25
|
+
blocks: {
|
26
|
+
...DEFAULT_BLOCKS,
|
27
|
+
},
|
28
|
+
rules: [tFunction, getTranslate, tComponent, scriptTag],
|
29
|
+
treeTransform: svelteTreeTransform,
|
30
|
+
merger: svelteMergers,
|
31
|
+
});
|
32
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export const SVELTE_SCRIPT = 'script';
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { parseTag } from '../../parser/tree/parseTag.js';
|
2
|
+
import { SVELTE_SCRIPT } from '../contextConstants.js';
|
3
|
+
// <script ...>....</script>
|
4
|
+
// ^^^^^^^-----------^^^^^^^^^
|
5
|
+
export const scriptTag = {
|
6
|
+
trigger: 'trigger.script.tag',
|
7
|
+
call(context) {
|
8
|
+
const line = context.getCurrentLine();
|
9
|
+
const { props, child } = parseTag(context);
|
10
|
+
const result = {
|
11
|
+
type: 'expr',
|
12
|
+
line,
|
13
|
+
values: [props],
|
14
|
+
};
|
15
|
+
if (child) {
|
16
|
+
if (child.type === 'expr') {
|
17
|
+
result.values.push(...child.values);
|
18
|
+
}
|
19
|
+
else {
|
20
|
+
result.values.push(child);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
result.context = SVELTE_SCRIPT;
|
24
|
+
return result;
|
25
|
+
},
|
26
|
+
};
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { tComponentGeneral } from '../../parser/rules/tComponentGeneral.js';
|
2
|
+
// <T keyName="test">Default</T>
|
3
|
+
// ^^-----------------------^^^^
|
4
|
+
export const tComponent = {
|
5
|
+
trigger: 'trigger.t.component',
|
6
|
+
call(context) {
|
7
|
+
return tComponentGeneral(context);
|
8
|
+
},
|
9
|
+
};
|