@dittowords/cli 3.5.0 → 3.6.1
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/README.md +13 -11
- package/bin/ditto.js +5 -0
- package/bin/ditto.js.map +1 -1
- package/bin/generate-suggestions.js +50 -40
- package/bin/generate-suggestions.js.map +1 -1
- package/bin/pull.js +4 -1
- package/bin/pull.js.map +1 -1
- package/lib/ditto.ts +5 -0
- package/lib/generate-suggestions.test.ts +109 -18
- package/lib/generate-suggestions.ts +76 -58
- package/lib/pull.test.ts +24 -4
- package/lib/pull.ts +5 -9
- package/lib/replace.test.ts +1 -0
- package/lib/types.ts +9 -1
- package/package.json +1 -1
- package/testfiles/test1.jsx +5 -5
package/README.md
CHANGED
|
@@ -66,11 +66,11 @@ We don't recommend editing the authentication file by hand; if you need to remov
|
|
|
66
66
|
|
|
67
67
|
**Action:** Pulls data from Ditto according to configured sources.
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Generate files your local `ditto/` folder (file extension is determined by the `format` property specified in `config.yml`).
|
|
70
70
|
|
|
71
|
-
If no format is specified, the `flat` format will be used by default. Each time text is pulled from Ditto, the existing
|
|
71
|
+
If no format is specified, the `flat` format will be used by default. Each time text is pulled from Ditto, the existing files in the `ditto/` directory are removed before new files are created in their place.
|
|
72
72
|
|
|
73
|
-
For more details on files generated by this command, see [
|
|
73
|
+
For more details on files generated by this command, see [Output Files](#output-files).
|
|
74
74
|
|
|
75
75
|
### Add project
|
|
76
76
|
|
|
@@ -160,9 +160,10 @@ variants: true
|
|
|
160
160
|
The format that text data should be generated in. Accepted values:
|
|
161
161
|
|
|
162
162
|
- `structured`
|
|
163
|
-
|
|
163
|
+
\*\*\*\*- `flat`
|
|
164
164
|
- `android`
|
|
165
165
|
- `ios-strings`
|
|
166
|
+
- `ios-stringsdict` (will only include text that has pluralization enabled in Ditto)
|
|
166
167
|
|
|
167
168
|
Defaults to `flat` if not specified.
|
|
168
169
|
|
|
@@ -227,13 +228,14 @@ If you run the CLI in a directory that does not contain a `ditto/` folder, the f
|
|
|
227
228
|
|
|
228
229
|
The CLI outputs data from Ditto by writing files to disk in your `ditto/` directory. The format and extension of such files will correspond to the `format` property of your configuration.
|
|
229
230
|
|
|
230
|
-
|
|
|
231
|
-
|
|
|
232
|
-
|
|
|
233
|
-
|
|
|
234
|
-
|
|
|
235
|
-
|
|
|
236
|
-
|
|
|
231
|
+
| **Format** | **File Extension** | **Common Usage** |
|
|
232
|
+
| :-------------: | :----------------: | :-----------------: |
|
|
233
|
+
| flat | .json | Web apps |
|
|
234
|
+
| structured | .json | Web apps |
|
|
235
|
+
| icu | .json | Web apps |
|
|
236
|
+
| android | .xml | Native Android apps |
|
|
237
|
+
| ios-strings | .strings | Native iOS apps |
|
|
238
|
+
| ios-stringsdict | .stringsdict | Native iOS apps |
|
|
237
239
|
|
|
238
240
|
All files created will adhere to the following template:
|
|
239
241
|
|
package/bin/ditto.js
CHANGED
|
@@ -52,6 +52,10 @@ const COMMANDS = [
|
|
|
52
52
|
"-d, --directory [value]": {
|
|
53
53
|
description: "Directory to search for text",
|
|
54
54
|
},
|
|
55
|
+
"-f, --files [value]": {
|
|
56
|
+
description: "Files to search for text (will override -d)",
|
|
57
|
+
processor: (value) => value.split(","),
|
|
58
|
+
},
|
|
55
59
|
},
|
|
56
60
|
},
|
|
57
61
|
{
|
|
@@ -135,6 +139,7 @@ const executeCommand = async (command, options) => {
|
|
|
135
139
|
case "generate-suggestions": {
|
|
136
140
|
return (0, generate_suggestions_1.generateSuggestions)({
|
|
137
141
|
...(options.directory ? { directory: options.directory } : {}),
|
|
142
|
+
...(options.files ? { files: options.files } : {}),
|
|
138
143
|
});
|
|
139
144
|
}
|
|
140
145
|
case "replace": {
|
package/bin/ditto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ditto.js","sourceRoot":"","sources":["../lib/ditto.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ditto.js","sourceRoot":"","sources":["../lib/ditto.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateSuggestions = exports.
|
|
6
|
+
exports.generateSuggestions = exports.findComponentsInJSXFiles = void 0;
|
|
7
7
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
8
|
const glob_1 = __importDefault(require("glob"));
|
|
9
9
|
const parser_1 = require("@babel/parser");
|
|
@@ -11,69 +11,79 @@ const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
|
11
11
|
const fetchComponents_1 = require("./http/fetchComponents");
|
|
12
12
|
async function generateSuggestions(flags) {
|
|
13
13
|
const components = await (0, fetchComponents_1.fetchComponents)();
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const result = await findTextInJSXFiles(directory, component);
|
|
21
|
-
results[compApiId].occurrences = result;
|
|
22
|
-
// Remove if there the length is zero
|
|
23
|
-
if (Object.keys(results[compApiId].occurrences).length === 0) {
|
|
24
|
-
delete results[compApiId];
|
|
25
|
-
}
|
|
26
|
-
}
|
|
14
|
+
const directory = flags.directory || ".";
|
|
15
|
+
const results = await findComponentsInJSXFiles({
|
|
16
|
+
directory,
|
|
17
|
+
files: flags.files,
|
|
18
|
+
components,
|
|
19
|
+
});
|
|
27
20
|
// Display results to user
|
|
28
21
|
console.log(JSON.stringify(results, null, 2));
|
|
29
22
|
}
|
|
30
23
|
exports.generateSuggestions = generateSuggestions;
|
|
31
|
-
async function
|
|
24
|
+
async function findComponentsInJSXFiles(params) {
|
|
32
25
|
const result = {};
|
|
33
|
-
const files =
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
const files = params.files ||
|
|
27
|
+
glob_1.default.sync(`${params.directory}/**/*.+(jsx|tsx)`, {
|
|
28
|
+
ignore: "**/node_modules/**",
|
|
29
|
+
});
|
|
36
30
|
const promises = [];
|
|
37
31
|
for (const file of files) {
|
|
38
|
-
result[file] = [];
|
|
39
32
|
promises.push(fs_extra_1.default.readFile(file, "utf-8").then((code) => {
|
|
40
33
|
const ast = (0, parser_1.parse)(code, {
|
|
41
34
|
sourceType: "module",
|
|
42
35
|
plugins: ["jsx", "typescript"],
|
|
43
36
|
});
|
|
44
|
-
const occurrences = [];
|
|
45
37
|
(0, traverse_1.default)(ast, {
|
|
46
38
|
JSXText(path) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
39
|
+
for (const [compApiId, component] of Object.entries(params.components)) {
|
|
40
|
+
// If we haven't seen this component before, add it to the result
|
|
41
|
+
if (!result[compApiId]) {
|
|
42
|
+
result[compApiId] = {
|
|
43
|
+
apiId: compApiId,
|
|
44
|
+
...component,
|
|
45
|
+
occurrences: {},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (path.node.value.includes(component.text)) {
|
|
49
|
+
// Escape all special characters from the text so we can use it in a regex
|
|
50
|
+
const escapedText = component.text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
51
|
+
const regex = new RegExp(escapedText, "g");
|
|
52
|
+
let match;
|
|
53
|
+
while ((match = regex.exec(path.node.value)) !== null) {
|
|
54
|
+
const lines = path.node.value
|
|
55
|
+
.slice(0, match.index)
|
|
56
|
+
.split("\n");
|
|
57
|
+
if (!path.node.loc) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const lineNumber = path.node.loc.start.line + lines.length - 1;
|
|
61
|
+
const codeLines = code.split("\n");
|
|
62
|
+
const line = codeLines[lineNumber - 1];
|
|
63
|
+
const preview = replaceAt(line, match.index, component.text, `${component.text}`);
|
|
64
|
+
// Initialize the occurrences array if it doesn't exist
|
|
65
|
+
if (!result[compApiId]["occurrences"][file]) {
|
|
66
|
+
result[compApiId]["occurrences"][file] = [];
|
|
67
|
+
}
|
|
68
|
+
result[compApiId]["occurrences"][file].push({
|
|
69
|
+
lineNumber,
|
|
70
|
+
preview,
|
|
71
|
+
});
|
|
55
72
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
occurrences.push({ lineNumber, preview });
|
|
73
|
+
}
|
|
74
|
+
// Remove from result if no occurrences were found
|
|
75
|
+
if (Object.keys(result[compApiId]["occurrences"]).length === 0) {
|
|
76
|
+
delete result[compApiId];
|
|
61
77
|
}
|
|
62
78
|
}
|
|
63
79
|
},
|
|
64
80
|
});
|
|
65
|
-
if (occurrences.length > 0) {
|
|
66
|
-
result[file] = occurrences;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
delete result[file];
|
|
70
|
-
}
|
|
71
81
|
}));
|
|
72
82
|
}
|
|
73
83
|
await Promise.all(promises);
|
|
74
84
|
return result;
|
|
75
85
|
}
|
|
76
|
-
exports.
|
|
86
|
+
exports.findComponentsInJSXFiles = findComponentsInJSXFiles;
|
|
77
87
|
function replaceAt(str, index, searchString, replacement) {
|
|
78
88
|
return (str.substring(0, index) +
|
|
79
89
|
str.substring(index, str.length).replace(searchString, replacement));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-suggestions.js","sourceRoot":"","sources":["../lib/generate-suggestions.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AACxB,0CAAsC;AACtC,+DAAuC;AAEvC,
|
|
1
|
+
{"version":3,"file":"generate-suggestions.js","sourceRoot":"","sources":["../lib/generate-suggestions.ts"],"names":[],"mappings":"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"}
|
package/bin/pull.js
CHANGED
|
@@ -21,6 +21,7 @@ const SUPPORTED_FORMATS = [
|
|
|
21
21
|
"structured",
|
|
22
22
|
"android",
|
|
23
23
|
"ios-strings",
|
|
24
|
+
"ios-stringsdict",
|
|
24
25
|
"icu",
|
|
25
26
|
];
|
|
26
27
|
const JSON_FORMATS = ["flat", "structured", "icu"];
|
|
@@ -29,6 +30,7 @@ const FORMAT_EXTENSIONS = {
|
|
|
29
30
|
structured: ".json",
|
|
30
31
|
android: ".xml",
|
|
31
32
|
"ios-strings": ".strings",
|
|
33
|
+
"ios-stringsdict": ".stringsdict",
|
|
32
34
|
icu: ".json",
|
|
33
35
|
};
|
|
34
36
|
const getFormatDataIsValid = {
|
|
@@ -37,6 +39,7 @@ const getFormatDataIsValid = {
|
|
|
37
39
|
icu: (data) => data !== "{}",
|
|
38
40
|
android: (data) => data.includes("<string"),
|
|
39
41
|
"ios-strings": (data) => !!data,
|
|
42
|
+
"ios-stringsdict": (data) => data.includes("<key>"),
|
|
40
43
|
};
|
|
41
44
|
const getFormat = (formatFromSource) => {
|
|
42
45
|
const f = formatFromSource;
|
|
@@ -146,7 +149,7 @@ function cleanOutputFiles() {
|
|
|
146
149
|
}
|
|
147
150
|
const fileNames = fs_1.default.readdirSync(consts_1.default.TEXT_DIR);
|
|
148
151
|
fileNames.forEach((fileName) => {
|
|
149
|
-
if (/\.js(on)?|\.xml|\.strings
|
|
152
|
+
if (/\.js(on)?|\.xml|\.strings(dict)?$/.test(fileName)) {
|
|
150
153
|
fs_1.default.unlinkSync(path_1.default.resolve(consts_1.default.TEXT_DIR, fileName));
|
|
151
154
|
}
|
|
152
155
|
});
|
package/bin/pull.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../lib/pull.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../lib/pull.ts"],"names":[],"mappings":"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"}
|
package/lib/ditto.ts
CHANGED
|
@@ -70,6 +70,10 @@ const COMMANDS: CommandConfig<Command>[] = [
|
|
|
70
70
|
"-d, --directory [value]": {
|
|
71
71
|
description: "Directory to search for text",
|
|
72
72
|
},
|
|
73
|
+
"-f, --files [value]": {
|
|
74
|
+
description: "Files to search for text (will override -d)",
|
|
75
|
+
processor: (value: string) => value.split(","),
|
|
76
|
+
},
|
|
73
77
|
},
|
|
74
78
|
},
|
|
75
79
|
{
|
|
@@ -167,6 +171,7 @@ const executeCommand = async (
|
|
|
167
171
|
case "generate-suggestions": {
|
|
168
172
|
return generateSuggestions({
|
|
169
173
|
...(options.directory ? { directory: options.directory } : {}),
|
|
174
|
+
...(options.files ? { files: options.files } : {}),
|
|
170
175
|
});
|
|
171
176
|
}
|
|
172
177
|
case "replace": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from "fs/promises";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import {
|
|
3
|
+
import { findComponentsInJSXFiles } from "./generate-suggestions";
|
|
4
4
|
|
|
5
5
|
describe("findTextInJSXFiles", () => {
|
|
6
6
|
async function createTempFile(filename, content) {
|
|
@@ -15,9 +15,10 @@ describe("findTextInJSXFiles", () => {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
it("should return an empty obj when no files are found", async () => {
|
|
18
|
-
const result = await
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const result = await findComponentsInJSXFiles({
|
|
19
|
+
directory: ".",
|
|
20
|
+
components: {},
|
|
21
|
+
});
|
|
21
22
|
|
|
22
23
|
expect(result).toEqual({});
|
|
23
24
|
});
|
|
@@ -26,9 +27,17 @@ describe("findTextInJSXFiles", () => {
|
|
|
26
27
|
const file1 = await createTempFile("file1.jsx", "<div>No match</div>");
|
|
27
28
|
const file2 = await createTempFile("file2.tsx", "<div>No match</div>");
|
|
28
29
|
|
|
29
|
-
const result = await
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const result = await findComponentsInJSXFiles({
|
|
31
|
+
directory: ".",
|
|
32
|
+
components: {
|
|
33
|
+
acomponent: {
|
|
34
|
+
name: "A Component",
|
|
35
|
+
text: "A Component",
|
|
36
|
+
status: "NONE",
|
|
37
|
+
folder: null,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
32
41
|
|
|
33
42
|
expect(result).toEqual({});
|
|
34
43
|
|
|
@@ -43,24 +52,106 @@ describe("findTextInJSXFiles", () => {
|
|
|
43
52
|
);
|
|
44
53
|
|
|
45
54
|
const expectedResult = {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
"search-string": {
|
|
56
|
+
apiId: "search-string",
|
|
57
|
+
folder: null,
|
|
58
|
+
name: "Search String",
|
|
59
|
+
occurrences: {
|
|
60
|
+
[file1]: [
|
|
61
|
+
{
|
|
62
|
+
lineNumber: 1,
|
|
63
|
+
preview: "<div>Test searchString and another searchString</div>",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
lineNumber: 1,
|
|
67
|
+
preview: "<div>Test searchString and another searchString</div>",
|
|
68
|
+
},
|
|
69
|
+
],
|
|
50
70
|
},
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
71
|
+
status: "NONE",
|
|
72
|
+
text: "searchString",
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const result = await findComponentsInJSXFiles({
|
|
77
|
+
directory: ".",
|
|
78
|
+
components: {
|
|
79
|
+
"search-string": {
|
|
80
|
+
name: "Search String",
|
|
81
|
+
text: "searchString",
|
|
82
|
+
status: "NONE",
|
|
83
|
+
folder: null,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect(result).toEqual(expectedResult);
|
|
89
|
+
|
|
90
|
+
await deleteTempFile(file1);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("-f flag works", async () => {
|
|
94
|
+
const file1 = await createTempFile(
|
|
95
|
+
"file1.jsx",
|
|
96
|
+
`<div>Test searchString and another searchString</div>`
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const expectedResult = {
|
|
100
|
+
"search-string": {
|
|
101
|
+
apiId: "search-string",
|
|
102
|
+
folder: null,
|
|
103
|
+
name: "Search String",
|
|
104
|
+
occurrences: {
|
|
105
|
+
[file1]: [
|
|
106
|
+
{
|
|
107
|
+
lineNumber: 1,
|
|
108
|
+
preview: "<div>Test searchString and another searchString</div>",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
lineNumber: 1,
|
|
112
|
+
preview: "<div>Test searchString and another searchString</div>",
|
|
113
|
+
},
|
|
114
|
+
],
|
|
54
115
|
},
|
|
55
|
-
|
|
116
|
+
status: "NONE",
|
|
117
|
+
text: "searchString",
|
|
118
|
+
},
|
|
56
119
|
};
|
|
57
120
|
|
|
58
|
-
const result = await
|
|
59
|
-
|
|
60
|
-
|
|
121
|
+
const result = await findComponentsInJSXFiles({
|
|
122
|
+
directory: ".",
|
|
123
|
+
files: ["file1.jsx"],
|
|
124
|
+
components: {
|
|
125
|
+
"search-string": {
|
|
126
|
+
name: "Search String",
|
|
127
|
+
text: "searchString",
|
|
128
|
+
status: "NONE",
|
|
129
|
+
folder: null,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
});
|
|
61
133
|
|
|
62
134
|
expect(result).toEqual(expectedResult);
|
|
63
135
|
|
|
136
|
+
try {
|
|
137
|
+
const result2 = await findComponentsInJSXFiles({
|
|
138
|
+
directory: ".",
|
|
139
|
+
files: ["file2.jsx"],
|
|
140
|
+
components: {
|
|
141
|
+
"search-string": {
|
|
142
|
+
name: "Search String",
|
|
143
|
+
text: "searchString",
|
|
144
|
+
status: "NONE",
|
|
145
|
+
folder: null,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
expect(false).toEqual(true);
|
|
151
|
+
} catch {
|
|
152
|
+
expect(true).toEqual(true);
|
|
153
|
+
}
|
|
154
|
+
|
|
64
155
|
await deleteTempFile(file1);
|
|
65
156
|
});
|
|
66
157
|
});
|
|
@@ -4,6 +4,7 @@ import { parse } from "@babel/parser";
|
|
|
4
4
|
import traverse from "@babel/traverse";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
+
FetchComponentResponse,
|
|
7
8
|
FetchComponentResponseComponent,
|
|
8
9
|
fetchComponents,
|
|
9
10
|
} from "./http/fetchComponents";
|
|
@@ -20,43 +21,38 @@ interface Occurrence {
|
|
|
20
21
|
preview: string;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
async function generateSuggestions(flags: {
|
|
24
|
+
async function generateSuggestions(flags: {
|
|
25
|
+
directory?: string;
|
|
26
|
+
files?: string[];
|
|
27
|
+
}) {
|
|
24
28
|
const components = await fetchComponents();
|
|
25
|
-
const
|
|
29
|
+
const directory = flags.directory || ".";
|
|
26
30
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const directory = flags.directory || ".";
|
|
33
|
-
const result = await findTextInJSXFiles(directory, component);
|
|
34
|
-
results[compApiId].occurrences = result;
|
|
35
|
-
|
|
36
|
-
// Remove if there the length is zero
|
|
37
|
-
if (Object.keys(results[compApiId].occurrences).length === 0) {
|
|
38
|
-
delete results[compApiId];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
31
|
+
const results: { [apiId: string]: Result } = await findComponentsInJSXFiles({
|
|
32
|
+
directory,
|
|
33
|
+
files: flags.files,
|
|
34
|
+
components,
|
|
35
|
+
});
|
|
41
36
|
|
|
42
37
|
// Display results to user
|
|
43
38
|
console.log(JSON.stringify(results, null, 2));
|
|
44
39
|
}
|
|
45
40
|
|
|
46
|
-
async function
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
41
|
+
async function findComponentsInJSXFiles(params: {
|
|
42
|
+
directory: string;
|
|
43
|
+
files?: string[];
|
|
44
|
+
components: FetchComponentResponse;
|
|
45
|
+
}): Promise<{ [apiId: string]: Result }> {
|
|
46
|
+
const result: { [apiId: string]: Result } = {};
|
|
47
|
+
const files =
|
|
48
|
+
params.files ||
|
|
49
|
+
glob.sync(`${params.directory}/**/*.+(jsx|tsx)`, {
|
|
50
|
+
ignore: "**/node_modules/**",
|
|
51
|
+
});
|
|
54
52
|
|
|
55
53
|
const promises: Promise<any>[] = [];
|
|
56
54
|
|
|
57
55
|
for (const file of files) {
|
|
58
|
-
result[file] = [];
|
|
59
|
-
|
|
60
56
|
promises.push(
|
|
61
57
|
fs.readFile(file, "utf-8").then((code) => {
|
|
62
58
|
const ast = parse(code, {
|
|
@@ -64,46 +60,68 @@ async function findTextInJSXFiles(
|
|
|
64
60
|
plugins: ["jsx", "typescript"],
|
|
65
61
|
});
|
|
66
62
|
|
|
67
|
-
const occurrences: Occurrence[] = [];
|
|
68
|
-
|
|
69
63
|
traverse(ast, {
|
|
70
64
|
JSXText(path) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const lineNumber = path.node.loc.start.line + lines.length - 1;
|
|
65
|
+
for (const [compApiId, component] of Object.entries(
|
|
66
|
+
params.components
|
|
67
|
+
)) {
|
|
68
|
+
// If we haven't seen this component before, add it to the result
|
|
69
|
+
if (!result[compApiId]) {
|
|
70
|
+
result[compApiId] = {
|
|
71
|
+
apiId: compApiId,
|
|
72
|
+
...component,
|
|
73
|
+
occurrences: {},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
86
76
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
component.text,
|
|
93
|
-
`${component.text}`
|
|
77
|
+
if (path.node.value.includes(component.text)) {
|
|
78
|
+
// Escape all special characters from the text so we can use it in a regex
|
|
79
|
+
const escapedText = component.text.replace(
|
|
80
|
+
/[.*+?^${}()|[\]\\]/g,
|
|
81
|
+
"\\$&"
|
|
94
82
|
);
|
|
83
|
+
const regex = new RegExp(escapedText, "g");
|
|
84
|
+
let match;
|
|
85
|
+
while ((match = regex.exec(path.node.value)) !== null) {
|
|
86
|
+
const lines = path.node.value
|
|
87
|
+
.slice(0, match.index)
|
|
88
|
+
.split("\n");
|
|
89
|
+
|
|
90
|
+
if (!path.node.loc) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const lineNumber =
|
|
95
|
+
path.node.loc.start.line + lines.length - 1;
|
|
96
|
+
|
|
97
|
+
const codeLines = code.split("\n");
|
|
98
|
+
const line = codeLines[lineNumber - 1];
|
|
99
|
+
const preview = replaceAt(
|
|
100
|
+
line,
|
|
101
|
+
match.index,
|
|
102
|
+
component.text,
|
|
103
|
+
`${component.text}`
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// Initialize the occurrences array if it doesn't exist
|
|
107
|
+
if (!result[compApiId]["occurrences"][file]) {
|
|
108
|
+
result[compApiId]["occurrences"][file] = [];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
result[compApiId]["occurrences"][file].push({
|
|
112
|
+
lineNumber,
|
|
113
|
+
preview,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
|
|
96
|
-
|
|
118
|
+
// Remove from result if no occurrences were found
|
|
119
|
+
if (Object.keys(result[compApiId]["occurrences"]).length === 0) {
|
|
120
|
+
delete result[compApiId];
|
|
97
121
|
}
|
|
98
122
|
}
|
|
99
123
|
},
|
|
100
124
|
});
|
|
101
|
-
|
|
102
|
-
if (occurrences.length > 0) {
|
|
103
|
-
result[file] = occurrences;
|
|
104
|
-
} else {
|
|
105
|
-
delete result[file];
|
|
106
|
-
}
|
|
107
125
|
})
|
|
108
126
|
);
|
|
109
127
|
}
|
|
@@ -125,4 +143,4 @@ function replaceAt(
|
|
|
125
143
|
);
|
|
126
144
|
}
|
|
127
145
|
|
|
128
|
-
export {
|
|
146
|
+
export { findComponentsInJSXFiles, generateSuggestions };
|
package/lib/pull.test.ts
CHANGED
|
@@ -13,7 +13,10 @@ const testProjects = [
|
|
|
13
13
|
|
|
14
14
|
jest.mock("./api");
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
// TODO: all tests in this file currently failing because we're re-instantiating the api client
|
|
17
|
+
// everywhere and are unable to mock the return type separately for each instance of usage.
|
|
18
|
+
// We need to refactor to share one api client everywhere instead of always re-creating it.
|
|
19
|
+
const mockApi = createApiClient() as any as jest.Mocked<
|
|
17
20
|
ReturnType<typeof createApiClient>
|
|
18
21
|
>;
|
|
19
22
|
|
|
@@ -45,17 +48,18 @@ afterAll(() => {
|
|
|
45
48
|
});
|
|
46
49
|
|
|
47
50
|
describe("cleanOutputFiles", () => {
|
|
48
|
-
it("removes .js, .json, .xml,
|
|
51
|
+
it("removes .js, .json, .xml, .strings, .stringsdict files", () => {
|
|
49
52
|
cleanOutputDir();
|
|
50
53
|
|
|
51
54
|
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.json"), "test");
|
|
52
55
|
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.js"), "test");
|
|
53
56
|
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.xml"), "test");
|
|
54
57
|
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.strings"), "test");
|
|
58
|
+
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.stringsdict"), "test");
|
|
55
59
|
// this file shouldn't be deleted
|
|
56
60
|
fs.writeFileSync(path.resolve(consts.TEXT_DIR, "test.txt"), "test");
|
|
57
61
|
|
|
58
|
-
expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(
|
|
62
|
+
expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(6);
|
|
59
63
|
|
|
60
64
|
cleanOutputFiles();
|
|
61
65
|
|
|
@@ -113,7 +117,7 @@ describe("downloadAndSaveBase", () => {
|
|
|
113
117
|
}
|
|
114
118
|
});
|
|
115
119
|
|
|
116
|
-
it("writes to text.json for default format", async () => {
|
|
120
|
+
it.only("writes to text.json for default format", async () => {
|
|
117
121
|
cleanOutputDir();
|
|
118
122
|
|
|
119
123
|
mockApi.get.mockResolvedValueOnce({ data: [] });
|
|
@@ -186,4 +190,20 @@ describe("downloadAndSaveBase", () => {
|
|
|
186
190
|
expect(output.match(/saved to/g)?.length).toEqual(2);
|
|
187
191
|
expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(2);
|
|
188
192
|
});
|
|
193
|
+
|
|
194
|
+
it("writes .stringsdict files for ios-stringsdict", async () => {
|
|
195
|
+
cleanOutputDir();
|
|
196
|
+
|
|
197
|
+
mockApi.get.mockResolvedValue({ data: "hello" });
|
|
198
|
+
const output = await downloadAndSaveBase(
|
|
199
|
+
testProjects,
|
|
200
|
+
"ios-stringsdict",
|
|
201
|
+
undefined
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
expect(/saved to.*Project 1\.stringsdict/.test(output)).toEqual(true);
|
|
205
|
+
expect(/saved to.*Project 2\.stringsdict/.test(output)).toEqual(true);
|
|
206
|
+
expect(output.match(/saved to/g)?.length).toEqual(2);
|
|
207
|
+
expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(2);
|
|
208
|
+
});
|
|
189
209
|
});
|
package/lib/pull.ts
CHANGED
|
@@ -11,21 +11,15 @@ import { collectAndSaveToken } from "./init/token";
|
|
|
11
11
|
import sourcesToText from "./utils/sourcesToText";
|
|
12
12
|
import { generateJsDriver } from "./utils/generateJsDriver";
|
|
13
13
|
import { cleanFileName } from "./utils/cleanFileName";
|
|
14
|
-
import { SourceInformation, Token, Project } from "./types";
|
|
14
|
+
import { SourceInformation, Token, Project, SupportedFormat } from "./types";
|
|
15
15
|
import { fetchVariants } from "./http/fetchVariants";
|
|
16
16
|
|
|
17
|
-
type SupportedFormat =
|
|
18
|
-
| "flat"
|
|
19
|
-
| "structured"
|
|
20
|
-
| "android"
|
|
21
|
-
| "ios-strings"
|
|
22
|
-
| "icu";
|
|
23
|
-
|
|
24
17
|
const SUPPORTED_FORMATS: SupportedFormat[] = [
|
|
25
18
|
"flat",
|
|
26
19
|
"structured",
|
|
27
20
|
"android",
|
|
28
21
|
"ios-strings",
|
|
22
|
+
"ios-stringsdict",
|
|
29
23
|
"icu",
|
|
30
24
|
];
|
|
31
25
|
|
|
@@ -36,6 +30,7 @@ const FORMAT_EXTENSIONS = {
|
|
|
36
30
|
structured: ".json",
|
|
37
31
|
android: ".xml",
|
|
38
32
|
"ios-strings": ".strings",
|
|
33
|
+
"ios-stringsdict": ".stringsdict",
|
|
39
34
|
icu: ".json",
|
|
40
35
|
};
|
|
41
36
|
|
|
@@ -45,6 +40,7 @@ const getFormatDataIsValid = {
|
|
|
45
40
|
icu: (data: string) => data !== "{}",
|
|
46
41
|
android: (data: string) => data.includes("<string"),
|
|
47
42
|
"ios-strings": (data: string) => !!data,
|
|
43
|
+
"ios-stringsdict": (data: string) => data.includes("<key>"),
|
|
48
44
|
};
|
|
49
45
|
|
|
50
46
|
const getFormat = (formatFromSource: string | undefined): SupportedFormat => {
|
|
@@ -207,7 +203,7 @@ function cleanOutputFiles() {
|
|
|
207
203
|
|
|
208
204
|
const fileNames = fs.readdirSync(consts.TEXT_DIR);
|
|
209
205
|
fileNames.forEach((fileName) => {
|
|
210
|
-
if (/\.js(on)?|\.xml|\.strings
|
|
206
|
+
if (/\.js(on)?|\.xml|\.strings(dict)?$/.test(fileName)) {
|
|
211
207
|
fs.unlinkSync(path.resolve(consts.TEXT_DIR, fileName));
|
|
212
208
|
}
|
|
213
209
|
});
|
package/lib/replace.test.ts
CHANGED
package/lib/types.ts
CHANGED
|
@@ -12,6 +12,14 @@ interface ComponentFolder {
|
|
|
12
12
|
name: string;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export type SupportedFormat =
|
|
16
|
+
| "flat"
|
|
17
|
+
| "structured"
|
|
18
|
+
| "android"
|
|
19
|
+
| "ios-strings"
|
|
20
|
+
| "ios-stringsdict"
|
|
21
|
+
| "icu";
|
|
22
|
+
|
|
15
23
|
export interface ConfigYAML {
|
|
16
24
|
sources?: {
|
|
17
25
|
components?: {
|
|
@@ -20,7 +28,7 @@ export interface ConfigYAML {
|
|
|
20
28
|
};
|
|
21
29
|
projects?: Project[];
|
|
22
30
|
};
|
|
23
|
-
format?:
|
|
31
|
+
format?: SupportedFormat;
|
|
24
32
|
status?: string;
|
|
25
33
|
variants?: boolean;
|
|
26
34
|
richText?: boolean;
|
package/package.json
CHANGED
package/testfiles/test1.jsx
CHANGED
|
@@ -2,15 +2,15 @@ import React from "react";
|
|
|
2
2
|
function HelloWorld() {
|
|
3
3
|
return (
|
|
4
4
|
<div>
|
|
5
|
-
<p>hello
|
|
5
|
+
<p>hello!</p>
|
|
6
6
|
<p>Some additional text.</p>
|
|
7
|
-
<p>hello
|
|
7
|
+
<p>hello!</p>
|
|
8
8
|
<p>More additional text.</p>
|
|
9
|
-
<p>ahhh hello
|
|
9
|
+
<p>ahhh hello! iaewofjaowiejfoiwjfoffj</p>
|
|
10
10
|
<p>Even more additional text.</p>
|
|
11
|
-
<p>hello
|
|
11
|
+
<p>hello!</p>
|
|
12
12
|
<p>Final additional text.</p>
|
|
13
|
-
<p>hello
|
|
13
|
+
<p>hello!</p>
|
|
14
14
|
<p>good bye</p>
|
|
15
15
|
</div>
|
|
16
16
|
);
|