@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.
- package/CHANGELOG.md +43 -45
- package/dist/cjs/checkout-drivers/git-checkout.js +37 -0
- package/dist/cjs/checkout-drivers/git-checkout.spec.js +60 -0
- package/dist/cjs/checkout-drivers/index.js +21 -0
- package/dist/cjs/checkout-drivers/types.js +11 -0
- package/dist/cjs/clone-drivers/git-clone.js +25 -0
- package/dist/cjs/clone-drivers/index.js +21 -0
- package/dist/cjs/clone-drivers/types.js +8 -0
- package/dist/cjs/diff-drivers/git-diff.js +30 -0
- package/dist/cjs/diff-drivers/git-diff.spec.js +138 -0
- package/dist/cjs/diff-drivers/index.js +21 -0
- package/dist/cjs/diff-drivers/types.js +6 -0
- package/dist/cjs/formatting/index.js +21 -0
- package/dist/cjs/formatting/infer-json-indent.js +26 -0
- package/dist/cjs/formatting/infer-json-indent.spec.js +50 -0
- package/dist/cjs/formatting/sync-results-to-md.js +62 -0
- package/dist/cjs/formatting/sync-results-to-md.spec.js +45 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/load-plugin.js +44 -0
- package/dist/cjs/match.js +51 -0
- package/dist/cjs/match.spec.js +75 -0
- package/dist/cjs/merge-file.js +91 -0
- package/dist/cjs/merge-file.spec.js +508 -0
- package/dist/cjs/plugins/index.js +20 -0
- package/dist/cjs/plugins/json-merge.js +228 -0
- package/dist/cjs/plugins/json-merge.spec.js +514 -0
- package/dist/cjs/ref-drivers/git-current-ref.js +18 -0
- package/dist/cjs/ref-drivers/git-current-ref.spec.js +15 -0
- package/dist/cjs/ref-drivers/index.js +20 -0
- package/dist/cjs/ref-drivers/types.js +11 -0
- package/dist/cjs/template-sync.js +236 -0
- package/dist/cjs/template-sync.spec.js +521 -0
- package/dist/cjs/test-utils/index.js +26 -0
- package/dist/cjs/types.js +12 -0
- package/dist/esm/checkout-drivers/git-checkout.mjs +27 -0
- package/dist/esm/checkout-drivers/git-checkout.spec.mjs +56 -0
- package/dist/esm/checkout-drivers/index.mjs +4 -0
- package/dist/esm/checkout-drivers/types.mjs +8 -0
- package/dist/esm/clone-drivers/git-clone.mjs +15 -0
- package/dist/esm/clone-drivers/index.mjs +4 -0
- package/dist/esm/clone-drivers/types.mjs +8 -0
- package/dist/esm/diff-drivers/git-diff.mjs +26 -0
- package/dist/esm/diff-drivers/git-diff.spec.mjs +93 -0
- package/dist/esm/diff-drivers/index.mjs +4 -0
- package/dist/esm/diff-drivers/types.mjs +6 -0
- package/dist/esm/formatting/index.mjs +4 -0
- package/dist/esm/formatting/infer-json-indent.mjs +16 -0
- package/dist/esm/formatting/infer-json-indent.spec.mjs +46 -0
- package/dist/esm/formatting/sync-results-to-md.mjs +52 -0
- package/dist/esm/formatting/sync-results-to-md.spec.mjs +41 -0
- package/dist/esm/index.mjs +5 -0
- package/dist/esm/load-plugin.mjs +40 -0
- package/dist/esm/match.mjs +40 -0
- package/dist/esm/match.spec.mjs +71 -0
- package/dist/esm/merge-file.mjs +88 -0
- package/dist/esm/merge-file.spec.mjs +504 -0
- package/dist/esm/plugins/index.mjs +10 -0
- package/dist/esm/plugins/json-merge.mjs +164 -0
- package/dist/esm/plugins/json-merge.spec.mjs +469 -0
- package/dist/esm/ref-drivers/git-current-ref.mjs +8 -0
- package/dist/esm/ref-drivers/git-current-ref.spec.mjs +11 -0
- package/dist/esm/ref-drivers/index.mjs +3 -0
- package/dist/esm/ref-drivers/types.mjs +8 -0
- package/dist/esm/template-sync.mjs +174 -0
- package/dist/esm/template-sync.spec.mjs +517 -0
- package/dist/esm/test-utils/index.mjs +10 -0
- package/dist/esm/types.mjs +9 -0
- package/{lib/cjs → dist/types}/checkout-drivers/git-checkout.d.ts +1 -0
- package/dist/types/checkout-drivers/git-checkout.d.ts.map +1 -0
- package/dist/types/checkout-drivers/git-checkout.spec.d.ts +2 -0
- package/dist/types/checkout-drivers/git-checkout.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/checkout-drivers/index.d.ts +1 -0
- package/dist/types/checkout-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/checkout-drivers/types.d.ts +1 -0
- package/dist/types/checkout-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/git-clone.d.ts +2 -1
- package/dist/types/clone-drivers/git-clone.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/index.d.ts +2 -1
- package/dist/types/clone-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/types.d.ts +1 -0
- package/dist/types/clone-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/git-diff.d.ts +1 -0
- package/dist/types/diff-drivers/git-diff.d.ts.map +1 -0
- package/dist/types/diff-drivers/git-diff.spec.d.ts +2 -0
- package/dist/types/diff-drivers/git-diff.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/index.d.ts +2 -1
- package/dist/types/diff-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/types.d.ts +1 -0
- package/dist/types/diff-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/formatting/index.d.ts +2 -1
- package/dist/types/formatting/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/formatting/infer-json-indent.d.ts +1 -0
- package/dist/types/formatting/infer-json-indent.d.ts.map +1 -0
- package/dist/types/formatting/infer-json-indent.spec.d.ts +2 -0
- package/dist/types/formatting/infer-json-indent.spec.d.ts.map +1 -0
- package/dist/types/formatting/sync-results-to-md.d.ts +3 -0
- package/dist/types/formatting/sync-results-to-md.d.ts.map +1 -0
- package/dist/types/formatting/sync-results-to-md.spec.d.ts +2 -0
- package/dist/types/formatting/sync-results-to-md.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/load-plugin.d.ts +2 -1
- package/dist/types/load-plugin.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/match.d.ts +1 -0
- package/dist/types/match.d.ts.map +1 -0
- package/dist/types/match.spec.d.ts +2 -0
- package/dist/types/match.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/merge-file.d.ts +3 -2
- package/dist/types/merge-file.d.ts.map +1 -0
- package/dist/types/merge-file.spec.d.ts +2 -0
- package/dist/types/merge-file.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/plugins/index.d.ts +2 -1
- package/dist/types/plugins/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/plugins/json-merge.d.ts +2 -1
- package/dist/types/plugins/json-merge.d.ts.map +1 -0
- package/dist/types/plugins/json-merge.spec.d.ts +2 -0
- package/dist/types/plugins/json-merge.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/git-current-ref.d.ts +1 -0
- package/dist/types/ref-drivers/git-current-ref.d.ts.map +1 -0
- package/dist/types/ref-drivers/git-current-ref.spec.d.ts +2 -0
- package/dist/types/ref-drivers/git-current-ref.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/index.d.ts +1 -0
- package/dist/types/ref-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/types.d.ts +1 -0
- package/dist/types/ref-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/template-sync.d.ts +6 -5
- package/dist/types/template-sync.d.ts.map +1 -0
- package/dist/types/template-sync.spec.d.ts +2 -0
- package/dist/types/template-sync.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/test-utils/index.d.ts +1 -0
- package/dist/types/test-utils/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/types.d.ts +1 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +26 -23
- package/.eslintrc.js +0 -10
- package/.github/CODEOWNERS +0 -6
- package/.github/workflows/pr-checks.yaml +0 -12
- package/.github/workflows/release.yaml +0 -47
- package/.github/workflows/test-flow.yaml +0 -63
- package/.husky/commit-msg +0 -4
- package/.prettierignore +0 -1
- package/.prettierrc +0 -1
- package/action.yml +0 -13
- package/commitlint.config.js +0 -3
- package/docs/merge-plugins/CURRENT_PLUGINS.md +0 -168
- package/docs/merge-plugins/PLUGIN_DEVELOPMENT.md +0 -122
- package/docs/merge-plugins/README.md +0 -75
- package/jest.config.js +0 -19
- package/lib/cjs/checkout-drivers/git-checkout.js +0 -29
- package/lib/cjs/checkout-drivers/index.js +0 -18
- package/lib/cjs/checkout-drivers/types.js +0 -2
- package/lib/cjs/clone-drivers/git-clone.js +0 -17
- package/lib/cjs/clone-drivers/index.js +0 -18
- package/lib/cjs/clone-drivers/types.js +0 -2
- package/lib/cjs/diff-drivers/git-diff.js +0 -41
- package/lib/cjs/diff-drivers/index.js +0 -18
- package/lib/cjs/diff-drivers/types.js +0 -2
- package/lib/cjs/formatting/index.js +0 -18
- package/lib/cjs/formatting/infer-json-indent.js +0 -18
- package/lib/cjs/formatting/sync-results-to-md.d.ts +0 -2
- package/lib/cjs/formatting/sync-results-to-md.js +0 -57
- package/lib/cjs/index.js +0 -19
- package/lib/cjs/load-plugin.js +0 -69
- package/lib/cjs/match.js +0 -45
- package/lib/cjs/merge-file.js +0 -98
- package/lib/cjs/plugins/index.js +0 -11
- package/lib/cjs/plugins/json-merge.js +0 -208
- package/lib/cjs/ref-drivers/git-current-ref.js +0 -12
- package/lib/cjs/ref-drivers/index.js +0 -17
- package/lib/cjs/ref-drivers/types.js +0 -2
- package/lib/cjs/template-sync.js +0 -163
- package/lib/cjs/test-utils/index.js +0 -10
- package/lib/cjs/types.js +0 -2
- package/lib/esm/checkout-drivers/git-checkout.js +0 -29
- package/lib/esm/checkout-drivers/index.js +0 -18
- package/lib/esm/checkout-drivers/types.js +0 -2
- package/lib/esm/clone-drivers/git-clone.js +0 -17
- package/lib/esm/clone-drivers/index.js +0 -18
- package/lib/esm/clone-drivers/types.js +0 -2
- package/lib/esm/diff-drivers/git-diff.js +0 -41
- package/lib/esm/diff-drivers/index.js +0 -18
- package/lib/esm/diff-drivers/types.js +0 -2
- package/lib/esm/formatting/index.js +0 -18
- package/lib/esm/formatting/infer-json-indent.js +0 -18
- package/lib/esm/formatting/sync-results-to-md.js +0 -57
- package/lib/esm/index.js +0 -19
- package/lib/esm/load-plugin.js +0 -46
- package/lib/esm/match.js +0 -45
- package/lib/esm/merge-file.js +0 -98
- package/lib/esm/plugins/index.js +0 -11
- package/lib/esm/plugins/json-merge.js +0 -208
- package/lib/esm/ref-drivers/git-current-ref.js +0 -12
- package/lib/esm/ref-drivers/index.js +0 -17
- package/lib/esm/ref-drivers/types.js +0 -2
- package/lib/esm/template-sync.js +0 -163
- package/lib/esm/test-utils/index.js +0 -10
- package/lib/esm/types.js +0 -2
- package/release.config.js +0 -40
- package/src/checkout-drivers/git-checkout.spec.ts +0 -69
- package/src/checkout-drivers/git-checkout.ts +0 -38
- package/src/checkout-drivers/index.ts +0 -2
- package/src/checkout-drivers/types.ts +0 -14
- package/src/clone-drivers/git-clone.ts +0 -20
- package/src/clone-drivers/index.ts +0 -2
- package/src/clone-drivers/types.ts +0 -20
- package/src/diff-drivers/git-diff.spec.ts +0 -73
- package/src/diff-drivers/git-diff.ts +0 -39
- package/src/diff-drivers/index.ts +0 -2
- package/src/diff-drivers/types.ts +0 -14
- package/src/formatting/__snapshots__/sync-results-to-md.spec.ts.snap +0 -39
- package/src/formatting/index.ts +0 -2
- package/src/formatting/infer-json-indent.spec.ts +0 -49
- package/src/formatting/infer-json-indent.ts +0 -16
- package/src/formatting/sync-results-to-md.spec.ts +0 -31
- package/src/formatting/sync-results-to-md.ts +0 -63
- package/src/index.ts +0 -3
- package/src/load-plugin.ts +0 -51
- package/src/match.spec.ts +0 -68
- package/src/match.ts +0 -52
- package/src/merge-file.spec.ts +0 -506
- package/src/merge-file.ts +0 -154
- package/src/plugins/index.ts +0 -12
- package/src/plugins/json-merge.spec.ts +0 -436
- package/src/plugins/json-merge.ts +0 -215
- package/src/ref-drivers/git-current-ref.spec.ts +0 -12
- package/src/ref-drivers/git-current-ref.ts +0 -9
- package/src/ref-drivers/index.ts +0 -1
- package/src/ref-drivers/types.ts +0 -10
- package/src/template-sync.spec.ts +0 -509
- package/src/template-sync.ts +0 -256
- package/src/test-utils/index.ts +0 -13
- package/src/types.ts +0 -129
- package/templatesync.local.json +0 -15
- package/test-fixtures/downstream/README.md +0 -3
- package/test-fixtures/downstream/package.json +0 -18
- package/test-fixtures/downstream/plugins/custom-plugin.js +0 -11
- package/test-fixtures/downstream/src/index.js +0 -2
- package/test-fixtures/downstream/src/index.ts +0 -1
- package/test-fixtures/downstream/src/templated.js +0 -2
- package/test-fixtures/downstream/src/templated.ts +0 -1
- package/test-fixtures/downstream/templatesync.json +0 -16
- package/test-fixtures/downstream/templatesync.local.json +0 -10
- package/test-fixtures/dummy-plugin.js +0 -8
- package/test-fixtures/glob-test/folder1/something.js +0 -1
- package/test-fixtures/glob-test/folder1/something.ts +0 -0
- package/test-fixtures/glob-test/toplevel.js +0 -0
- package/test-fixtures/glob-test/toplevel.txt +0 -0
- package/test-fixtures/template/custom-bin/something.txt +0 -1
- package/test-fixtures/template/package.json +0 -17
- package/test-fixtures/template/src/index.js +0 -2
- package/test-fixtures/template/src/index.ts +0 -1
- package/test-fixtures/template/src/templated.js +0 -2
- package/test-fixtures/template/src/templated.ts +0 -1
- package/test-fixtures/template/templatesync.json +0 -16
- package/test-fixtures/testGitRepo/README.md +0 -17
- package/test-fixtures/testGitRepo/gitDir/COMMIT_EDITMSG +0 -14
- package/test-fixtures/testGitRepo/gitDir/HEAD +0 -1
- package/test-fixtures/testGitRepo/gitDir/config +0 -7
- package/test-fixtures/testGitRepo/gitDir/description +0 -1
- package/test-fixtures/testGitRepo/gitDir/hooks/applypatch-msg.sample +0 -15
- package/test-fixtures/testGitRepo/gitDir/hooks/commit-msg.sample +0 -24
- package/test-fixtures/testGitRepo/gitDir/hooks/fsmonitor-watchman.sample +0 -174
- package/test-fixtures/testGitRepo/gitDir/hooks/post-update.sample +0 -8
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-applypatch.sample +0 -14
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-commit.sample +0 -49
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-merge-commit.sample +0 -13
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-push.sample +0 -53
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-rebase.sample +0 -169
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-receive.sample +0 -24
- package/test-fixtures/testGitRepo/gitDir/hooks/prepare-commit-msg.sample +0 -42
- package/test-fixtures/testGitRepo/gitDir/hooks/push-to-checkout.sample +0 -78
- package/test-fixtures/testGitRepo/gitDir/hooks/sendemail-validate.sample +0 -77
- package/test-fixtures/testGitRepo/gitDir/hooks/update.sample +0 -128
- package/test-fixtures/testGitRepo/gitDir/index +0 -0
- package/test-fixtures/testGitRepo/gitDir/info/exclude +0 -6
- package/test-fixtures/testGitRepo/gitDir/logs/HEAD +0 -5
- package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/master +0 -2
- package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/test-branch +0 -2
- package/test-fixtures/testGitRepo/gitDir/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/6e/187bee8d02f39d0a1be8331dd8fe6a00c9b613 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/73/185f1f3f5a6345e087d9f46dc4af77cc59449f +0 -2
- package/test-fixtures/testGitRepo/gitDir/objects/90/e7ea1089f939840e9649fd617584c1ad117159 +0 -3
- package/test-fixtures/testGitRepo/gitDir/objects/ba/99a452b9097047e9bfa8d5a08b3e452fcb364a +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/c5/8d400177cd5180b8566f82a127fafc5bf394b7 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/e2/e668265db019249a7e8296d85f79000e3d71cf +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/e4/243e430c1ab69f3e344249f5b1859e90abc883 +0 -1
- package/test-fixtures/testGitRepo/gitDir/objects/ec/6c1cb72312605282ac61858cf1eaf1ea9f1d02 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/fc/89cecc4ac0b5b075bd7d0ce9e09b2f50598b82 +0 -0
- package/test-fixtures/testGitRepo/gitDir/refs/heads/master +0 -1
- package/test-fixtures/testGitRepo/gitDir/refs/heads/test-branch +0 -1
- package/tsconfig.cjs.json +0 -12
- package/tsconfig.esm.json +0 -10
- 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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
|