@dittowords/cli 3.9.0 → 3.10.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 (63) hide show
  1. package/README.md +11 -2
  2. package/bin/lib/add-project.js +36 -0
  3. package/bin/lib/add-project.js.map +1 -0
  4. package/bin/lib/api.js +20 -0
  5. package/bin/lib/api.js.map +1 -0
  6. package/bin/lib/config.js +202 -0
  7. package/bin/lib/config.js.map +1 -0
  8. package/bin/lib/consts.js +21 -0
  9. package/bin/lib/consts.js.map +1 -0
  10. package/bin/lib/ditto.js +121 -0
  11. package/bin/lib/ditto.js.map +1 -0
  12. package/bin/lib/generate-suggestions.js +71 -0
  13. package/bin/lib/generate-suggestions.js.map +1 -0
  14. package/bin/lib/http/fetchComponents.js +13 -0
  15. package/bin/lib/http/fetchComponents.js.map +1 -0
  16. package/bin/lib/http/fetchVariants.js +26 -0
  17. package/bin/lib/http/fetchVariants.js.map +1 -0
  18. package/bin/lib/init/init.js +50 -0
  19. package/bin/lib/init/init.js.map +1 -0
  20. package/bin/lib/init/project.js +108 -0
  21. package/bin/lib/init/project.js.map +1 -0
  22. package/bin/lib/init/token.js +91 -0
  23. package/bin/lib/init/token.js.map +1 -0
  24. package/bin/lib/output.js +34 -0
  25. package/bin/lib/output.js.map +1 -0
  26. package/bin/lib/pull.js +264 -0
  27. package/bin/lib/pull.js.map +1 -0
  28. package/bin/lib/remove-project.js +35 -0
  29. package/bin/lib/remove-project.js.map +1 -0
  30. package/bin/lib/replace.js +107 -0
  31. package/bin/lib/replace.js.map +1 -0
  32. package/bin/lib/types.js +3 -0
  33. package/bin/lib/types.js.map +1 -0
  34. package/bin/lib/utils/cleanFileName.js +11 -0
  35. package/bin/lib/utils/cleanFileName.js.map +1 -0
  36. package/bin/lib/utils/generateJsDriver.js +56 -0
  37. package/bin/lib/utils/generateJsDriver.js.map +1 -0
  38. package/bin/lib/utils/getSelectedProjects.js +61 -0
  39. package/bin/lib/utils/getSelectedProjects.js.map +1 -0
  40. package/bin/lib/utils/processMetaOption.js +15 -0
  41. package/bin/lib/utils/processMetaOption.js.map +1 -0
  42. package/bin/lib/utils/projectsToText.js +25 -0
  43. package/bin/lib/utils/projectsToText.js.map +1 -0
  44. package/bin/lib/utils/promptForProject.js +43 -0
  45. package/bin/lib/utils/promptForProject.js.map +1 -0
  46. package/bin/lib/utils/quit.js +10 -0
  47. package/bin/lib/utils/quit.js.map +1 -0
  48. package/bin/lib/utils/sourcesToText.js +25 -0
  49. package/bin/lib/utils/sourcesToText.js.map +1 -0
  50. package/bin/package.json +76 -0
  51. package/bin/pull.js +18 -8
  52. package/bin/pull.js.map +1 -1
  53. package/lib/pull.ts +29 -9
  54. package/lib/types.ts +1 -1
  55. package/package.json +1 -1
  56. package/.idea/cli.iml +0 -13
  57. package/.idea/codeStyles/Project.xml +0 -65
  58. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  59. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  60. package/.idea/modules.xml +0 -8
  61. package/.idea/prettier.xml +0 -6
  62. package/.idea/vcs.xml +0 -6
  63. package/.idea/workspace.xml +0 -220
