@dittowords/cli 3.7.0 → 3.9.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/.idea/prettier.xml +6 -0
- package/.idea/workspace.xml +123 -4
- package/README.md +22 -0
- package/bin/component-folders.js +10 -0
- package/bin/component-folders.js.map +1 -0
- package/bin/ditto.js +52 -3
- package/bin/ditto.js.map +1 -1
- package/bin/http/fetchComponentFolders.js +11 -0
- package/bin/http/fetchComponentFolders.js.map +1 -0
- package/bin/http/importComponents.js +56 -0
- package/bin/http/importComponents.js.map +1 -0
- package/bin/importComponents.js +14 -0
- package/bin/importComponents.js.map +1 -0
- package/lib/component-folders.ts +9 -0
- package/lib/ditto.ts +57 -4
- package/lib/http/fetchComponentFolders.ts +16 -0
- package/lib/http/importComponents.ts +71 -0
- package/lib/importComponents.ts +24 -0
- package/package.json +2 -1
package/.idea/workspace.xml
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<project version="4">
|
|
3
3
|
<component name="ChangeListManager">
|
|
4
|
-
<list default="true" id="d2834f12-3435-41b5-8efa-c62f3f4baa0d" name="Changes" comment="
|
|
4
|
+
<list default="true" id="d2834f12-3435-41b5-8efa-c62f3f4baa0d" name="Changes" comment="Add remaining column mappings">
|
|
5
|
+
<change beforePath="$PROJECT_DIR$/lib/ditto.ts" beforeDir="false" afterPath="$PROJECT_DIR$/lib/ditto.ts" afterDir="false" />
|
|
6
|
+
</list>
|
|
5
7
|
<option name="SHOW_DIALOG" value="false" />
|
|
6
8
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
7
9
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
8
10
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
9
11
|
</component>
|
|
10
12
|
<component name="Git.Settings">
|
|
13
|
+
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
|
14
|
+
<map>
|
|
15
|
+
<entry key="$PROJECT_DIR$" value="master" />
|
|
16
|
+
</map>
|
|
17
|
+
</option>
|
|
11
18
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
|
12
19
|
</component>
|
|
13
20
|
<component name="GitSEFilterConfiguration">
|
|
@@ -28,15 +35,40 @@
|
|
|
28
35
|
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
|
29
36
|
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
|
30
37
|
<property name="WebServerToolWindowFactoryState" value="false" />
|
|
38
|
+
<property name="last_opened_file_path" value="$PROJECT_DIR$/lib/http" />
|
|
31
39
|
<property name="node.js.detected.package.eslint" value="true" />
|
|
32
40
|
<property name="node.js.detected.package.standard" value="true" />
|
|
33
41
|
<property name="node.js.selected.package.eslint" value="(autodetect)" />
|
|
34
42
|
<property name="node.js.selected.package.standard" value="" />
|
|
43
|
+
<property name="nodejs.jest.jest_package" value="$PROJECT_DIR$/node_modules/jest" />
|
|
35
44
|
<property name="nodejs_package_manager_path" value="yarn" />
|
|
36
|
-
<property name="
|
|
45
|
+
<property name="prettierjs.PrettierConfiguration.Package" value="$PROJECT_DIR$/node_modules/prettier" />
|
|
46
|
+
<property name="settings.editor.selected.configurable" value="settings.javascript.prettier" />
|
|
37
47
|
<property name="ts.external.directory.path" value="$PROJECT_DIR$/node_modules/typescript/lib" />
|
|
38
48
|
<property name="vue.rearranger.settings.migration" value="true" />
|
|
39
49
|
</component>
|
|
50
|
+
<component name="RecentsManager">
|
|
51
|
+
<key name="CopyFile.RECENT_KEYS">
|
|
52
|
+
<recent name="$PROJECT_DIR$/lib/http" />
|
|
53
|
+
</key>
|
|
54
|
+
</component>
|
|
55
|
+
<component name="RunManager">
|
|
56
|
+
<configuration name="generate-suggestions.test.ts" type="JavaScriptTestRunnerJest" temporary="true" nameIsGenerated="true">
|
|
57
|
+
<node-interpreter value="project" />
|
|
58
|
+
<node-options value="" />
|
|
59
|
+
<jest-package value="$PROJECT_DIR$/node_modules/jest" />
|
|
60
|
+
<working-dir value="$PROJECT_DIR$" />
|
|
61
|
+
<envs />
|
|
62
|
+
<scope-kind value="TEST_FILE" />
|
|
63
|
+
<test-file value="$PROJECT_DIR$/lib/generate-suggestions.test.ts" />
|
|
64
|
+
<method v="2" />
|
|
65
|
+
</configuration>
|
|
66
|
+
<recent_temporary>
|
|
67
|
+
<list>
|
|
68
|
+
<item itemvalue="Jest.generate-suggestions.test.ts" />
|
|
69
|
+
</list>
|
|
70
|
+
</recent_temporary>
|
|
71
|
+
</component>
|
|
40
72
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
|
41
73
|
<component name="TaskManager">
|
|
42
74
|
<task active="true" id="Default" summary="Default task">
|
|
@@ -52,6 +84,17 @@
|
|
|
52
84
|
<workItem from="1685980367078" duration="303000" />
|
|
53
85
|
<workItem from="1685980682884" duration="824000" />
|
|
54
86
|
<workItem from="1685986712012" duration="5115000" />
|
|
87
|
+
<workItem from="1686000886228" duration="2633000" />
|
|
88
|
+
<workItem from="1686069506429" duration="76000" />
|
|
89
|
+
<workItem from="1686087849012" duration="140000" />
|
|
90
|
+
<workItem from="1686168915499" duration="2643000" />
|
|
91
|
+
<workItem from="1686172029566" duration="5629000" />
|
|
92
|
+
<workItem from="1686604031092" duration="6110000" />
|
|
93
|
+
<workItem from="1686665537695" duration="7000" />
|
|
94
|
+
<workItem from="1686666962638" duration="1318000" />
|
|
95
|
+
<workItem from="1686672751040" duration="103000" />
|
|
96
|
+
<workItem from="1686758001057" duration="1199000" />
|
|
97
|
+
<workItem from="1686764622070" duration="41000" />
|
|
55
98
|
</task>
|
|
56
99
|
<task id="LOCAL-00001" summary="Remove eslint">
|
|
57
100
|
<created>1685986802039</created>
|
|
@@ -74,7 +117,70 @@
|
|
|
74
117
|
<option name="project" value="LOCAL" />
|
|
75
118
|
<updated>1685993770336</updated>
|
|
76
119
|
</task>
|
|
77
|
-
<
|
|
120
|
+
<task id="LOCAL-00004" summary="Add command to show component-folders">
|
|
121
|
+
<created>1686001523646</created>
|
|
122
|
+
<option name="number" value="00004" />
|
|
123
|
+
<option name="presentableId" value="LOCAL-00004" />
|
|
124
|
+
<option name="project" value="LOCAL" />
|
|
125
|
+
<updated>1686001523646</updated>
|
|
126
|
+
</task>
|
|
127
|
+
<task id="LOCAL-00005" summary="Command description">
|
|
128
|
+
<created>1686002294377</created>
|
|
129
|
+
<option name="number" value="00005" />
|
|
130
|
+
<option name="presentableId" value="LOCAL-00005" />
|
|
131
|
+
<option name="project" value="LOCAL" />
|
|
132
|
+
<updated>1686002294377</updated>
|
|
133
|
+
</task>
|
|
134
|
+
<task id="LOCAL-00006" summary="Stringify print">
|
|
135
|
+
<created>1686069574434</created>
|
|
136
|
+
<option name="number" value="00006" />
|
|
137
|
+
<option name="presentableId" value="LOCAL-00006" />
|
|
138
|
+
<option name="project" value="LOCAL" />
|
|
139
|
+
<updated>1686069574434</updated>
|
|
140
|
+
</task>
|
|
141
|
+
<task id="LOCAL-00007" summary="Add import-component function">
|
|
142
|
+
<created>1686238984111</created>
|
|
143
|
+
<option name="number" value="00007" />
|
|
144
|
+
<option name="presentableId" value="LOCAL-00007" />
|
|
145
|
+
<option name="project" value="LOCAL" />
|
|
146
|
+
<updated>1686238984111</updated>
|
|
147
|
+
</task>
|
|
148
|
+
<task id="LOCAL-00008" summary="simplify generate-suggestions flag passing">
|
|
149
|
+
<created>1686244114837</created>
|
|
150
|
+
<option name="number" value="00008" />
|
|
151
|
+
<option name="presentableId" value="LOCAL-00008" />
|
|
152
|
+
<option name="project" value="LOCAL" />
|
|
153
|
+
<updated>1686244114837</updated>
|
|
154
|
+
</task>
|
|
155
|
+
<task id="LOCAL-00009" summary="Add import-components command">
|
|
156
|
+
<created>1686611039840</created>
|
|
157
|
+
<option name="number" value="00009" />
|
|
158
|
+
<option name="presentableId" value="LOCAL-00009" />
|
|
159
|
+
<option name="project" value="LOCAL" />
|
|
160
|
+
<updated>1686611039840</updated>
|
|
161
|
+
</task>
|
|
162
|
+
<task id="LOCAL-00010" summary="Add flag check for csv files">
|
|
163
|
+
<created>1686667259055</created>
|
|
164
|
+
<option name="number" value="00010" />
|
|
165
|
+
<option name="presentableId" value="LOCAL-00010" />
|
|
166
|
+
<option name="project" value="LOCAL" />
|
|
167
|
+
<updated>1686667259055</updated>
|
|
168
|
+
</task>
|
|
169
|
+
<task id="LOCAL-00011" summary="Add (.csv format only)">
|
|
170
|
+
<created>1686758043695</created>
|
|
171
|
+
<option name="number" value="00011" />
|
|
172
|
+
<option name="presentableId" value="LOCAL-00011" />
|
|
173
|
+
<option name="project" value="LOCAL" />
|
|
174
|
+
<updated>1686758043695</updated>
|
|
175
|
+
</task>
|
|
176
|
+
<task id="LOCAL-00012" summary="Add remaining column mappings">
|
|
177
|
+
<created>1686758202293</created>
|
|
178
|
+
<option name="number" value="00012" />
|
|
179
|
+
<option name="presentableId" value="LOCAL-00012" />
|
|
180
|
+
<option name="project" value="LOCAL" />
|
|
181
|
+
<updated>1686758202293</updated>
|
|
182
|
+
</task>
|
|
183
|
+
<option name="localTasksCounter" value="13" />
|
|
78
184
|
<servers />
|
|
79
185
|
</component>
|
|
80
186
|
<component name="TypeScriptGeneratedFilesManager">
|
|
@@ -96,6 +202,19 @@
|
|
|
96
202
|
<MESSAGE value="Remove eslint" />
|
|
97
203
|
<MESSAGE value="Add -cf flag to generate-suggestions" />
|
|
98
204
|
<MESSAGE value="Remove redundant variable" />
|
|
99
|
-
<
|
|
205
|
+
<MESSAGE value="Add command to show component-folders" />
|
|
206
|
+
<MESSAGE value="Command description" />
|
|
207
|
+
<MESSAGE value="Stringify print" />
|
|
208
|
+
<MESSAGE value="Add import-component function" />
|
|
209
|
+
<MESSAGE value="simplify generate-suggestions flag passing" />
|
|
210
|
+
<MESSAGE value="Add import-components command" />
|
|
211
|
+
<MESSAGE value="Add flag check for csv files" />
|
|
212
|
+
<MESSAGE value="Add (.csv format only)" />
|
|
213
|
+
<MESSAGE value="Add remaining column mappings" />
|
|
214
|
+
<option name="LAST_COMMIT_MESSAGE" value="Add remaining column mappings" />
|
|
215
|
+
</component>
|
|
216
|
+
<component name="XSLT-Support.FileAssociations.UIState">
|
|
217
|
+
<expand />
|
|
218
|
+
<select />
|
|
100
219
|
</component>
|
|
101
220
|
</project>
|
package/README.md
CHANGED
|
@@ -84,6 +84,28 @@ For more details on files generated by this command, see [Output Files](#output-
|
|
|
84
84
|
|
|
85
85
|
**Action:** Lists projects in `config.yml` and permits selecting one to remove from `config.yml` via an interactive prompt.
|
|
86
86
|
|
|
87
|
+
### Component folders
|
|
88
|
+
|
|
89
|
+
**Usage:** `ditto-cli component-folders`
|
|
90
|
+
|
|
91
|
+
**Action:** List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.
|
|
92
|
+
|
|
93
|
+
### Import components
|
|
94
|
+
|
|
95
|
+
**Usage:** `ditto-cli import-components <file_path>`
|
|
96
|
+
|
|
97
|
+
**Action:** Import components via a file. Please see https://www.dittowords.com/docs/importing-string-files for more information.
|
|
98
|
+
When [importing CSV files](https://www.dittowords.com/docs/importing-csv-files), the follow parameters are applicable:
|
|
99
|
+
```
|
|
100
|
+
-t, --text [value] Text column index (Required)
|
|
101
|
+
-n, --component-name [value] Name column indexes (comma separated) (Required)
|
|
102
|
+
-no, --notes [value] Notes column index
|
|
103
|
+
-t, --tags [value] Tags column index
|
|
104
|
+
-s, --status [value] Status column index
|
|
105
|
+
-c, --component-id [value] Component ID column index
|
|
106
|
+
-h, --help display help for command
|
|
107
|
+
```
|
|
108
|
+
|
|
87
109
|
## Configuration
|
|
88
110
|
|
|
89
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.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.showComponentFolders = void 0;
|
|
4
|
+
const fetchComponentFolders_1 = require("./http/fetchComponentFolders");
|
|
5
|
+
async function showComponentFolders() {
|
|
6
|
+
const folders = await (0, fetchComponentFolders_1.fetchComponentFolders)();
|
|
7
|
+
console.log(JSON.stringify(folders));
|
|
8
|
+
}
|
|
9
|
+
exports.showComponentFolders = showComponentFolders;
|
|
10
|
+
//# sourceMappingURL=component-folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-folders.js","sourceRoot":"","sources":["../lib/component-folders.ts"],"names":[],"mappings":";;;AAAA,wEAAqE;AAErE,KAAK,UAAU,oBAAoB;IACjC,MAAM,OAAO,GAAG,MAAM,IAAA,6CAAqB,GAAE,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAEQ,oDAAoB"}
|
package/bin/ditto.js
CHANGED
|
@@ -18,6 +18,8 @@ const remove_project_1 = __importDefault(require("./remove-project"));
|
|
|
18
18
|
const replace_1 = require("./replace");
|
|
19
19
|
const generate_suggestions_1 = require("./generate-suggestions");
|
|
20
20
|
const processMetaOption_1 = __importDefault(require("./utils/processMetaOption"));
|
|
21
|
+
const importComponents_1 = require("./importComponents");
|
|
22
|
+
const component_folders_1 = require("./component-folders");
|
|
21
23
|
function getVersion() {
|
|
22
24
|
const packageJsonPath = path_1.default.join(__dirname, "..", "package.json");
|
|
23
25
|
const packageJsonContent = fs_1.default.readFileSync(packageJsonPath, "utf8");
|
|
@@ -44,6 +46,10 @@ const COMMANDS = [
|
|
|
44
46
|
},
|
|
45
47
|
],
|
|
46
48
|
},
|
|
49
|
+
{
|
|
50
|
+
name: "component-folders",
|
|
51
|
+
description: "List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.",
|
|
52
|
+
},
|
|
47
53
|
{
|
|
48
54
|
name: "generate-suggestions",
|
|
49
55
|
description: "Find text that can be potentially replaced with Ditto text",
|
|
@@ -70,6 +76,30 @@ const COMMANDS = [
|
|
|
70
76
|
},
|
|
71
77
|
},
|
|
72
78
|
},
|
|
79
|
+
{
|
|
80
|
+
name: "import-components",
|
|
81
|
+
description: "Import components via a file. For more information please see: https://www.dittowords.com/docs/importing-string-files.",
|
|
82
|
+
flags: {
|
|
83
|
+
"-t, --text [value]": {
|
|
84
|
+
description: "Text column index (.csv format only)",
|
|
85
|
+
},
|
|
86
|
+
"-n, --component-name [value]": {
|
|
87
|
+
description: "Name column indexes (comma separated) (.csv format only)",
|
|
88
|
+
},
|
|
89
|
+
"-no, --notes [value]": {
|
|
90
|
+
description: "Notes column index (.csv format only)",
|
|
91
|
+
},
|
|
92
|
+
"-t, --tags [value]": {
|
|
93
|
+
description: "Tags column index (.csv format only)",
|
|
94
|
+
},
|
|
95
|
+
"-s, --status [value]": {
|
|
96
|
+
description: "Status column index (.csv format only)",
|
|
97
|
+
},
|
|
98
|
+
"-c, --component-id [value]": {
|
|
99
|
+
description: "Component ID column index (.csv format only)",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
73
103
|
];
|
|
74
104
|
const setupCommands = () => {
|
|
75
105
|
commander_1.program.name("ditto-cli");
|
|
@@ -138,11 +168,14 @@ const executeCommand = async (command, options) => {
|
|
|
138
168
|
case "project remove": {
|
|
139
169
|
return (0, remove_project_1.default)();
|
|
140
170
|
}
|
|
171
|
+
case "component-folders": {
|
|
172
|
+
return (0, component_folders_1.showComponentFolders)();
|
|
173
|
+
}
|
|
141
174
|
case "generate-suggestions": {
|
|
142
175
|
return (0, generate_suggestions_1.generateSuggestions)({
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
176
|
+
directory: options.directory,
|
|
177
|
+
files: options.files,
|
|
178
|
+
componentFolder: options.componentFolder,
|
|
146
179
|
});
|
|
147
180
|
}
|
|
148
181
|
case "replace": {
|
|
@@ -150,6 +183,22 @@ const executeCommand = async (command, options) => {
|
|
|
150
183
|
...(options?.lineNumbers ? { lineNumbers: options.lineNumbers } : {}),
|
|
151
184
|
});
|
|
152
185
|
}
|
|
186
|
+
case "import-components": {
|
|
187
|
+
if (options.args.length === 0) {
|
|
188
|
+
console.info("Please provide a file path.");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
return (0, importComponents_1.importComponents)(options.args[0], {
|
|
192
|
+
csvColumnMapping: {
|
|
193
|
+
name: options.componentName,
|
|
194
|
+
text: options.text,
|
|
195
|
+
notes: options.notes,
|
|
196
|
+
tags: options.tags,
|
|
197
|
+
status: options.status,
|
|
198
|
+
componentId: options.componentId,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
153
202
|
default: {
|
|
154
203
|
(0, quit_1.quit)("Exiting Ditto CLI...");
|
|
155
204
|
return;
|
package/bin/ditto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ditto.js","sourceRoot":"","sources":["../lib/ditto.ts"],"names":[],"mappings":";;;;;;AACA,0DAA0D;AAC1D,yCAAoC;AACpC,wDAAwD;AACxD,4BAA0B;AAC1B,4CAAoB;AACpB,gDAAwB;AAExB,sCAAuD;AACvD,iCAA8B;AAC9B,uCAAoC;AACpC,gEAAuC;AACvC,sEAA6C;AAC7C,uCAAoC;AACpC,iEAA6D;AAE7D,kFAA0D;
|
|
1
|
+
{"version":3,"file":"ditto.js","sourceRoot":"","sources":["../lib/ditto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchComponentFolders = void 0;
|
|
4
|
+
const api_1 = require("../api");
|
|
5
|
+
async function fetchComponentFolders() {
|
|
6
|
+
const api = (0, api_1.createApiClient)();
|
|
7
|
+
const { data } = await api.get("/component-folders", {});
|
|
8
|
+
return data;
|
|
9
|
+
}
|
|
10
|
+
exports.fetchComponentFolders = fetchComponentFolders;
|
|
11
|
+
//# sourceMappingURL=fetchComponentFolders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchComponentFolders.js","sourceRoot":"","sources":["../../lib/http/fetchComponentFolders.ts"],"names":[],"mappings":";;;AAAA,gCAAyC;AAMlC,KAAK,UAAU,qBAAqB;IACzC,MAAM,GAAG,GAAG,IAAA,qBAAe,GAAE,CAAC;IAE9B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAC5B,oBAAoB,EACpB,EAAE,CACH,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AATD,sDASC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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.importComponents = void 0;
|
|
7
|
+
const api_1 = require("../api");
|
|
8
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
async function importComponents(path, options) {
|
|
11
|
+
const api = (0, api_1.createApiClient)();
|
|
12
|
+
const form = new form_data_1.default();
|
|
13
|
+
form.append("import", fs_1.default.createReadStream(path));
|
|
14
|
+
const requestOptions = {
|
|
15
|
+
method: "POST",
|
|
16
|
+
url: "/v1/components/file",
|
|
17
|
+
params: {
|
|
18
|
+
...(options.csvColumnMapping?.name
|
|
19
|
+
? { name: `[${options.csvColumnMapping.name}]` }
|
|
20
|
+
: {}),
|
|
21
|
+
...(options.csvColumnMapping?.text
|
|
22
|
+
? { text: options.csvColumnMapping.text }
|
|
23
|
+
: {}),
|
|
24
|
+
...(options.csvColumnMapping?.notes
|
|
25
|
+
? { notes: options.csvColumnMapping.notes }
|
|
26
|
+
: {}),
|
|
27
|
+
...(options.csvColumnMapping?.status
|
|
28
|
+
? { status: options.csvColumnMapping.status }
|
|
29
|
+
: {}),
|
|
30
|
+
...(options.csvColumnMapping?.tags
|
|
31
|
+
? { tags: options.csvColumnMapping.tags }
|
|
32
|
+
: {}),
|
|
33
|
+
...(options.csvColumnMapping?.componentId
|
|
34
|
+
? { componentId: options.csvColumnMapping.componentId }
|
|
35
|
+
: {}),
|
|
36
|
+
},
|
|
37
|
+
headers: {
|
|
38
|
+
"content-type": "multipart/form-data",
|
|
39
|
+
},
|
|
40
|
+
data: form,
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
const { data } = await api(requestOptions);
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
console.error("Failed to import file.");
|
|
48
|
+
console.error(e.response?.data?.message || e.message);
|
|
49
|
+
return {
|
|
50
|
+
componentsInserted: 0,
|
|
51
|
+
firstImportedId: "null",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.importComponents = importComponents;
|
|
56
|
+
//# sourceMappingURL=importComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importComponents.js","sourceRoot":"","sources":["../../lib/http/importComponents.ts"],"names":[],"mappings":";;;;;;AAAA,gCAAyC;AACzC,0DAAiC;AACjC,4CAAoB;AAgBb,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,OAEC;IAED,MAAM,GAAG,GAAG,IAAA,qBAAe,GAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAI,mBAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjD,MAAM,cAAc,GAAG;QACrB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,qBAAqB;QAC1B,MAAM,EAAE;YACN,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI;gBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE;gBAChD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI;gBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBACzC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK;gBACjC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM;gBAClC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE;gBAC7C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI;gBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBACzC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW;gBACvC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE;gBACvD,CAAC,CAAC,EAAE,CAAC;SACR;QACD,OAAO,EAAE;YACP,cAAc,EAAE,qBAAqB;SACtC;QACD,IAAI,EAAE,IAAI;KACX,CAAC;IAEF,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,CAAC;QAE3C,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO;YACL,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,MAAM;SACxB,CAAC;KACH;AACH,CAAC;AApDD,4CAoDC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.importComponents = void 0;
|
|
4
|
+
const importComponents_1 = require("./http/importComponents");
|
|
5
|
+
async function importComponents(filePath, options) {
|
|
6
|
+
if (filePath.endsWith(".csv") &&
|
|
7
|
+
(!options.csvColumnMapping?.name || !options.csvColumnMapping?.text)) {
|
|
8
|
+
throw new Error(".csv files require the --component-name and --text flags.");
|
|
9
|
+
}
|
|
10
|
+
const importResult = await (0, importComponents_1.importComponents)(filePath, options);
|
|
11
|
+
console.log(JSON.stringify(importResult));
|
|
12
|
+
}
|
|
13
|
+
exports.importComponents = importComponents;
|
|
14
|
+
//# sourceMappingURL=importComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importComponents.js","sourceRoot":"","sources":["../lib/importComponents.ts"],"names":[],"mappings":";;;AAAA,8DAGiC;AAEjC,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,OAEC;IAED,IACE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,EACpE;QACA,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;KACH;IACD,MAAM,YAAY,GAAG,MAAM,IAAA,mCAAoB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,CAAC;AAEQ,4CAAgB"}
|
package/lib/ditto.ts
CHANGED
|
@@ -15,6 +15,8 @@ import { replace } from "./replace";
|
|
|
15
15
|
import { generateSuggestions } from "./generate-suggestions";
|
|
16
16
|
|
|
17
17
|
import processMetaOption from "./utils/processMetaOption";
|
|
18
|
+
import { importComponents } from "./importComponents";
|
|
19
|
+
import { showComponentFolders } from "./component-folders";
|
|
18
20
|
|
|
19
21
|
function getVersion(): string {
|
|
20
22
|
const packageJsonPath = path.join(__dirname, "..", "package.json");
|
|
@@ -30,8 +32,10 @@ type Command =
|
|
|
30
32
|
| "project"
|
|
31
33
|
| "project add"
|
|
32
34
|
| "project remove"
|
|
35
|
+
| "component-folders"
|
|
33
36
|
| "generate-suggestions"
|
|
34
|
-
| "replace"
|
|
37
|
+
| "replace"
|
|
38
|
+
| "import-components";
|
|
35
39
|
|
|
36
40
|
interface CommandConfig<T extends Command | "add" | "remove"> {
|
|
37
41
|
name: T;
|
|
@@ -61,6 +65,11 @@ const COMMANDS: CommandConfig<Command>[] = [
|
|
|
61
65
|
},
|
|
62
66
|
],
|
|
63
67
|
},
|
|
68
|
+
{
|
|
69
|
+
name: "component-folders",
|
|
70
|
+
description:
|
|
71
|
+
"List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.",
|
|
72
|
+
},
|
|
64
73
|
{
|
|
65
74
|
name: "generate-suggestions",
|
|
66
75
|
description: "Find text that can be potentially replaced with Ditto text",
|
|
@@ -87,6 +96,31 @@ const COMMANDS: CommandConfig<Command>[] = [
|
|
|
87
96
|
},
|
|
88
97
|
},
|
|
89
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: "import-components",
|
|
101
|
+
description:
|
|
102
|
+
"Import components via a file. For more information please see: https://www.dittowords.com/docs/importing-string-files.",
|
|
103
|
+
flags: {
|
|
104
|
+
"-t, --text [value]": {
|
|
105
|
+
description: "Text column index (.csv format only)",
|
|
106
|
+
},
|
|
107
|
+
"-n, --component-name [value]": {
|
|
108
|
+
description: "Name column indexes (comma separated) (.csv format only)",
|
|
109
|
+
},
|
|
110
|
+
"-no, --notes [value]": {
|
|
111
|
+
description: "Notes column index (.csv format only)",
|
|
112
|
+
},
|
|
113
|
+
"-t, --tags [value]": {
|
|
114
|
+
description: "Tags column index (.csv format only)",
|
|
115
|
+
},
|
|
116
|
+
"-s, --status [value]": {
|
|
117
|
+
description: "Status column index (.csv format only)",
|
|
118
|
+
},
|
|
119
|
+
"-c, --component-id [value]": {
|
|
120
|
+
description: "Component ID column index (.csv format only)",
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
90
124
|
];
|
|
91
125
|
|
|
92
126
|
const setupCommands = () => {
|
|
@@ -169,11 +203,14 @@ const executeCommand = async (
|
|
|
169
203
|
case "project remove": {
|
|
170
204
|
return removeProject();
|
|
171
205
|
}
|
|
206
|
+
case "component-folders": {
|
|
207
|
+
return showComponentFolders();
|
|
208
|
+
}
|
|
172
209
|
case "generate-suggestions": {
|
|
173
210
|
return generateSuggestions({
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
211
|
+
directory: options.directory,
|
|
212
|
+
files: options.files,
|
|
213
|
+
componentFolder: options.componentFolder,
|
|
177
214
|
});
|
|
178
215
|
}
|
|
179
216
|
case "replace": {
|
|
@@ -181,6 +218,22 @@ const executeCommand = async (
|
|
|
181
218
|
...(options?.lineNumbers ? { lineNumbers: options.lineNumbers } : {}),
|
|
182
219
|
});
|
|
183
220
|
}
|
|
221
|
+
case "import-components": {
|
|
222
|
+
if (options.args.length === 0) {
|
|
223
|
+
console.info("Please provide a file path.");
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
return importComponents(options.args[0], {
|
|
227
|
+
csvColumnMapping: {
|
|
228
|
+
name: options.componentName,
|
|
229
|
+
text: options.text,
|
|
230
|
+
notes: options.notes,
|
|
231
|
+
tags: options.tags,
|
|
232
|
+
status: options.status,
|
|
233
|
+
componentId: options.componentId,
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
184
237
|
default: {
|
|
185
238
|
quit("Exiting Ditto CLI...");
|
|
186
239
|
return;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createApiClient } from "../api";
|
|
2
|
+
|
|
3
|
+
interface FetchComponentFoldersResponse {
|
|
4
|
+
[id: string]: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export async function fetchComponentFolders(): Promise<FetchComponentFoldersResponse> {
|
|
8
|
+
const api = createApiClient();
|
|
9
|
+
|
|
10
|
+
const { data } = await api.get<FetchComponentFoldersResponse>(
|
|
11
|
+
"/component-folders",
|
|
12
|
+
{}
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createApiClient } from "../api";
|
|
2
|
+
import FormData from "form-data";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
|
|
5
|
+
export interface ImportComponentResponse {
|
|
6
|
+
componentsInserted: number;
|
|
7
|
+
firstImportedId: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface CsvColumnMapping {
|
|
11
|
+
text: number;
|
|
12
|
+
name: string;
|
|
13
|
+
notes?: number;
|
|
14
|
+
tags?: number;
|
|
15
|
+
status?: number;
|
|
16
|
+
componentId?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function importComponents(
|
|
20
|
+
path: string,
|
|
21
|
+
options: {
|
|
22
|
+
csvColumnMapping?: CsvColumnMapping;
|
|
23
|
+
}
|
|
24
|
+
): Promise<ImportComponentResponse> {
|
|
25
|
+
const api = createApiClient();
|
|
26
|
+
|
|
27
|
+
const form = new FormData();
|
|
28
|
+
form.append("import", fs.createReadStream(path));
|
|
29
|
+
|
|
30
|
+
const requestOptions = {
|
|
31
|
+
method: "POST",
|
|
32
|
+
url: "/v1/components/file",
|
|
33
|
+
params: {
|
|
34
|
+
...(options.csvColumnMapping?.name
|
|
35
|
+
? { name: `[${options.csvColumnMapping.name}]` }
|
|
36
|
+
: {}),
|
|
37
|
+
...(options.csvColumnMapping?.text
|
|
38
|
+
? { text: options.csvColumnMapping.text }
|
|
39
|
+
: {}),
|
|
40
|
+
...(options.csvColumnMapping?.notes
|
|
41
|
+
? { notes: options.csvColumnMapping.notes }
|
|
42
|
+
: {}),
|
|
43
|
+
...(options.csvColumnMapping?.status
|
|
44
|
+
? { status: options.csvColumnMapping.status }
|
|
45
|
+
: {}),
|
|
46
|
+
...(options.csvColumnMapping?.tags
|
|
47
|
+
? { tags: options.csvColumnMapping.tags }
|
|
48
|
+
: {}),
|
|
49
|
+
...(options.csvColumnMapping?.componentId
|
|
50
|
+
? { componentId: options.csvColumnMapping.componentId }
|
|
51
|
+
: {}),
|
|
52
|
+
},
|
|
53
|
+
headers: {
|
|
54
|
+
"content-type": "multipart/form-data",
|
|
55
|
+
},
|
|
56
|
+
data: form,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const { data } = await api(requestOptions);
|
|
61
|
+
|
|
62
|
+
return data;
|
|
63
|
+
} catch (e: any) {
|
|
64
|
+
console.error("Failed to import file.");
|
|
65
|
+
console.error(e.response?.data?.message || e.message);
|
|
66
|
+
return {
|
|
67
|
+
componentsInserted: 0,
|
|
68
|
+
firstImportedId: "null",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CsvColumnMapping,
|
|
3
|
+
importComponents as importComponentsHttp,
|
|
4
|
+
} from "./http/importComponents";
|
|
5
|
+
|
|
6
|
+
async function importComponents(
|
|
7
|
+
filePath: string,
|
|
8
|
+
options: {
|
|
9
|
+
csvColumnMapping?: CsvColumnMapping;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
if (
|
|
13
|
+
filePath.endsWith(".csv") &&
|
|
14
|
+
(!options.csvColumnMapping?.name || !options.csvColumnMapping?.text)
|
|
15
|
+
) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
".csv files require the --component-name and --text flags."
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
const importResult = await importComponentsHttp(filePath, options);
|
|
21
|
+
console.log(JSON.stringify(importResult));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { importComponents };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dittowords/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "Command Line Interface for Ditto (dittowords.com).",
|
|
5
5
|
"main": "bin/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"commander": "^6.1.0",
|
|
63
63
|
"enquirer": "^2.3.6",
|
|
64
64
|
"faker": "^5.1.0",
|
|
65
|
+
"form-data": "^4.0.0",
|
|
65
66
|
"fs-extra": "^11.1.1",
|
|
66
67
|
"glob": "^9.3.4",
|
|
67
68
|
"js-yaml": "^4.1.0",
|