@dittowords/cli 2.5.1 → 2.5.2

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 (71) hide show
  1. package/README.md +14 -7
  2. package/babel.config.js +2 -8
  3. package/bin/add-project.js +38 -0
  4. package/bin/add-project.js.map +1 -0
  5. package/bin/api.js +20 -0
  6. package/bin/api.js.map +1 -0
  7. package/bin/config.js +174 -0
  8. package/bin/config.js.map +1 -0
  9. package/bin/consts.js +21 -0
  10. package/bin/consts.js.map +1 -0
  11. package/bin/ditto.js +71 -74
  12. package/bin/ditto.js.map +1 -0
  13. package/bin/init/init.js +39 -0
  14. package/bin/init/init.js.map +1 -0
  15. package/bin/init/project.js +115 -0
  16. package/bin/init/project.js.map +1 -0
  17. package/bin/init/token.js +89 -0
  18. package/bin/init/token.js.map +1 -0
  19. package/bin/output.js +34 -0
  20. package/bin/output.js.map +1 -0
  21. package/bin/pull.js +288 -0
  22. package/bin/pull.js.map +1 -0
  23. package/bin/remove-project.js +40 -0
  24. package/bin/remove-project.js.map +1 -0
  25. package/bin/types.js +3 -0
  26. package/bin/types.js.map +1 -0
  27. package/bin/utils/getSelectedProjects.js +76 -0
  28. package/bin/utils/getSelectedProjects.js.map +1 -0
  29. package/bin/utils/processMetaOption.js +15 -0
  30. package/bin/utils/processMetaOption.js.map +1 -0
  31. package/bin/utils/projectsToText.js +16 -0
  32. package/bin/utils/projectsToText.js.map +1 -0
  33. package/bin/utils/promptForProject.js +44 -0
  34. package/bin/utils/promptForProject.js.map +1 -0
  35. package/bin/utils/sourcesToText.js +25 -0
  36. package/bin/utils/sourcesToText.js.map +1 -0
  37. package/jest.config.js +1 -1
  38. package/lib/{add-project.js → add-project.ts} +8 -8
  39. package/lib/api.ts +15 -0
  40. package/lib/{config.test.js → config.test.ts} +14 -25
  41. package/lib/config.ts +214 -0
  42. package/lib/consts.ts +20 -0
  43. package/lib/ditto.ts +97 -0
  44. package/lib/init/{init.js → init.ts} +11 -12
  45. package/lib/init/project.test.ts +49 -0
  46. package/lib/init/{project.js → project.ts} +31 -29
  47. package/lib/init/{token.test.js → token.test.ts} +3 -3
  48. package/lib/init/{token.js → token.ts} +23 -19
  49. package/lib/output.ts +21 -0
  50. package/lib/pull.test.ts +142 -0
  51. package/lib/{pull.js → pull.ts} +119 -92
  52. package/lib/{remove-project.js → remove-project.ts} +11 -15
  53. package/lib/types.ts +23 -0
  54. package/lib/utils/getSelectedProjects.ts +55 -0
  55. package/lib/utils/processMetaOption.test.ts +18 -0
  56. package/lib/utils/processMetaOption.ts +16 -0
  57. package/lib/utils/{projectsToText.js → projectsToText.ts} +5 -4
  58. package/lib/utils/{promptForProject.js → promptForProject.ts} +18 -9
  59. package/lib/utils/{sourcesToText.js → sourcesToText.ts} +6 -5
  60. package/package.json +20 -15
  61. package/testing/fixtures/project-config-pull.yml +0 -0
  62. package/tsconfig.json +12 -0
  63. package/lib/api.js +0 -18
  64. package/lib/config.js +0 -169
  65. package/lib/consts.js +0 -14
  66. package/lib/init/project.test.js +0 -99
  67. package/lib/output.js +0 -21
  68. package/lib/pull.test.js +0 -173
  69. package/lib/utils/getSelectedProjects.js +0 -44
  70. package/lib/utils/processMetaOption.js +0 -16
  71. package/lib/utils/processMetaOption.test.js +0 -16
