locize-cli 10.2.0 → 10.3.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/CHANGELOG.md +9 -0
- package/README.md +23 -0
- package/bin/locize +47 -3
- package/deleteBranch.js +97 -0
- package/download.js +19 -3
- package/mergeBranch.js +5 -1
- package/package.json +1 -1
- package/sync.js +18 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,15 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
|
|
|
6
6
|
Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## [10.3.0](https://github.com/locize/locize-cli/compare/v10.2.1...v10.3.0) - 2025-08-11
|
|
10
|
+
|
|
11
|
+
- introduce delete-branch command
|
|
12
|
+
- sync/download: try to check if version exists also on dry-run
|
|
13
|
+
|
|
14
|
+
## [10.2.1](https://github.com/locize/locize-cli/compare/v10.2.0...v10.2.1) - 2025-08-07
|
|
15
|
+
|
|
16
|
+
- download/sync: check if branch name is empty string
|
|
17
|
+
|
|
9
18
|
## [10.2.0](https://github.com/locize/locize-cli/compare/v10.1.1...v10.2.0) - 2025-07-16
|
|
10
19
|
|
|
11
20
|
- download/sync introduce `--overridden-only` option for branches or tenants
|
package/README.md
CHANGED
|
@@ -23,6 +23,23 @@ iwr https://raw.githubusercontent.com/locize/locize-cli/master/install.ps1 -useb
|
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
> ⚠️ **Filename restrictions**
|
|
27
|
+
> The namespace you choose becomes your on-disk filename, so please avoid these characters:
|
|
28
|
+
> ```
|
|
29
|
+
> < (less than)
|
|
30
|
+
> > (greater than)
|
|
31
|
+
> : (colon)
|
|
32
|
+
> " (double quote)
|
|
33
|
+
> / (forward slash)
|
|
34
|
+
> \ (backslash)
|
|
35
|
+
> | (vertical bar or pipe)
|
|
36
|
+
> ? (question mark)
|
|
37
|
+
> * (asterisk)
|
|
38
|
+
> ```
|
|
39
|
+
> These are sometimes illegal on various operating systems, so using them may lead to files not being written or being written incorrectly. If necessary, use only letters, numbers, hyphens ("-") and underscores ("_") in your namespace names.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
26
43
|
## Adding/Updating new keys
|
|
27
44
|
### Step 1: execute
|
|
28
45
|
|
|
@@ -346,6 +363,12 @@ locize download --branch featureXYZ --api-key my-api-key-d9de-4f55-9855-a9ef0ed4
|
|
|
346
363
|
locize merge-branch featureXYZ --api-key my-api-key-d9de-4f55-9855-a9ef0ed44672 --project-id my-project-id-93e1-442a-ab35-24331fa294ba --delete true
|
|
347
364
|
```
|
|
348
365
|
|
|
366
|
+
### Delete an unmerged branch
|
|
367
|
+
|
|
368
|
+
```sh
|
|
369
|
+
locize delete-branch featureXYZ --api-key my-api-key-d9de-4f55-9855-a9ef0ed44672 --project-id my-project-id-93e1-442a-ab35-24331fa294ba
|
|
370
|
+
```
|
|
371
|
+
|
|
349
372
|
|
|
350
373
|
## Other information
|
|
351
374
|
|
package/bin/locize
CHANGED
|
@@ -28,6 +28,7 @@ const deleteNamespace = require('../deleteNamespace');
|
|
|
28
28
|
const formatFn = require('../format');
|
|
29
29
|
const createBranch = require('../createBranch');
|
|
30
30
|
const mergeBranch = require('../mergeBranch');
|
|
31
|
+
const deleteBranch = require('../deleteBranch');
|
|
31
32
|
|
|
32
33
|
var config = {};
|
|
33
34
|
try {
|
|
@@ -839,9 +840,9 @@ program
|
|
|
839
840
|
.on('--help', () => {
|
|
840
841
|
console.log(' Examples:');
|
|
841
842
|
console.log();
|
|
842
|
-
console.log(' $ locize
|
|
843
|
-
console.log(' $ locize
|
|
844
|
-
console.log(' $ locize
|
|
843
|
+
console.log(' $ locize create-branch featureX');
|
|
844
|
+
console.log(' $ locize create-branch featureX --ver production');
|
|
845
|
+
console.log(' $ locize create-branch featureX --api-key <apiKey> --project-id <projectId> --ver <version>');
|
|
845
846
|
console.log();
|
|
846
847
|
});
|
|
847
848
|
|
|
@@ -892,6 +893,49 @@ program
|
|
|
892
893
|
console.log();
|
|
893
894
|
});
|
|
894
895
|
|
|
896
|
+
program
|
|
897
|
+
.command('delete-branch <branch>')
|
|
898
|
+
.alias('cb')
|
|
899
|
+
.description('delete branch')
|
|
900
|
+
.option('-k, --api-key <apiKey>', 'The api-key that should be used')
|
|
901
|
+
.option('-i, --project-id <projectId>', 'The project-id that should be used')
|
|
902
|
+
.option('-C, --config-path <configPath>', `Specify the path to the optional locize config file (default: ${configInWorkingDirectory} or ${configInHome})`)
|
|
903
|
+
.action((branch, options) => {
|
|
904
|
+
try {
|
|
905
|
+
config = ini.parse(fs.readFileSync(options.configPath, 'utf-8')) || config;
|
|
906
|
+
} catch (e) {}
|
|
907
|
+
|
|
908
|
+
const apiKey = options.apiKey || config.apiKey || process.env.LOCIZE_API_KEY || process.env.LOCIZE_KEY;
|
|
909
|
+
if (!apiKey) {
|
|
910
|
+
console.error(' error: missing required argument `apiKey`');
|
|
911
|
+
process.exit(1);
|
|
912
|
+
return;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
const projectId = options.projectId || config.projectId || process.env.LOCIZE_PROJECTID || process.env.LOCIZE_PID;
|
|
916
|
+
if (!projectId) {
|
|
917
|
+
console.error(' error: missing required argument `projectId`');
|
|
918
|
+
process.exit(1);
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
const getPath = options.getPath || config.getPath || options.addPath || config.addPath || getPathUrl;
|
|
923
|
+
|
|
924
|
+
deleteBranch({
|
|
925
|
+
apiKey: apiKey,
|
|
926
|
+
projectId: projectId,
|
|
927
|
+
apiPath: url.parse(getPath).protocol + '//' + url.parse(getPath).host,
|
|
928
|
+
branch: branch
|
|
929
|
+
});
|
|
930
|
+
})
|
|
931
|
+
.on('--help', () => {
|
|
932
|
+
console.log(' Examples:');
|
|
933
|
+
console.log();
|
|
934
|
+
console.log(' $ locize delete-branch featureX');
|
|
935
|
+
console.log(' $ locize delete-branch featureX --api-key <apiKey> --project-id <projectId>');
|
|
936
|
+
console.log();
|
|
937
|
+
});
|
|
938
|
+
|
|
895
939
|
program.parse(process.argv);
|
|
896
940
|
|
|
897
941
|
if (!process.argv.slice(2).length) {
|
package/deleteBranch.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const colors = require('colors');
|
|
2
|
+
const request = require('./request');
|
|
3
|
+
const getBranches = require('./getBranches');
|
|
4
|
+
const getJob = require('./getJob');
|
|
5
|
+
const isValidUuid = require('./isValidUuid');
|
|
6
|
+
|
|
7
|
+
const handleError = (err, cb) => {
|
|
8
|
+
if (!cb && err) {
|
|
9
|
+
console.error(colors.red(err.stack));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
if (cb) cb(err);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const deleteBranch = (opt, cb) => {
|
|
16
|
+
request(opt.apiPath + '/branch/' + opt.branch, {
|
|
17
|
+
method: 'delete',
|
|
18
|
+
headers: {
|
|
19
|
+
'Authorization': opt.apiKey
|
|
20
|
+
}
|
|
21
|
+
}, (err, res, obj) => {
|
|
22
|
+
if (err || (obj && (obj.errorMessage || obj.message))) {
|
|
23
|
+
if (!cb) console.log(colors.red('deleting branch failed...'));
|
|
24
|
+
|
|
25
|
+
if (err) {
|
|
26
|
+
if (!cb) { console.error(colors.red(err.message)); process.exit(1); }
|
|
27
|
+
if (cb) cb(err);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (obj && (obj.errorMessage || obj.message)) {
|
|
31
|
+
if (!cb) { console.error(colors.red((obj.errorMessage || obj.message))); process.exit(1); }
|
|
32
|
+
if (cb) cb(new Error((obj.errorMessage || obj.message)));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (res.status === 404) {
|
|
37
|
+
if (!cb) { console.error(colors.yellow(res.statusText + ' (' + res.status + ')')); process.exit(1); }
|
|
38
|
+
if (cb) cb(null, null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (res.status >= 300) {
|
|
42
|
+
if (!cb) { console.error(colors.red(res.statusText + ' (' + res.status + ')')); process.exit(1); }
|
|
43
|
+
if (cb) cb(new Error(res.statusText + ' (' + res.status + ')'));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!obj || !obj.jobId) {
|
|
48
|
+
if (!cb) { console.error(colors.red('No jobId! Something went wrong!')); process.exit(1); }
|
|
49
|
+
if (cb) cb(new Error('No jobId! Something went wrong!'));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
(function waitForJob() {
|
|
54
|
+
getJob({
|
|
55
|
+
apiPath: opt.apiPath,
|
|
56
|
+
apiKey: opt.apiKey,
|
|
57
|
+
projectId: opt.branch
|
|
58
|
+
}, obj.jobId, (err, job) => {
|
|
59
|
+
if (err) {
|
|
60
|
+
if (!cb) { console.error(colors.red(err.message)); process.exit(1); }
|
|
61
|
+
if (cb) cb(err);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (job && !job.timeouted) {
|
|
66
|
+
setTimeout(waitForJob, 2000);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (job && job.timeouted) {
|
|
71
|
+
if (!cb) { console.error(colors.red('Job timeouted!')); process.exit(1); }
|
|
72
|
+
if (cb) cb(new Error('Job timeouted!'));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!cb) console.log(colors.green(`deleting branch "${opt.branch}" succesfully requested`));
|
|
77
|
+
if (cb) cb(null);
|
|
78
|
+
});
|
|
79
|
+
})();
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
module.exports = (opt, cb) => {
|
|
84
|
+
getBranches(opt, (err, branches) => {
|
|
85
|
+
if (err) return handleError(err, cb);
|
|
86
|
+
|
|
87
|
+
let b;
|
|
88
|
+
if (isValidUuid(opt.branch)) b = branches.find((br) => br.id === opt.branch);
|
|
89
|
+
if (!b) b = branches.find((br) => br.name === opt.branch);
|
|
90
|
+
if (!b) {
|
|
91
|
+
return handleError(new Error(`Branch ${opt.branch} not found!`), cb);
|
|
92
|
+
}
|
|
93
|
+
opt.branch = b.id;
|
|
94
|
+
|
|
95
|
+
deleteBranch(opt, cb);
|
|
96
|
+
});
|
|
97
|
+
};
|
package/download.js
CHANGED
|
@@ -417,15 +417,27 @@ const continueToDownload = (opt, cb) => {
|
|
|
417
417
|
return;
|
|
418
418
|
}
|
|
419
419
|
|
|
420
|
-
|
|
421
|
-
|
|
420
|
+
if (obj.length > 0) {
|
|
421
|
+
obj = filterDownloads(opt, obj || []);
|
|
422
|
+
return handleDownload(opt, url, err, res, obj, cb);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
getProjectStats(opt, (err, res) => {
|
|
426
|
+
if (err) return handleError(err, cb);
|
|
427
|
+
if (!res) return handleError(new Error('Nothing found!'), cb);
|
|
428
|
+
if (!res[opt.version]) return handleError(new Error(`Version "${opt.version}" not found!`), cb);
|
|
429
|
+
|
|
430
|
+
obj = filterDownloads(opt, obj || []);
|
|
431
|
+
return handleDownload(opt, url, err, res, obj, cb);
|
|
432
|
+
});
|
|
422
433
|
});
|
|
423
434
|
return;
|
|
424
435
|
}
|
|
425
436
|
|
|
426
437
|
getProjectStats(opt, (err, res) => {
|
|
427
438
|
if (err) return handleError(err, cb);
|
|
428
|
-
if (!res
|
|
439
|
+
if (!res) return handleError(new Error('Nothing found!'), cb);
|
|
440
|
+
if (!res[opt.version]) return handleError(new Error(`Version "${opt.version}" not found!`), cb);
|
|
429
441
|
|
|
430
442
|
const toDownload = [];
|
|
431
443
|
const lngsToCheck = opt.language ? [opt.language] : Object.keys(res[opt.version]);
|
|
@@ -474,6 +486,10 @@ const download = (opt, cb) => {
|
|
|
474
486
|
return handleError(new Error('Please provide also an api-key!'), cb);
|
|
475
487
|
}
|
|
476
488
|
|
|
489
|
+
if (opt.branch === '') {
|
|
490
|
+
return handleError(new Error('The branch name seems invalid!'), cb);
|
|
491
|
+
}
|
|
492
|
+
|
|
477
493
|
if (opt.branch) {
|
|
478
494
|
getBranches(opt, (err, branches) => {
|
|
479
495
|
if (err) return handleError(err, cb);
|
package/mergeBranch.js
CHANGED
|
@@ -48,7 +48,11 @@ const mergeBranch = (opt, cb) => {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
(function waitForJob() {
|
|
51
|
-
getJob(
|
|
51
|
+
getJob({
|
|
52
|
+
apiPath: opt.apiPath,
|
|
53
|
+
apiKey: opt.apiKey,
|
|
54
|
+
projectId: opt.branch
|
|
55
|
+
}, obj.jobId, (err, job) => {
|
|
52
56
|
if (err) {
|
|
53
57
|
if (!cb) { console.error(colors.red(err.message)); process.exit(1); }
|
|
54
58
|
if (cb) cb(err);
|
package/package.json
CHANGED
package/sync.js
CHANGED
|
@@ -53,13 +53,24 @@ const getDownloads = (opt, cb) => {
|
|
|
53
53
|
}
|
|
54
54
|
return cb(new Error(res.statusText + ' (' + res.status + ')'));
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
57
|
-
|
|
56
|
+
if (obj.length > 0) {
|
|
57
|
+
if (opt.skipEmpty) obj = obj.filter((d) => d.size > 2);
|
|
58
|
+
return cb(null, obj);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
getProjectStats(opt, (err, res) => {
|
|
62
|
+
if (err) return handleError(err, cb);
|
|
63
|
+
if (!res) return handleError(new Error('Nothing found!'), cb);
|
|
64
|
+
if (!res[opt.version]) return handleError(new Error(`Version "${opt.version}" not found!`), cb);
|
|
65
|
+
|
|
66
|
+
return cb(null, obj);
|
|
67
|
+
});
|
|
58
68
|
});
|
|
59
69
|
} else {
|
|
60
70
|
getProjectStats(opt, (err, res) => {
|
|
61
71
|
if (err) return handleError(err, cb);
|
|
62
|
-
if (!res
|
|
72
|
+
if (!res) return handleError(new Error('Nothing found!'), cb);
|
|
73
|
+
if (!res[opt.version]) return handleError(new Error(`Version "${opt.version}" not found!`), cb);
|
|
63
74
|
|
|
64
75
|
const toDownload = [];
|
|
65
76
|
const lngsToCheck = opt.language ? [opt.language] : (opt.languages && opt.languages.length > 0) ? opt.languages : Object.keys(res[opt.version]);
|
|
@@ -743,6 +754,10 @@ const sync = (opt, cb) => {
|
|
|
743
754
|
return handleError(new Error('Please provide also an api-key!'), cb);
|
|
744
755
|
}
|
|
745
756
|
|
|
757
|
+
if (opt.branch === '') {
|
|
758
|
+
return handleError(new Error('The branch name seems invalid!'), cb);
|
|
759
|
+
}
|
|
760
|
+
|
|
746
761
|
if (opt.branch) {
|
|
747
762
|
getBranches(opt, (err, branches) => {
|
|
748
763
|
if (err) return handleError(err, cb);
|