@hanseltime/template-repo-sync 2.3.0 → 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 (295) hide show
  1. package/CHANGELOG.md +37 -46
  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 -204
  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 -204
  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 -602
  230. package/src/template-sync.ts +0 -304
  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 -14
  237. package/test-fixtures/downstream/plugins/fail-validate-plugin.js +0 -14
  238. package/test-fixtures/downstream/src/index.js +0 -2
  239. package/test-fixtures/downstream/src/index.ts +0 -1
  240. package/test-fixtures/downstream/src/templated.js +0 -2
  241. package/test-fixtures/downstream/src/templated.ts +0 -1
  242. package/test-fixtures/downstream/templatesync.json +0 -16
  243. package/test-fixtures/downstream/templatesync.local.json +0 -10
  244. package/test-fixtures/dummy-plugin.js +0 -8
  245. package/test-fixtures/glob-test/folder1/something.js +0 -1
  246. package/test-fixtures/glob-test/folder1/something.ts +0 -0
  247. package/test-fixtures/glob-test/toplevel.js +0 -0
  248. package/test-fixtures/glob-test/toplevel.txt +0 -0
  249. package/test-fixtures/template/custom-bin/something.txt +0 -1
  250. package/test-fixtures/template/dummy-fail-plugin.js +0 -8
  251. package/test-fixtures/template/package.json +0 -17
  252. package/test-fixtures/template/src/index.js +0 -2
  253. package/test-fixtures/template/src/index.ts +0 -1
  254. package/test-fixtures/template/src/templated.js +0 -2
  255. package/test-fixtures/template/src/templated.ts +0 -1
  256. package/test-fixtures/template/templatesync.json +0 -16
  257. package/test-fixtures/testGitRepo/README.md +0 -17
  258. package/test-fixtures/testGitRepo/gitDir/COMMIT_EDITMSG +0 -14
  259. package/test-fixtures/testGitRepo/gitDir/HEAD +0 -1
  260. package/test-fixtures/testGitRepo/gitDir/config +0 -7
  261. package/test-fixtures/testGitRepo/gitDir/description +0 -1
  262. package/test-fixtures/testGitRepo/gitDir/hooks/applypatch-msg.sample +0 -15
  263. package/test-fixtures/testGitRepo/gitDir/hooks/commit-msg.sample +0 -24
  264. package/test-fixtures/testGitRepo/gitDir/hooks/fsmonitor-watchman.sample +0 -174
  265. package/test-fixtures/testGitRepo/gitDir/hooks/post-update.sample +0 -8
  266. package/test-fixtures/testGitRepo/gitDir/hooks/pre-applypatch.sample +0 -14
  267. package/test-fixtures/testGitRepo/gitDir/hooks/pre-commit.sample +0 -49
  268. package/test-fixtures/testGitRepo/gitDir/hooks/pre-merge-commit.sample +0 -13
  269. package/test-fixtures/testGitRepo/gitDir/hooks/pre-push.sample +0 -53
  270. package/test-fixtures/testGitRepo/gitDir/hooks/pre-rebase.sample +0 -169
  271. package/test-fixtures/testGitRepo/gitDir/hooks/pre-receive.sample +0 -24
  272. package/test-fixtures/testGitRepo/gitDir/hooks/prepare-commit-msg.sample +0 -42
  273. package/test-fixtures/testGitRepo/gitDir/hooks/push-to-checkout.sample +0 -78
  274. package/test-fixtures/testGitRepo/gitDir/hooks/sendemail-validate.sample +0 -77
  275. package/test-fixtures/testGitRepo/gitDir/hooks/update.sample +0 -128
  276. package/test-fixtures/testGitRepo/gitDir/index +0 -0
  277. package/test-fixtures/testGitRepo/gitDir/info/exclude +0 -6
  278. package/test-fixtures/testGitRepo/gitDir/logs/HEAD +0 -5
  279. package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/master +0 -2
  280. package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/test-branch +0 -2
  281. package/test-fixtures/testGitRepo/gitDir/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  282. package/test-fixtures/testGitRepo/gitDir/objects/6e/187bee8d02f39d0a1be8331dd8fe6a00c9b613 +0 -0
  283. package/test-fixtures/testGitRepo/gitDir/objects/73/185f1f3f5a6345e087d9f46dc4af77cc59449f +0 -2
  284. package/test-fixtures/testGitRepo/gitDir/objects/90/e7ea1089f939840e9649fd617584c1ad117159 +0 -3
  285. package/test-fixtures/testGitRepo/gitDir/objects/ba/99a452b9097047e9bfa8d5a08b3e452fcb364a +0 -0
  286. package/test-fixtures/testGitRepo/gitDir/objects/c5/8d400177cd5180b8566f82a127fafc5bf394b7 +0 -0
  287. package/test-fixtures/testGitRepo/gitDir/objects/e2/e668265db019249a7e8296d85f79000e3d71cf +0 -0
  288. package/test-fixtures/testGitRepo/gitDir/objects/e4/243e430c1ab69f3e344249f5b1859e90abc883 +0 -1
  289. package/test-fixtures/testGitRepo/gitDir/objects/ec/6c1cb72312605282ac61858cf1eaf1ea9f1d02 +0 -0
  290. package/test-fixtures/testGitRepo/gitDir/objects/fc/89cecc4ac0b5b075bd7d0ce9e09b2f50598b82 +0 -0
  291. package/test-fixtures/testGitRepo/gitDir/refs/heads/master +0 -1
  292. package/test-fixtures/testGitRepo/gitDir/refs/heads/test-branch +0 -1
  293. package/tsconfig.cjs.json +0 -12
  294. package/tsconfig.esm.json +0 -10
  295. package/tsconfig.json +0 -22
