@tolgee/cli 2.10.2 → 2.12.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.
@@ -8,13 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { cosmiconfig, defaultLoaders } from 'cosmiconfig';
11
- import { Validator } from 'jsonschema';
12
11
  import { readFile } from 'fs/promises';
13
12
  import { fileURLToPath } from 'url';
14
13
  import { dirname, join, resolve } from 'path';
15
14
  import { error, exitWithError } from '../utils/logger.js';
16
15
  import { existsSync } from 'fs';
17
16
  import { valueToArray } from '../utils/valueToArray.js';
17
+ import { Ajv } from 'ajv';
18
18
  const explorer = cosmiconfig('tolgee', {
19
19
  loaders: {
20
20
  noExt: defaultLoaders['.json'],
@@ -34,7 +34,7 @@ function parseConfig(input, configDir) {
34
34
  if (rc.projectId !== undefined) {
35
35
  rc.projectId = Number(rc.projectId); // Number("") returns 0
36
36
  if (!Number.isInteger(rc.projectId) || rc.projectId <= 0) {
37
- throw new Error('Invalid config: projectId should be an integer representing your project Id');
37
+ throw new Error("Invalid config: 'projectId' should be an integer representing your project Id");
38
38
  }
39
39
  }
40
40
  // convert relative paths in config to absolute
@@ -70,6 +70,7 @@ function getSchema() {
70
70
  }
71
71
  export default function loadTolgeeRc(path) {
72
72
  return __awaiter(this, void 0, void 0, function* () {
73
+ var _a;
73
74
  let res;
74
75
  if (path) {
75
76
  try {
@@ -86,12 +87,12 @@ export default function loadTolgeeRc(path) {
86
87
  if (!res || res.isEmpty)
87
88
  return null;
88
89
  const config = parseConfig(res.config, dirname(path || '.'));
89
- const validator = new Validator();
90
- const schema = yield getSchema();
91
- const result = validator.validate(config, schema);
92
- if (result.errors.length) {
93
- const { message, property } = result.errors[0];
94
- const errMessage = `Tolgee config: '${property.replace('instance.', '')}' ${message}`;
90
+ const ajv = new Ajv({ allowUnionTypes: true });
91
+ const validate = ajv.compile(yield getSchema());
92
+ validate(config);
93
+ const firstErr = (_a = validate.errors) === null || _a === void 0 ? void 0 : _a[0];
94
+ if (firstErr) {
95
+ const errMessage = `Tolgee config: '${firstErr.instancePath.replaceAll('/', '.').replace(/^\./, '')}' ${firstErr.message}`;
95
96
  exitWithError(errMessage);
96
97
  }
97
98
  return config;
@@ -7,8 +7,9 @@ import { createMachine } from './mergerMachine.js';
7
7
  import { stringMerger } from './tokenMergers/stringMerger.js';
8
8
  import { templateStringMerger } from './tokenMergers/templateStringMerger.js';
9
9
  import { closingTagMerger } from './tokenMergers/closingTagMerger.js';
10
- import { typesAsMergerer } from './tokenMergers/typesAsMergerer.js';
11
- import { typesCastMergerer } from './tokenMergers/typesCastMerger.js';
10
+ import { typesAsMerger } from './tokenMergers/typesAsMerger.js';
11
+ import { typesCastMerger } from './tokenMergers/typesCastMerger.js';
12
+ import { customTCallMerger } from './tokenMergers/customTCallMerger.js';
12
13
  export const DEFAULT_BLOCKS = {
13
14
  'block.begin': ['block.end'],
14
15
  'expression.begin': ['expression.end'],
@@ -19,12 +20,13 @@ export const DEFAULT_BLOCKS = {
19
20
  'tag.closing.begin',
20
21
  ],
21
22
  };
22
- export const DEFAULT_MERGERERS = [
23
+ export const DEFAULT_MERGERS = [
23
24
  stringMerger,
24
25
  templateStringMerger,
25
26
  closingTagMerger,
26
- typesAsMergerer,
27
- typesCastMergerer,
27
+ typesAsMerger,
28
+ typesCastMerger,
29
+ customTCallMerger(['tolgee.t']),
28
30
  ];
29
31
  export const Parser = ({ mappers, blocks, rules, merger, treeTransform, }) => {
30
32
  const ruleMap = new Map();
@@ -1,4 +1,4 @@
1
- import { tFunctionGeneral } from '../../parser/rules/tFunctionGeneral.js';
1
+ import { tFunctionGeneral } from './tFunctionGeneral.js';
2
2
  export const globalTFunction = {
3
3
  trigger: 'trigger.global.t.function',
4
4
  call(context) {
@@ -0,0 +1,23 @@
1
+ export const customTCallMerger = (customExpressions) => {
2
+ return {
3
+ initial: '',
4
+ step: (state, t, end) => {
5
+ const type = t.customType;
6
+ const token = t.token;
7
+ if (type === 'variable' || type === 'function.call') {
8
+ if (customExpressions.find((e) => e.startsWith(state + token))) {
9
+ return state + token;
10
+ }
11
+ }
12
+ else if (type === 'acessor.dot') {
13
+ return state + '.';
14
+ }
15
+ else if (state !== '' && type === 'expression.begin') {
16
+ if (customExpressions.includes(state)) {
17
+ return end.MERGE_ALL;
18
+ }
19
+ }
20
+ },
21
+ customType: 'trigger.global.t.function',
22
+ };
23
+ };
@@ -1,6 +1,6 @@
1
1
  const INITIAL_DEPTH = -1;
2
2
  // in ts files we want to ignore stuff after 'as' `[count as number]`
3
- export const typesAsMergerer = {
3
+ export const typesAsMerger = {
4
4
  initial: INITIAL_DEPTH,
5
5
  step: (depth, token, end) => {
6
6
  const type = token.customType;
@@ -1,6 +1,6 @@
1
1
  const INITIAL_DEPTH = 0;
2
2
  // in ts files we want to ignore type casting (<number> count)
3
- export const typesCastMergerer = {
3
+ export const typesCastMerger = {
4
4
  initial: INITIAL_DEPTH,
5
5
  step: (depth, token, end) => {
6
6
  const type = token.customType;
@@ -1,5 +1,5 @@
1
1
  import { pipeMachines } from '../parser/mergerMachine.js';
2
- import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
2
+ import { DEFAULT_BLOCKS, DEFAULT_MERGERS, Parser } from '../parser/parser.js';
3
3
  import { generalMapper } from '../parser/generalMapper.js';
4
4
  import { ngxMapper } from './ngxMapper.js';
5
5
  import { ngxTreeTransform } from './ngxTreeTransform.js';
@@ -9,9 +9,10 @@ import { pipeMerger } from './tokenMergers/pipeMerger.js';
9
9
  import { componentWithT } from './rules/componentWithT.js';
10
10
  import { translatePipe } from './rules/translatePipe.js';
11
11
  import { translateFunction } from './rules/translateFunction.js';
12
+ import { globalTFunction } from '../parser/rules/globalTFunction.js';
12
13
  const ngxMappers = [ngxMapper, generalMapper];
13
14
  export const ngxMergers = pipeMachines([
14
- ...DEFAULT_MERGERERS,
15
+ ...DEFAULT_MERGERS,
15
16
  componentWithTMerger,
16
17
  pipeMerger,
17
18
  translateMerger,
@@ -20,7 +21,7 @@ export const ParserNgx = () => {
20
21
  return Parser({
21
22
  mappers: ngxMappers,
22
23
  blocks: Object.assign({}, DEFAULT_BLOCKS),
23
- rules: [componentWithT, translatePipe, translateFunction],
24
+ rules: [globalTFunction, componentWithT, translatePipe, translateFunction],
24
25
  merger: ngxMergers,
25
26
  treeTransform: ngxTreeTransform,
26
27
  });
@@ -1,5 +1,5 @@
1
1
  import { pipeMachines } from '../parser/mergerMachine.js';
2
- import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
2
+ import { DEFAULT_BLOCKS, DEFAULT_MERGERS, Parser } from '../parser/parser.js';
3
3
  import { generalMapper } from '../parser/generalMapper.js';
4
4
  import { reactMapper } from './jsxMapper.js';
5
5
  import { createElementMerger } from './tokenMergers/createElementMerger.js';
@@ -10,9 +10,10 @@ import { reactCreateElement } from './rules/createElement.js';
10
10
  import { tComponent } from './rules/tComponent.js';
11
11
  import { tFunction } from './rules/tFunction.js';
12
12
  import { useTranslate } from './rules/useTranslate.js';
13
+ import { globalTFunction } from '../parser/rules/globalTFunction.js';
13
14
  const reactMappers = [generalMapper, reactMapper];
14
15
  export const reactMergers = pipeMachines([
15
- ...DEFAULT_MERGERERS,
16
+ ...DEFAULT_MERGERS,
16
17
  createElementMerger,
17
18
  useTranslateMerger,
18
19
  tFunctionMerger,
@@ -22,7 +23,13 @@ export const ParserReact = () => {
22
23
  return Parser({
23
24
  mappers: reactMappers,
24
25
  blocks: Object.assign({}, DEFAULT_BLOCKS),
25
- rules: [reactCreateElement, tComponent, tFunction, useTranslate],
26
+ rules: [
27
+ globalTFunction,
28
+ reactCreateElement,
29
+ tComponent,
30
+ tFunction,
31
+ useTranslate,
32
+ ],
26
33
  merger: reactMergers,
27
34
  });
28
35
  };
@@ -1,5 +1,5 @@
1
1
  import { pipeMachines } from '../parser/mergerMachine.js';
2
- import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
2
+ import { DEFAULT_BLOCKS, DEFAULT_MERGERS, Parser } from '../parser/parser.js';
3
3
  import { svelteMapper } from './svelteMapper.js';
4
4
  import { generalMapper } from '../parser/generalMapper.js';
5
5
  import { tFunctionMerger } from './tokenMergers/tFunctionMerger.js';
@@ -11,9 +11,10 @@ import { getTranslate } from './rules/useTranslate.js';
11
11
  import { tComponent } from './rules/tComponent.js';
12
12
  import { scriptTag } from './rules/scriptTag.js';
13
13
  import { svelteTreeTransform } from './svelteTreeTransform.js';
14
+ import { globalTFunction } from '../parser/rules/globalTFunction.js';
14
15
  const svelteMappers = [generalMapper, svelteMapper];
15
16
  export const svelteMergers = pipeMachines([
16
- ...DEFAULT_MERGERERS,
17
+ ...DEFAULT_MERGERS,
17
18
  tFunctionMerger,
18
19
  getTranslateMerger,
19
20
  tComponentMerger,
@@ -23,7 +24,7 @@ export const ParserSvelte = () => {
23
24
  return Parser({
24
25
  mappers: svelteMappers,
25
26
  blocks: Object.assign({}, DEFAULT_BLOCKS),
26
- rules: [tFunction, getTranslate, tComponent, scriptTag],
27
+ rules: [globalTFunction, tFunction, getTranslate, tComponent, scriptTag],
27
28
  treeTransform: svelteTreeTransform,
28
29
  merger: svelteMergers,
29
30
  });
@@ -1,26 +1,26 @@
1
1
  import { pipeMachines } from '../parser/mergerMachine.js';
2
- import { DEFAULT_BLOCKS, DEFAULT_MERGERERS, Parser } from '../parser/parser.js';
2
+ import { DEFAULT_BLOCKS, DEFAULT_MERGERS, Parser } from '../parser/parser.js';
3
3
  import { generalMapper } from '../parser/generalMapper.js';
4
4
  import { vueMapper } from './vueMapper.js';
5
5
  import { vueTreeTransform } from './vueTreeTransform.js';
6
- import { globalTFunctionMerger } from './tokenMergers/globalTFunctionMerger.js';
7
6
  import { tFunctionMerger } from './tokenMergers/tFunctionMerger.js';
8
7
  import { useTranslateMerger } from './tokenMergers/useTranslateMerger.js';
9
8
  import { exportDefaultObjectMerger } from './tokenMergers/exportDefaultObjectMerger.js';
10
9
  import { scriptTagMerger } from './tokenMergers/scriptTagMerger.js';
11
10
  import { tComponentMerger } from './tokenMergers/tComponentMerger.js';
12
- import { globalTFunction } from './rules/globalTFunction.js';
11
+ import { globalTFunction } from '../parser/rules/globalTFunction.js';
13
12
  import { tFunction } from './rules/tFunction.js';
14
13
  import { useTranslate } from './rules/useTranslate.js';
15
14
  import { tComponent } from './rules/tComponent.js';
16
15
  import { scriptTag } from './rules/scriptTag.js';
17
16
  import { exportDefaultObject } from './rules/exportDefaultObject.js';
18
17
  import { hyphenPropsMerger } from './tokenMergers/hyphenPropsMerger.js';
18
+ import { customTCallMerger } from '../parser/tokenMergers/customTCallMerger.js';
19
19
  const vueMappers = [generalMapper, vueMapper];
20
20
  export const vueMergers = pipeMachines([
21
- ...DEFAULT_MERGERERS,
21
+ ...DEFAULT_MERGERS,
22
22
  hyphenPropsMerger,
23
- globalTFunctionMerger,
23
+ customTCallMerger(['$t', 'this.$t']),
24
24
  tFunctionMerger,
25
25
  useTranslateMerger,
26
26
  tComponentMerger,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tolgee/cli",
3
- "version": "2.10.2",
3
+ "version": "2.12.0",
4
4
  "type": "module",
5
5
  "description": "A tool to interact with the Tolgee Platform through CLI",
6
6
  "repository": {
@@ -30,12 +30,13 @@
30
30
  "author": "Jan Cizmar",
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
+ "ajv": "^8.17.1",
33
34
  "ansi-colors": "^4.1.3",
34
35
  "base32-decode": "^1.0.0",
35
36
  "commander": "^12.1.0",
36
37
  "cosmiconfig": "^9.0.0",
37
38
  "json5": "^2.2.3",
38
- "jsonschema": "^1.4.1",
39
+ "jsonschema": "^1.5.0",
39
40
  "openapi-fetch": "0.13.1",
40
41
  "tinyglobby": "^0.2.12",
41
42
  "unescape-js": "^1.1.4",
@@ -1,36 +0,0 @@
1
- // $t(
2
- export const globalTFunctionMerger = {
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 === 'variable' && token === 'this') {
13
- return 2 /* S.ExpectDot */;
14
- }
15
- else if (type === 'acessor.dot') {
16
- return 4 /* S.Ignore */;
17
- }
18
- break;
19
- case 2 /* S.ExpectDot */:
20
- if (type === 'acessor.dot') {
21
- return 3 /* S.ExpectCall */;
22
- }
23
- break;
24
- case 3 /* S.ExpectCall */:
25
- if (type === 'function.call' && token === '$t') {
26
- return 1 /* S.ExpectBracket */;
27
- }
28
- break;
29
- case 1 /* S.ExpectBracket */:
30
- if (type === 'expression.begin') {
31
- return end.MERGE_ALL;
32
- }
33
- }
34
- },
35
- customType: 'trigger.global.t.function',
36
- };