package/README.md CHANGED
@@ -54,9 +54,7 @@ Once you've successfully authenticated and a config file has been created, you
54
54
 
55
55
  The CLI will not prompt for an API key if a value is provided in the environment variable `DITTO_API_KEY`.
56
56
 
57
- If the `DITTO_API_KEY` environment variable is not set, then the CLI will attempt to parse a token from a file at the
58
- path `~/.config/ditto`. If this file does not exist or does not contain a valid API key, then the CLI will prompt
59
- for one.
57
+ If the `DITTO_API_KEY` environment variable is not set, the CLI will attempt to parse a token from [your authentication file](#authentication). If this file does not exist or does not contain a valid API key, the CLI will prompt for one.
60
58
 
61
59
  We don't recommend editing the file manually; if you need to remove a saved API key and put another one in its place,
62
60
  it's better to fully delete the file and then re-run the CLI so that a new key is prompted for.
@@ -86,13 +84,14 @@ For more details on files generated by the `pull` command, see [JSON Files](#jso
86
84
  **Action:** Removes a project from the list of Ditto projects stored in `config.yml`.
87
85
 
88
86
  ## Options
87
+
89
88
  `-m, --meta <data...>` Optional metadata to send arbitrary data to the backend. Ex: `-m githubActionRequest:true trigger:manual`. Currently, this option should only be utilized when the CLI is ran within a GitHub action (see [Ditto GitHub Action](https://github.com/dittowords/ditto-github-action)) via `githubActionRequest:true`.
90
89
 
91
90
  ## Files
92
91
 
93
92
  ### `ditto/`
94
93
 
95
- This folder houses the configuration file (`ditto/config.yml`) used by the CLI and is also the write destination for any files the CLI generates.
94
+ This folder houses the configuration file (`ditto/config.yml`) used by the CLI and is also the default write destination for any files the CLI generates. See [Output Directory](#output-directory) for details about how to customize the location that files are written to.
96
95
 
97
96
  If you run the CLI in a directory that does not contain a `ditto/` folder, the folder and a `config.yml` file will be automatically created.
98
97
 
@@ -106,7 +105,7 @@ If you run the CLI in a directory that does not contain a `ditto/` folder, the f
106
105
 
107
106
  ##### `projects`
108
107
 
109
- A list of project names and ids to pull text from.
108
+ A list of project names and ids to pull text from.
110
109
 
111
110
  Required if `components: true` is not specified.
112
111
 
@@ -228,9 +227,17 @@ If you run the CLI in a directory that does not contain a `ditto/` folder, the f
228
227
  const App = () => <DittoProvider source={source}>...</DittoProvider>;
229
228
  ```
230
229
 
231
- ### `~/.config/ditto`
230
+ ## Files
231
+
232
+ ### Output Directory
233
+
234
+ By default, the CLI writes it's output files to `./ditto` (relative to the current working directory of the running process). The default path can be overwritten by specifying a custom one via the environment variable `DITTO_TEXT_DIR`.
235
+
236
+ ### Authentication
237
+
238
+ By default, your API key is saved to `$HOME/.config/ditto`; the default path can be overwritten by specifying a custom one via the environment variable `DITTO_CONFIG_FILE`.
232
239
 
233
- Your API key is saved to this file in your **home directory**. Changing an API key currently requires opening this file and manually replacing the existing key.
240
+ To change your API key, delete this file and you'll be prompted for a new key the next time that the CLI executes.
234
241
 
235
242
  ## SDKs
236
243
 
package/babel.config.js CHANGED
@@ -1,12 +1,6 @@
1
1
  module.exports = {
2
2
  presets: [
3
- [
4
- "@babel/preset-env",
5
- {
6
- targets: {
7
- node: "current",
8
- },
9
- },
10
- ],
3
+ ["@babel/preset-env", { targets: { node: "current" } }],
4
+ "@babel/preset-typescript",
11
5
  ],
12
6
  };
@@ -0,0 +1,38 @@
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
+ function quit(exitCode = 2) {
11
+ console.log("Project selection was not updated.");
12
+ process.exitCode = exitCode;
13
+ process.exit();
14
+ }
15
+ const addProject = async () => {
16
+ const projects = (0, getSelectedProjects_1.getSelectedProjects)();
17
+ const usingComponents = (0, getSelectedProjects_1.getIsUsingComponents)();
18
+ try {
19
+ if (usingComponents) {
20
+ if (projects.length) {
21
+ 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)}`);
22
+ }
23
+ else {
24
+ console.log(`\nYou're currently only syncing text from the ${output_1.default.info("Component Library")}`);
25
+ }
26
+ }
27
+ else if (projects.length) {
28
+ console.log(`\nYou're currently set up to sync text from the following projects: ${(0, projectsToText_1.default)(projects)}`);
29
+ }
30
+ await (0, project_1.collectAndSaveProject)(false);
31
+ }
32
+ catch (error) {
33
+ console.log(`\nSorry, there was an error adding a project to your workspace: `, error);
34
+ quit();
35
+ }
36
+ };
37
+ exports.default = addProject;
38
+ //# sourceMappingURL=add-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-project.js","sourceRoot":"","sources":["../lib/add-project.ts"],"names":[],"mappings":";;;;;AAAA,4CAAuD;AACvD,4EAAoD;AACpD,qEAGqC;AACrC,sDAA8B;AAE9B,SAAS,IAAI,CAAC,QAAQ,GAAG,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC;AAED,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,+BAAqB,EAAC,KAAK,CAAC,CAAC;KACpC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,KAAK,CACN,CAAC;QACF,IAAI,EAAE,CAAC;KACR;AACH,CAAC,CAAC;AAEF,kBAAe,UAAU,CAAC"}
package/bin/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
package/bin/api.js.map ADDED
@@ -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"}
package/bin/config.js ADDED
@@ -0,0 +1,174 @@
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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const url_1 = __importDefault(require("url"));
9
+ const js_yaml_1 = __importDefault(require("js-yaml"));
10
+ const consts_1 = __importDefault(require("./consts"));
11
+ function createFileIfMissing(filename) {
12
+ const dir = path_1.default.dirname(filename);
13
+ if (!fs_1.default.existsSync(dir))
14
+ fs_1.default.mkdirSync(dir);
15
+ if (!fs_1.default.existsSync(filename)) {
16
+ fs_1.default.closeSync(fs_1.default.openSync(filename, "w"));
17
+ }
18
+ }
19
+ function jsonIsConfigYAML(json) {
20
+ return typeof json === "object";
21
+ }
22
+ function jsonIsGlobalYAML(json) {
23
+ return (!!json &&
24
+ typeof json === "object" &&
25
+ Object.values(json).every((arr) => arr.every((val) => typeof val === "object" && Object.keys(val).includes("token"))));
26
+ }
27
+ /**
28
+ * Read data from a project config file
29
+ * @param {string} file defaults to `PROJECT_CONFIG_FILE` defined in `constants.js`
30
+ * @param {*} defaultData defaults to `{}`
31
+ * @returns { ConfigYAML }
32
+ */
33
+ function readProjectConfigData(file = consts_1.default.PROJECT_CONFIG_FILE, defaultData = {}) {
34
+ createFileIfMissing(file);
35
+ const fileContents = fs_1.default.readFileSync(file, "utf8");
36
+ const yamlData = js_yaml_1.default.load(fileContents);
37
+ if (jsonIsConfigYAML(yamlData)) {
38
+ return yamlData;
39
+ }
40
+ return defaultData;
41
+ }
42
+ /**
43
+ * Read data from a global config file
44
+ * @param {string} file defaults to `CONFIG_FILE` defined in `constants.js`
45
+ * @param {*} defaultData defaults to `{}`
46
+ * @returns { Record<string, { token: string }[]> }
47
+ */
48
+ function readGlobalConfigData(file = consts_1.default.CONFIG_FILE, defaultData = {}) {
49
+ createFileIfMissing(file);
50
+ const fileContents = fs_1.default.readFileSync(file, "utf8");
51
+ const yamlData = js_yaml_1.default.load(fileContents);
52
+ if (jsonIsGlobalYAML(yamlData)) {
53
+ return yamlData;
54
+ }
55
+ return defaultData;
56
+ }
57
+ function writeProjectConfigData(file, data) {
58
+ createFileIfMissing(file);
59
+ const existingData = readProjectConfigData(file);
60
+ const yamlStr = js_yaml_1.default.dump({ ...existingData, ...data });
61
+ fs_1.default.writeFileSync(file, yamlStr, "utf8");
62
+ }
63
+ function writeGlobalConfigData(file, data) {
64
+ createFileIfMissing(file);
65
+ const existingData = readGlobalConfigData(file);
66
+ const yamlStr = js_yaml_1.default.dump({ ...existingData, ...data });
67
+ fs_1.default.writeFileSync(file, yamlStr, "utf8");
68
+ }
69
+ function justTheHost(host) {
70
+ if (!host.includes("://"))
71
+ return host;
72
+ return url_1.default.parse(host).hostname || "";
73
+ }
74
+ function deleteToken(file, host) {
75
+ const data = readGlobalConfigData(file);
76
+ const hostParsed = justTheHost(host);
77
+ data[hostParsed] = [];
78
+ data[hostParsed][0] = { token: "" };
79
+ writeGlobalConfigData(file, data);
80
+ }
81
+ function saveToken(file, host, token) {
82
+ const data = readGlobalConfigData(file);
83
+ const hostParsed = justTheHost(host);
84
+ data[hostParsed] = []; // only allow one token per host
85
+ data[hostParsed][0] = { token };
86
+ writeGlobalConfigData(file, data);
87
+ }
88
+ function getTokenFromEnv() {
89
+ return process.env.DITTO_API_KEY;
90
+ }
91
+ /**
92
+ *
93
+ * @param {string} file
94
+ * @param {string} host
95
+ * @returns {Token}
96
+ */
97
+ function getToken(file, host) {
98
+ const tokenFromEnv = getTokenFromEnv();
99
+ if (tokenFromEnv) {
100
+ return tokenFromEnv;
101
+ }
102
+ const data = readGlobalConfigData(file);
103
+ const hostEntry = data[justTheHost(host)];
104
+ if (!hostEntry)
105
+ return undefined;
106
+ const { length } = hostEntry;
107
+ return hostEntry[length - 1].token;
108
+ }
109
+ const IS_DUPLICATE = /-(\d+$)/;
110
+ function dedupeProjectName(projectNames, projectName) {
111
+ let dedupedName = projectName;
112
+ if (projectNames.has(dedupedName)) {
113
+ while (projectNames.has(dedupedName)) {
114
+ const [_, numberStr] = dedupedName.match(IS_DUPLICATE) || [];
115
+ if (numberStr && !isNaN(parseInt(numberStr))) {
116
+ dedupedName = `${dedupedName.replace(IS_DUPLICATE, "")}-${parseInt(numberStr) + 1}`;
117
+ }
118
+ else {
119
+ dedupedName = `${dedupedName}-1`;
120
+ }
121
+ }
122
+ }
123
+ return dedupedName;
124
+ }
125
+ /**
126
+ * Reads from the config file, filters out
127
+ * invalid projects, dedupes those remaining, and returns:
128
+ * - whether or not the data required to `pull` is present
129
+ * - whether or not the component library should be fetched
130
+ * - an array of valid, deduped projects
131
+ * - the `variants` and `format` config options
132
+ */
133
+ function parseSourceInformation() {
134
+ const { projects, components, variants, format } = readProjectConfigData();
135
+ const projectNames = new Set();
136
+ const validProjects = [];
137
+ let componentLibraryInProjects = false;
138
+ (projects || []).forEach((project) => {
139
+ const isValid = project.id && project.name;
140
+ if (!isValid) {
141
+ return;
142
+ }
143
+ if (project.id === "ditto_component_library") {
144
+ componentLibraryInProjects = true;
145
+ return;
146
+ }
147
+ project.fileName = dedupeProjectName(projectNames, project.name);
148
+ projectNames.add(project.fileName);
149
+ validProjects.push(project);
150
+ });
151
+ const shouldFetchComponentLibrary = !!components || componentLibraryInProjects;
152
+ const hasSourceData = !!validProjects.length || shouldFetchComponentLibrary;
153
+ return {
154
+ hasSourceData,
155
+ validProjects,
156
+ shouldFetchComponentLibrary,
157
+ variants: variants || false,
158
+ format,
159
+ };
160
+ }
161
+ exports.default = {
162
+ createFileIfMissing,
163
+ readProjectConfigData,
164
+ readGlobalConfigData,
165
+ writeGlobalConfigData,
166
+ writeProjectConfigData,
167
+ justTheHost,
168
+ saveToken,
169
+ deleteToken,
170
+ getToken,
171
+ getTokenFromEnv,
172
+ parseSourceInformation,
173
+ };
174
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../lib/config.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,8CAAsB;AACtB,sDAA2B;AAE3B,sDAA8B;AAG9B,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,YAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC5B,YAAE,CAAC,SAAS,CAAC,YAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;KAC1C;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa;IACrC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAa;IAEb,OAAO,CACL,CAAC,CAAC,IAAI;QACN,OAAO,IAAI,KAAK,QAAQ;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAChC,GAAG,CAAC,KAAK,CACP,CAAC,GAAQ,EAAE,EAAE,CACX,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAChE,CACF,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAC5B,IAAI,GAAG,gBAAM,CAAC,mBAAmB,EACjC,WAAW,GAAG,EAAE;IAEhB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,YAAY,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;QAC9B,OAAO,QAAQ,CAAC;KACjB;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAC3B,IAAI,GAAG,gBAAM,CAAC,WAAW,EACzB,WAAW,GAAG,EAAE;IAEhB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,YAAY,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;QAC9B,OAAO,QAAQ,CAAC;KACjB;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,IAAY;IACxD,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,iBAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACxD,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,IAAY;IACvD,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,iBAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACxD,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,aAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACpC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IAC1D,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,gCAAgC;IACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;IAChC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY;IAC1C,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE;QAChB,OAAO,YAAY,CAAC;KACrB;IAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,SAAS,iBAAiB,CAAC,YAAyB,EAAE,WAAmB;IACvE,IAAI,WAAW,GAAG,WAAW,CAAC;IAE9B,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;QACjC,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACpC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC7D,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE;gBAC5C,WAAW,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IACpD,QAAQ,CAAC,SAAS,CAAC,GAAG,CACxB,EAAE,CAAC;aACJ;iBAAM;gBACL,WAAW,GAAG,GAAG,WAAW,IAAI,CAAC;aAClC;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB;IAC7B,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAE3E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,aAAa,GAAc,EAAE,CAAC;IAEpC,IAAI,0BAA0B,GAAG,KAAK,CAAC;IAEvC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAED,IAAI,OAAO,CAAC,EAAE,KAAK,yBAAyB,EAAE;YAC5C,0BAA0B,GAAG,IAAI,CAAC;YAClC,OAAO;SACR;QAED,OAAO,CAAC,QAAQ,GAAG,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,2BAA2B,GAC/B,CAAC,CAAC,UAAU,IAAI,0BAA0B,CAAC;IAE7C,MAAM,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAE5E,OAAO;QACL,aAAa;QACb,aAAa;QACb,2BAA2B;QAC3B,QAAQ,EAAE,QAAQ,IAAI,KAAK;QAC3B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,WAAW;IACX,SAAS;IACT,WAAW;IACX,QAAQ;IACR,eAAe;IACf,sBAAsB;CACvB,CAAC"}
package/bin/consts.js ADDED
@@ -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"}
package/bin/ditto.js CHANGED
@@ -1,96 +1,93 @@
1
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 });
2
7
  // This is the main entry point for the ditto-cli command.
