@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,517 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { copy } from "fs-extra";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
|
+
import { templateSync } from "./template-sync.mjs";
|
|
6
|
+
import { TEST_FIXTURES_DIR, tempDir } from "./test-utils/index.mjs";
|
|
7
|
+
const dummyCheckoutDriver = jest.fn();
|
|
8
|
+
const dummyCurrentRefDriver = jest.fn();
|
|
9
|
+
const downstreamDir = resolve(TEST_FIXTURES_DIR, "downstream");
|
|
10
|
+
describe("templateSync", ()=>{
|
|
11
|
+
let tmpDir;
|
|
12
|
+
let templateDir;
|
|
13
|
+
let dummyCloneDriver;
|
|
14
|
+
beforeEach(async ()=>{
|
|
15
|
+
jest.resetAllMocks();
|
|
16
|
+
tmpDir = await mkdtemp(tempDir());
|
|
17
|
+
templateDir = await mkdtemp(tempDir());
|
|
18
|
+
await copy(resolve(TEST_FIXTURES_DIR, "template"), templateDir);
|
|
19
|
+
await copy(downstreamDir, tmpDir);
|
|
20
|
+
dummyCloneDriver = async ()=>{
|
|
21
|
+
return {
|
|
22
|
+
dir: templateDir,
|
|
23
|
+
remoteName: "ourRemote"
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
afterEach(async ()=>{
|
|
28
|
+
await rm(tmpDir, {
|
|
29
|
+
force: true,
|
|
30
|
+
recursive: true
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
// Note: for this test, we expect actions and users to handle misconfigured template syncs
|
|
34
|
+
it.each([
|
|
35
|
+
[
|
|
36
|
+
"local",
|
|
37
|
+
`templatesync.local.json plugin option errors:
|
|
38
|
+
\tPlugin (plugins/fail-validate-plugin.js):
|
|
39
|
+
\t\toh no!
|
|
40
|
+
\t\tnot this one too!
|
|
41
|
+
`
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
"template",
|
|
45
|
+
`templatesync.json plugin option errors:
|
|
46
|
+
\tPlugin (dummy-fail-plugin.js):
|
|
47
|
+
\t\tshucks
|
|
48
|
+
\t\tno good
|
|
49
|
+
`
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"both",
|
|
53
|
+
`templatesync.json plugin option errors:
|
|
54
|
+
\tPlugin (dummy-fail-plugin.js):
|
|
55
|
+
\t\tshucks
|
|
56
|
+
\t\tno good
|
|
57
|
+
templatesync.local.json plugin option errors:
|
|
58
|
+
\tPlugin (plugins/fail-validate-plugin.js):
|
|
59
|
+
\t\toh no!
|
|
60
|
+
\t\tnot this one too!
|
|
61
|
+
`
|
|
62
|
+
]
|
|
63
|
+
])("throws errors from plugin validation", async (mode, expected)=>{
|
|
64
|
+
// Remove the local sync overrides
|
|
65
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
66
|
+
if (mode === "local" || mode == "both") {
|
|
67
|
+
writeFileSync(join(tmpDir, "templatesync.local.json"), JSON.stringify({
|
|
68
|
+
ignore: [
|
|
69
|
+
// Ignores the templated.ts
|
|
70
|
+
"**/*.ts",
|
|
71
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
72
|
+
"plugins/**"
|
|
73
|
+
],
|
|
74
|
+
merge: [
|
|
75
|
+
{
|
|
76
|
+
glob: "package.json",
|
|
77
|
+
plugin: "plugins/fail-validate-plugin.js",
|
|
78
|
+
options: {}
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
if (mode === "template" || mode === "both") {
|
|
84
|
+
writeFileSync(join(templateDir, "templatesync.json"), JSON.stringify({
|
|
85
|
+
ignore: [
|
|
86
|
+
// Ignores the templated.ts
|
|
87
|
+
"**/*.ts",
|
|
88
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
89
|
+
"plugins/**"
|
|
90
|
+
],
|
|
91
|
+
merge: [
|
|
92
|
+
{
|
|
93
|
+
glob: "package.json",
|
|
94
|
+
plugin: "dummy-fail-plugin.js",
|
|
95
|
+
options: {}
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
await expect(async ()=>await templateSync({
|
|
101
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
102
|
+
cloneDriver: dummyCloneDriver,
|
|
103
|
+
repoUrl: "not-important",
|
|
104
|
+
repoDir: tmpDir,
|
|
105
|
+
checkoutDriver: dummyCheckoutDriver,
|
|
106
|
+
currentRefDriver: dummyCurrentRefDriver
|
|
107
|
+
})).rejects.toThrow(expected);
|
|
108
|
+
});
|
|
109
|
+
it("appropriately merges according to just the templatesync config file into an empty dir", async ()=>{
|
|
110
|
+
const emptyTmpDir = await mkdtemp(tempDir());
|
|
111
|
+
expect(await templateSync({
|
|
112
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
113
|
+
cloneDriver: dummyCloneDriver,
|
|
114
|
+
repoUrl: "not-important",
|
|
115
|
+
repoDir: emptyTmpDir,
|
|
116
|
+
checkoutDriver: dummyCheckoutDriver,
|
|
117
|
+
currentRefDriver: dummyCurrentRefDriver
|
|
118
|
+
})).toEqual({
|
|
119
|
+
// Expect no changes since there was no local sync file
|
|
120
|
+
localSkipFiles: [],
|
|
121
|
+
localFileChanges: {},
|
|
122
|
+
modifiedFiles: {
|
|
123
|
+
added: [
|
|
124
|
+
"package.json",
|
|
125
|
+
"src/index.js",
|
|
126
|
+
"src/templated.js",
|
|
127
|
+
"src/templated.ts",
|
|
128
|
+
"templatesync.json"
|
|
129
|
+
],
|
|
130
|
+
deleted: [],
|
|
131
|
+
modified: [],
|
|
132
|
+
total: 5
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// Verify the files
|
|
136
|
+
await fileMatchTemplate(emptyTmpDir, "templatesync.json");
|
|
137
|
+
await fileMatchTemplate(emptyTmpDir, "package.json");
|
|
138
|
+
await fileMatchTemplate(emptyTmpDir, "src/templated.ts");
|
|
139
|
+
// Expect the ignores to not be a problem
|
|
140
|
+
expect(existsSync(resolve(emptyTmpDir, "src/index.ts"))).toBeFalsy();
|
|
141
|
+
expect(existsSync(resolve(emptyTmpDir, "src/custom-bin"))).toBeFalsy();
|
|
142
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
143
|
+
});
|
|
144
|
+
it("Checks out the branch and then appropriately merges", async ()=>{
|
|
145
|
+
const emptyTmpDir = await mkdtemp(tempDir());
|
|
146
|
+
expect(await templateSync({
|
|
147
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
148
|
+
cloneDriver: dummyCloneDriver,
|
|
149
|
+
repoUrl: "not-important",
|
|
150
|
+
repoDir: emptyTmpDir,
|
|
151
|
+
branch: "new-template-test",
|
|
152
|
+
checkoutDriver: dummyCheckoutDriver,
|
|
153
|
+
currentRefDriver: dummyCurrentRefDriver
|
|
154
|
+
})).toEqual({
|
|
155
|
+
// Expect no changes since there was no local sync file
|
|
156
|
+
localSkipFiles: [],
|
|
157
|
+
localFileChanges: {},
|
|
158
|
+
modifiedFiles: {
|
|
159
|
+
added: [
|
|
160
|
+
"package.json",
|
|
161
|
+
"src/index.js",
|
|
162
|
+
"src/templated.js",
|
|
163
|
+
"src/templated.ts",
|
|
164
|
+
"templatesync.json"
|
|
165
|
+
],
|
|
166
|
+
deleted: [],
|
|
167
|
+
modified: [],
|
|
168
|
+
total: 5
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// Verify the files
|
|
172
|
+
await fileMatchTemplate(emptyTmpDir, "templatesync.json");
|
|
173
|
+
await fileMatchTemplate(emptyTmpDir, "package.json");
|
|
174
|
+
await fileMatchTemplate(emptyTmpDir, "src/templated.ts");
|
|
175
|
+
// Expect the ignores to not be a problem
|
|
176
|
+
expect(existsSync(resolve(emptyTmpDir, "src/index.ts"))).toBeFalsy();
|
|
177
|
+
expect(existsSync(resolve(emptyTmpDir, "src/custom-bin"))).toBeFalsy();
|
|
178
|
+
const cloneInfo = await dummyCloneDriver();
|
|
179
|
+
expect(dummyCheckoutDriver).toHaveBeenCalledWith({
|
|
180
|
+
tmpDir: cloneInfo.dir,
|
|
181
|
+
remoteName: cloneInfo.remoteName,
|
|
182
|
+
branch: "new-template-test"
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
it("appropriately merges according to just the templatesync config file in an existing repo", async ()=>{
|
|
186
|
+
// Remove the local sync overrides
|
|
187
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
188
|
+
const result = await templateSync({
|
|
189
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
190
|
+
cloneDriver: dummyCloneDriver,
|
|
191
|
+
repoUrl: "not-important",
|
|
192
|
+
repoDir: tmpDir,
|
|
193
|
+
checkoutDriver: dummyCheckoutDriver,
|
|
194
|
+
currentRefDriver: dummyCurrentRefDriver
|
|
195
|
+
});
|
|
196
|
+
expect(result.localSkipFiles).toEqual([]);
|
|
197
|
+
expect(result.localFileChanges).toEqual({});
|
|
198
|
+
// Verify the files
|
|
199
|
+
await fileMatchTemplate(tmpDir, "templatesync.json");
|
|
200
|
+
await fileMatchTemplate(tmpDir, "src/templated.ts");
|
|
201
|
+
const packageJson = JSON.parse(readFileSync(resolve(tmpDir, "package.json")).toString());
|
|
202
|
+
expect(packageJson).toEqual({
|
|
203
|
+
name: "mypkg",
|
|
204
|
+
description: "my description",
|
|
205
|
+
dependencies: {
|
|
206
|
+
mypackage: "^1.2.0",
|
|
207
|
+
newpacakge: "^22.2.2",
|
|
208
|
+
package2: "3.22.1",
|
|
209
|
+
huh: "~1.0.0"
|
|
210
|
+
},
|
|
211
|
+
engines: {
|
|
212
|
+
node: ">=15"
|
|
213
|
+
},
|
|
214
|
+
scripts: {
|
|
215
|
+
build: "build",
|
|
216
|
+
test: "jest",
|
|
217
|
+
myscript: "somescript"
|
|
218
|
+
},
|
|
219
|
+
// By default we add new top-level fields
|
|
220
|
+
version: "new-version"
|
|
221
|
+
});
|
|
222
|
+
// Expect the ignores to not be a problem
|
|
223
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
224
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
225
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
226
|
+
});
|
|
227
|
+
it("appropriately merges according to the templatesync config file and the local config in an existing repo", async ()=>{
|
|
228
|
+
// Remove the local sync overrides
|
|
229
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
230
|
+
writeFileSync(join(tmpDir, "templatesync.local.json"), JSON.stringify({
|
|
231
|
+
ignore: [
|
|
232
|
+
// Ignores the templated.ts
|
|
233
|
+
"**/*.ts",
|
|
234
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
235
|
+
"plugins/**"
|
|
236
|
+
],
|
|
237
|
+
merge: [
|
|
238
|
+
{
|
|
239
|
+
glob: "package.json",
|
|
240
|
+
plugin: "plugins/custom-plugin.js",
|
|
241
|
+
options: {}
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
}));
|
|
245
|
+
const result = await templateSync({
|
|
246
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
247
|
+
cloneDriver: dummyCloneDriver,
|
|
248
|
+
repoUrl: "not-important",
|
|
249
|
+
repoDir: tmpDir,
|
|
250
|
+
checkoutDriver: dummyCheckoutDriver,
|
|
251
|
+
currentRefDriver: dummyCurrentRefDriver
|
|
252
|
+
});
|
|
253
|
+
expect(result.localSkipFiles).toEqual([
|
|
254
|
+
"src/templated.ts"
|
|
255
|
+
]);
|
|
256
|
+
// TODO: more rigorous testing around diff changes
|
|
257
|
+
expect(result.localFileChanges).toEqual(expect.objectContaining({
|
|
258
|
+
"package.json": expect.arrayContaining([])
|
|
259
|
+
}));
|
|
260
|
+
// Make sure the result captures the changes
|
|
261
|
+
expect(result.modifiedFiles).toEqual({
|
|
262
|
+
added: [
|
|
263
|
+
"package.json",
|
|
264
|
+
"src/index.js",
|
|
265
|
+
"src/templated.js",
|
|
266
|
+
"templatesync.json"
|
|
267
|
+
],
|
|
268
|
+
deleted: [],
|
|
269
|
+
modified: [],
|
|
270
|
+
total: 4
|
|
271
|
+
});
|
|
272
|
+
// Verify the files
|
|
273
|
+
await fileMatchTemplate(tmpDir, "templatesync.json");
|
|
274
|
+
await fileMatchDownstream(tmpDir, "src/templated.ts");
|
|
275
|
+
const packageJson = JSON.parse(readFileSync(resolve(tmpDir, "package.json")).toString());
|
|
276
|
+
// The plugin nuked this
|
|
277
|
+
expect(packageJson).toEqual({
|
|
278
|
+
downstream: true
|
|
279
|
+
});
|
|
280
|
+
// Expect the ignores to not be a problem
|
|
281
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
282
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
283
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
284
|
+
});
|
|
285
|
+
it("appropriately merges according to the templatesync config file and the local config in an existing repo with afterRef", async ()=>{
|
|
286
|
+
// Remove the local sync overrides
|
|
287
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
288
|
+
writeFileSync(join(tmpDir, "templatesync.local.json"), JSON.stringify({
|
|
289
|
+
afterRef: "dummySha",
|
|
290
|
+
ignore: [
|
|
291
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
292
|
+
"plugins/**"
|
|
293
|
+
]
|
|
294
|
+
}));
|
|
295
|
+
// We will only update the templated.ts
|
|
296
|
+
const mockDiffDriver = jest.fn().mockImplementation(async ()=>({
|
|
297
|
+
added: [
|
|
298
|
+
"src/templated.ts"
|
|
299
|
+
],
|
|
300
|
+
modified: [],
|
|
301
|
+
deleted: []
|
|
302
|
+
}));
|
|
303
|
+
const result = await templateSync({
|
|
304
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
305
|
+
cloneDriver: dummyCloneDriver,
|
|
306
|
+
repoUrl: "not-important",
|
|
307
|
+
repoDir: tmpDir,
|
|
308
|
+
diffDriver: mockDiffDriver,
|
|
309
|
+
currentRefDriver: dummyCurrentRefDriver,
|
|
310
|
+
checkoutDriver: dummyCheckoutDriver
|
|
311
|
+
});
|
|
312
|
+
// since there was no override for this file, not changes from the local file
|
|
313
|
+
expect(result.localFileChanges).toEqual(expect.objectContaining({}));
|
|
314
|
+
// Verify the files
|
|
315
|
+
await fileMatchTemplate(tmpDir, "templatesync.json");
|
|
316
|
+
await fileMatchTemplate(tmpDir, "src/templated.ts");
|
|
317
|
+
// Expect the none of the diff files to work
|
|
318
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
319
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
320
|
+
await fileMatchDownstream(tmpDir, "package.json");
|
|
321
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
322
|
+
});
|
|
323
|
+
it("updates the local templatesync with the current ref if updateAfterRef is true", async ()=>{
|
|
324
|
+
// Remove the local sync overrides
|
|
325
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
326
|
+
const mockLocalConfig = {
|
|
327
|
+
afterRef: "dummySha",
|
|
328
|
+
ignore: [
|
|
329
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
330
|
+
"plugins/**"
|
|
331
|
+
]
|
|
332
|
+
};
|
|
333
|
+
writeFileSync(join(tmpDir, "templatesync.local.json"), JSON.stringify(mockLocalConfig));
|
|
334
|
+
// We will only update the templated.ts
|
|
335
|
+
const mockDiffDriver = jest.fn().mockImplementation(async ()=>({
|
|
336
|
+
added: [
|
|
337
|
+
"src/templated.ts"
|
|
338
|
+
],
|
|
339
|
+
modified: [
|
|
340
|
+
"src/index.ts"
|
|
341
|
+
],
|
|
342
|
+
deleted: []
|
|
343
|
+
}));
|
|
344
|
+
const mockCurrentRefDriver = jest.fn().mockImplementation(async ()=>"newestSha");
|
|
345
|
+
const result = await templateSync({
|
|
346
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
347
|
+
cloneDriver: dummyCloneDriver,
|
|
348
|
+
repoUrl: "not-important",
|
|
349
|
+
repoDir: tmpDir,
|
|
350
|
+
updateAfterRef: true,
|
|
351
|
+
diffDriver: mockDiffDriver,
|
|
352
|
+
currentRefDriver: mockCurrentRefDriver,
|
|
353
|
+
checkoutDriver: dummyCheckoutDriver
|
|
354
|
+
});
|
|
355
|
+
// since there was no override for this file, no changes from the local file
|
|
356
|
+
expect(result.localFileChanges).toEqual(expect.objectContaining({}));
|
|
357
|
+
expect(result.modifiedFiles).toEqual({
|
|
358
|
+
added: [
|
|
359
|
+
"src/templated.ts"
|
|
360
|
+
],
|
|
361
|
+
modified: [
|
|
362
|
+
"templatesync.local.json"
|
|
363
|
+
],
|
|
364
|
+
deleted: [],
|
|
365
|
+
total: 2
|
|
366
|
+
});
|
|
367
|
+
// Verify the files
|
|
368
|
+
await fileMatchTemplate(tmpDir, "templatesync.json");
|
|
369
|
+
await fileMatchTemplate(tmpDir, "src/templated.ts");
|
|
370
|
+
// Expect the none of the diff files to work
|
|
371
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
372
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
373
|
+
await fileMatchDownstream(tmpDir, "package.json");
|
|
374
|
+
// Ensure we have updated the local template field
|
|
375
|
+
expect(JSON.parse((await readFile(join(tmpDir, "templatesync.local.json"))).toString())).toEqual({
|
|
376
|
+
...mockLocalConfig,
|
|
377
|
+
afterRef: "newestSha"
|
|
378
|
+
});
|
|
379
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
380
|
+
});
|
|
381
|
+
it("Does not update the local templatesync if updateAfterRef is true and the ref is the same", async ()=>{
|
|
382
|
+
// Remove the local sync overrides
|
|
383
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
384
|
+
const mockLocalConfig = {
|
|
385
|
+
afterRef: "dummySha",
|
|
386
|
+
ignore: [
|
|
387
|
+
// We don't have a need for this in here, but it's an example of keeping things cleaner for our custom plugins
|
|
388
|
+
"plugins/**"
|
|
389
|
+
]
|
|
390
|
+
};
|
|
391
|
+
writeFileSync(join(tmpDir, "templatesync.local.json"), JSON.stringify(mockLocalConfig));
|
|
392
|
+
// We will only update the templated.ts
|
|
393
|
+
const mockDiffDriver = jest.fn().mockImplementation(async ()=>({
|
|
394
|
+
added: [
|
|
395
|
+
"src/templated.ts"
|
|
396
|
+
],
|
|
397
|
+
modified: [
|
|
398
|
+
"src/index.ts"
|
|
399
|
+
],
|
|
400
|
+
deleted: []
|
|
401
|
+
}));
|
|
402
|
+
const mockCurrentRefDriver = jest.fn().mockImplementation(async ()=>"dummySha");
|
|
403
|
+
const result = await templateSync({
|
|
404
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
405
|
+
cloneDriver: dummyCloneDriver,
|
|
406
|
+
repoUrl: "not-important",
|
|
407
|
+
repoDir: tmpDir,
|
|
408
|
+
updateAfterRef: true,
|
|
409
|
+
diffDriver: mockDiffDriver,
|
|
410
|
+
currentRefDriver: mockCurrentRefDriver,
|
|
411
|
+
checkoutDriver: dummyCheckoutDriver
|
|
412
|
+
});
|
|
413
|
+
// Nothing shoudl be reported as changing
|
|
414
|
+
expect(result).toEqual({
|
|
415
|
+
localFileChanges: {},
|
|
416
|
+
localSkipFiles: [],
|
|
417
|
+
modifiedFiles: {
|
|
418
|
+
added: [],
|
|
419
|
+
modified: [],
|
|
420
|
+
deleted: [],
|
|
421
|
+
total: 0
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
// Verify the files
|
|
425
|
+
await fileMatchDownstream(tmpDir, "templatesync.json");
|
|
426
|
+
await fileMatchDownstream(tmpDir, "src/templated.ts");
|
|
427
|
+
// Expect the none of the diff files to work
|
|
428
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
429
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
430
|
+
await fileMatchDownstream(tmpDir, "package.json");
|
|
431
|
+
// Ensure we have updated the local template field
|
|
432
|
+
expect(JSON.parse((await readFile(join(tmpDir, "templatesync.local.json"))).toString())).toEqual({
|
|
433
|
+
...mockLocalConfig
|
|
434
|
+
});
|
|
435
|
+
expect(dummyCheckoutDriver).not.toHaveBeenCalled();
|
|
436
|
+
});
|
|
437
|
+
it("creates the local templatesync with the current ref if updateAfterRef is true and no local template exists", async ()=>{
|
|
438
|
+
// Remove the local sync overrides
|
|
439
|
+
await rm(join(tmpDir, "templatesync.local.json"));
|
|
440
|
+
// We will only update the templated.ts
|
|
441
|
+
const mockDiffDriver = jest.fn().mockImplementation(async ()=>({
|
|
442
|
+
added: [
|
|
443
|
+
"src/templated.ts"
|
|
444
|
+
]
|
|
445
|
+
}));
|
|
446
|
+
const mockCurrentRefDriver = jest.fn().mockImplementation(async ()=>"newestSha");
|
|
447
|
+
const result = await templateSync({
|
|
448
|
+
tmpCloneDir: "stubbed-by-driver",
|
|
449
|
+
cloneDriver: dummyCloneDriver,
|
|
450
|
+
repoUrl: "not-important",
|
|
451
|
+
repoDir: tmpDir,
|
|
452
|
+
updateAfterRef: true,
|
|
453
|
+
diffDriver: mockDiffDriver,
|
|
454
|
+
currentRefDriver: mockCurrentRefDriver,
|
|
455
|
+
checkoutDriver: dummyCheckoutDriver
|
|
456
|
+
});
|
|
457
|
+
// since there was no override for this file, no changes from the local file
|
|
458
|
+
expect(result.localFileChanges).toEqual(expect.objectContaining({}));
|
|
459
|
+
expect(result.modifiedFiles).toEqual({
|
|
460
|
+
added: [
|
|
461
|
+
"package.json",
|
|
462
|
+
"src/index.js",
|
|
463
|
+
"src/templated.js",
|
|
464
|
+
"src/templated.ts",
|
|
465
|
+
"templatesync.json",
|
|
466
|
+
"templatesync.local.json"
|
|
467
|
+
],
|
|
468
|
+
deleted: [],
|
|
469
|
+
modified: [],
|
|
470
|
+
total: 6
|
|
471
|
+
});
|
|
472
|
+
// Verify the files
|
|
473
|
+
await fileMatchTemplate(tmpDir, "templatesync.json");
|
|
474
|
+
await fileMatchTemplate(tmpDir, "src/templated.ts");
|
|
475
|
+
const packageJson = JSON.parse(readFileSync(resolve(tmpDir, "package.json")).toString());
|
|
476
|
+
expect(packageJson).toEqual({
|
|
477
|
+
name: "mypkg",
|
|
478
|
+
description: "my description",
|
|
479
|
+
dependencies: {
|
|
480
|
+
mypackage: "^1.2.0",
|
|
481
|
+
newpacakge: "^22.2.2",
|
|
482
|
+
package2: "3.22.1",
|
|
483
|
+
huh: "~1.0.0"
|
|
484
|
+
},
|
|
485
|
+
engines: {
|
|
486
|
+
node: ">=15"
|
|
487
|
+
},
|
|
488
|
+
scripts: {
|
|
489
|
+
build: "build",
|
|
490
|
+
test: "jest",
|
|
491
|
+
myscript: "somescript"
|
|
492
|
+
},
|
|
493
|
+
// By default we add new top-level fields
|
|
494
|
+
version: "new-version"
|
|
495
|
+
});
|
|
496
|
+
// Expect the none of the diff files to work
|
|
497
|
+
await fileMatchDownstream(tmpDir, "src/index.ts");
|
|
498
|
+
await fileMatchDownstream(tmpDir, "plugins/custom-plugin.js");
|
|
499
|
+
// Ensure we have updated the local template field
|
|
500
|
+
expect(JSON.parse((await readFile(join(tmpDir, "templatesync.local.json"))).toString())).toEqual({
|
|
501
|
+
afterRef: "newestSha"
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
// helper
|
|
505
|
+
async function fileMatchTemplate(_tmpDir, relPath) {
|
|
506
|
+
return fileMatch(_tmpDir, relPath, "template");
|
|
507
|
+
}
|
|
508
|
+
async function fileMatchDownstream(_tmpDir, relPath) {
|
|
509
|
+
return fileMatch(_tmpDir, relPath, "downstream");
|
|
510
|
+
}
|
|
511
|
+
async function fileMatch(_tmpDir, relPath, source) {
|
|
512
|
+
const dir = source === "downstream" ? downstreamDir : (await dummyCloneDriver()).dir;
|
|
513
|
+
expect((await readFile(resolve(_tmpDir, relPath))).toString()).toEqual((await readFile(resolve(dir, relPath))).toString());
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS1zeW5jLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBta2R0ZW1wLCByZWFkRmlsZSwgcm0gfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNvcHkgfSBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgdGVtcGxhdGVTeW5jIH0gZnJvbSBcIi4vdGVtcGxhdGUtc3luY1wiO1xuaW1wb3J0IHsgVEVTVF9GSVhUVVJFU19ESVIsIHRlbXBEaXIgfSBmcm9tIFwiLi90ZXN0LXV0aWxzXCI7XG5cbmNvbnN0IGR1bW15Q2hlY2tvdXREcml2ZXIgPSBqZXN0LmZuKCk7XG5jb25zdCBkdW1teUN1cnJlbnRSZWZEcml2ZXIgPSBqZXN0LmZuKCk7XG5cbmNvbnN0IGRvd25zdHJlYW1EaXIgPSByZXNvbHZlKFRFU1RfRklYVFVSRVNfRElSLCBcImRvd25zdHJlYW1cIik7XG5cbmRlc2NyaWJlKFwidGVtcGxhdGVTeW5jXCIsICgpID0+IHtcblx0bGV0IHRtcERpcjogc3RyaW5nO1xuXHRsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcblx0bGV0IGR1bW15Q2xvbmVEcml2ZXI6ICgpID0+IFByb21pc2U8eyBkaXI6IHN0cmluZzsgcmVtb3RlTmFtZTogc3RyaW5nIH0+O1xuXHRiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcblx0XHRqZXN0LnJlc2V0QWxsTW9ja3MoKTtcblx0XHR0bXBEaXIgPSBhd2FpdCBta2R0ZW1wKHRlbXBEaXIoKSk7XG5cdFx0dGVtcGxhdGVEaXIgPSBhd2FpdCBta2R0ZW1wKHRlbXBEaXIoKSk7XG5cdFx0YXdhaXQgY29weShyZXNvbHZlKFRFU1RfRklYVFVSRVNfRElSLCBcInRlbXBsYXRlXCIpLCB0ZW1wbGF0ZURpcik7XG5cdFx0YXdhaXQgY29weShkb3duc3RyZWFtRGlyLCB0bXBEaXIpO1xuXHRcdGR1bW15Q2xvbmVEcml2ZXIgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkaXI6IHRlbXBsYXRlRGlyLFxuXHRcdFx0XHRyZW1vdGVOYW1lOiBcIm91clJlbW90ZVwiLFxuXHRcdFx0fTtcblx0XHR9O1xuXHR9KTtcblx0YWZ0ZXJFYWNoKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCBybSh0bXBEaXIsIHtcblx0XHRcdGZvcmNlOiB0cnVlLFxuXHRcdFx0cmVjdXJzaXZlOiB0cnVlLFxuXHRcdH0pO1xuXHR9KTtcblx0Ly8gTm90ZTogZm9yIHRoaXMgdGVzdCwgd2UgZXhwZWN0IGFjdGlvbnMgYW5kIHVzZXJzIHRvIGhhbmRsZSBtaXNjb25maWd1cmVkIHRlbXBsYXRlIHN5bmNzXG5cdGl0LmVhY2goW1xuXHRcdFtcblx0XHRcdFwibG9jYWxcIixcblx0XHRcdGB0ZW1wbGF0ZXN5bmMubG9jYWwuanNvbiBwbHVnaW4gb3B0aW9uIGVycm9yczpcblxcdFBsdWdpbiAocGx1Z2lucy9mYWlsLXZhbGlkYXRlLXBsdWdpbi5qcyk6XG5cXHRcXHRvaCBubyFcblxcdFxcdG5vdCB0aGlzIG9uZSB0b28hXG5gLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJ0ZW1wbGF0ZVwiLFxuXHRcdFx0YHRlbXBsYXRlc3luYy5qc29uIHBsdWdpbiBvcHRpb24gZXJyb3JzOlxuXFx0UGx1Z2luIChkdW1teS1mYWlsLXBsdWdpbi5qcyk6XG5cXHRcXHRzaHVja3NcblxcdFxcdG5vIGdvb2RcbmAsXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcImJvdGhcIixcblx0XHRcdGB0ZW1wbGF0ZXN5bmMuanNvbiBwbHVnaW4gb3B0aW9uIGVycm9yczpcblxcdFBsdWdpbiAoZHVtbXktZmFpbC1wbHVnaW4uanMpOlxuXFx0XFx0c2h1Y2tzXG5cXHRcXHRubyBnb29kXG50ZW1wbGF0ZXN5bmMubG9jYWwuanNvbiBwbHVnaW4gb3B0aW9uIGVycm9yczpcblxcdFBsdWdpbiAocGx1Z2lucy9mYWlsLXZhbGlkYXRlLXBsdWdpbi5qcyk6XG5cXHRcXHRvaCBubyFcblxcdFxcdG5vdCB0aGlzIG9uZSB0b28hXG5gLFxuXHRcdF0sXG5cdF0pKFwidGhyb3dzIGVycm9ycyBmcm9tIHBsdWdpbiB2YWxpZGF0aW9uXCIsIGFzeW5jIChtb2RlLCBleHBlY3RlZCkgPT4ge1xuXHRcdC8vIFJlbW92ZSB0aGUgbG9jYWwgc3luYyBvdmVycmlkZXNcblx0XHRhd2FpdCBybShqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSk7XG5cblx0XHRpZiAobW9kZSA9PT0gXCJsb2NhbFwiIHx8IG1vZGUgPT0gXCJib3RoXCIpIHtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdFx0XHQvLyBJZ25vcmVzIHRoZSB0ZW1wbGF0ZWQudHNcblx0XHRcdFx0XHRcdFwiKiovKi50c1wiLFxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoaXMgaW4gaGVyZSwgYnV0IGl0J3MgYW4gZXhhbXBsZSBvZiBrZWVwaW5nIHRoaW5ncyBjbGVhbmVyIGZvciBvdXIgY3VzdG9tIHBsdWdpbnNcblx0XHRcdFx0XHRcdFwicGx1Z2lucy8qKlwiLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0bWVyZ2U6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Z2xvYjogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcdFx0cGx1Z2luOiBcInBsdWdpbnMvZmFpbC12YWxpZGF0ZS1wbHVnaW4uanNcIixcblx0XHRcdFx0XHRcdFx0b3B0aW9uczoge30sXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKG1vZGUgPT09IFwidGVtcGxhdGVcIiB8fCBtb2RlID09PSBcImJvdGhcIikge1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbih0ZW1wbGF0ZURpciwgXCJ0ZW1wbGF0ZXN5bmMuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGlnbm9yZTogW1xuXHRcdFx0XHRcdFx0Ly8gSWdub3JlcyB0aGUgdGVtcGxhdGVkLnRzXG5cdFx0XHRcdFx0XHRcIioqLyoudHNcIixcblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGlzIGluIGhlcmUsIGJ1dCBpdCdzIGFuIGV4YW1wbGUgb2Yga2VlcGluZyB0aGluZ3MgY2xlYW5lciBmb3Igb3VyIGN1c3RvbSBwbHVnaW5zXG5cdFx0XHRcdFx0XHRcInBsdWdpbnMvKipcIixcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdG1lcmdlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGdsb2I6IFwicGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XHRcdHBsdWdpbjogXCJkdW1teS1mYWlsLXBsdWdpbi5qc1wiLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7fSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGF3YWl0IGV4cGVjdChcblx0XHRcdGFzeW5jICgpID0+XG5cdFx0XHRcdGF3YWl0IHRlbXBsYXRlU3luYyh7XG5cdFx0XHRcdFx0dG1wQ2xvbmVEaXI6IFwic3R1YmJlZC1ieS1kcml2ZXJcIixcblx0XHRcdFx0XHRjbG9uZURyaXZlcjogZHVtbXlDbG9uZURyaXZlcixcblx0XHRcdFx0XHRyZXBvVXJsOiBcIm5vdC1pbXBvcnRhbnRcIixcblx0XHRcdFx0XHRyZXBvRGlyOiB0bXBEaXIsXG5cdFx0XHRcdFx0Y2hlY2tvdXREcml2ZXI6IGR1bW15Q2hlY2tvdXREcml2ZXIsXG5cdFx0XHRcdFx0Y3VycmVudFJlZkRyaXZlcjogZHVtbXlDdXJyZW50UmVmRHJpdmVyLFxuXHRcdFx0XHR9KSxcblx0XHQpLnJlamVjdHMudG9UaHJvdyhleHBlY3RlZCk7XG5cdH0pO1xuXHRpdChcImFwcHJvcHJpYXRlbHkgbWVyZ2VzIGFjY29yZGluZyB0byBqdXN0IHRoZSB0ZW1wbGF0ZXN5bmMgY29uZmlnIGZpbGUgaW50byBhbiBlbXB0eSBkaXJcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IGVtcHR5VG1wRGlyID0gYXdhaXQgbWtkdGVtcCh0ZW1wRGlyKCkpO1xuXHRcdGV4cGVjdChcblx0XHRcdGF3YWl0IHRlbXBsYXRlU3luYyh7XG5cdFx0XHRcdHRtcENsb25lRGlyOiBcInN0dWJiZWQtYnktZHJpdmVyXCIsXG5cdFx0XHRcdGNsb25lRHJpdmVyOiBkdW1teUNsb25lRHJpdmVyLFxuXHRcdFx0XHRyZXBvVXJsOiBcIm5vdC1pbXBvcnRhbnRcIixcblx0XHRcdFx0cmVwb0RpcjogZW1wdHlUbXBEaXIsXG5cdFx0XHRcdGNoZWNrb3V0RHJpdmVyOiBkdW1teUNoZWNrb3V0RHJpdmVyLFxuXHRcdFx0XHRjdXJyZW50UmVmRHJpdmVyOiBkdW1teUN1cnJlbnRSZWZEcml2ZXIsXG5cdFx0XHR9KSxcblx0XHQpLnRvRXF1YWwoe1xuXHRcdFx0Ly8gRXhwZWN0IG5vIGNoYW5nZXMgc2luY2UgdGhlcmUgd2FzIG5vIGxvY2FsIHN5bmMgZmlsZVxuXHRcdFx0bG9jYWxTa2lwRmlsZXM6IFtdLFxuXHRcdFx0bG9jYWxGaWxlQ2hhbmdlczoge30sXG5cdFx0XHRtb2RpZmllZEZpbGVzOiB7XG5cdFx0XHRcdGFkZGVkOiBbXG5cdFx0XHRcdFx0XCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0XHRcInNyYy9pbmRleC5qc1wiLFxuXHRcdFx0XHRcdFwic3JjL3RlbXBsYXRlZC5qc1wiLFxuXHRcdFx0XHRcdFwic3JjL3RlbXBsYXRlZC50c1wiLFxuXHRcdFx0XHRcdFwidGVtcGxhdGVzeW5jLmpzb25cIixcblx0XHRcdFx0XSxcblx0XHRcdFx0ZGVsZXRlZDogW10sXG5cdFx0XHRcdG1vZGlmaWVkOiBbXSxcblx0XHRcdFx0dG90YWw6IDUsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Ly8gVmVyaWZ5IHRoZSBmaWxlc1xuXHRcdGF3YWl0IGZpbGVNYXRjaFRlbXBsYXRlKGVtcHR5VG1wRGlyLCBcInRlbXBsYXRlc3luYy5qc29uXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaFRlbXBsYXRlKGVtcHR5VG1wRGlyLCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZShlbXB0eVRtcERpciwgXCJzcmMvdGVtcGxhdGVkLnRzXCIpO1xuXG5cdFx0Ly8gRXhwZWN0IHRoZSBpZ25vcmVzIHRvIG5vdCBiZSBhIHByb2JsZW1cblx0XHRleHBlY3QoZXhpc3RzU3luYyhyZXNvbHZlKGVtcHR5VG1wRGlyLCBcInNyYy9pbmRleC50c1wiKSkpLnRvQmVGYWxzeSgpO1xuXHRcdGV4cGVjdChleGlzdHNTeW5jKHJlc29sdmUoZW1wdHlUbXBEaXIsIFwic3JjL2N1c3RvbS1iaW5cIikpKS50b0JlRmFsc3koKTtcblxuXHRcdGV4cGVjdChkdW1teUNoZWNrb3V0RHJpdmVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXHR9KTtcblx0aXQoXCJDaGVja3Mgb3V0IHRoZSBicmFuY2ggYW5kIHRoZW4gYXBwcm9wcmlhdGVseSBtZXJnZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IGVtcHR5VG1wRGlyID0gYXdhaXQgbWtkdGVtcCh0ZW1wRGlyKCkpO1xuXHRcdGV4cGVjdChcblx0XHRcdGF3YWl0IHRlbXBsYXRlU3luYyh7XG5cdFx0XHRcdHRtcENsb25lRGlyOiBcInN0dWJiZWQtYnktZHJpdmVyXCIsXG5cdFx0XHRcdGNsb25lRHJpdmVyOiBkdW1teUNsb25lRHJpdmVyLFxuXHRcdFx0XHRyZXBvVXJsOiBcIm5vdC1pbXBvcnRhbnRcIixcblx0XHRcdFx0cmVwb0RpcjogZW1wdHlUbXBEaXIsXG5cdFx0XHRcdGJyYW5jaDogXCJuZXctdGVtcGxhdGUtdGVzdFwiLFxuXHRcdFx0XHRjaGVja291dERyaXZlcjogZHVtbXlDaGVja291dERyaXZlcixcblx0XHRcdFx0Y3VycmVudFJlZkRyaXZlcjogZHVtbXlDdXJyZW50UmVmRHJpdmVyLFxuXHRcdFx0fSksXG5cdFx0KS50b0VxdWFsKHtcblx0XHRcdC8vIEV4cGVjdCBubyBjaGFuZ2VzIHNpbmNlIHRoZXJlIHdhcyBubyBsb2NhbCBzeW5jIGZpbGVcblx0XHRcdGxvY2FsU2tpcEZpbGVzOiBbXSxcblx0XHRcdGxvY2FsRmlsZUNoYW5nZXM6IHt9LFxuXHRcdFx0bW9kaWZpZWRGaWxlczoge1xuXHRcdFx0XHRhZGRlZDogW1xuXHRcdFx0XHRcdFwicGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFx0XCJzcmMvaW5kZXguanNcIixcblx0XHRcdFx0XHRcInNyYy90ZW1wbGF0ZWQuanNcIixcblx0XHRcdFx0XHRcInNyYy90ZW1wbGF0ZWQudHNcIixcblx0XHRcdFx0XHRcInRlbXBsYXRlc3luYy5qc29uXCIsXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGRlbGV0ZWQ6IFtdLFxuXHRcdFx0XHRtb2RpZmllZDogW10sXG5cdFx0XHRcdHRvdGFsOiA1LFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdC8vIFZlcmlmeSB0aGUgZmlsZXNcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZShlbXB0eVRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMuanNvblwiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZShlbXB0eVRtcERpciwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoVGVtcGxhdGUoZW1wdHlUbXBEaXIsIFwic3JjL3RlbXBsYXRlZC50c1wiKTtcblxuXHRcdC8vIEV4cGVjdCB0aGUgaWdub3JlcyB0byBub3QgYmUgYSBwcm9ibGVtXG5cdFx0ZXhwZWN0KGV4aXN0c1N5bmMocmVzb2x2ZShlbXB0eVRtcERpciwgXCJzcmMvaW5kZXgudHNcIikpKS50b0JlRmFsc3koKTtcblx0XHRleHBlY3QoZXhpc3RzU3luYyhyZXNvbHZlKGVtcHR5VG1wRGlyLCBcInNyYy9jdXN0b20tYmluXCIpKSkudG9CZUZhbHN5KCk7XG5cdFx0Y29uc3QgY2xvbmVJbmZvID0gYXdhaXQgZHVtbXlDbG9uZURyaXZlcigpO1xuXHRcdGV4cGVjdChkdW1teUNoZWNrb3V0RHJpdmVyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG5cdFx0XHR0bXBEaXI6IGNsb25lSW5mby5kaXIsXG5cdFx0XHRyZW1vdGVOYW1lOiBjbG9uZUluZm8ucmVtb3RlTmFtZSxcblx0XHRcdGJyYW5jaDogXCJuZXctdGVtcGxhdGUtdGVzdFwiLFxuXHRcdH0pO1xuXHR9KTtcblx0aXQoXCJhcHByb3ByaWF0ZWx5IG1lcmdlcyBhY2NvcmRpbmcgdG8ganVzdCB0aGUgdGVtcGxhdGVzeW5jIGNvbmZpZyBmaWxlIGluIGFuIGV4aXN0aW5nIHJlcG9cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdC8vIFJlbW92ZSB0aGUgbG9jYWwgc3luYyBvdmVycmlkZXNcblx0XHRhd2FpdCBybShqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSk7XG5cblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCB0ZW1wbGF0ZVN5bmMoe1xuXHRcdFx0dG1wQ2xvbmVEaXI6IFwic3R1YmJlZC1ieS1kcml2ZXJcIixcblx0XHRcdGNsb25lRHJpdmVyOiBkdW1teUNsb25lRHJpdmVyLFxuXHRcdFx0cmVwb1VybDogXCJub3QtaW1wb3J0YW50XCIsXG5cdFx0XHRyZXBvRGlyOiB0bXBEaXIsXG5cdFx0XHRjaGVja291dERyaXZlcjogZHVtbXlDaGVja291dERyaXZlcixcblx0XHRcdGN1cnJlbnRSZWZEcml2ZXI6IGR1bW15Q3VycmVudFJlZkRyaXZlcixcblx0XHR9KTtcblxuXHRcdGV4cGVjdChyZXN1bHQubG9jYWxTa2lwRmlsZXMpLnRvRXF1YWwoW10pO1xuXHRcdGV4cGVjdChyZXN1bHQubG9jYWxGaWxlQ2hhbmdlcykudG9FcXVhbCh7fSk7XG5cblx0XHQvLyBWZXJpZnkgdGhlIGZpbGVzXG5cdFx0YXdhaXQgZmlsZU1hdGNoVGVtcGxhdGUodG1wRGlyLCBcInRlbXBsYXRlc3luYy5qc29uXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaFRlbXBsYXRlKHRtcERpciwgXCJzcmMvdGVtcGxhdGVkLnRzXCIpO1xuXHRcdGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcblx0XHRcdHJlYWRGaWxlU3luYyhyZXNvbHZlKHRtcERpciwgXCJwYWNrYWdlLmpzb25cIikpLnRvU3RyaW5nKCksXG5cdFx0KTtcblxuXHRcdGV4cGVjdChwYWNrYWdlSnNvbikudG9FcXVhbCh7XG5cdFx0XHRuYW1lOiBcIm15cGtnXCIsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJteSBkZXNjcmlwdGlvblwiLFxuXHRcdFx0ZGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdG15cGFja2FnZTogXCJeMS4yLjBcIixcblx0XHRcdFx0bmV3cGFjYWtnZTogXCJeMjIuMi4yXCIsXG5cdFx0XHRcdHBhY2thZ2UyOiBcIjMuMjIuMVwiLFxuXHRcdFx0XHRodWg6IFwifjEuMC4wXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZW5naW5lczoge1xuXHRcdFx0XHRub2RlOiBcIj49MTVcIixcblx0XHRcdH0sXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGJ1aWxkOiBcImJ1aWxkXCIsXG5cdFx0XHRcdHRlc3Q6IFwiamVzdFwiLFxuXHRcdFx0XHRteXNjcmlwdDogXCJzb21lc2NyaXB0XCIsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gQnkgZGVmYXVsdCB3ZSBhZGQgbmV3IHRvcC1sZXZlbCBmaWVsZHNcblx0XHRcdHZlcnNpb246IFwibmV3LXZlcnNpb25cIixcblx0XHR9KTtcblxuXHRcdC8vIEV4cGVjdCB0aGUgaWdub3JlcyB0byBub3QgYmUgYSBwcm9ibGVtXG5cdFx0YXdhaXQgZmlsZU1hdGNoRG93bnN0cmVhbSh0bXBEaXIsIFwic3JjL2luZGV4LnRzXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInBsdWdpbnMvY3VzdG9tLXBsdWdpbi5qc1wiKTtcblx0XHRleHBlY3QoZHVtbXlDaGVja291dERyaXZlcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcblx0fSk7XG5cdGl0KFwiYXBwcm9wcmlhdGVseSBtZXJnZXMgYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZXN5bmMgY29uZmlnIGZpbGUgYW5kIHRoZSBsb2NhbCBjb25maWcgaW4gYW4gZXhpc3RpbmcgcmVwb1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0Ly8gUmVtb3ZlIHRoZSBsb2NhbCBzeW5jIG92ZXJyaWRlc1xuXHRcdGF3YWl0IHJtKGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpKTtcblxuXHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSxcblx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdFx0Ly8gSWdub3JlcyB0aGUgdGVtcGxhdGVkLnRzXG5cdFx0XHRcdFx0XCIqKi8qLnRzXCIsXG5cdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoaXMgaW4gaGVyZSwgYnV0IGl0J3MgYW4gZXhhbXBsZSBvZiBrZWVwaW5nIHRoaW5ncyBjbGVhbmVyIGZvciBvdXIgY3VzdG9tIHBsdWdpbnNcblx0XHRcdFx0XHRcInBsdWdpbnMvKipcIixcblx0XHRcdFx0XSxcblx0XHRcdFx0bWVyZ2U6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRnbG9iOiBcInBhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRcdFx0cGx1Z2luOiBcInBsdWdpbnMvY3VzdG9tLXBsdWdpbi5qc1wiLFxuXHRcdFx0XHRcdFx0b3B0aW9uczoge30sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCB0ZW1wbGF0ZVN5bmMoe1xuXHRcdFx0dG1wQ2xvbmVEaXI6IFwic3R1YmJlZC1ieS1kcml2ZXJcIixcblx0XHRcdGNsb25lRHJpdmVyOiBkdW1teUNsb25lRHJpdmVyLFxuXHRcdFx0cmVwb1VybDogXCJub3QtaW1wb3J0YW50XCIsXG5cdFx0XHRyZXBvRGlyOiB0bXBEaXIsXG5cdFx0XHRjaGVja291dERyaXZlcjogZHVtbXlDaGVja291dERyaXZlcixcblx0XHRcdGN1cnJlbnRSZWZEcml2ZXI6IGR1bW15Q3VycmVudFJlZkRyaXZlcixcblx0XHR9KTtcblxuXHRcdGV4cGVjdChyZXN1bHQubG9jYWxTa2lwRmlsZXMpLnRvRXF1YWwoW1wic3JjL3RlbXBsYXRlZC50c1wiXSk7XG5cdFx0Ly8gVE9ETzogbW9yZSByaWdvcm91cyB0ZXN0aW5nIGFyb3VuZCBkaWZmIGNoYW5nZXNcblx0XHRleHBlY3QocmVzdWx0LmxvY2FsRmlsZUNoYW5nZXMpLnRvRXF1YWwoXG5cdFx0XHRleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG5cdFx0XHRcdFwicGFja2FnZS5qc29uXCI6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW10pLFxuXHRcdFx0fSksXG5cdFx0KTtcblx0XHQvLyBNYWtlIHN1cmUgdGhlIHJlc3VsdCBjYXB0dXJlcyB0aGUgY2hhbmdlc1xuXHRcdGV4cGVjdChyZXN1bHQubW9kaWZpZWRGaWxlcykudG9FcXVhbCh7XG5cdFx0XHRhZGRlZDogW1xuXHRcdFx0XHRcInBhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRcInNyYy9pbmRleC5qc1wiLFxuXHRcdFx0XHRcInNyYy90ZW1wbGF0ZWQuanNcIixcblx0XHRcdFx0XCJ0ZW1wbGF0ZXN5bmMuanNvblwiLFxuXHRcdFx0XSxcblx0XHRcdGRlbGV0ZWQ6IFtdLFxuXHRcdFx0bW9kaWZpZWQ6IFtdLFxuXHRcdFx0dG90YWw6IDQsXG5cdFx0fSk7XG5cblx0XHQvLyBWZXJpZnkgdGhlIGZpbGVzXG5cdFx0YXdhaXQgZmlsZU1hdGNoVGVtcGxhdGUodG1wRGlyLCBcInRlbXBsYXRlc3luYy5qc29uXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInNyYy90ZW1wbGF0ZWQudHNcIik7XG5cdFx0Y29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuXHRcdFx0cmVhZEZpbGVTeW5jKHJlc29sdmUodG1wRGlyLCBcInBhY2thZ2UuanNvblwiKSkudG9TdHJpbmcoKSxcblx0XHQpO1xuXG5cdFx0Ly8gVGhlIHBsdWdpbiBudWtlZCB0aGlzXG5cdFx0ZXhwZWN0KHBhY2thZ2VKc29uKS50b0VxdWFsKHtcblx0XHRcdGRvd25zdHJlYW06IHRydWUsXG5cdFx0fSk7XG5cblx0XHQvLyBFeHBlY3QgdGhlIGlnbm9yZXMgdG8gbm90IGJlIGEgcHJvYmxlbVxuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInNyYy9pbmRleC50c1wiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJwbHVnaW5zL2N1c3RvbS1wbHVnaW4uanNcIik7XG5cdFx0ZXhwZWN0KGR1bW15Q2hlY2tvdXREcml2ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cdH0pO1xuXHRpdChcImFwcHJvcHJpYXRlbHkgbWVyZ2VzIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGVzeW5jIGNvbmZpZyBmaWxlIGFuZCB0aGUgbG9jYWwgY29uZmlnIGluIGFuIGV4aXN0aW5nIHJlcG8gd2l0aCBhZnRlclJlZlwiLCBhc3luYyAoKSA9PiB7XG5cdFx0Ly8gUmVtb3ZlIHRoZSBsb2NhbCBzeW5jIG92ZXJyaWRlc1xuXHRcdGF3YWl0IHJtKGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpKTtcblxuXHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSxcblx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0YWZ0ZXJSZWY6IFwiZHVtbXlTaGFcIixcblx0XHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoaXMgaW4gaGVyZSwgYnV0IGl0J3MgYW4gZXhhbXBsZSBvZiBrZWVwaW5nIHRoaW5ncyBjbGVhbmVyIGZvciBvdXIgY3VzdG9tIHBsdWdpbnNcblx0XHRcdFx0XHRcInBsdWdpbnMvKipcIixcblx0XHRcdFx0XSxcblx0XHRcdH0pLFxuXHRcdCk7XG5cblx0XHQvLyBXZSB3aWxsIG9ubHkgdXBkYXRlIHRoZSB0ZW1wbGF0ZWQudHNcblx0XHRjb25zdCBtb2NrRGlmZkRyaXZlciA9IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKCkgPT4gKHtcblx0XHRcdGFkZGVkOiBbXCJzcmMvdGVtcGxhdGVkLnRzXCJdLFxuXHRcdFx0bW9kaWZpZWQ6IFtdLFxuXHRcdFx0ZGVsZXRlZDogW10sXG5cdFx0fSkpO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRlbXBsYXRlU3luYyh7XG5cdFx0XHR0bXBDbG9uZURpcjogXCJzdHViYmVkLWJ5LWRyaXZlclwiLFxuXHRcdFx0Y2xvbmVEcml2ZXI6IGR1bW15Q2xvbmVEcml2ZXIsXG5cdFx0XHRyZXBvVXJsOiBcIm5vdC1pbXBvcnRhbnRcIixcblx0XHRcdHJlcG9EaXI6IHRtcERpcixcblx0XHRcdGRpZmZEcml2ZXI6IG1vY2tEaWZmRHJpdmVyLFxuXHRcdFx0Y3VycmVudFJlZkRyaXZlcjogZHVtbXlDdXJyZW50UmVmRHJpdmVyLFxuXHRcdFx0Y2hlY2tvdXREcml2ZXI6IGR1bW15Q2hlY2tvdXREcml2ZXIsXG5cdFx0fSk7XG5cblx0XHQvLyBzaW5jZSB0aGVyZSB3YXMgbm8gb3ZlcnJpZGUgZm9yIHRoaXMgZmlsZSwgbm90IGNoYW5nZXMgZnJvbSB0aGUgbG9jYWwgZmlsZVxuXHRcdGV4cGVjdChyZXN1bHQubG9jYWxGaWxlQ2hhbmdlcykudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7fSkpO1xuXG5cdFx0Ly8gVmVyaWZ5IHRoZSBmaWxlc1xuXHRcdGF3YWl0IGZpbGVNYXRjaFRlbXBsYXRlKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMuanNvblwiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZSh0bXBEaXIsIFwic3JjL3RlbXBsYXRlZC50c1wiKTtcblxuXHRcdC8vIEV4cGVjdCB0aGUgbm9uZSBvZiB0aGUgZGlmZiBmaWxlcyB0byB3b3JrXG5cdFx0YXdhaXQgZmlsZU1hdGNoRG93bnN0cmVhbSh0bXBEaXIsIFwic3JjL2luZGV4LnRzXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInBsdWdpbnMvY3VzdG9tLXBsdWdpbi5qc1wiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0ZXhwZWN0KGR1bW15Q2hlY2tvdXREcml2ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cdH0pO1xuXHRpdChcInVwZGF0ZXMgdGhlIGxvY2FsIHRlbXBsYXRlc3luYyB3aXRoIHRoZSBjdXJyZW50IHJlZiBpZiB1cGRhdGVBZnRlclJlZiBpcyB0cnVlXCIsIGFzeW5jICgpID0+IHtcblx0XHQvLyBSZW1vdmUgdGhlIGxvY2FsIHN5bmMgb3ZlcnJpZGVzXG5cdFx0YXdhaXQgcm0oam9pbih0bXBEaXIsIFwidGVtcGxhdGVzeW5jLmxvY2FsLmpzb25cIikpO1xuXG5cdFx0Y29uc3QgbW9ja0xvY2FsQ29uZmlnID0ge1xuXHRcdFx0YWZ0ZXJSZWY6IFwiZHVtbXlTaGFcIixcblx0XHRcdGlnbm9yZTogW1xuXHRcdFx0XHQvLyBXZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhpcyBpbiBoZXJlLCBidXQgaXQncyBhbiBleGFtcGxlIG9mIGtlZXBpbmcgdGhpbmdzIGNsZWFuZXIgZm9yIG91ciBjdXN0b20gcGx1Z2luc1xuXHRcdFx0XHRcInBsdWdpbnMvKipcIixcblx0XHRcdF0sXG5cdFx0fTtcblxuXHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSxcblx0XHRcdEpTT04uc3RyaW5naWZ5KG1vY2tMb2NhbENvbmZpZyksXG5cdFx0KTtcblxuXHRcdC8vIFdlIHdpbGwgb25seSB1cGRhdGUgdGhlIHRlbXBsYXRlZC50c1xuXHRcdGNvbnN0IG1vY2tEaWZmRHJpdmVyID0gamVzdC5mbigpLm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoKSA9PiAoe1xuXHRcdFx0YWRkZWQ6IFtcInNyYy90ZW1wbGF0ZWQudHNcIl0sXG5cdFx0XHRtb2RpZmllZDogW1wic3JjL2luZGV4LnRzXCJdLCAvLyBBZGQgaW5kZXgudHMgc28gd2UgbWFrZSBzdXJlIGl0IGlzIHN0aWxsIGlnbm9yZWQgLSBzZWUgdGVzdC1maXh0dXJlcy90ZW1wbGF0ZS90ZW1wbGF0ZXN5bmMuanNvbiBpZ25vcmVzXG5cdFx0XHRkZWxldGVkOiBbXSxcblx0XHR9KSk7XG5cdFx0Y29uc3QgbW9ja0N1cnJlbnRSZWZEcml2ZXIgPSBqZXN0XG5cdFx0XHQuZm4oKVxuXHRcdFx0Lm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoKSA9PiBcIm5ld2VzdFNoYVwiKTtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCB0ZW1wbGF0ZVN5bmMoe1xuXHRcdFx0dG1wQ2xvbmVEaXI6IFwic3R1YmJlZC1ieS1kcml2ZXJcIixcblx0XHRcdGNsb25lRHJpdmVyOiBkdW1teUNsb25lRHJpdmVyLFxuXHRcdFx0cmVwb1VybDogXCJub3QtaW1wb3J0YW50XCIsXG5cdFx0XHRyZXBvRGlyOiB0bXBEaXIsXG5cdFx0XHR1cGRhdGVBZnRlclJlZjogdHJ1ZSxcblx0XHRcdGRpZmZEcml2ZXI6IG1vY2tEaWZmRHJpdmVyLFxuXHRcdFx0Y3VycmVudFJlZkRyaXZlcjogbW9ja0N1cnJlbnRSZWZEcml2ZXIsXG5cdFx0XHRjaGVja291dERyaXZlcjogZHVtbXlDaGVja291dERyaXZlcixcblx0XHR9KTtcblxuXHRcdC8vIHNpbmNlIHRoZXJlIHdhcyBubyBvdmVycmlkZSBmb3IgdGhpcyBmaWxlLCBubyBjaGFuZ2VzIGZyb20gdGhlIGxvY2FsIGZpbGVcblx0XHRleHBlY3QocmVzdWx0LmxvY2FsRmlsZUNoYW5nZXMpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe30pKTtcblx0XHRleHBlY3QocmVzdWx0Lm1vZGlmaWVkRmlsZXMpLnRvRXF1YWwoe1xuXHRcdFx0YWRkZWQ6IFtcInNyYy90ZW1wbGF0ZWQudHNcIl0sXG5cdFx0XHRtb2RpZmllZDogW1widGVtcGxhdGVzeW5jLmxvY2FsLmpzb25cIl0sIC8vIEFkZCBpbmRleC50cyBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMgc3RpbGwgaWdub3JlZCAtIGR1ZSB0byBhIGJ1Z1xuXHRcdFx0ZGVsZXRlZDogW10sXG5cdFx0XHR0b3RhbDogMixcblx0XHR9KTtcblxuXHRcdC8vIFZlcmlmeSB0aGUgZmlsZXNcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZSh0bXBEaXIsIFwidGVtcGxhdGVzeW5jLmpzb25cIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoVGVtcGxhdGUodG1wRGlyLCBcInNyYy90ZW1wbGF0ZWQudHNcIik7XG5cblx0XHQvLyBFeHBlY3QgdGhlIG5vbmUgb2YgdGhlIGRpZmYgZmlsZXMgdG8gd29ya1xuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInNyYy9pbmRleC50c1wiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJwbHVnaW5zL2N1c3RvbS1wbHVnaW4uanNcIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoRG93bnN0cmVhbSh0bXBEaXIsIFwicGFja2FnZS5qc29uXCIpO1xuXG5cdFx0Ly8gRW5zdXJlIHdlIGhhdmUgdXBkYXRlZCB0aGUgbG9jYWwgdGVtcGxhdGUgZmllbGRcblx0XHRleHBlY3QoXG5cdFx0XHRKU09OLnBhcnNlKFxuXHRcdFx0XHQoYXdhaXQgcmVhZEZpbGUoam9pbih0bXBEaXIsIFwidGVtcGxhdGVzeW5jLmxvY2FsLmpzb25cIikpKS50b1N0cmluZygpLFxuXHRcdFx0KSxcblx0XHQpLnRvRXF1YWwoe1xuXHRcdFx0Li4ubW9ja0xvY2FsQ29uZmlnLFxuXHRcdFx0YWZ0ZXJSZWY6IFwibmV3ZXN0U2hhXCIsXG5cdFx0fSk7XG5cdFx0ZXhwZWN0KGR1bW15Q2hlY2tvdXREcml2ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cdH0pO1xuXHRpdChcIkRvZXMgbm90IHVwZGF0ZSB0aGUgbG9jYWwgdGVtcGxhdGVzeW5jIGlmIHVwZGF0ZUFmdGVyUmVmIGlzIHRydWUgYW5kIHRoZSByZWYgaXMgdGhlIHNhbWVcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdC8vIFJlbW92ZSB0aGUgbG9jYWwgc3luYyBvdmVycmlkZXNcblx0XHRhd2FpdCBybShqb2luKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMubG9jYWwuanNvblwiKSk7XG5cblx0XHRjb25zdCBtb2NrTG9jYWxDb25maWcgPSB7XG5cdFx0XHRhZnRlclJlZjogXCJkdW1teVNoYVwiLFxuXHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdC8vIFdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGlzIGluIGhlcmUsIGJ1dCBpdCdzIGFuIGV4YW1wbGUgb2Yga2VlcGluZyB0aGluZ3MgY2xlYW5lciBmb3Igb3VyIGN1c3RvbSBwbHVnaW5zXG5cdFx0XHRcdFwicGx1Z2lucy8qKlwiLFxuXHRcdFx0XSxcblx0XHR9O1xuXG5cdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpLFxuXHRcdFx0SlNPTi5zdHJpbmdpZnkobW9ja0xvY2FsQ29uZmlnKSxcblx0XHQpO1xuXG5cdFx0Ly8gV2Ugd2lsbCBvbmx5IHVwZGF0ZSB0aGUgdGVtcGxhdGVkLnRzXG5cdFx0Y29uc3QgbW9ja0RpZmZEcml2ZXIgPSBqZXN0LmZuKCkubW9ja0ltcGxlbWVudGF0aW9uKGFzeW5jICgpID0+ICh7XG5cdFx0XHRhZGRlZDogW1wic3JjL3RlbXBsYXRlZC50c1wiXSxcblx0XHRcdG1vZGlmaWVkOiBbXCJzcmMvaW5kZXgudHNcIl0sIC8vIEFkZCBpbmRleC50cyBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMgc3RpbGwgaWdub3JlZCAtIHNlZSB0ZXN0LWZpeHR1cmVzL3RlbXBsYXRlL3RlbXBsYXRlc3luYy5qc29uIGlnbm9yZXNcblx0XHRcdGRlbGV0ZWQ6IFtdLFxuXHRcdH0pKTtcblx0XHRjb25zdCBtb2NrQ3VycmVudFJlZkRyaXZlciA9IGplc3Rcblx0XHRcdC5mbigpXG5cdFx0XHQubW9ja0ltcGxlbWVudGF0aW9uKGFzeW5jICgpID0+IFwiZHVtbXlTaGFcIik7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGVtcGxhdGVTeW5jKHtcblx0XHRcdHRtcENsb25lRGlyOiBcInN0dWJiZWQtYnktZHJpdmVyXCIsXG5cdFx0XHRjbG9uZURyaXZlcjogZHVtbXlDbG9uZURyaXZlcixcblx0XHRcdHJlcG9Vcmw6IFwibm90LWltcG9ydGFudFwiLFxuXHRcdFx0cmVwb0RpcjogdG1wRGlyLFxuXHRcdFx0dXBkYXRlQWZ0ZXJSZWY6IHRydWUsXG5cdFx0XHRkaWZmRHJpdmVyOiBtb2NrRGlmZkRyaXZlcixcblx0XHRcdGN1cnJlbnRSZWZEcml2ZXI6IG1vY2tDdXJyZW50UmVmRHJpdmVyLFxuXHRcdFx0Y2hlY2tvdXREcml2ZXI6IGR1bW15Q2hlY2tvdXREcml2ZXIsXG5cdFx0fSk7XG5cblx0XHQvLyBOb3RoaW5nIHNob3VkbCBiZSByZXBvcnRlZCBhcyBjaGFuZ2luZ1xuXHRcdGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuXHRcdFx0bG9jYWxGaWxlQ2hhbmdlczoge30sXG5cdFx0XHRsb2NhbFNraXBGaWxlczogW10sXG5cdFx0XHRtb2RpZmllZEZpbGVzOiB7XG5cdFx0XHRcdGFkZGVkOiBbXSxcblx0XHRcdFx0bW9kaWZpZWQ6IFtdLFxuXHRcdFx0XHRkZWxldGVkOiBbXSxcblx0XHRcdFx0dG90YWw6IDAsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHRcdC8vIFZlcmlmeSB0aGUgZmlsZXNcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJ0ZW1wbGF0ZXN5bmMuanNvblwiKTtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJzcmMvdGVtcGxhdGVkLnRzXCIpO1xuXG5cdFx0Ly8gRXhwZWN0IHRoZSBub25lIG9mIHRoZSBkaWZmIGZpbGVzIHRvIHdvcmtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJzcmMvaW5kZXgudHNcIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoRG93bnN0cmVhbSh0bXBEaXIsIFwicGx1Z2lucy9jdXN0b20tcGx1Z2luLmpzXCIpO1xuXHRcdGF3YWl0IGZpbGVNYXRjaERvd25zdHJlYW0odG1wRGlyLCBcInBhY2thZ2UuanNvblwiKTtcblxuXHRcdC8vIEVuc3VyZSB3ZSBoYXZlIHVwZGF0ZWQgdGhlIGxvY2FsIHRlbXBsYXRlIGZpZWxkXG5cdFx0ZXhwZWN0KFxuXHRcdFx0SlNPTi5wYXJzZShcblx0XHRcdFx0KGF3YWl0IHJlYWRGaWxlKGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpKSkudG9TdHJpbmcoKSxcblx0XHRcdCksXG5cdFx0KS50b0VxdWFsKHtcblx0XHRcdC4uLm1vY2tMb2NhbENvbmZpZyxcblx0XHR9KTtcblx0XHRleHBlY3QoZHVtbXlDaGVja291dERyaXZlcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcblx0fSk7XG5cdGl0KFwiY3JlYXRlcyB0aGUgbG9jYWwgdGVtcGxhdGVzeW5jIHdpdGggdGhlIGN1cnJlbnQgcmVmIGlmIHVwZGF0ZUFmdGVyUmVmIGlzIHRydWUgYW5kIG5vIGxvY2FsIHRlbXBsYXRlIGV4aXN0c1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0Ly8gUmVtb3ZlIHRoZSBsb2NhbCBzeW5jIG92ZXJyaWRlc1xuXHRcdGF3YWl0IHJtKGpvaW4odG1wRGlyLCBcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIpKTtcblxuXHRcdC8vIFdlIHdpbGwgb25seSB1cGRhdGUgdGhlIHRlbXBsYXRlZC50c1xuXHRcdGNvbnN0IG1vY2tEaWZmRHJpdmVyID0gamVzdC5mbigpLm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoKSA9PiAoe1xuXHRcdFx0YWRkZWQ6IFtcInNyYy90ZW1wbGF0ZWQudHNcIl0sXG5cdFx0fSkpO1xuXHRcdGNvbnN0IG1vY2tDdXJyZW50UmVmRHJpdmVyID0gamVzdFxuXHRcdFx0LmZuKClcblx0XHRcdC5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKCkgPT4gXCJuZXdlc3RTaGFcIik7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGVtcGxhdGVTeW5jKHtcblx0XHRcdHRtcENsb25lRGlyOiBcInN0dWJiZWQtYnktZHJpdmVyXCIsXG5cdFx0XHRjbG9uZURyaXZlcjogZHVtbXlDbG9uZURyaXZlcixcblx0XHRcdHJlcG9Vcmw6IFwibm90LWltcG9ydGFudFwiLFxuXHRcdFx0cmVwb0RpcjogdG1wRGlyLFxuXHRcdFx0dXBkYXRlQWZ0ZXJSZWY6IHRydWUsXG5cdFx0XHRkaWZmRHJpdmVyOiBtb2NrRGlmZkRyaXZlcixcblx0XHRcdGN1cnJlbnRSZWZEcml2ZXI6IG1vY2tDdXJyZW50UmVmRHJpdmVyLFxuXHRcdFx0Y2hlY2tvdXREcml2ZXI6IGR1bW15Q2hlY2tvdXREcml2ZXIsXG5cdFx0fSk7XG5cblx0XHQvLyBzaW5jZSB0aGVyZSB3YXMgbm8gb3ZlcnJpZGUgZm9yIHRoaXMgZmlsZSwgbm8gY2hhbmdlcyBmcm9tIHRoZSBsb2NhbCBmaWxlXG5cdFx0ZXhwZWN0KHJlc3VsdC5sb2NhbEZpbGVDaGFuZ2VzKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHt9KSk7XG5cdFx0ZXhwZWN0KHJlc3VsdC5tb2RpZmllZEZpbGVzKS50b0VxdWFsKHtcblx0XHRcdGFkZGVkOiBbXG5cdFx0XHRcdFwicGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdFwic3JjL2luZGV4LmpzXCIsXG5cdFx0XHRcdFwic3JjL3RlbXBsYXRlZC5qc1wiLFxuXHRcdFx0XHRcInNyYy90ZW1wbGF0ZWQudHNcIixcblx0XHRcdFx0XCJ0ZW1wbGF0ZXN5bmMuanNvblwiLFxuXHRcdFx0XHRcInRlbXBsYXRlc3luYy5sb2NhbC5qc29uXCIsXG5cdFx0XHRdLFxuXHRcdFx0ZGVsZXRlZDogW10sXG5cdFx0XHRtb2RpZmllZDogW10sXG5cdFx0XHR0b3RhbDogNixcblx0XHR9KTtcblxuXHRcdC8vIFZlcmlmeSB0aGUgZmlsZXNcblx0XHRhd2FpdCBmaWxlTWF0Y2hUZW1wbGF0ZSh0bXBEaXIsIFwidGVtcGxhdGVzeW5jLmpzb25cIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoVGVtcGxhdGUodG1wRGlyLCBcInNyYy90ZW1wbGF0ZWQudHNcIik7XG5cdFx0Y29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuXHRcdFx0cmVhZEZpbGVTeW5jKHJlc29sdmUodG1wRGlyLCBcInBhY2thZ2UuanNvblwiKSkudG9TdHJpbmcoKSxcblx0XHQpO1xuXG5cdFx0ZXhwZWN0KHBhY2thZ2VKc29uKS50b0VxdWFsKHtcblx0XHRcdG5hbWU6IFwibXlwa2dcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBcIm15IGRlc2NyaXB0aW9uXCIsXG5cdFx0XHRkZXBlbmRlbmNpZXM6IHtcblx0XHRcdFx0bXlwYWNrYWdlOiBcIl4xLjIuMFwiLFxuXHRcdFx0XHRuZXdwYWNha2dlOiBcIl4yMi4yLjJcIixcblx0XHRcdFx0cGFja2FnZTI6IFwiMy4yMi4xXCIsXG5cdFx0XHRcdGh1aDogXCJ+MS4wLjBcIixcblx0XHRcdH0sXG5cdFx0XHRlbmdpbmVzOiB7XG5cdFx0XHRcdG5vZGU6IFwiPj0xNVwiLFxuXHRcdFx0fSxcblx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0YnVpbGQ6IFwiYnVpbGRcIixcblx0XHRcdFx0dGVzdDogXCJqZXN0XCIsXG5cdFx0XHRcdG15c2NyaXB0OiBcInNvbWVzY3JpcHRcIixcblx0XHRcdH0sXG5cdFx0XHQvLyBCeSBkZWZhdWx0IHdlIGFkZCBuZXcgdG9wLWxldmVsIGZpZWxkc1xuXHRcdFx0dmVyc2lvbjogXCJuZXctdmVyc2lvblwiLFxuXHRcdH0pO1xuXG5cdFx0Ly8gRXhwZWN0IHRoZSBub25lIG9mIHRoZSBkaWZmIGZpbGVzIHRvIHdvcmtcblx0XHRhd2FpdCBmaWxlTWF0Y2hEb3duc3RyZWFtKHRtcERpciwgXCJzcmMvaW5kZXgudHNcIik7XG5cdFx0YXdhaXQgZmlsZU1hdGNoRG93bnN0cmVhbSh0bXBEaXIsIFwicGx1Z2lucy9jdXN0b20tcGx1Z2luLmpzXCIpO1xuXG5cdFx0Ly8gRW5zdXJlIHdlIGhhdmUgdXBkYXRlZCB0aGUgbG9jYWwgdGVtcGxhdGUgZmllbGRcblx0XHRleHBlY3QoXG5cdFx0XHRKU09OLnBhcnNlKFxuXHRcdFx0XHQoYXdhaXQgcmVhZEZpbGUoam9pbih0bXBEaXIsIFwidGVtcGxhdGVzeW5jLmxvY2FsLmpzb25cIikpKS50b1N0cmluZygpLFxuXHRcdFx0KSxcblx0XHQpLnRvRXF1YWwoe1xuXHRcdFx0YWZ0ZXJSZWY6IFwibmV3ZXN0U2hhXCIsXG5cdFx0fSk7XG5cdH0pO1xuXHQvLyBoZWxwZXJcblx0YXN5bmMgZnVuY3Rpb24gZmlsZU1hdGNoVGVtcGxhdGUoX3RtcERpcjogc3RyaW5nLCByZWxQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gZmlsZU1hdGNoKF90bXBEaXIsIHJlbFBhdGgsIFwidGVtcGxhdGVcIik7XG5cdH1cblxuXHRhc3luYyBmdW5jdGlvbiBmaWxlTWF0Y2hEb3duc3RyZWFtKF90bXBEaXI6IHN0cmluZywgcmVsUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGZpbGVNYXRjaChfdG1wRGlyLCByZWxQYXRoLCBcImRvd25zdHJlYW1cIik7XG5cdH1cblxuXHRhc3luYyBmdW5jdGlvbiBmaWxlTWF0Y2goXG5cdFx0X3RtcERpcjogc3RyaW5nLFxuXHRcdHJlbFBhdGg6IHN0cmluZyxcblx0XHRzb3VyY2U6IFwiZG93bnN0cmVhbVwiIHwgXCJ0ZW1wbGF0ZVwiLFxuXHQpIHtcblx0XHRjb25zdCBkaXIgPVxuXHRcdFx0c291cmNlID09PSBcImRvd25zdHJlYW1cIiA/IGRvd25zdHJlYW1EaXIgOiAoYXdhaXQgZHVtbXlDbG9uZURyaXZlcigpKS5kaXI7XG5cdFx0ZXhwZWN0KChhd2FpdCByZWFkRmlsZShyZXNvbHZlKF90bXBEaXIsIHJlbFBhdGgpKSkudG9TdHJpbmcoKSkudG9FcXVhbChcblx0XHRcdChhd2FpdCByZWFkRmlsZShyZXNvbHZlKGRpciwgcmVsUGF0aCkpKS50b1N0cmluZygpLFxuXHRcdCk7XG5cdH1cbn0pO1xuIl0sIm5hbWVzIjpbImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwibWtkdGVtcCIsInJlYWRGaWxlIiwicm0iLCJjb3B5Iiwiam9pbiIsInJlc29sdmUiLCJ0ZW1wbGF0ZVN5bmMiLCJURVNUX0ZJWFRVUkVTX0RJUiIsInRlbXBEaXIiLCJkdW1teUNoZWNrb3V0RHJpdmVyIiwiamVzdCIsImZuIiwiZHVtbXlDdXJyZW50UmVmRHJpdmVyIiwiZG93bnN0cmVhbURpciIsImRlc2NyaWJlIiwidG1wRGlyIiwidGVtcGxhdGVEaXIiLCJkdW1teUNsb25lRHJpdmVyIiwiYmVmb3JlRWFjaCIsInJlc2V0QWxsTW9ja3MiLCJkaXIiLCJyZW1vdGVOYW1lIiwiYWZ0ZXJFYWNoIiwiZm9yY2UiLCJyZWN1cnNpdmUiLCJpdCIsImVhY2giLCJtb2RlIiwiZXhwZWN0ZWQiLCJKU09OIiwic3RyaW5naWZ5IiwiaWdub3JlIiwibWVyZ2UiLCJnbG9iIiwicGx1Z2luIiwib3B0aW9ucyIsImV4cGVjdCIsInRtcENsb25lRGlyIiwiY2xvbmVEcml2ZXIiLCJyZXBvVXJsIiwicmVwb0RpciIsImNoZWNrb3V0RHJpdmVyIiwiY3VycmVudFJlZkRyaXZlciIsInJlamVjdHMiLCJ0b1Rocm93IiwiZW1wdHlUbXBEaXIiLCJ0b0VxdWFsIiwibG9jYWxTa2lwRmlsZXMiLCJsb2NhbEZpbGVDaGFuZ2VzIiwibW9kaWZpZWRGaWxlcyIsImFkZGVkIiwiZGVsZXRlZCIsIm1vZGlmaWVkIiwidG90YWwiLCJmaWxlTWF0Y2hUZW1wbGF0ZSIsInRvQmVGYWxzeSIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJicmFuY2giLCJjbG9uZUluZm8iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInJlc3VsdCIsInBhY2thZ2VKc29uIiwicGFyc2UiLCJ0b1N0cmluZyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImRlcGVuZGVuY2llcyIsIm15cGFja2FnZSIsIm5ld3BhY2FrZ2UiLCJwYWNrYWdlMiIsImh1aCIsImVuZ2luZXMiLCJub2RlIiwic2NyaXB0cyIsImJ1aWxkIiwidGVzdCIsIm15c2NyaXB0IiwidmVyc2lvbiIsImZpbGVNYXRjaERvd25zdHJlYW0iLCJvYmplY3RDb250YWluaW5nIiwiYXJyYXlDb250YWluaW5nIiwiZG93bnN0cmVhbSIsImFmdGVyUmVmIiwibW9ja0RpZmZEcml2ZXIiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJkaWZmRHJpdmVyIiwibW9ja0xvY2FsQ29uZmlnIiwibW9ja0N1cnJlbnRSZWZEcml2ZXIiLCJ1cGRhdGVBZnRlclJlZiIsIl90bXBEaXIiLCJyZWxQYXRoIiwiZmlsZU1hdGNoIiwic291cmNlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLEVBQUVDLFlBQVksRUFBRUMsYUFBYSxRQUFRLEtBQUs7QUFDN0QsU0FBU0MsT0FBTyxFQUFFQyxRQUFRLEVBQUVDLEVBQUUsUUFBUSxtQkFBYztBQUNwRCxTQUFTQyxJQUFJLFFBQVEsV0FBVztBQUNoQyxTQUFTQyxJQUFJLEVBQUVDLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLFNBQVNDLFlBQVksUUFBUSxzQkFBa0I7QUFDL0MsU0FBU0MsaUJBQWlCLEVB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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { tmpdir } from "os";
|
|
2
|
+
import { resolve, dirname as __swc_shim_dirname } from "path";
|
|
3
|
+
import { fileURLToPath as __swc_shim_fileURLToPath } from "url";
|
|
4
|
+
const __dirname = __swc_shim_dirname(__swc_shim_fileURLToPath(import.meta.url));
|
|
5
|
+
export const TEST_FIXTURES_DIR = resolve(__dirname, "..", "..", "test-fixtures");
|
|
6
|
+
export function tempDir() {
|
|
7
|
+
return process.env.RUNNER_TEMP ?? tmpdir();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0LXV0aWxzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBjb25zdCBURVNUX0ZJWFRVUkVTX0RJUiA9IHJlc29sdmUoXG5cdF9fZGlybmFtZSxcblx0XCIuLlwiLFxuXHRcIi4uXCIsXG5cdFwidGVzdC1maXh0dXJlc1wiLFxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBEaXIoKTogc3RyaW5nIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LlJVTk5FUl9URU1QID8/IHRtcGRpcigpO1xufVxuIl0sIm5hbWVzIjpbInRtcGRpciIsInJlc29sdmUiLCJURVNUX0ZJWFRVUkVTX0RJUiIsIl9fZGlybmFtZSIsInRlbXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiUlVOTkVSX1RFTVAiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE1BQU0sUUFBUSxLQUFLO0FBQzVCLFNBQVNDLE9BQU8sdUNBQVEsT0FBTzs7O0FBRS9CLE9BQU8sTUFBTUMsb0JBQW9CRCxRQUNoQ0UsV0FDQSxNQUNBLE1BQ0EsaUJBQ0M7QUFFRixPQUFPLFNBQVNDO0lBQ2YsT0FBT0MsUUFBUUMsR0FBRyxDQUFDQyxXQUFXLElBQUlQO0FBQ25DIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How we want to merge json
|
|
3
|
+
*
|
|
4
|
+
* overwrite - the template sync overwrites completely
|
|
5
|
+
* merge-template - we merge template into the current json with overrides on matching values happening from the template
|
|
6
|
+
* merge-current - we merge the current json into the template json with overrides on matching values happening from the current json
|
|
7
|
+
*/ export { };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhvdyB3ZSB3YW50IHRvIG1lcmdlIGpzb25cbiAqXG4gKiBvdmVyd3JpdGUgLSB0aGUgdGVtcGxhdGUgc3luYyBvdmVyd3JpdGVzIGNvbXBsZXRlbHlcbiAqIG1lcmdlLXRlbXBsYXRlIC0gd2UgbWVyZ2UgdGVtcGxhdGUgaW50byB0aGUgY3VycmVudCBqc29uIHdpdGggb3ZlcnJpZGVzIG9uIG1hdGNoaW5nIHZhbHVlcyBoYXBwZW5pbmcgZnJvbSB0aGUgdGVtcGxhdGVcbiAqIG1lcmdlLWN1cnJlbnQgLSB3ZSBtZXJnZSB0aGUgY3VycmVudCBqc29uIGludG8gdGhlIHRlbXBsYXRlIGpzb24gd2l0aCBvdmVycmlkZXMgb24gbWF0Y2hpbmcgdmFsdWVzIGhhcHBlbmluZyBmcm9tIHRoZSBjdXJyZW50IGpzb25cbiAqL1xuZXhwb3J0IHR5cGUgQmFzZUpzb25NZXJnZU9wdGlvbnMgPVxuXHR8IFwib3ZlcndyaXRlXCJcblx0fCBcIm1lcmdlLXRlbXBsYXRlXCJcblx0fCBcIm1lcmdlLWN1cnJlbnRcIjtcbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGhPdmVycmlkZXMge1xuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgbWVhbnMgd2Ugd29uJ3QgYWRkIG5ldyBwcm9wZXJ0aWVzIGZyb20gdGhlIHRlbXBsYXRlXG5cdCAqL1xuXHRpZ25vcmVOZXdQcm9wZXJ0aWVzPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCBvdmVyd3JpdGUgd2lsbCBhcHBseSB1bmRlZmluZWQgdmFsdWVzIGFzIGRlbGV0ZWQgZm9yIHRoZSBqc29ucGF0aHNcblx0ICogb3IgZm9yIHZhbHVlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtZXJnZWQgb24gdG9wIG9mIG90aGVyIHZhbHVlc1xuXHQgKi9cblx0bWlzc2luZ0lzRGVsZXRlPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIE5vdGUsIGlmIG11bHRpcGxlIGpzb24gcGF0aHMgbWF0Y2ggYSBydWxlLCB3ZSBwaWNrIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGxpc3QgdGhhdCBtYXRjaGVzXG5cdCAqL1xuXHRwYXRoczogLyoqXG5cdCAqIFdlIG9ubHkgb3ZlcnJpZGUganNvbnBhdGhzLiAgQW55dGhpbmcgbm90IHNwZWNpZmllZCBpcyBrZXB0IHRoZSBzYW1lLlxuXHQgKi9cblx0W2pzb25QYXRoOiBgJC4ke3N0cmluZ31gLCBvcHRpb25zOiBCYXNlSnNvbk1lcmdlT3B0aW9uc11bXTtcbn1cbmV4cG9ydCB0eXBlIEpzb25GaWxlTWVyZ2VPcHRpb25zID0gQmFzZUpzb25NZXJnZU9wdGlvbnMgfCBKc29uUGF0aE92ZXJyaWRlcztcblxuLy8gU3VtIG9mIGFsbCBiYXNpYyBmaWxlIG1lcmdlIG9wdGlvbnNcbnR5cGUgTWVyZ2VQbHVnaW5PcHRpb25zID0gSnNvbkZpbGVNZXJnZU9wdGlvbnM7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGEgZ2l2ZW4gZmlsZSB0eXBlIG1lcmdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJnZUNvbmZpZzxUPiB7XG5cdC8qKlxuXHQgKiBBIGdsb2Igb3IgYXJyYXkgb2YgZ2xvYnMgKHVzaW5nIG1pY3JvbWF0Y2ggc3ludGF4KSB0aGF0IHNlbGVjdHMgdGhlIGZpbGVzIHRoYXQgdGhpcyBhcHBsaWVzIHRvXG5cdCAqIHdoZW4gbWVyZ2luZ1xuXHQgKi9cblx0Z2xvYjogc3RyaW5nIHwgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgbm9kZSBtb2R1bGUsIGF2YWlsYWJsZSBvbiB0aGUgY2FsbGluZyBub2RlIGNvbnRleHQsIHRoYXQgeW91IHdhbnQgdG8gcnVuLlxuXHQgKiBCdWlsdC1pbiBwbHVnaW5zIGNhbiBiZSBzcGVjaWZpZWQgdmlhIHRoZWlyIGJ1aWx0LWluIG5hbWUgKHNlZSBkb2N1bWVudGF0aW9uKTpcblx0ICpcblx0ICogRXhhbXBsZTogX2pzb25cblx0ICovXG5cdHBsdWdpbjogc3RyaW5nO1xuXHQvKipcblx0ICogQW4gYXJyYXkgb2YgZmlyc3QgbWF0Y2ggZmlsZSBnbG9icyB0aGF0IHdpbGwgdGhlbiBjYWxsIHRoZSBwbHVnaW4gd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuXHQgKi9cblx0b3B0aW9uczogTWVyZ2VQbHVnaW5PcHRpb25zIHwgVDtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgYSB0ZW1wbGF0ZSBzeW5jIGNvbmZpZyBmaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnPFQgPSB1bmtub3duPiB7XG5cdGlnbm9yZTogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBJZiB0aGVyZSBpcyBubyBtZXJnZSBjb25maWcsIHRoZW4gd2Ugd2lsbCBhbHdheXMganVzdCBvdmVyd3JpdGUgdGhlIGZpbGUgZm9yIHRoZSBkaWZmXG5cdCAqL1xuXHRtZXJnZT86IE1lcmdlQ29uZmlnPFQ+W107XG59XG5cbi8qKlxuICogVGhlIHNoYXBlIG9mIGEgbG9jYWwgdGVtcGxhdGUgc3luYyBjb25maWcgZmlsZSB0aGF0IG92ZXJyaWRlcyB0aGUgcm9vdCB0ZW1wbGF0ZSByZXBvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxDb25maWc8VCA9IHVua25vd24+IHtcblx0LyoqXG5cdCAqIFRoaXMgaXMgdGhlIHJlZiB0aGF0IHdlIGNvbXBhcmUgYWdhaW5zdC4gIElmIGVtcHR5LCB3ZSB1c2UgYWxsIGZpbGVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZVxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIHRlbXBsYXRlIHJlcG8uXG5cdCAqL1xuXHRhZnRlclJlZj86IHN0cmluZztcblxuXHRpZ25vcmU6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogSWYgdGhlcmUgaXMgbm8gbWVyZ2UgY29uZmlnLCB0aGVuIHdlIHdpbGwgYWx3YXlzIGp1c3Qgb3ZlcndyaXRlIHRoZSBmaWxlIGZvciB0aGUgZGlmZlxuXHQgKi9cblx0bWVyZ2U/OiBNZXJnZUNvbmZpZzxUPltdO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFyb3VuZCB0aGUgZmlsZSB3ZSBhcmUgdHJ5aW5nIHRvIG1lcmdlIGFuZCB0aGF0IGFyZ3VtZW50cyBmb3IgdGhhdCBtZXJnZVxuICogZnJvbSBtYXRjaGluZyBhIG1lcmdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJnZUNvbnRleHQ8UGx1Z2luT3B0aW9ucyA9IHVua25vd24+IHtcblx0cmVsRmlsZVBhdGg6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHlvdSBoYXZlIHByb3ZpZGVkIGEgY3VzdG9tIG1lcmdlIHBsdWdpbiwgdGhpcyB3aWxsIGJlIHRoZSBcIm9wdGlvbnNcIiBzZWN0aW9uIG9mXG5cdCAqIHRoZSBtYXRjaGluZyBnbG9iXG5cdCAqL1xuXHRtZXJnZUFyZ3VtZW50czogUGx1Z2luT3B0aW9ucztcblx0LyoqXG5cdCAqIElmIHRoaXMgcnVuIGlzIGZvciB0aGUgbG9jYWwgY29uZmlnLiAgS2VlcCBpbiBtaW5kIHRoYXQgYW55IGxvY2FsIGNvbmZpZyBvdmVycmlkZXMgd2lsbFxuXHQgKiBiZSBydW4gYWZ0ZXIgdGhlIHRlbXBsYXRlIHN5bmMgb3B0aW9ucyBhbmQgd2Ugd291bGQgbGlrZSB0byByZXBvcnQgYW55IGNoYW5nZXMgdGhhdFxuXHQgKiBhcmUgZG9uZVxuXHQgKi9cblx0aXNMb2NhbE9wdGlvbnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlUGx1Z2luPFBsdWdpbk9wdGlvbnM+IHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBmaWxlIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBpdCdzIGFuYWxvZyBpbiB0aGUgZG93bnN0cmVhbSByZXBvXG5cdCAqIGhhdmUgc29tZSBkaWZmZXJlbmNlcy4gIFRoZSBwbHVnaW4gbXVzdCBwZXJmb3JtIHRoZSBtZXJnZSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmaWxlIGNvbnRlbnRzXG5cdCAqIGFzIGEgc3RyaW5nXG5cdCAqXG5cdCAqIFRPRE86IHdlIG1heSBjcmVhdGUgYSBWMiBwbHVnaW4gdGhhdCBjb3VsZCBkZWFsIHdpdGggbGFyZ2UgZmlsZXMgYW5kIG5vdCBwYXNzIGFyb3VuZCBzdHJpbmdzIGluIG1lbW9yeSxcblx0ICogYnV0IGZvciBub3csIHRoaXMgaXMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cblx0ICpcblx0ICogQHBhcmFtIGN1cnJlbnQgLSBUaGUgZG93bnN0cmVhbSByZXBvcyBjdXJyZW50IGZpbGUgY29udGVudHNcblx0ICogQHBhcmFtIGZyb21UZW1wbGF0ZVJlcG8gLSB0aGUgY3VycmVudFxuXHQgKiBAcGFyYW0gY29udGV4dCAtIGFuIG9iamVjdCBkZWZpbmluZyB0aGUgY29udGV4dCBhcm91bmQgdGhlIGZpbGUgYW5kIHRoZSBzcGVjaWZpYyBvcHRpb25zXG5cdCAqL1xuXHRtZXJnZShcblx0XHRjdXJyZW50OiBzdHJpbmcsXG5cdFx0ZnJvbVRlbXBsYXRlUmVwbzogc3RyaW5nLFxuXHRcdGNvbnRleHQ6IE1lcmdlQ29udGV4dDxQbHVnaW5PcHRpb25zPixcblx0KTogUHJvbWlzZTxzdHJpbmc+O1xuXHQvKipcblx0ICogR2l2ZW4gYW4gb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBtZXJnZSwgdGhpcyB2YWxpZGF0ZXMgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCByZXR1cm5zIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGlzIGFueXRoaW5nIHdyb25nLlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBhbnkganNvbiB2YWx1ZSB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIC0gbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgb3B0aW9uc1xuXHQgKi9cblx0dmFsaWRhdGUob3B0aW9uczogdW5rbm93bik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBGaWxlT3BlcmF0aW9uID0gXCJhZGRlZFwiIHwgXCJtb2RpZmllZFwiIHwgXCJkZWxldGVkXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztDQU1DLEdBMEhELFdBQTZEIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-checkout.d.ts","sourceRoot":"","sources":["../../../src/checkout-drivers/git-checkout.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAC1C,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-checkout.spec.d.ts","sourceRoot":"","sources":["../../../src/checkout-drivers/git-checkout.spec.ts"],"names":[],"mappings":""}
|