@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,436 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { JsonPathOverrides } from "../types";
3
- import { merge, validate } from "./json-merge";
4
- import * as commentJson from "comment-json";
5
-
6
- const testFileJson = {
7
- here: "here",
8
- another: 23,
9
- inner: {
10
- el1: "el1",
11
- arr1: ["a1", "a2"],
12
- nested: {
13
- final: "final",
14
- final2: "final2",
15
- },
16
- },
17
- };
18
-
19
- const templateFileJson = {
20
- here: "heretemplate",
21
- extra: "extra",
22
- inner: {
23
- arr1: ["b1", "b2"],
24
- extra2: "extra2",
25
- },
26
- };
27
-
28
- const testCommentJson = `{
29
- // This is a top comment
30
- "here": "here",
31
- "another": 23, // this is inline
32
- "inner": {
33
- "el1": "el1",
34
- "arr1": ["a1", "a2"],
35
- "nested": {
36
- // Upper comment
37
- "final": "final", // Inline commment
38
- "final2": "final2",
39
- },
40
- },
41
- }`;
42
-
43
- describe("merge", () => {
44
- it("performs overwrite when specified", async () => {
45
- const fromTemplateJson = {
46
- fullOverride: true,
47
- };
48
- expect(
49
- JSON.parse(
50
- await merge(
51
- JSON.stringify(testFileJson),
52
- JSON.stringify(fromTemplateJson),
53
- {
54
- relFilePath: "somepath",
55
- mergeArguments: "overwrite",
56
- },
57
- ),
58
- ),
59
- ).toEqual(fromTemplateJson);
60
- });
61
- it("performs lodash merge-template when specified", async () => {
62
- expect(
63
- JSON.parse(
64
- await merge(
65
- JSON.stringify(testFileJson),
66
- JSON.stringify(templateFileJson),
67
- {
68
- relFilePath: "somepath",
69
- mergeArguments: "merge-template",
70
- },
71
- ),
72
- ),
73
- ).toEqual({
74
- here: "heretemplate",
75
- extra: "extra",
76
- another: 23,
77
- inner: {
78
- el1: "el1",
79
- arr1: ["b1", "b2"],
80
- extra2: "extra2",
81
- nested: {
82
- final: "final",
83
- final2: "final2",
84
- },
85
- },
86
- });
87
- });
88
- it("performs lodash merge-current when specified", async () => {
89
- expect(
90
- JSON.parse(
91
- await merge(
92
- JSON.stringify(testFileJson),
93
- JSON.stringify(templateFileJson),
94
- {
95
- relFilePath: "somepath",
96
- mergeArguments: "merge-current",
97
- },
98
- ),
99
- ),
100
- ).toEqual({
101
- here: "here",
102
- extra: "extra",
103
- another: 23,
104
- inner: {
105
- el1: "el1",
106
- arr1: ["a1", "a2"],
107
- extra2: "extra2",
108
- nested: {
109
- final: "final",
110
- final2: "final2",
111
- },
112
- },
113
- });
114
- });
115
- it("performs pathjson merges with default non-path values", async () => {
116
- expect(
117
- JSON.parse(
118
- await merge(
119
- JSON.stringify(testFileJson),
120
- JSON.stringify(templateFileJson),
121
- {
122
- relFilePath: "somepath",
123
- mergeArguments: {
124
- paths: [
125
- ["$.here", "merge-template"],
126
- ["$.inner.arr1", "merge-template"],
127
- ["$.inner.el1", "overwrite"],
128
- ],
129
- },
130
- },
131
- ),
132
- ),
133
- ).toEqual({
134
- here: "heretemplate",
135
- // This is the extra here since we add missing
136
- extra: "extra",
137
- another: 23,
138
- inner: {
139
- // This will stay here
140
- el1: "el1",
141
- arr1: ["b1", "b2"],
142
- // extra2 doesn't show up since we didn't dictate it
143
- nested: {
144
- final: "final",
145
- final2: "final2",
146
- },
147
- },
148
- });
149
- });
150
- it("performs pathjson merges with missing deletions", async () => {
151
- expect(
152
- JSON.parse(
153
- await merge(
154
- JSON.stringify(testFileJson),
155
- JSON.stringify(templateFileJson),
156
- {
157
- relFilePath: "somepath",
158
- mergeArguments: {
159
- missingIsDelete: true,
160
- paths: [
161
- ["$.here", "merge-template"],
162
- ["$.inner.nested", "overwrite"],
163
- ],
164
- },
165
- },
166
- ),
167
- ),
168
- ).toEqual({
169
- here: "heretemplate",
170
- extra: "extra",
171
- another: 23,
172
- inner: {
173
- el1: "el1",
174
- arr1: ["a1", "a2"],
175
- // nested is gone because it was undefined
176
- },
177
- });
178
- });
179
- it("performs pathjson merges with ignore new", async () => {
180
- expect(
181
- JSON.parse(
182
- await merge(
183
- JSON.stringify(testFileJson),
184
- JSON.stringify(templateFileJson),
185
- {
186
- relFilePath: "somepath",
187
- mergeArguments: {
188
- ignoreNewProperties: true,
189
- paths: [
190
- ["$.here", "merge-template"],
191
- ["$.inner.arr1", "merge-template"],
192
- ],
193
- },
194
- },
195
- ),
196
- ),
197
- ).toEqual({
198
- here: "heretemplate",
199
- // extra: 'extra', - not added
200
- another: 23,
201
- inner: {
202
- el1: "el1",
203
- arr1: ["b1", "b2"],
204
- nested: {
205
- final: "final",
206
- final2: "final2",
207
- },
208
- },
209
- });
210
- });
211
- it("performs pathjson merges with no missing delete", async () => {
212
- expect(
213
- JSON.parse(
214
- await merge(
215
- JSON.stringify(testFileJson),
216
- JSON.stringify(templateFileJson),
217
- {
218
- relFilePath: "somepath",
219
- mergeArguments: {
220
- paths: [
221
- ["$.here", "merge-template"],
222
- ["$.inner.nested", "merge-template"],
223
- ],
224
- },
225
- },
226
- ),
227
- ),
228
- ).toEqual({
229
- here: "heretemplate",
230
- extra: "extra",
231
- another: 23,
232
- inner: {
233
- el1: "el1",
234
- arr1: ["a1", "a2"],
235
- nested: {
236
- final: "final",
237
- final2: "final2",
238
- },
239
- },
240
- });
241
- });
242
- it("performs pathjson merges on multipath selection", async () => {
243
- const template = { ...templateFileJson };
244
- (template.inner as any).nested = {
245
- final: { something: 44 },
246
- newThing: "this",
247
- };
248
- expect(
249
- JSON.parse(
250
- await merge(JSON.stringify(testFileJson), JSON.stringify(template), {
251
- relFilePath: "somepath",
252
- mergeArguments: {
253
- paths: [
254
- ["$.here", "merge-template"],
255
- ["$.inner.nested.*", "merge-template"],
256
- ],
257
- },
258
- }),
259
- ),
260
- ).toEqual({
261
- here: "heretemplate",
262
- extra: "extra",
263
- another: 23,
264
- inner: {
265
- el1: "el1",
266
- arr1: ["a1", "a2"],
267
- nested: {
268
- final: { something: 44 },
269
- final2: "final2",
270
- newThing: "this",
271
- },
272
- },
273
- });
274
- });
275
- it("performs pathjson merges on stacked selections", async () => {
276
- const template = { ...templateFileJson };
277
- (template.inner as any).nested = {
278
- final: { something: 44 },
279
- newThing: "this",
280
- };
281
- expect(
282
- JSON.parse(
283
- await merge(JSON.stringify(testFileJson), JSON.stringify(template), {
284
- relFilePath: "somepath",
285
- mergeArguments: {
286
- paths: [
287
- ["$.here", "merge-template"],
288
- ["$.inner.nested.*", "merge-template"],
289
- ["$.inner.nested.final", "merge-current"],
290
- ],
291
- },
292
- }),
293
- ),
294
- ).toEqual({
295
- here: "heretemplate",
296
- extra: "extra",
297
- another: 23,
298
- inner: {
299
- el1: "el1",
300
- arr1: ["a1", "a2"],
301
- nested: {
302
- final: "final",
303
- final2: "final2",
304
- // We only added the newThing
305
- newThing: "this",
306
- },
307
- },
308
- });
309
- });
310
- it("performs pathjson merges on comment json", async () => {
311
- const template = { ...templateFileJson };
312
- (template.inner as any).nested = {
313
- final: { something: 44 },
314
- newThing: "this",
315
- };
316
-
317
- const testTemplateCommentJson = `{
318
- "here": "heretemplate",
319
- /** New comment explaining extra **/
320
- "extra": "extra",
321
- "inner": {
322
- "arr1": ["b1", "b2"],
323
- "extra2": "extra2",
324
- "nested": {
325
- "final": {
326
- // New comment explaining final
327
- "something": 44,
328
- },
329
- "newThing": {
330
- // new thing comment
331
- "this": 23,
332
- },
333
- }
334
- },
335
- }`;
336
-
337
- expect(
338
- commentJson.stringify(
339
- commentJson.parse(
340
- await merge(testCommentJson, testTemplateCommentJson, {
341
- relFilePath: "somepath",
342
- mergeArguments: {
343
- paths: [
344
- ["$.here", "merge-template"],
345
- ["$.inner.nested.*", "merge-template"],
346
- ["$.inner.nested.final", "merge-current"],
347
- ],
348
- },
349
- }),
350
- ),
351
- null,
352
- 4,
353
- ),
354
- ).toEqual(
355
- commentJson.stringify(
356
- commentJson.parse(`{
357
- // This is a top comment
358
- "here": "heretemplate",
359
- "another": 23, // this is inline
360
- "inner": {
361
- "el1": "el1",
362
- "arr1": ["a1", "a2"],
363
- "nested": {
364
- // Upper comment
365
- "final": "final", // Inline commment
366
- "final2": "final2",
367
- "newThing": {
368
- // new thing comment
369
- "this": 23,
370
- },
371
- },
372
- },
373
- "extra": "extra",
374
- }`),
375
- null,
376
- 4,
377
- ),
378
- );
379
- });
380
- });
381
-
382
- describe("validate", () => {
383
- it("passes correct flat mapped values", () => {
384
- expect(validate("merge-template")).toEqual([]);
385
- });
386
- it("passes correct options object", () => {
387
- expect(
388
- validate({
389
- ignoreNewProperties: true,
390
- missingIsDelete: false,
391
- paths: [
392
- ["$.something", "merge-current"],
393
- ["$.something[*].values", "merge-current"],
394
- ],
395
- } as JsonPathOverrides),
396
- ).toEqual([]);
397
- });
398
- it("returns an error if a flat map value is not correct", () => {
399
- expect(validate("bad-merge-options")).toEqual([
400
- "bad-merge-options must be one of type overwrite, merge-template, or merge-current",
401
- ]);
402
- });
403
- it("returns an unknown key exits in options object", () => {
404
- expect(
405
- validate({
406
- unknownKey: "something",
407
- paths: [
408
- ["$.here", "merge-template"],
409
- ["$.inner.nested.*", "merge-template"],
410
- ["$.inner.nested.final", "merge-current"],
411
- ],
412
- }),
413
- ).toEqual(["Unrecognized key: unknownKey"]);
414
- });
415
- it("returns a type error if the options object is an array", () => {
416
- expect(validate([])).toEqual(["Options must be an object and not Array"]);
417
- });
418
- it("returns a type error if the options object is null", () => {
419
- expect(validate(null)).toEqual(["Options cannot be null"]);
420
- });
421
- it("returns a type error for each path that is invalid", () => {
422
- expect(
423
- validate({
424
- paths: [
425
- ["$.badc/value", "merge-template"],
426
- ["no$", "merge-template"],
427
- ["$.something", "not a value"],
428
- ],
429
- }),
430
- ).toEqual([
431
- "Invalid jsonpath key: Error: Lexical error on line 1. Unrecognized text.\n$.badc/value\n------^",
432
- "Unrecognized jsonpath syntax: no$",
433
- "jsonpath $.something: not a value must be one of type overwrite, merge-template, or merge-current",
434
- ]);
435
- });
436
- });
@@ -1,215 +0,0 @@
1
- import {
2
- MergeContext,
3
- JsonFileMergeOptions,
4
- JsonPathOverrides,
5
- } from "../types";
6
- import lodashMerge from "lodash.merge";
7
- import jp, { PathComponent } from "jsonpath";
8
- import { inferJSONIndent } from "../formatting/infer-json-indent";
9
- import * as commentJSON from "comment-json";
10
-
11
- function stringOptionError(value: string) {
12
- if (
13
- value === "overwrite" ||
14
- value === "merge-template" ||
15
- value === "merge-current"
16
- ) {
17
- return;
18
- }
19
- return `${value} must be one of type overwrite, merge-template, or merge-current`;
20
- }
21
-
22
- export function validate(options: unknown) {
23
- const errors: string[] = [];
24
-
25
- // check for flat options
26
- if (typeof options === "string") {
27
- const errMsg = stringOptionError(options);
28
- if (errMsg) {
29
- errors.push(errMsg);
30
- }
31
- return errors;
32
- } else {
33
- if (typeof options !== "object") {
34
- errors.push(`Options must be an object and not ${typeof options}`);
35
- return errors;
36
- }
37
-
38
- if (Array.isArray(options)) {
39
- errors.push(`Options must be an object and not Array`);
40
- return errors;
41
- }
42
-
43
- if (options === null) {
44
- errors.push("Options cannot be null");
45
- return errors;
46
- }
47
- }
48
-
49
- const optionsCast = options as JsonPathOverrides;
50
- const optionKeys = Object.keys(
51
- optionsCast,
52
- ) as unknown as (keyof JsonPathOverrides)[];
53
- optionKeys.forEach((k) => {
54
- if (k === "paths") {
55
- optionsCast.paths.forEach((pathObj) => {
56
- const [jsonPath, options] = pathObj;
57
- if (jsonPath.startsWith("$.")) {
58
- try {
59
- jp.parse(jsonPath);
60
- } catch (err) {
61
- errors.push(`Invalid jsonpath key: ${err}`);
62
- return;
63
- }
64
- const errMsg = stringOptionError(options);
65
- if (errMsg) {
66
- errors.push(`jsonpath ${jsonPath}: ${errMsg}`);
67
- }
68
- } else {
69
- errors.push(`Unrecognized jsonpath syntax: ${jsonPath}`);
70
- }
71
- });
72
- } else {
73
- if (k === "ignoreNewProperties" || k === "missingIsDelete") {
74
- return;
75
- }
76
- errors.push(`Unrecognized key: ${k}`);
77
- }
78
- });
79
- return errors;
80
- }
81
-
82
- export async function merge(
83
- current: string,
84
- fromTemplateRepo: string,
85
- context: MergeContext<JsonFileMergeOptions>,
86
- ): Promise<string> {
87
- if (context.mergeArguments === "overwrite") {
88
- return fromTemplateRepo;
89
- }
90
-
91
- const currentJson = commentJSON.parse(current) as commentJSON.CommentObject;
92
- const fromTemplateJson = commentJSON.parse(
93
- fromTemplateRepo,
94
- ) as commentJSON.CommentObject;
95
-
96
- if (context.mergeArguments === "merge-current") {
97
- // Performs Lodash Merge with current as the override
98
- return commentJSON.stringify(
99
- lodashMerge(fromTemplateJson, currentJson),
100
- null,
101
- inferJSONIndent(current),
102
- );
103
- }
104
-
105
- if (context.mergeArguments === "merge-template") {
106
- // Performs Lodash Merge with current as the override
107
- return commentJSON.stringify(
108
- lodashMerge(currentJson, fromTemplateJson),
109
- null,
110
- inferJSONIndent(current),
111
- );
112
- }
113
-
114
- const { missingIsDelete, ignoreNewProperties, paths } =
115
- context.mergeArguments as JsonPathOverrides;
116
-
117
- const returnJson = commentJSON.parse(current) as commentJSON.CommentObject;
118
- paths.forEach((p) => {
119
- const [jPath, overrideType] = p;
120
-
121
- const fromTemplatePaths: Map<string, PathComponent[]> = new Map();
122
- if (overrideType === "merge-template") {
123
- // We want to make sure there aren't extra paths from the template that didn't get added
124
- jp.nodes(fromTemplateJson, jPath).forEach((n) => {
125
- fromTemplatePaths.set(jp.stringify(n.path), n.path);
126
- });
127
- }
128
- jp.nodes(currentJson, jPath).forEach(({ path, value }) => {
129
- // This solves for wildcard operators
130
- const fullPath = jp.stringify(path);
131
- // track the paths in the template we've walked
132
- fromTemplatePaths.delete(fullPath);
133
- jp.apply(returnJson, fullPath, () => {
134
- const templateValue = jp.value(fromTemplateJson, fullPath);
135
- if (overrideType === "merge-template") {
136
- if (templateValue === undefined) {
137
- if (missingIsDelete) {
138
- return templateValue;
139
- }
140
- } else {
141
- return applyValueMerge(value, templateValue);
142
- }
143
- } else if (overrideType === "merge-current") {
144
- return applyValueMerge(templateValue, value);
145
- } else if (overrideType === "overwrite") {
146
- if (templateValue !== undefined || missingIsDelete) {
147
- return templateValue;
148
- }
149
- } else {
150
- throw new Error(`Unexpected JsonPath merge value ${overrideType}`);
151
- }
152
- return value;
153
- });
154
- });
155
-
156
- if (!ignoreNewProperties) {
157
- for (const fromTemplatePath of fromTemplatePaths.values()) {
158
- applyPerPath(fromTemplatePath, returnJson, fromTemplateJson);
159
- }
160
- }
161
- });
162
-
163
- if (!ignoreNewProperties) {
164
- Object.keys(fromTemplateJson).forEach((key) => {
165
- if (!returnJson[key]) {
166
- returnJson[key] = fromTemplateJson[key];
167
- }
168
- });
169
- }
170
-
171
- return commentJSON.stringify(returnJson, null, inferJSONIndent(current));
172
- }
173
-
174
- /**
175
- * A merge from a template to template perspective is either melding objects
176
- * or completely overwriting primitive types
177
- */
178
- function applyValueMerge(base: unknown, toMerge: unknown) {
179
- if (typeof base === "object" && typeof toMerge === "object") {
180
- return lodashMerge(base, toMerge);
181
- } else {
182
- return toMerge;
183
- }
184
- }
185
-
186
- /**
187
- * Given a nodePath on the "map" tree, this will go to the first missing element
188
- * and copy that node onto the object
189
- *
190
- * @param nodePath
191
- * @param onto
192
- * @param map
193
- * @param forIdx
194
- */
195
- function applyPerPath(
196
- nodePath: jp.PathComponent[],
197
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
- onto: any,
199
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
200
- map: any,
201
- forIdx = 0,
202
- ) {
203
- if (nodePath[forIdx] === "$") {
204
- applyPerPath(nodePath, onto, map, forIdx + 1);
205
- return;
206
- }
207
-
208
- const selector = nodePath[forIdx];
209
- if (onto[selector]) {
210
- applyPerPath(nodePath, onto[selector], map[selector], forIdx + 1);
211
- return;
212
- }
213
-
214
- onto[selector] = map[selector];
215
- }
@@ -1,12 +0,0 @@
1
- import { execSync } from "child_process";
2
- import { gitCurrentRef } from "./git-current-ref";
3
-
4
- describe("getCurrentRef", () => {
5
- it("gets the current sha", async () => {
6
- expect(
7
- await gitCurrentRef({
8
- rootDir: process.cwd(),
9
- }),
10
- ).toEqual(execSync("git rev-parse HEAD").toString().trim());
11
- });
12
- });
@@ -1,9 +0,0 @@
1
- import { execSync } from "child_process";
2
-
3
- export async function gitCurrentRef(options: { rootDir: string }) {
4
- return execSync(`git rev-parse HEAD`, {
5
- cwd: options.rootDir,
6
- })
7
- .toString()
8
- .trim();
9
- }
@@ -1 +0,0 @@
1
- export * from "./git-current-ref";
@@ -1,10 +0,0 @@
1
- /**
2
- * A function that operates within the root dir and returns the
3
- * current ref for its state. This abstracts the idea of getting
4
- * the current commit sha, so that things like other custom templating
5
- * frameworks can provide their own ref
6
- */
7
- export type TemplateRefDriverFn = (options: {
8
- /** The root dir where we want to get the "current" ref */
9
- rootDir: string;
10
- }) => Promise<string>;