@dittowords/cli 4.5.2 → 5.0.0-beta.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 (171) hide show
  1. package/README.md +6 -5
  2. package/bin/ditto.js +110 -285
  3. package/package.json +16 -10
  4. package/.github/actions/install-node-dependencies/action.yml +0 -24
  5. package/.github/workflows/required-checks.yml +0 -24
  6. package/.husky/pre-commit +0 -4
  7. package/.prettierignore +0 -0
  8. package/.prettierrc.json +0 -1
  9. package/__mocks__/fs.js +0 -2
  10. package/babel.config.js +0 -6
  11. package/bin/__mocks__/api.js +0 -48
  12. package/bin/__mocks__/api.js.map +0 -1
  13. package/bin/add-project.js +0 -104
  14. package/bin/add-project.js.map +0 -1
  15. package/bin/api.js +0 -54
  16. package/bin/api.js.map +0 -1
  17. package/bin/component-folders.js +0 -59
  18. package/bin/component-folders.js.map +0 -1
  19. package/bin/config.js +0 -242
  20. package/bin/config.js.map +0 -1
  21. package/bin/config.test.js +0 -93
  22. package/bin/config.test.js.map +0 -1
  23. package/bin/consts.js +0 -57
  24. package/bin/consts.js.map +0 -1
  25. package/bin/ditto.js.map +0 -1
  26. package/bin/generate-suggestions.js +0 -183
  27. package/bin/generate-suggestions.js.map +0 -1
  28. package/bin/generate-suggestions.test.js +0 -200
  29. package/bin/generate-suggestions.test.js.map +0 -1
  30. package/bin/http/__mocks__/fetchComponentFolders.js +0 -71
  31. package/bin/http/__mocks__/fetchComponentFolders.js.map +0 -1
  32. package/bin/http/__mocks__/fetchComponents.js +0 -73
  33. package/bin/http/__mocks__/fetchComponents.js.map +0 -1
  34. package/bin/http/__mocks__/fetchVariants.js +0 -71
  35. package/bin/http/__mocks__/fetchVariants.js.map +0 -1
  36. package/bin/http/fetchComponentFolders.js +0 -64
  37. package/bin/http/fetchComponentFolders.js.map +0 -1
  38. package/bin/http/fetchComponents.js +0 -78
  39. package/bin/http/fetchComponents.js.map +0 -1
  40. package/bin/http/fetchVariants.js +0 -87
  41. package/bin/http/fetchVariants.js.map +0 -1
  42. package/bin/http/http.test.js +0 -159
  43. package/bin/http/http.test.js.map +0 -1
  44. package/bin/http/importComponents.js +0 -114
  45. package/bin/http/importComponents.js.map +0 -1
  46. package/bin/importComponents.js +0 -65
  47. package/bin/importComponents.js.map +0 -1
  48. package/bin/init/init.js +0 -126
  49. package/bin/init/init.js.map +0 -1
  50. package/bin/init/project.js +0 -182
  51. package/bin/init/project.js.map +0 -1
  52. package/bin/init/project.test.js +0 -26
  53. package/bin/init/project.test.js.map +0 -1
  54. package/bin/init/token.js +0 -196
  55. package/bin/init/token.js.map +0 -1
  56. package/bin/init/token.test.js +0 -147
  57. package/bin/init/token.test.js.map +0 -1
  58. package/bin/output.js +0 -76
  59. package/bin/output.js.map +0 -1
  60. package/bin/pull-lib.test.js +0 -379
  61. package/bin/pull-lib.test.js.map +0 -1
  62. package/bin/pull.js +0 -562
  63. package/bin/pull.js.map +0 -1
  64. package/bin/pull.test.js +0 -151
  65. package/bin/pull.test.js.map +0 -1
  66. package/bin/remove-project.js +0 -99
  67. package/bin/remove-project.js.map +0 -1
  68. package/bin/replace.js +0 -171
  69. package/bin/replace.js.map +0 -1
  70. package/bin/replace.test.js +0 -197
  71. package/bin/replace.test.js.map +0 -1
  72. package/bin/types.js +0 -21
  73. package/bin/types.js.map +0 -1
  74. package/bin/utils/cleanFileName.js +0 -40
  75. package/bin/utils/cleanFileName.js.map +0 -1
  76. package/bin/utils/cleanFileName.test.js +0 -15
  77. package/bin/utils/cleanFileName.test.js.map +0 -1
  78. package/bin/utils/createSentryContext.js +0 -43
  79. package/bin/utils/createSentryContext.js.map +0 -1
  80. package/bin/utils/determineModuleType.js +0 -79
  81. package/bin/utils/determineModuleType.js.map +0 -1
  82. package/bin/utils/determineModuleType.test.js +0 -60
  83. package/bin/utils/determineModuleType.test.js.map +0 -1
  84. package/bin/utils/generateIOSBundles.js +0 -147
  85. package/bin/utils/generateIOSBundles.js.map +0 -1
  86. package/bin/utils/generateJsDriver.js +0 -178
  87. package/bin/utils/generateJsDriver.js.map +0 -1
  88. package/bin/utils/generateJsDriverTypeFile.js +0 -105
  89. package/bin/utils/generateJsDriverTypeFile.js.map +0 -1
  90. package/bin/utils/generateSwiftDriver.js +0 -93
  91. package/bin/utils/generateSwiftDriver.js.map +0 -1
  92. package/bin/utils/getSelectedProjects.js +0 -67
  93. package/bin/utils/getSelectedProjects.js.map +0 -1
  94. package/bin/utils/processMetaOption.js +0 -40
  95. package/bin/utils/processMetaOption.js.map +0 -1
  96. package/bin/utils/processMetaOption.test.js +0 -45
  97. package/bin/utils/processMetaOption.test.js.map +0 -1
  98. package/bin/utils/projectsToText.js +0 -58
  99. package/bin/utils/projectsToText.js.map +0 -1
  100. package/bin/utils/promptForProject.js +0 -96
  101. package/bin/utils/promptForProject.js.map +0 -1
  102. package/bin/utils/quit.js +0 -73
  103. package/bin/utils/quit.js.map +0 -1
  104. package/bin/utils/sourcesToText.js +0 -57
  105. package/bin/utils/sourcesToText.js.map +0 -1
  106. package/etsc.config.js +0 -13
  107. package/jest.config.ts +0 -16
  108. package/jsconfig.json +0 -5
  109. package/lib/__mocks__/api.ts +0 -12
  110. package/lib/add-project.ts +0 -48
  111. package/lib/api.ts +0 -16
  112. package/lib/component-folders.ts +0 -9
  113. package/lib/config.test.ts +0 -79
  114. package/lib/config.ts +0 -279
  115. package/lib/consts.ts +0 -22
  116. package/lib/ditto.ts +0 -285
  117. package/lib/generate-suggestions.test.ts +0 -169
  118. package/lib/generate-suggestions.ts +0 -166
  119. package/lib/http/__mocks__/fetchComponentFolders.ts +0 -23
  120. package/lib/http/__mocks__/fetchComponents.ts +0 -24
  121. package/lib/http/__mocks__/fetchVariants.ts +0 -21
  122. package/lib/http/fetchComponentFolders.ts +0 -23
  123. package/lib/http/fetchComponents.ts +0 -43
  124. package/lib/http/fetchVariants.ts +0 -42
  125. package/lib/http/http.test.ts +0 -122
  126. package/lib/http/importComponents.ts +0 -79
  127. package/lib/importComponents.ts +0 -24
  128. package/lib/init/init.ts +0 -79
  129. package/lib/init/project.test.ts +0 -26
  130. package/lib/init/project.ts +0 -136
  131. package/lib/init/token.test.ts +0 -99
  132. package/lib/init/token.ts +0 -156
  133. package/lib/output.ts +0 -21
  134. package/lib/pull-lib.test.ts +0 -367
  135. package/lib/pull.test.ts +0 -117
  136. package/lib/pull.ts +0 -629
  137. package/lib/remove-project.ts +0 -44
  138. package/lib/replace.test.ts +0 -157
  139. package/lib/replace.ts +0 -140
  140. package/lib/types.ts +0 -83
  141. package/lib/utils/cleanFileName.test.ts +0 -11
  142. package/lib/utils/cleanFileName.ts +0 -8
  143. package/lib/utils/createSentryContext.ts +0 -20
  144. package/lib/utils/determineModuleType.test.ts +0 -48
  145. package/lib/utils/determineModuleType.ts +0 -55
  146. package/lib/utils/generateIOSBundles.ts +0 -122
  147. package/lib/utils/generateJsDriver.ts +0 -207
  148. package/lib/utils/generateJsDriverTypeFile.ts +0 -75
  149. package/lib/utils/generateSwiftDriver.ts +0 -48
  150. package/lib/utils/getSelectedProjects.ts +0 -36
  151. package/lib/utils/processMetaOption.test.ts +0 -18
  152. package/lib/utils/processMetaOption.ts +0 -16
  153. package/lib/utils/projectsToText.ts +0 -29
  154. package/lib/utils/promptForProject.ts +0 -61
  155. package/lib/utils/quit.ts +0 -7
  156. package/lib/utils/sourcesToText.ts +0 -25
  157. package/pull_request_template.md +0 -20
  158. package/testfiles/en.json +0 -5
  159. package/testfiles/es.json +0 -5
  160. package/testfiles/fr.json +0 -5
  161. package/testfiles/test1.jsx +0 -18
  162. package/testfiles/test2.jsx +0 -9
  163. package/testing/.gitkeep +0 -0
  164. package/testing/fixtures/bad-yaml.yml +0 -6
  165. package/testing/fixtures/ditto-config-no-token +0 -2
  166. package/testing/fixtures/project-config-empty-projects.yml +0 -1
  167. package/testing/fixtures/project-config-no-id.yml +0 -2
  168. package/testing/fixtures/project-config-no-name.yml +0 -2
  169. package/testing/fixtures/project-config-pull.yml +0 -0
  170. package/testing/fixtures/project-config-working.yml +0 -3
  171. package/tsconfig.json +0 -16
package/bin/init/token.js DELETED
@@ -1,196 +0,0 @@
1
- "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3c04a96f-0c67-5e7d-9e40-fd147114ca0b")}catch(e){}}();
3
-
4
- var __create = Object.create;
5
- var __defProp = Object.defineProperty;
6
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
- var __getOwnPropNames = Object.getOwnPropertyNames;
8
- var __getProtoOf = Object.getPrototypeOf;
9
- var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __export = (target, all) => {
11
- for (var name in all)
12
- __defProp(target, name, { get: all[name], enumerable: true });
13
- };
14
- var __copyProps = (to, from, except, desc) => {
15
- if (from && typeof from === "object" || typeof from === "function") {
16
- for (let key of __getOwnPropNames(from))
17
- if (!__hasOwnProp.call(to, key) && key !== except)
18
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
- }
20
- return to;
21
- };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
- // If the importer is in node compatibility mode or this is not an ESM
24
- // file that has been converted to a CommonJS file using a Babel-
25
- // compatible transform (i.e. "__esModule" has not been set), then set
26
- // "default" to the CommonJS "module.exports" for node compatibility.
27
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
- mod
29
- ));
30
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
- var __async = (__this, __arguments, generator) => {
32
- return new Promise((resolve, reject) => {
33
- var fulfilled = (value) => {
34
- try {
35
- step(generator.next(value));
36
- } catch (e) {
37
- reject(e);
38
- }
39
- };
40
- var rejected = (value) => {
41
- try {
42
- step(generator.throw(value));
43
- } catch (e) {
44
- reject(e);
45
- }
46
- };
47
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
48
- step((generator = generator.apply(__this, __arguments)).next());
49
- });
50
- };
51
- var token_exports = {};
52
- __export(token_exports, {
53
- _test: () => _test,
54
- collectAndSaveToken: () => collectAndSaveToken,
55
- default: () => token_default,
56
- needsToken: () => needsToken
57
- });
58
- module.exports = __toCommonJS(token_exports);
59
- var import_fs = __toESM(require("fs"));
60
- var Sentry = __toESM(require("@sentry/node"));
61
- var import_chalk = __toESM(require("chalk"));
62
- var import_enquirer = require("enquirer");
63
- var import_api = require("../api");
64
- var import_consts = __toESM(require("../consts"));
65
- var import_output = __toESM(require("../output"));
66
- var import_config = __toESM(require("../config"));
67
- var import_quit = require("../utils/quit");
68
- var import_axios = require("axios");
69
- const needsToken = (configFile, host = import_consts.default.API_HOST) => {
70
- if (import_config.default.getTokenFromEnv()) {
71
- return false;
72
- }
73
- const file = configFile || import_consts.default.CONFIG_FILE;
74
- if (!import_fs.default.existsSync(file))
75
- return true;
76
- const configData = import_config.default.readGlobalConfigData(file);
77
- if (!configData[import_config.default.justTheHost(host)] || configData[import_config.default.justTheHost(host)][0].token === "")
78
- return true;
79
- return false;
80
- };
81
- function verifyTokenUsingTokenCheck(token) {
82
- return __async(this, null, function* () {
83
- var _a, _b;
84
- const axios = (0, import_api.createApiClient)(token);
85
- const endpoint = "/token-check";
86
- let resOrError;
87
- try {
88
- resOrError = yield axios.get(endpoint);
89
- } catch (e) {
90
- if (!(e instanceof import_axios.AxiosError)) {
91
- return {
92
- success: false,
93
- output: [
94
- import_output.default.warnText(
95
- "Sorry! We're having trouble reaching the Ditto API."
96
- )
97
- ]
98
- };
99
- }
100
- if (e.code === "ENOTFOUND") {
101
- return {
102
- success: false,
103
- output: [
104
- import_output.default.errorText(
105
- `Can't connect to API: ${import_output.default.url(import_consts.default.API_HOST)}`
106
- )
107
- ]
108
- };
109
- }
110
- if (((_a = e.response) == null ? void 0 : _a.status) === 401 || ((_b = e.response) == null ? void 0 : _b.status) === 404) {
111
- return {
112
- success: false,
113
- output: [
114
- import_output.default.errorText("This API key isn't valid. Please try another.")
115
- ]
116
- };
117
- }
118
- }
119
- if (typeof resOrError === "string") {
120
- return {
121
- success: false,
122
- output: [resOrError]
123
- };
124
- }
125
- if ((resOrError == null ? void 0 : resOrError.status) === 200) {
126
- return { success: true };
127
- }
128
- return {
129
- success: false,
130
- output: [import_output.default.errorText("This API key isn't valid. Please try another.")]
131
- };
132
- });
133
- }
134
- function checkToken(token) {
135
- return __async(this, null, function* () {
136
- const result = yield verifyTokenUsingTokenCheck(token);
137
- if (!result.success) {
138
- return result.output.join("\n");
139
- }
140
- return true;
141
- });
142
- }
143
- function collectToken(message) {
144
- return __async(this, null, function* () {
145
- const blue = import_output.default.info;
146
- const apiUrl = import_output.default.url("https://app.dittowords.com/account/devtools");
147
- const breadcrumbs = `${import_chalk.default.bold(blue("API Keys"))}`;
148
- const tokenDescription = message || `To get started, you'll need your Ditto API key. You can find this at: ${apiUrl} under "${breadcrumbs}".`;
149
- console.log(tokenDescription);
150
- const response = yield (0, import_enquirer.prompt)({
151
- type: "input",
152
- name: "token",
153
- message: "What is your API key?",
154
- validate: (token) => checkToken(token)
155
- });
156
- return response.token;
157
- });
158
- }
159
- const collectAndSaveToken = (message = null) => __async(void 0, null, function* () {
160
- try {
161
- const token = yield collectToken(message);
162
- console.log(
163
- `Thanks for authenticating. We'll save the key to: ${import_output.default.info(
164
- import_consts.default.CONFIG_FILE
165
- )}`
166
- );
167
- import_output.default.nl();
168
- import_config.default.saveToken(import_consts.default.CONFIG_FILE, import_consts.default.API_HOST, token);
169
- return token;
170
- } catch (error) {
171
- if (error === "") {
172
- yield (0, import_quit.quit)("", 0);
173
- return;
174
- }
175
- const eventId = Sentry.captureException(error);
176
- const eventStr = `
177
-
178
- Error ID: ${import_output.default.info(eventId)}`;
179
- return yield (0, import_quit.quit)(
180
- import_output.default.errorText(
181
- "Something went wrong. Please contact support or try again later."
182
- ) + eventStr
183
- );
184
- }
185
- });
186
- var token_default = { needsToken, collectAndSaveToken };
187
- const _test = { verifyTokenUsingTokenCheck };
188
- // Annotate the CommonJS export names for ESM import in node:
189
- 0 && (module.exports = {
190
- _test,
191
- collectAndSaveToken,
192
- needsToken
193
- });
194
- //# sourceMappingURL=token.js.map
195
-
196
- //# debugId=3c04a96f-0c67-5e7d-9e40-fd147114ca0b
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../lib/init/token.ts"],"sourcesContent":["import fs from \"fs\";\nimport * as Sentry from \"@sentry/node\";\n\nimport chalk from \"chalk\";\n\nimport { prompt } from \"enquirer\";\n\nimport { createApiClient } from \"../api\";\nimport consts from \"../consts\";\nimport output from \"../output\";\nimport config from \"../config\";\nimport { quit } from \"../utils/quit\";\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nexport const needsToken = (configFile?: string, host = consts.API_HOST) => {\n if (config.getTokenFromEnv()) {\n return false;\n }\n\n const file = configFile || consts.CONFIG_FILE;\n if (!fs.existsSync(file)) return true;\n const configData = config.readGlobalConfigData(file);\n if (\n !configData[config.justTheHost(host)] ||\n configData[config.justTheHost(host)][0].token === \"\"\n )\n return true;\n return false;\n};\n\nasync function verifyTokenUsingTokenCheck(\n token: string\n): Promise<{ success: true } | { success: false; output: string[] }> {\n const axios = createApiClient(token);\n const endpoint = \"/token-check\";\n\n let resOrError: AxiosResponse<any> | undefined;\n try {\n resOrError = await axios.get(endpoint);\n } catch (e: unknown) {\n if (!(e instanceof AxiosError)) {\n return {\n success: false,\n output: [\n output.warnText(\n \"Sorry! We're having trouble reaching the Ditto API.\"\n ),\n ],\n };\n }\n\n if (e.code === \"ENOTFOUND\") {\n return {\n success: false,\n output: [\n output.errorText(\n `Can't connect to API: ${output.url(consts.API_HOST)}`\n ),\n ],\n };\n }\n\n if (e.response?.status === 401 || e.response?.status === 404) {\n return {\n success: false,\n output: [\n output.errorText(\"This API key isn't valid. Please try another.\"),\n ],\n };\n }\n }\n\n if (typeof resOrError === \"string\") {\n return {\n success: false,\n output: [resOrError],\n };\n }\n\n if (resOrError?.status === 200) {\n return { success: true };\n }\n\n return {\n success: false,\n output: [output.errorText(\"This API key isn't valid. Please try another.\")],\n };\n}\n\n// Returns true if valid, otherwise an error message.\nasync function checkToken(token: string): Promise<any> {\n const result = await verifyTokenUsingTokenCheck(token);\n if (!result.success) {\n return result.output.join(\"\\n\");\n }\n\n return true;\n}\n\nasync function collectToken(message: string | null) {\n const blue = output.info;\n const apiUrl = output.url(\"https://app.dittowords.com/account/devtools\");\n const breadcrumbs = `${chalk.bold(blue(\"API Keys\"))}`;\n const tokenDescription =\n message ||\n `To get started, you'll need your Ditto API key. You can find this at: ${apiUrl} under \"${breadcrumbs}\".`;\n console.log(tokenDescription);\n\n const response = await prompt<{ token: string }>({\n type: \"input\",\n name: \"token\",\n message: \"What is your API key?\",\n validate: (token) => checkToken(token),\n });\n return response.token;\n}\n\n/**\n *\n * @param {string | null} message\n * @returns\n */\nexport const collectAndSaveToken = async (message: string | null = null) => {\n try {\n const token = await collectToken(message);\n console.log(\n `Thanks for authenticating. We'll save the key to: ${output.info(\n consts.CONFIG_FILE\n )}`\n );\n output.nl();\n\n config.saveToken(consts.CONFIG_FILE, consts.API_HOST, token);\n return token;\n } catch (error) {\n // https://github.com/enquirer/enquirer/issues/225#issue-516043136\n // Empty string corresponds to the user hitting Ctrl + C\n if (error === \"\") {\n await quit(\"\", 0);\n return;\n }\n\n const eventId = Sentry.captureException(error);\n const eventStr = `\\n\\nError ID: ${output.info(eventId)}`;\n\n return await quit(\n output.errorText(\n \"Something went wrong. Please contact support or try again later.\"\n ) + eventStr\n );\n }\n};\n\nexport default { needsToken, collectAndSaveToken };\n\nexport const _test = { verifyTokenUsingTokenCheck };\n"],"names":["consts","config","fs","output","chalk"],"mappings":"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","debug_id":"3c04a96f-0c67-5e7d-9e40-fd147114ca0b"}
@@ -1,147 +0,0 @@
1
- "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1ef8b4a1-dcf4-58eb-9243-783ea548d73c")}catch(e){}}();
3
-
4
- var __create = Object.create;
5
- var __defProp = Object.defineProperty;
6
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
- var __getOwnPropNames = Object.getOwnPropertyNames;
8
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
- var __getProtoOf = Object.getPrototypeOf;
10
- var __hasOwnProp = Object.prototype.hasOwnProperty;
11
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
- var __spreadValues = (a, b) => {
14
- for (var prop in b || (b = {}))
15
- if (__hasOwnProp.call(b, prop))
16
- __defNormalProp(a, prop, b[prop]);
17
- if (__getOwnPropSymbols)
18
- for (var prop of __getOwnPropSymbols(b)) {
19
- if (__propIsEnum.call(b, prop))
20
- __defNormalProp(a, prop, b[prop]);
21
- }
22
- return a;
23
- };
24
- var __copyProps = (to, from, except, desc) => {
25
- if (from && typeof from === "object" || typeof from === "function") {
26
- for (let key of __getOwnPropNames(from))
27
- if (!__hasOwnProp.call(to, key) && key !== except)
28
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
29
- }
30
- return to;
31
- };
32
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
33
- // If the importer is in node compatibility mode or this is not an ESM
34
- // file that has been converted to a CommonJS file using a Babel-
35
- // compatible transform (i.e. "__esModule" has not been set), then set
36
- // "default" to the CommonJS "module.exports" for node compatibility.
37
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
38
- mod
39
- ));
40
- var __async = (__this, __arguments, generator) => {
41
- return new Promise((resolve, reject) => {
42
- var fulfilled = (value) => {
43
- try {
44
- step(generator.next(value));
45
- } catch (e) {
46
- reject(e);
47
- }
48
- };
49
- var rejected = (value) => {
50
- try {
51
- step(generator.throw(value));
52
- } catch (e) {
53
- reject(e);
54
- }
55
- };
56
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
57
- step((generator = generator.apply(__this, __arguments)).next());
58
- });
59
- };
60
- var import_fs = __toESM(require("fs"));
61
- var import_config = __toESM(require("../config"));
62
- var import_crypto = require("crypto");
63
- var import_token = require("./token");
64
- var import_token2 = require("./token");
65
- var import_memfs = require("memfs");
66
- var import_globals = require("@jest/globals");
67
- var import_axios = __toESM(require("axios"));
68
- import_globals.jest.mock("fs");
69
- import_globals.jest.mock("../api");
70
- const axiosMocked = import_globals.jest.mocked(import_axios.default);
71
- const defaultEnv = __spreadValues({}, process.env);
72
- beforeEach(() => {
73
- import_memfs.vol.reset();
74
- process.env = __spreadValues({}, defaultEnv);
75
- });
76
- describe("needsToken", () => {
77
- it("is true if there is no config file", () => {
78
- expect((0, import_token.needsToken)((0, import_crypto.randomUUID)())).toBeTruthy();
79
- });
80
- it("is false if there is a token in the environment", () => {
81
- process.env.DITTO_API_KEY = "xxx-xxx-xxx";
82
- expect((0, import_token.needsToken)((0, import_crypto.randomUUID)())).toBe(false);
83
- });
84
- describe("with a config file", () => {
85
- let configFile = "";
86
- beforeEach(() => __async(exports, null, function* () {
87
- configFile = `/${(0, import_crypto.randomUUID)()}`;
88
- yield new Promise(
89
- (resolve, reject) => import_fs.default.writeFile(configFile, "", (err) => {
90
- if (err)
91
- reject(err);
92
- else {
93
- resolve(null);
94
- }
95
- })
96
- );
97
- }));
98
- it("returns true if empty", () => {
99
- expect((0, import_token.needsToken)(configFile, "testing.dittowords.com")).toBeTruthy();
100
- });
101
- describe("with some data", () => {
102
- beforeEach(() => {
103
- import_config.default.saveToken(configFile, "badtesting.dittowords.com", "faketoken");
104
- });
105
- it("is true if there is no entries for our API host", () => {
106
- expect((0, import_token.needsToken)(configFile, "testing.dittowords.com")).toBeTruthy();
107
- });
108
- it("is false if we have a token listed", () => {
109
- import_config.default.saveToken(configFile, "testing.dittowords.com", "faketoken");
110
- expect((0, import_token.needsToken)(configFile, "testing.dittowords.com")).toBeFalsy();
111
- });
112
- });
113
- it("is true if there is no token listed", () => {
114
- const configNoToken = "../../testing/fixtures/ditto-config-no-token";
115
- expect((0, import_token.needsToken)(configNoToken, "testing.dittowords.com")).toBeTruthy();
116
- });
117
- it("is strips the protocol when writing an entry", () => {
118
- import_config.default.saveToken(
119
- configFile,
120
- "https://testing.dittowords.com",
121
- "faketoken"
122
- );
123
- expect((0, import_token.needsToken)(configFile, "testing.dittowords.com")).toBeFalsy();
124
- });
125
- });
126
- });
127
- const { verifyTokenUsingTokenCheck } = import_token2._test;
128
- describe("verifyTokenUsingTokenCheck", () => {
129
- it("returns success: true for api success response", () => __async(exports, null, function* () {
130
- axiosMocked.get.mockResolvedValueOnce({ status: 200 });
131
- const result = yield verifyTokenUsingTokenCheck("xxx-xxx");
132
- expect(result.success).toBe(true);
133
- }));
134
- it("returns success: false for api unauthorized response", () => __async(exports, null, function* () {
135
- axiosMocked.get.mockResolvedValueOnce({ status: 401 });
136
- const result = yield verifyTokenUsingTokenCheck("xxx-xxx");
137
- expect(result.success).toBe(false);
138
- }));
139
- it("returns success: false for api invalid response", () => __async(exports, null, function* () {
140
- axiosMocked.get.mockResolvedValueOnce("error");
141
- const result = yield verifyTokenUsingTokenCheck("xxx-xxx");
142
- expect(result.success).toBe(false);
143
- }));
144
- });
145
- //# sourceMappingURL=token.test.js.map
146
-
147
- //# debugId=1ef8b4a1-dcf4-58eb-9243-783ea548d73c
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../lib/init/token.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport config from \"../config\";\nimport { randomUUID } from \"crypto\";\nimport { needsToken } from \"./token\";\nimport { _test } from \"./token\";\nimport { vol } from \"memfs\";\nimport { jest } from \"@jest/globals\";\nimport axios from \"axios\";\n\njest.mock(\"fs\");\njest.mock(\"../api\");\n\nconst axiosMocked = jest.mocked(axios);\n\nconst defaultEnv = { ...process.env };\n\nbeforeEach(() => {\n vol.reset();\n process.env = { ...defaultEnv };\n});\n\ndescribe(\"needsToken\", () => {\n it(\"is true if there is no config file\", () => {\n expect(needsToken(randomUUID())).toBeTruthy();\n });\n\n it(\"is false if there is a token in the environment\", () => {\n process.env.DITTO_API_KEY = \"xxx-xxx-xxx\";\n expect(needsToken(randomUUID())).toBe(false);\n });\n\n describe(\"with a config file\", () => {\n let configFile = \"\";\n\n beforeEach(async () => {\n configFile = `/${randomUUID()}`;\n await new Promise((resolve, reject) =>\n fs.writeFile(configFile, \"\", (err) => {\n if (err) reject(err);\n else {\n resolve(null);\n }\n })\n );\n });\n\n it(\"returns true if empty\", () => {\n expect(needsToken(configFile, \"testing.dittowords.com\")).toBeTruthy();\n });\n\n describe(\"with some data\", () => {\n beforeEach(() => {\n config.saveToken(configFile, \"badtesting.dittowords.com\", \"faketoken\");\n });\n\n it(\"is true if there is no entries for our API host\", () => {\n expect(needsToken(configFile, \"testing.dittowords.com\")).toBeTruthy();\n });\n\n it(\"is false if we have a token listed\", () => {\n config.saveToken(configFile, \"testing.dittowords.com\", \"faketoken\");\n expect(needsToken(configFile, \"testing.dittowords.com\")).toBeFalsy();\n });\n });\n\n it(\"is true if there is no token listed\", () => {\n const configNoToken = \"../../testing/fixtures/ditto-config-no-token\";\n expect(needsToken(configNoToken, \"testing.dittowords.com\")).toBeTruthy();\n });\n\n it(\"is strips the protocol when writing an entry\", () => {\n config.saveToken(\n configFile,\n \"https://testing.dittowords.com\",\n \"faketoken\"\n );\n expect(needsToken(configFile, \"testing.dittowords.com\")).toBeFalsy();\n });\n });\n});\n\nconst { verifyTokenUsingTokenCheck } = _test;\ndescribe(\"verifyTokenUsingTokenCheck\", () => {\n it(\"returns success: true for api success response\", async () => {\n axiosMocked.get.mockResolvedValueOnce({ status: 200 });\n const result = await verifyTokenUsingTokenCheck(\"xxx-xxx\");\n expect(result.success).toBe(true);\n });\n it(\"returns success: false for api unauthorized response\", async () => {\n axiosMocked.get.mockResolvedValueOnce({ status: 401 });\n const result = await verifyTokenUsingTokenCheck(\"xxx-xxx\");\n expect(result.success).toBe(false);\n });\n it(\"returns success: false for api invalid response\", async () => {\n axiosMocked.get.mockResolvedValueOnce(\"error\");\n const result = await verifyTokenUsingTokenCheck(\"xxx-xxx\");\n expect(result.success).toBe(false);\n });\n});\n"],"names":["import_token","axios","fs","config"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gBAAe;AACf,oBAAmB;AACnB,oBAA2B;AAC3B,mBAA2B;AAC3B,IAAAA,gBAAsB;AACtB,mBAAoB;AACpB,qBAAqB;AACrB,mBAAkB;AAElB,oBAAK,KAAK,IAAI;AACd,oBAAK,KAAK,QAAQ;AAElB,MAAM,cAAc,oBAAK,OAAO,aAAAC,OAAK;AAErC,MAAM,aAAa,mBAAK,QAAQ;AAEhC,WAAW,MAAM;AACf,mBAAI,MAAM;AACV,UAAQ,MAAM,mBAAK;AACrB,CAAC;AAED,SAAS,cAAc,MAAM;AAC3B,KAAG,sCAAsC,MAAM;AAC7C,eAAO,6BAAW,0BAAW,CAAC,CAAC,EAAE,WAAW;AAAA,EAC9C,CAAC;AAED,KAAG,mDAAmD,MAAM;AAC1D,YAAQ,IAAI,gBAAgB;AAC5B,eAAO,6BAAW,0BAAW,CAAC,CAAC,EAAE,KAAK,KAAK;AAAA,EAC7C,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,QAAI,aAAa;AAEjB,eAAW,MAAY;AACrB,mBAAa,QAAI,0BAAW,CAAC;AAC7B,YAAM,IAAI;AAAA,QAAQ,CAAC,SAAS,WAC1B,UAAAC,QAAG,UAAU,YAAY,IAAI,CAAC,QAAQ;AACpC,cAAI;AAAK,mBAAO,GAAG;AAAA,eACd;AACH,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,EAAC;AAED,OAAG,yBAAyB,MAAM;AAChC,iBAAO,yBAAW,YAAY,wBAAwB,CAAC,EAAE,WAAW;AAAA,IACtE,CAAC;AAED,aAAS,kBAAkB,MAAM;AAC/B,iBAAW,MAAM;AACf,sBAAAC,QAAO,UAAU,YAAY,6BAA6B,WAAW;AAAA,MACvE,CAAC;AAED,SAAG,mDAAmD,MAAM;AAC1D,mBAAO,yBAAW,YAAY,wBAAwB,CAAC,EAAE,WAAW;AAAA,MACtE,CAAC;AAED,SAAG,sCAAsC,MAAM;AAC7C,sBAAAA,QAAO,UAAU,YAAY,0BAA0B,WAAW;AAClE,mBAAO,yBAAW,YAAY,wBAAwB,CAAC,EAAE,UAAU;AAAA,MACrE,CAAC;AAAA,IACH,CAAC;AAED,OAAG,uCAAuC,MAAM;AAC9C,YAAM,gBAAgB;AACtB,iBAAO,yBAAW,eAAe,wBAAwB,CAAC,EAAE,WAAW;AAAA,IACzE,CAAC;AAED,OAAG,gDAAgD,MAAM;AACvD,oBAAAA,QAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,iBAAO,yBAAW,YAAY,wBAAwB,CAAC,EAAE,UAAU;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,MAAM,EAAE,2BAA2B,IAAI;AACvC,SAAS,8BAA8B,MAAM;AAC3C,KAAG,kDAAkD,MAAY;AAC/D,gBAAY,IAAI,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AACrD,UAAM,SAAS,MAAM,2BAA2B,SAAS;AACzD,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC,EAAC;AACD,KAAG,wDAAwD,MAAY;AACrE,gBAAY,IAAI,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AACrD,UAAM,SAAS,MAAM,2BAA2B,SAAS;AACzD,WAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EACnC,EAAC;AACD,KAAG,mDAAmD,MAAY;AAChE,gBAAY,IAAI,sBAAsB,OAAO;AAC7C,UAAM,SAAS,MAAM,2BAA2B,SAAS;AACzD,WAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EACnC,EAAC;AACH,CAAC","debug_id":"1ef8b4a1-dcf4-58eb-9243-783ea548d73c"}
package/bin/output.js DELETED
@@ -1,76 +0,0 @@
1
- "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="55eb6917-59ee-5f13-a6ca-cba2b2ea82dc")}catch(e){}}();
3
-
4
- var __create = Object.create;
5
- var __defProp = Object.defineProperty;
6
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
- var __getOwnPropNames = Object.getOwnPropertyNames;
8
- var __getProtoOf = Object.getPrototypeOf;
9
- var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __export = (target, all) => {
11
- for (var name in all)
12
- __defProp(target, name, { get: all[name], enumerable: true });
13
- };
14
- var __copyProps = (to, from, except, desc) => {
15
- if (from && typeof from === "object" || typeof from === "function") {
16
- for (let key of __getOwnPropNames(from))
17
- if (!__hasOwnProp.call(to, key) && key !== except)
18
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
- }
20
- return to;
21
- };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
- // If the importer is in node compatibility mode or this is not an ESM
24
- // file that has been converted to a CommonJS file using a Babel-
25
- // compatible transform (i.e. "__esModule" has not been set), then set
26
- // "default" to the CommonJS "module.exports" for node compatibility.
27
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
- mod
29
- ));
30
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
- var output_exports = {};
32
- __export(output_exports, {
33
- default: () => output_default,
34
- errorText: () => errorText,
35
- info: () => info,
36
- nl: () => nl,
37
- subtle: () => subtle,
38
- success: () => success,
39
- url: () => url,
40
- warnText: () => warnText,
41
- write: () => write
42
- });
43
- module.exports = __toCommonJS(output_exports);
44
- var import_chalk = __toESM(require("chalk"));
45
- const errorText = (msg) => import_chalk.default.magenta(msg);
46
- const warnText = (msg) => import_chalk.default.yellow(msg);
47
- const info = (msg) => import_chalk.default.blueBright(msg);
48
- const success = (msg) => import_chalk.default.green(msg);
49
- const url = (msg) => import_chalk.default.blueBright.underline(msg);
50
- const subtle = (msg) => import_chalk.default.grey(msg);
51
- const write = (msg) => import_chalk.default.white(msg);
52
- const nl = () => console.log("\n");
53
- var output_default = {
54
- errorText,
55
- warnText,
56
- info,
57
- success,
58
- url,
59
- subtle,
60
- write,
61
- nl
62
- };
63
- // Annotate the CommonJS export names for ESM import in node:
64
- 0 && (module.exports = {
65
- errorText,
66
- info,
67
- nl,
68
- subtle,
69
- success,
70
- url,
71
- warnText,
72
- write
73
- });
74
- //# sourceMappingURL=output.js.map
75
-
76
- //# debugId=55eb6917-59ee-5f13-a6ca-cba2b2ea82dc
package/bin/output.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/output.ts"],"sourcesContent":["import chalk from \"chalk\";\n\nexport const errorText = (msg: string) => chalk.magenta(msg);\nexport const warnText = (msg: string) => chalk.yellow(msg);\nexport const info = (msg: string) => chalk.blueBright(msg);\nexport const success = (msg: string) => chalk.green(msg);\nexport const url = (msg: string) => chalk.blueBright.underline(msg);\nexport const subtle = (msg: string) => chalk.grey(msg);\nexport const write = (msg: string) => chalk.white(msg);\nexport const nl = () => console.log(\"\\n\");\n\nexport default {\n errorText,\n warnText,\n info,\n success,\n url,\n subtle,\n write,\n nl,\n};\n"],"names":["chalk"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAEX,MAAM,YAAY,CAAC,QAAgB,aAAAA,QAAM,QAAQ,GAAG;AACpD,MAAM,WAAW,CAAC,QAAgB,aAAAA,QAAM,OAAO,GAAG;AAClD,MAAM,OAAO,CAAC,QAAgB,aAAAA,QAAM,WAAW,GAAG;AAClD,MAAM,UAAU,CAAC,QAAgB,aAAAA,QAAM,MAAM,GAAG;AAChD,MAAM,MAAM,CAAC,QAAgB,aAAAA,QAAM,WAAW,UAAU,GAAG;AAC3D,MAAM,SAAS,CAAC,QAAgB,aAAAA,QAAM,KAAK,GAAG;AAC9C,MAAM,QAAQ,CAAC,QAAgB,aAAAA,QAAM,MAAM,GAAG;AAC9C,MAAM,KAAK,MAAM,QAAQ,IAAI,IAAI;AAExC,IAAO,iBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF","debug_id":"55eb6917-59ee-5f13-a6ca-cba2b2ea82dc"}