@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.
Files changed (91) hide show
  1. package/dist/cli.js +15 -23
  2. package/dist/commands/extract/check.js +2 -6
  3. package/dist/commands/extract/print.js +2 -6
  4. package/dist/commands/pull.js +2 -4
  5. package/dist/commands/sync/compare.js +2 -6
  6. package/dist/commands/sync/sync.js +1 -5
  7. package/dist/commands/tag.js +1 -5
  8. package/dist/config/tolgeerc.js +4 -6
  9. package/dist/extractor/extractor.js +40 -66
  10. package/dist/extractor/parser/extractComment.js +78 -0
  11. package/dist/extractor/parser/generalMapper.js +82 -0
  12. package/dist/extractor/parser/generateReport.js +161 -0
  13. package/dist/extractor/parser/iterator.js +37 -0
  14. package/dist/extractor/parser/mergerMachine.js +66 -0
  15. package/dist/extractor/parser/nodeUtils.js +21 -0
  16. package/dist/extractor/parser/parser.js +129 -0
  17. package/dist/extractor/parser/rules/tComponentGeneral.js +45 -0
  18. package/dist/extractor/parser/rules/tFunctionGeneral.js +41 -0
  19. package/dist/extractor/parser/rules/tNsSourceGeneral.js +36 -0
  20. package/dist/extractor/parser/tokenMergers/closingTagMerger.js +27 -0
  21. package/dist/extractor/parser/tokenMergers/commentsMerger.js +36 -0
  22. package/dist/extractor/parser/tokenMergers/stringMerger.js +50 -0
  23. package/dist/extractor/parser/tokenMergers/templateStringMerger.js +55 -0
  24. package/dist/extractor/parser/tokenMergers/typesAsMergerer.js +40 -0
  25. package/dist/extractor/parser/tokenMergers/typesCastMerger.js +28 -0
  26. package/dist/extractor/parser/tree/getTranslateProps.js +54 -0
  27. package/dist/extractor/parser/tree/getValue.js +17 -0
  28. package/dist/extractor/parser/tree/parseGeneral.js +51 -0
  29. package/dist/extractor/parser/tree/parseList.js +33 -0
  30. package/dist/extractor/parser/tree/parseObject.js +130 -0
  31. package/dist/extractor/parser/tree/parseProps.js +56 -0
  32. package/dist/extractor/parser/tree/parseTag.js +26 -0
  33. package/dist/extractor/parser/types.js +1 -0
  34. package/dist/extractor/parserReact/ParserReact.js +30 -0
  35. package/dist/extractor/parserReact/jsxMapper.js +24 -0
  36. package/dist/extractor/parserReact/rules/createElement.js +62 -0
  37. package/dist/extractor/parserReact/rules/tComponent.js +9 -0
  38. package/dist/extractor/parserReact/rules/tFunction.js +7 -0
  39. package/dist/extractor/parserReact/rules/useTranslate.js +7 -0
  40. package/dist/extractor/parserReact/tokenMergers/createElementMerger.js +35 -0
  41. package/dist/extractor/parserReact/tokenMergers/tComponentMerger.js +20 -0
  42. package/dist/extractor/parserReact/tokenMergers/tFunctionMerger.js +23 -0
  43. package/dist/extractor/parserReact/tokenMergers/useTranslateMerger.js +20 -0
  44. package/dist/extractor/parserSvelte/ParserSvelte.js +32 -0
  45. package/dist/extractor/parserSvelte/contextConstants.js +1 -0
  46. package/dist/extractor/parserSvelte/rules/scriptTag.js +26 -0
  47. package/dist/extractor/parserSvelte/rules/tComponent.js +9 -0
  48. package/dist/extractor/parserSvelte/rules/tFunction.js +7 -0
  49. package/dist/extractor/parserSvelte/rules/useTranslate.js +7 -0
  50. package/dist/extractor/parserSvelte/svelteMapper.js +39 -0
  51. package/dist/extractor/parserSvelte/svelteTreeTransform.js +38 -0
  52. package/dist/extractor/parserSvelte/tokenMergers/getTranslateMerger.js +20 -0
  53. package/dist/extractor/parserSvelte/tokenMergers/scriptTagMerger.js +20 -0
  54. package/dist/extractor/parserSvelte/tokenMergers/tComponentMerger.js +20 -0
  55. package/dist/extractor/parserSvelte/tokenMergers/tFunctionMerger.js +29 -0
  56. package/dist/extractor/parserVue/ParserVue.js +45 -0
  57. package/dist/extractor/parserVue/contextConstants.js +3 -0
  58. package/dist/extractor/parserVue/rules/exportDefaultObject.js +14 -0
  59. package/dist/extractor/parserVue/rules/globalTFunction.js +7 -0
  60. package/dist/extractor/parserVue/rules/scriptTag.js +31 -0
  61. package/dist/extractor/parserVue/rules/tComponent.js +9 -0
  62. package/dist/extractor/parserVue/rules/tFunction.js +7 -0
  63. package/dist/extractor/parserVue/rules/useTranslate.js +7 -0
  64. package/dist/extractor/parserVue/tokenMergers/exportDefaultObjectMerger.js +25 -0
  65. package/dist/extractor/parserVue/tokenMergers/globalTFunctionMerger.js +36 -0
  66. package/dist/extractor/parserVue/tokenMergers/scriptTagMerger.js +20 -0
  67. package/dist/extractor/parserVue/tokenMergers/tComponentMerger.js +20 -0
  68. package/dist/extractor/parserVue/tokenMergers/tFunctionMerger.js +37 -0
  69. package/dist/extractor/parserVue/tokenMergers/useTranslateMerger.js +20 -0
  70. package/dist/extractor/parserVue/vueMapper.js +51 -0
  71. package/dist/extractor/parserVue/vueTreeTransform.js +109 -0
  72. package/dist/extractor/runner.js +52 -4
  73. package/dist/extractor/visualizers/printTokens.js +7 -0
  74. package/dist/extractor/visualizers/tokensToString.js +28 -0
  75. package/dist/extractor/visualizers/visualizeRules.js +40 -0
  76. package/dist/extractor/warnings.js +4 -0
  77. package/dist/extractor/worker.js +10 -7
  78. package/dist/options.js +5 -0
  79. package/extractor.d.ts +8 -1
  80. package/package.json +2 -4
  81. package/schema.json +18 -6
  82. package/dist/client/internal/requester.js +0 -130
  83. package/dist/extractor/machines/comments.js +0 -78
  84. package/dist/extractor/machines/react.js +0 -705
  85. package/dist/extractor/machines/shared/comments.js +0 -79
  86. package/dist/extractor/machines/shared/properties.js +0 -380
  87. package/dist/extractor/machines/shared/translateCall.js +0 -141
  88. package/dist/extractor/machines/svelte.js +0 -429
  89. package/dist/extractor/machines/vue/decoder.js +0 -194
  90. package/dist/extractor/machines/vue/extract.js +0 -491
  91. 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,7 @@