package/README.md CHANGED
@@ -96,6 +96,7 @@ For more details on files generated by this command, see [Output Files](#output-
96
96
 
97
97
  **Action:** Import components via a file. Please see https://www.dittowords.com/docs/importing-string-files for more information.
98
98
  When [importing CSV files](https://www.dittowords.com/docs/importing-csv-files), the follow parameters are applicable:
99
+
99
100
  ```
100
101
  -t, --text [value] Text column index (Required)
101
102
  -n, --component-name [value] Name column indexes (comma separated) (Required)
@@ -108,7 +109,7 @@ When [importing CSV files](https://www.dittowords.com/docs/importing-csv-files),
108
109
 
109
110
  ## Configuration
110
111
 
111
- The `config.yml` file is the source of truth for a given directory about how the CLI should fetch and store data from Ditto. It includes information about which Ditto projects the CLI should pull text from, whether or not the component library should be included, in what format the text should be stored, and more.
112
+ The `config.yml` file is the source of truth for a given directory about how the CLI should fetch and store data from Ditto. It includes information about which Ditto projects the CLI should pull text from, whether or not the component library should be included, in what format(s) the text should be stored, and more.
112
113
 
113
114
  This file is edited by the `project add` / `project remove` commands, but most options are currently only supported through manual edits.
114
115
 
@@ -193,6 +194,14 @@ Defaults to `flat` if not specified.
193
194
  format: flat
194
195
  ```
195
196
 
197
+ Also accepts a list of values:
198
+
199
+ ```yml
200
+ format:
201
+ - ios-strings
202
+ - ios-stringsdict
203
+ ```
204
+
196
205
  #### Status
197
206
 
198
207
  If defined, data pulled will be restricted to text items or components that have the specified status. Accepted values:
@@ -271,7 +280,7 @@ All files created will adhere to the following template:
271
280
 
272
281
  To help with keeping cross-platform behavior consistent, file names will be fully lowercase, have whitespace replaced with hyphens, and have non-word characters (with the exception of `-` and `_`) removed.
273
282
 
274
- If the configured format results in JSON files being generated, an `index.js` "driver file" is also created to simplify the process of integrating Ditto into web apps:
283
+ If the configured format(s) result(s) in JSON files being generated, an `index.js` "driver file" is also created to simplify the process of integrating Ditto into web apps:
275
284
 
276
285
  ```js
277
286
  module.exports = {
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const project_1 = require("./init/project");
7
+ const projectsToText_1 = __importDefault(require("./utils/projectsToText"));
8
+ const getSelectedProjects_1 = require("./utils/getSelectedProjects");
9
+ const output_1 = __importDefault(require("./output"));
10
+ const quit_1 = require("./utils/quit");
11
+ const addProject = async () => {
12
+ const projects = (0, getSelectedProjects_1.getSelectedProjects)();
13
+ const usingComponents = (0, getSelectedProjects_1.getIsUsingComponents)();
14
+ try {
15
+ if (usingComponents) {
16
+ if (projects.length) {
17
+ console.log(`\nYou're currently syncing text from the ${output_1.default.info("Component Library")} and from the following projects: ${(0, projectsToText_1.default)(projects)}`);
18
+ }
19
+ else {
20
+ console.log(`\nYou're currently only syncing text from the ${output_1.default.info("Component Library")}`);
21
+ }
22
+ }
23
+ else if (projects.length) {
24
+ console.log(`\nYou're currently set up to sync text from the following projects: ${(0, projectsToText_1.default)(projects)}`);
25
+ }
26
+ await (0, project_1.collectAndSaveSource)({
27
+ components: false,
28
+ });
29
+ }
30
+ catch (error) {
31
+ console.log(`\nSorry, there was an error adding a project to your workspace: `, error);
32
+ (0, quit_1.quit)("Project selection was not updated.");
33
+ }
34
+ };
35
+ exports.default = addProject;
36
+ //# sourceMappingURL=add-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-project.js","sourceRoot":"","sources":["../../lib/add-project.ts"],"names":[],"mappings":";;;;;AAAA,4CAAsD;AACtD,4EAAoD;AACpD,qEAGqC;AACrC,sDAA8B;AAC9B,uCAAoC;AAEpC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;IAC5B,MAAM,QAAQ,GAAG,IAAA,yCAAmB,GAAE,CAAC;IACvC,MAAM,eAAe,GAAG,IAAA,0CAAoB,GAAE,CAAC;IAE/C,IAAI;QACF,IAAI,eAAe,EAAE;YACnB,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,OAAO,CAAC,GAAG,CACT,4CAA4C,gBAAM,CAAC,IAAI,CACrD,mBAAmB,CACpB,qCAAqC,IAAA,wBAAc,EAAC,QAAQ,CAAC,EAAE,CACjE,CAAC;aACH;iBAAM;gBACL,OAAO,CAAC,GAAG,CACT,iDAAiD,gBAAM,CAAC,IAAI,CAC1D,mBAAmB,CACpB,EAAE,CACJ,CAAC;aACH;SACF;aAAM,IAAI,QAAQ,CAAC,MAAM,EAAE;YAC1B,OAAO,CAAC,GAAG,CACT,uEAAuE,IAAA,wBAAc,EACnF,QAAQ,CACT,EAAE,CACJ,CAAC;SACH;QACD,MAAM,IAAA,8BAAoB,EAAC;YACzB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;KACJ;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,KAAK,CACN,CAAC;QACF,IAAA,WAAI,EAAC,oCAAoC,CAAC,CAAC;KAC5C;AACH,CAAC,CAAC;AAEF,kBAAe,UAAU,CAAC"}
package/bin/lib/api.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.create = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const config_1 = __importDefault(require("./config"));
9
+ const consts_1 = __importDefault(require("./consts"));
10
+ const create = (token) => {
11
+ return axios_1.default.create({
12
+ baseURL: consts_1.default.API_HOST,
13
+ headers: {
14
+ Authorization: `token ${token}`,
15
+ },
16
+ });
17
+ };
18
+ exports.create = create;
19
+ exports.default = (0, exports.create)(config_1.default.getToken(consts_1.default.CONFIG_FILE, consts_1.default.API_HOST));
20
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,sDAA8B;AAC9B,sDAA8B;AAEvB,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE;IACvC,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,gBAAM,CAAC,QAAQ;QACxB,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,KAAK,EAAE;SAChC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,MAAM,UAOjB;AAEF,kBAAe,IAAA,cAAM,EAAC,gBAAM,CAAC,QAAQ,CAAC,gBAAM,CAAC,WAAW,EAAE,gBAAM,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CONFIG = exports.DEFAULT_CONFIG_JSON = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const url_1 = __importDefault(require("url"));
10
+ const js_yaml_1 = __importDefault(require("js-yaml"));
11
+ const consts_1 = __importDefault(require("./consts"));
12
+ exports.DEFAULT_CONFIG_JSON = {
13
+ sources: {
14
+ components: { enabled: true },
15
+ },
16
+ variants: true,
17
+ format: "flat",
18
+ };
19
+ exports.DEFAULT_CONFIG = js_yaml_1.default.dump(exports.DEFAULT_CONFIG_JSON);
20
+ function createFileIfMissing(filename, defaultContents) {
21
+ const dir = path_1.default.dirname(filename);
22
+ // create the directory if it doesn't already exist
23
+ if (!fs_1.default.existsSync(dir))
24
+ fs_1.default.mkdirSync(dir);
25
+ // create the file if it doesn't already exist
26
+ if (!fs_1.default.existsSync(filename)) {
27
+ // create the file, writing the `defaultContents` if provided
28
+ fs_1.default.writeFileSync(filename, defaultContents || "", "utf-8");
29
+ }
30
+ }
31
+ function jsonIsConfigYAML(json) {
32
+ return typeof json === "object";
33
+ }
34
+ function jsonIsGlobalYAML(json) {
35
+ return (!!json &&
36
+ typeof json === "object" &&
37
+ Object.values(json).every((arr) => arr.every &&
38
+ arr.every((val) => typeof val === "object" && Object.keys(val).includes("token"))));
39
+ }
40
+ /**
41
+ * Read data from a project config file
42
+ * @param {string} file defaults to `PROJECT_CONFIG_FILE` defined in `constants.js`
43
+ * @param {*} defaultData defaults to `{}`
44
+ * @returns { ConfigYAML }
45
+ */
46
+ function readProjectConfigData(file = consts_1.default.PROJECT_CONFIG_FILE, defaultData = {}) {
47
+ createFileIfMissing(file, exports.DEFAULT_CONFIG);
48
+ const fileContents = fs_1.default.readFileSync(file, "utf8");
49
+ const yamlData = js_yaml_1.default.load(fileContents);
50
+ if (jsonIsConfigYAML(yamlData)) {
51
+ return yamlData;
52
+ }
53
+ return defaultData;
54
+ }
55
+ /**
56
+ * Read data from a global config file
57
+ * @param {string} file defaults to `CONFIG_FILE` defined in `constants.js`
58
+ * @param {*} defaultData defaults to `{}`
59
+ * @returns { Record<string, { token: string }[]> }
60
+ */
61
+ function readGlobalConfigData(file = consts_1.default.CONFIG_FILE, defaultData = {}) {
62
+ createFileIfMissing(file);
63
+ const fileContents = fs_1.default.readFileSync(file, "utf8");
64
+ const yamlData = js_yaml_1.default.load(fileContents);
65
+ if (jsonIsGlobalYAML(yamlData)) {
66
+ return yamlData;
67
+ }
68
+ return defaultData;
69
+ }
70
+ function writeProjectConfigData(file, data) {
71
+ createFileIfMissing(file, exports.DEFAULT_CONFIG);
72
+ const existingData = readProjectConfigData(file);
73
+ const configData = {
74
+ ...existingData,
75
+ ...data,
76
+ sources: {
77
+ ...existingData.sources,
78
+ ...data.sources,
79
+ },
80
+ };
81
+ const yamlStr = js_yaml_1.default.dump(configData);
82
+ fs_1.default.writeFileSync(file, yamlStr, "utf8");
83
+ }
84
+ function writeGlobalConfigData(file, data) {
85
+ createFileIfMissing(file);
86
+ const existingData = readGlobalConfigData(file);
87
+ const yamlStr = js_yaml_1.default.dump({ ...existingData, ...data });
88
+ fs_1.default.writeFileSync(file, yamlStr, "utf8");
89
+ }
90
+ function justTheHost(host) {
91
+ if (!host.includes("://"))
92
+ return host;
93
+ return url_1.default.parse(host).hostname || "";
94
+ }
95
+ function deleteToken(file, host) {
96
+ const data = readGlobalConfigData(file);
97
+ const hostParsed = justTheHost(host);
98
+ data[hostParsed] = [];
99
+ data[hostParsed][0] = { token: "" };
100
+ writeGlobalConfigData(file, data);
101
+ }
102
+ function saveToken(file, host, token) {
103
+ const data = readGlobalConfigData(file);
104
+ const hostParsed = justTheHost(host);
105
+ data[hostParsed] = []; // only allow one token per host
106
+ data[hostParsed][0] = { token };
107
+ writeGlobalConfigData(file, data);
108
+ }
109
+ function getTokenFromEnv() {
110
+ return process.env.DITTO_API_KEY;
111
+ }
112
+ /**
113
+ *
114
+ * @param {string} file
115
+ * @param {string} host
116
+ * @returns {Token}
117
+ */
118
+ function getToken(file, host) {
119
+ const tokenFromEnv = getTokenFromEnv();
120
+ if (tokenFromEnv) {
121
+ return tokenFromEnv;
122
+ }
123
+ const data = readGlobalConfigData(file);
124
+ const hostEntry = data[justTheHost(host)];
125
+ if (!hostEntry)
126
+ return undefined;
127
+ const { length } = hostEntry;
128
+ return hostEntry[length - 1].token;
129
+ }
130
+ const IS_DUPLICATE = /-(\d+$)/;
131
+ function dedupeProjectName(projectNames, projectName) {
132
+ let dedupedName = projectName;
133
+ if (projectNames.has(dedupedName)) {
134
+ while (projectNames.has(dedupedName)) {
135
+ const [_, numberStr] = dedupedName.match(IS_DUPLICATE) || [];
136
+ if (numberStr && !isNaN(parseInt(numberStr))) {
137
+ dedupedName = `${dedupedName.replace(IS_DUPLICATE, "")}-${parseInt(numberStr) + 1}`;
138
+ }
139
+ else {
140
+ dedupedName = `${dedupedName}-1`;
141
+ }
142
+ }
143
+ }
144
+ return dedupedName;
145
+ }
146
+ /**
147
+ * Reads from the config file, filters out
148
+ * invalid projects, dedupes those remaining, and returns:
149
+ * - whether or not the data required to `pull` is present
150
+ * - whether or not the component library should be fetched
151
+ * - an array of valid, deduped projects
152
+ * - the `variants` and `format` config options
153
+ */
154
+ function parseSourceInformation(file) {
155
+ const { sources, variants, format, status, richText, projects: projectsRoot, components: componentsRoot, } = readProjectConfigData(file);
156
+ const projects = sources?.projects || [];
157
+ const projectNames = new Set();
158
+ const validProjects = [];
159
+ let hasComponentLibraryInProjects = false;
160
+ (projects || []).forEach((project) => {
161
+ const isValid = project.id && project.name;
162
+ if (!isValid) {
163
+ return;
164
+ }
165
+ if (project.id === "ditto_component_library") {
166
+ hasComponentLibraryInProjects = true;
167
+ return;
168
+ }
169
+ project.fileName = dedupeProjectName(projectNames, project.name);
170
+ projectNames.add(project.fileName);
171
+ validProjects.push(project);
172
+ });
173
+ const shouldFetchComponentLibrary = Boolean(sources?.components?.enabled);
174
+ const hasSourceData = !!validProjects.length || shouldFetchComponentLibrary;
175
+ return {
176
+ hasSourceData,
177
+ validProjects,
178
+ shouldFetchComponentLibrary,
179
+ variants: variants || false,
180
+ format,
181
+ status,
182
+ richText,
183
+ hasTopLevelProjectsField: !!projectsRoot,
184
+ hasTopLevelComponentsField: !!componentsRoot,
185
+ hasComponentLibraryInProjects,
186
+ componentFolders: sources?.components?.folders || null,
187
+ };
188
+ }
189
+ exports.default = {
190
+ createFileIfMissing,
191
+ readProjectConfigData,
192
+ readGlobalConfigData,
193
+ writeGlobalConfigData,
194
+ writeProjectConfigData,
195
+ justTheHost,
196
+ saveToken,
197
+ deleteToken,
198
+ getToken,
199
+ getTokenFromEnv,
200
+ parseSourceInformation,
201
+ };
202
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TEXT_FILE = exports.TEXT_DIR = exports.PROJECT_CONFIG_FILE = exports.CONFIG_FILE = exports.API_HOST = void 0;
7
+ const os_1 = require("os");
8
+ const path_1 = __importDefault(require("path"));
9
+ exports.API_HOST = process.env.DITTO_API_HOST || "https://api.dittowords.com";
10
+ exports.CONFIG_FILE = process.env.DITTO_CONFIG_FILE || path_1.default.join((0, os_1.homedir)(), ".config", "ditto");
11
+ exports.PROJECT_CONFIG_FILE = path_1.default.normalize(path_1.default.join("ditto", "config.yml"));
12
+ exports.TEXT_DIR = process.env.DITTO_TEXT_DIR || "ditto";
13
+ exports.TEXT_FILE = path_1.default.normalize(path_1.default.join(exports.TEXT_DIR, "text.json"));
14
+ exports.default = {
15
+ API_HOST: exports.API_HOST,
16
+ CONFIG_FILE: exports.CONFIG_FILE,
17
+ PROJECT_CONFIG_FILE: exports.PROJECT_CONFIG_FILE,
18
+ TEXT_DIR: exports.TEXT_DIR,
19
+ TEXT_FILE: exports.TEXT_FILE,
20
+ };
21
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../lib/consts.ts"],"names":[],"mappings":";;;;;;AAAA,2BAA6B;AAC7B,gDAAwB;AAEX,QAAA,QAAQ,GACnB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,4BAA4B,CAAC;AAChD,QAAA,WAAW,GACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,cAAI,CAAC,IAAI,CAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC/D,QAAA,mBAAmB,GAAG,cAAI,CAAC,SAAS,CAC/C,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CACjC,CAAC;AACW,QAAA,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;AACjD,QAAA,SAAS,GAAG,cAAI,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1E,kBAAe;IACb,QAAQ,EAAR,gBAAQ;IACR,WAAW,EAAX,mBAAW;IACX,mBAAmB,EAAnB,2BAAmB;IACnB,QAAQ,EAAR,gBAAQ;IACR,SAAS,EAAT,iBAAS;CACV,CAAC"}
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ // This is the main entry point for the ditto-cli command.
8
+ const commander_1 = require("commander");
9
+ // to use V8's code cache to speed up instantiation time
10
+ require("v8-compile-cache");
11
+ const package_json_1 = __importDefault(require("../package.json"));
12
+ const init_1 = require("./init/init");
13
+ const pull_1 = require("./pull");
14
+ const quit_1 = require("./utils/quit");
15
+ const add_project_1 = __importDefault(require("./add-project"));
16
+ const remove_project_1 = __importDefault(require("./remove-project"));
17
+ const replace_1 = require("./replace");
18
+ const generate_suggestions_1 = require("./generate-suggestions");
19
+ const processMetaOption_1 = __importDefault(require("./utils/processMetaOption"));
20
+ const VERSION = package_json_1.default.version;
21
+ const COMMANDS = [
22
+ {
23
+ name: "pull",
24
+ description: "Sync copy from Ditto into the current working directory",
25
+ },
26
+ {
27
+ name: "project",
28
+ description: "Add a Ditto project to sync copy from",
29
+ commands: [
30
+ {
31
+ name: "add",
32
+ description: "Add a Ditto project to sync copy from",
33
+ },
34
+ {
35
+ name: "remove",
36
+ description: "Stop syncing copy from a Ditto project",
37
+ },
38
+ ],
39
+ },
40
+ {
41
+ name: "generate-suggestions",
42
+ description: "Find text that can be potentially replaced with Ditto text",
43
+ },
44
+ {
45
+ name: "replace",
46
+ description: "Find and replace Ditto text with code",
47
+ },
48
+ ];
49
+ const setupCommands = () => {
50
+ commander_1.program.name("ditto-cli");
51
+ COMMANDS.forEach((commandConfig) => {
52
+ const cmd = commander_1.program
53
+ .command(commandConfig.name)
54
+ .description(commandConfig.description)
55
+ .action((str, options) => executeCommand(commandConfig.name, options));
56
+ if ("commands" in commandConfig) {
57
+ commandConfig.commands.forEach((nestedCommand) => {
58
+ cmd
59
+ .command(nestedCommand.name)
60
+ .description(nestedCommand.description)
61
+ .action((str, options) => executeCommand(`${commandConfig.name} ${nestedCommand.name}`, options));
62
+ });
63
+ }
64
+ });
65
+ };
66
+ const setupOptions = () => {
67
+ commander_1.program.option("-m, --meta <data...>", "Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual");
68
+ commander_1.program.version(VERSION, "-v, --version", "Output the current version");
69
+ };
70
+ const executeCommand = async (command, options) => {
71
+ const needsInitialization = (0, init_1.needsTokenOrSource)();
72
+ if (needsInitialization) {
73
+ try {
74
+ await (0, init_1.init)();
75
+ }
76
+ catch (error) {
77
+ (0, quit_1.quit)("Exiting Ditto CLI...");
78
+ return;
79
+ }
80
+ }
81
+ const { meta } = commander_1.program.opts();
82
+ switch (command) {
83
+ case "none":
84
+ case "pull": {
85
+ return (0, pull_1.pull)({ meta: (0, processMetaOption_1.default)(meta) });
86
+ }
87
+ case "project":
88
+ case "project add": {
89
+ // initialization already includes the selection of a source,
90
+ // so if `project add` is called during initialization, don't
91
+ // prompt the user to select a source again
92
+ if (needsInitialization)
93
+ return;
94
+ return (0, add_project_1.default)();
95
+ }
96
+ case "project remove": {
97
+ return (0, remove_project_1.default)();
98
+ }
99
+ case "generate-suggestions": {
100
+ return (0, generate_suggestions_1.generateSuggestions)();
101
+ }
102
+ case "replace": {
103
+ return (0, replace_1.replace)(options);
104
+ }
105
+ default: {
106
+ (0, quit_1.quit)("Exiting Ditto CLI...");
107
+ return;
108
+ }
109
+ }
110
+ };
111
+ const main = async () => {
112
+ setupCommands();
113
+ setupOptions();
114
+ if (process.argv.length <= 2 && process.argv[1].includes("ditto-cli")) {
115
+ await executeCommand("none", []);
116
+ return;
117
+ }
118
+ commander_1.program.parse(process.argv);
119
+ };
120
+ main();
121
+ //# sourceMappingURL=ditto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ditto.js","sourceRoot":"","sources":["../../lib/ditto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateSuggestions = exports.findTextInJSXFiles = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const glob_1 = __importDefault(require("glob"));
9
+ const parser_1 = require("@babel/parser");
10
+ const traverse_1 = __importDefault(require("@babel/traverse"));
11
+ const fetchComponents_1 = require("./http/fetchComponents");
12
+ async function generateSuggestions() {
13
+ const components = await (0, fetchComponents_1.fetchComponents)();
14
+ const results = {};
15
+ for (const [compApiId, component] of Object.entries(components)) {
16
+ if (!results[compApiId]) {
17
+ results[compApiId] = [];
18
+ }
19
+ const result = await findTextInJSXFiles(".", component.text);
20
+ results[compApiId] = [...results[compApiId], ...result];
21
+ }
22
+ // Display results to user
23
+ console.log(JSON.stringify(results, null, 2));
24
+ }
25
+ exports.generateSuggestions = generateSuggestions;
26
+ async function findTextInJSXFiles(path, searchString) {
27
+ const result = [];
28
+ const files = glob_1.default.sync(`${path}/**/*.+(jsx|tsx)`, {
29
+ ignore: "**/node_modules/**",
30
+ });
31
+ const promises = [];
32
+ for (const file of files) {
33
+ promises.push(fs_extra_1.default.readFile(file, "utf-8").then((code) => {
34
+ const ast = (0, parser_1.parse)(code, {
35
+ sourceType: "module",
36
+ plugins: ["jsx", "typescript"],
37
+ });
38
+ const occurrences = [];
39
+ (0, traverse_1.default)(ast, {
40
+ JSXText(path) {
41
+ if (path.node.value.includes(searchString)) {
42
+ const regex = new RegExp(searchString, "g");
43
+ let match;
44
+ while ((match = regex.exec(path.node.value)) !== null) {
45
+ const lines = path.node.value.slice(0, match.index).split("\n");
46
+ if (!path.node.loc) {
47
+ continue;
48
+ }
49
+ const lineNumber = path.node.loc.start.line + lines.length - 1;
50
+ const codeLines = code.split("\n");
51
+ const line = codeLines[lineNumber - 1];
52
+ const preview = replaceAt(line, match.index, searchString, `{{${searchString}}}`);
53
+ occurrences.push({ lineNumber, preview });
54
+ }
55
+ }
56
+ },
57
+ });
58
+ if (occurrences.length > 0) {
59
+ result.push({ file, occurrences });
60
+ }
61
+ }));
62
+ }
63
+ await Promise.all(promises);
64
+ return result;
65
+ }
66
+ exports.findTextInJSXFiles = findTextInJSXFiles;
67
+ function replaceAt(str, index, searchString, replacement) {
68
+ return (str.substring(0, index) +
69
+ str.substring(index, str.length).replace(searchString, replacement));
70
+ }
71
+ //# sourceMappingURL=generate-suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-suggestions.js","sourceRoot":"","sources":["../../lib/generate-suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchComponents = void 0;
7
+ const api_1 = __importDefault(require("../api"));
8
+ async function fetchComponents() {
9
+ const { data } = await api_1.default.get("/components", {});
10
+ return data;
11
+ }
12
+ exports.fetchComponents = fetchComponents;
13
+ //# sourceMappingURL=fetchComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchComponents.js","sourceRoot":"","sources":["../../../lib/http/fetchComponents.ts"],"names":[],"mappings":";;;;;;AAAA,iDAAyB;AAElB,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,aAAG,CAAC,GAAG,CAO3B,aAAa,EAAE,EAAE,CAAC,CAAC;IAEtB,OAAO,IAAI,CAAC;AACd,CAAC;AAXD,0CAWC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchVariants = void 0;
7
+ const api_1 = __importDefault(require("../api"));
8
+ async function fetchVariants(source, options = {}) {
9
+ if (!source.variants) {
10
+ return null;
11
+ }
12
+ const { shouldFetchComponentLibrary, validProjects } = source;
13
+ const config = {
14
+ params: { ...options?.meta },
15
+ };
16
+ // if we're not syncing from the component library, then we pass the project ids
17
+ // to limit the list of returned variants to only those that are relevant for the
18
+ // specified projects
19
+ if (validProjects.length && !shouldFetchComponentLibrary) {
20
+ config.params.projectIds = validProjects.map(({ id }) => id);
21
+ }
22
+ const { data } = await api_1.default.get("/variants", config);
23
+ return data;
24
+ }
25
+ exports.fetchVariants = fetchVariants;
26
+ //# sourceMappingURL=fetchVariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchVariants.js","sourceRoot":"","sources":["../../../lib/http/fetchVariants.ts"],"names":[],"mappings":";;;;;;AACA,iDAAyB;AAIlB,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,UAAuB,EAAE;IAEzB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,EAAE,2BAA2B,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE9D,MAAM,MAAM,GAAuB;QACjC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE;KAC7B,CAAC;IAEF,gFAAgF;IAChF,iFAAiF;IACjF,qBAAqB;IACrB,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE;QACxD,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;KAC9D;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,aAAG,CAAC,GAAG,CAAsB,WAAW,EAAE,MAAM,CAAC,CAAC;IAEzE,OAAO,IAAI,CAAC;AACd,CAAC;AAxBD,sCAwBC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.init = exports.needsTokenOrSource = void 0;
7
+ // Related to initializing a user/environment to ditto.
8
+ // expected to be run once per project.
9
+ const boxen_1 = __importDefault(require("boxen"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const project_1 = require("./project");
12
+ const token_1 = require("./token");
13
+ const config_1 = __importDefault(require("../config"));
14
+ const output_1 = __importDefault(require("../output"));
15
+ const sourcesToText_1 = __importDefault(require("../utils/sourcesToText"));
16
+ const quit_1 = require("../utils/quit");
17
+ const needsTokenOrSource = () => (0, token_1.needsToken)() || (0, project_1.needsSource)();
18
+ exports.needsTokenOrSource = needsTokenOrSource;
19
+ function welcome() {
20
+ const msg = chalk_1.default.white(`${chalk_1.default.bold("Welcome to the", chalk_1.default.magentaBright("Ditto CLI"))}.
21
+
22
+ We're glad to have you here.`);
23
+ console.log((0, boxen_1.default)(msg, { padding: 1 }));
24
+ }
25
+ const init = async () => {
26
+ welcome();
27
+ if ((0, token_1.needsToken)()) {
28
+ await (0, token_1.collectAndSaveToken)();
29
+ }
30
+ const { hasSourceData, validProjects, shouldFetchComponentLibrary, hasTopLevelComponentsField, hasTopLevelProjectsField, } = config_1.default.parseSourceInformation();
31
+ if (hasTopLevelProjectsField) {
32
+ return (0, quit_1.quit)(`${output_1.default.errorText(`Support for ${output_1.default.warnText("projects")} as a top-level field has been removed; please configure ${output_1.default.warnText("sources.projects")} instead.`)}
33
+ See ${output_1.default.url("https://github.com/dittowords/cli")} for more information.`);
34
+ }
35
+ if (hasTopLevelComponentsField) {
36
+ return (0, quit_1.quit)(`${output_1.default.errorText("Support for `components` as a top-level field has been removed; please configure `sources.components` instead.")}
37
+ See ${output_1.default.url("https://github.com/dittowords/cli")} for more information.`);
38
+ }
39
+ if (!hasSourceData) {
40
+ console.log(`Looks like there are no Ditto sources selected for your current directory: ${output_1.default.info(process.cwd())}.`);
41
+ await (0, project_1.collectAndSaveSource)({ initialize: true, components: true });
42
+ return;
43
+ }
44
+ const message = "You're currently set up to sync text from " +
45
+ (0, sourcesToText_1.default)(validProjects, shouldFetchComponentLibrary);
46
+ console.log(message);
47
+ };
48
+ exports.init = init;
49
+ exports.default = { init: exports.init };
50
+ //# sourceMappingURL=init.js.map