3
- const { program } = require("commander");
8
+ const commander_1 = require("commander");
4
9
  // to use V8's code cache to speed up instantiation time
5
10
  require("v8-compile-cache");
6
-
7
- const { init, needsInit } = require("../lib/init/init");
8
- const { pull } = require("../lib/pull");
9
-
10
- const addProject = require("../lib/add-project");
11
- const removeProject = require("../lib/remove-project");
12
- const processMetaOption = require("../lib/utils/processMetaOption");
13
-
11
+ const init_1 = require("./init/init");
12
+ const pull_1 = require("./pull");
13
+ const add_project_1 = __importDefault(require("./add-project"));
14
+ const remove_project_1 = __importDefault(require("./remove-project"));
15
+ const processMetaOption_1 = __importDefault(require("./utils/processMetaOption"));
14
16
  /**
15
17
  * Catch and report unexpected error.
16
18
  * @param {any} error The thrown error object.
17
19
  * @returns {void}
18
20
  */
19
21
  function quit(exitCode = 2) {
20
- console.log("\nExiting Ditto CLI...\n");
21
- process.exitCode = exitCode;
22
- process.exit();
22
+ console.log("\nExiting Ditto CLI...\n");
23
+ process.exitCode = exitCode;
24
+ process.exit();
23
25
  }