1
+ import { tFunctionGeneral } from '../../parser/rules/tFunctionGeneral.js';
2
+ export const tFunction = {
3
+ trigger: 'trigger.t.function',
4
+ call(context) {
5
+ return tFunctionGeneral(context, true);
6
+ },
7
+ };
@@ -0,0 +1,7 @@
1
+ import { tNsSourceGeneral } from '../../parser/rules/tNsSourceGeneral.js';
2
+ export const useTranslate = {
3
+ trigger: 'trigger.use.translate',
4
+ call(context) {
5
+ return tNsSourceGeneral(context);
6
+ },
7
+ };
@@ -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
+ };
@@ -0,0 +1,7 @@
1
+ import { tFunctionGeneral } from '../../parser/rules/tFunctionGeneral.js';
2
+ export const tFunction = {
3
+ trigger: 'trigger.t.function',
4
+ call(context) {
5
+ return tFunctionGeneral(context, true);
6
+ },
7
+ };
@@ -0,0 +1,7 @@
1
+ import { tNsSourceGeneral } from '../../parser/rules/tNsSourceGeneral.js';
2
+ export const getTranslate = {
3
+ trigger: 'trigger.get.translate',
4
+ call(context) {
5
+ return tNsSourceGeneral(context);
6
+ },
7
+ };