@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,508 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _fs = require("fs");
6
+ const _promises = require("fs/promises");
7
+ const _fsextra = require("fs-extra");
8
+ const _path = require("path");
9
+ const _mergefile = require("./merge-file");
10
+ const _testutils = require("./test-utils");
11
+ const testTemplateDir = (0, _path.resolve)(_testutils.TEST_FIXTURES_DIR, "template");
12
+ const testDownstreamDir = (0, _path.resolve)(_testutils.TEST_FIXTURES_DIR, "downstream");
13
+ describe("mergeFile", ()=>{
14
+ let tmpDir;
15
+ let tmpTemplateDir;
16
+ beforeEach(async ()=>{
17
+ tmpDir = await (0, _promises.mkdtemp)((0, _testutils.tempDir)());
18
+ (0, _fsextra.copySync)(testDownstreamDir, tmpDir);
19
+ tmpTemplateDir = await (0, _promises.mkdtemp)((0, _testutils.tempDir)());
20
+ (0, _fsextra.copySync)(testTemplateDir, tmpTemplateDir);
21
+ });
22
+ afterEach(async ()=>{
23
+ await (0, _promises.rm)(tmpDir, {
24
+ force: true,
25
+ recursive: true
26
+ });
27
+ await (0, _promises.rm)(tmpTemplateDir, {
28
+ force: true,
29
+ recursive: true
30
+ });
31
+ });
32
+ // Note: we use the "ignore" from the templateSync to constrain files we iterate over so it doeesn't happen here
33
+ // it('skips the file if it is part of template config ignroe', async () => {
34
+ // expect(await mergeFile('package.json', {
35
+ // cwd: tmpDir,
36
+ // tempCloneDir: testTemplateDir,
37
+ // localTemplateSyncConfig: {
38
+ // ignore: [],
39
+ // merge: {
40
+ // }
41
+ // },
42
+ // templateSyncConfig: {
43
+ // ignore: ['**/package.json'],
44
+ // }
45
+ // })).toBe(false)
46
+ // })
47
+ it.each([
48
+ [
49
+ "added"
50
+ ],
51
+ [
52
+ "deleted"
53
+ ],
54
+ [
55
+ "modified"
56
+ ]
57
+ ])("skips the [%s] file if it is part of local config ignore", async (op)=>{
58
+ expect(await (0, _mergefile.mergeFile)("package.json", {
59
+ cwd: tmpDir,
60
+ tempCloneDir: tmpTemplateDir,
61
+ localTemplateSyncConfig: {
62
+ ignore: [
63
+ "**/package.json"
64
+ ],
65
+ merge: []
66
+ },
67
+ templateSyncConfig: {
68
+ ignore: [
69
+ "**/*.txt"
70
+ ]
71
+ },
72
+ fileOperation: op
73
+ })).toEqual({
74
+ ignoredDueToLocal: true
75
+ });
76
+ });
77
+ it.each([
78
+ [
79
+ "added"
80
+ ],
81
+ [
82
+ "modified"
83
+ ]
84
+ ])("overwrites if no merge config for [%s] files", async (op)=>{
85
+ expect(await (0, _mergefile.mergeFile)("package.json", {
86
+ cwd: tmpDir,
87
+ tempCloneDir: tmpTemplateDir,
88
+ localTemplateSyncConfig: {
89
+ ignore: []
90
+ },
91
+ templateSyncConfig: {
92
+ ignore: [
93
+ "**/*.txt"
94
+ ]
95
+ },
96
+ fileOperation: op
97
+ })).toEqual({
98
+ ignoredDueToLocal: false,
99
+ localChanges: []
100
+ });
101
+ // Ensure we overwrote
102
+ expect(await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toEqual(await (0, _promises.readFile)((0, _path.join)(tmpTemplateDir, "package.json")));
103
+ });
104
+ it("removes the template deleted files", async ()=>{
105
+ expect(await (0, _mergefile.mergeFile)("package.json", {
106
+ cwd: tmpDir,
107
+ tempCloneDir: tmpTemplateDir,
108
+ localTemplateSyncConfig: {
109
+ ignore: []
110
+ },
111
+ templateSyncConfig: {
112
+ ignore: [
113
+ "**/*.txt"
114
+ ]
115
+ },
116
+ fileOperation: "deleted"
117
+ })).toEqual({
118
+ ignoredDueToLocal: false,
119
+ localChanges: []
120
+ });
121
+ // Ensure we overwrote
122
+ expect((0, _fs.existsSync)((0, _path.join)(tmpDir, "package.json"))).toBeFalsy();
123
+ });
124
+ // TODO - this could change if there's a use case
125
+ it("does not apply plugins on deleted", async ()=>{
126
+ expect(await (0, _mergefile.mergeFile)("package.json", {
127
+ cwd: tmpDir,
128
+ tempCloneDir: tmpTemplateDir,
129
+ localTemplateSyncConfig: {
130
+ ignore: [],
131
+ merge: [
132
+ {
133
+ plugin: "_json",
134
+ glob: "**/package.json",
135
+ options: {
136
+ paths: [
137
+ // Do not touch huh
138
+ [
139
+ "$.dependencies.huh",
140
+ "merge-current"
141
+ ]
142
+ ]
143
+ }
144
+ }
145
+ ]
146
+ },
147
+ templateSyncConfig: {
148
+ ignore: [
149
+ "**/*.txt"
150
+ ],
151
+ merge: [
152
+ {
153
+ glob: "**/package.json",
154
+ plugin: "_json",
155
+ options: {
156
+ missingIsDelete: true,
157
+ paths: [
158
+ // Merge all template dependencies
159
+ [
160
+ "$.dependencies",
161
+ "merge-template"
162
+ ]
163
+ ]
164
+ }
165
+ }
166
+ ]
167
+ },
168
+ fileOperation: "deleted"
169
+ })).toEqual({
170
+ ignoredDueToLocal: false,
171
+ localChanges: []
172
+ });
173
+ // Ensure we overwrote
174
+ expect((0, _fs.existsSync)((0, _path.join)(tmpDir, "package.json"))).toBeFalsy();
175
+ });
176
+ describe.each([
177
+ [
178
+ "added"
179
+ ],
180
+ [
181
+ "modified"
182
+ ]
183
+ ])("[%s] file", (op)=>{
184
+ // Yea... these are more integration tests but I'm kinda untrusting of mocks for this
185
+ it("applies default [.json] merge with first rules if merge applies to file", async ()=>{
186
+ expect(await (0, _mergefile.mergeFile)("package.json", {
187
+ cwd: tmpDir,
188
+ tempCloneDir: testTemplateDir,
189
+ localTemplateSyncConfig: {
190
+ ignore: []
191
+ },
192
+ fileOperation: op,
193
+ templateSyncConfig: {
194
+ ignore: [
195
+ "**/*.txt"
196
+ ],
197
+ merge: [
198
+ {
199
+ glob: "**/package.json",
200
+ options: "merge-current",
201
+ plugin: "_json"
202
+ },
203
+ {
204
+ glob: "**/package.json",
205
+ options: "merge-template",
206
+ plugin: "_json"
207
+ }
208
+ ]
209
+ }
210
+ })).toEqual({
211
+ ignoredDueToLocal: false,
212
+ localChanges: []
213
+ });
214
+ // Ensure we overwrote
215
+ expect(JSON.parse((await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toString())).toEqual({
216
+ name: "mypkg",
217
+ description: "my description",
218
+ dependencies: {
219
+ mypackage: "^1.2.0",
220
+ newpacakge: "^22.2.2",
221
+ package2: "3.22.1",
222
+ huh: "^2.30.0"
223
+ },
224
+ engines: {
225
+ node: ">=20"
226
+ },
227
+ scripts: {
228
+ build: "build",
229
+ test: "jest",
230
+ myscript: "somescript"
231
+ },
232
+ version: "new-version"
233
+ });
234
+ });
235
+ it("[inverse] applies default [.json] merge with first rules if merge applies to file", async ()=>{
236
+ expect(await (0, _mergefile.mergeFile)("package.json", {
237
+ cwd: tmpDir,
238
+ tempCloneDir: testTemplateDir,
239
+ localTemplateSyncConfig: {
240
+ ignore: []
241
+ },
242
+ fileOperation: op,
243
+ templateSyncConfig: {
244
+ ignore: [
245
+ "**/*.txt"
246
+ ],
247
+ merge: [
248
+ {
249
+ glob: "**/package.json",
250
+ options: "merge-template",
251
+ plugin: "_json"
252
+ },
253
+ {
254
+ glob: "**/package.json",
255
+ options: "merge-current",
256
+ plugin: "_json"
257
+ }
258
+ ]
259
+ }
260
+ })).toEqual({
261
+ ignoredDueToLocal: false,
262
+ localChanges: []
263
+ });
264
+ // Ensure we overwrote
265
+ expect(JSON.parse((await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toString())).toEqual({
266
+ name: "some-stub-name",
267
+ description: "some-stub-description",
268
+ dependencies: {
269
+ mypackage: "^1.2.0",
270
+ newpacakge: "^22.2.2",
271
+ package2: "3.22.1",
272
+ huh: "~1.0.0"
273
+ },
274
+ engines: {
275
+ node: ">=15"
276
+ },
277
+ scripts: {
278
+ build: "build",
279
+ test: "fill this in yourself",
280
+ myscript: "somescript"
281
+ },
282
+ version: "new-version"
283
+ });
284
+ });
285
+ it("[inverse] applies default [.json] merge with sync and then local override", async ()=>{
286
+ expect(await (0, _mergefile.mergeFile)("package.json", {
287
+ cwd: tmpDir,
288
+ tempCloneDir: testTemplateDir,
289
+ fileOperation: op,
290
+ localTemplateSyncConfig: {
291
+ ignore: [],
292
+ merge: [
293
+ {
294
+ plugin: "_json",
295
+ glob: "**/package.json",
296
+ options: {
297
+ paths: [
298
+ // Do not touch huh
299
+ [
300
+ "$.dependencies.huh",
301
+ "merge-current"
302
+ ]
303
+ ]
304
+ }
305
+ }
306
+ ]
307
+ },
308
+ templateSyncConfig: {
309
+ ignore: [
310
+ "**/*.txt"
311
+ ],
312
+ merge: [
313
+ {
314
+ glob: "**/package.json",
315
+ plugin: "_json",
316
+ options: {
317
+ missingIsDelete: true,
318
+ paths: [
319
+ // Merge all template dependencies
320
+ [
321
+ "$.dependencies",
322
+ "merge-template"
323
+ ]
324
+ ]
325
+ }
326
+ }
327
+ ]
328
+ }
329
+ })).toEqual({
330
+ ignoredDueToLocal: false,
331
+ localChanges: expect.arrayContaining([
332
+ {
333
+ added: undefined,
334
+ count: 1,
335
+ removed: true,
336
+ value: '\t\t"huh": "~1.0.0"\n'
337
+ },
338
+ {
339
+ added: true,
340
+ count: 1,
341
+ removed: undefined,
342
+ value: '\t\t"huh": "^2.30.0"\n'
343
+ }
344
+ ])
345
+ });
346
+ // Ensure we overwrote
347
+ expect(JSON.parse((await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toString())).toEqual({
348
+ name: "mypkg",
349
+ description: "my description",
350
+ dependencies: {
351
+ mypackage: "^1.2.0",
352
+ newpacakge: "^22.2.2",
353
+ package2: "3.22.1",
354
+ huh: "^2.30.0"
355
+ },
356
+ engines: {
357
+ node: ">=20"
358
+ },
359
+ scripts: {
360
+ build: "build",
361
+ test: "jest",
362
+ myscript: "somescript"
363
+ },
364
+ version: "new-version"
365
+ });
366
+ });
367
+ it("[inverse] applies default [.json] and custom merge for local with sync and then local override", async ()=>{
368
+ expect(await (0, _mergefile.mergeFile)("package.json", {
369
+ cwd: tmpDir,
370
+ tempCloneDir: testTemplateDir,
371
+ fileOperation: op,
372
+ localTemplateSyncConfig: {
373
+ ignore: [],
374
+ merge: [
375
+ {
376
+ plugin: "../test-fixtures/dummy-plugin.js",
377
+ options: {
378
+ paths: [
379
+ // Do not touch huh
380
+ [
381
+ "$.dependencies.huh",
382
+ "merge-current"
383
+ ]
384
+ ]
385
+ },
386
+ glob: "**/package.json"
387
+ }
388
+ ]
389
+ },
390
+ templateSyncConfig: {
391
+ ignore: [
392
+ "**/*.txt"
393
+ ],
394
+ merge: [
395
+ {
396
+ plugin: "_json",
397
+ glob: "**/package.json",
398
+ options: {
399
+ missingIsDelete: true,
400
+ paths: [
401
+ // Merge all template dependencies
402
+ [
403
+ "$.dependencies",
404
+ "merge-template"
405
+ ]
406
+ ]
407
+ }
408
+ }
409
+ ]
410
+ }
411
+ })).toEqual({
412
+ ignoredDueToLocal: false,
413
+ // TODO: I don't
414
+ localChanges: expect.arrayContaining([
415
+ {
416
+ added: undefined,
417
+ count: 17,
418
+ removed: true,
419
+ value: `\t"name": "mypkg",
420
+ \t"description": "my description",
421
+ \t"dependencies": {
422
+ \t\t"mypackage": "^1.2.0",
423
+ \t\t"newpacakge": "^22.2.2",
424
+ \t\t"package2": "3.22.1",
425
+ \t\t"huh": "~1.0.0"
426
+ \t},
427
+ \t"engines": {
428
+ \t\t"node": ">=20"
429
+ \t},
430
+ \t"scripts": {
431
+ \t\t"build": "build",
432
+ \t\t"test": "jest",
433
+ \t\t"myscript": "somescript"
434
+ \t},
435
+ \t"version": "new-version"\n`
436
+ },
437
+ {
438
+ added: true,
439
+ count: 1,
440
+ removed: undefined,
441
+ value: ` "tested": true\n`
442
+ }
443
+ ])
444
+ });
445
+ // Ensure we overwrote
446
+ expect(JSON.parse((await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toString())).toEqual({
447
+ tested: true
448
+ });
449
+ });
450
+ it("[inverse] applies builtin _json and custom merge for local with sync plugin and then local override", async ()=>{
451
+ expect(await (0, _mergefile.mergeFile)("package.json", {
452
+ cwd: tmpDir,
453
+ tempCloneDir: testTemplateDir,
454
+ fileOperation: op,
455
+ localTemplateSyncConfig: {
456
+ ignore: [],
457
+ merge: [
458
+ {
459
+ glob: "**/package.json",
460
+ plugin: "plugins/custom-plugin.js",
461
+ options: {
462
+ paths: [
463
+ // Do not touch huh
464
+ [
465
+ "$.dependencies.huh",
466
+ "merge-current"
467
+ ]
468
+ ]
469
+ }
470
+ }
471
+ ]
472
+ },
473
+ templateSyncConfig: {
474
+ ignore: [
475
+ "**/*.txt"
476
+ ],
477
+ merge: [
478
+ {
479
+ glob: "**/package.json",
480
+ // TODO - we need to handle the weird implicit case I added here. It's dumb
481
+ options: {
482
+ missingIsDelete: true,
483
+ paths: [
484
+ // Merge all template dependencies
485
+ [
486
+ "$.dependencies",
487
+ "merge-template"
488
+ ]
489
+ ]
490
+ },
491
+ plugin: "_json"
492
+ }
493
+ ]
494
+ }
495
+ })).toEqual({
496
+ ignoredDueToLocal: false,
497
+ // We are just making sure plugin look up happens here
498
+ localChanges: expect.arrayContaining([])
499
+ });
500
+ // Ensure we overwrote
501
+ expect(JSON.parse((await (0, _promises.readFile)((0, _path.join)(tmpDir, "package.json"))).toString())).toEqual({
502
+ downstream: true
503
+ });
504
+ });
505
+ });
506
+ });
507
+
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXJnZS1maWxlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgbWtkdGVtcCwgcmVhZEZpbGUsIHJtIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjb3B5U3luYyB9IGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBtZXJnZUZpbGUgfSBmcm9tIFwiLi9tZXJnZS1maWxlXCI7XG5pbXBvcnQgeyBURVNUX0ZJWFRVUkVTX0RJUiwgdGVtcERpciB9IGZyb20gXCIuL3Rlc3QtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRmlsZU9wZXJhdGlvbiwgSnNvbkZpbGVNZXJnZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCB0ZXN0VGVtcGxhdGVEaXIgPSByZXNvbHZlKFRFU1RfRklYVFVSRVNfRElSLCBcInRlbXBsYXRlXCIpO1xuY29uc3QgdGVzdERvd25zdHJlYW1EaXIgPSByZXNvbHZlKFRFU1RfRklYVFVSRVNfRElSLCBcImRvd25zdHJlYW1cIik7XG5cbmRlc2NyaWJlKFwibWVyZ2VGaWxlXCIsICgpID0+IHtcblx0bGV0IHRtcERpcjogc3RyaW5nO1xuXHRsZXQgdG1wVGVtcGxhdGVEaXI6IHN0cmluZztcblx0YmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG5cdFx0dG1wRGlyID0gYXdhaXQgbWtkdGVtcCh0ZW1wRGlyKCkpO1xuXHRcdGNvcHlTeW5jKHRlc3REb3duc3RyZWFtRGlyLCB0bXBEaXIpO1xuXHRcdHRtcFRlbXBsYXRlRGlyID0gYXdhaXQgbWtkdGVtcCh0ZW1wRGlyKCkpO1xuXHRcdGNvcHlTeW5jKHRlc3RUZW1wbGF0ZURpciwgdG1wVGVtcGxhdGVEaXIpO1xuXHR9KTtcblx0YWZ0ZXJFYWNoKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCBybSh0bXBEaXIsIHtcblx0XHRcdGZvcmNlOiB0cnVlLFxuXHRcdFx0cmVjdXJzaXZlOiB0cnVlLFxuXHRcdH0pO1xuXHRcdGF3YWl0IHJtKHRtcFRlbXBsYXRlRGlyLCB7XG5cdFx0XHRmb3JjZTogdHJ1ZSxcblx0XHRcdHJlY3Vyc2l2ZTogdHJ1ZSxcblx0XHR9KTtcblx0fSk7XG5cdC8vIE5vdGU6IHdlIHVzZSB0aGUgXCJpZ25vcmVcIiBmcm9tIHRoZSB0ZW1wbGF0ZVN5bmMgdG8gY29uc3RyYWluIGZpbGVzIHdlIGl0ZXJhdGUgb3ZlciBzbyBpdCBkb2Vlc24ndCBoYXBwZW4gaGVyZVxuXHQvLyBpdCgnc2tpcHMgdGhlIGZpbGUgaWYgaXQgaXMgcGFydCBvZiB0ZW1wbGF0ZSBjb25maWcgaWducm9lJywgYXN5bmMgKCkgPT4ge1xuXHQvLyAgICAgZXhwZWN0KGF3YWl0IG1lcmdlRmlsZSgncGFja2FnZS5qc29uJywge1xuXHQvLyAgICAgICAgIGN3ZDogdG1wRGlyLFxuXHQvLyAgICAgICAgIHRlbXBDbG9uZURpcjogdGVzdFRlbXBsYXRlRGlyLFxuXHQvLyAgICAgICAgIGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdC8vICAgICAgICAgICAgIGlnbm9yZTogW10sXG5cdC8vICAgICAgICAgICAgIG1lcmdlOiB7XG5cdC8vICAgICAgICAgICAgIH1cblx0Ly8gICAgICAgICB9LFxuXHQvLyAgICAgICAgIHRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHQvLyAgICAgICAgICAgICBpZ25vcmU6IFsnKiovcGFja2FnZS5qc29uJ10sXG5cdC8vICAgICAgICAgfVxuXHQvLyAgICAgfSkpLnRvQmUoZmFsc2UpXG5cdC8vIH0pXG5cdGl0LmVhY2goW1xuXHRcdFtcImFkZGVkXCJdLFxuXHRcdFtcImRlbGV0ZWRcIl0sXG5cdFx0W1wibW9kaWZpZWRcIl0sXG5cdF0pKFwic2tpcHMgdGhlIFslc10gZmlsZSBpZiBpdCBpcyBwYXJ0IG9mIGxvY2FsIGNvbmZpZyBpZ25vcmVcIiwgYXN5bmMgKG9wKSA9PiB7XG5cdFx0ZXhwZWN0KFxuXHRcdFx0YXdhaXQgbWVyZ2VGaWxlKFwicGFja2FnZS5qc29uXCIsIHtcblx0XHRcdFx0Y3dkOiB0bXBEaXIsXG5cdFx0XHRcdHRlbXBDbG9uZURpcjogdG1wVGVtcGxhdGVEaXIsXG5cdFx0XHRcdGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0aWdub3JlOiBbXCIqKi9wYWNrYWdlLmpzb25cIl0sXG5cdFx0XHRcdFx0bWVyZ2U6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRpZ25vcmU6IFtcIioqLyoudHh0XCJdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmaWxlT3BlcmF0aW9uOiBvcCBhcyBGaWxlT3BlcmF0aW9uLFxuXHRcdFx0fSksXG5cdFx0KS50b0VxdWFsKHtcblx0XHRcdGlnbm9yZWREdWVUb0xvY2FsOiB0cnVlLFxuXHRcdH0pO1xuXHR9KTtcblx0aXQuZWFjaChbXG5cdFx0W1wiYWRkZWRcIl0sXG5cdFx0W1wibW9kaWZpZWRcIl0sXG5cdF0pKFwib3ZlcndyaXRlcyBpZiBubyBtZXJnZSBjb25maWcgZm9yIFslc10gZmlsZXNcIiwgYXN5bmMgKG9wKSA9PiB7XG5cdFx0ZXhwZWN0KFxuXHRcdFx0YXdhaXQgbWVyZ2VGaWxlKFwicGFja2FnZS5qc29uXCIsIHtcblx0XHRcdFx0Y3dkOiB0bXBEaXIsXG5cdFx0XHRcdHRlbXBDbG9uZURpcjogdG1wVGVtcGxhdGVEaXIsXG5cdFx0XHRcdGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0aWdub3JlOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0aWdub3JlOiBbXCIqKi8qLnR4dFwiXSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZmlsZU9wZXJhdGlvbjogb3AgYXMgRmlsZU9wZXJhdGlvbixcblx0XHRcdH0pLFxuXHRcdCkudG9FcXVhbCh7XG5cdFx0XHRpZ25vcmVkRHVlVG9Mb2NhbDogZmFsc2UsXG5cdFx0XHRsb2NhbENoYW5nZXM6IFtdLFxuXHRcdH0pO1xuXG5cdFx0Ly8gRW5zdXJlIHdlIG92ZXJ3cm90ZVxuXHRcdGV4cGVjdChhd2FpdCByZWFkRmlsZShqb2luKHRtcERpciwgXCJwYWNrYWdlLmpzb25cIikpKS50b0VxdWFsKFxuXHRcdFx0YXdhaXQgcmVhZEZpbGUoam9pbih0bXBUZW1wbGF0ZURpciwgXCJwYWNrYWdlLmpzb25cIikpLFxuXHRcdCk7XG5cdH0pO1xuXHRpdChcInJlbW92ZXMgdGhlIHRlbXBsYXRlIGRlbGV0ZWQgZmlsZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGV4cGVjdChcblx0XHRcdGF3YWl0IG1lcmdlRmlsZShcInBhY2thZ2UuanNvblwiLCB7XG5cdFx0XHRcdGN3ZDogdG1wRGlyLFxuXHRcdFx0XHR0ZW1wQ2xvbmVEaXI6IHRtcFRlbXBsYXRlRGlyLFxuXHRcdFx0XHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHRcdFx0XHRcdGlnbm9yZTogW10sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHRcdFx0XHRcdGlnbm9yZTogW1wiKiovKi50eHRcIl0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZpbGVPcGVyYXRpb246IFwiZGVsZXRlZFwiLCAvLyBUaGlzIGlzIG5vcm1hbGx5IGluZmVycmVkIGJ5IHRoZSB0b3AtbGV2ZWwgY29kZVxuXHRcdFx0fSksXG5cdFx0KS50b0VxdWFsKHtcblx0XHRcdGlnbm9yZWREdWVUb0xvY2FsOiBmYWxzZSxcblx0XHRcdGxvY2FsQ2hhbmdlczogW10sXG5cdFx0fSk7XG5cblx0XHQvLyBFbnN1cmUgd2Ugb3Zlcndyb3RlXG5cdFx0ZXhwZWN0KGV4aXN0c1N5bmMoam9pbih0bXBEaXIsIFwicGFja2FnZS5qc29uXCIpKSkudG9CZUZhbHN5KCk7XG5cdH0pO1xuXG5cdC8vIFRPRE8gLSB0aGlzIGNvdWxkIGNoYW5nZSBpZiB0aGVyZSdzIGEgdXNlIGNhc2Vcblx0aXQoXCJkb2VzIG5vdCBhcHBseSBwbHVnaW5zIG9uIGRlbGV0ZWRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGV4cGVjdChcblx0XHRcdGF3YWl0IG1lcmdlRmlsZShcInBhY2thZ2UuanNvblwiLCB7XG5cdFx0XHRcdGN3ZDogdG1wRGlyLFxuXHRcdFx0XHR0ZW1wQ2xvbmVEaXI6IHRtcFRlbXBsYXRlRGlyLFxuXHRcdFx0XHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHRcdFx0XHRcdGlnbm9yZTogW10sXG5cdFx0XHRcdFx0bWVyZ2U6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcIl9qc29uXCIsXG5cdFx0XHRcdFx0XHRcdGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRG8gbm90IHRvdWNoIGh1aFxuXHRcdFx0XHRcdFx0XHRcdFx0W1wiJC5kZXBlbmRlbmNpZXMuaHVoXCIsIFwibWVyZ2UtY3VycmVudFwiXSxcblx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRpZ25vcmU6IFtcIioqLyoudHh0XCJdLFxuXHRcdFx0XHRcdG1lcmdlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHRcdHBsdWdpbjogXCJfanNvblwiLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0bWlzc2luZ0lzRGVsZXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdHBhdGhzOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBNZXJnZSBhbGwgdGVtcGxhdGUgZGVwZW5kZW5jaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRbXCIkLmRlcGVuZGVuY2llc1wiLCBcIm1lcmdlLXRlbXBsYXRlXCJdLFxuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdH0gYXMgSnNvbkZpbGVNZXJnZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZpbGVPcGVyYXRpb246IFwiZGVsZXRlZFwiLCAvLyBUaGlzIGlzIG5vcm1hbGx5IGluZmVycmVkIGJ5IHRoZSB0b3AtbGV2ZWwgY29kZVxuXHRcdFx0fSksXG5cdFx0KS50b0VxdWFsKHtcblx0XHRcdGlnbm9yZWREdWVUb0xvY2FsOiBmYWxzZSxcblx0XHRcdGxvY2FsQ2hhbmdlczogW10sXG5cdFx0fSk7XG5cblx0XHQvLyBFbnN1cmUgd2Ugb3Zlcndyb3RlXG5cdFx0ZXhwZWN0KGV4aXN0c1N5bmMoam9pbih0bXBEaXIsIFwicGFja2FnZS5qc29uXCIpKSkudG9CZUZhbHN5KCk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlLmVhY2goW1xuXHRcdFtcImFkZGVkXCIgYXMgRmlsZU9wZXJhdGlvbl0sXG5cdFx0W1wibW9kaWZpZWRcIiBhcyBGaWxlT3BlcmF0aW9uXSxcblx0XSkoXCJbJXNdIGZpbGVcIiwgKG9wOiBGaWxlT3BlcmF0aW9uKSA9PiB7XG5cdFx0Ly8gWWVhLi4uIHRoZXNlIGFyZSBtb3JlIGludGVncmF0aW9uIHRlc3RzIGJ1dCBJJ20ga2luZGEgdW50cnVzdGluZyBvZiBtb2NrcyBmb3IgdGhpc1xuXHRcdGl0KFwiYXBwbGllcyBkZWZhdWx0IFsuanNvbl0gbWVyZ2Ugd2l0aCBmaXJzdCBydWxlcyBpZiBtZXJnZSBhcHBsaWVzIHRvIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0ZXhwZWN0KFxuXHRcdFx0XHRhd2FpdCBtZXJnZUZpbGUoXCJwYWNrYWdlLmpzb25cIiwge1xuXHRcdFx0XHRcdGN3ZDogdG1wRGlyLFxuXHRcdFx0XHRcdHRlbXBDbG9uZURpcjogdGVzdFRlbXBsYXRlRGlyLFxuXHRcdFx0XHRcdGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0XHRpZ25vcmU6IFtdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZmlsZU9wZXJhdGlvbjogb3AsXG5cdFx0XHRcdFx0dGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0XHRpZ25vcmU6IFtcIioqLyoudHh0XCJdLFxuXHRcdFx0XHRcdFx0bWVyZ2U6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uczogXCJtZXJnZS1jdXJyZW50XCIsXG5cdFx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcIl9qc29uXCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRnbG9iOiBcIioqL3BhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM6IFwibWVyZ2UtdGVtcGxhdGVcIixcblx0XHRcdFx0XHRcdFx0XHRwbHVnaW46IFwiX2pzb25cIixcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSksXG5cdFx0XHQpLnRvRXF1YWwoe1xuXHRcdFx0XHRpZ25vcmVkRHVlVG9Mb2NhbDogZmFsc2UsXG5cdFx0XHRcdGxvY2FsQ2hhbmdlczogW10sXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRW5zdXJlIHdlIG92ZXJ3cm90ZVxuXHRcdFx0ZXhwZWN0KFxuXHRcdFx0XHRKU09OLnBhcnNlKChhd2FpdCByZWFkRmlsZShqb2luKHRtcERpciwgXCJwYWNrYWdlLmpzb25cIikpKS50b1N0cmluZygpKSxcblx0XHRcdCkudG9FcXVhbCh7XG5cdFx0XHRcdG5hbWU6IFwibXlwa2dcIixcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwibXkgZGVzY3JpcHRpb25cIixcblx0XHRcdFx0ZGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFx0bXlwYWNrYWdlOiBcIl4xLjIuMFwiLFxuXHRcdFx0XHRcdG5ld3BhY2FrZ2U6IFwiXjIyLjIuMlwiLFxuXHRcdFx0XHRcdHBhY2thZ2UyOiBcIjMuMjIuMVwiLFxuXHRcdFx0XHRcdGh1aDogXCJeMi4zMC4wXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVuZ2luZXM6IHtcblx0XHRcdFx0XHRub2RlOiBcIj49MjBcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0c2NyaXB0czoge1xuXHRcdFx0XHRcdGJ1aWxkOiBcImJ1aWxkXCIsXG5cdFx0XHRcdFx0dGVzdDogXCJqZXN0XCIsXG5cdFx0XHRcdFx0bXlzY3JpcHQ6IFwic29tZXNjcmlwdFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR2ZXJzaW9uOiBcIm5ldy12ZXJzaW9uXCIsXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0XHRpdChcIltpbnZlcnNlXSBhcHBsaWVzIGRlZmF1bHQgWy5qc29uXSBtZXJnZSB3aXRoIGZpcnN0IHJ1bGVzIGlmIG1lcmdlIGFwcGxpZXMgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRleHBlY3QoXG5cdFx0XHRcdGF3YWl0IG1lcmdlRmlsZShcInBhY2thZ2UuanNvblwiLCB7XG5cdFx0XHRcdFx0Y3dkOiB0bXBEaXIsXG5cdFx0XHRcdFx0dGVtcENsb25lRGlyOiB0ZXN0VGVtcGxhdGVEaXIsXG5cdFx0XHRcdFx0bG9jYWxUZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRcdGlnbm9yZTogW10sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRmaWxlT3BlcmF0aW9uOiBvcCxcblx0XHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRcdGlnbm9yZTogW1wiKiovKi50eHRcIl0sXG5cdFx0XHRcdFx0XHRtZXJnZTogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Z2xvYjogXCIqKi9wYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiBcIm1lcmdlLXRlbXBsYXRlXCIsXG5cdFx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcIl9qc29uXCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRnbG9iOiBcIioqL3BhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM6IFwibWVyZ2UtY3VycmVudFwiLFxuXHRcdFx0XHRcdFx0XHRcdHBsdWdpbjogXCJfanNvblwiLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCkudG9FcXVhbCh7XG5cdFx0XHRcdGlnbm9yZWREdWVUb0xvY2FsOiBmYWxzZSxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzOiBbXSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBFbnN1cmUgd2Ugb3Zlcndyb3RlXG5cdFx0XHRleHBlY3QoXG5cdFx0XHRcdEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGpvaW4odG1wRGlyLCBcInBhY2thZ2UuanNvblwiKSkpLnRvU3RyaW5nKCkpLFxuXHRcdFx0KS50b0VxdWFsKHtcblx0XHRcdFx0bmFtZTogXCJzb21lLXN0dWItbmFtZVwiLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJzb21lLXN0dWItZGVzY3JpcHRpb25cIixcblx0XHRcdFx0ZGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFx0bXlwYWNrYWdlOiBcIl4xLjIuMFwiLFxuXHRcdFx0XHRcdG5ld3BhY2FrZ2U6IFwiXjIyLjIuMlwiLFxuXHRcdFx0XHRcdHBhY2thZ2UyOiBcIjMuMjIuMVwiLFxuXHRcdFx0XHRcdGh1aDogXCJ+MS4wLjBcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0ZW5naW5lczoge1xuXHRcdFx0XHRcdG5vZGU6IFwiPj0xNVwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdFx0YnVpbGQ6IFwiYnVpbGRcIixcblx0XHRcdFx0XHR0ZXN0OiBcImZpbGwgdGhpcyBpbiB5b3Vyc2VsZlwiLFxuXHRcdFx0XHRcdG15c2NyaXB0OiBcInNvbWVzY3JpcHRcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0dmVyc2lvbjogXCJuZXctdmVyc2lvblwiLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0aXQoXCJbaW52ZXJzZV0gYXBwbGllcyBkZWZhdWx0IFsuanNvbl0gbWVyZ2Ugd2l0aCBzeW5jIGFuZCB0aGVuIGxvY2FsIG92ZXJyaWRlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGV4cGVjdChcblx0XHRcdFx0YXdhaXQgbWVyZ2VGaWxlKFwicGFja2FnZS5qc29uXCIsIHtcblx0XHRcdFx0XHRjd2Q6IHRtcERpcixcblx0XHRcdFx0XHR0ZW1wQ2xvbmVEaXI6IHRlc3RUZW1wbGF0ZURpcixcblx0XHRcdFx0XHRmaWxlT3BlcmF0aW9uOiBvcCxcblx0XHRcdFx0XHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHRcdFx0XHRcdFx0aWdub3JlOiBbXSxcblx0XHRcdFx0XHRcdG1lcmdlOiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwbHVnaW46IFwiX2pzb25cIixcblx0XHRcdFx0XHRcdFx0XHRnbG9iOiBcIioqL3BhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdGhzOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCB0b3VjaCBodWhcblx0XHRcdFx0XHRcdFx0XHRcdFx0W1wiJC5kZXBlbmRlbmNpZXMuaHVoXCIsIFwibWVyZ2UtY3VycmVudFwiXSxcblx0XHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRcdGlnbm9yZTogW1wiKiovKi50eHRcIl0sXG5cdFx0XHRcdFx0XHRtZXJnZTogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Z2xvYjogXCIqKi9wYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0XHRwbHVnaW46IFwiX2pzb25cIixcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtaXNzaW5nSXNEZWxldGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXRoczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBNZXJnZSBhbGwgdGVtcGxhdGUgZGVwZW5kZW5jaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtcIiQuZGVwZW5kZW5jaWVzXCIsIFwibWVyZ2UtdGVtcGxhdGVcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdH0gYXMgSnNvbkZpbGVNZXJnZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KS50b0VxdWFsKHtcblx0XHRcdFx0aWdub3JlZER1ZVRvTG9jYWw6IGZhbHNlLFxuXHRcdFx0XHRsb2NhbENoYW5nZXM6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGFkZGVkOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRjb3VudDogMSxcblx0XHRcdFx0XHRcdHJlbW92ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ1xcdFxcdFwiaHVoXCI6IFwifjEuMC4wXCJcXG4nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YWRkZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRjb3VudDogMSxcblx0XHRcdFx0XHRcdHJlbW92ZWQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdHZhbHVlOiAnXFx0XFx0XCJodWhcIjogXCJeMi4zMC4wXCJcXG4nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0pLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEVuc3VyZSB3ZSBvdmVyd3JvdGVcblx0XHRcdGV4cGVjdChcblx0XHRcdFx0SlNPTi5wYXJzZSgoYXdhaXQgcmVhZEZpbGUoam9pbih0bXBEaXIsIFwicGFja2FnZS5qc29uXCIpKSkudG9TdHJpbmcoKSksXG5cdFx0XHQpLnRvRXF1YWwoe1xuXHRcdFx0XHRuYW1lOiBcIm15cGtnXCIsXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIm15IGRlc2NyaXB0aW9uXCIsXG5cdFx0XHRcdGRlcGVuZGVuY2llczoge1xuXHRcdFx0XHRcdG15cGFja2FnZTogXCJeMS4yLjBcIixcblx0XHRcdFx0XHRuZXdwYWNha2dlOiBcIl4yMi4yLjJcIixcblx0XHRcdFx0XHRwYWNrYWdlMjogXCIzLjIyLjFcIixcblx0XHRcdFx0XHRodWg6IFwiXjIuMzAuMFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRlbmdpbmVzOiB7XG5cdFx0XHRcdFx0bm9kZTogXCI+PTIwXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0XHRidWlsZDogXCJidWlsZFwiLFxuXHRcdFx0XHRcdHRlc3Q6IFwiamVzdFwiLFxuXHRcdFx0XHRcdG15c2NyaXB0OiBcInNvbWVzY3JpcHRcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0dmVyc2lvbjogXCJuZXctdmVyc2lvblwiLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0aXQoXCJbaW52ZXJzZV0gYXBwbGllcyBkZWZhdWx0IFsuanNvbl0gYW5kIGN1c3RvbSBtZXJnZSBmb3IgbG9jYWwgd2l0aCBzeW5jIGFuZCB0aGVuIGxvY2FsIG92ZXJyaWRlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGV4cGVjdChcblx0XHRcdFx0YXdhaXQgbWVyZ2VGaWxlKFwicGFja2FnZS5qc29uXCIsIHtcblx0XHRcdFx0XHRjd2Q6IHRtcERpcixcblx0XHRcdFx0XHR0ZW1wQ2xvbmVEaXI6IHRlc3RUZW1wbGF0ZURpcixcblx0XHRcdFx0XHRmaWxlT3BlcmF0aW9uOiBvcCxcblx0XHRcdFx0XHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZzoge1xuXHRcdFx0XHRcdFx0aWdub3JlOiBbXSxcblx0XHRcdFx0XHRcdG1lcmdlOiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwbHVnaW46IFwiLi4vdGVzdC1maXh0dXJlcy9kdW1teS1wbHVnaW4uanNcIixcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXRoczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEbyBub3QgdG91Y2ggaHVoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtcIiQuZGVwZW5kZW5jaWVzLmh1aFwiLCBcIm1lcmdlLWN1cnJlbnRcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0Z2xvYjogXCIqKi9wYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRcdGlnbm9yZTogW1wiKiovKi50eHRcIl0sXG5cdFx0XHRcdFx0XHRtZXJnZTogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcIl9qc29uXCIsXG5cdFx0XHRcdFx0XHRcdFx0Z2xvYjogXCIqKi9wYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtaXNzaW5nSXNEZWxldGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXRoczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBNZXJnZSBhbGwgdGVtcGxhdGUgZGVwZW5kZW5jaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtcIiQuZGVwZW5kZW5jaWVzXCIsIFwibWVyZ2UtdGVtcGxhdGVcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdH0gYXMgSnNvbkZpbGVNZXJnZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KS50b0VxdWFsKHtcblx0XHRcdFx0aWdub3JlZER1ZVRvTG9jYWw6IGZhbHNlLFxuXHRcdFx0XHQvLyBUT0RPOiBJIGRvbid0XG5cdFx0XHRcdGxvY2FsQ2hhbmdlczogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YWRkZWQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdGNvdW50OiAxNyxcblx0XHRcdFx0XHRcdHJlbW92ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHR2YWx1ZTogYFxcdFwibmFtZVwiOiBcIm15cGtnXCIsXG5cXHRcImRlc2NyaXB0aW9uXCI6IFwibXkgZGVzY3JpcHRpb25cIixcblxcdFwiZGVwZW5kZW5jaWVzXCI6IHtcblxcdFxcdFwibXlwYWNrYWdlXCI6IFwiXjEuMi4wXCIsXG5cXHRcXHRcIm5ld3BhY2FrZ2VcIjogXCJeMjIuMi4yXCIsXG5cXHRcXHRcInBhY2thZ2UyXCI6IFwiMy4yMi4xXCIsXG5cXHRcXHRcImh1aFwiOiBcIn4xLjAuMFwiXG5cXHR9LFxuXFx0XCJlbmdpbmVzXCI6IHtcblxcdFxcdFwibm9kZVwiOiBcIj49MjBcIlxuXFx0fSxcblxcdFwic2NyaXB0c1wiOiB7XG5cXHRcXHRcImJ1aWxkXCI6IFwiYnVpbGRcIixcblxcdFxcdFwidGVzdFwiOiBcImplc3RcIixcblxcdFxcdFwibXlzY3JpcHRcIjogXCJzb21lc2NyaXB0XCJcblxcdH0sXG5cXHRcInZlcnNpb25cIjogXCJuZXctdmVyc2lvblwiXFxuYCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGFkZGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0Y291bnQ6IDEsXG5cdFx0XHRcdFx0XHRyZW1vdmVkOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHR2YWx1ZTogYCAgICBcInRlc3RlZFwiOiB0cnVlXFxuYCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdKSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBFbnN1cmUgd2Ugb3Zlcndyb3RlXG5cdFx0XHRleHBlY3QoXG5cdFx0XHRcdEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGpvaW4odG1wRGlyLCBcInBhY2thZ2UuanNvblwiKSkpLnRvU3RyaW5nKCkpLFxuXHRcdFx0KS50b0VxdWFsKHtcblx0XHRcdFx0dGVzdGVkOiB0cnVlLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0aXQoXCJbaW52ZXJzZV0gYXBwbGllcyBidWlsdGluIF9qc29uIGFuZCBjdXN0b20gbWVyZ2UgZm9yIGxvY2FsIHdpdGggc3luYyBwbHVnaW4gYW5kIHRoZW4gbG9jYWwgb3ZlcnJpZGVcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0ZXhwZWN0KFxuXHRcdFx0XHRhd2FpdCBtZXJnZUZpbGUoXCJwYWNrYWdlLmpzb25cIiwge1xuXHRcdFx0XHRcdGN3ZDogdG1wRGlyLFxuXHRcdFx0XHRcdHRlbXBDbG9uZURpcjogdGVzdFRlbXBsYXRlRGlyLFxuXHRcdFx0XHRcdGZpbGVPcGVyYXRpb246IG9wLFxuXHRcdFx0XHRcdGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiB7XG5cdFx0XHRcdFx0XHRpZ25vcmU6IFtdLFxuXHRcdFx0XHRcdFx0bWVyZ2U6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcInBsdWdpbnMvY3VzdG9tLXBsdWdpbi5qc1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdGhzOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCB0b3VjaCBodWhcblx0XHRcdFx0XHRcdFx0XHRcdFx0W1wiJC5kZXBlbmRlbmNpZXMuaHVoXCIsIFwibWVyZ2UtY3VycmVudFwiXSxcblx0XHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0ZW1wbGF0ZVN5bmNDb25maWc6IHtcblx0XHRcdFx0XHRcdGlnbm9yZTogW1wiKiovKi50eHRcIl0sXG5cdFx0XHRcdFx0XHRtZXJnZTogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Z2xvYjogXCIqKi9wYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPIC0gd2UgbmVlZCB0byBoYW5kbGUgdGhlIHdlaXJkIGltcGxpY2l0IGNhc2UgSSBhZGRlZCBoZXJlLiAgSXQncyBkdW1iXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlzc2luZ0lzRGVsZXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aHM6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTWVyZ2UgYWxsIHRlbXBsYXRlIGRlcGVuZGVuY2llc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRbXCIkLmRlcGVuZGVuY2llc1wiLCBcIm1lcmdlLXRlbXBsYXRlXCJdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0XHR9IGFzIEpzb25GaWxlTWVyZ2VPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRcdHBsdWdpbjogXCJfanNvblwiLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdC8vICAgXCIuanNvblwiOiB7XG5cdFx0XHRcdFx0XHQvLyAgICAgLy8gbm8gcGx1Z2luc1xuXHRcdFx0XHRcdFx0Ly8gICAgIHJ1bGVzOiBbXG5cdFx0XHRcdFx0XHQvLyAgICAgICB7XG5cdFx0XHRcdFx0XHQvLyAgICAgICAgIGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHQvLyAgICAgICAgIG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdC8vICAgICAgICAgICBtaXNzaW5nSXNEZWxldGU6IHRydWUsXG5cdFx0XHRcdFx0XHQvLyAgICAgICAgICAgcGF0aHM6IFtcblx0XHRcdFx0XHRcdC8vICAgICAgICAgICAgIC8vIE1lcmdlIGFsbCB0ZW1wbGF0ZSBkZXBlbmRlbmNpZXNcblx0XHRcdFx0XHRcdC8vICAgICAgICAgICAgIFtcIiQuZGVwZW5kZW5jaWVzXCIsIFwibWVyZ2UtdGVtcGxhdGVcIl0sXG5cdFx0XHRcdFx0XHQvLyAgICAgICAgICAgXSxcblx0XHRcdFx0XHRcdC8vICAgICAgICAgfSBhcyBKc29uRmlsZU1lcmdlT3B0aW9ucyxcblx0XHRcdFx0XHRcdC8vICAgICAgIH0sXG5cdFx0XHRcdFx0XHQvLyAgICAgICB7XG5cdFx0XHRcdFx0XHQvLyAgICAgICAgIGdsb2I6IFwiKiovcGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHQvLyAgICAgICAgIG9wdGlvbnM6IFwibWVyZ2UtY3VycmVudFwiLFxuXHRcdFx0XHRcdFx0Ly8gICAgICAgfSxcblx0XHRcdFx0XHRcdC8vICAgICBdLFxuXHRcdFx0XHRcdFx0Ly8gICB9LFxuXHRcdFx0XHRcdFx0Ly8gfSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCkudG9FcXVhbCh7XG5cdFx0XHRcdGlnbm9yZWREdWVUb0xvY2FsOiBmYWxzZSxcblx0XHRcdFx0Ly8gV2UgYXJlIGp1c3QgbWFraW5nIHN1cmUgcGx1Z2luIGxvb2sgdXAgaGFwcGVucyBoZXJlXG5cdFx0XHRcdGxvY2FsQ2hhbmdlczogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXSksXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRW5zdXJlIHdlIG92ZXJ3cm90ZVxuXHRcdFx0ZXhwZWN0KFxuXHRcdFx0XHRKU09OLnBhcnNlKChhd2FpdCByZWFkRmlsZShqb2luKHRtcERpciwgXCJwYWNrYWdlLmpzb25cIikpKS50b1N0cmluZygpKSxcblx0XHRcdCkudG9FcXVhbCh7XG5cdFx0XHRcdGRvd25zdHJlYW06IHRydWUsXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJ0ZXN0VGVtcGxhdGVEaXIiLCJyZXNvbHZlIiwiVEVTVF9GSVhUVVJFU19ESVIiLCJ0ZXN0RG93bnN0cmVhbURpciIsImRlc2NyaWJlIiwidG1wRGlyIiwidG1wVGVtcGxhdGVEaXIiLCJiZWZvcmVFYWNoIiwibWtkdGVtcCIsInRlbXBEaXIiLCJjb3B5U3luYyIsImFmdGVyRWFjaCIsInJtIiwiZm9yY2UiLCJyZWN1cnNpdmUiLCJpdCIsImVhY2giLCJvcCIsImV4cGVjdCIsIm1lcmdlRmlsZSIsImN3ZCIsInRlbXBDbG9uZURpciIsImxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnIiwiaWdub3JlIiwibWVyZ2UiLCJ0ZW1wbGF0ZVN5bmNDb25maWciLCJmaWxlT3BlcmF0aW9uIiwidG9FcXVhbCIsImlnbm9yZWREdWVUb0xvY2FsIiwibG9jYWxDaGFuZ2VzIiwicmVhZEZpbGUiLCJqb2luIiwiZXhpc3RzU3luYyIsInRvQmVGYWxzeSIsInBsdWdpbiIsImdsb2IiLCJvcHRpb25zIiwicGF0aHMiLCJtaXNzaW5nSXNEZWxldGUiLCJKU09OIiwicGFyc2UiLCJ0b1N0cmluZyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImRlcGVuZGVuY2llcyIsIm15cGFja2FnZSIsIm5ld3BhY2FrZ2UiLCJwYWNrYWdlMiIsImh1aCIsImVuZ2luZXMiLCJub2RlIiwic2NyaXB0cyIsImJ1aWxkIiwidGVzdCIsIm15c2NyaXB0IiwidmVyc2lvbiIsImFycmF5Q29udGFpbmluZyIsImFkZGVkIiwidW5kZWZpbmVkIiwiY291bnQiLCJyZW1vdmVkIiwidmFsdWUiLCJ0ZXN0ZWQiLCJkb3duc3RyZWFtIl0sIm1hcHBpbmdzIjoiOzs7O29CQUEyQjswQkFDVzt5QkFDYjtzQkFDSzsyQkFDSjsyQkFDaUI7QUFHM0MsTUFBTUEsa0JBQWtCQyxJQUFBQSxhQUFPLEVB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
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "defaultExtensionMap", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return defaultExtensionMap;
9
+ }
10
+ });
11
+ const _jsonmerge = require("./json-merge");
12
+ const defaultExtensionMap = {
13
+ ".json": {
14
+ merge: _jsonmerge.merge,
15
+ validate: _jsonmerge.validate,
16
+ builtinName: "_json"
17
+ }
18
+ };
19
+
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSnNvbkZpbGVNZXJnZU9wdGlvbnMsIE1lcmdlUGx1Z2luIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtZXJnZSBhcyBqc29uTWVyZ2UsIHZhbGlkYXRlIGFzIGpzb25WYWxpZGF0ZSB9IGZyb20gXCIuL2pzb24tbWVyZ2VcIjtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFeHRlbnNpb25NYXAgPSB7XG5cdFwiLmpzb25cIjoge1xuXHRcdG1lcmdlOiBqc29uTWVyZ2UsXG5cdFx0dmFsaWRhdGU6IGpzb25WYWxpZGF0ZSxcblx0XHRidWlsdGluTmFtZTogXCJfanNvblwiLFxuXHR9LFxufSBhcyB7XG5cdFtleHQ6IHN0cmluZ106IE1lcmdlUGx1Z2luPEpzb25GaWxlTWVyZ2VPcHRpb25zPiAmIHsgYnVpbHRpbk5hbWU6IHN0cmluZyB9O1xufTtcbiJdLCJuYW1lcyI6WyJkZWZhdWx0RXh0ZW5zaW9uTWFwIiwibWVyZ2UiLCJqc29uTWVyZ2UiLCJ2YWxpZGF0ZSIsImpzb25WYWxpZGF0ZSIsImJ1aWx0aW5OYW1lIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdhQTs7O2VBQUFBOzs7MkJBRmdEO0FBRXRELE1BQU1BLHNCQUFzQjtJQUNsQyxTQUFTO1FBQ1JDLE9BQU9DLGdCQUFTO1FBQ2hCQyxVQUFVQyxtQkFBWTtRQUN0QkMsYUFBYTtJQUNkO0FBQ0QifQ==