livemark 0.28.3 → 0.28.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -2
  2. package/build/actions/changelog/build.d.ts +1 -1
  3. package/build/actions/changelog/build.js +5 -5
  4. package/build/actions/changelog/build.unit.js +6 -6
  5. package/build/actions/target/build.d.ts +9 -5
  6. package/build/actions/target/build.js +14 -9
  7. package/build/actions/target/build.unit.js +17 -2
  8. package/build/actions/target/clear.d.ts +2 -2
  9. package/build/actions/target/clear.js +11 -9
  10. package/build/actions/target/clear.unit.js +10 -3
  11. package/build/commands/clear.d.ts +1 -1
  12. package/build/commands/clear.js +6 -5
  13. package/build/helpers/tailwind-sources.unit.js +4 -4
  14. package/build/helpers/target-dir.d.ts +2 -0
  15. package/build/helpers/target-dir.js +11 -0
  16. package/build/helpers/target-export.unit.js +2 -2
  17. package/build/helpers/task-queue.d.ts +7 -0
  18. package/build/helpers/task-queue.js +28 -0
  19. package/build/helpers/task-queue.unit.d.ts +1 -0
  20. package/build/helpers/task-queue.unit.js +56 -0
  21. package/build/plugins/vite-content.d.ts +9 -0
  22. package/build/plugins/vite-content.js +60 -0
  23. package/build/plugins/vite-livemark.d.ts +2 -1
  24. package/build/plugins/vite-livemark.js +20 -9
  25. package/build/vite.config.js +3 -3
  26. package/package.json +2 -2
  27. package/skills/livemark-configuration/SKILL.md +1 -1
  28. package/skills/livemark-customization/SKILL.md +1 -1
  29. package/skills/livemark-deployment/SKILL.md +1 -1
  30. package/source/actions/changelog/build.ts +4 -5
  31. package/source/actions/changelog/build.unit.ts +5 -5
  32. package/source/actions/target/build.ts +29 -9
  33. package/source/actions/target/build.unit.ts +24 -1
  34. package/source/actions/target/clear.ts +9 -8
  35. package/source/actions/target/clear.unit.ts +9 -2
  36. package/source/commands/clear.ts +5 -4
  37. package/source/helpers/tailwind-sources.unit.ts +3 -3
  38. package/source/helpers/target-dir.ts +12 -0
  39. package/source/helpers/target-export.unit.ts +1 -1
  40. package/source/helpers/task-queue.ts +28 -0
  41. package/source/helpers/task-queue.unit.ts +60 -0
  42. package/source/plugins/vite-content.ts +72 -0
  43. package/source/plugins/vite-livemark.ts +19 -9
  44. package/source/vite.config.ts +2 -2