24
-
25
26
  const setupCommands = () => {
26
- program.name("ditto-cli");
27
- program
28
- .command("pull")
29
- .description("Sync copy from Ditto into working directory")
30
- .action(() => checkInit("pull"));
31
-
32
- const projectDescription = "Add a Ditto project to sync copy from";
33
- const projectCommand = program
34
- .command("project")
35
- .description(projectDescription)
36
- .action(() => checkInit("project"));
37
-
38
- projectCommand
39
- .command("add")
40
- .description(projectDescription)
41
- .action(() => checkInit("project"));
42
-
43
- projectCommand
44
- .command("remove")
45
- .description("Stop syncing copy from a Ditto project")
46
- .action(() => checkInit("project remove"));
27
+ commander_1.program.name("ditto-cli");
28
+ commander_1.program
29
+ .command("pull")
30
+ .description("Sync copy from Ditto into working directory")
31
+ .action(() => checkInit("pull"));
32
+ const projectDescription = "Add a Ditto project to sync copy from";
33
+ const projectCommand = commander_1.program
34
+ .command("project")
35
+ .description(projectDescription)
36
+ .action(() => checkInit("project"));
37
+ projectCommand
38
+ .command("add")
39
+ .description(projectDescription)
40
+ .action(() => checkInit("project"));
41
+ projectCommand
42
+ .command("remove")
43
+ .description("Stop syncing copy from a Ditto project")
44
+ .action(() => checkInit("project remove"));
47
45
  };
