@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
@@ -0,0 +1,71 @@
1
+ import { resolve } from "path";
2
+ import { getAllFilesInDir } from "./match.mjs";
3
+ import { TEST_FIXTURES_DIR } from "./test-utils/index.mjs";
4
+ const TEST_GLOB_DIR = resolve(TEST_FIXTURES_DIR, "glob-test");
5
+ describe("getAllFilesInDir", ()=>{
6
+ it("gets all files in the directory with no ignores", ()=>{
7
+ const files = getAllFilesInDir(TEST_GLOB_DIR, []);
8
+ expect(files).toEqual(expect.arrayContaining([
9
+ "folder1/something.js",
10
+ "folder1/something.ts",
11
+ "toplevel.js",
12
+ "toplevel.txt"
13
+ ]));
14
+ try {
15
+ expect(files.length).toBe(4);
16
+ } catch (err) {
17
+ console.error("All found files: " + files);
18
+ throw err;
19
+ }
20
+ });
21
+ it("gets all files in the directory that do not match the ignore (single)", ()=>{
22
+ const files = getAllFilesInDir(TEST_GLOB_DIR, [
23
+ "**/*.ts"
24
+ ]);
25
+ expect(files).toEqual(expect.arrayContaining([
26
+ "folder1/something.js",
27
+ "toplevel.js",
28
+ "toplevel.txt"
29
+ ]));
30
+ try {
31
+ expect(files.length).toBe(3);
32
+ } catch (err) {
33
+ console.error("All found files: " + files);
34
+ throw err;
35
+ }
36
+ });
37
+ it("gets all files in the directory that do not match the ignore (multiple)", ()=>{
38
+ const files = getAllFilesInDir(TEST_GLOB_DIR, [
39
+ "**/*.ts",
40
+ "**/*.txt"
41
+ ]);
42
+ expect(files).toEqual(expect.arrayContaining([
43
+ "folder1/something.js",
44
+ "toplevel.js"
45
+ ]));
46
+ try {
47
+ expect(files.length).toBe(2);
48
+ } catch (err) {
49
+ console.error("All found files: " + files);
50
+ throw err;
51
+ }
52
+ });
53
+ it("gets all files in the directory that do not match the ignore with a folder level directive (multiple)", ()=>{
54
+ const files = getAllFilesInDir(TEST_GLOB_DIR, [
55
+ "**/*.ts",
56
+ "**/*.txt",
57
+ "folder1"
58
+ ]);
59
+ expect(files).toEqual(expect.arrayContaining([
60
+ "toplevel.js"
61
+ ]));
62
+ try {
63
+ expect(files.length).toBe(1);
64
+ } catch (err) {
65
+ console.error("All found files: " + files);
66
+ throw err;
67
+ }
68
+ });
69
+ });
70
+
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRjaC5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ2V0QWxsRmlsZXNJbkRpciB9IGZyb20gXCIuL21hdGNoXCI7XG5pbXBvcnQgeyBURVNUX0ZJWFRVUkVTX0RJUiB9IGZyb20gXCIuL3Rlc3QtdXRpbHNcIjtcblxuY29uc3QgVEVTVF9HTE9CX0RJUiA9IHJlc29sdmUoVEVTVF9GSVhUVVJFU19ESVIsIFwiZ2xvYi10ZXN0XCIpO1xuXG5kZXNjcmliZShcImdldEFsbEZpbGVzSW5EaXJcIiwgKCkgPT4ge1xuXHRpdChcImdldHMgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgd2l0aCBubyBpZ25vcmVzXCIsICgpID0+IHtcblx0XHRjb25zdCBmaWxlcyA9IGdldEFsbEZpbGVzSW5EaXIoVEVTVF9HTE9CX0RJUiwgW10pO1xuXHRcdGV4cGVjdChmaWxlcykudG9FcXVhbChcblx0XHRcdGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuXHRcdFx0XHRcImZvbGRlcjEvc29tZXRoaW5nLmpzXCIsXG5cdFx0XHRcdFwiZm9sZGVyMS9zb21ldGhpbmcudHNcIixcblx0XHRcdFx0XCJ0b3BsZXZlbC5qc1wiLFxuXHRcdFx0XHRcInRvcGxldmVsLnR4dFwiLFxuXHRcdFx0XSksXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0ZXhwZWN0KGZpbGVzLmxlbmd0aCkudG9CZSg0KTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJBbGwgZm91bmQgZmlsZXM6IFwiICsgZmlsZXMpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fSk7XG5cdGl0KFwiZ2V0cyBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgaWdub3JlIChzaW5nbGUpXCIsICgpID0+IHtcblx0XHRjb25zdCBmaWxlcyA9IGdldEFsbEZpbGVzSW5EaXIoVEVTVF9HTE9CX0RJUiwgW1wiKiovKi50c1wiXSk7XG5cdFx0ZXhwZWN0KGZpbGVzKS50b0VxdWFsKFxuXHRcdFx0ZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG5cdFx0XHRcdFwiZm9sZGVyMS9zb21ldGhpbmcuanNcIixcblx0XHRcdFx0XCJ0b3BsZXZlbC5qc1wiLFxuXHRcdFx0XHRcInRvcGxldmVsLnR4dFwiLFxuXHRcdFx0XSksXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0ZXhwZWN0KGZpbGVzLmxlbmd0aCkudG9CZSgzKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJBbGwgZm91bmQgZmlsZXM6IFwiICsgZmlsZXMpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fSk7XG5cdGl0KFwiZ2V0cyBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgaWdub3JlIChtdWx0aXBsZSlcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IGZpbGVzID0gZ2V0QWxsRmlsZXNJbkRpcihURVNUX0dMT0JfRElSLCBbXCIqKi8qLnRzXCIsIFwiKiovKi50eHRcIl0pO1xuXHRcdGV4cGVjdChmaWxlcykudG9FcXVhbChcblx0XHRcdGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1wiZm9sZGVyMS9zb21ldGhpbmcuanNcIiwgXCJ0b3BsZXZlbC5qc1wiXSksXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0ZXhwZWN0KGZpbGVzLmxlbmd0aCkudG9CZSgyKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJBbGwgZm91bmQgZmlsZXM6IFwiICsgZmlsZXMpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fSk7XG5cblx0aXQoXCJnZXRzIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgZG8gbm90IG1hdGNoIHRoZSBpZ25vcmUgd2l0aCBhIGZvbGRlciBsZXZlbCBkaXJlY3RpdmUgKG11bHRpcGxlKVwiLCAoKSA9PiB7XG5cdFx0Y29uc3QgZmlsZXMgPSBnZXRBbGxGaWxlc0luRGlyKFRFU1RfR0xPQl9ESVIsIFtcblx0XHRcdFwiKiovKi50c1wiLFxuXHRcdFx0XCIqKi8qLnR4dFwiLFxuXHRcdFx0XCJmb2xkZXIxXCIsXG5cdFx0XSk7XG5cdFx0ZXhwZWN0KGZpbGVzKS50b0VxdWFsKGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1widG9wbGV2ZWwuanNcIl0pKTtcblx0XHR0cnkge1xuXHRcdFx0ZXhwZWN0KGZpbGVzLmxlbmd0aCkudG9CZSgxKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJBbGwgZm91bmQgZmlsZXM6IFwiICsgZmlsZXMpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJyZXNvbHZlIiwiZ2V0QWxsRmlsZXNJbkRpciIsIlRFU1RfRklYVFVSRVNfRElSIiwiVEVTVF9HTE9CX0RJUiIsImRlc2NyaWJlIiwiaXQiLCJmaWxlcyIsImV4cGVjdCIsInRvRXF1YWwiLCJhcnJheUNvbnRhaW5pbmciLCJsZW5ndGgiLCJ0b0JlIiwiZXJyIiwiY29uc29sZSIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxnQkFBZ0IsUUFBUSxjQUFVO0FBQzNDLFNBQVNDLGlCQUFpQixRQUFRLHlCQUFlO0FBRWpELE1BQU1DLGdCQUFnQkgsUUFBUUUsbUJBQW1CO0FBRWpERSxTQUFTLG9CQUFvQjtJQUM1QkMsR0FBRyxtREFBbUQ7UUFDckQsTUFBTUMsUUFBUUwsaUJBQWlCRSxlQUFlLEVBQUU7UUFDaERJLE9BQU9ELE9BQU9FLE9BQU8sQ0FDcEJELE9BQU9FLGVBQWUsQ0FBQztZQUN0QjtZQUNBO1lBQ0E7WUFDQTtTQUNBO1FBRUYsSUFBSTtZQUNIRixPQUFPRCxNQUFNSSxNQUFNLEVBQUVDLElBQUksQ0FBQztRQUMzQixFQUFFLE9BQU9DLEtBQUs7WUFDYkMsUUFBUUMsS0FBSyxDQUFDLHNCQUFzQlI7WUFDcEMsTUFBTU07UUFDUDtJQUNEO0lBQ0FQLEdBQUcseUVBQXlFO1FBQzNFLE1BQU1DLFFBQVFMLGlCQUFpQkUsZUFBZTtZQUFDO1NBQVU7UUFDekRJLE9BQU9ELE9BQU9FLE9BQU8sQ0FDcEJELE9BQU9FLGVBQWUsQ0FBQztZQUN0QjtZQUNBO1lBQ0E7U0FDQTtRQUVGLElBQUk7WUFDSEYsT0FBT0QsTUFBTUksTUFBTSxFQUFFQyxJQUFJLENBQUM7UUFDM0IsRUFBRSxPQUFPQyxLQUFLO1lBQ2JDLFFBQVFDLEtBQUssQ0FBQyxzQkFBc0JSO1lBQ3BDLE1BQU1NO1FBQ1A7SUFDRDtJQUNBUCxHQUFHLDJFQUEyRTtRQUM3RSxNQUFNQyxRQUFRTCxpQkFBaUJFLGVBQWU7WUFBQztZQUFXO1NBQVc7UUFDckVJLE9BQU9ELE9BQU9FLE9BQU8sQ0FDcEJELE9BQU9FLGVBQWUsQ0FBQztZQUFDO1lBQXdCO1NBQWM7UUFFL0QsSUFBSTtZQUNIRixPQUFPRCxNQUFNSSxNQUFNLEVBQUVDLElBQUksQ0FBQztRQUMzQixFQUFFLE9BQU9DLEtBQUs7WUFDYkMsUUFBUUMsS0FBSyxDQUFDLHNCQUFzQlI7WUFDcEMsTUFBTU07UUFDUDtJQUNEO0lBRUFQLEdBQUcseUdBQXlHO1FBQzNHLE1BQU1DLFFBQVFMLGlCQUFpQkUsZUFBZTtZQUM3QztZQUNBO1lBQ0E7U0FDQTtRQUNESSxPQUFPRCxPQUFPRSxPQUFPLENBQUNELE9BQU9FLGVBQWUsQ0FBQztZQUFDO1NBQWM7UUFDNUQsSUFBSTtZQUNIRixPQUFPRCxNQUFNSSxNQUFNLEVBQUVDLElBQUksQ0FBQztRQUMzQixFQUFFLE9BQU9DLEtBQUs7WUFDYkMsUUFBUUMsS0FBSyxDQUFDLHNCQUFzQlI7WUFDcEMsTUFBTU07UUFDUDtJQUNEO0FBQ0QifQ==
@@ -0,0 +1,88 @@
1
+ import { diffLines } from "diff";
2
+ import { existsSync } from "fs";
3
+ import { readFile, rm } from "node:fs/promises";
4
+ import { outputFile } from "fs-extra";
5
+ import { isMatch, some } from "micromatch";
6
+ import { extname, join } from "path";
7
+ import { loadPlugin } from "./load-plugin.mjs";
8
+ /**
9
+ * Applies the merge to a file according to the context information.
10
+ *
11
+ * Returns true if merged and false if skipped
12
+ * @param relPath
13
+ * @param context
14
+ * @returns
15
+ */ export async function mergeFile(relPath, context) {
16
+ const { localTemplateSyncConfig, templateSyncConfig, tempCloneDir, cwd } = context;
17
+ if (some(relPath, localTemplateSyncConfig.ignore)) {
18
+ return {
19
+ ignoredDueToLocal: true
20
+ };
21
+ }
22
+ const ext = extname(relPath);
23
+ const filePath = join(cwd, relPath);
24
+ const templatePath = join(tempCloneDir, relPath);
25
+ // Unless there's a need, we remove files that were deleted and don't pass them to plugins yet
26
+ if (context.fileOperation === "deleted") {
27
+ if (existsSync(filePath)) {
28
+ await rm(filePath);
29
+ }
30
+ return {
31
+ ignoredDueToLocal: false,
32
+ localChanges: []
33
+ };
34
+ }
35
+ const mergeConfig = templateSyncConfig.merge?.find((mc)=>isMatch(relPath, mc.glob));
36
+ const localMergeConfig = localTemplateSyncConfig.merge?.find((mc)=>isMatch(relPath, mc.glob));
37
+ const mergeHandler = mergeConfig ? await loadPlugin(mergeConfig, tempCloneDir) : undefined;
38
+ const localMergeHandler = localMergeConfig ? await loadPlugin(localMergeConfig, cwd) : undefined;
39
+ // Either write the merge or write the file
40
+ let fileContents;
41
+ const localChanges = [];
42
+ if (existsSync(filePath) && (mergeHandler || localMergeHandler)) {
43
+ const originalCurrentFile = (await readFile(filePath)).toString();
44
+ if (mergeHandler) {
45
+ fileContents = await safeMerge(mergeHandler, mergeConfig?.plugin ?? `default for ${ext}`, originalCurrentFile, (await readFile(templatePath)).toString(), {
46
+ relFilePath: relPath,
47
+ mergeArguments: mergeConfig?.options ?? {},
48
+ isLocalOptions: false
49
+ });
50
+ } else {
51
+ // Apply overwrite if we didn't set up merge
52
+ fileContents = (await readFile(templatePath)).toString();
53
+ }
54
+ // We apply the localMerge Config to the fileContent output by the template merge
55
+ if (localMergeHandler) {
56
+ const localContents = await safeMerge(localMergeHandler, localMergeConfig?.plugin ?? `default for ${ext}`, originalCurrentFile, fileContents, {
57
+ relFilePath: relPath,
58
+ mergeArguments: localMergeConfig?.options ?? {},
59
+ isLocalOptions: true
60
+ });
61
+ localChanges.push(...diffLines(fileContents, localContents));
62
+ fileContents = localContents;
63
+ }
64
+ } else {
65
+ // Just perform simple overwrite
66
+ fileContents = (await readFile(templatePath)).toString();
67
+ }
68
+ await outputFile(filePath, fileContents);
69
+ return {
70
+ ignoredDueToLocal: false,
71
+ localChanges
72
+ };
73
+ }
74
+ /**
75
+ * Simple helper function to ensure that we don't let bad plugins corrupt the call flow
76
+ * @param plugin
77
+ */ async function safeMerge(plugin, pluginPath, current, fromTemplate, context) {
78
+ const ret = await plugin.merge(current, fromTemplate, context);
79
+ if (typeof ret !== "string") {
80
+ throw new Error(`Plugin ${pluginPath} did not return string for merge function! This is not allowed!`);
81
+ }
82
+ if (!ret) {
83
+ throw new Error(`Plugin ${pluginPath} should not make a merge be an empty string!`);
84
+ }
85
+ return ret;
86
+ }
87
+
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXJnZS1maWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2hhbmdlIH0gZnJvbSBcImRpZmZcIjtcbmltcG9ydCB7IGRpZmZMaW5lcyB9IGZyb20gXCJkaWZmXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgcm0gfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IG91dHB1dEZpbGUgfSBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCB7IGlzTWF0Y2gsIHNvbWUgfSBmcm9tIFwibWljcm9tYXRjaFwiO1xuaW1wb3J0IHsgZXh0bmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsb2FkUGx1Z2luIH0gZnJvbSBcIi4vbG9hZC1wbHVnaW5cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBGaWxlT3BlcmF0aW9uLCBNZXJnZUNvbnRleHQsIE1lcmdlUGx1Z2luIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIE1lcmdlRmlsZU9wdGlvbnMge1xuXHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZzogQ29uZmlnO1xuXHR0ZW1wbGF0ZVN5bmNDb25maWc6IENvbmZpZztcblx0dGVtcENsb25lRGlyOiBzdHJpbmc7XG5cdGN3ZDogc3RyaW5nO1xuXHRmaWxlT3BlcmF0aW9uOiBGaWxlT3BlcmF0aW9uO1xufVxuXG5pbnRlcmZhY2UgTWVyZ2VGaWxlUmV0dXJuIHtcblx0LyoqXG5cdCAqIElmIHRoZSBmaWxlIHdhcyBpZ25vcmVkIGR1ZSB0byB0aGUgbG9jYWwgY29uZmlnXG5cdCAqL1xuXHRpZ25vcmVkRHVlVG9Mb2NhbDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIE9ubHkgYXZhaWxhYmxlIGlmIHRoZSBmaWxlIHdhc24ndCBpZ25vcmVkLCB0aGlzIGlzIGEgbGlzdCBvZiBsaW5lRGlmZnNcblx0ICogZnJvbSB0aGUgZGlmZiBsaWJyYXJ5IHRoYXQgd2VyZSBhcHBsaWVkIHRvIHdoYXQgd291bGQndmUgYmVlbiBjaGFuZ2VkIGJ5XG5cdCAqIHRoZSBiYXNlIHRlbXBsYXRlc3luYyByZXBvXG5cdCAqL1xuXHRsb2NhbENoYW5nZXM/OiBDaGFuZ2VbXTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtZXJnZSB0byBhIGZpbGUgYWNjb3JkaW5nIHRvIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uLlxuICpcbiAqIFJldHVybnMgdHJ1ZSBpZiBtZXJnZWQgYW5kIGZhbHNlIGlmIHNraXBwZWRcbiAqIEBwYXJhbSByZWxQYXRoXG4gKiBAcGFyYW0gY29udGV4dFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1lcmdlRmlsZShcblx0cmVsUGF0aDogc3RyaW5nLFxuXHRjb250ZXh0OiBNZXJnZUZpbGVPcHRpb25zLFxuKTogUHJvbWlzZTxNZXJnZUZpbGVSZXR1cm4+IHtcblx0Y29uc3QgeyBsb2NhbFRlbXBsYXRlU3luY0NvbmZpZywgdGVtcGxhdGVTeW5jQ29uZmlnLCB0ZW1wQ2xvbmVEaXIsIGN3ZCB9ID1cblx0XHRjb250ZXh0O1xuXG5cdGlmIChzb21lKHJlbFBhdGgsIGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnLmlnbm9yZSkpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWdub3JlZER1ZVRvTG9jYWw6IHRydWUsXG5cdFx0fTtcblx0fVxuXG5cdGNvbnN0IGV4dCA9IGV4dG5hbWUocmVsUGF0aCk7XG5cdGNvbnN0IGZpbGVQYXRoID0gam9pbihjd2QsIHJlbFBhdGgpO1xuXHRjb25zdCB0ZW1wbGF0ZVBhdGggPSBqb2luKHRlbXBDbG9uZURpciwgcmVsUGF0aCk7XG5cblx0Ly8gVW5sZXNzIHRoZXJlJ3MgYSBuZWVkLCB3ZSByZW1vdmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgYW5kIGRvbid0IHBhc3MgdGhlbSB0byBwbHVnaW5zIHlldFxuXHRpZiAoY29udGV4dC5maWxlT3BlcmF0aW9uID09PSBcImRlbGV0ZWRcIikge1xuXHRcdGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuXHRcdFx0YXdhaXQgcm0oZmlsZVBhdGgpO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0aWdub3JlZER1ZVRvTG9jYWw6IGZhbHNlLFxuXHRcdFx0bG9jYWxDaGFuZ2VzOiBbXSxcblx0XHR9O1xuXHR9XG5cblx0Y29uc3QgbWVyZ2VDb25maWcgPSB0ZW1wbGF0ZVN5bmNDb25maWcubWVyZ2U/LmZpbmQoKG1jKSA9PlxuXHRcdGlzTWF0Y2gocmVsUGF0aCwgbWMuZ2xvYiksXG5cdCk7XG5cdGNvbnN0IGxvY2FsTWVyZ2VDb25maWcgPSBsb2NhbFRlbXBsYXRlU3luY0NvbmZpZy5tZXJnZT8uZmluZCgobWMpID0+XG5cdFx0aXNNYXRjaChyZWxQYXRoLCBtYy5nbG9iKSxcblx0KTtcblxuXHRjb25zdCBtZXJnZUhhbmRsZXIgPSBtZXJnZUNvbmZpZ1xuXHRcdD8gYXdhaXQgbG9hZFBsdWdpbihtZXJnZUNvbmZpZywgdGVtcENsb25lRGlyKVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBsb2NhbE1lcmdlSGFuZGxlciA9IGxvY2FsTWVyZ2VDb25maWdcblx0XHQ/IGF3YWl0IGxvYWRQbHVnaW4obG9jYWxNZXJnZUNvbmZpZywgY3dkKVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdC8vIEVpdGhlciB3cml0ZSB0aGUgbWVyZ2Ugb3Igd3JpdGUgdGhlIGZpbGVcblx0bGV0IGZpbGVDb250ZW50czogc3RyaW5nO1xuXHRjb25zdCBsb2NhbENoYW5nZXM6IENoYW5nZVtdID0gW107XG5cdGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSAmJiAobWVyZ2VIYW5kbGVyIHx8IGxvY2FsTWVyZ2VIYW5kbGVyKSkge1xuXHRcdGNvbnN0IG9yaWdpbmFsQ3VycmVudEZpbGUgPSAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpO1xuXHRcdGlmIChtZXJnZUhhbmRsZXIpIHtcblx0XHRcdGZpbGVDb250ZW50cyA9IGF3YWl0IHNhZmVNZXJnZShcblx0XHRcdFx0bWVyZ2VIYW5kbGVyLFxuXHRcdFx0XHRtZXJnZUNvbmZpZz8ucGx1Z2luID8/IGBkZWZhdWx0IGZvciAke2V4dH1gLFxuXHRcdFx0XHRvcmlnaW5hbEN1cnJlbnRGaWxlLFxuXHRcdFx0XHQoYXdhaXQgcmVhZEZpbGUodGVtcGxhdGVQYXRoKSkudG9TdHJpbmcoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlbEZpbGVQYXRoOiByZWxQYXRoLFxuXHRcdFx0XHRcdG1lcmdlQXJndW1lbnRzOiBtZXJnZUNvbmZpZz8ub3B0aW9ucyA/PyB7fSxcblx0XHRcdFx0XHRpc0xvY2FsT3B0aW9uczogZmFsc2UsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBcHBseSBvdmVyd3JpdGUgaWYgd2UgZGlkbid0IHNldCB1cCBtZXJnZVxuXHRcdFx0ZmlsZUNvbnRlbnRzID0gKGF3YWl0IHJlYWRGaWxlKHRlbXBsYXRlUGF0aCkpLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgYXBwbHkgdGhlIGxvY2FsTWVyZ2UgQ29uZmlnIHRvIHRoZSBmaWxlQ29udGVudCBvdXRwdXQgYnkgdGhlIHRlbXBsYXRlIG1lcmdlXG5cdFx0aWYgKGxvY2FsTWVyZ2VIYW5kbGVyKSB7XG5cdFx0XHRjb25zdCBsb2NhbENvbnRlbnRzID0gYXdhaXQgc2FmZU1lcmdlKFxuXHRcdFx0XHRsb2NhbE1lcmdlSGFuZGxlcixcblx0XHRcdFx0bG9jYWxNZXJnZUNvbmZpZz8ucGx1Z2luID8/IGBkZWZhdWx0IGZvciAke2V4dH1gLFxuXHRcdFx0XHRvcmlnaW5hbEN1cnJlbnRGaWxlLFxuXHRcdFx0XHRmaWxlQ29udGVudHMsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZWxGaWxlUGF0aDogcmVsUGF0aCxcblx0XHRcdFx0XHRtZXJnZUFyZ3VtZW50czogbG9jYWxNZXJnZUNvbmZpZz8ub3B0aW9ucyA/PyB7fSxcblx0XHRcdFx0XHRpc0xvY2FsT3B0aW9uczogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0XHRsb2NhbENoYW5nZXMucHVzaCguLi5kaWZmTGluZXMoZmlsZUNvbnRlbnRzLCBsb2NhbENvbnRlbnRzKSk7XG5cdFx0XHRmaWxlQ29udGVudHMgPSBsb2NhbENvbnRlbnRzO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBKdXN0IHBlcmZvcm0gc2ltcGxlIG92ZXJ3cml0ZVxuXHRcdGZpbGVDb250ZW50cyA9IChhd2FpdCByZWFkRmlsZSh0ZW1wbGF0ZVBhdGgpKS50b1N0cmluZygpO1xuXHR9XG5cdGF3YWl0IG91dHB1dEZpbGUoZmlsZVBhdGgsIGZpbGVDb250ZW50cyk7XG5cdHJldHVybiB7XG5cdFx0aWdub3JlZER1ZVRvTG9jYWw6IGZhbHNlLFxuXHRcdGxvY2FsQ2hhbmdlcyxcblx0fTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgaGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGxldCBiYWQgcGx1Z2lucyBjb3JydXB0IHRoZSBjYWxsIGZsb3dcbiAqIEBwYXJhbSBwbHVnaW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2FmZU1lcmdlKFxuXHRwbHVnaW46IE1lcmdlUGx1Z2luPHVua25vd24+LFxuXHRwbHVnaW5QYXRoOiBzdHJpbmcsXG5cdGN1cnJlbnQ6IHN0cmluZyxcblx0ZnJvbVRlbXBsYXRlOiBzdHJpbmcsXG5cdGNvbnRleHQ6IE1lcmdlQ29udGV4dCxcbikge1xuXHRjb25zdCByZXQgPSBhd2FpdCBwbHVnaW4ubWVyZ2UoY3VycmVudCwgZnJvbVRlbXBsYXRlLCBjb250ZXh0KTtcblx0aWYgKHR5cGVvZiByZXQgIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgUGx1Z2luICR7cGx1Z2luUGF0aH0gZGlkIG5vdCByZXR1cm4gc3RyaW5nIGZvciBtZXJnZSBmdW5jdGlvbiEgIFRoaXMgaXMgbm90IGFsbG93ZWQhYCxcblx0XHQpO1xuXHR9XG5cblx0aWYgKCFyZXQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgUGx1Z2luICR7cGx1Z2luUGF0aH0gc2hvdWxkIG5vdCBtYWtlIGEgbWVyZ2UgYmUgYW4gZW1wdHkgc3RyaW5nIWAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gcmV0IGFzIHN0cmluZztcbn1cbiJdLCJuYW1lcyI6WyJkaWZmTGluZXMiLCJleGlzdHNTeW5jIiwicmVhZEZpbGUiLCJybSIsIm91dHB1dEZpbGUiLCJpc01hdGNoIiwic29tZSIsImV4dG5hbWUiLCJqb2luIiwibG9hZFBsdWdpbiIsIm1lcmdlRmlsZSIsInJlbFBhdGgiLCJjb250ZXh0IiwibG9jYWxUZW1wbGF0ZVN5bmNDb25maWciLCJ0ZW1wbGF0ZVN5bmNDb25maWciLCJ0ZW1wQ2xvbmVEaXIiLCJjd2QiLCJpZ25vcmUiLCJpZ25vcmVkRHVlVG9Mb2NhbCIsImV4dCIsImZpbGVQYXRoIiwidGVtcGxhdGVQYXRoIiwiZmlsZU9wZXJhdGlvbiIsImxvY2FsQ2hhbmdlcyIsIm1lcmdlQ29uZmlnIiwibWVyZ2UiLCJmaW5kIiwibWMiLCJnbG9iIiwibG9jYWxNZXJnZUNvbmZpZyIsIm1lcmdlSGFuZGxlciIsInVuZGVmaW5lZCIsImxvY2FsTWVyZ2VIYW5kbGVyIiwiZmlsZUNvbnRlbnRzIiwib3JpZ2luYWxDdXJyZW50RmlsZSIsInRvU3RyaW5nIiwic2FmZU1lcmdlIiwicGx1Z2luIiwicmVsRmlsZVBhdGgiLCJtZXJnZUFyZ3VtZW50cyIsIm9wdGlvbnMiLCJpc0xvY2FsT3B0aW9ucyIsImxvY2FsQ29udGVudHMiLCJwdXNoIiwicGx1Z2luUGF0aCIsImN1cnJlbnQiLCJmcm9tVGVtcGxhdGUiLCJyZXQiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsU0FBUyxRQUFRLE9BQU87QUFDakMsU0FBU0MsVUFBVSxRQUFRLEtBQUs7QUFDaEMsU0FBU0MsUUFBUSxFQUFFQyxFQUFFLFFBQVEsbUJBQWM7QUFDM0MsU0FBU0MsVUFBVSxRQUFRLFdBQVc7QUFDdEMs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