@@ -3,21 +3,28 @@ import { mkdir, symlink, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { temporaryDirectoryTask } from "tempy";
5
5
  import { describe, expect, it } from "vite-plus/test";
6
+ import { cacheDirFor } from "../../helpers/target-dir.js";
6
7
  import { targetDirFor } from "./build.js";
7
8
  import { clearTarget } from "./clear.js";
8
9
  describe("clearTarget", () => {
9
- it("removes the target dir without following its dependency link", () => temporaryDirectoryTask(async (root) => {
10
+ it("removes the target dirs without following their dependency link", () => temporaryDirectoryTask(async (root) => {
10
11
  const configPath = join(root, "livemark.config.ts");
11
12
  const targetDir = targetDirFor(configPath);
13
+ const buildDir = targetDirFor(configPath, "build");
14
+ const cacheDir = cacheDirFor(configPath);
15
+ await mkdir(buildDir, { recursive: true });
16
+ await mkdir(cacheDir, { recursive: true });
12
17
  await mkdir(join(targetDir, "cache"), { recursive: true });
13
18
  await writeFile(join(targetDir, "cache", "entry.md"), "cached");
14
19
  await mkdir(join(root, "deps"));
15
20
  await writeFile(join(root, "deps", "kept.js"), "");
16
21
  await symlink(join(root, "deps"), join(targetDir, "node_modules"), "junction");
17
- expect(clearTarget(configPath)).toBe(targetDir);
22
+ expect(clearTarget(configPath)).toEqual([targetDir, buildDir, cacheDir]);
18
23
  expect(existsSync(targetDir)).toBe(false);
24
+ expect(existsSync(buildDir)).toBe(false);
25
+ expect(existsSync(cacheDir)).toBe(false);
19
26
  expect(existsSync(join(root, "deps", "kept.js"))).toBe(true);
20
27
  expect(() => clearTarget(configPath)).not.toThrow();
21
28
  }));
22
29
  });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL3RhcmdldC9jbGVhci51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXhDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxHQUFHLEVBQUUsQ0FDdEUsc0JBQXNCLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNuRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzFELE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUMvQixNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNsRCxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFOUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDUCxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBta2Rpciwgc3ltbGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyB0YXJnZXREaXJGb3IgfSBmcm9tIFwiLi9idWlsZC50c1wiXG5pbXBvcnQgeyBjbGVhclRhcmdldCB9IGZyb20gXCIuL2NsZWFyLnRzXCJcblxuZGVzY3JpYmUoXCJjbGVhclRhcmdldFwiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyB0aGUgdGFyZ2V0IGRpciB3aXRob3V0IGZvbGxvd2luZyBpdHMgZGVwZW5kZW5jeSBsaW5rXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyByb290ID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHJvb3QsIFwibGl2ZW1hcmsuY29uZmlnLnRzXCIpXG4gICAgICBjb25zdCB0YXJnZXREaXIgPSB0YXJnZXREaXJGb3IoY29uZmlnUGF0aClcbiAgICAgIGF3YWl0IG1rZGlyKGpvaW4odGFyZ2V0RGlyLCBcImNhY2hlXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcImNhY2hlXCIsIFwiZW50cnkubWRcIiksIFwiY2FjaGVkXCIpXG4gICAgICBhd2FpdCBta2Rpcihqb2luKHJvb3QsIFwiZGVwc1wiKSlcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHJvb3QsIFwiZGVwc1wiLCBcImtlcHQuanNcIiksIFwiXCIpXG4gICAgICBhd2FpdCBzeW1saW5rKGpvaW4ocm9vdCwgXCJkZXBzXCIpLCBqb2luKHRhcmdldERpciwgXCJub2RlX21vZHVsZXNcIiksIFwianVuY3Rpb25cIilcblxuICAgICAgZXhwZWN0KGNsZWFyVGFyZ2V0KGNvbmZpZ1BhdGgpKS50b0JlKHRhcmdldERpcilcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKHRhcmdldERpcikpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHJvb3QsIFwiZGVwc1wiLCBcImtlcHQuanNcIikpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoKCkgPT4gY2xlYXJUYXJnZXQoY29uZmlnUGF0aCkpLm5vdC50b1Rocm93KClcbiAgICB9KSlcbn0pXG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL3RhcmdldC9jbGVhci51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFLENBQ3pFLHNCQUFzQixDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUE7UUFDbkQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMxRCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMvRCxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDL0IsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbEQsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBRTlFLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDeEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDckQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IG1rZGlyLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB0ZW1wb3JhcnlEaXJlY3RvcnlUYXNrIH0gZnJvbSBcInRlbXB5XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IGNhY2hlRGlyRm9yIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvdGFyZ2V0LWRpci50c1wiXG5pbXBvcnQgeyB0YXJnZXREaXJGb3IgfSBmcm9tIFwiLi9idWlsZC50c1wiXG5pbXBvcnQgeyBjbGVhclRhcmdldCB9IGZyb20gXCIuL2NsZWFyLnRzXCJcblxuZGVzY3JpYmUoXCJjbGVhclRhcmdldFwiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyB0aGUgdGFyZ2V0IGRpcnMgd2l0aG91dCBmb2xsb3dpbmcgdGhlaXIgZGVwZW5kZW5jeSBsaW5rXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyByb290ID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHJvb3QsIFwibGl2ZW1hcmsuY29uZmlnLnRzXCIpXG4gICAgICBjb25zdCB0YXJnZXREaXIgPSB0YXJnZXREaXJGb3IoY29uZmlnUGF0aClcbiAgICAgIGNvbnN0IGJ1aWxkRGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZ1BhdGgsIFwiYnVpbGRcIilcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gY2FjaGVEaXJGb3IoY29uZmlnUGF0aClcbiAgICAgIGF3YWl0IG1rZGlyKGJ1aWxkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICBhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJjYWNoZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJjYWNoZVwiLCBcImVudHJ5Lm1kXCIpLCBcImNhY2hlZFwiKVxuICAgICAgYXdhaXQgbWtkaXIoam9pbihyb290LCBcImRlcHNcIikpXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihyb290LCBcImRlcHNcIiwgXCJrZXB0LmpzXCIpLCBcIlwiKVxuICAgICAgYXdhaXQgc3ltbGluayhqb2luKHJvb3QsIFwiZGVwc1wiKSwgam9pbih0YXJnZXREaXIsIFwibm9kZV9tb2R1bGVzXCIpLCBcImp1bmN0aW9uXCIpXG5cbiAgICAgIGV4cGVjdChjbGVhclRhcmdldChjb25maWdQYXRoKSkudG9FcXVhbChbdGFyZ2V0RGlyLCBidWlsZERpciwgY2FjaGVEaXJdKVxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmModGFyZ2V0RGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGJ1aWxkRGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGNhY2hlRGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4ocm9vdCwgXCJkZXBzXCIsIFwia2VwdC5qc1wiKSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdCgoKSA9PiBjbGVhclRhcmdldChjb25maWdQYXRoKSkubm90LnRvVGhyb3coKVxuICAgIH0pKVxufSlcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { Command } from "commander";
2
2
  /**
3
- * Wipe the generated `.livemark/.target/` mount.
3
+ * Wipe the generated `.livemark/.serve/` and `.livemark/.build/` mounts and `.livemark/.cache/`.
4
4
  */
5
5
  export declare const clear: Command;
@@ -3,13 +3,14 @@ import pc from "picocolors";
3
3
  import { loadConfig } from "../actions/config/load.js";
4
4
  import { clearTarget } from "../actions/target/clear.js";
5
5
  /**
6
- * Wipe the generated `.livemark/.target/` mount.
6
+ * Wipe the generated `.livemark/.serve/` and `.livemark/.build/` mounts and `.livemark/.cache/`.
7
7
  */
8
8
  export const clear = new Command("clear")
9
- .description("Wipe the generated .livemark/.target/ mount")
9
+ .description("Wipe the generated .livemark/.serve/, .build/ and .cache/")
10
10
  .action(async () => {
11
11
  const config = await loadConfig();
12
- const targetDir = clearTarget(config.configPath);
13
- console.log(`Cleared ${pc.dim(targetDir)}`);
12
+ for (const targetDir of clearTarget(config.configPath)) {
13
+ console.log(`Cleared ${pc.dim(targetDir)}`);
14
+ }
14
15
  });
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvY2xlYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUV4RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdEMsV0FBVyxDQUFDLDZDQUE2QyxDQUFDO0tBQzFELE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFBO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzdDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHBjIGZyb20gXCJwaWNvY29sb3JzXCJcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYWN0aW9ucy9jb25maWcvbG9hZC50c1wiXG5pbXBvcnQgeyBjbGVhclRhcmdldCB9IGZyb20gXCIuLi9hY3Rpb25zL3RhcmdldC9jbGVhci50c1wiXG5cbi8qKlxuICogV2lwZSB0aGUgZ2VuZXJhdGVkIGAubGl2ZW1hcmsvLnRhcmdldC9gIG1vdW50LlxuICovXG5leHBvcnQgY29uc3QgY2xlYXIgPSBuZXcgQ29tbWFuZChcImNsZWFyXCIpXG4gIC5kZXNjcmlwdGlvbihcIldpcGUgdGhlIGdlbmVyYXRlZCAubGl2ZW1hcmsvLnRhcmdldC8gbW91bnRcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZygpXG4gICAgY29uc3QgdGFyZ2V0RGlyID0gY2xlYXJUYXJnZXQoY29uZmlnLmNvbmZpZ1BhdGgpXG4gICAgY29uc29sZS5sb2coYENsZWFyZWQgJHtwYy5kaW0odGFyZ2V0RGlyKX1gKVxuICB9KVxuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvY2xlYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUV4RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdEMsV0FBVyxDQUFDLDJEQUEyRCxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFBO0lBQ2pDLEtBQUssTUFBTSxTQUFTLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gXCIuLi9hY3Rpb25zL2NvbmZpZy9sb2FkLnRzXCJcbmltcG9ydCB7IGNsZWFyVGFyZ2V0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdGFyZ2V0L2NsZWFyLnRzXCJcblxuLyoqXG4gKiBXaXBlIHRoZSBnZW5lcmF0ZWQgYC5saXZlbWFyay8uc2VydmUvYCBhbmQgYC5saXZlbWFyay8uYnVpbGQvYCBtb3VudHMgYW5kIGAubGl2ZW1hcmsvLmNhY2hlL2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhciA9IG5ldyBDb21tYW5kKFwiY2xlYXJcIilcbiAgLmRlc2NyaXB0aW9uKFwiV2lwZSB0aGUgZ2VuZXJhdGVkIC5saXZlbWFyay8uc2VydmUvLCAuYnVpbGQvIGFuZCAuY2FjaGUvXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKVxuICAgIGZvciAoY29uc3QgdGFyZ2V0RGlyIG9mIGNsZWFyVGFyZ2V0KGNvbmZpZy5jb25maWdQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coYENsZWFyZWQgJHtwYy5kaW0odGFyZ2V0RGlyKX1gKVxuICAgIH1cbiAgfSlcbiJdfQ==
@@ -1,11 +1,11 @@
1
1
  import { describe, expect, it } from "vite-plus/test";
2
2
  import { excludeTailwindSources } from "./tailwind-sources.js";
3
- const targetDir = "/project/.livemark/.target";
3
+ const targetDir = "/project/.livemark/.serve";
4
4
  describe("excludeTailwindSources", () => {
5
5
  it("excludes the dependency link and the content cache from a Tailwind entry", () => {
6
6
  const css = `@import "tailwindcss";\n@import "./shape.css";`;
7
- expect(excludeTailwindSources({ css, targetDir })).toBe(`${css}\n@source not "/project/.livemark/.target/node_modules";\n` +
8
- `@source not "/project/.livemark/.target/.content-collections/cache";\n`);
7
+ expect(excludeTailwindSources({ css, targetDir })).toBe(`${css}\n@source not "/project/.livemark/.serve/node_modules";\n` +
8
+ `@source not "/project/.livemark/.serve/.content-collections/cache";\n`);
9
9
  });
10
10
  it("accepts single quotes, import options and a bare utilities layer", () => {
11
11
  for (const css of [
@@ -20,4 +20,4 @@ describe("excludeTailwindSources", () => {
20
20
  expect(excludeTailwindSources({ css: `@import "tailwindcss/theme";`, targetDir })).toBeUndefined();
21
21
  });
22
22
  });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtc291cmNlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFpbHdpbmQtc291cmNlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlELE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFBO0FBRTlDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtRQUNsRixNQUFNLEdBQUcsR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxHQUFHLDREQUE0RDtZQUNoRSx3RUFBd0UsQ0FDM0UsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtRQUMxRSxLQUFLLE1BQU0sR0FBRyxJQUFJO1lBQ2hCLHFDQUFxQztZQUNyQyxtREFBbUQ7U0FDcEQsRUFBRSxDQUFDO1lBQ0YsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDN0UsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUN4QyxNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDeEUsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNqQixNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsOEJBQThCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDM0UsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgZXhjbHVkZVRhaWx3aW5kU291cmNlcyB9IGZyb20gXCIuL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuXG5jb25zdCB0YXJnZXREaXIgPSBcIi9wcm9qZWN0Ly5saXZlbWFyay8udGFyZ2V0XCJcblxuZGVzY3JpYmUoXCJleGNsdWRlVGFpbHdpbmRTb3VyY2VzXCIsICgpID0+IHtcbiAgaXQoXCJleGNsdWRlcyB0aGUgZGVwZW5kZW5jeSBsaW5rIGFuZCB0aGUgY29udGVudCBjYWNoZSBmcm9tIGEgVGFpbHdpbmQgZW50cnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNzcyA9IGBAaW1wb3J0IFwidGFpbHdpbmRjc3NcIjtcXG5AaW1wb3J0IFwiLi9zaGFwZS5jc3NcIjtgXG4gICAgZXhwZWN0KGV4Y2x1ZGVUYWlsd2luZFNvdXJjZXMoeyBjc3MsIHRhcmdldERpciB9KSkudG9CZShcbiAgICAgIGAke2Nzc31cXG5Ac291cmNlIG5vdCBcIi9wcm9qZWN0Ly5saXZlbWFyay8udGFyZ2V0L25vZGVfbW9kdWxlc1wiO1xcbmAgK1xuICAgICAgICBgQHNvdXJjZSBub3QgXCIvcHJvamVjdC8ubGl2ZW1hcmsvLnRhcmdldC8uY29udGVudC1jb2xsZWN0aW9ucy9jYWNoZVwiO1xcbmAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiYWNjZXB0cyBzaW5nbGUgcXVvdGVzLCBpbXBvcnQgb3B0aW9ucyBhbmQgYSBiYXJlIHV0aWxpdGllcyBsYXllclwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjc3Mgb2YgW1xuICAgICAgYEBpbXBvcnQgJ3RhaWx3aW5kY3NzJyBzb3VyY2Uobm9uZSk7YCxcbiAgICAgIGBAaW1wb3J0IFwidGFpbHdpbmRjc3MvdXRpbGl0aWVzXCIgbGF5ZXIodXRpbGl0aWVzKTtgLFxuICAgIF0pIHtcbiAgICAgIGV4cGVjdChleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSkpLnRvQ29udGFpbihcIkBzb3VyY2Ugbm90XCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHN0eWxlc2hlZXRzIGFsb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzOiBgQGltcG9ydCBcInR3LWFuaW1hdGUtY3NzXCI7YCwgdGFyZ2V0RGlyIH0pLFxuICAgICkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgZXhjbHVkZVRhaWx3aW5kU291cmNlcyh7IGNzczogYEBpbXBvcnQgXCJ0YWlsd2luZGNzcy90aGVtZVwiO2AsIHRhcmdldERpciB9KSxcbiAgICApLnRvQmVVbmRlZmluZWQoKVxuICB9KVxufSlcbiJdfQ==
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtc291cmNlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFpbHdpbmQtc291cmNlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlELE1BQU0sU0FBUyxHQUFHLDJCQUEyQixDQUFBO0FBRTdDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtRQUNsRixNQUFNLEdBQUcsR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxHQUFHLDJEQUEyRDtZQUMvRCx1RUFBdUUsQ0FDMUUsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtRQUMxRSxLQUFLLE1BQU0sR0FBRyxJQUFJO1lBQ2hCLHFDQUFxQztZQUNyQyxtREFBbUQ7U0FDcEQsRUFBRSxDQUFDO1lBQ0YsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDN0UsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUN4QyxNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDeEUsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNqQixNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsOEJBQThCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDM0UsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgZXhjbHVkZVRhaWx3aW5kU291cmNlcyB9IGZyb20gXCIuL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuXG5jb25zdCB0YXJnZXREaXIgPSBcIi9wcm9qZWN0Ly5saXZlbWFyay8uc2VydmVcIlxuXG5kZXNjcmliZShcImV4Y2x1ZGVUYWlsd2luZFNvdXJjZXNcIiwgKCkgPT4ge1xuICBpdChcImV4Y2x1ZGVzIHRoZSBkZXBlbmRlbmN5IGxpbmsgYW5kIHRoZSBjb250ZW50IGNhY2hlIGZyb20gYSBUYWlsd2luZCBlbnRyeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3NzID0gYEBpbXBvcnQgXCJ0YWlsd2luZGNzc1wiO1xcbkBpbXBvcnQgXCIuL3NoYXBlLmNzc1wiO2BcbiAgICBleHBlY3QoZXhjbHVkZVRhaWx3aW5kU291cmNlcyh7IGNzcywgdGFyZ2V0RGlyIH0pKS50b0JlKFxuICAgICAgYCR7Y3NzfVxcbkBzb3VyY2Ugbm90IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZS9ub2RlX21vZHVsZXNcIjtcXG5gICtcbiAgICAgICAgYEBzb3VyY2Ugbm90IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZS8uY29udGVudC1jb2xsZWN0aW9ucy9jYWNoZVwiO1xcbmAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiYWNjZXB0cyBzaW5nbGUgcXVvdGVzLCBpbXBvcnQgb3B0aW9ucyBhbmQgYSBiYXJlIHV0aWxpdGllcyBsYXllclwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjc3Mgb2YgW1xuICAgICAgYEBpbXBvcnQgJ3RhaWx3aW5kY3NzJyBzb3VyY2Uobm9uZSk7YCxcbiAgICAgIGBAaW1wb3J0IFwidGFpbHdpbmRjc3MvdXRpbGl0aWVzXCIgbGF5ZXIodXRpbGl0aWVzKTtgLFxuICAgIF0pIHtcbiAgICAgIGV4cGVjdChleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSkpLnRvQ29udGFpbihcIkBzb3VyY2Ugbm90XCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHN0eWxlc2hlZXRzIGFsb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzOiBgQGltcG9ydCBcInR3LWFuaW1hdGUtY3NzXCI7YCwgdGFyZ2V0RGlyIH0pLFxuICAgICkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgZXhjbHVkZVRhaWx3aW5kU291cmNlcyh7IGNzczogYEBpbXBvcnQgXCJ0YWlsd2luZGNzcy90aGVtZVwiO2AsIHRhcmdldERpciB9KSxcbiAgICApLnRvQmVVbmRlZmluZWQoKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export declare function removeTargetDir(targetDir: string): void;
2
+ export declare function cacheDirFor(configPath: string): string;
@@ -0,0 +1,11 @@
1
+ import { rmSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ export function removeTargetDir(targetDir) {
4
+ // Unlink the dependency link first so the recursive remove cannot reach the store.
5
+ rmSync(join(targetDir, "node_modules"), { force: true });
6
+ rmSync(targetDir, { recursive: true, force: true });
7
+ }
8
+ export function cacheDirFor(configPath) {
9
+ return join(dirname(configPath), ".livemark", ".cache");
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWRpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3RhcmdldC1kaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV6QyxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQWlCO0lBQy9DLG1GQUFtRjtJQUNuRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFVBQWtCO0lBQzVDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhcmdldERpcih0YXJnZXREaXI6IHN0cmluZykge1xuICAvLyBVbmxpbmsgdGhlIGRlcGVuZGVuY3kgbGluayBmaXJzdCBzbyB0aGUgcmVjdXJzaXZlIHJlbW92ZSBjYW5ub3QgcmVhY2ggdGhlIHN0b3JlLlxuICBybVN5bmMoam9pbih0YXJnZXREaXIsIFwibm9kZV9tb2R1bGVzXCIpLCB7IGZvcmNlOiB0cnVlIH0pXG4gIHJtU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVEaXJGb3IoY29uZmlnUGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBqb2luKGRpcm5hbWUoY29uZmlnUGF0aCksIFwiLmxpdmVtYXJrXCIsIFwiLmNhY2hlXCIpXG59XG4iXX0=
@@ -2,7 +2,7 @@ import { join } from "node:path";
2
2
  import { describe, expect, it } from "vite-plus/test";
3
3
  import packageJson from "../../package.json" with { type: "json" };
4
4
  import { resolveTargetExport } from "./target-export.js";
5
- const targetDir = "/project/.livemark/.target";
5
+ const targetDir = "/project/.livemark/.serve";
6
6
  function resolveId(id) {
7
7
  return resolveTargetExport({ id, targetDir, exports: packageJson.exports });
8
8
  }
@@ -22,4 +22,4 @@ describe("resolveTargetExport", () => {
22
22
  expect(resolveId("react")).toBeUndefined();
23
23
  });
24
24
  });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWV4cG9ydC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFyZ2V0LWV4cG9ydC51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFeEQsTUFBTSxTQUFTLEdBQUcsNEJBQTRCLENBQUE7QUFFOUMsU0FBUyxTQUFTLENBQUMsRUFBVTtJQUMzQixPQUFPLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtRQUN6RCxNQUFNLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FDekMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUN2QyxDQUFBO1FBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBQ3JGLE1BQU0sQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUN0QyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FDL0MsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUN2QyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzVDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgcGFja2FnZUpzb24gZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9XG5pbXBvcnQgeyByZXNvbHZlVGFyZ2V0RXhwb3J0IH0gZnJvbSBcIi4vdGFyZ2V0LWV4cG9ydC50c1wiXG5cbmNvbnN0IHRhcmdldERpciA9IFwiL3Byb2plY3QvLmxpdmVtYXJrLy50YXJnZXRcIlxuXG5mdW5jdGlvbiByZXNvbHZlSWQoaWQ6IHN0cmluZykge1xuICByZXR1cm4gcmVzb2x2ZVRhcmdldEV4cG9ydCh7IGlkLCB0YXJnZXREaXIsIGV4cG9ydHM6IHBhY2thZ2VKc29uLmV4cG9ydHMgfSlcbn1cblxuZGVzY3JpYmUoXCJyZXNvbHZlVGFyZ2V0RXhwb3J0XCIsICgpID0+IHtcbiAgaXQoXCJtYXBzIGVhY2ggc291cmNlIHN1YnBhdGggZXhwb3J0IGludG8gdGhlIHRhcmdldFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlc29sdmVJZChcImxpdmVtYXJrL2NvbXBvbmVudHMvRm9vdGVyXCIpKS50b0JlKFxuICAgICAgam9pbih0YXJnZXREaXIsIFwiY29tcG9uZW50cy9Gb290ZXIudHN4XCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvZWxlbWVudHMvYnV0dG9uXCIpKS50b0JlKFxuICAgICAgam9pbih0YXJnZXREaXIsIFwiZWxlbWVudHMvYnV0dG9uLnRzeFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc29sdmVJZChcImxpdmVtYXJrL2hvb2tzL2luLXZpZXdcIikpLnRvQmUoam9pbih0YXJnZXREaXIsIFwiaG9va3MvaW4tdmlldy50c1wiKSlcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvc3R5bGVzL2dlbmVyYWxcIikpLnRvQmUoXG4gICAgICBqb2luKHRhcmdldERpciwgXCJzdHlsZXMvZ2VuZXJhbC5jc3NcIiksXG4gICAgKVxuICB9KVxuXG4gIGl0KFwia2VlcHMgdGhlIHF1ZXJ5XCIsICgpID0+IHtcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvc3R5bGVzL2dlbmVyYWw/dXJsXCIpKS50b0JlKFxuICAgICAgYCR7am9pbih0YXJnZXREaXIsIFwic3R5bGVzL2dlbmVyYWwuY3NzXCIpfT91cmxgLFxuICAgIClcbiAgfSlcblxuICBpdChcImxlYXZlcyBvdGhlciBzcGVjaWZpZXJzIGFsb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmtcIikpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay91bmtub3duL3RoaW5nXCIpKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwicmVhY3RcIikpLnRvQmVVbmRlZmluZWQoKVxuICB9KVxufSlcbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWV4cG9ydC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFyZ2V0LWV4cG9ydC51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFeEQsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUE7QUFFN0MsU0FBUyxTQUFTLENBQUMsRUFBVTtJQUMzQixPQUFPLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtRQUN6RCxNQUFNLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FDekMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUN2QyxDQUFBO1FBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBQ3JGLE1BQU0sQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUN0QyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FDL0MsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUN2QyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzVDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgcGFja2FnZUpzb24gZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9XG5pbXBvcnQgeyByZXNvbHZlVGFyZ2V0RXhwb3J0IH0gZnJvbSBcIi4vdGFyZ2V0LWV4cG9ydC50c1wiXG5cbmNvbnN0IHRhcmdldERpciA9IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZVwiXG5cbmZ1bmN0aW9uIHJlc29sdmVJZChpZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KVxufVxuXG5kZXNjcmliZShcInJlc29sdmVUYXJnZXRFeHBvcnRcIiwgKCkgPT4ge1xuICBpdChcIm1hcHMgZWFjaCBzb3VyY2Ugc3VicGF0aCBleHBvcnQgaW50byB0aGUgdGFyZ2V0XCIsICgpID0+IHtcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvY29tcG9uZW50cy9Gb290ZXJcIikpLnRvQmUoXG4gICAgICBqb2luKHRhcmdldERpciwgXCJjb21wb25lbnRzL0Zvb3Rlci50c3hcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9lbGVtZW50cy9idXR0b25cIikpLnRvQmUoXG4gICAgICBqb2luKHRhcmdldERpciwgXCJlbGVtZW50cy9idXR0b24udHN4XCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvaG9va3MvaW4tdmlld1wiKSkudG9CZShqb2luKHRhcmdldERpciwgXCJob29rcy9pbi12aWV3LnRzXCIpKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9zdHlsZXMvZ2VuZXJhbFwiKSkudG9CZShcbiAgICAgIGpvaW4odGFyZ2V0RGlyLCBcInN0eWxlcy9nZW5lcmFsLmNzc1wiKSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJrZWVwcyB0aGUgcXVlcnlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9zdHlsZXMvZ2VuZXJhbD91cmxcIikpLnRvQmUoXG4gICAgICBgJHtqb2luKHRhcmdldERpciwgXCJzdHlsZXMvZ2VuZXJhbC5jc3NcIil9P3VybGAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHNwZWNpZmllcnMgYWxvbmVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFya1wiKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc29sdmVJZChcImxpdmVtYXJrL3Vua25vd24vdGhpbmdcIikpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJyZWFjdFwiKSkudG9CZVVuZGVmaW5lZCgpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,7 @@
1
+ /** Run keyed async tasks one at a time; a key enqueued again before its task
2
+ * starts replaces it, so a burst of events for one file costs one run. */
3
+ export declare function createTaskQueue(props: {
4
+ onError: (error: unknown) => void;
5
+ }): {
6
+ enqueue(key: string, task: () => Promise<unknown>): Promise<void>;
7
+ };
@@ -0,0 +1,28 @@
1
+ /** Run keyed async tasks one at a time; a key enqueued again before its task
2
+ * starts replaces it, so a burst of events for one file costs one run. */
3
+ export function createTaskQueue(props) {
4
+ const pending = new Map();
5
+ let draining;
6
+ return {
7
+ enqueue(key, task) {
8
+ pending.set(key, task);
9
+ draining ??= drain();
10
+ return draining;
11
+ },
12
+ };
13
+ async function drain() {
14
+ // A Map iterator also visits entries set during iteration, which is what
15
+ // picks up keys enqueued while a task runs.
16
+ for (const [key, task] of pending) {
17
+ pending.delete(key);
18
+ try {
19
+ await task();
20
+ }
21
+ catch (error) {
22
+ props.onError(error);
23
+ }
24
+ }
25
+ draining = undefined;
26
+ }
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3Rhc2stcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7MkVBQzJFO0FBQzNFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBNEM7SUFDMUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUE7SUFDekQsSUFBSSxRQUFtQyxDQUFBO0lBRXZDLE9BQU87UUFDTCxPQUFPLENBQUMsR0FBVyxFQUFFLElBQTRCO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3RCLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQTtZQUNwQixPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO0tBQ0YsQ0FBQTtJQUVELEtBQUssVUFBVSxLQUFLO1FBQ2xCLHlFQUF5RTtRQUN6RSw0Q0FBNEM7UUFDNUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxFQUFFLENBQUE7WUFDZCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQ0QsUUFBUSxHQUFHLFNBQVMsQ0FBQTtJQUN0QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBSdW4ga2V5ZWQgYXN5bmMgdGFza3Mgb25lIGF0IGEgdGltZTsgYSBrZXkgZW5xdWV1ZWQgYWdhaW4gYmVmb3JlIGl0cyB0YXNrXG4gKiAgc3RhcnRzIHJlcGxhY2VzIGl0LCBzbyBhIGJ1cnN0IG9mIGV2ZW50cyBmb3Igb25lIGZpbGUgY29zdHMgb25lIHJ1bi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXNrUXVldWUocHJvcHM6IHsgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkIH0pIHtcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQcm9taXNlPHVua25vd24+PigpXG4gIGxldCBkcmFpbmluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZFxuXG4gIHJldHVybiB7XG4gICAgZW5xdWV1ZShrZXk6IHN0cmluZywgdGFzazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikge1xuICAgICAgcGVuZGluZy5zZXQoa2V5LCB0YXNrKVxuICAgICAgZHJhaW5pbmcgPz89IGRyYWluKClcbiAgICAgIHJldHVybiBkcmFpbmluZ1xuICAgIH0sXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICAvLyBBIE1hcCBpdGVyYXRvciBhbHNvIHZpc2l0cyBlbnRyaWVzIHNldCBkdXJpbmcgaXRlcmF0aW9uLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gcGlja3MgdXAga2V5cyBlbnF1ZXVlZCB3aGlsZSBhIHRhc2sgcnVucy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHRhc2tdIG9mIHBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcuZGVsZXRlKGtleSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRhc2soKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcHJvcHMub25FcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgZHJhaW5pbmcgPSB1bmRlZmluZWRcbiAgfVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { describe, expect, it } from "vite-plus/test";
2
+ import { createTaskQueue } from "./task-queue.js";
3
+ describe("createTaskQueue", () => {
4
+ it("runs one task at a time", async () => {
5
+ const queue = createTaskQueue({ onError: () => { } });
6
+ const log = [];
7
+ const task = (name, ms) => async () => {
8
+ log.push(`start ${name}`);
9
+ await new Promise(resolve => setTimeout(resolve, ms));
10
+ log.push(`end ${name}`);
11
+ };
12
+ queue.enqueue("a", task("a", 30));
13
+ await queue.enqueue("b", task("b", 1));
14
+ expect(log).toEqual(["start a", "end a", "start b", "end b"]);
15
+ });
16
+ it("collapses a key enqueued again before it starts", async () => {
17
+ const queue = createTaskQueue({ onError: () => { } });
18
+ const runs = [];
19
+ queue.enqueue("first", async () => runs.push("first"));
20
+ queue.enqueue("file", async () => runs.push("stale"));
21
+ await queue.enqueue("file", async () => runs.push("latest"));
22
+ expect(runs).toEqual(["first", "latest"]);
23
+ });
24
+ it("reruns a key enqueued while it is running", async () => {
25
+ const queue = createTaskQueue({ onError: () => { } });
26
+ const runs = [];
27
+ let release = () => { };
28
+ queue.enqueue("file", async () => {
29
+ runs.push(1);
30
+ await new Promise(resolve => (release = resolve));
31
+ });
32
+ const done = queue.enqueue("file", async () => runs.push(2));
33
+ release();
34
+ await done;
35
+ expect(runs).toEqual([1, 2]);
36
+ });
37
+ it("reports a failed task and keeps draining", async () => {
38
+ const errors = [];
39
+ const queue = createTaskQueue({ onError: error => errors.push(error) });
40
+ const runs = [];
41
+ queue.enqueue("a", async () => {
42
+ throw new Error("boom");
43
+ });
44
+ await queue.enqueue("b", async () => runs.push("b"));
45
+ expect(errors).toHaveLength(1);
46
+ expect(runs).toEqual(["b"]);
47
+ });
48
+ it("starts a fresh drain after the previous one finished", async () => {
49
+ const queue = createTaskQueue({ onError: () => { } });
50
+ const runs = [];
51
+ await queue.enqueue("a", async () => runs.push("a"));
52
+ await queue.enqueue("a", async () => runs.push("again"));
53
+ expect(runs).toEqual(["a", "again"]);
54
+ });
55
+ });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1xdWV1ZS51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFzay1xdWV1ZS51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUVqRCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUE7UUFDeEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN6QixNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pCLENBQUMsQ0FBQTtRQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNqQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxD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QUFDLENBQUMsQ0FBQTtJQUM3QixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUE7UUFDekIsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgY3JlYXRlVGFza1F1ZXVlIH0gZnJvbSBcIi4vdGFzay1xdWV1ZS50c1wiXG5cbmRlc2NyaWJlKFwiY3JlYXRlVGFza1F1ZXVlXCIsICgpID0+IHtcbiAgaXQoXCJydW5zIG9uZSB0YXNrIGF0IGEgdGltZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcXVldWUgPSBjcmVhdGVUYXNrUXVldWUoeyBvbkVycm9yOiAoKSA9PiB7fSB9KVxuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IHRhc2sgPSAobmFtZTogc3RyaW5nLCBtczogbnVtYmVyKSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICBsb2cucHVzaChgc3RhcnQgJHtuYW1lfWApXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICAgICAgbG9nLnB1c2goYGVuZCAke25hbWV9YClcbiAgICB9XG4gICAgcXVldWUuZW5xdWV1ZShcImFcIiwgdGFzayhcImFcIiwgMzApKVxuICAgIGF3YWl0IHF1ZXVlLmVucXVldWUoXCJiXCIsIHRhc2soXCJiXCIsIDEpKVxuICAgIGV4cGVjdChsb2cpLnRvRXF1YWwoW1wic3RhcnQgYVwiLCBcImVuZCBhXCIsIFwic3RhcnQgYlwiLCBcImVuZCBiXCJdKVxuICB9KVxuXG4gIGl0KFwiY29sbGFwc2VzIGEga2V5IGVucXVldWVkIGFnYWluIGJlZm9yZSBpdCBzdGFydHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXVlID0gY3JlYXRlVGFza1F1ZXVlKHsgb25FcnJvcjogKCkgPT4ge30gfSlcbiAgICBjb25zdCBydW5zOiBzdHJpbmdbXSA9IFtdXG4gICAgcXVldWUuZW5xdWV1ZShcImZpcnN0XCIsIGFzeW5jICgpID0+IHJ1bnMucHVzaChcImZpcnN0XCIpKVxuICAgIHF1ZXVlLmVucXVldWUoXCJmaWxlXCIsIGFzeW5jICgpID0+IHJ1bnMucHVzaChcInN0YWxlXCIpKVxuICAgIGF3YWl0IHF1ZXVlLmVucXVldWUoXCJmaWxlXCIsIGFzeW5jICgpID0+IHJ1bnMucHVzaChcImxhdGVzdFwiKSlcbiAgICBleHBlY3QocnVucykudG9FcXVhbChbXCJmaXJzdFwiLCBcImxhdGVzdFwiXSlcbiAgfSlcblxuICBpdChcInJlcnVucyBhIGtleSBlbnF1ZXVlZCB3aGlsZSBpdCBpcyBydW5uaW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBxdWV1ZSA9IGNyZWF0ZVRhc2tRdWV1ZSh7IG9uRXJyb3I6ICgpID0+IHt9IH0pXG4gICAgY29uc3QgcnVuczogbnVtYmVyW10gPSBbXVxuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBxdWV1ZS5lbnF1ZXVlKFwiZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBydW5zLnB1c2goMSlcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gKHJlbGVhc2UgPSByZXNvbHZlKSlcbiAgICB9KVxuICAgIGNvbnN0IGRvbmUgPSBxdWV1ZS5lbnF1ZXVlKFwiZmlsZVwiLCBhc3luYyAoKSA9PiBydW5zLnB1c2goMikpXG4gICAgcmVsZWFzZSgpXG4gICAgYXdhaXQgZG9uZVxuICAgIGV4cGVjdChydW5zKS50b0VxdWFsKFsxLCAyXSlcbiAgfSlcblxuICBpdChcInJlcG9ydHMgYSBmYWlsZWQgdGFzayBhbmQga2VlcHMgZHJhaW5pbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW11cbiAgICBjb25zdCBxdWV1ZSA9IGNyZWF0ZVRhc2tRdWV1ZSh7IG9uRXJyb3I6IGVycm9yID0+IGVycm9ycy5wdXNoKGVycm9yKSB9KVxuICAgIGNvbnN0IHJ1bnM6IHN0cmluZ1tdID0gW11cbiAgICBxdWV1ZS5lbnF1ZXVlKFwiYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJib29tXCIpXG4gICAgfSlcbiAgICBhd2FpdCBxdWV1ZS5lbnF1ZXVlKFwiYlwiLCBhc3luYyAoKSA9PiBydW5zLnB1c2goXCJiXCIpKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChydW5zKS50b0VxdWFsKFtcImJcIl0pXG4gIH0pXG5cbiAgaXQoXCJzdGFydHMgYSBmcmVzaCBkcmFpbiBhZnRlciB0aGUgcHJldmlvdXMgb25lIGZpbmlzaGVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBxdWV1ZSA9IGNyZWF0ZVRhc2tRdWV1ZSh7IG9uRXJyb3I6ICgpID0+IHt9IH0pXG4gICAgY29uc3QgcnVuczogc3RyaW5nW10gPSBbXVxuICAgIGF3YWl0IHF1ZXVlLmVucXVldWUoXCJhXCIsIGFzeW5jICgpID0+IHJ1bnMucHVzaChcImFcIikpXG4gICAgYXdhaXQgcXVldWUuZW5xdWV1ZShcImFcIiwgYXN5bmMgKCkgPT4gcnVucy5wdXNoKFwiYWdhaW5cIikpXG4gICAgZXhwZWN0KHJ1bnMpLnRvRXF1YWwoW1wiYVwiLCBcImFnYWluXCJdKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import type { Plugin } from "vite";
2
+ export interface ContentOptions {
3
+ configPath: string;
4
+ contentDir: string;
5
+ }
6
+ /** Build the content collections and rebuild them on edits, one build at a time:
7
+ * `@content-collections/vite` builds per file event, a save fires two, and their
8
+ * overlapping writes tore `allArticles.js` so every request failed. */
9
+ export declare function content(opts: ContentOptions): Plugin;
@@ -0,0 +1,60 @@
1
+ import { existsSync, watch } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { createBuilder } from "@content-collections/core";
4
+ import { configureLogging } from "@content-collections/integrations";
5
+ import { createTaskQueue } from "../helpers/task-queue.js";
6
+ const IGNORED_PATHS = /(^|[/\\])(node_modules|\.[^/\\]+)([/\\]|$)/;
7
+ /** Build the content collections and rebuild them on edits, one build at a time:
8
+ * `@content-collections/vite` builds per file event, a save fires two, and their
9
+ * overlapping writes tore `allArticles.js` so every request failed. */
10
+ export function content(opts) {
11
+ const queue = createTaskQueue({ onError: error => console.error(error) });
12
+ let builder;
13
+ let initialBuild;
14
+ let watcher;
15
+ return {
16
+ name: "livemark:content",
17
+ config(config) {
18
+ const configPath = resolve(config.root ?? process.cwd(), opts.configPath);
19
+ const generated = join(dirname(configPath), ".content-collections", "generated");
20
+ return {
21
+ optimizeDeps: { exclude: ["content-collections"] },
22
+ resolve: { alias: { "content-collections": generated } },
23
+ ...((config.server?.fs?.allow?.length ?? 0) > 0 && {
24
+ server: { fs: { allow: [generated] } },
25
+ }),
26
+ };
27
+ },
28
+ async configResolved(config) {
29
+ builder = await createBuilder(resolve(config.root, opts.configPath));
30
+ configureLogging(builder);
31
+ },
32
+ buildStart() {
33
+ const current = builder;
34
+ if (!current)
35
+ return;
36
+ // Once, not per environment, and through the queue so an edit landing
37
+ // before it cannot overlap it.
38
+ initialBuild ??= new Promise((resolve, reject) => {
39
+ queue.enqueue("build", () => current.build().then(resolve, reject));
40
+ });
41
+ return initialBuild;
42
+ },
43
+ configureServer() {
44
+ const current = builder;
45
+ if (!current)
46
+ return;
47
+ watcher = watch(opts.contentDir, { recursive: true, ignore: IGNORED_PATHS }, (_, filename) => {
48
+ if (!filename)
49
+ return;
50
+ const file = join(opts.contentDir, filename);
51
+ queue.enqueue(file, () => current.sync(existsSync(file) ? "update" : "delete", file));
52
+ });
53
+ },
54
+ closeBundle() {
55
+ watcher?.close();
56
+ watcher = undefined;
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL3BsdWdpbnMvdml0ZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFrQixNQUFNLFNBQVMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXBFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQVMxRCxNQUFNLGFBQWEsR0FBRyw0Q0FBNEMsQ0FBQTtBQUVsRTs7d0VBRXdFO0FBQ3hFLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBb0I7SUFDMUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDekUsSUFBSSxPQUE0QixDQUFBO0lBQ2hDLElBQUksWUFBdUMsQ0FBQTtJQUMzQyxJQUFJLE9BQThCLENBQUE7SUFDbEMsT0FBTztRQUNMLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsTUFBTSxDQUFDLE1BQU07WUFDWCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3pFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDaEYsT0FBTztnQkFDTCxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO2dCQUNsRCxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDeEQsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUk7b0JBQ2pELE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7aUJBQ3ZDLENBQUM7YUFDSCxDQUFBO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUN6QixPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7WUFDcEUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUNELFVBQVU7WUFDUixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUE7WUFDdkIsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTTtZQUNwQixzRUFBc0U7WUFDdEUsK0JBQStCO1lBQy9CLFlBQVksS0FBSyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUNyRSxDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sWUFBWSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxlQUFlO1lBQ2IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU07WUFDcEIsT0FBTyxHQUFHLEtBQUssQ0FDYixJQUFJLENBQUMsVUFBVSxFQUNmLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQzFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU07Z0JBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2dCQUM1QyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUMzRCxDQUFBO1lBQ0gsQ0FBQyxDQUNGLENBQUE7UUFDSCxDQUFDO1FBQ0QsV0FBVztZQUNULE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQTtZQUNoQixPQUFPLEdBQUcsU0FBUyxDQUFBO1FBQ3JCLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHdhdGNoLCB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGNyZWF0ZUJ1aWxkZXIgfSBmcm9tIFwiQGNvbnRlbnQtY29sbGVjdGlvbnMvY29yZVwiXG5pbXBvcnQgeyBjb25maWd1cmVMb2dnaW5nIH0gZnJvbSBcIkBjb250ZW50LWNvbGxlY3Rpb25zL2ludGVncmF0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IGNyZWF0ZVRhc2tRdWV1ZSB9IGZyb20gXCIuLi9oZWxwZXJzL3Rhc2stcXVldWUudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRPcHRpb25zIHtcbiAgY29uZmlnUGF0aDogc3RyaW5nXG4gIGNvbnRlbnREaXI6IHN0cmluZ1xufVxuXG50eXBlIEJ1aWxkZXIgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUJ1aWxkZXI+PlxuXG5jb25zdCBJR05PUkVEX1BBVEhTID0gLyhefFsvXFxcXF0pKG5vZGVfbW9kdWxlc3xcXC5bXi9cXFxcXSspKFsvXFxcXF18JCkvXG5cbi8qKiBCdWlsZCB0aGUgY29udGVudCBjb2xsZWN0aW9ucyBhbmQgcmVidWlsZCB0aGVtIG9uIGVkaXRzLCBvbmUgYnVpbGQgYXQgYSB0aW1lOlxuICogIGBAY29udGVudC1jb2xsZWN0aW9ucy92aXRlYCBidWlsZHMgcGVyIGZpbGUgZXZlbnQsIGEgc2F2ZSBmaXJlcyB0d28sIGFuZCB0aGVpclxuICogIG92ZXJsYXBwaW5nIHdyaXRlcyB0b3JlIGBhbGxBcnRpY2xlcy5qc2Agc28gZXZlcnkgcmVxdWVzdCBmYWlsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudChvcHRzOiBDb250ZW50T3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IHF1ZXVlID0gY3JlYXRlVGFza1F1ZXVlKHsgb25FcnJvcjogZXJyb3IgPT4gY29uc29sZS5lcnJvcihlcnJvcikgfSlcbiAgbGV0IGJ1aWxkZXI6IEJ1aWxkZXIgfCB1bmRlZmluZWRcbiAgbGV0IGluaXRpYWxCdWlsZDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZFxuICBsZXQgd2F0Y2hlcjogRlNXYXRjaGVyIHwgdW5kZWZpbmVkXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFyazpjb250ZW50XCIsXG4gICAgY29uZmlnKGNvbmZpZykge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUoY29uZmlnLnJvb3QgPz8gcHJvY2Vzcy5jd2QoKSwgb3B0cy5jb25maWdQYXRoKVxuICAgICAgY29uc3QgZ2VuZXJhdGVkID0gam9pbihkaXJuYW1lKGNvbmZpZ1BhdGgpLCBcIi5jb250ZW50LWNvbGxlY3Rpb25zXCIsIFwiZ2VuZXJhdGVkXCIpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcHRpbWl6ZURlcHM6IHsgZXhjbHVkZTogW1wiY29udGVudC1jb2xsZWN0aW9uc1wiXSB9LFxuICAgICAgICByZXNvbHZlOiB7IGFsaWFzOiB7IFwiY29udGVudC1jb2xsZWN0aW9uc1wiOiBnZW5lcmF0ZWQgfSB9LFxuICAgICAgICAuLi4oKGNvbmZpZy5zZXJ2ZXI/LmZzPy5hbGxvdz8ubGVuZ3RoID8/IDApID4gMCAmJiB7XG4gICAgICAgICAgc2VydmVyOiB7IGZzOiB7IGFsbG93OiBbZ2VuZXJhdGVkXSB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY29uZmlnUmVzb2x2ZWQoY29uZmlnKSB7XG4gICAgICBidWlsZGVyID0gYXdhaXQgY3JlYXRlQnVpbGRlcihyZXNvbHZlKGNvbmZpZy5yb290LCBvcHRzLmNvbmZpZ1BhdGgpKVxuICAgICAgY29uZmlndXJlTG9nZ2luZyhidWlsZGVyKVxuICAgIH0sXG4gICAgYnVpbGRTdGFydCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBidWlsZGVyXG4gICAgICBpZiAoIWN1cnJlbnQpIHJldHVyblxuICAgICAgLy8gT25jZSwgbm90IHBlciBlbnZpcm9ubWVudCwgYW5kIHRocm91Z2ggdGhlIHF1ZXVlIHNvIGFuIGVkaXQgbGFuZGluZ1xuICAgICAgLy8gYmVmb3JlIGl0IGNhbm5vdCBvdmVybGFwIGl0LlxuICAgICAgaW5pdGlhbEJ1aWxkID8/PSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHF1ZXVlLmVucXVldWUoXCJidWlsZFwiLCAoKSA9PiBjdXJyZW50LmJ1aWxkKCkudGhlbihyZXNvbHZlLCByZWplY3QpKVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbml0aWFsQnVpbGRcbiAgICB9LFxuICAgIGNvbmZpZ3VyZVNlcnZlcigpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBidWlsZGVyXG4gICAgICBpZiAoIWN1cnJlbnQpIHJldHVyblxuICAgICAgd2F0Y2hlciA9IHdhdGNoKFxuICAgICAgICBvcHRzLmNvbnRlbnREaXIsXG4gICAgICAgIHsgcmVjdXJzaXZlOiB0cnVlLCBpZ25vcmU6IElHTk9SRURfUEFUSFMgfSxcbiAgICAgICAgKF8sIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGpvaW4ob3B0cy5jb250ZW50RGlyLCBmaWxlbmFtZSlcbiAgICAgICAgICBxdWV1ZS5lbnF1ZXVlKGZpbGUsICgpID0+XG4gICAgICAgICAgICBjdXJyZW50LnN5bmMoZXhpc3RzU3luYyhmaWxlKSA/IFwidXBkYXRlXCIgOiBcImRlbGV0ZVwiLCBmaWxlKSxcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcbiAgICBjbG9zZUJ1bmRsZSgpIHtcbiAgICAgIHdhdGNoZXI/LmNsb3NlKClcbiAgICAgIHdhdGNoZXIgPSB1bmRlZmluZWRcbiAgICB9LFxuICB9XG59XG4iXX0=
@@ -3,7 +3,8 @@ import type { Config } from "../models/config.ts";
3
3
  export interface LivemarkOptions {
4
4
  config: Config;
5
5
  }
6
- /** Owns the project's `.livemark/.target/` mount: synthesizes it via
6
+ /** Owns the project's `.livemark/.serve/` mount (`.build/` when building, so a build
7
+ * never rewrites a running dev server's files): synthesizes it via
7
8
  * `buildTarget()`, returns the Vite config that anchors there, and
8
9
  * copies `.livemark/` edits (plus livemark's `source/` in its own dev)
9
10
  * into the target. Vite watches the target natively, so its own HMR
@@ -33,7 +33,8 @@ const LOCKFILES = [
33
33
  * or load it from disk". */
34
34
  const VIRTUAL_ID = "livemark:virtual";
35
35
  const VIRTUAL_RESOLVED_ID = `\0${VIRTUAL_ID}`;
36
- /** Owns the project's `.livemark/.target/` mount: synthesizes it via
36
+ /** Owns the project's `.livemark/.serve/` mount (`.build/` when building, so a build
37
+ * never rewrites a running dev server's files): synthesizes it via
37
38
  * `buildTarget()`, returns the Vite config that anchors there, and
38
39
  * copies `.livemark/` edits (plus livemark's `source/` in its own dev)
39
40
  * into the target. Vite watches the target natively, so its own HMR
@@ -49,6 +50,7 @@ export function livemark(opts) {
49
50
  targetDir = buildTarget({
50
51
  configPath: opts.config.configPath,
51
52
  sourceDir: SOURCE_DIR,
53
+ command: env.command === "build" || env.isPreview ? "build" : "serve",
52
54
  });
53
55
  const base = {
54
56
  root: targetDir,
@@ -132,14 +134,23 @@ export function livemark(opts) {
132
134
  }
133
135
  if (isWithin(file, targetDir) || isWithin(file, outDir))
134
136
  return;
135
- const overlayHit = matchPath(file, overridesRoot);
136
- if (overlayHit) {
137
- syncOverlay(overlayHit, kind, targetDir, overridesRoot);
138
- return;
137
+ // A watcher callback that throws kills the server, and a copy racing another
138
+ // writer of the target (an editor's atomic save, `livemark clear`) fails.
139
+ try {
140
+ const overlayHit = matchPath(file, overridesRoot);
141
+ if (overlayHit) {
142
+ syncOverlay(overlayHit, kind, targetDir, overridesRoot);
143
+ return;
144
+ }
145
+ const sourceHit = matchPath(file, SOURCE_DIR);
146
+ if (sourceHit && !sourceHit.rel.includes("routeTree.gen.ts")) {
147
+ syncSource(sourceHit, kind, targetDir, overridesRoot);
148
+ }
139
149
  }
140
- const sourceHit = matchPath(file, SOURCE_DIR);
141
- if (sourceHit && !sourceHit.rel.includes("routeTree.gen.ts")) {
142
- syncSource(sourceHit, kind, targetDir, overridesRoot);
150
+ catch (error) {
151
+ server.config.logger.error(`[livemark] failed to sync ${file}: ${error}`, {
152
+ error: error instanceof Error ? error : undefined,
153
+ });
143
154
  }
144
155
  }
145
156
  },
@@ -259,4 +270,4 @@ async function resolveViteOverride(vite, env) {
259
270
  function isObject(v) {
260
271
  return v !== null && typeof v === "object";
261
272
  }
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNsRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDcEUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFX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SUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDbEUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFDM0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ2hCLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDZixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7O3FDQUdxQztBQUNyQyxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLElBQWEsRUFDYixHQUFjO0lBRWQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUN0QixJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCBzdGF0U3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZywgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHsgY29sbGVjdExvY2FsSW1wb3J0cyB9IGZyb20gXCIuLi9oZWxwZXJzL2xvY2FsLWltcG9ydHMudHNcIlxuaW1wb3J0IHsgcmVuZGVySW5saW5lTWFya2Rvd24gfSBmcm9tIFwiLi4vaGVscGVycy9yZW5kZXItaW5saW5lLW1hcmtkb3duLnRzXCJcbmltcG9ydCB7IGV4Y2x1ZGVUYWlsd2luZFNvdXJjZXMgfSBmcm9tIFwiLi4vaGVscGVycy90YWlsd2luZC1zb3VyY2VzLnRzXCJcbmltcG9ydCB7IHJlc29sdmVUYXJnZXRFeHBvcnQgfSBmcm9tIFwiLi4vaGVscGVycy90YXJnZXQtZXhwb3J0LnRzXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgV2Vic2l0ZUNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vc2V0dGluZ3MudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVtYXJrT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbmNvbnN0IFNPVVJDRV9ESVIgPSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIilcbmNvbnN0IElTX0lOU1RBTExFRCA9IFNPVVJDRV9ESVIuaW5jbHVkZXMoYCR7c2VwfW5vZGVfbW9kdWxlcyR7c2VwfWApXG5jb25zdCBMT0NLRklMRVMgPSBbXG4gIFwicG5wbS1sb2NrLnlhbWxcIixcbiAgXCJwYWNrYWdlLWxvY2suanNvblwiLFxuICBcInlhcm4ubG9ja1wiLFxuICBcImJ1bi5sb2NrXCIsXG4gIFwiYnVuLmxvY2tiXCIsXG5dXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCkgYW5kIGBiYW5uZXJIdG1sYFxuICogIChgY29uZmlnLmJhbm5lcmAgcmVuZGVyZWQgZnJvbSBpbmxpbmUgTWFya2Rvd24gYXQgYnVpbGQgdGltZSk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwcm9qZWN0J3MgYC5saXZlbWFyay8udGFyZ2V0L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICBjb3BpZXMgYC5saXZlbWFyay9gIGVkaXRzIChwbHVzIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIGluIGl0cyBvd24gZGV2KVxuICogIGludG8gdGhlIHRhcmdldC4gVml0ZSB3YXRjaGVzIHRoZSB0YXJnZXQgbmF0aXZlbHksIHNvIGl0cyBvd24gSE1SXG4gKiAgZGVjaWRlcyBiZXR3ZWVuIEZhc3QgUmVmcmVzaCwgQ1NTIHVwZGF0ZXMgYW5kIGEgcGFnZSByZWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgY29uc3Qgb3V0RGlyID0gam9pbihvdmVycmlkZXNSb290LCBcImJ1aWxkXCIpXG4gIGxldCB0YXJnZXREaXIgPSBcIlwiXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgY29uZmlnKF8sIGVudikge1xuICAgICAgdGFyZ2V0RGlyID0gYnVpbGRUYXJnZXQoe1xuICAgICAgICBjb25maWdQYXRoOiBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICBzb3VyY2VEaXI6IFNPVVJDRV9ESVIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSByZXN0YXJ0cyBvbmx5IGZvciBpdHMgb3duIGNvbmZpZydzIGltcG9ydHM7IHRoZSBwcm9qZWN0IGNvbmZpZydzXG4gICAgICAvLyBpbXBvcnRzIGFuZCwgaW4gbGl2ZW1hcmsncyBvd24gZGV2LCB0aGUgY29udGVudC1jb2xsZWN0aW9ucyBjb25maWcnc1xuICAgICAgLy8gaW1wb3J0cyBuZWVkIGl0IHRvby4gQSByZXN0YXJ0IHJlYnVpbGRzIHRoZSB0YXJnZXQsIHNvIG5vIHN5bmMgaXMgbG9zdC5cbiAgICAgIGNvbnN0IHJlc3RhcnRGaWxlcyA9IG5ldyBTZXQoW1xuICAgICAgICBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICAuLi5vcHRzLmNvbmZpZy5jb25maWdEZXBlbmRlbmNpZXMsXG4gICAgICAgIC4uLihJU19JTlNUQUxMRURcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBjb2xsZWN0TG9jYWxJbXBvcnRzKGpvaW4oU09VUkNFX0RJUiwgXCJjb250ZW50LWNvbGxlY3Rpb25zLnRzXCIpKSksXG4gICAgICBdKVxuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbLi4ucmVzdGFydEZpbGVzLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmIChJU19JTlNUQUxMRUQpIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXIsIG9wdHMuY29uZmlnLnJvb3QpXG4gICAgICBlbHNlIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKHJlc3RhcnRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlIaXQgPSBtYXRjaFBhdGgoZmlsZSwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgaWYgKG92ZXJsYXlIaXQpIHtcbiAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgIGlmIChzb3VyY2VIaXQgJiYgIXNvdXJjZUhpdC5yZWwuaW5jbHVkZXMoXCJyb3V0ZVRyZWUuZ2VuLnRzXCIpKSB7XG4gICAgICAgICAgc3luY1NvdXJjZShzb3VyY2VIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxuaW50ZXJmYWNlIEhpdCB7XG4gIHJlbDogc3RyaW5nXG4gIGNhdGVnb3J5OiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsXG59XG5cbmZ1bmN0aW9uIG1hdGNoUGF0aChmaWxlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZyk6IEhpdCB8IG51bGwge1xuICBpZiAoIWlzV2l0aGluKGZpbGUsIHJvb3QpIHx8IGZpbGUgPT09IHJvb3QpIHJldHVybiBudWxsXG4gIGNvbnN0IHJlbCA9IGZpbGUuc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKVxuICByZXR1cm4geyByZWwsIGNhdGVnb3J5OiBjbGFzc2lmeShyZWwpIH1cbn1cblxuZnVuY3Rpb24gaXNXaXRoaW4oZmlsZTogc3RyaW5nLCBkaXI6IHN0cmluZykge1xuICByZXR1cm4gZmlsZSA9PT0gZGlyIHx8IGZpbGUuc3RhcnRzV2l0aChgJHtkaXJ9JHtzZXB9YClcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnkocmVsOiBzdHJpbmcpOiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsIHtcbiAgY29uc3QgW2hlYWRdID0gcmVsLnNwbGl0KHNlcClcbiAgaWYgKGhlYWQgJiYgRVNDQVBBQkxFX0ZPTERFUlMuaW5jbHVkZXMoaGVhZCkpIHJldHVybiBcImZvbGRlclwiXG4gIGlmIChFU0NBUEFCTEVfRklMRVMuaW5jbHVkZXMocmVsKSkgcmV0dXJuIFwiZmlsZVwiXG4gIC8vIE5vbi1lc2NhcGFibGUgc291cmNlIGZpbGVzIHN0aWxsIG5lZWQgdG8gZmxvdyBpbnRvIHRhcmdldCBkdXJpbmdcbiAgLy8gbGl2ZW1hcmsncyBvd24gZGV2IOKAlCB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBjYW5vbmljYWwgc291cmNlLlxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBzeW5jT3ZlcmxheShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICBpZiAoIWhpdC5jYXRlZ29yeSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIC8vIENvcHkgYSBmaWxlJ3MgZGVmYXVsdCBvdmVyIHRoZSBlc2NhcGUgaW4gb25lIHdyaXRlOiBhbiB1bmxpbmsgdGhlblxuICAgIC8vIGFuIGFkZCByZWFjaGVzIFZpdGUgYXMgdHdvIGV2ZW50cyBhbmQgY29zdHMgYSBwYWdlIHJlbG9hZC5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc291cmNlKSB8fCBzdGF0U3luYyhzb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb3ZlcmxheSA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbClcbiAgaWYgKGV4aXN0c1N5bmMob3ZlcmxheSkpIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbi8vIEEgcnVubmluZyBzZXJ2ZXIga2VlcHMgdGhlIGxpdmVtYXJrIGl0IHN0YXJ0ZWQgd2l0aDogYW4gaW4tcHJvY2VzcyByZXN0YXJ0IGNhbm5vdFxuLy8gcmVsb2FkIHRoZSBwYWNrYWdlJ3Mgb3duIG1vZHVsZXMsIHNvIGFuIHVwZ3JhZGUgaXMgcmVwb3J0ZWQgaW5zdGVhZC5cbmZ1bmN0aW9uIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIsIHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBwYWNrYWdlRGlyID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdClcbiAgaWYgKCFwYWNrYWdlRGlyKSByZXR1cm5cbiAgLy8gVml0ZSdzIHdhdGNoZXIgaWdub3JlcyBub2RlX21vZHVsZXMsIHNvIHRoZSBsb2NrZmlsZSBpcyB3aGF0IHNpZ25hbHMgYW4gaW5zdGFsbC5cbiAgY29uc3QgcHJvamVjdERpciA9IGRpcm5hbWUoZGlybmFtZShwYWNrYWdlRGlyKSlcbiAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpXG4gIGNvbnN0IHdhdGNoZWQgPSBMT0NLRklMRVMubWFwKG5hbWUgPT4gam9pbihwcm9qZWN0RGlyLCBuYW1lKSlcbiAgc2VydmVyLndhdGNoZXIuYWRkKHdhdGNoZWQpXG4gIGxldCB0aW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWRcbiAgc2VydmVyLndhdGNoZXIub24oXCJhbGxcIiwgKF8sIGZpbGUpID0+IHtcbiAgICBpZiAoIXdhdGNoZWQuaW5jbHVkZXMoZmlsZSkpIHJldHVyblxuICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAvLyBMZXQgdGhlIHBhY2thZ2UgbWFuYWdlciBmaW5pc2ggcmVsaW5raW5nIGFmdGVyIGl0IHdyaXRlcyB0aGUgbG9ja2ZpbGUuXG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlcG9ydFVwZ3JhZGUsIDEwMDApXG4gIH0pXG5cbiAgZnVuY3Rpb24gcmVwb3J0VXBncmFkZSgpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0KVxuICAgIGlmICghdmVyc2lvbiB8fCB2ZXJzaW9uID09PSBwYWNrYWdlSnNvbi52ZXJzaW9uKSByZXR1cm5cbiAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgYGxpdmVtYXJrICR7cGFja2FnZUpzb24udmVyc2lvbn0g4oaSICR7dmVyc2lvbn0gaW5zdGFsbGVkOyByZXN0YXJ0IHRoZSBkZXYgc2VydmVyIHRvIHVzZSBpdGAsXG4gICAgICB7IHRpbWVzdGFtcDogdHJ1ZSB9LFxuICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290OiBzdHJpbmcpIHtcbiAgZm9yIChsZXQgZGlyID0gcm9vdDsgOyBkaXIgPSBkaXJuYW1lKGRpcikpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gam9pbihkaXIsIFwibm9kZV9tb2R1bGVzXCIsIHBhY2thZ2VKc29uLm5hbWUpXG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZURpcikpIHJldHVybiBwYWNrYWdlRGlyXG4gICAgaWYgKGRpcm5hbWUoZGlyKSA9PT0gZGlyKSByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhtYW5pZmVzdCwgXCJ1dGY4XCIpKVxuICAgIHJldHVybiBpc09iamVjdChwYXJzZWQpICYmIHR5cGVvZiBwYXJzZWQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBwYXJzZWQudmVyc2lvblxuICAgICAgOiB1bmRlZmluZWRcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNsRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDcEUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFX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QyxDQUFDLElBQUksQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNwU3luYywgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBybVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgdHlwZSB7IENvbmZpZ0VudiwgUGx1Z2luLCBVc2VyQ29uZmlnIGFzIFZpdGVVc2VyQ29uZmlnLCBWaXRlRGV2U2VydmVyIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgbWVyZ2VDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgcGFja2FnZUpzb24gZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9XG5pbXBvcnQgeyBidWlsZFRhcmdldCB9IGZyb20gXCIuLi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1wiXG5pbXBvcnQgeyBjb2xsZWN0TG9jYWxJbXBvcnRzIH0gZnJvbSBcIi4uL2hlbHBlcnMvbG9jYWwtaW1wb3J0cy50c1wiXG5pbXBvcnQgeyByZW5kZXJJbmxpbmVNYXJrZG93biB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbmRlci1pbmxpbmUtbWFya2Rvd24udHNcIlxuaW1wb3J0IHsgZXhjbHVkZVRhaWx3aW5kU291cmNlcyB9IGZyb20gXCIuLi9oZWxwZXJzL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVRhcmdldEV4cG9ydCB9IGZyb20gXCIuLi9oZWxwZXJzL3RhcmdldC1leHBvcnQudHNcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBXZWJzaXRlQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZW1hcmtPcHRpb25zIHtcbiAgY29uZmlnOiBDb25maWdcbn1cblxuY29uc3QgU09VUkNFX0RJUiA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKVxuY29uc3QgSVNfSU5TVEFMTEVEID0gU09VUkNFX0RJUi5pbmNsdWRlcyhgJHtzZXB9bm9kZV9tb2R1bGVzJHtzZXB9YClcbmNvbnN0IExPQ0tGSUxFUyA9IFtcbiAgXCJwbnBtLWxvY2sueWFtbFwiLFxuICBcInBhY2thZ2UtbG9jay5qc29uXCIsXG4gIFwieWFybi5sb2NrXCIsXG4gIFwiYnVuLmxvY2tcIixcbiAgXCJidW4ubG9ja2JcIixcbl1cblxuLyoqIFNpbmdsZSB2aXJ0dWFsIG1vZHVsZSBleHBvc2luZyBsaXZlbWFyaydzIHJ1bnRpbWUgdmFsdWVzIHRvIGNvbnN1bWVyXG4gKiAgb3ZlcnJpZGUgZmlsZXMgdmlhIG5hbWVkIGV4cG9ydHM6XG4gKlxuICogICAgICBpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG4gKlxuICogIEN1cnJlbnRseSBleHBvcnRzIGBjb25maWdgICh2YWxpZGF0ZWQgYFdlYnNpdGVDb25maWdgKSBhbmQgYGJhbm5lckh0bWxgXG4gKiAgKGBjb25maWcuYmFubmVyYCByZW5kZXJlZCBmcm9tIGlubGluZSBNYXJrZG93biBhdCBidWlsZCB0aW1lKTsgZnV0dXJlXG4gKiAgYWRkaXRpb25zIChlLmcuIGBhcnRpY2xlc2AsIGBzZWN0aW9uc2ApIGxhbmQgaGVyZSBhcyBuZXcgbmFtZWRcbiAqICBleHBvcnRzIHdpdGhvdXQgY29uc3VtZXJzIGNoYW5naW5nIHRoZWlyIGltcG9ydCBzdGF0ZW1lbnRzLlxuICpcbiAqICBUaGUgYFxcMGAgcHJlZml4IG9uIHRoZSByZXNvbHZlZCBpZCBpcyBWaXRlJ3MgY29udmVudGlvbiB0byBzaWduYWxcbiAqICBcInRoaXMgaXMgYSB2aXJ0dWFsIG1vZHVsZSDigJQgbm8gb3RoZXIgcGx1Z2luIHNob3VsZCB0cnkgdG8gcmVzb2x2ZVxuICogIG9yIGxvYWQgaXQgZnJvbSBkaXNrXCIuICovXG5jb25zdCBWSVJUVUFMX0lEID0gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbmNvbnN0IFZJUlRVQUxfUkVTT0xWRURfSUQgPSBgXFwwJHtWSVJUVUFMX0lEfWBcblxuLyoqIE93bnMgdGhlIHByb2plY3QncyBgLmxpdmVtYXJrLy5zZXJ2ZS9gIG1vdW50IChgLmJ1aWxkL2Agd2hlbiBidWlsZGluZywgc28gYSBidWlsZFxuICogIG5ldmVyIHJld3JpdGVzIGEgcnVubmluZyBkZXYgc2VydmVyJ3MgZmlsZXMpOiBzeW50aGVzaXplcyBpdCB2aWFcbiAqICBgYnVpbGRUYXJnZXQoKWAsIHJldHVybnMgdGhlIFZpdGUgY29uZmlnIHRoYXQgYW5jaG9ycyB0aGVyZSwgYW5kXG4gKiAgY29waWVzIGAubGl2ZW1hcmsvYCBlZGl0cyAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpbiBpdHMgb3duIGRldilcbiAqICBpbnRvIHRoZSB0YXJnZXQuIFZpdGUgd2F0Y2hlcyB0aGUgdGFyZ2V0IG5hdGl2ZWx5LCBzbyBpdHMgb3duIEhNUlxuICogIGRlY2lkZXMgYmV0d2VlbiBGYXN0IFJlZnJlc2gsIENTUyB1cGRhdGVzIGFuZCBhIHBhZ2UgcmVsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IG91dERpciA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKVxuICBsZXQgdGFyZ2V0RGlyID0gXCJcIlxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcmtcIixcbiAgICBlbmZvcmNlOiBcInByZVwiLFxuICAgIGFzeW5jIGNvbmZpZyhfLCBlbnYpIHtcbiAgICAgIHRhcmdldERpciA9IGJ1aWxkVGFyZ2V0KHtcbiAgICAgICAgY29uZmlnUGF0aDogb3B0cy5jb25maWcuY29uZmlnUGF0aCxcbiAgICAgICAgc291cmNlRGlyOiBTT1VSQ0VfRElSLFxuICAgICAgICBjb21tYW5kOiBlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiIHx8IGVudi5pc1ByZXZpZXcgPyBcImJ1aWxkXCIgOiBcInNlcnZlXCIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSByZXN0YXJ0cyBvbmx5IGZvciBpdHMgb3duIGNvbmZpZydzIGltcG9ydHM7IHRoZSBwcm9qZWN0IGNvbmZpZydzXG4gICAgICAvLyBpbXBvcnRzIGFuZCwgaW4gbGl2ZW1hcmsncyBvd24gZGV2LCB0aGUgY29udGVudC1jb2xsZWN0aW9ucyBjb25maWcnc1xuICAgICAgLy8gaW1wb3J0cyBuZWVkIGl0IHRvby4gQSByZXN0YXJ0IHJlYnVpbGRzIHRoZSB0YXJnZXQsIHNvIG5vIHN5bmMgaXMgbG9zdC5cbiAgICAgIGNvbnN0IHJlc3RhcnRGaWxlcyA9IG5ldyBTZXQoW1xuICAgICAgICBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICAuLi5vcHRzLmNvbmZpZy5jb25maWdEZXBlbmRlbmNpZXMsXG4gICAgICAgIC4uLihJU19JTlNUQUxMRURcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBjb2xsZWN0TG9jYWxJbXBvcnRzKGpvaW4oU09VUkNFX0RJUiwgXCJjb250ZW50LWNvbGxlY3Rpb25zLnRzXCIpKSksXG4gICAgICBdKVxuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbLi4ucmVzdGFydEZpbGVzLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmIChJU19JTlNUQUxMRUQpIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXIsIG9wdHMuY29uZmlnLnJvb3QpXG4gICAgICBlbHNlIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKHJlc3RhcnRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIC8vIEEgd2F0Y2hlciBjYWxsYmFjayB0aGF0IHRocm93cyBraWxscyB0aGUgc2VydmVyLCBhbmQgYSBjb3B5IHJhY2luZyBhbm90aGVyXG4gICAgICAgIC8vIHdyaXRlciBvZiB0aGUgdGFyZ2V0IChhbiBlZGl0b3IncyBhdG9taWMgc2F2ZSwgYGxpdmVtYXJrIGNsZWFyYCkgZmFpbHMuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3ZlcmxheUhpdCA9IG1hdGNoUGF0aChmaWxlLCBvdmVycmlkZXNSb290KVxuICAgICAgICAgIGlmIChvdmVybGF5SGl0KSB7XG4gICAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgICAgaWYgKHNvdXJjZUhpdCAmJiAhc291cmNlSGl0LnJlbC5pbmNsdWRlcyhcInJvdXRlVHJlZS5nZW4udHNcIikpIHtcbiAgICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmVycm9yKGBbbGl2ZW1hcmtdIGZhaWxlZCB0byBzeW5jICR7ZmlsZX06ICR7ZXJyb3J9YCwge1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5pbnRlcmZhY2UgSGl0IHtcbiAgcmVsOiBzdHJpbmdcbiAgY2F0ZWdvcnk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGxcbn1cblxuZnVuY3Rpb24gbWF0Y2hQYXRoKGZpbGU6IHN0cmluZywgcm9vdDogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGlmICghaXNXaXRoaW4oZmlsZSwgcm9vdCkgfHwgZmlsZSA9PT0gcm9vdCkgcmV0dXJuIG51bGxcbiAgY29uc3QgcmVsID0gZmlsZS5zbGljZShyb290Lmxlbmd0aCArIHNlcC5sZW5ndGgpXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBpc1dpdGhpbihmaWxlOiBzdHJpbmcsIGRpcjogc3RyaW5nKSB7XG4gIHJldHVybiBmaWxlID09PSBkaXIgfHwgZmlsZS5zdGFydHNXaXRoKGAke2Rpcn0ke3NlcH1gKVxufVxuXG5mdW5jdGlvbiBjbGFzc2lmeShyZWw6IHN0cmluZyk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGwge1xuICBjb25zdCBbaGVhZF0gPSByZWwuc3BsaXQoc2VwKVxuICBpZiAoaGVhZCAmJiBFU0NBUEFCTEVfRk9MREVSUy5pbmNsdWRlcyhoZWFkKSkgcmV0dXJuIFwiZm9sZGVyXCJcbiAgaWYgKEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWwpKSByZXR1cm4gXCJmaWxlXCJcbiAgLy8gTm9uLWVzY2FwYWJsZSBzb3VyY2UgZmlsZXMgc3RpbGwgbmVlZCB0byBmbG93IGludG8gdGFyZ2V0IGR1cmluZ1xuICAvLyBsaXZlbWFyaydzIG93biBkZXYg4oCUIHRoZSB1c2VyIGlzIGVkaXRpbmcgdGhlIGNhbm9uaWNhbCBzb3VyY2UuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHN5bmNPdmVybGF5KFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIGlmICghaGl0LmNhdGVnb3J5KSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgLy8gQ29weSBhIGZpbGUncyBkZWZhdWx0IG92ZXIgdGhlIGVzY2FwZSBpbiBvbmUgd3JpdGU6IGFuIHVubGluayB0aGVuXG4gICAgLy8gYW4gYWRkIHJlYWNoZXMgVml0ZSBhcyB0d28gZXZlbnRzIGFuZCBjb3N0cyBhIHBhZ2UgcmVsb2FkLlxuICAgIGlmICghZXhpc3RzU3luYyhzb3VyY2UpIHx8IHN0YXRTeW5jKHNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvdmVybGF5ID0gam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKVxuICBpZiAoZXhpc3RzU3luYyhvdmVybGF5KSkgY3BTeW5jKG92ZXJsYXksIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5mdW5jdGlvbiBzeW5jU291cmNlKFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIC8vIElmIHRoZSBjb25zdW1lciBoYXMgYW4gb3ZlcmxheSBmb3IgdGhpcyBmaWxlIChhbmQgaXQncyBlc2NhcGFibGUpLFxuICAvLyB0aGUgb3ZlcmxheSB3aW5zIOKAlCBpZ25vcmUgc291cmNlIGNoYW5nZXMuXG4gIGlmIChoaXQuY2F0ZWdvcnkgJiYgZXhpc3RzU3luYyhqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpKSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuLy8gQSBydW5uaW5nIHNlcnZlciBrZWVwcyB0aGUgbGl2ZW1hcmsgaXQgc3RhcnRlZCB3aXRoOiBhbiBpbi1wcm9jZXNzIHJlc3RhcnQgY2Fubm90XG4vLyByZWxvYWQgdGhlIHBhY2thZ2UncyBvd24gbW9kdWxlcywgc28gYW4gdXBncmFkZSBpcyByZXBvcnRlZCBpbnN0ZWFkLlxuZnVuY3Rpb24gd2F0Y2hJbnN0YWxsZWRWZXJzaW9uKHNlcnZlcjogVml0ZURldlNlcnZlciwgcm9vdDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhY2thZ2VEaXIgPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290KVxuICBpZiAoIXBhY2thZ2VEaXIpIHJldHVyblxuICAvLyBWaXRlJ3Mgd2F0Y2hlciBpZ25vcmVzIG5vZGVfbW9kdWxlcywgc28gdGhlIGxvY2tmaWxlIGlzIHdoYXQgc2lnbmFscyBhbiBpbnN0YWxsLlxuICBjb25zdCBwcm9qZWN0RGlyID0gZGlybmFtZShkaXJuYW1lKHBhY2thZ2VEaXIpKVxuICBjb25zdCBtYW5pZmVzdCA9IGpvaW4ocGFja2FnZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgY29uc3Qgd2F0Y2hlZCA9IExPQ0tGSUxFUy5tYXAobmFtZSA9PiBqb2luKHByb2plY3REaXIsIG5hbWUpKVxuICBzZXJ2ZXIud2F0Y2hlci5hZGQod2F0Y2hlZClcbiAgbGV0IHRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZFxuICBzZXJ2ZXIud2F0Y2hlci5vbihcImFsbFwiLCAoXywgZmlsZSkgPT4ge1xuICAgIGlmICghd2F0Y2hlZC5pbmNsdWRlcyhmaWxlKSkgcmV0dXJuXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIC8vIExldCB0aGUgcGFja2FnZSBtYW5hZ2VyIGZpbmlzaCByZWxpbmtpbmcgYWZ0ZXIgaXQgd3JpdGVzIHRoZSBsb2NrZmlsZS5cbiAgICB0aW1lciA9IHNldFRpbWVvdXQocmVwb3J0VXBncmFkZSwgMTAwMClcbiAgfSlcblxuICBmdW5jdGlvbiByZXBvcnRVcGdyYWRlKCkge1xuICAgIGNvbnN0IHZlcnNpb24gPSByZWFkUGFja2FnZVZlcnNpb24obWFuaWZlc3QpXG4gICAgaWYgKCF2ZXJzaW9uIHx8IHZlcnNpb24gPT09IHBhY2thZ2VKc29uLnZlcnNpb24pIHJldHVyblxuICAgIHNlcnZlci5jb25maWcubG9nZ2VyLndhcm4oXG4gICAgICBgbGl2ZW1hcmsgJHtwYWNrYWdlSnNvbi52ZXJzaW9ufSDihpIgJHt2ZXJzaW9ufSBpbnN0YWxsZWQ7IHJlc3RhcnQgdGhlIGRldiBzZXJ2ZXIgdG8gdXNlIGl0YCxcbiAgICAgIHsgdGltZXN0YW1wOiB0cnVlIH0sXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3Q6IHN0cmluZykge1xuICBmb3IgKGxldCBkaXIgPSByb290OyA7IGRpciA9IGRpcm5hbWUoZGlyKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBqb2luKGRpciwgXCJub2RlX21vZHVsZXNcIiwgcGFja2FnZUpzb24ubmFtZSlcbiAgICBpZiAoZXhpc3RzU3luYyhwYWNrYWdlRGlyKSkgcmV0dXJuIHBhY2thZ2VEaXJcbiAgICBpZiAoZGlybmFtZShkaXIpID09PSBkaXIpIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZVZlcnNpb24obWFuaWZlc3Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKG1hbmlmZXN0LCBcInV0ZjhcIikpXG4gICAgcmV0dXJuIGlzT2JqZWN0KHBhcnNlZCkgJiYgdHlwZW9mIHBhcnNlZC52ZXJzaW9uID09PSBcInN0cmluZ1wiXG4gICAgICA/IHBhcnNlZC52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqIFJlc29sdmUgbGl2ZW1hcmsuY29uZmlnLnRzJ3MgYHZpdGVgIGZpZWxkIOKAlCBlaXRoZXIgYSBjb25maWcgb2JqZWN0XG4gKiAgb3IgYSBmdW5jdGlvbiBgKGVudikgPT4gY29uZmlnYCAobWF0Y2hpbmcgVml0ZSdzIG93biBgZGVmaW5lQ29uZmlnYCkuXG4gKiAgU2NoZW1hIHN0b3JlcyBpdCBhcyBgdW5rbm93bmA7IHR5cGluZyBmb3IgdGhlIGNvbnN1bWVyJ3MgZWRpdG9yXG4gKiAgbGl2ZXMgb24ge0BsaW5rIFZpdGVPdmVycmlkZX0uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVml0ZU92ZXJyaWRlKFxuICB2aXRlOiB1bmtub3duLFxuICBlbnY6IENvbmZpZ0Vudixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPiB7XG4gIGlmICghdml0ZSkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGVvZiB2aXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KHZpdGUsIHVuZGVmaW5lZCwgW2Vudl0pXG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBudWxsXG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KHZpdGUpID8gdml0ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuIl19