@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
@@ -1,93 +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]="7a21b9a5-efe4-50f7-9b1f-38b0ce5ffb19")}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 __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
- var import_fs = __toESM(require("fs"));
27
- var import_path = __toESM(require("path"));
28
- var import_js_yaml = __toESM(require("js-yaml"));
29
- var import_config = __toESM(require("./config"));
30
- jest.mock("fs");
31
- const fakeHomedir = import_fs.default.mkdtempSync("/config-testing");
32
- describe("Config File", () => {
33
- const expectedConfigDir = import_path.default.join(fakeHomedir, ".config");
34
- beforeEach(() => {
35
- if (!import_fs.default.existsSync(fakeHomedir))
36
- import_fs.default.mkdirSync(fakeHomedir);
37
- });
38
- afterEach(() => {
39
- import_fs.default.rmdirSync(fakeHomedir, { recursive: true });
40
- });
41
- describe("createFileIfMissing", () => {
42
- const expectedConfigFile = import_path.default.join(expectedConfigDir, "ditto");
43
- it("creates a config file if the config dir is missing", () => {
44
- import_config.default.createFileIfMissing(expectedConfigFile);
45
- expect(import_fs.default.existsSync(expectedConfigFile)).toBeTruthy();
46
- });
47
- it("creates a config file if it's missing", () => {
48
- import_fs.default.mkdirSync(expectedConfigDir);
49
- import_config.default.createFileIfMissing(expectedConfigFile);
50
- expect(import_fs.default.existsSync(expectedConfigFile)).toBeTruthy();
51
- });
52
- it("does nothing if it already exists", () => {
53
- import_fs.default.mkdirSync(expectedConfigDir);
54
- import_fs.default.closeSync(import_fs.default.openSync(expectedConfigFile, "w"));
55
- import_config.default.createFileIfMissing(expectedConfigFile);
56
- expect(import_fs.default.existsSync(expectedConfigFile)).toBeTruthy();
57
- });
58
- });
59
- });
60
- describe("Tokens in config files", () => {
61
- const configFile = import_path.default.join(fakeHomedir, "ditto");
62
- beforeEach(() => {
63
- import_config.default.createFileIfMissing(configFile);
64
- import_config.default.saveToken(configFile, "testing.dittowords.com", "faketoken");
65
- });
66
- afterEach(() => {
67
- import_fs.default.rmdirSync(fakeHomedir, { recursive: true });
68
- });
69
- describe("saveToken", () => {
70
- it("creates a config file with config data", () => {
71
- const fileContents = import_fs.default.readFileSync(configFile, "utf8");
72
- const configData = import_js_yaml.default.load(fileContents);
73
- if (configData && typeof configData === "object") {
74
- expect(configData["testing.dittowords.com"]).toBeDefined();
75
- expect(configData["testing.dittowords.com"][0].token).toEqual(
76
- "faketoken"
77
- );
78
- } else {
79
- fail("Config Data should have been an object!");
80
- }
81
- });
82
- });
83
- describe("getToken", () => {
84
- it("can retrieve the saved token value", () => {
85
- expect(import_config.default.getToken(configFile, "testing.dittowords.com")).toEqual(
86
- "faketoken"
87
- );
88
- });
89
- });
90
- });
91
- //# sourceMappingURL=config.test.js.map
92
-
93
- //# debugId=7a21b9a5-efe4-50f7-9b1f-38b0ce5ffb19
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/config.test.ts"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport fs from \"fs\";\nimport path from \"path\";\nimport tempy from \"tempy\";\nimport yaml from \"js-yaml\";\nimport config from \"./config\";\n\njest.mock(\"fs\");\n\nconst fakeHomedir = fs.mkdtempSync(\"/config-testing\");\n\ndescribe(\"Config File\", () => {\n const expectedConfigDir = path.join(fakeHomedir, \".config\");\n\n beforeEach(() => {\n if (!fs.existsSync(fakeHomedir)) fs.mkdirSync(fakeHomedir);\n });\n\n afterEach(() => {\n fs.rmdirSync(fakeHomedir, { recursive: true });\n });\n\n describe(\"createFileIfMissing\", () => {\n const expectedConfigFile = path.join(expectedConfigDir, \"ditto\");\n\n it(\"creates a config file if the config dir is missing\", () => {\n config.createFileIfMissing(expectedConfigFile);\n expect(fs.existsSync(expectedConfigFile)).toBeTruthy();\n });\n it(\"creates a config file if it's missing\", () => {\n fs.mkdirSync(expectedConfigDir);\n config.createFileIfMissing(expectedConfigFile);\n expect(fs.existsSync(expectedConfigFile)).toBeTruthy();\n });\n\n it(\"does nothing if it already exists\", () => {\n fs.mkdirSync(expectedConfigDir);\n fs.closeSync(fs.openSync(expectedConfigFile, \"w\"));\n config.createFileIfMissing(expectedConfigFile);\n expect(fs.existsSync(expectedConfigFile)).toBeTruthy();\n });\n });\n});\n\ndescribe(\"Tokens in config files\", () => {\n const configFile = path.join(fakeHomedir, \"ditto\");\n\n beforeEach(() => {\n config.createFileIfMissing(configFile);\n config.saveToken(configFile, \"testing.dittowords.com\", \"faketoken\");\n });\n\n afterEach(() => {\n fs.rmdirSync(fakeHomedir, { recursive: true });\n });\n\n describe(\"saveToken\", () => {\n it(\"creates a config file with config data\", () => {\n const fileContents = fs.readFileSync(configFile, \"utf8\");\n const configData = yaml.load(fileContents) as Record<string, any>;\n if (configData && typeof configData === \"object\") {\n expect(configData[\"testing.dittowords.com\"]).toBeDefined();\n expect(configData[\"testing.dittowords.com\"][0].token).toEqual(\n \"faketoken\"\n );\n } else {\n fail(\"Config Data should have been an object!\");\n }\n });\n });\n\n describe(\"getToken\", () => {\n it(\"can retrieve the saved token value\", () => {\n expect(config.getToken(configFile, \"testing.dittowords.com\")).toEqual(\n \"faketoken\"\n );\n });\n });\n});\n"],"names":["fs","path","config","yaml"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,gBAAe;AACf,kBAAiB;AAEjB,qBAAiB;AACjB,oBAAmB;AAEnB,KAAK,KAAK,IAAI;AAEd,MAAM,cAAc,UAAAA,QAAG,YAAY,iBAAiB;AAEpD,SAAS,eAAe,MAAM;AAC5B,QAAM,oBAAoB,YAAAC,QAAK,KAAK,aAAa,SAAS;AAE1D,aAAW,MAAM;AACf,QAAI,CAAC,UAAAD,QAAG,WAAW,WAAW;AAAG,gBAAAA,QAAG,UAAU,WAAW;AAAA,EAC3D,CAAC;AAED,YAAU,MAAM;AACd,cAAAA,QAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C,CAAC;AAED,WAAS,uBAAuB,MAAM;AACpC,UAAM,qBAAqB,YAAAC,QAAK,KAAK,mBAAmB,OAAO;AAE/D,OAAG,sDAAsD,MAAM;AAC7D,oBAAAC,QAAO,oBAAoB,kBAAkB;AAC7C,aAAO,UAAAF,QAAG,WAAW,kBAAkB,CAAC,EAAE,WAAW;AAAA,IACvD,CAAC;AACD,OAAG,yCAAyC,MAAM;AAChD,gBAAAA,QAAG,UAAU,iBAAiB;AAC9B,oBAAAE,QAAO,oBAAoB,kBAAkB;AAC7C,aAAO,UAAAF,QAAG,WAAW,kBAAkB,CAAC,EAAE,WAAW;AAAA,IACvD,CAAC;AAED,OAAG,qCAAqC,MAAM;AAC5C,gBAAAA,QAAG,UAAU,iBAAiB;AAC9B,gBAAAA,QAAG,UAAU,UAAAA,QAAG,SAAS,oBAAoB,GAAG,CAAC;AACjD,oBAAAE,QAAO,oBAAoB,kBAAkB;AAC7C,aAAO,UAAAF,QAAG,WAAW,kBAAkB,CAAC,EAAE,WAAW;AAAA,IACvD,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,MAAM;AACvC,QAAM,aAAa,YAAAC,QAAK,KAAK,aAAa,OAAO;AAEjD,aAAW,MAAM;AACf,kBAAAC,QAAO,oBAAoB,UAAU;AACrC,kBAAAA,QAAO,UAAU,YAAY,0BAA0B,WAAW;AAAA,EACpE,CAAC;AAED,YAAU,MAAM;AACd,cAAAF,QAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C,CAAC;AAED,WAAS,aAAa,MAAM;AAC1B,OAAG,0CAA0C,MAAM;AACjD,YAAM,eAAe,UAAAA,QAAG,aAAa,YAAY,MAAM;AACvD,YAAM,aAAa,eAAAG,QAAK,KAAK,YAAY;AACzC,UAAI,cAAc,OAAO,eAAe,UAAU;AAChD,eAAO,WAAW,wBAAwB,CAAC,EAAE,YAAY;AACzD,eAAO,WAAW,wBAAwB,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,UACpD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,yCAAyC;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,YAAY,MAAM;AACzB,OAAG,sCAAsC,MAAM;AAC7C,aAAO,cAAAD,QAAO,SAAS,YAAY,wBAAwB,CAAC,EAAE;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC","debug_id":"7a21b9a5-efe4-50f7-9b1f-38b0ce5ffb19"}
package/bin/consts.js DELETED
@@ -1,57 +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]="dff8f642-ef0f-5ab4-bf87-60f6f51ca2b4")}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 consts_exports = {};
32
- __export(consts_exports, {
33
- default: () => consts_default
34
- });
35
- module.exports = __toCommonJS(consts_exports);
36
- var import_os = require("os");
37
- var import_path = __toESM(require("path"));
38
- var consts_default = new class {
39
- get API_HOST() {
40
- return process.env.DITTO_API_HOST || "https://api.dittowords.com";
41
- }
42
- get CONFIG_FILE() {
43
- return process.env.DITTO_CONFIG_FILE || import_path.default.join((0, import_os.homedir)(), ".config", "ditto");
44
- }
45
- get PROJECT_CONFIG_FILE() {
46
- return import_path.default.normalize(import_path.default.join("ditto", "config.yml"));
47
- }
48
- get TEXT_DIR() {
49
- return process.env.DITTO_TEXT_DIR || "ditto";
50
- }
51
- get TEXT_FILE() {
52
- return import_path.default.normalize(import_path.default.join(this.TEXT_DIR, "text.json"));
53
- }
54
- }();
55
- //# sourceMappingURL=consts.js.map
56
-
57
- //# debugId=dff8f642-ef0f-5ab4-bf87-60f6f51ca2b4
package/bin/consts.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/consts.ts"],"sourcesContent":["import { homedir } from \"os\";\nimport path from \"path\";\n\nexport default new (class {\n get API_HOST() {\n return process.env.DITTO_API_HOST || \"https://api.dittowords.com\";\n }\n get CONFIG_FILE() {\n return (\n process.env.DITTO_CONFIG_FILE || path.join(homedir(), \".config\", \"ditto\")\n );\n }\n get PROJECT_CONFIG_FILE() {\n return path.normalize(path.join(\"ditto\", \"config.yml\"));\n }\n get TEXT_DIR() {\n return process.env.DITTO_TEXT_DIR || \"ditto\";\n }\n get TEXT_FILE() {\n return path.normalize(path.join(this.TEXT_DIR, \"text.json\"));\n }\n})();\n"],"names":["path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAwB;AACxB,kBAAiB;AAEjB,IAAO,iBAAQ,IAAK,MAAM;AAAA,EACxB,IAAI,WAAW;AACb,WAAO,QAAQ,IAAI,kBAAkB;AAAA,EACvC;AAAA,EACA,IAAI,cAAc;AAChB,WACE,QAAQ,IAAI,qBAAqB,YAAAA,QAAK,SAAK,mBAAQ,GAAG,WAAW,OAAO;AAAA,EAE5E;AAAA,EACA,IAAI,sBAAsB;AACxB,WAAO,YAAAA,QAAK,UAAU,YAAAA,QAAK,KAAK,SAAS,YAAY,CAAC;AAAA,EACxD;AAAA,EACA,IAAI,WAAW;AACb,WAAO,QAAQ,IAAI,kBAAkB;AAAA,EACvC;AAAA,EACA,IAAI,YAAY;AACd,WAAO,YAAAA,QAAK,UAAU,YAAAA,QAAK,KAAK,KAAK,UAAU,WAAW,CAAC;AAAA,EAC7D;AACF,EAAG","debug_id":"dff8f642-ef0f-5ab4-bf87-60f6f51ca2b4"}
package/bin/ditto.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/ditto.ts"],"sourcesContent":["#!/usr/bin/env node\n// This is the main entry point for the ditto-cli command.\nimport { program } from \"commander\";\n// to use V8's code cache to speed up instantiation time\nimport \"v8-compile-cache\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport * as Sentry from \"@sentry/node\";\nimport { version as release } from \"../package.json\";\nimport { init, needsTokenOrSource } from \"./init/init\";\nimport { pull } from \"./pull\";\nimport { quit } from \"./utils/quit\";\nimport addProject from \"./add-project\";\nimport removeProject from \"./remove-project\";\nimport { replace } from \"./replace\";\nimport { generateSuggestions } from \"./generate-suggestions\";\nimport processMetaOption from \"./utils/processMetaOption\";\nimport { importComponents } from \"./importComponents\";\nimport { showComponentFolders } from \"./component-folders\";\n\nconst environment = process.env.ENV || \"development\";\nSentry.init({ dsn: process.env.SENTRY_DSN, environment, release });\n\nfunction getVersion(): string {\n const packageJsonPath = path.join(__dirname, \"..\", \"package.json\");\n const packageJsonContent = fs.readFileSync(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonContent) as { version: string };\n return packageJson.version;\n}\n\nconst VERSION = getVersion();\n\nconst CONFIG_FILE_RELIANT_COMMANDS = [\n \"pull\",\n \"none\",\n \"project\",\n \"project add\",\n \"project remove\",\n];\n\ntype Command =\n | \"pull\"\n | \"project\"\n | \"project add\"\n | \"project remove\"\n | \"component-folders\"\n | \"generate-suggestions\"\n | \"replace\"\n | \"import-components\";\n\ninterface CommandConfig<T extends Command | \"add\" | \"remove\"> {\n name: T;\n description: string;\n commands?: CommandConfig<\"add\" | \"remove\">[];\n flags?: {\n [flag: string]: { description: string; processor?: (value: string) => any };\n };\n}\n\nconst COMMANDS: CommandConfig<Command>[] = [\n {\n name: \"pull\",\n description: \"Sync copy from Ditto into the current working directory\",\n flags: {\n \"--sample-data\": {\n description: \"Include sample data. Currently only supports variants.\",\n },\n },\n },\n {\n name: \"project\",\n description: \"Add a Ditto project to sync copy from\",\n commands: [\n {\n name: \"add\",\n description: \"Add a Ditto project to sync copy from\",\n },\n {\n name: \"remove\",\n description: \"Stop syncing copy from a Ditto project\",\n },\n ],\n },\n {\n name: \"component-folders\",\n description:\n \"List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.\",\n flags: {\n \"-s, --sample-data\": {\n description: \"Includes the sample components folder in the output\",\n },\n },\n },\n {\n name: \"generate-suggestions\",\n description: \"Find text that can be potentially replaced with Ditto text\",\n flags: {\n \"-d, --directory [value]\": {\n description: \"Directory to search for text\",\n },\n \"-f, --files [value]\": {\n description: \"Files to search for text (will override -d)\",\n processor: (value: string) => value.split(\",\"),\n },\n \"-cf, --component-folder [value]\": {\n description: \"Component folder to search for matches\",\n },\n },\n },\n {\n name: \"replace\",\n description: \"Find and replace Ditto text with code\",\n flags: {\n \"-ln, --line-numbers [value]\": {\n description: \"Only replace text on a specific line number\",\n processor: (value: string) => value.split(\",\").map(Number),\n },\n },\n },\n {\n name: \"import-components\",\n description:\n \"Import components via a file. For more information please see: https://www.dittowords.com/docs/importing-string-files.\",\n flags: {\n \"-t, --text [value]\": {\n description: \"Text column index (.csv format only)\",\n },\n \"-n, --component-name [value]\": {\n description: \"Name column indexes (comma separated) (.csv format only)\",\n },\n \"-no, --notes [value]\": {\n description: \"Notes column index (.csv format only)\",\n },\n \"-t, --tags [value]\": {\n description: \"Tags column index (.csv format only)\",\n },\n \"-s, --status [value]\": {\n description: \"Status column index (.csv format only)\",\n },\n \"-c, --component-id [value]\": {\n description: \"Component ID column index (.csv format only)\",\n },\n },\n },\n];\n\nconst setupCommands = () => {\n program.name(\"ditto-cli\");\n\n COMMANDS.forEach((commandConfig) => {\n const cmd = program\n .command(commandConfig.name)\n .description(commandConfig.description)\n .action((options) => {\n return executeCommand(commandConfig.name, options);\n });\n\n if (commandConfig.flags) {\n Object.entries(commandConfig.flags).forEach(\n ([flags, { description, processor }]) => {\n if (processor) {\n cmd.option(flags, description, processor);\n } else {\n cmd.option(flags, description);\n }\n }\n );\n }\n\n if (\"commands\" in commandConfig && commandConfig.commands) {\n commandConfig.commands.forEach((nestedCommand) => {\n cmd\n .command(nestedCommand.name)\n .description(nestedCommand.description)\n .action((str, options) => {\n if (commandConfig.name === \"project\") {\n const command =\n `${commandConfig.name} ${nestedCommand.name}` as Command;\n\n return executeCommand(command, options);\n }\n });\n });\n }\n });\n};\n\nconst setupOptions = () => {\n program.option(\n \"-m, --meta <data...>\",\n \"Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual\"\n );\n program.version(VERSION, \"-v, --version\", \"Output the current version\");\n};\n\nconst executeCommand = async (\n command: Command | \"none\",\n options: any\n): Promise<void> => {\n const needsInitialization =\n CONFIG_FILE_RELIANT_COMMANDS.includes(command) && needsTokenOrSource();\n\n if (needsInitialization) {\n try {\n await init();\n } catch (error) {\n await quit(\"Exiting Ditto CLI...\");\n return;\n }\n }\n\n const { meta } = program.opts();\n switch (command) {\n case \"none\":\n case \"pull\": {\n return pull({\n meta: processMetaOption(meta),\n includeSampleData: options.sampleData || false,\n });\n }\n case \"project\":\n case \"project add\": {\n // initialization already includes the selection of a source,\n // so if `project add` is called during initialization, don't\n // prompt the user to select a source again\n if (needsInitialization) return;\n\n return addProject();\n }\n case \"project remove\": {\n return removeProject();\n }\n case \"component-folders\": {\n return showComponentFolders({\n showSampleData: options.sampleData,\n });\n }\n case \"generate-suggestions\": {\n return generateSuggestions({\n directory: options.directory,\n files: options.files,\n componentFolder: options.componentFolder,\n });\n }\n case \"replace\": {\n return replace(options.args, {\n ...(options?.lineNumbers ? { lineNumbers: options.lineNumbers } : {}),\n });\n }\n case \"import-components\": {\n if (options.args.length === 0) {\n console.info(\"Please provide a file path.\");\n return;\n }\n return importComponents(options.args[0], {\n csvColumnMapping: {\n name: options.componentName,\n text: options.text,\n notes: options.notes,\n tags: options.tags,\n status: options.status,\n componentId: options.componentId,\n },\n });\n }\n default: {\n await quit(\"Exiting Ditto CLI...\");\n return;\n }\n }\n};\n\nconst main = async () => {\n setupCommands();\n setupOptions();\n\n if (process.argv.length <= 2 && process.argv[1].includes(\"ditto-cli\")) {\n await executeCommand(\"none\", []);\n return;\n }\n\n program.parse(process.argv);\n};\n\nmain();\n"],"names":["release","path","fs","processMetaOption","addProject","removeProject"],"mappings":"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","debug_id":"e345c5f5-5eca-5db0-8743-1e916e4f5493"}
@@ -1,183 +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]="c9f5e9e0-d691-51c4-b6ad-7649590ad798")}catch(e){}}();
3
-
4
- var __create = Object.create;
5
- var __defProp = Object.defineProperty;
6
- var __defProps = Object.defineProperties;
7
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
- var __getOwnPropNames = Object.getOwnPropertyNames;
10
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
11
- var __getProtoOf = Object.getPrototypeOf;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
- var __spreadValues = (a, b) => {
16
- for (var prop in b || (b = {}))
17
- if (__hasOwnProp.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- if (__getOwnPropSymbols)
20
- for (var prop of __getOwnPropSymbols(b)) {
21
- if (__propIsEnum.call(b, prop))
22
- __defNormalProp(a, prop, b[prop]);
23
- }
24
- return a;
25
- };
26
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
27
- var __export = (target, all) => {
28
- for (var name in all)
29
- __defProp(target, name, { get: all[name], enumerable: true });
30
- };
31
- var __copyProps = (to, from, except, desc) => {
32
- if (from && typeof from === "object" || typeof from === "function") {
33
- for (let key of __getOwnPropNames(from))
34
- if (!__hasOwnProp.call(to, key) && key !== except)
35
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
36
- }
37
- return to;
38
- };
39
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
40
- // If the importer is in node compatibility mode or this is not an ESM
41
- // file that has been converted to a CommonJS file using a Babel-
42
- // compatible transform (i.e. "__esModule" has not been set), then set
43
- // "default" to the CommonJS "module.exports" for node compatibility.
44
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
45
- mod
46
- ));
47
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
48
- var __async = (__this, __arguments, generator) => {
49
- return new Promise((resolve, reject) => {
50
- var fulfilled = (value) => {
51
- try {
52
- step(generator.next(value));
53
- } catch (e) {
54
- reject(e);
55
- }
56
- };
57
- var rejected = (value) => {
58
- try {
59
- step(generator.throw(value));
60
- } catch (e) {
61
- reject(e);
62
- }
63
- };
64
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
65
- step((generator = generator.apply(__this, __arguments)).next());
66
- });
67
- };
68
- var generate_suggestions_exports = {};
69
- __export(generate_suggestions_exports, {
70
- findComponentsInJSXFiles: () => findComponentsInJSXFiles,
71
- generateSuggestions: () => generateSuggestions
72
- });
73
- module.exports = __toCommonJS(generate_suggestions_exports);
74
- var import_fs = __toESM(require("fs"));
75
- var import_glob = __toESM(require("glob"));
76
- var import_parser = require("@babel/parser");
77
- var import_traverse = __toESM(require("@babel/traverse"));
78
- var import_fetchComponents = require("./http/fetchComponents");
79
- function generateSuggestions(flags) {
80
- return __async(this, null, function* () {
81
- const components = yield (0, import_fetchComponents.fetchComponents)(__spreadValues({}, flags.componentFolder ? { componentFolder: flags.componentFolder } : {}));
82
- const directory = flags.directory || ".";
83
- const results = yield findComponentsInJSXFiles({
84
- directory,
85
- files: flags.files,
86
- components
87
- });
88
- console.log(JSON.stringify(results, null, 2));
89
- });
90
- }
91
- function findComponentsInJSXFiles(params) {
92
- return __async(this, null, function* () {
93
- const result = {};
94
- const files = params.files || import_glob.default.sync(`${params.directory}/**/*.+(jsx|tsx)`, {
95
- ignore: "**/node_modules/**"
96
- });
97
- const promises = [];
98
- function handleFile(file) {
99
- return __async(this, null, function* () {
100
- const code = yield new Promise(
101
- (resolve, reject) => import_fs.default.readFile(file, "utf-8", (err, data) => {
102
- if (err) {
103
- reject(err);
104
- } else {
105
- resolve(data);
106
- }
107
- })
108
- );
109
- const ast = (0, import_parser.parse)(code, {
110
- sourceType: "module",
111
- plugins: ["jsx", "typescript"]
112
- });
113
- (0, import_traverse.default)(ast, {
114
- JSXText(path) {
115
- for (const [compApiId, component] of Object.entries(
116
- params.components
117
- )) {
118
- if (!result[compApiId]) {
119
- result[compApiId] = __spreadProps(__spreadValues({
120
- apiId: compApiId
121
- }, component), {
122
- occurrences: {}
123
- });
124
- }
125
- if (
126
- // Skip white space lines
127
- !/^\s*$/.test(path.node.value) && !/^\s*$/.test(component.text) && path.node.value.includes(component.text)
128
- ) {
129
- const escapedText = component.text.replace(
130
- /[.*+?^${}()|[\]\\]/g,
131
- "\\$&"
132
- );
133
- const regex = new RegExp(escapedText, "g");
134
- let match;
135
- while ((match = regex.exec(path.node.value)) !== null) {
136
- const lines = path.node.value.slice(0, match.index).split("\n");
137
- if (!path.node.loc) {
138
- continue;
139
- }
140
- const lineNumber = path.node.loc.start.line + lines.length - 1;
141
- const codeLines = code.split("\n");
142
- const line = codeLines[lineNumber - 1];
143
- const preview = replaceAt(
144
- line,
145
- match.index,
146
- component.text,
147
- `${component.text}`
148
- );
149
- if (!result[compApiId]["occurrences"][file]) {
150
- result[compApiId]["occurrences"][file] = [];
151
- }
152
- result[compApiId]["occurrences"][file].push({
153
- lineNumber,
154
- preview
155
- });
156
- }
157
- }
158
- if (Object.keys(result[compApiId]["occurrences"]).length === 0) {
159
- delete result[compApiId];
160
- }
161
- }
162
- }
163
- });
164
- });
165
- }
166
- for (const file of files) {
167
- promises.push(handleFile(file));
168
- }
169
- yield Promise.all(promises);
170
- return result;
171
- });
172
- }
173
- function replaceAt(str, index, searchString, replacement) {
174
- return str.substring(0, index) + str.substring(index, str.length).replace(searchString, replacement);
175
- }
176
- // Annotate the CommonJS export names for ESM import in node:
177
- 0 && (module.exports = {
178
- findComponentsInJSXFiles,
179
- generateSuggestions
180
- });
181
- //# sourceMappingURL=generate-suggestions.js.map
182
-
183
- //# debugId=c9f5e9e0-d691-51c4-b6ad-7649590ad798
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/generate-suggestions.ts"],"sourcesContent":["import fs from \"fs\";\nimport glob from \"glob\";\nimport { parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\n\nimport {\n FetchComponentResponse,\n FetchComponentResponseComponent,\n fetchComponents,\n} from \"./http/fetchComponents\";\n\ninterface Occurrence {\n lineNumber: number;\n preview: string;\n}\n\ninterface Result extends FetchComponentResponseComponent {\n apiId: string;\n occurrences: {\n [file: string]: Occurrence[];\n };\n}\n\nasync function generateSuggestions(flags: {\n directory?: string;\n files?: string[];\n componentFolder?: string;\n}) {\n const components = await fetchComponents({\n ...(flags.componentFolder\n ? { componentFolder: flags.componentFolder }\n : {}),\n });\n const directory = flags.directory || \".\";\n\n const results: { [apiId: string]: Result } = await findComponentsInJSXFiles({\n directory,\n files: flags.files,\n components,\n });\n\n // Display results to user\n console.log(JSON.stringify(results, null, 2));\n}\n\nasync function findComponentsInJSXFiles(\n params: (\n | { directory: string; files?: string[] }\n | { files: string[]; directory?: string }\n ) & {\n components: FetchComponentResponse;\n }\n): Promise<{ [apiId: string]: Result }> {\n const result: { [apiId: string]: Result } = {};\n const files =\n params.files ||\n glob.sync(`${params.directory}/**/*.+(jsx|tsx)`, {\n ignore: \"**/node_modules/**\",\n });\n\n const promises: Promise<any>[] = [];\n\n async function handleFile(file: string) {\n const code = await new Promise<string>((resolve, reject) =>\n fs.readFile(file, \"utf-8\", (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n })\n );\n\n const ast = parse(code, {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n });\n\n traverse(ast, {\n JSXText(path) {\n for (const [compApiId, component] of Object.entries(\n params.components\n )) {\n // If we haven't seen this component before, add it to the result\n if (!result[compApiId]) {\n result[compApiId] = {\n apiId: compApiId,\n ...component,\n occurrences: {},\n };\n }\n\n if (\n // Skip white space lines\n !/^\\s*$/.test(path.node.value) &&\n !/^\\s*$/.test(component.text) &&\n path.node.value.includes(component.text)\n ) {\n // Escape all special characters from the text so we can use it in a regex\n const escapedText = component.text.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n \"\\\\$&\"\n );\n const regex = new RegExp(escapedText, \"g\");\n let match;\n while ((match = regex.exec(path.node.value)) !== null) {\n const lines = path.node.value.slice(0, match.index).split(\"\\n\");\n\n if (!path.node.loc) {\n continue;\n }\n\n const lineNumber = path.node.loc.start.line + lines.length - 1;\n\n const codeLines = code.split(\"\\n\");\n const line = codeLines[lineNumber - 1];\n const preview = replaceAt(\n line,\n match.index,\n component.text,\n `${component.text}`\n );\n\n // Initialize the occurrences array if it doesn't exist\n if (!result[compApiId][\"occurrences\"][file]) {\n result[compApiId][\"occurrences\"][file] = [];\n }\n\n result[compApiId][\"occurrences\"][file].push({\n lineNumber,\n preview,\n });\n }\n }\n\n // Remove from result if no occurrences were found\n if (Object.keys(result[compApiId][\"occurrences\"]).length === 0) {\n delete result[compApiId];\n }\n }\n },\n });\n }\n\n for (const file of files) {\n promises.push(handleFile(file));\n }\n\n await Promise.all(promises);\n\n return result;\n}\n\nfunction replaceAt(\n str: string,\n index: number,\n searchString: string,\n replacement: string\n) {\n return (\n str.substring(0, index) +\n str.substring(index, str.length).replace(searchString, replacement)\n );\n}\n\nexport { findComponentsInJSXFiles, generateSuggestions };\n"],"names":["glob","fs","traverse"],"mappings":"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","debug_id":"c9f5e9e0-d691-51c4-b6ad-7649590ad798"}
@@ -1,200 +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]="bd23df8e-2e66-5de9-8b6b-5a3ca81ea0a8")}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 __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
- var __async = (__this, __arguments, generator) => {
27
- return new Promise((resolve, reject) => {
28
- var fulfilled = (value) => {
29
- try {
30
- step(generator.next(value));
31
- } catch (e) {
32
- reject(e);
33
- }
34
- };
35
- var rejected = (value) => {
36
- try {
37
- step(generator.throw(value));
38
- } catch (e) {
39
- reject(e);
40
- }
41
- };
42
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
43
- step((generator = generator.apply(__this, __arguments)).next());
44
- });
45
- };
46
- var import_fs = __toESM(require("fs"));
47
- var import_path = __toESM(require("path"));
48
- var import_generate_suggestions = require("./generate-suggestions");
49
- jest.mock("fs");
50
- describe("findTextInJSXFiles", () => {
51
- function createTempFile(filename, content) {
52
- return __async(this, null, function* () {
53
- const filePath = import_path.default.join("/", filename);
54
- yield new Promise((resolve, reject) => {
55
- try {
56
- import_fs.default.writeFile(filePath, content, () => resolve(null));
57
- } catch (e) {
58
- reject(e);
59
- }
60
- });
61
- return filePath;
62
- });
63
- }
64
- function deleteTempFile(filename) {
65
- return __async(this, null, function* () {
66
- const filePath = import_path.default.join("/", filename);
67
- yield new Promise((resolve, reject) => {
68
- try {
69
- import_fs.default.unlink(filePath, resolve);
70
- } catch (e) {
71
- reject(e);
72
- }
73
- });
74
- });
75
- }
76
- it("should return an empty obj when no files are found", () => __async(exports, null, function* () {
77
- const result = yield (0, import_generate_suggestions.findComponentsInJSXFiles)({
78
- directory: ".",
79
- components: {}
80
- });
81
- expect(result).toEqual({});
82
- }));
83
- it("should return an empty obj when searchString is not found in any file", () => __async(exports, null, function* () {
84
- const file1 = yield createTempFile("file1.jsx", "<div>No match</div>");
85
- const file2 = yield createTempFile("file2.tsx", "<div>No match</div>");
86
- const result = yield (0, import_generate_suggestions.findComponentsInJSXFiles)({
87
- directory: ".",
88
- components: {
89
- acomponent: {
90
- name: "A Component",
91
- text: "A Component",
92
- status: "NONE",
93
- folder: null
94
- }
95
- }
96
- });
97
- expect(result).toEqual({});
98
- yield deleteTempFile(file1);
99
- yield deleteTempFile(file2);
100
- }));
101
- it("should return an array with correct occurrences when searchString is found", () => __async(exports, null, function* () {
102
- const file1 = yield createTempFile(
103
- "file1.jsx",
104
- `<div>Test searchString and another searchString</div>`
105
- );
106
- const expectedResult = {
107
- "search-string": {
108
- apiId: "search-string",
109
- folder: null,
110
- name: "Search String",
111
- occurrences: {
112
- [file1]: [
113
- {
114
- lineNumber: 1,
115
- preview: "<div>Test searchString and another searchString</div>"
116
- },
117
- {
118
- lineNumber: 1,
119
- preview: "<div>Test searchString and another searchString</div>"
120
- }
121
- ]
122
- },
123
- status: "NONE",
124
- text: "searchString"
125
- }
126
- };
127
- const result = yield (0, import_generate_suggestions.findComponentsInJSXFiles)({
128
- directory: "/",
129
- components: {
130
- "search-string": {
131
- name: "Search String",
132
- text: "searchString",
133
- status: "NONE",
134
- folder: null
135
- }
136
- }
137
- });
138
- expect(result).toEqual(expectedResult);
139
- yield deleteTempFile(file1);
140
- }));
141
- it("-f flag works", () => __async(exports, null, function* () {
142
- const file1 = yield createTempFile(
143
- "file1.jsx",
144
- `<div>Test searchString and another searchString</div>`
145
- );
146
- const expectedResult = {
147
- "search-string": {
148
- apiId: "search-string",
149
- folder: null,
150
- name: "Search String",
151
- occurrences: {
152
- [file1]: [
153
- {
154
- lineNumber: 1,
155
- preview: "<div>Test searchString and another searchString</div>"
156
- },
157
- {
158
- lineNumber: 1,
159
- preview: "<div>Test searchString and another searchString</div>"
160
- }
161
- ]
162
- },
163
- status: "NONE",
164
- text: "searchString"
165
- }
166
- };
167
- const result = yield (0, import_generate_suggestions.findComponentsInJSXFiles)({
168
- files: ["/file1.jsx"],
169
- components: {
170
- "search-string": {
171
- name: "Search String",
172
- text: "searchString",
173
- status: "NONE",
174
- folder: null
175
- }
176
- }
177
- });
178
- expect(result).toEqual(expectedResult);
179
- try {
180
- yield (0, import_generate_suggestions.findComponentsInJSXFiles)({
181
- files: ["/file2.jsx"],
182
- components: {
183
- "search-string": {
184
- name: "Search String",
185
- text: "searchString",
186
- status: "NONE",
187
- folder: null
188
- }
189
- }
190
- });
191
- expect(false).toEqual(true);
192
- } catch (e) {
193
- expect(true).toEqual(true);
194
- }
195
- yield deleteTempFile(file1);
196
- }));
197
- });
198
- //# sourceMappingURL=generate-suggestions.test.js.map
199
-
200
- //# debugId=bd23df8e-2e66-5de9-8b6b-5a3ca81ea0a8
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/generate-suggestions.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { findComponentsInJSXFiles } from \"./generate-suggestions\";\n\njest.mock(\"fs\");\n\ndescribe(\"findTextInJSXFiles\", () => {\n async function createTempFile(filename: string, content: string) {\n const filePath = path.join(\"/\", filename);\n await new Promise((resolve, reject) => {\n try {\n fs.writeFile(filePath, content, () => resolve(null));\n } catch (e) {\n reject(e);\n }\n });\n return filePath;\n }\n\n async function deleteTempFile(filename: string) {\n const filePath = path.join(\"/\", filename);\n await new Promise((resolve, reject) => {\n try {\n fs.unlink(filePath, resolve);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n it(\"should return an empty obj when no files are found\", async () => {\n const result = await findComponentsInJSXFiles({\n directory: \".\",\n components: {},\n });\n\n expect(result).toEqual({});\n });\n\n it(\"should return an empty obj when searchString is not found in any file\", async () => {\n const file1 = await createTempFile(\"file1.jsx\", \"<div>No match</div>\");\n const file2 = await createTempFile(\"file2.tsx\", \"<div>No match</div>\");\n\n const result = await findComponentsInJSXFiles({\n directory: \".\",\n components: {\n acomponent: {\n name: \"A Component\",\n text: \"A Component\",\n status: \"NONE\",\n folder: null,\n },\n },\n });\n\n expect(result).toEqual({});\n\n await deleteTempFile(file1);\n await deleteTempFile(file2);\n });\n\n it(\"should return an array with correct occurrences when searchString is found\", async () => {\n const file1 = await createTempFile(\n \"file1.jsx\",\n `<div>Test searchString and another searchString</div>`\n );\n\n const expectedResult = {\n \"search-string\": {\n apiId: \"search-string\",\n folder: null,\n name: \"Search String\",\n occurrences: {\n [file1]: [\n {\n lineNumber: 1,\n preview: \"<div>Test searchString and another searchString</div>\",\n },\n {\n lineNumber: 1,\n preview: \"<div>Test searchString and another searchString</div>\",\n },\n ],\n },\n status: \"NONE\",\n text: \"searchString\",\n },\n };\n\n const result = await findComponentsInJSXFiles({\n directory: \"/\",\n components: {\n \"search-string\": {\n name: \"Search String\",\n text: \"searchString\",\n status: \"NONE\",\n folder: null,\n },\n },\n });\n\n expect(result).toEqual(expectedResult);\n\n await deleteTempFile(file1);\n });\n\n it(\"-f flag works\", async () => {\n const file1 = await createTempFile(\n \"file1.jsx\",\n `<div>Test searchString and another searchString</div>`\n );\n\n const expectedResult = {\n \"search-string\": {\n apiId: \"search-string\",\n folder: null,\n name: \"Search String\",\n occurrences: {\n [file1]: [\n {\n lineNumber: 1,\n preview: \"<div>Test searchString and another searchString</div>\",\n },\n {\n lineNumber: 1,\n preview: \"<div>Test searchString and another searchString</div>\",\n },\n ],\n },\n status: \"NONE\",\n text: \"searchString\",\n },\n };\n\n const result = await findComponentsInJSXFiles({\n files: [\"/file1.jsx\"],\n components: {\n \"search-string\": {\n name: \"Search String\",\n text: \"searchString\",\n status: \"NONE\",\n folder: null,\n },\n },\n });\n\n expect(result).toEqual(expectedResult);\n\n try {\n await findComponentsInJSXFiles({\n files: [\"/file2.jsx\"],\n components: {\n \"search-string\": {\n name: \"Search String\",\n text: \"searchString\",\n status: \"NONE\",\n folder: null,\n },\n },\n });\n\n expect(false).toEqual(true);\n } catch {\n expect(true).toEqual(true);\n }\n\n await deleteTempFile(file1);\n });\n});\n"],"names":["path","fs"],"mappings":"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","debug_id":"bd23df8e-2e66-5de9-8b6b-5a3ca81ea0a8"}