aback-ui 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -2
  3. package/dist/args.d.ts +15 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +91 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/cli.d.ts +13 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +106 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +29 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +82 -0
  14. package/dist/commands/add.js.map +1 -0
  15. package/dist/commands/diff.d.ts +13 -0
  16. package/dist/commands/diff.d.ts.map +1 -0
  17. package/dist/commands/diff.js +85 -0
  18. package/dist/commands/diff.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +8 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +45 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/init.d.ts +19 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +97 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/list.d.ts +11 -0
  28. package/dist/commands/list.d.ts.map +1 -0
  29. package/dist/commands/list.js +42 -0
  30. package/dist/commands/list.js.map +1 -0
  31. package/dist/commands/view.d.ts +11 -0
  32. package/dist/commands/view.d.ts.map +1 -0
  33. package/dist/commands/view.js +43 -0
  34. package/dist/commands/view.js.map +1 -0
  35. package/dist/config.d.ts +62 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +265 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/diff.d.ts +30 -0
  40. package/dist/diff.d.ts.map +1 -0
  41. package/dist/diff.js +121 -0
  42. package/dist/diff.js.map +1 -0
  43. package/dist/doctor.d.ts +35 -0
  44. package/dist/doctor.d.ts.map +1 -0
  45. package/dist/doctor.js +203 -0
  46. package/dist/doctor.js.map +1 -0
  47. package/dist/errors.d.ts +6 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +12 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/help.d.ts +3 -0
  52. package/dist/help.d.ts.map +1 -0
  53. package/dist/help.js +48 -0
  54. package/dist/help.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +4 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/install.d.ts +53 -0
  60. package/dist/install.d.ts.map +1 -0
  61. package/dist/install.js +119 -0
  62. package/dist/install.js.map +1 -0
  63. package/dist/logger.d.ts +14 -0
  64. package/dist/logger.d.ts.map +1 -0
  65. package/dist/logger.js +47 -0
  66. package/dist/logger.js.map +1 -0
  67. package/dist/paths.d.ts +18 -0
  68. package/dist/paths.d.ts.map +1 -0
  69. package/dist/paths.js +76 -0
  70. package/dist/paths.js.map +1 -0
  71. package/dist/prompt.d.ts +13 -0
  72. package/dist/prompt.d.ts.map +1 -0
  73. package/dist/prompt.js +25 -0
  74. package/dist/prompt.js.map +1 -0
  75. package/dist/registry.d.ts +49 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +216 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/types.d.ts +88 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +59 -4
  84. package/registry/accordion.json +32 -0
  85. package/registry/alert-dialog.json +28 -0
  86. package/registry/alert.json +31 -0
  87. package/registry/article-layout.json +38 -0
  88. package/registry/avatar.json +31 -0
  89. package/registry/badge.json +33 -0
  90. package/registry/breadcrumbs.json +32 -0
  91. package/registry/button.json +34 -0
  92. package/registry/calendar.json +29 -0
  93. package/registry/card.json +30 -0
  94. package/registry/checkbox.json +33 -0
  95. package/registry/code-block.json +29 -0
  96. package/registry/collapsible.json +28 -0
  97. package/registry/combobox.json +30 -0
  98. package/registry/command.json +34 -0
  99. package/registry/contact-form.json +37 -0
  100. package/registry/cookie-consent.json +28 -0
  101. package/registry/copy-button.json +33 -0
  102. package/registry/cta-banner.json +32 -0
  103. package/registry/dashboard-shell.json +32 -0
  104. package/registry/date-picker.json +32 -0
  105. package/registry/description-list.json +28 -0
  106. package/registry/dialog.json +33 -0
  107. package/registry/dropdown-menu.json +33 -0
  108. package/registry/dropzone.json +31 -0
  109. package/registry/empty-state.json +32 -0
  110. package/registry/faq.json +31 -0
  111. package/registry/feature-grid.json +33 -0
  112. package/registry/field.json +29 -0
  113. package/registry/hero.json +32 -0
  114. package/registry/hover-card.json +28 -0
  115. package/registry/index.json +1633 -0
  116. package/registry/input-group.json +30 -0
  117. package/registry/input.json +29 -0
  118. package/registry/kbd.json +29 -0
  119. package/registry/label.json +29 -0
  120. package/registry/layout.json +32 -0
  121. package/registry/newsletter.json +35 -0
  122. package/registry/not-found.json +34 -0
  123. package/registry/page-header.json +29 -0
  124. package/registry/pagination.json +25 -0
  125. package/registry/popover.json +28 -0
  126. package/registry/pricing.json +35 -0
  127. package/registry/progress.json +28 -0
  128. package/registry/radio-group.json +28 -0
  129. package/registry/rating.json +32 -0
  130. package/registry/reading-progress.json +29 -0
  131. package/registry/relative-time.json +29 -0
  132. package/registry/scroll-area.json +28 -0
  133. package/registry/section-heading.json +30 -0
  134. package/registry/select.json +32 -0
  135. package/registry/separator.json +32 -0
  136. package/registry/settings-section.json +32 -0
  137. package/registry/share-buttons.json +34 -0
  138. package/registry/sheet.json +34 -0
  139. package/registry/sign-in.json +31 -0
  140. package/registry/site-footer.json +31 -0
  141. package/registry/site-header.json +37 -0
  142. package/registry/skeleton.json +28 -0
  143. package/registry/skip-link.json +30 -0
  144. package/registry/slider.json +28 -0
  145. package/registry/spinner.json +32 -0
  146. package/registry/stat.json +32 -0
  147. package/registry/steps.json +31 -0
  148. package/registry/switch.json +32 -0
  149. package/registry/table-of-contents.json +32 -0
  150. package/registry/table.json +28 -0
  151. package/registry/tabs.json +29 -0
  152. package/registry/textarea.json +29 -0
  153. package/registry/theme-toggle.json +34 -0
  154. package/registry/theme.json +16 -0
  155. package/registry/toast.json +29 -0
  156. package/registry/toggle-group.json +29 -0
  157. package/registry/tooltip.json +29 -0
  158. package/registry/users-table.json +36 -0
  159. package/registry/utils.json +19 -0
