@hanseltime/template-repo-sync 2.2.1 → 2.4.0-alpha.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 (293) hide show
  1. package/CHANGELOG.md +43 -45
  2. package/dist/cjs/checkout-drivers/git-checkout.js +37 -0
  3. package/dist/cjs/checkout-drivers/git-checkout.spec.js +60 -0
  4. package/dist/cjs/checkout-drivers/index.js +21 -0
  5. package/dist/cjs/checkout-drivers/types.js +11 -0
  6. package/dist/cjs/clone-drivers/git-clone.js +25 -0
  7. package/dist/cjs/clone-drivers/index.js +21 -0
  8. package/dist/cjs/clone-drivers/types.js +8 -0
  9. package/dist/cjs/diff-drivers/git-diff.js +30 -0
  10. package/dist/cjs/diff-drivers/git-diff.spec.js +138 -0
  11. package/dist/cjs/diff-drivers/index.js +21 -0
  12. package/dist/cjs/diff-drivers/types.js +6 -0
  13. package/dist/cjs/formatting/index.js +21 -0
  14. package/dist/cjs/formatting/infer-json-indent.js +26 -0
  15. package/dist/cjs/formatting/infer-json-indent.spec.js +50 -0
  16. package/dist/cjs/formatting/sync-results-to-md.js +62 -0
  17. package/dist/cjs/formatting/sync-results-to-md.spec.js +45 -0
  18. package/dist/cjs/index.js +22 -0
  19. package/dist/cjs/load-plugin.js +44 -0
  20. package/dist/cjs/match.js +51 -0
  21. package/dist/cjs/match.spec.js +75 -0
  22. package/dist/cjs/merge-file.js +91 -0
  23. package/dist/cjs/merge-file.spec.js +508 -0
  24. package/dist/cjs/plugins/index.js +20 -0
  25. package/dist/cjs/plugins/json-merge.js +228 -0
  26. package/dist/cjs/plugins/json-merge.spec.js +514 -0
  27. package/dist/cjs/ref-drivers/git-current-ref.js +18 -0
  28. package/dist/cjs/ref-drivers/git-current-ref.spec.js +15 -0
  29. package/dist/cjs/ref-drivers/index.js +20 -0
  30. package/dist/cjs/ref-drivers/types.js +11 -0
  31. package/dist/cjs/template-sync.js +236 -0
  32. package/dist/cjs/template-sync.spec.js +521 -0
  33. package/dist/cjs/test-utils/index.js +26 -0
  34. package/dist/cjs/types.js +12 -0
  35. package/dist/esm/checkout-drivers/git-checkout.mjs +27 -0
  36. package/dist/esm/checkout-drivers/git-checkout.spec.mjs +56 -0
  37. package/dist/esm/checkout-drivers/index.mjs +4 -0
  38. package/dist/esm/checkout-drivers/types.mjs +8 -0
  39. package/dist/esm/clone-drivers/git-clone.mjs +15 -0
  40. package/dist/esm/clone-drivers/index.mjs +4 -0
  41. package/dist/esm/clone-drivers/types.mjs +8 -0
  42. package/dist/esm/diff-drivers/git-diff.mjs +26 -0
  43. package/dist/esm/diff-drivers/git-diff.spec.mjs +93 -0
  44. package/dist/esm/diff-drivers/index.mjs +4 -0
  45. package/dist/esm/diff-drivers/types.mjs +6 -0
  46. package/dist/esm/formatting/index.mjs +4 -0
  47. package/dist/esm/formatting/infer-json-indent.mjs +16 -0
  48. package/dist/esm/formatting/infer-json-indent.spec.mjs +46 -0
  49. package/dist/esm/formatting/sync-results-to-md.mjs +52 -0
  50. package/dist/esm/formatting/sync-results-to-md.spec.mjs +41 -0
  51. package/dist/esm/index.mjs +5 -0
  52. package/dist/esm/load-plugin.mjs +40 -0
  53. package/dist/esm/match.mjs +40 -0
  54. package/dist/esm/match.spec.mjs +71 -0
  55. package/dist/esm/merge-file.mjs +88 -0
  56. package/dist/esm/merge-file.spec.mjs +504 -0
  57. package/dist/esm/plugins/index.mjs +10 -0
  58. package/dist/esm/plugins/json-merge.mjs +164 -0
  59. package/dist/esm/plugins/json-merge.spec.mjs +469 -0
  60. package/dist/esm/ref-drivers/git-current-ref.mjs +8 -0
  61. package/dist/esm/ref-drivers/git-current-ref.spec.mjs +11 -0
  62. package/dist/esm/ref-drivers/index.mjs +3 -0
  63. package/dist/esm/ref-drivers/types.mjs +8 -0
  64. package/dist/esm/template-sync.mjs +174 -0
  65. package/dist/esm/template-sync.spec.mjs +517 -0
  66. package/dist/esm/test-utils/index.mjs +10 -0
  67. package/dist/esm/types.mjs +9 -0
  68. package/{lib/cjs → dist/types}/checkout-drivers/git-checkout.d.ts +1 -0
  69. package/dist/types/checkout-drivers/git-checkout.d.ts.map +1 -0
  70. package/dist/types/checkout-drivers/git-checkout.spec.d.ts +2 -0
  71. package/dist/types/checkout-drivers/git-checkout.spec.d.ts.map +1 -0
  72. package/{lib/cjs → dist/types}/checkout-drivers/index.d.ts +1 -0
  73. package/dist/types/checkout-drivers/index.d.ts.map +1 -0
  74. package/{lib/cjs → dist/types}/checkout-drivers/types.d.ts +1 -0
  75. package/dist/types/checkout-drivers/types.d.ts.map +1 -0
  76. package/{lib/cjs → dist/types}/clone-drivers/git-clone.d.ts +2 -1
  77. package/dist/types/clone-drivers/git-clone.d.ts.map +1 -0
  78. package/{lib/cjs → dist/types}/clone-drivers/index.d.ts +2 -1
  79. package/dist/types/clone-drivers/index.d.ts.map +1 -0
  80. package/{lib/cjs → dist/types}/clone-drivers/types.d.ts +1 -0
  81. package/dist/types/clone-drivers/types.d.ts.map +1 -0
  82. package/{lib/cjs → dist/types}/diff-drivers/git-diff.d.ts +1 -0
  83. package/dist/types/diff-drivers/git-diff.d.ts.map +1 -0
  84. package/dist/types/diff-drivers/git-diff.spec.d.ts +2 -0
  85. package/dist/types/diff-drivers/git-diff.spec.d.ts.map +1 -0
  86. package/{lib/cjs → dist/types}/diff-drivers/index.d.ts +2 -1
  87. package/dist/types/diff-drivers/index.d.ts.map +1 -0
  88. package/{lib/cjs → dist/types}/diff-drivers/types.d.ts +1 -0
  89. package/dist/types/diff-drivers/types.d.ts.map +1 -0
  90. package/{lib/cjs → dist/types}/formatting/index.d.ts +2 -1
  91. package/dist/types/formatting/index.d.ts.map +1 -0
  92. package/{lib/cjs → dist/types}/formatting/infer-json-indent.d.ts +1 -0
  93. package/dist/types/formatting/infer-json-indent.d.ts.map +1 -0
  94. package/dist/types/formatting/infer-json-indent.spec.d.ts +2 -0
  95. package/dist/types/formatting/infer-json-indent.spec.d.ts.map +1 -0
  96. package/dist/types/formatting/sync-results-to-md.d.ts +3 -0
  97. package/dist/types/formatting/sync-results-to-md.d.ts.map +1 -0
  98. package/dist/types/formatting/sync-results-to-md.spec.d.ts +2 -0
  99. package/dist/types/formatting/sync-results-to-md.spec.d.ts.map +1 -0
  100. package/{lib/cjs → dist/types}/index.d.ts +3 -2
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/{lib/cjs → dist/types}/load-plugin.d.ts +2 -1
  103. package/dist/types/load-plugin.d.ts.map +1 -0
  104. package/{lib/cjs → dist/types}/match.d.ts +1 -0
  105. package/dist/types/match.d.ts.map +1 -0
  106. package/dist/types/match.spec.d.ts +2 -0
  107. package/dist/types/match.spec.d.ts.map +1 -0
  108. package/{lib/cjs → dist/types}/merge-file.d.ts +3 -2
  109. package/dist/types/merge-file.d.ts.map +1 -0
  110. package/dist/types/merge-file.spec.d.ts +2 -0
  111. package/dist/types/merge-file.spec.d.ts.map +1 -0
  112. package/{lib/cjs → dist/types}/plugins/index.d.ts +2 -1
  113. package/dist/types/plugins/index.d.ts.map +1 -0
  114. package/{lib/cjs → dist/types}/plugins/json-merge.d.ts +2 -1
  115. package/dist/types/plugins/json-merge.d.ts.map +1 -0
  116. package/dist/types/plugins/json-merge.spec.d.ts +2 -0
  117. package/dist/types/plugins/json-merge.spec.d.ts.map +1 -0
  118. package/{lib/cjs → dist/types}/ref-drivers/git-current-ref.d.ts +1 -0
  119. package/dist/types/ref-drivers/git-current-ref.d.ts.map +1 -0
  120. package/dist/types/ref-drivers/git-current-ref.spec.d.ts +2 -0
  121. package/dist/types/ref-drivers/git-current-ref.spec.d.ts.map +1 -0
  122. package/{lib/cjs → dist/types}/ref-drivers/index.d.ts +1 -0
  123. package/dist/types/ref-drivers/index.d.ts.map +1 -0
  124. package/{lib/cjs → dist/types}/ref-drivers/types.d.ts +1 -0
  125. package/dist/types/ref-drivers/types.d.ts.map +1 -0
  126. package/{lib/cjs → dist/types}/template-sync.d.ts +6 -5
  127. package/dist/types/template-sync.d.ts.map +1 -0
  128. package/dist/types/template-sync.spec.d.ts +2 -0
  129. package/dist/types/template-sync.spec.d.ts.map +1 -0
  130. package/{lib/cjs → dist/types}/test-utils/index.d.ts +1 -0
  131. package/dist/types/test-utils/index.d.ts.map +1 -0
  132. package/{lib/cjs → dist/types}/types.d.ts +1 -0
  133. package/dist/types/types.d.ts.map +1 -0
  134. package/package.json +26 -23
  135. package/.eslintrc.js +0 -10
  136. package/.github/CODEOWNERS +0 -6
  137. package/.github/workflows/pr-checks.yaml +0 -12
  138. package/.github/workflows/release.yaml +0 -47
  139. package/.github/workflows/test-flow.yaml +0 -63
  140. package/.husky/commit-msg +0 -4
  141. package/.prettierignore +0 -1
  142. package/.prettierrc +0 -1
  143. package/action.yml +0 -13
  144. package/commitlint.config.js +0 -3
  145. package/docs/merge-plugins/CURRENT_PLUGINS.md +0 -168
  146. package/docs/merge-plugins/PLUGIN_DEVELOPMENT.md +0 -122
  147. package/docs/merge-plugins/README.md +0 -75
  148. package/jest.config.js +0 -19
  149. package/lib/cjs/checkout-drivers/git-checkout.js +0 -29
  150. package/lib/cjs/checkout-drivers/index.js +0 -18
  151. package/lib/cjs/checkout-drivers/types.js +0 -2
  152. package/lib/cjs/clone-drivers/git-clone.js +0 -17
  153. package/lib/cjs/clone-drivers/index.js +0 -18
  154. package/lib/cjs/clone-drivers/types.js +0 -2
  155. package/lib/cjs/diff-drivers/git-diff.js +0 -41
  156. package/lib/cjs/diff-drivers/index.js +0 -18
  157. package/lib/cjs/diff-drivers/types.js +0 -2
  158. package/lib/cjs/formatting/index.js +0 -18
  159. package/lib/cjs/formatting/infer-json-indent.js +0 -18
  160. package/lib/cjs/formatting/sync-results-to-md.d.ts +0 -2
  161. package/lib/cjs/formatting/sync-results-to-md.js +0 -57
  162. package/lib/cjs/index.js +0 -19
  163. package/lib/cjs/load-plugin.js +0 -69
  164. package/lib/cjs/match.js +0 -45
  165. package/lib/cjs/merge-file.js +0 -98
  166. package/lib/cjs/plugins/index.js +0 -11
  167. package/lib/cjs/plugins/json-merge.js +0 -208
  168. package/lib/cjs/ref-drivers/git-current-ref.js +0 -12
  169. package/lib/cjs/ref-drivers/index.js +0 -17
  170. package/lib/cjs/ref-drivers/types.js +0 -2
  171. package/lib/cjs/template-sync.js +0 -163
  172. package/lib/cjs/test-utils/index.js +0 -10
  173. package/lib/cjs/types.js +0 -2
  174. package/lib/esm/checkout-drivers/git-checkout.js +0 -29
  175. package/lib/esm/checkout-drivers/index.js +0 -18
  176. package/lib/esm/checkout-drivers/types.js +0 -2
  177. package/lib/esm/clone-drivers/git-clone.js +0 -17
  178. package/lib/esm/clone-drivers/index.js +0 -18
  179. package/lib/esm/clone-drivers/types.js +0 -2
  180. package/lib/esm/diff-drivers/git-diff.js +0 -41
  181. package/lib/esm/diff-drivers/index.js +0 -18
  182. package/lib/esm/diff-drivers/types.js +0 -2
  183. package/lib/esm/formatting/index.js +0 -18
  184. package/lib/esm/formatting/infer-json-indent.js +0 -18
  185. package/lib/esm/formatting/sync-results-to-md.js +0 -57
  186. package/lib/esm/index.js +0 -19
  187. package/lib/esm/load-plugin.js +0 -46
  188. package/lib/esm/match.js +0 -45
  189. package/lib/esm/merge-file.js +0 -98
  190. package/lib/esm/plugins/index.js +0 -11
  191. package/lib/esm/plugins/json-merge.js +0 -208
  192. package/lib/esm/ref-drivers/git-current-ref.js +0 -12
  193. package/lib/esm/ref-drivers/index.js +0 -17
  194. package/lib/esm/ref-drivers/types.js +0 -2
  195. package/lib/esm/template-sync.js +0 -163
  196. package/lib/esm/test-utils/index.js +0 -10
  197. package/lib/esm/types.js +0 -2
  198. package/release.config.js +0 -40
  199. package/src/checkout-drivers/git-checkout.spec.ts +0 -69
  200. package/src/checkout-drivers/git-checkout.ts +0 -38
  201. package/src/checkout-drivers/index.ts +0 -2
  202. package/src/checkout-drivers/types.ts +0 -14
  203. package/src/clone-drivers/git-clone.ts +0 -20
  204. package/src/clone-drivers/index.ts +0 -2
  205. package/src/clone-drivers/types.ts +0 -20
  206. package/src/diff-drivers/git-diff.spec.ts +0 -73
  207. package/src/diff-drivers/git-diff.ts +0 -39
  208. package/src/diff-drivers/index.ts +0 -2
  209. package/src/diff-drivers/types.ts +0 -14
  210. package/src/formatting/__snapshots__/sync-results-to-md.spec.ts.snap +0 -39
  211. package/src/formatting/index.ts +0 -2
  212. package/src/formatting/infer-json-indent.spec.ts +0 -49
  213. package/src/formatting/infer-json-indent.ts +0 -16
  214. package/src/formatting/sync-results-to-md.spec.ts +0 -31
  215. package/src/formatting/sync-results-to-md.ts +0 -63
  216. package/src/index.ts +0 -3
  217. package/src/load-plugin.ts +0 -51
  218. package/src/match.spec.ts +0 -68
  219. package/src/match.ts +0 -52
  220. package/src/merge-file.spec.ts +0 -506
  221. package/src/merge-file.ts +0 -154
  222. package/src/plugins/index.ts +0 -12
  223. package/src/plugins/json-merge.spec.ts +0 -436
  224. package/src/plugins/json-merge.ts +0 -215
  225. package/src/ref-drivers/git-current-ref.spec.ts +0 -12
  226. package/src/ref-drivers/git-current-ref.ts +0 -9
  227. package/src/ref-drivers/index.ts +0 -1
  228. package/src/ref-drivers/types.ts +0 -10
  229. package/src/template-sync.spec.ts +0 -509
  230. package/src/template-sync.ts +0 -256
  231. package/src/test-utils/index.ts +0 -13
  232. package/src/types.ts +0 -129
  233. package/templatesync.local.json +0 -15
  234. package/test-fixtures/downstream/README.md +0 -3
  235. package/test-fixtures/downstream/package.json +0 -18
  236. package/test-fixtures/downstream/plugins/custom-plugin.js +0 -11
  237. package/test-fixtures/downstream/src/index.js +0 -2
  238. package/test-fixtures/downstream/src/index.ts +0 -1
  239. package/test-fixtures/downstream/src/templated.js +0 -2
  240. package/test-fixtures/downstream/src/templated.ts +0 -1
  241. package/test-fixtures/downstream/templatesync.json +0 -16
  242. package/test-fixtures/downstream/templatesync.local.json +0 -10
  243. package/test-fixtures/dummy-plugin.js +0 -8
  244. package/test-fixtures/glob-test/folder1/something.js +0 -1
  245. package/test-fixtures/glob-test/folder1/something.ts +0 -0
  246. package/test-fixtures/glob-test/toplevel.js +0 -0
  247. package/test-fixtures/glob-test/toplevel.txt +0 -0
  248. package/test-fixtures/template/custom-bin/something.txt +0 -1
  249. package/test-fixtures/template/package.json +0 -17
  250. package/test-fixtures/template/src/index.js +0 -2
  251. package/test-fixtures/template/src/index.ts +0 -1
  252. package/test-fixtures/template/src/templated.js +0 -2
  253. package/test-fixtures/template/src/templated.ts +0 -1
  254. package/test-fixtures/template/templatesync.json +0 -16
  255. package/test-fixtures/testGitRepo/README.md +0 -17
  256. package/test-fixtures/testGitRepo/gitDir/COMMIT_EDITMSG +0 -14
  257. package/test-fixtures/testGitRepo/gitDir/HEAD +0 -1
  258. package/test-fixtures/testGitRepo/gitDir/config +0 -7
  259. package/test-fixtures/testGitRepo/gitDir/description +0 -1
  260. package/test-fixtures/testGitRepo/gitDir/hooks/applypatch-msg.sample +0 -15
  261. package/test-fixtures/testGitRepo/gitDir/hooks/commit-msg.sample +0 -24
  262. package/test-fixtures/testGitRepo/gitDir/hooks/fsmonitor-watchman.sample +0 -174
  263. package/test-fixtures/testGitRepo/gitDir/hooks/post-update.sample +0 -8
  264. package/test-fixtures/testGitRepo/gitDir/hooks/pre-applypatch.sample +0 -14
  265. package/test-fixtures/testGitRepo/gitDir/hooks/pre-commit.sample +0 -49
  266. package/test-fixtures/testGitRepo/gitDir/hooks/pre-merge-commit.sample +0 -13
  267. package/test-fixtures/testGitRepo/gitDir/hooks/pre-push.sample +0 -53
  268. package/test-fixtures/testGitRepo/gitDir/hooks/pre-rebase.sample +0 -169
  269. package/test-fixtures/testGitRepo/gitDir/hooks/pre-receive.sample +0 -24
  270. package/test-fixtures/testGitRepo/gitDir/hooks/prepare-commit-msg.sample +0 -42
  271. package/test-fixtures/testGitRepo/gitDir/hooks/push-to-checkout.sample +0 -78
  272. package/test-fixtures/testGitRepo/gitDir/hooks/sendemail-validate.sample +0 -77
  273. package/test-fixtures/testGitRepo/gitDir/hooks/update.sample +0 -128
  274. package/test-fixtures/testGitRepo/gitDir/index +0 -0
  275. package/test-fixtures/testGitRepo/gitDir/info/exclude +0 -6
  276. package/test-fixtures/testGitRepo/gitDir/logs/HEAD +0 -5
  277. package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/master +0 -2
  278. package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/test-branch +0 -2
  279. package/test-fixtures/testGitRepo/gitDir/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  280. package/test-fixtures/testGitRepo/gitDir/objects/6e/187bee8d02f39d0a1be8331dd8fe6a00c9b613 +0 -0
  281. package/test-fixtures/testGitRepo/gitDir/objects/73/185f1f3f5a6345e087d9f46dc4af77cc59449f +0 -2
  282. package/test-fixtures/testGitRepo/gitDir/objects/90/e7ea1089f939840e9649fd617584c1ad117159 +0 -3
  283. package/test-fixtures/testGitRepo/gitDir/objects/ba/99a452b9097047e9bfa8d5a08b3e452fcb364a +0 -0
  284. package/test-fixtures/testGitRepo/gitDir/objects/c5/8d400177cd5180b8566f82a127fafc5bf394b7 +0 -0
  285. package/test-fixtures/testGitRepo/gitDir/objects/e2/e668265db019249a7e8296d85f79000e3d71cf +0 -0
  286. package/test-fixtures/testGitRepo/gitDir/objects/e4/243e430c1ab69f3e344249f5b1859e90abc883 +0 -1
  287. package/test-fixtures/testGitRepo/gitDir/objects/ec/6c1cb72312605282ac61858cf1eaf1ea9f1d02 +0 -0
  288. package/test-fixtures/testGitRepo/gitDir/objects/fc/89cecc4ac0b5b075bd7d0ce9e09b2f50598b82 +0 -0
  289. package/test-fixtures/testGitRepo/gitDir/refs/heads/master +0 -1
  290. package/test-fixtures/testGitRepo/gitDir/refs/heads/test-branch +0 -1
  291. package/tsconfig.cjs.json +0 -12
  292. package/tsconfig.esm.json +0 -10
  293. package/tsconfig.json +0 -22