@@ -1,602 +0,0 @@
1
- import { copy } from "fs-extra";
2
- import { mkdtemp, readFile, rm } from "fs/promises";
3
- import { templateSync } from "./template-sync";
4
- import { tempDir, TEST_FIXTURES_DIR } from "./test-utils";
5
- import { join, resolve } from "path";
6
- import { existsSync, readFileSync, writeFileSync } from "fs";
7
-
8
- const dummyCheckoutDriver = jest.fn();
9
- const dummyCurrentRefDriver = jest.fn();
10
-
11
- const downstreamDir = resolve(TEST_FIXTURES_DIR, "downstream");
12
-
13
- describe("templateSync", () => {
14
- let tmpDir: string;
15
- let templateDir: string;
16
- let dummyCloneDriver: () => Promise<{ dir: string; remoteName: string }>;
17
- beforeEach(async () => {
18
- jest.resetAllMocks();
19
- tmpDir = await mkdtemp(tempDir());
20
- templateDir = await mkdtemp(tempDir());
21
- await copy(resolve(TEST_FIXTURES_DIR, "template"), templateDir);
22
- await copy(downstreamDir, tmpDir);
23
- dummyCloneDriver = async () => {
24
- return {
25
- dir: templateDir,
26
- remoteName: "ourRemote",
27
- };
28
- };
29
- });
30
- afterEach(async () => {
31
- await rm(tmpDir, {
32
- force: true,
33
- recursive: true,
34
- });
35
- });
36
- // Note: for this test, we expect actions and users to handle misconfigured template syncs
37
- it.each([
38
- [
39
- "local",
40
- `templatesync.local.json plugin option errors:
41
- \tPlugin (plugins/fail-validate-plugin.js):
42
- \t\toh no!
43
- \t\tnot this one too!
44
- `,
45
- ],
46
- [
47
- "template",
48
- `templatesync.json plugin option errors:
49
- \tPlugin (dummy-fail-plugin.js):
50
- \t\tshucks
51
- \t\tno good
52
- `,
53
- ],
54
- [
55
- "both",
56
- `templatesync.json plugin option errors:
57
- \tPlugin (dummy-fail-plugin.js):
58
- \t\tshucks
59
- \t\tno good
60
- templatesync.local.json plugin option errors:
61
- \tPlugin (plugins/fail-validate-plugin.js):
62
- \t\toh no!
63
- \t\tnot this one too!
64
- `,
65
- ],
66
- ])("throws errors from plugin validation", async (mode, expected) => {
67
- // Remove the local sync overrides
68
- await rm(join(tmpDir, "templatesync.local.json"));
69
-
70
- if (mode === "local" || mode == "both") {
71
- writeFileSync(
72
- join(tmpDir, "templatesync.local.json"),
73
- JSON.stringify({
74
- ignore: [
75
- // Ignores the templated.ts
76
- "**/*.ts",
77
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
78
- "plugins/**",
79
- ],
80
- merge: [
81
- {
82
- glob: "package.json",
83
- plugin: "plugins/fail-validate-plugin.js",
84
- options: {},
85
- },
86
- ],
87
- }),
88
- );
89
- }
90
- if (mode === "template" || mode === "both") {
91
- writeFileSync(
92
- join(templateDir, "templatesync.json"),
93
- JSON.stringify({
94
- ignore: [
95
- // Ignores the templated.ts
96
- "**/*.ts",
97
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
98
- "plugins/**",
99
- ],
100
- merge: [
101
- {
102
- glob: "package.json",
103
- plugin: "dummy-fail-plugin.js",
104
- options: {},
105
- },
106
- ],
107
- }),
108
- );
109
- }
110
-
111
- await expect(
112
- async () =>
113
- await templateSync({
114
- tmpCloneDir: "stubbed-by-driver",
115
- cloneDriver: dummyCloneDriver,
116
- repoUrl: "not-important",
117
- repoDir: tmpDir,
118
- checkoutDriver: dummyCheckoutDriver,
119
- currentRefDriver: dummyCurrentRefDriver,
120
- }),
121
- ).rejects.toThrow(expected);
122
- });
123
- it("appropriately merges according to just the templatesync config file into an empty dir", async () => {
124
- const emptyTmpDir = await mkdtemp(tempDir());
125
- expect(
126
- await templateSync({
127
- tmpCloneDir: "stubbed-by-driver",
128
- cloneDriver: dummyCloneDriver,
129
- repoUrl: "not-important",
130
- repoDir: emptyTmpDir,
131
- checkoutDriver: dummyCheckoutDriver,
132
- currentRefDriver: dummyCurrentRefDriver,
133
- }),
134
- ).toEqual({
135
- // Expect no changes since there was no local sync file
136
- localSkipFiles: [],
137
- localFileChanges: {},
138
- modifiedFiles: {
139
- added: [
140
- "package.json",
141
- "src/index.js",
142
- "src/templated.js",
143
- "src/templated.ts",
144
- "templatesync.json",
145
- ],
146
- deleted: [],
147
- modified: [],
148
- total: 5,
149
- },
150
- });
151
-
152
- // Verify the files
153
- await fileMatchTemplate(emptyTmpDir, "templatesync.json");
154
- await fileMatchTemplate(emptyTmpDir, "package.json");
155
- await fileMatchTemplate(emptyTmpDir, "src/templated.ts");
156
-
157
- // Expect the ignores to not be a problem
158
- expect(existsSync(resolve(emptyTmpDir, "src/index.ts"))).toBeFalsy();
159
- expect(existsSync(resolve(emptyTmpDir, "src/custom-bin"))).toBeFalsy();
160
-
161
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
162
- });
163
- it("Checks out the branch and then appropriately merges", async () => {
164
- const emptyTmpDir = await mkdtemp(tempDir());
165
- expect(
166
- await templateSync({
167
- tmpCloneDir: "stubbed-by-driver",
168
- cloneDriver: dummyCloneDriver,
169
- repoUrl: "not-important",
170
- repoDir: emptyTmpDir,
171
- branch: "new-template-test",
172
- checkoutDriver: dummyCheckoutDriver,
173
- currentRefDriver: dummyCurrentRefDriver,
174
- }),
175
- ).toEqual({
176
- // Expect no changes since there was no local sync file
177
- localSkipFiles: [],
178
- localFileChanges: {},
179
- modifiedFiles: {
180
- added: [
181
- "package.json",
182
- "src/index.js",
183
- "src/templated.js",
184
- "src/templated.ts",
185
- "templatesync.json",
186
- ],
187
- deleted: [],
188
- modified: [],
189
- total: 5,
190
- },
191
- });
192
-
193
- // Verify the files
194
- await fileMatchTemplate(emptyTmpDir, "templatesync.json");
195
- await fileMatchTemplate(emptyTmpDir, "package.json");
196
- await fileMatchTemplate(emptyTmpDir, "src/templated.ts");
197
-
198
- // Expect the ignores to not be a problem
199
- expect(existsSync(resolve(emptyTmpDir, "src/index.ts"))).toBeFalsy();
200
- expect(existsSync(resolve(emptyTmpDir, "src/custom-bin"))).toBeFalsy();
201
- const cloneInfo = await dummyCloneDriver();
202
- expect(dummyCheckoutDriver).toHaveBeenCalledWith({
203
- tmpDir: cloneInfo.dir,
204
- remoteName: cloneInfo.remoteName,
205
- branch: "new-template-test",
206
- });
207
- });
208
- it("appropriately merges according to just the templatesync config file in an existing repo", async () => {
209
- // Remove the local sync overrides
210
- await rm(join(tmpDir, "templatesync.local.json"));
211
-
212
- const result = await templateSync({
213
- tmpCloneDir: "stubbed-by-driver",
214
- cloneDriver: dummyCloneDriver,
215
- repoUrl: "not-important",
216
- repoDir: tmpDir,
217
- checkoutDriver: dummyCheckoutDriver,
218
- currentRefDriver: dummyCurrentRefDriver,
219
- });
220
-
221
- expect(result.localSkipFiles).toEqual([]);
222
- expect(result.localFileChanges).toEqual({});
223
-
224
- // Verify the files
225
- await fileMatchTemplate(tmpDir, "templatesync.json");
226
- await fileMatchTemplate(tmpDir, "src/templated.ts");
227
- const packageJson = JSON.parse(
228
- readFileSync(resolve(tmpDir, "package.json")).toString(),
229
- );
230
-
231
- expect(packageJson).toEqual({
232
- name: "mypkg",
233
- description: "my description",
234
- dependencies: {
235
- mypackage: "^1.2.0",
236
- newpacakge: "^22.2.2",
237
- package2: "3.22.1",
238
- huh: "~1.0.0",
239
- },
240
- engines: {
241
- node: ">=15",
242
- },
243
- scripts: {
244
- build: "build",
245
- test: "jest",
246
- myscript: "somescript",
247
- },
248
- // By default we add new top-level fields
249
- version: "new-version",
250
- });
251
-
252
- // Expect the ignores to not be a problem
253
- await fileMatchDownstream(tmpDir, "src/index.ts");
254
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
255
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
256
- });
257
- it("appropriately merges according to the templatesync config file and the local config in an existing repo", async () => {
258
- // Remove the local sync overrides
259
- await rm(join(tmpDir, "templatesync.local.json"));
260
-
261
- writeFileSync(
262
- join(tmpDir, "templatesync.local.json"),
263
- JSON.stringify({
264
- ignore: [
265
- // Ignores the templated.ts
266
- "**/*.ts",
267
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
268
- "plugins/**",
269
- ],
270
- merge: [
271
- {
272
- glob: "package.json",
273
- plugin: "plugins/custom-plugin.js",
274
- options: {},
275
- },
276
- ],
277
- }),
278
- );
279
-
280
- const result = await templateSync({
281
- tmpCloneDir: "stubbed-by-driver",
282
- cloneDriver: dummyCloneDriver,
283
- repoUrl: "not-important",
284
- repoDir: tmpDir,
285
- checkoutDriver: dummyCheckoutDriver,
286
- currentRefDriver: dummyCurrentRefDriver,
287
- });
288
-
289
- expect(result.localSkipFiles).toEqual(["src/templated.ts"]);
290
- // TODO: more rigorous testing around diff changes
291
- expect(result.localFileChanges).toEqual(
292
- expect.objectContaining({
293
- "package.json": expect.arrayContaining([]),
294
- }),
295
- );
296
- // Make sure the result captures the changes
297
- expect(result.modifiedFiles).toEqual({
298
- added: [
299
- "package.json",
300
- "src/index.js",
301
- "src/templated.js",
302
- "templatesync.json",
303
- ],
304
- deleted: [],
305
- modified: [],
306
- total: 4,
307
- });
308
-
309
- // Verify the files
310
- await fileMatchTemplate(tmpDir, "templatesync.json");
311
- await fileMatchDownstream(tmpDir, "src/templated.ts");
312
- const packageJson = JSON.parse(
313
- readFileSync(resolve(tmpDir, "package.json")).toString(),
314
- );
315
-
316
- // The plugin nuked this
317
- expect(packageJson).toEqual({
318
- downstream: true,
319
- });
320
-
321
- // Expect the ignores to not be a problem
322
- await fileMatchDownstream(tmpDir, "src/index.ts");
323
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
324
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
325
- });
326
- it("appropriately merges according to the templatesync config file and the local config in an existing repo with afterRef", async () => {
327
- // Remove the local sync overrides
328
- await rm(join(tmpDir, "templatesync.local.json"));
329
-
330
- writeFileSync(
331
- join(tmpDir, "templatesync.local.json"),
332
- JSON.stringify({
333
- afterRef: "dummySha",
334
- ignore: [
335
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
336
- "plugins/**",
337
- ],
338
- }),
339
- );
340
-
341
- // We will only update the templated.ts
342
- const mockDiffDriver = jest.fn().mockImplementation(async () => ({
343
- added: ["src/templated.ts"],
344
- modified: [],
345
- deleted: [],
346
- }));
347
- const result = await templateSync({
348
- tmpCloneDir: "stubbed-by-driver",
349
- cloneDriver: dummyCloneDriver,
350
- repoUrl: "not-important",
351
- repoDir: tmpDir,
352
- diffDriver: mockDiffDriver,
353
- currentRefDriver: dummyCurrentRefDriver,
354
- checkoutDriver: dummyCheckoutDriver,
355
- });
356
-
357
- // since there was no override for this file, not changes from the local file
358
- expect(result.localFileChanges).toEqual(expect.objectContaining({}));
359
-
360
- // Verify the files
361
- await fileMatchTemplate(tmpDir, "templatesync.json");
362
- await fileMatchTemplate(tmpDir, "src/templated.ts");
363
-
364
- // Expect the none of the diff files to work
365
- await fileMatchDownstream(tmpDir, "src/index.ts");
366
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
367
- await fileMatchDownstream(tmpDir, "package.json");
368
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
369
- });
370
- it("updates the local templatesync with the current ref if updateAfterRef is true", async () => {
371
- // Remove the local sync overrides
372
- await rm(join(tmpDir, "templatesync.local.json"));
373
-
374
- const mockLocalConfig = {
375
- afterRef: "dummySha",
376
- ignore: [
377
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
378
- "plugins/**",
379
- ],
380
- };
381
-
382
- writeFileSync(
383
- join(tmpDir, "templatesync.local.json"),
384
- JSON.stringify(mockLocalConfig),
385
- );
386
-
387
- // We will only update the templated.ts
388
- const mockDiffDriver = jest.fn().mockImplementation(async () => ({
389
- added: ["src/templated.ts"],
390
- modified: ["src/index.ts"], // Add index.ts so we make sure it is still ignored - see test-fixtures/template/templatesync.json ignores
391
- deleted: [],
392
- }));
393
- const mockCurrentRefDriver = jest
394
- .fn()
395
- .mockImplementation(async () => "newestSha");
396
- const result = await templateSync({
397
- tmpCloneDir: "stubbed-by-driver",
398
- cloneDriver: dummyCloneDriver,
399
- repoUrl: "not-important",
400
- repoDir: tmpDir,
401
- updateAfterRef: true,
402
- diffDriver: mockDiffDriver,
403
- currentRefDriver: mockCurrentRefDriver,
404
- checkoutDriver: dummyCheckoutDriver,
405
- });
406
-
407
- // since there was no override for this file, no changes from the local file
408
- expect(result.localFileChanges).toEqual(expect.objectContaining({}));
409
- expect(result.modifiedFiles).toEqual({
410
- added: ["src/templated.ts"],
411
- modified: ["templatesync.local.json"], // Add index.ts so we make sure it is still ignored - due to a bug
412
- deleted: [],
413
- total: 2,
414
- });
415
-
416
- // Verify the files
417
- await fileMatchTemplate(tmpDir, "templatesync.json");
418
- await fileMatchTemplate(tmpDir, "src/templated.ts");
419
-
420
- // Expect the none of the diff files to work
421
- await fileMatchDownstream(tmpDir, "src/index.ts");
422
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
423
- await fileMatchDownstream(tmpDir, "package.json");
424
-
425
- // Ensure we have updated the local template field
426
- expect(
427
- JSON.parse(
428
- (await readFile(join(tmpDir, "templatesync.local.json"))).toString(),
429
- ),
430
- ).toEqual({
431
- ...mockLocalConfig,
432
- afterRef: "newestSha",
433
- });
434
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
435
- });
436
- it("Does not update the local templatesync if updateAfterRef is true and the ref is the same", async () => {
437
- // Remove the local sync overrides
438
- await rm(join(tmpDir, "templatesync.local.json"));
439
-
440
- const mockLocalConfig = {
441
- afterRef: "dummySha",
442
- ignore: [
443
- // We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
444
- "plugins/**",
445
- ],
446
- };
447
-
448
- writeFileSync(
449
- join(tmpDir, "templatesync.local.json"),
450
- JSON.stringify(mockLocalConfig),
451
- );
452
-
453
- // We will only update the templated.ts
454
- const mockDiffDriver = jest.fn().mockImplementation(async () => ({
455
- added: ["src/templated.ts"],
456
- modified: ["src/index.ts"], // Add index.ts so we make sure it is still ignored - see test-fixtures/template/templatesync.json ignores
457
- deleted: [],
458
- }));
459
- const mockCurrentRefDriver = jest
460
- .fn()
461
- .mockImplementation(async () => "dummySha");
462
- const result = await templateSync({
463
- tmpCloneDir: "stubbed-by-driver",
464
- cloneDriver: dummyCloneDriver,
465
- repoUrl: "not-important",
466
- repoDir: tmpDir,
467
- updateAfterRef: true,
468
- diffDriver: mockDiffDriver,
469
- currentRefDriver: mockCurrentRefDriver,
470
- checkoutDriver: dummyCheckoutDriver,
471
- });
472
-
473
- // Nothing shoudl be reported as changing
474
- expect(result).toEqual({
475
- localFileChanges: {},
476
- localSkipFiles: [],
477
- modifiedFiles: {
478
- added: [],
479
- modified: [],
480
- deleted: [],
481
- total: 0,
482
- },
483
- });
484
- // Verify the files
485
- await fileMatchDownstream(tmpDir, "templatesync.json");
486
- await fileMatchDownstream(tmpDir, "src/templated.ts");
487
-
488
- // Expect the none of the diff files to work
489
- await fileMatchDownstream(tmpDir, "src/index.ts");
490
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
491
- await fileMatchDownstream(tmpDir, "package.json");
492
-
493
- // Ensure we have updated the local template field
494
- expect(
495
- JSON.parse(
496
- (await readFile(join(tmpDir, "templatesync.local.json"))).toString(),
497
- ),
498
- ).toEqual({
499
- ...mockLocalConfig,
500
- });
501
- expect(dummyCheckoutDriver).not.toHaveBeenCalled();
502
- });
503
- it("creates the local templatesync with the current ref if updateAfterRef is true and no local template exists", async () => {
504
- // Remove the local sync overrides
505
- await rm(join(tmpDir, "templatesync.local.json"));
506
-
507
- // We will only update the templated.ts
508
- const mockDiffDriver = jest.fn().mockImplementation(async () => ({
509
- added: ["src/templated.ts"],
510
- }));
511
- const mockCurrentRefDriver = jest
512
- .fn()
513
- .mockImplementation(async () => "newestSha");
514
- const result = await templateSync({
515
- tmpCloneDir: "stubbed-by-driver",
516
- cloneDriver: dummyCloneDriver,
517
- repoUrl: "not-important",
518
- repoDir: tmpDir,
519
- updateAfterRef: true,
520
- diffDriver: mockDiffDriver,
521
- currentRefDriver: mockCurrentRefDriver,
522
- checkoutDriver: dummyCheckoutDriver,
523
- });
524
-
525
- // since there was no override for this file, no changes from the local file
526
- expect(result.localFileChanges).toEqual(expect.objectContaining({}));
527
- expect(result.modifiedFiles).toEqual({
528
- added: [
529
- "package.json",
530
- "src/index.js",
531
- "src/templated.js",
532
- "src/templated.ts",
533
- "templatesync.json",
534
- "templatesync.local.json",
535
- ],
536
- deleted: [],
537
- modified: [],
538
- total: 6,
539
- });
540
-
541
- // Verify the files
542
- await fileMatchTemplate(tmpDir, "templatesync.json");
543
- await fileMatchTemplate(tmpDir, "src/templated.ts");
544
- const packageJson = JSON.parse(
545
- readFileSync(resolve(tmpDir, "package.json")).toString(),
546
- );
547
-
548
- expect(packageJson).toEqual({
549
- name: "mypkg",
550
- description: "my description",
551
- dependencies: {
552
- mypackage: "^1.2.0",
553
- newpacakge: "^22.2.2",
554
- package2: "3.22.1",
555
- huh: "~1.0.0",
556
- },
557
- engines: {
558
- node: ">=15",
559
- },
560
- scripts: {
561
- build: "build",
562
- test: "jest",
563
- myscript: "somescript",
564
- },
565
- // By default we add new top-level fields
566
- version: "new-version",
567
- });
568
-
569
- // Expect the none of the diff files to work
570
- await fileMatchDownstream(tmpDir, "src/index.ts");
571
- await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
572
-
573
- // Ensure we have updated the local template field
574
- expect(
575
- JSON.parse(
576
- (await readFile(join(tmpDir, "templatesync.local.json"))).toString(),
577
- ),
578
- ).toEqual({
579
- afterRef: "newestSha",
580
- });
581
- });
582
- // helper
583
- async function fileMatchTemplate(tmpDir: string, relPath: string) {
584
- return fileMatch(tmpDir, relPath, "template");
585
- }
586
-
587
- async function fileMatchDownstream(tmpDir: string, relPath: string) {
588
- return fileMatch(tmpDir, relPath, "downstream");
589
- }
590
-
591
- async function fileMatch(
592
- tmpDir: string,
593
- relPath: string,
594
- source: "downstream" | "template",
595
- ) {
596
- const dir =
597
- source === "downstream" ? downstreamDir : (await dummyCloneDriver()).dir;
598
- expect((await readFile(resolve(tmpDir, relPath))).toString()).toEqual(
599
- (await readFile(resolve(dir, relPath))).toString(),
600
- );
601
- }
602
- });