@@ -0,0 +1,119 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { ensureDirectory, existsPath } from "./config.js";
5
+ import { relativeImport, resolveTargetPath, toPosix } from "./paths.js";
6
+ /**
7
+ * Write every registry file into the project. Existing files are kept unless
8
+ * the caller explicitly allows overwriting, so a local edit is never lost
9
+ * silently.
10
+ */
11
+ export async function writeItemFiles({ items, projectRoot, dirs, overwrite = "prompt", dryRun = false, log, prompt, }) {
12
+ const results = [];
13
+ for (const item of items) {
14
+ for (const file of item.files) {
15
+ const target = file.target ?? file.path;
16
+ const absolutePath = resolveTargetPath(target, dirs, projectRoot);
17
+ const display = toPosix(path.relative(projectRoot, absolutePath));
18
+ let existing = null;
19
+ if (await existsPath(absolutePath)) {
20
+ existing = await readFile(absolutePath, "utf8");
21
+ }
22
+ if (existing === file.content) {
23
+ results.push({ item: item.name, target: display, absolutePath, status: "unchanged" });
24
+ continue;
25
+ }
26
+ if (existing !== null) {
27
+ if (dryRun) {
28
+ log.warn(`${display} already exists; a real run would ask before replacing it.`);
29
+ results.push({ item: item.name, target: display, absolutePath, status: "skipped" });
30
+ continue;
31
+ }
32
+ if (overwrite === "never") {
33
+ log.warn(`Kept existing ${display}.`);
34
+ results.push({ item: item.name, target: display, absolutePath, status: "skipped" });
35
+ continue;
36
+ }
37
+ if (overwrite === "prompt") {
38
+ const confirmed = await prompt.confirm(`${display} already exists. Replace it with the registry version?`, false);
39
+ if (!confirmed) {
40
+ log.warn(`Kept existing ${display}.`);
41
+ results.push({ item: item.name, target: display, absolutePath, status: "skipped" });
42
+ continue;
43
+ }
44
+ }
45
+ }
46
+ if (dryRun) {
47
+ log.info(`Would write ${display}`);
48
+ results.push({ item: item.name, target: display, absolutePath, status: "written" });
49
+ continue;
50
+ }
51
+ await ensureDirectory(path.dirname(absolutePath));
52
+ await writeFile(absolutePath, file.content, "utf8");
53
+ log.success(`Wrote ${display}`);
54
+ results.push({ item: item.name, target: display, absolutePath, status: "written" });
55
+ }
56
+ }
57
+ return results;
58
+ }
59
+ export function dependencyCommand(packageManager, packages, dev) {
60
+ switch (packageManager) {
61
+ case "bun":
62
+ return { command: "bun", args: ["add", ...(dev ? ["-d"] : []), ...packages] };
63
+ case "pnpm":
64
+ return { command: "pnpm", args: ["add", ...(dev ? ["-D"] : []), ...packages] };
65
+ case "yarn":
66
+ return { command: "yarn", args: ["add", ...(dev ? ["-D"] : []), ...packages] };
67
+ case "npm":
68
+ default:
69
+ return { command: "npm", args: ["install", ...(dev ? ["--save-dev"] : []), ...packages] };
70
+ }
71
+ }
72
+ export async function installDependencies({ cwd, packageManager, dependencies = [], devDependencies = [], noInstall = false, dryRun = false, log, runner = spawnSync, }) {
73
+ const groups = [
74
+ { packages: [...new Set(dependencies)].sort(), dev: false },
75
+ { packages: [...new Set(devDependencies)].sort(), dev: true },
76
+ ];
77
+ for (const group of groups) {
78
+ if (group.packages.length === 0)
79
+ continue;
80
+ const { command, args } = dependencyCommand(packageManager, group.packages, group.dev);
81
+ const printable = `${command} ${args.join(" ")}`;
82
+ if (noInstall || dryRun) {
83
+ log.info(`Install dependencies with: ${printable}`);
84
+ continue;
85
+ }
86
+ log.step(`Installing ${group.packages.length} package(s) with ${packageManager}`);
87
+ const result = runner(command, args, { cwd, stdio: "inherit" });
88
+ if (result.status !== 0) {
89
+ throw new Error(`Dependency installation failed (${printable}). Run it manually to see the full output.`);
90
+ }
91
+ }
92
+ }
93
+ /**
94
+ * Insert the theme import directly after the Tailwind import so theme
95
+ * variables exist before any utility is generated.
96
+ */
97
+ export async function ensureThemeImport({ cssFile, themeFile, dryRun = false, log, }) {
98
+ if (!(await existsPath(cssFile)))
99
+ return "missing";
100
+ const content = await readFile(cssFile, "utf8");
101
+ const specifier = relativeImport(cssFile, themeFile);
102
+ if (content.includes(specifier) || content.includes("aback.css"))
103
+ return "present";
104
+ const importLine = `@import "${specifier}";`;
105
+ const tailwind = /^[ \t]*@import\s+["']tailwindcss(?:\/[^"']*)?["'];?[^\n]*\n?/m.exec(content);
106
+ let next;
107
+ if (tailwind) {
108
+ const index = tailwind.index + tailwind[0].length;
109
+ next = `${content.slice(0, index)}${importLine}\n${content.slice(index)}`;
110
+ }
111
+ else {
112
+ next = `${importLine}\n${content}`;
113
+ }
114
+ if (!dryRun)
115
+ await writeFile(cssFile, next, "utf8");
116
+ log.success(`${dryRun ? "Would add" : "Added"} the Aback theme import to ${toPosix(path.basename(cssFile))}`);
117
+ return "added";
118
+ }
119
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Writable } from "node:stream";
2
+ export interface Logger {
3
+ info(message: string): void;
4
+ step(message: string): void;
5
+ success(message: string): void;
6
+ warn(message: string): void;
7
+ error(message: string): void;
8
+ dim(message: string): void;
9
+ raw(message: string): void;
10
+ }
11
+ export declare function createLogger(out?: Writable, err?: Writable): Logger;
12
+ export declare const silentOut: Writable;
13
+ export declare const silentErr: Writable;
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAkBD,wBAAgB,YAAY,CAC1B,GAAG,GAAE,QAAyB,EAC9B,GAAG,GAAE,QAAyB,GAC7B,MAAM,CAmBR;AAED,eAAO,MAAM,SAAS,EAKN,QAAQ,CAAC;AAEzB,eAAO,MAAM,SAAS,EAKN,QAAQ,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,47 @@
1
+ const ANSI = {
2
+ reset: "\u001b[0m",
3
+ dim: "\u001b[2m",
4
+ bold: "\u001b[1m",
5
+ green: "\u001b[32m",
6
+ red: "\u001b[31m",
7
+ yellow: "\u001b[33m",
8
+ blue: "\u001b[34m",
9
+ };
10
+ function shouldColor(stream) {
11
+ if (process.env.NO_COLOR)
12
+ return false;
13
+ if (process.env.FORCE_COLOR)
14
+ return true;
15
+ return Boolean(stream.isTTY);
16
+ }
17
+ export function createLogger(out = process.stdout, err = process.stderr) {
18
+ const colorOut = shouldColor(out);
19
+ const colorErr = shouldColor(err);
20
+ function paint(stream, enabled, code, message) {
21
+ stream.write(enabled ? `${code}${message}${ANSI.reset}\n` : `${message}\n`);
22
+ }
23
+ return {
24
+ info: (message) => paint(out, colorOut, "", message),
25
+ step: (message) => paint(out, colorOut, ANSI.blue, `→ ${message}`),
26
+ success: (message) => paint(out, colorOut, ANSI.green, `✓ ${message}`),
27
+ warn: (message) => paint(err, colorErr, ANSI.yellow, `! ${message}`),
28
+ error: (message) => paint(err, colorErr, ANSI.red, `✗ ${message}`),
29
+ dim: (message) => paint(out, colorOut, ANSI.dim, message),
30
+ raw: (message) => {
31
+ out.write(`${message}\n`);
32
+ },
33
+ };
34
+ }
35
+ export const silentOut = {
36
+ isTTY: false,
37
+ write() {
38
+ return true;
39
+ },
40
+ };
41
+ export const silentErr = {
42
+ isTTY: false,
43
+ write() {
44
+ return true;
45
+ },
46
+ };
47
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAYA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,YAAY;IACjB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;CACV,CAAC;AAEX,SAAS,WAAW,CAAC,MAAgB;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,OAAO,CAAE,MAAyC,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAgB,OAAO,CAAC,MAAM,EAC9B,MAAgB,OAAO,CAAC,MAAM;IAE9B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAElC,SAAS,KAAK,CAAC,MAAgB,EAAE,OAAgB,EAAE,IAAY,EAAE,OAAe;QAC9E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC;QACpD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC;QACtE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC;QACpE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC;QAClE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;QACzD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACf,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,KAAK;IACZ,KAAK;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACqB,CAAC;AAEzB,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,KAAK;IACZ,KAAK;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { InstallDirs } from "./types.js";
2
+ export declare class PathSafetyError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Resolve a project-relative path and refuse anything that escapes the root. */
6
+ export declare function safeJoin(root: string, relative: string): string;
7
+ /**
8
+ * Map a registry `target` to a file inside the consumer project.
9
+ *
10
+ * `components/ui/button.tsx` -> the configured ui alias,
11
+ * `lib/utils.ts` -> the configured lib alias,
12
+ * `~/styles/aback.css` -> the project styles directory.
13
+ */
14
+ export declare function resolveTargetPath(target: string, dirs: InstallDirs, projectRoot: string): string;
15
+ export declare function toPosix(value: string): string;
16
+ /** A relative import specifier from one file to another, always with `./`. */
17
+ export declare function relativeImport(fromFile: string, toFile: string): string;
18
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB/D;AAWD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CAiCR;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvE"}
package/dist/paths.js ADDED
@@ -0,0 +1,76 @@
1
+ import path from "node:path";
2
+ export class PathSafetyError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "PathSafetyError";
6
+ }
7
+ }
8
+ /** Resolve a project-relative path and refuse anything that escapes the root. */
9
+ export function safeJoin(root, relative) {
10
+ if (relative.includes("\0")) {
11
+ throw new PathSafetyError(`Invalid path: ${JSON.stringify(relative)}`);
12
+ }
13
+ if (path.isAbsolute(relative)) {
14
+ throw new PathSafetyError(`Refusing absolute install target "${relative}". Targets must be project-relative.`);
15
+ }
16
+ const absolute = path.resolve(root, relative);
17
+ const check = path.relative(root, absolute);
18
+ if (check === ".." || check.startsWith(`..${path.sep}`) || path.isAbsolute(check)) {
19
+ throw new PathSafetyError(`Refusing install target "${relative}": it resolves outside the project root.`);
20
+ }
21
+ return absolute;
22
+ }
23
+ const TARGET_PREFIXES = [
24
+ "components/ui",
25
+ "components/blocks",
26
+ "components",
27
+ "lib",
28
+ "hooks",
29
+ "styles",
30
+ ];
31
+ /**
32
+ * Map a registry `target` to a file inside the consumer project.
33
+ *
34
+ * `components/ui/button.tsx` -> the configured ui alias,
35
+ * `lib/utils.ts` -> the configured lib alias,
36
+ * `~/styles/aback.css` -> the project styles directory.
37
+ */
38
+ export function resolveTargetPath(target, dirs, projectRoot) {
39
+ if (!target || target.trim().length === 0) {
40
+ throw new PathSafetyError("Registry item contains a file with an empty target.");
41
+ }
42
+ const normalized = target.replace(/^~\//, "").replace(/^@\//, "").replace(/\\/g, "/");
43
+ if (normalized.split("/").includes("..")) {
44
+ throw new PathSafetyError(`Refusing install target "${target}": path traversal segment.`);
45
+ }
46
+ for (const prefix of TARGET_PREFIXES) {
47
+ if (normalized === prefix) {
48
+ throw new PathSafetyError(`Refusing install target "${target}": expected a file, not a directory.`);
49
+ }
50
+ if (normalized.startsWith(`${prefix}/`)) {
51
+ const rest = normalized.slice(prefix.length + 1);
52
+ const base = prefix === "components/ui"
53
+ ? dirs.ui
54
+ : prefix === "components/blocks"
55
+ ? dirs.blocks
56
+ : prefix === "components"
57
+ ? dirs.components
58
+ : prefix === "lib"
59
+ ? dirs.lib
60
+ : prefix === "hooks"
61
+ ? dirs.hooks
62
+ : dirs.styles;
63
+ return safeJoin(base, rest);
64
+ }
65
+ }
66
+ return safeJoin(projectRoot, normalized);
67
+ }
68
+ export function toPosix(value) {
69
+ return value.split(path.sep).join("/");
70
+ }
71
+ /** A relative import specifier from one file to another, always with `./`. */
72
+ export function relativeImport(fromFile, toFile) {
73
+ const relative = toPosix(path.relative(path.dirname(fromFile), toFile));
74
+ return relative.startsWith(".") ? relative : `./${relative}`;
75
+ }
76
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface Prompter {
2
+ confirm(message: string, defaultValue?: boolean): Promise<boolean>;
3
+ }
4
+ interface ReadableInput {
5
+ isTTY?: boolean;
6
+ }
7
+ interface WritableOutput {
8
+ write(chunk: string): boolean;
9
+ }
10
+ /** Interactive prompt that returns the default answer when stdin is not a TTY. */
11
+ export declare function createPrompter(input?: ReadableInput, output?: WritableOutput): Prompter;
12
+ export {};
13
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAC5B,KAAK,GAAE,aAA8C,EACrD,MAAM,GAAE,cAAiD,GACxD,QAAQ,CAmBV"}
package/dist/prompt.js ADDED
@@ -0,0 +1,25 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ /** Interactive prompt that returns the default answer when stdin is not a TTY. */
3
+ export function createPrompter(input = process.stdin, output = process.stdout) {
4
+ return {
5
+ async confirm(message, defaultValue = false) {
6
+ if (!input.isTTY)
7
+ return defaultValue;
8
+ const suffix = defaultValue ? " [Y/n] " : " [y/N] ";
9
+ const readline = createInterface({
10
+ input: input,
11
+ output: output,
12
+ });
13
+ try {
14
+ const answer = (await readline.question(`${message}${suffix}`)).trim().toLowerCase();
15
+ if (!answer)
16
+ return defaultValue;
17
+ return answer === "y" || answer === "yes";
18
+ }
19
+ finally {
20
+ readline.close();
21
+ }
22
+ },
23
+ };
24
+ }
25
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAczD,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAC5B,QAAuB,OAAO,CAAC,KAAsB,EACrD,SAAyB,OAAO,CAAC,MAAwB;IAEzD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,OAAO,YAAY,CAAC;YAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YACpD,MAAM,QAAQ,GAAG,eAAe,CAAC;gBAC/B,KAAK,EAAE,KAA0B;gBACjC,MAAM,EAAE,MAA+B;aACxC,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrF,IAAI,CAAC,MAAM;oBAAE,OAAO,YAAY,CAAC;gBACjC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;YAC5C,CAAC;oBAAS,CAAC;gBACT,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { RegistryFetch, RegistryIndex, RegistryItem } from "./types.js";
2
+ /**
3
+ * The canonical address of the Aback UI registry. Item files reference each
4
+ * other by URLs under it, and a project's aback-ui.json names it as "@aback".
5
+ */
6
+ export declare const DEFAULT_REGISTRY = "https://abackui.com/r";
7
+ /**
8
+ * The registry copy shipped inside this package, at `<package>/registry`.
9
+ * Installing from it needs no network and always matches the CLI version.
10
+ * Returns null when running from source before `bun run build`.
11
+ */
12
+ export declare function bundledRegistry(): string | null;
13
+ /** The bundled registry when present, otherwise the hosted one. */
14
+ export declare function defaultRegistry(): string;
15
+ export declare class RegistryError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export interface RegistryClientOptions {
19
+ /** Registry base URL or a local directory containing `{name}.json` files. */
20
+ registry?: string;
21
+ /** Working directory used for local file specifiers. */
22
+ cwd?: string;
23
+ /** Named registry templates from aback-ui.json. */
24
+ registries?: Record<string, string>;
25
+ fetchImpl?: RegistryFetch;
26
+ }
27
+ export declare class RegistryClient {
28
+ private readonly base;
29
+ private readonly cwd;
30
+ private readonly registries;
31
+ private readonly fetchImpl;
32
+ private readonly items;
33
+ private indexCache;
34
+ constructor(options?: RegistryClientOptions);
35
+ index(): Promise<RegistryIndex>;
36
+ item(specifier: string): Promise<RegistryItem>;
37
+ /** Resolve a set of items and their dependencies, dependencies first. */
38
+ collect(specifiers: string[]): Promise<RegistryItem[]>;
39
+ private resolveSpecifier;
40
+ /**
41
+ * Map an abackui.com item URL onto the active registry base. Returns the
42
+ * input unchanged when the URL belongs to another registry or the default
43
+ * production registry is already in use.
44
+ */
45
+ private localiseDependency;
46
+ private readJson;
47
+ }
48
+ export declare function validateItem(raw: unknown, source: string): RegistryItem;
49
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7E;;;GAGG;AACH,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAG/C;AAED,mEAAmE;AACnE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAGD,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAUD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,UAAU,CAA8B;gBAEpC,OAAO,GAAE,qBAA0B;IAQzC,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAa/B,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAYpD,yEAAyE;IACnE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0B5D,OAAO,CAAC,gBAAgB;IA+CxB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;YAwBZ,QAAQ;CA+BvB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAoBvE"}
@@ -0,0 +1,216 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ /**
6
+ * The canonical address of the Aback UI registry. Item files reference each
7
+ * other by URLs under it, and a project's aback-ui.json names it as "@aback".
8
+ */
9
+ export const DEFAULT_REGISTRY = "https://abackui.com/r";
10
+ /**
11
+ * The registry copy shipped inside this package, at `<package>/registry`.
12
+ * Installing from it needs no network and always matches the CLI version.
13
+ * Returns null when running from source before `bun run build`.
14
+ */
15
+ export function bundledRegistry() {
16
+ const directory = fileURLToPath(new URL("../registry", import.meta.url));
17
+ return existsSync(path.join(directory, "index.json")) ? directory : null;
18
+ }
19
+ /** The bundled registry when present, otherwise the hosted one. */
20
+ export function defaultRegistry() {
21
+ return bundledRegistry() ?? DEFAULT_REGISTRY;
22
+ }
23
+ const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
24
+ export class RegistryError extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = "RegistryError";
28
+ }
29
+ }
30
+ function isUrl(value) {
31
+ return /^https?:\/\//i.test(value);
32
+ }
33
+ function isLocalBase(base) {
34
+ return !isUrl(base);
35
+ }
36
+ export class RegistryClient {
37
+ base;
38
+ cwd;
39
+ registries;
40
+ fetchImpl;
41
+ items = new Map();
42
+ indexCache = null;
43
+ constructor(options = {}) {
44
+ this.base = (options.registry ?? DEFAULT_REGISTRY).replace(/\/$/, "");
45
+ this.cwd = options.cwd ?? process.cwd();
46
+ this.registries = options.registries ?? {};
47
+ this.fetchImpl =
48
+ options.fetchImpl ?? ((url) => fetch(url, { signal: AbortSignal.timeout(20_000) }));
49
+ }
50
+ async index() {
51
+ if (this.indexCache)
52
+ return this.indexCache;
53
+ const target = isUrl(this.base)
54
+ ? `${this.base}/index.json`
55
+ : path.join(this.base, "index.json");
56
+ const raw = await this.readJson(target);
57
+ if (!raw || typeof raw !== "object" || !Array.isArray(raw.items)) {
58
+ throw new RegistryError(`Registry index at ${target} is missing an items array.`);
59
+ }
60
+ this.indexCache = raw;
61
+ return this.indexCache;
62
+ }
63
+ async item(specifier) {
64
+ const { target, label } = this.resolveSpecifier(specifier);
65
+ const cached = this.items.get(label);
66
+ if (cached)
67
+ return cached;
68
+ const raw = await this.readJson(target);
69
+ const item = validateItem(raw, label);
70
+ this.items.set(item.name, item);
71
+ this.items.set(label, item);
72
+ return item;
73
+ }
74
+ /** Resolve a set of items and their dependencies, dependencies first. */
75
+ async collect(specifiers) {
76
+ const ordered = [];
77
+ const done = new Set();
78
+ const visiting = new Set();
79
+ const visit = async (specifier) => {
80
+ const item = await this.item(specifier);
81
+ if (done.has(item.name))
82
+ return;
83
+ if (visiting.has(item.name)) {
84
+ throw new RegistryError(`Circular registry dependency detected at "${item.name}".`);
85
+ }
86
+ visiting.add(item.name);
87
+ for (const dependency of item.registryDependencies ?? []) {
88
+ await visit(dependency);
89
+ }
90
+ visiting.delete(item.name);
91
+ done.add(item.name);
92
+ ordered.push(item);
93
+ };
94
+ for (const specifier of specifiers) {
95
+ await visit(specifier);
96
+ }
97
+ return ordered;
98
+ }
99
+ resolveSpecifier(specifier) {
100
+ const trimmed = specifier.trim();
101
+ if (!trimmed)
102
+ throw new RegistryError("Empty registry item name.");
103
+ if (isUrl(trimmed)) {
104
+ // Registry items carry absolute dependency URLs generated for the
105
+ // production registry. When a mirror, a staging host, or a local build
106
+ // is configured, resolve those same items against the active registry
107
+ // instead of reaching back out to abackui.com.
108
+ return { target: this.localiseDependency(trimmed), label: trimmed };
109
+ }
110
+ if (trimmed.startsWith("@")) {
111
+ const separator = trimmed.indexOf("/");
112
+ if (separator === -1) {
113
+ throw new RegistryError(`Registry alias "${trimmed}" must look like @aback/button.`);
114
+ }
115
+ const scope = trimmed.slice(0, separator);
116
+ const name = trimmed.slice(separator + 1);
117
+ const template = this.registries[scope];
118
+ if (!template) {
119
+ throw new RegistryError(`Unknown registry alias "${scope}". Add it to aback-ui.json under "registries".`);
120
+ }
121
+ const expanded = template.replace("{name}", name);
122
+ return this.resolveSpecifier(expanded);
123
+ }
124
+ if (trimmed.endsWith(".json")) {
125
+ const file = path.resolve(this.cwd, trimmed);
126
+ if (existsSync(file))
127
+ return { target: file, label: trimmed };
128
+ }
129
+ const name = trimmed.replace(/\.json$/, "");
130
+ if (!NAME_PATTERN.test(name)) {
131
+ throw new RegistryError(`Invalid item name "${specifier}". Use a lowercase kebab-case name, a URL, or @scope/name.`);
132
+ }
133
+ if (isLocalBase(this.base)) {
134
+ return { target: path.join(this.base, `${name}.json`), label: name };
135
+ }
136
+ return { target: `${this.base}/${name}.json`, label: name };
137
+ }
138
+ /**
139
+ * Map an abackui.com item URL onto the active registry base. Returns the
140
+ * input unchanged when the URL belongs to another registry or the default
141
+ * production registry is already in use.
142
+ */
143
+ localiseDependency(url) {
144
+ if (this.base === DEFAULT_REGISTRY)
145
+ return url;
146
+ // The bundled copy and any mirror serve the same file names.
147
+ let parsed;
148
+ try {
149
+ parsed = new URL(url);
150
+ }
151
+ catch {
152
+ return url;
153
+ }
154
+ const production = new URL(DEFAULT_REGISTRY);
155
+ if (parsed.origin !== production.origin || !parsed.pathname.startsWith("/r/")) {
156
+ return url;
157
+ }
158
+ const file = parsed.pathname.slice("/r/".length);
159
+ if (!file.endsWith(".json"))
160
+ return url;
161
+ const name = file.slice(0, -5);
162
+ if (!NAME_PATTERN.test(name))
163
+ return url;
164
+ return isLocalBase(this.base) ? path.join(this.base, file) : `${this.base}/${file}`;
165
+ }
166
+ async readJson(target) {
167
+ if (isUrl(target)) {
168
+ let response;
169
+ try {
170
+ response = await this.fetchImpl(target);
171
+ }
172
+ catch (error) {
173
+ throw new RegistryError(`Could not reach ${target}: ${error.message}`);
174
+ }
175
+ if (!response.ok) {
176
+ throw new RegistryError(response.status === 404
177
+ ? `Registry item not found: ${target}`
178
+ : `Registry request failed (${response.status}): ${target}`);
179
+ }
180
+ try {
181
+ return await response.json();
182
+ }
183
+ catch {
184
+ throw new RegistryError(`Registry response at ${target} is not valid JSON.`);
185
+ }
186
+ }
187
+ if (!existsSync(target)) {
188
+ throw new RegistryError(`Registry item not found: ${target}`);
189
+ }
190
+ try {
191
+ return JSON.parse(await readFile(target, "utf8"));
192
+ }
193
+ catch (error) {
194
+ throw new RegistryError(`Could not parse ${target}: ${error.message}`);
195
+ }
196
+ }
197
+ }
198
+ export function validateItem(raw, source) {
199
+ if (!raw || typeof raw !== "object") {
200
+ throw new RegistryError(`Registry item at ${source} is not an object.`);
201
+ }
202
+ const item = raw;
203
+ if (!item.name || !NAME_PATTERN.test(item.name)) {
204
+ throw new RegistryError(`Registry item at ${source} has an invalid name.`);
205
+ }
206
+ if (!Array.isArray(item.files) || item.files.length === 0) {
207
+ throw new RegistryError(`Registry item "${item.name}" has no files.`);
208
+ }
209
+ for (const file of item.files) {
210
+ if (!file || typeof file.content !== "string" || typeof file.target !== "string") {
211
+ throw new RegistryError(`Registry item "${item.name}" has a file without string content and target.`);
212
+ }
213
+ }
214
+ return item;
215
+ }
216
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,eAAe;IAC7B,OAAO,eAAe,EAAE,IAAI,gBAAgB,CAAC;AAC/C,CAAC;AACD,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAYD,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,OAAO,cAAc;IACR,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,UAAU,CAAyB;IACnC,SAAS,CAAgB;IACzB,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,UAAU,GAAyB,IAAI,CAAC;IAEhD,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,SAAS;YACZ,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,aAAa;YAC3B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,GAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,aAAa,CAAC,qBAAqB,MAAM,6BAA6B,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,GAAoB,CAAC;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,OAAO,CAAC,UAAoB;QAChC,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,MAAM,KAAK,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;YACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO;YAChC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,CAAC,6CAA6C,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACtF,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,oBAAoB,IAAI,EAAE,EAAE,CAAC;gBACzD,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,gBAAgB,CAAC,SAAiB;QACxC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,CAAC,CAAC;QAEnE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnB,kEAAkE;YAClE,uEAAuE;YACvE,sEAAsE;YACtE,+CAA+C;YAC/C,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,aAAa,CAAC,mBAAmB,OAAO,iCAAiC,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,aAAa,CACrB,2BAA2B,KAAK,gDAAgD,CACjF,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,aAAa,CACrB,sBAAsB,SAAS,4DAA4D,CAC5F,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,GAAW;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;YAAE,OAAO,GAAG,CAAC;QAC/C,6DAA6D;QAE7D,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,GAAG,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAEzC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAClB,IAAI,QAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,aAAa,CAAC,mBAAmB,MAAM,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,aAAa,CACrB,QAAQ,CAAC,MAAM,KAAK,GAAG;oBACrB,CAAC,CAAC,4BAA4B,MAAM,EAAE;oBACtC,CAAC,CAAC,4BAA4B,QAAQ,CAAC,MAAM,MAAM,MAAM,EAAE,CAC9D,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,aAAa,CAAC,wBAAwB,MAAM,qBAAqB,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,aAAa,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC,mBAAmB,MAAM,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,MAAc;IACvD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,aAAa,CAAC,oBAAoB,MAAM,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,GAAG,GAA4B,CAAC;IAE1C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,aAAa,CAAC,oBAAoB,MAAM,uBAAuB,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,aAAa,CAAC,kBAAkB,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC;IACxE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjF,MAAM,IAAI,aAAa,CACrB,kBAAkB,IAAI,CAAC,IAAI,iDAAiD,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAoB,CAAC;AAC9B,CAAC"}