@@ -1,506 +0,0 @@
1
- import { join, resolve } from "path";
2
- import { mergeFile } from "./merge-file";
3
- import { tempDir, TEST_FIXTURES_DIR } from "./test-utils";
4
- import { mkdtemp, readFile, rm } from "fs/promises";
5
- import { copySync } from "fs-extra";
6
- import { FileOperation, JsonFileMergeOptions } from "./types";
7
- import { existsSync } from "fs";
8
-
9
- const testTemplateDir = resolve(TEST_FIXTURES_DIR, "template");
10
- const testDownstreamDir = resolve(TEST_FIXTURES_DIR, "downstream");
11
-
12
- describe("mergeFile", () => {
13
- let tmpDir: string;
14
- let tmpTemplateDir: string;
15
- beforeEach(async () => {
16
- tmpDir = await mkdtemp(tempDir());
17
- copySync(testDownstreamDir, tmpDir);
18
- tmpTemplateDir = await mkdtemp(tempDir());
19
- copySync(testTemplateDir, tmpTemplateDir);
20
- });
21
- afterEach(async () => {
22
- await rm(tmpDir, {
23
- force: true,
24
- recursive: true,
25
- });
26
- await rm(tmpTemplateDir, {
27
- force: true,
28
- recursive: true,
29
- });
30
- });
31
- // Note: we use the "ignore" from the templateSync to constrain files we iterate over so it doeesn't happen here
32
- // it('skips the file if it is part of template config ignroe', async () => {
33
- // expect(await mergeFile('package.json', {
34
- // cwd: tmpDir,
35
- // tempCloneDir: testTemplateDir,
36
- // localTemplateSyncConfig: {
37
- // ignore: [],
38
- // merge: {
39
- // }
40
- // },
41
- // templateSyncConfig: {
42
- // ignore: ['**/package.json'],
43
- // }
44
- // })).toBe(false)
45
- // })
46
- it.each([["added"], ["deleted"], ["modified"]])(
47
- "skips the [%s] file if it is part of local config ignore",
48
- async (op) => {
49
- expect(
50
- await mergeFile("package.json", {
51
- cwd: tmpDir,
52
- tempCloneDir: tmpTemplateDir,
53
- localTemplateSyncConfig: {
54
- ignore: ["**/package.json"],
55
- merge: [],
56
- },
57
- templateSyncConfig: {
58
- ignore: ["**/*.txt"],
59
- },
60
- fileOperation: op as FileOperation,
61
- }),
62
- ).toEqual({
63
- ignoredDueToLocal: true,
64
- });
65
- },
66
- );
67
- it.each([["added"], ["modified"]])(
68
- "overwrites if no merge config for [%s] files",
69
- async (op) => {
70
- expect(
71
- await mergeFile("package.json", {
72
- cwd: tmpDir,
73
- tempCloneDir: tmpTemplateDir,
74
- localTemplateSyncConfig: {
75
- ignore: [],
76
- },
77
- templateSyncConfig: {
78
- ignore: ["**/*.txt"],
79
- },
80
- fileOperation: op as FileOperation,
81
- }),
82
- ).toEqual({
83
- ignoredDueToLocal: false,
84
- localChanges: [],
85
- });
86
-
87
- // Ensure we overwrote
88
- expect(await readFile(join(tmpDir, "package.json"))).toEqual(
89
- await readFile(join(tmpTemplateDir, "package.json")),
90
- );
91
- },
92
- );
93
- it("removes the template deleted files", async () => {
94
- expect(
95
- await mergeFile("package.json", {
96
- cwd: tmpDir,
97
- tempCloneDir: tmpTemplateDir,
98
- localTemplateSyncConfig: {
99
- ignore: [],
100
- },
101
- templateSyncConfig: {
102
- ignore: ["**/*.txt"],
103
- },
104
- fileOperation: "deleted", // This is normally inferred by the top-level code
105
- }),
106
- ).toEqual({
107
- ignoredDueToLocal: false,
108
- localChanges: [],
109
- });
110
-
111
- // Ensure we overwrote
112
- expect(existsSync(join(tmpDir, "package.json"))).toBeFalsy();
113
- });
114
-
115
- // TODO - this could change if there's a use case
116
- it("does not apply plugins on deleted", async () => {
117
- expect(
118
- await mergeFile("package.json", {
119
- cwd: tmpDir,
120
- tempCloneDir: tmpTemplateDir,
121
- localTemplateSyncConfig: {
122
- ignore: [],
123
- merge: [
124
- {
125
- plugin: "_json",
126
- glob: "**/package.json",
127
- options: {
128
- paths: [
129
- // Do not touch huh
130
- ["$.dependencies.huh", "merge-current"],
131
- ],
132
- },
133
- },
134
- ],
135
- },
136
- templateSyncConfig: {
137
- ignore: ["**/*.txt"],
138
- merge: [
139
- {
140
- glob: "**/package.json",
141
- plugin: "_json",
142
- options: {
143
- missingIsDelete: true,
144
- paths: [
145
- // Merge all template dependencies
146
- ["$.dependencies", "merge-template"],
147
- ],
148
- } as JsonFileMergeOptions,
149
- },
150
- ],
151
- },
152
- fileOperation: "deleted", // This is normally inferred by the top-level code
153
- }),
154
- ).toEqual({
155
- ignoredDueToLocal: false,
156
- localChanges: [],
157
- });
158
-
159
- // Ensure we overwrote
160
- expect(existsSync(join(tmpDir, "package.json"))).toBeFalsy();
161
- });
162
-
163
- describe.each([["added" as FileOperation], ["modified" as FileOperation]])(
164
- "[%s] file",
165
- (op: FileOperation) => {
166
- // Yea... these are more integration tests but I'm kinda untrusting of mocks for this
167
- it("applies default [.json] merge with first rules if merge applies to file", async () => {
168
- expect(
169
- await mergeFile("package.json", {
170
- cwd: tmpDir,
171
- tempCloneDir: testTemplateDir,
172
- localTemplateSyncConfig: {
173
- ignore: [],
174
- },
175
- fileOperation: op,
176
- templateSyncConfig: {
177
- ignore: ["**/*.txt"],
178
- merge: [
179
- {
180
- glob: "**/package.json",
181
- options: "merge-current",
182
- plugin: "_json",
183
- },
184
- {
185
- glob: "**/package.json",
186
- options: "merge-template",
187
- plugin: "_json",
188
- },
189
- ],
190
- },
191
- }),
192
- ).toEqual({
193
- ignoredDueToLocal: false,
194
- localChanges: [],
195
- });
196
-
197
- // Ensure we overwrote
198
- expect(
199
- JSON.parse((await readFile(join(tmpDir, "package.json"))).toString()),
200
- ).toEqual({
201
- name: "mypkg",
202
- description: "my description",
203
- dependencies: {
204
- mypackage: "^1.2.0",
205
- newpacakge: "^22.2.2",
206
- package2: "3.22.1",
207
- huh: "^2.30.0",
208
- },
209
- engines: {
210
- node: ">=20",
211
- },
212
- scripts: {
213
- build: "build",
214
- test: "jest",
215
- myscript: "somescript",
216
- },
217
- version: "new-version",
218
- });
219
- });
220
- it("[inverse] applies default [.json] merge with first rules if merge applies to file", async () => {
221
- expect(
222
- await mergeFile("package.json", {
223
- cwd: tmpDir,
224
- tempCloneDir: testTemplateDir,
225
- localTemplateSyncConfig: {
226
- ignore: [],
227
- },
228
- fileOperation: op,
229
- templateSyncConfig: {
230
- ignore: ["**/*.txt"],
231
- merge: [
232
- {
233
- glob: "**/package.json",
234
- options: "merge-template",
235
- plugin: "_json",
236
- },
237
- {
238
- glob: "**/package.json",
239
- options: "merge-current",
240
- plugin: "_json",
241
- },
242
- ],
243
- },
244
- }),
245
- ).toEqual({
246
- ignoredDueToLocal: false,
247
- localChanges: [],
248
- });
249
-
250
- // Ensure we overwrote
251
- expect(
252
- JSON.parse((await readFile(join(tmpDir, "package.json"))).toString()),
253
- ).toEqual({
254
- name: "some-stub-name",
255
- description: "some-stub-description",
256
- dependencies: {
257
- mypackage: "^1.2.0",
258
- newpacakge: "^22.2.2",
259
- package2: "3.22.1",
260
- huh: "~1.0.0",
261
- },
262
- engines: {
263
- node: ">=15",
264
- },
265
- scripts: {
266
- build: "build",
267
- test: "fill this in yourself",
268
- myscript: "somescript",
269
- },
270
- version: "new-version",
271
- });
272
- });
273
- it("[inverse] applies default [.json] merge with sync and then local override", async () => {
274
- expect(
275
- await mergeFile("package.json", {
276
- cwd: tmpDir,
277
- tempCloneDir: testTemplateDir,
278
- fileOperation: op,
279
- localTemplateSyncConfig: {
280
- ignore: [],
281
- merge: [
282
- {
283
- plugin: "_json",
284
- glob: "**/package.json",
285
- options: {
286
- paths: [
287
- // Do not touch huh
288
- ["$.dependencies.huh", "merge-current"],
289
- ],
290
- },
291
- },
292
- ],
293
- },
294
- templateSyncConfig: {
295
- ignore: ["**/*.txt"],
296
- merge: [
297
- {
298
- glob: "**/package.json",
299
- plugin: "_json",
300
- options: {
301
- missingIsDelete: true,
302
- paths: [
303
- // Merge all template dependencies
304
- ["$.dependencies", "merge-template"],
305
- ],
306
- } as JsonFileMergeOptions,
307
- },
308
- ],
309
- },
310
- }),
311
- ).toEqual({
312
- ignoredDueToLocal: false,
313
- localChanges: expect.arrayContaining([
314
- {
315
- added: undefined,
316
- count: 1,
317
- removed: true,
318
- value: ' "huh": "~1.0.0"\n',
319
- },
320
- {
321
- added: true,
322
- count: 1,
323
- removed: undefined,
324
- value: ' "huh": "^2.30.0"\n',
325
- },
326
- ]),
327
- });
328
-
329
- // Ensure we overwrote
330
- expect(
331
- JSON.parse((await readFile(join(tmpDir, "package.json"))).toString()),
332
- ).toEqual({
333
- name: "mypkg",
334
- description: "my description",
335
- dependencies: {
336
- mypackage: "^1.2.0",
337
- newpacakge: "^22.2.2",
338
- package2: "3.22.1",
339
- huh: "^2.30.0",
340
- },
341
- engines: {
342
- node: ">=20",
343
- },
344
- scripts: {
345
- build: "build",
346
- test: "jest",
347
- myscript: "somescript",
348
- },
349
- version: "new-version",
350
- });
351
- });
352
- it("[inverse] applies default [.json] and custom merge for local with sync and then local override", async () => {
353
- expect(
354
- await mergeFile("package.json", {
355
- cwd: tmpDir,
356
- tempCloneDir: testTemplateDir,
357
- fileOperation: op,
358
- localTemplateSyncConfig: {
359
- ignore: [],
360
- merge: [
361
- {
362
- plugin: "../test-fixtures/dummy-plugin.js",
363
- options: {
364
- paths: [
365
- // Do not touch huh
366
- ["$.dependencies.huh", "merge-current"],
367
- ],
368
- },
369
- glob: "**/package.json",
370
- },
371
- ],
372
- },
373
- templateSyncConfig: {
374
- ignore: ["**/*.txt"],
375
- merge: [
376
- {
377
- plugin: "_json",
378
- glob: "**/package.json",
379
- options: {
380
- missingIsDelete: true,
381
- paths: [
382
- // Merge all template dependencies
383
- ["$.dependencies", "merge-template"],
384
- ],
385
- } as JsonFileMergeOptions,
386
- },
387
- ],
388
- },
389
- }),
390
- ).toEqual({
391
- ignoredDueToLocal: false,
392
- // TODO: I don't
393
- localChanges: expect.arrayContaining([
394
- {
395
- added: undefined,
396
- count: 17,
397
- removed: true,
398
- value: ` "name": "mypkg",
399
- "description": "my description",
400
- "dependencies": {
401
- "mypackage": "^1.2.0",
402
- "newpacakge": "^22.2.2",
403
- "package2": "3.22.1",
404
- "huh": "~1.0.0"
405
- },
406
- "engines": {
407
- "node": ">=20"
408
- },
409
- "scripts": {
410
- "build": "build",
411
- "test": "jest",
412
- "myscript": "somescript"
413
- },
414
- "version": "new-version"\n`,
415
- },
416
- {
417
- added: true,
418
- count: 1,
419
- removed: undefined,
420
- value: ` "tested": true\n`,
421
- },
422
- ]),
423
- });
424
-
425
- // Ensure we overwrote
426
- expect(
427
- JSON.parse((await readFile(join(tmpDir, "package.json"))).toString()),
428
- ).toEqual({
429
- tested: true,
430
- });
431
- });
432
- it("[inverse] applies builtin _json and custom merge for local with sync plugin and then local override", async () => {
433
- expect(
434
- await mergeFile("package.json", {
435
- cwd: tmpDir,
436
- tempCloneDir: testTemplateDir,
437
- fileOperation: op,
438
- localTemplateSyncConfig: {
439
- ignore: [],
440
- merge: [
441
- {
442
- glob: "**/package.json",
443
- plugin: "plugins/custom-plugin.js",
444
- options: {
445
- paths: [
446
- // Do not touch huh
447
- ["$.dependencies.huh", "merge-current"],
448
- ],
449
- },
450
- },
451
- ],
452
- },
453
- templateSyncConfig: {
454
- ignore: ["**/*.txt"],
455
- merge: [
456
- {
457
- glob: "**/package.json",
458
- // TODO - we need to handle the weird implicit case I added here. It's dumb
459
- options: {
460
- missingIsDelete: true,
461
- paths: [
462
- // Merge all template dependencies
463
- ["$.dependencies", "merge-template"],
464
- ],
465
- } as JsonFileMergeOptions,
466
- plugin: "_json",
467
- },
468
- ],
469
- // ".json": {
470
- // // no plugins
471
- // rules: [
472
- // {
473
- // glob: "**/package.json",
474
- // options: {
475
- // missingIsDelete: true,
476
- // paths: [
477
- // // Merge all template dependencies
478
- // ["$.dependencies", "merge-template"],
479
- // ],
480
- // } as JsonFileMergeOptions,
481
- // },
482
- // {
483
- // glob: "**/package.json",
484
- // options: "merge-current",
485
- // },
486
- // ],
487
- // },
488
- // },
489
- },
490
- }),
491
- ).toEqual({
492
- ignoredDueToLocal: false,
493
- // We are just making sure plugin look up happens here
494
- localChanges: expect.arrayContaining([]),
495
- });
496
-
497
- // Ensure we overwrote
498
- expect(
499
- JSON.parse((await readFile(join(tmpDir, "package.json"))).toString()),
500
- ).toEqual({
501
- downstream: true,
502
- });
503
- });
504
- },
505
- );
506
- });
package/src/merge-file.ts DELETED
@@ -1,154 +0,0 @@
1
- import { isMatch, some } from "micromatch";
2
- import { Config, FileOperation, MergeContext, MergePlugin } from "./types";
3
- import { extname, join } from "path";
4
- import { existsSync } from "fs";
5
- import { readFile, rm } from "fs/promises";
6
- import { loadPlugin } from "./load-plugin";
7
- import { Change, diffLines } from "diff";
8
- import { outputFile } from "fs-extra";
9
-
10
- interface MergeFileOptions {
11
- localTemplateSyncConfig: Config;
12
- templateSyncConfig: Config;
13
- tempCloneDir: string;
14
- cwd: string;
15
- fileOperation: FileOperation;
16
- }
17
-
18
- interface MergeFileReturn {
19
- /**
20
- * If the file was ignored due to the local config
21
- */
22
- ignoredDueToLocal: boolean;
23
- /**
24
- * Only available if the file wasn't ignored, this is a list of lineDiffs
25
- * from the diff library that were applied to what would've been changed by
26
- * the base templatesync repo
27
- */
28
- localChanges?: Change[];
29
- }
30
-
31
- /**
32
- * Applies the merge to a file according to the context information.
33
- *
34
- * Returns true if merged and false if skipped
35
- * @param relPath
36
- * @param context
37
- * @returns
38
- */
39
- export async function mergeFile(
40
- relPath: string,
41
- context: MergeFileOptions,
42
- ): Promise<MergeFileReturn> {
43
- const { localTemplateSyncConfig, templateSyncConfig, tempCloneDir, cwd } =
44
- context;
45
-
46
- if (some(relPath, localTemplateSyncConfig.ignore)) {
47
- return {
48
- ignoredDueToLocal: true,
49
- };
50
- }
51
-
52
- const ext = extname(relPath);
53
- const filePath = join(cwd, relPath);
54
- const templatePath = join(tempCloneDir, relPath);
55
-
56
- // Unless there's a need, we remove files that were deleted and don't pass them to plugins yet
57
- if (context.fileOperation === "deleted") {
58
- if (existsSync(filePath)) {
59
- await rm(filePath);
60
- }
61
- return {
62
- ignoredDueToLocal: false,
63
- localChanges: [],
64
- };
65
- }
66
-
67
- const mergeConfig = templateSyncConfig.merge?.find((mergeConfig) =>
68
- isMatch(relPath, mergeConfig.glob),
69
- );
70
- const localMergeConfig = localTemplateSyncConfig.merge?.find((mergeConfig) =>
71
- isMatch(relPath, mergeConfig.glob),
72
- );
73
-
74
- const mergeHandler = mergeConfig
75
- ? await loadPlugin(mergeConfig, tempCloneDir)
76
- : undefined;
77
- const localMergeHandler = localMergeConfig
78
- ? await loadPlugin(localMergeConfig, cwd)
79
- : undefined;
80
-
81
- // Either write the merge or write the file
82
- let fileContents: string;
83
- const localChanges: Change[] = [];
84
- if (existsSync(filePath) && (mergeHandler || localMergeHandler)) {
85
- const originalCurrentFile = (await readFile(filePath)).toString();
86
- if (mergeHandler) {
87
- fileContents = await safeMerge(
88
- mergeHandler,
89
- mergeConfig?.plugin ?? `default for ${ext}`,
90
- originalCurrentFile,
91
- (await readFile(templatePath)).toString(),
92
- {
93
- relFilePath: relPath,
94
- mergeArguments: mergeConfig?.options ?? {},
95
- isLocalOptions: false,
96
- },
97
- );
98
- } else {
99
- // Apply overwrite if we didn't set up merge
100
- fileContents = (await readFile(templatePath)).toString();
101
- }
102
-
103
- // We apply the localMerge Config to the fileContent output by the template merge
104
- if (localMergeHandler) {
105
- const localContents = await safeMerge(
106
- localMergeHandler,
107
- localMergeConfig?.plugin ?? `default for ${ext}`,
108
- originalCurrentFile,
109
- fileContents,
110
- {
111
- relFilePath: relPath,
112
- mergeArguments: localMergeConfig?.options ?? {},
113
- isLocalOptions: true,
114
- },
115
- );
116
- localChanges.push(...diffLines(fileContents, localContents));
117
- fileContents = localContents;
118
- }
119
- } else {
120
- // Just perform simple overwrite
121
- fileContents = (await readFile(templatePath)).toString();
122
- }
123
- await outputFile(filePath, fileContents);
124
- return {
125
- ignoredDueToLocal: false,
126
- localChanges,
127
- };
128
- }
129
-
130
- /**
131
- * Simple helper function to ensure that we don't let bad plugins corrupt the call flow
132
- * @param plugin
133
- */
134
- async function safeMerge(
135
- plugin: MergePlugin<unknown>,
136
- pluginPath: string,
137
- current: string,
138
- fromTemplate: string,
139
- context: MergeContext,
140
- ) {
141
- const ret = await plugin.merge(current, fromTemplate, context);
142
- if (typeof ret !== "string") {
143
- throw new Error(
144
- `Plugin ${pluginPath} did not return string for merge function! This is not allowed!`,
145
- );
146
- }
147
-
148
- if (!ret) {
149
- throw new Error(
150
- `Plugin ${pluginPath} should not make a merge be an empty string!`,
151
- );
152
- }
153
- return ret as string;
154
- }
@@ -1,12 +0,0 @@
1
- import { JsonFileMergeOptions, MergePlugin } from "../types";
2
- import { merge as jsonMerge, validate as jsonValidate } from "./json-merge";
3
-
4
- export const defaultExtensionMap = {
5
- ".json": {
6
- merge: jsonMerge,
7
- validate: jsonValidate,
8
- builtinName: "_json",
9
- },
10
- } as {
11
- [ext: string]: MergePlugin<JsonFileMergeOptions> & { builtinName: string };
12
- };