48
-
49
46
  const setupOptions = () => {
50
- program
51
- .option('-m, --meta <data...>',
52
- 'Optional metadata for this command to send arbitrary data to the backend. Ex: -m githubActionRequest:true trigger:manual');
47
+ commander_1.program.option("-m, --meta <data...>", "Optional metadata for this command to send arbitrary data to the backend. Ex: -m githubActionRequest:true trigger:manual");
53
48
  };
54
-
55
49
  const checkInit = async (command) => {
56
- if (needsInit() && command !== "project remove") {
57
- try {
58
- await init();
59
- if (command === "pull") main(); // re-run to actually pull text now that init is finished
60
- } catch (error) {
61
- quit();
50
+ if ((0, init_1.needsInit)() && command !== "project remove") {
51
+ try {
52
+ await (0, init_1.init)();
53
+ if (command === "pull")
54
+ main(); // re-run to actually pull text now that init is finished
55
+ }
56
+ catch (error) {
57
+ quit();
58
+ }
62
59
  }
63
- } else {
64
- const { meta } = program.opts();
65
- switch (command) {
66
- case "pull":
67
- pull({ meta: processMetaOption(meta) });
68
- break;
69
- case "project":
70
- case "project add":
71
- addProject();
72
- break;
73
- case "project remove":
74
- removeProject();
75
- break;
76
- case "none":
77
- setupCommands();
78
- program.help();
79
- break;
80
- default:
81
- quit();
60
+ else {
61
+ const { meta } = commander_1.program.opts();
62
+ switch (command) {
63
+ case "pull":
64
+ (0, pull_1.pull)({ meta: (0, processMetaOption_1.default)(meta) });
65
+ break;
66
+ case "project":
67
+ case "project add":
68
+ (0, add_project_1.default)();
69
+ break;
70
+ case "project remove":
71
+ (0, remove_project_1.default)();
72
+ break;
73
+ case "none":
74
+ setupCommands();
75
+ commander_1.program.help();
76
+ break;
77
+ default:
78
+ quit();
79
+ }
82
80
  }
83
- }
84
81
  };
85
-
86
82
  const main = async () => {
87
- if (process.argv.length <= 2 && process.argv[1].includes("ditto-cli")) {
88
- await checkInit("none");
89
- } else {
90
- setupCommands();
91
- setupOptions();
92
- }
93
- program.parse(process.argv);
83
+ if (process.argv.length <= 2 && process.argv[1].includes("ditto-cli")) {
84
+ await checkInit("none");
85
+ }
86
+ else {
87
+ setupCommands();
88
+ setupOptions();
89
+ }
90
+ commander_1.program.parse(process.argv);
94
91
  };
95
-
96
92
  main();
93
+ //# 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,39 @@
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.needsInit = 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 sourcesToText_1 = __importDefault(require("../utils/sourcesToText"));
15
+ const needsInit = () => (0, token_1.needsToken)() || (0, project_1.needsSource)();
16
+ exports.needsInit = needsInit;
17
+ function welcome() {
18
+ const msg = chalk_1.default.white(`${chalk_1.default.bold("Welcome to the", chalk_1.default.magentaBright("Ditto CLI"))}.
19
+
20
+ We're glad to have you here.`);
21
+ console.log((0, boxen_1.default)(msg, { padding: 1 }));
22
+ }
23
+ const init = async () => {
24
+ welcome();
25
+ if ((0, token_1.needsToken)()) {
26
+ await (0, token_1.collectAndSaveToken)();
27
+ }
28
+ const { hasSourceData, validProjects, shouldFetchComponentLibrary } = config_1.default.parseSourceInformation();
29
+ if (!hasSourceData) {
30
+ await (0, project_1.collectAndSaveProject)(true);
31
+ return;
32
+ }
33
+ const message = "You're currently set up to sync text from " +
34
+ (0, sourcesToText_1.default)(validProjects, shouldFetchComponentLibrary);
35
+ console.log(message);
36
+ };
37
+ exports.init = init;
38
+ exports.default = { needsInit: exports.needsInit, init: exports.init };
39
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../lib/init/init.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAuD;AACvD,uCAAuC;AACvC,kDAA0B;AAC1B,kDAA0B;AAG1B,uCAA+D;AAC/D,mCAA0D;AAE1D,uDAA+B;AAC/B,2EAAmD;AAE5C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAA,kBAAU,GAAE,IAAI,IAAA,qBAAW,GAAE,CAAC;AAAhD,QAAA,SAAS,aAAuC;AAE7D,SAAS,OAAO;IACd,MAAM,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,GAAG,eAAK,CAAC,IAAI,CACnC,gBAAgB,EAChB,eAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CACjC;;6BAE0B,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAEM,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IAC7B,OAAO,EAAE,CAAC;IAEV,IAAI,IAAA,kBAAU,GAAE,EAAE;QAChB,MAAM,IAAA,2BAAmB,GAAE,CAAC;KAC7B;IAED,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,2BAA2B,EAAE,GACjE,gBAAM,CAAC,sBAAsB,EAAE,CAAC;IAElC,IAAI,CAAC,aAAa,EAAE;QAClB,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,CAAC;QAClC,OAAO;KACR;IAED,MAAM,OAAO,GACX,4CAA4C;QAC5C,IAAA,uBAAa,EAAC,aAAa,EAAE,2BAA2B,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AApBW,QAAA,IAAI,QAoBf;AAEF,kBAAe,EAAE,SAAS,EAAT,iBAAS,EAAE,IAAI,EAAJ,YAAI,EAAE,CAAC"}