aback-ui 0.0.0-stage → 0.2.1

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 +66 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +297 -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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Aback Group
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,86 @@
1
- # Temporary Holding Version
1
+ # aback-ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The Aback UI command line. It sets up a React project and copies accessible components and blocks into it as source you own.
4
+
5
+ ```bash
6
+ # Set up the project once
7
+ npx aback-ui@latest init
8
+
9
+ # Add components or blocks by name
10
+ npx aback-ui@latest add button dialog
11
+ npx aback-ui@latest add sign-in
12
+ ```
13
+
14
+ Every component's source ships inside this package. Installing never downloads code from a website, and the files always match the CLI version you ran. Your package manager still installs npm dependencies such as Radix UI.
15
+
16
+ Requirements: Node.js 20.9 or newer, a React 19 project, Tailwind CSS v4, and a `@/` path alias.
17
+
18
+ Documentation: [abackui.com/docs/cli](https://abackui.com/docs/cli)
19
+
20
+ ## Commands
21
+
22
+ | Command | What it does |
23
+ | --- | --- |
24
+ | `init` | Checks for Tailwind v4, finds the stylesheet and path alias, writes `aback-ui.json`, `styles/aback.css`, and `lib/utils.ts`, imports the theme, and installs `clsx` and `tailwind-merge`. |
25
+ | `add <items...>` | Resolves each item and the items it builds on, writes the files in dependency order, and installs the npm packages they import. |
26
+ | `diff [items...]` | Prints a line diff for each installed file that differs from this version. Never writes. `--all` checks every installed component and block. |
27
+ | `doctor` | Checks the setup without writing: Node, framework, Tailwind, config, aliases, utilities, stylesheet, theme, registry, installed files, and lockfiles. Exits non-zero on errors. |
28
+ | `list [query]` | Lists installable items, grouped by category. |
29
+ | `view <item>` | Shows an item's description, dependencies, and file targets. |
30
+
31
+ ## Options
32
+
33
+ | Option | Effect |
34
+ | --- | --- |
35
+ | `--yes`, `-y` | Accept defaults. Existing files are kept. |
36
+ | `--overwrite` | Replace existing files without asking. |
37
+ | `--no-overwrite` | Keep every existing file. |
38
+ | `--dry-run` | Print the plan without writing or installing. |
39
+ | `--no-install` | Write files but skip the package manager. |
40
+ | `--cwd <dir>` | Project directory. Defaults to the current directory. |
41
+ | `--css <file>` | The global stylesheet for `init`, when it cannot be found. |
42
+ | `--force` | Let `init` rewrite an existing `aback-ui.json`. |
43
+ | `--registry <url>` | Install from a mirror or a local directory. Also `ABACK_UI_REGISTRY`. |
44
+ | `--json` | Machine-readable output for `diff`, `doctor`, `list`, and `view`. |
45
+ | `--all` | With `diff`: compare every installed item. |
46
+
47
+ ## Safety
48
+
49
+ - Install targets must stay inside the project. Absolute paths and `..` segments are rejected before anything is written.
50
+ - Existing files are compared by content. Identical files are left alone; a different file needs confirmation, `--overwrite`, or `--no-overwrite`.
51
+ - No registry file is executed. The CLI writes files and hands dependency installation to the project's package manager.
52
+ - `--dry-run` performs no writes and no installs.
53
+
54
+ ## Configuration
55
+
56
+ `init` writes `aback-ui.json` ([schema](https://abackui.com/schema/aback-ui.json)):
57
+
58
+ ```json
59
+ {
60
+ "$schema": "https://abackui.com/schema/aback-ui.json",
61
+ "style": "aback",
62
+ "rsc": true,
63
+ "tsx": true,
64
+ "tailwind": { "css": "app/globals.css" },
65
+ "aliases": {
66
+ "components": "@/components",
67
+ "utils": "@/lib/utils",
68
+ "ui": "@/components/ui",
69
+ "lib": "@/lib",
70
+ "hooks": "@/hooks"
71
+ },
72
+ "registries": { "@aback": "https://abackui.com/r/{name}.json" }
73
+ }
74
+ ```
75
+
76
+ The standard `@aback` entry means the registry bundled with the CLI. Any other template is used as a mirror.
77
+
78
+ ## Development
79
+
80
+ From the repository root:
81
+
82
+ ```bash
83
+ bun run build:registry # regenerate the registry
84
+ bun run build:cli # compile and bundle it into packages/cli/registry
85
+ node packages/cli/dist/index.js --help
86
+ ```
package/dist/args.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export interface ParsedArgs {
2
+ command: string | undefined;
3
+ positionals: string[];
4
+ flags: Map<string, string | boolean>;
5
+ unknown: string[];
6
+ }
7
+ /**
8
+ * A deliberately small argument parser. It supports the shapes the CLI
9
+ * documents: `--flag`, `--flag=value`, `--flag value`, `-y`, and `--`.
10
+ * Unknown flags are reported instead of silently ignored.
11
+ */
12
+ export declare function parseArgs(argv: string[]): ParsedArgs;
13
+ export declare function flagString(args: ParsedArgs, name: string): string | undefined;
14
+ export declare function flagBoolean(args: ParsedArgs, name: string): boolean;
15
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgEpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE"}
package/dist/args.js ADDED
@@ -0,0 +1,91 @@
1
+ const BOOLEAN_FLAGS = new Set([
2
+ "yes",
3
+ "overwrite",
4
+ "dry-run",
5
+ "no-install",
6
+ "no-overwrite",
7
+ "json",
8
+ "all",
9
+ "force",
10
+ "help",
11
+ "version",
12
+ ]);
13
+ const ALIASES = {
14
+ y: "yes",
15
+ h: "help",
16
+ v: "version",
17
+ };
18
+ /**
19
+ * A deliberately small argument parser. It supports the shapes the CLI
20
+ * documents: `--flag`, `--flag=value`, `--flag value`, `-y`, and `--`.
21
+ * Unknown flags are reported instead of silently ignored.
22
+ */
23
+ export function parseArgs(argv) {
24
+ const positionals = [];
25
+ const flags = new Map();
26
+ const unknown = [];
27
+ let command;
28
+ let endOfFlags = false;
29
+ for (let index = 0; index < argv.length; index += 1) {
30
+ const token = argv[index];
31
+ if (token === undefined)
32
+ continue;
33
+ if (token === "--") {
34
+ endOfFlags = true;
35
+ continue;
36
+ }
37
+ if (endOfFlags || !token.startsWith("-") || token === "-") {
38
+ if (command === undefined) {
39
+ command = token;
40
+ }
41
+ else {
42
+ positionals.push(token);
43
+ }
44
+ continue;
45
+ }
46
+ if (token.startsWith("--")) {
47
+ const body = token.slice(2);
48
+ if (!body) {
49
+ unknown.push(token);
50
+ continue;
51
+ }
52
+ const equals = body.indexOf("=");
53
+ const rawName = equals === -1 ? body : body.slice(0, equals);
54
+ const name = ALIASES[rawName] ?? rawName;
55
+ if (!BOOLEAN_FLAGS.has(name) && equals === -1) {
56
+ const next = argv[index + 1];
57
+ if (next !== undefined && !next.startsWith("-")) {
58
+ flags.set(name, next);
59
+ index += 1;
60
+ continue;
61
+ }
62
+ unknown.push(token);
63
+ continue;
64
+ }
65
+ if (equals !== -1) {
66
+ flags.set(name, body.slice(equals + 1));
67
+ }
68
+ else {
69
+ flags.set(name, true);
70
+ }
71
+ continue;
72
+ }
73
+ const short = token.slice(1);
74
+ const name = ALIASES[short] ?? short;
75
+ if (BOOLEAN_FLAGS.has(name)) {
76
+ flags.set(name, true);
77
+ }
78
+ else {
79
+ unknown.push(token);
80
+ }
81
+ }
82
+ return { command, positionals, flags, unknown };
83
+ }
84
+ export function flagString(args, name) {
85
+ const value = args.flags.get(name);
86
+ return typeof value === "string" && value.length > 0 ? value : undefined;
87
+ }
88
+ export function flagBoolean(args, name) {
89
+ return args.flags.get(name) === true;
90
+ }
91
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { InstallDependenciesOptions } from "./install.js";
2
+ import { type Logger } from "./logger.js";
3
+ import { type Prompter } from "./prompt.js";
4
+ import type { RegistryFetch } from "./types.js";
5
+ export interface CliContext {
6
+ cwd?: string;
7
+ logger?: Logger;
8
+ prompter?: Prompter;
9
+ fetchImpl?: RegistryFetch;
10
+ installPackages?: (options: InstallDependenciesOptions) => Promise<void>;
11
+ }
12
+ export declare function runCli(argv: string[], context?: CliContext): Promise<number>;
13
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGtF"}
package/dist/cli.js ADDED
@@ -0,0 +1,106 @@
1
+ import { flagBoolean, flagString, parseArgs } from "./args.js";
2
+ import { runAdd } from "./commands/add.js";
3
+ import { runDiff } from "./commands/diff.js";
4
+ import { runDoctor } from "./commands/doctor.js";
5
+ import { runInit } from "./commands/init.js";
6
+ import { runList } from "./commands/list.js";
7
+ import { runView } from "./commands/view.js";
8
+ import { CommandError } from "./errors.js";
9
+ import { CLI_VERSION, HELP } from "./help.js";
10
+ import { createLogger } from "./logger.js";
11
+ import { createPrompter } from "./prompt.js";
12
+ export async function runCli(argv, context = {}) {
13
+ const logger = context.logger ?? createLogger();
14
+ const prompter = context.prompter ?? createPrompter();
15
+ const args = parseArgs(argv);
16
+ const cwd = flagString(args, "cwd") ?? context.cwd ?? process.cwd();
17
+ if (args.unknown.length > 0) {
18
+ logger.error(`Unknown option: ${args.unknown.join(", ")}`);
19
+ logger.dim("Run `aback-ui --help` to see the available options.");
20
+ return 1;
21
+ }
22
+ if (flagBoolean(args, "version") || args.command === "version") {
23
+ logger.raw(CLI_VERSION);
24
+ return 0;
25
+ }
26
+ if (flagBoolean(args, "help") || args.command === "help" || args.command === undefined) {
27
+ logger.raw(HELP);
28
+ return 0;
29
+ }
30
+ const shared = {
31
+ cwd,
32
+ registry: flagString(args, "registry"),
33
+ logger,
34
+ prompter,
35
+ fetchImpl: context.fetchImpl,
36
+ };
37
+ try {
38
+ switch (args.command) {
39
+ case "init":
40
+ return await runInit({
41
+ ...shared,
42
+ yes: flagBoolean(args, "yes"),
43
+ force: flagBoolean(args, "force"),
44
+ css: flagString(args, "css"),
45
+ noInstall: flagBoolean(args, "no-install"),
46
+ dryRun: flagBoolean(args, "dry-run"),
47
+ installPackages: context.installPackages,
48
+ });
49
+ case "add":
50
+ return await runAdd({
51
+ ...shared,
52
+ items: args.positionals,
53
+ yes: flagBoolean(args, "yes"),
54
+ overwrite: flagBoolean(args, "overwrite"),
55
+ noOverwrite: flagBoolean(args, "no-overwrite"),
56
+ noInstall: flagBoolean(args, "no-install"),
57
+ dryRun: flagBoolean(args, "dry-run"),
58
+ installPackages: context.installPackages,
59
+ });
60
+ case "doctor":
61
+ return await runDoctor({
62
+ cwd,
63
+ json: flagBoolean(args, "json"),
64
+ logger,
65
+ });
66
+ case "diff":
67
+ return await runDiff({
68
+ ...shared,
69
+ items: args.positionals,
70
+ all: flagBoolean(args, "all"),
71
+ json: flagBoolean(args, "json"),
72
+ });
73
+ case "list":
74
+ return await runList({
75
+ ...shared,
76
+ query: args.positionals[0],
77
+ json: flagBoolean(args, "json"),
78
+ });
79
+ case "view":
80
+ if (!args.positionals[0]) {
81
+ throw new CommandError("Name the item to inspect, for example: aback-ui view button");
82
+ }
83
+ return await runView({
84
+ ...shared,
85
+ item: args.positionals[0],
86
+ json: flagBoolean(args, "json"),
87
+ });
88
+ default:
89
+ logger.error(`Unknown command: ${args.command}`);
90
+ logger.dim("Run `aback-ui --help` for usage.");
91
+ return 1;
92
+ }
93
+ }
94
+ catch (error) {
95
+ if (error instanceof CommandError) {
96
+ logger.error(error.message);
97
+ return error.code;
98
+ }
99
+ logger.error(error instanceof Error ? error.message : String(error));
100
+ if (process.env.DEBUG) {
101
+ logger.dim(error instanceof Error ? (error.stack ?? "") : "");
102
+ }
103
+ return 1;
104
+ }
105
+ }
106
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type DependencyCommand, type InstallDependenciesOptions } from "../install.js";
2
+ import type { Logger } from "../logger.js";
3
+ import type { Prompter } from "../prompt.js";
4
+ import type { RegistryFetch } from "../types.js";
5
+ export interface AddCommandOptions {
6
+ cwd: string;
7
+ items: string[];
8
+ yes?: boolean;
9
+ overwrite?: boolean;
10
+ noOverwrite?: boolean;
11
+ noInstall?: boolean;
12
+ dryRun?: boolean;
13
+ registry?: string;
14
+ logger: Logger;
15
+ prompter: Prompter;
16
+ fetchImpl?: RegistryFetch;
17
+ installPackages?: (options: InstallDependenciesOptions) => Promise<void>;
18
+ }
19
+ /**
20
+ * The registry a project installs from. The standard "@aback" entry means
21
+ * the registry bundled with this CLI; any other template is a mirror or a
22
+ * self-hosted copy and is used as written.
23
+ */
24
+ export declare function registryBaseFromConfig(config: {
25
+ registries?: Record<string, string>;
26
+ }): string;
27
+ export declare function runAdd(options: AddCommandOptions): Promise<number>;
28
+ export declare function describeInstallCommand(command: DependencyCommand): string;
29
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,MAAM,CAK9F;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ExE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,82 @@
1
+ import path from "node:path";
2
+ import { findProjectRoot, loadConfig, resolveInstallDirs, detectPackageManager } from "../config.js";
3
+ import { commandError } from "../errors.js";
4
+ import { installDependencies, writeItemFiles, } from "../install.js";
5
+ import { DEFAULT_REGISTRY, RegistryClient, defaultRegistry } from "../registry.js";
6
+ const REGISTRY_TEMPLATE = /\/?\{name\}\.json$/;
7
+ /**
8
+ * The registry a project installs from. The standard "@aback" entry means
9
+ * the registry bundled with this CLI; any other template is a mirror or a
10
+ * self-hosted copy and is used as written.
11
+ */
12
+ export function registryBaseFromConfig(config) {
13
+ const template = config.registries?.["@aback"];
14
+ if (!template)
15
+ return defaultRegistry();
16
+ const base = template.replace(REGISTRY_TEMPLATE, "");
17
+ return base === DEFAULT_REGISTRY ? defaultRegistry() : base;
18
+ }
19
+ export async function runAdd(options) {
20
+ const { logger } = options;
21
+ if (options.items.length === 0) {
22
+ throw commandError("Name at least one component, for example: aback-ui add button");
23
+ }
24
+ const projectRoot = await findProjectRoot(options.cwd);
25
+ if (!projectRoot) {
26
+ throw commandError(`No package.json found from ${options.cwd}. Run this inside the project you want to edit.`);
27
+ }
28
+ const config = await loadConfig(projectRoot);
29
+ if (!config) {
30
+ throw commandError("No aback-ui.json found. Run `aback-ui init` first.");
31
+ }
32
+ const client = new RegistryClient({
33
+ registry: options.registry ?? process.env.ABACK_UI_REGISTRY ?? registryBaseFromConfig(config),
34
+ cwd: projectRoot,
35
+ registries: config.registries,
36
+ fetchImpl: options.fetchImpl,
37
+ });
38
+ logger.step(`Resolving ${options.items.length} item(s)`);
39
+ const items = await client.collect(options.items);
40
+ const dirs = await resolveInstallDirs(projectRoot, config);
41
+ const overwrite = options.overwrite
42
+ ? "always"
43
+ : options.noOverwrite || options.yes
44
+ ? "never"
45
+ : "prompt";
46
+ const results = await writeItemFiles({
47
+ items,
48
+ projectRoot,
49
+ dirs,
50
+ overwrite,
51
+ dryRun: options.dryRun,
52
+ log: logger,
53
+ prompt: options.prompter,
54
+ });
55
+ const install = options.installPackages ?? installDependencies;
56
+ await install({
57
+ cwd: projectRoot,
58
+ packageManager: await detectPackageManager(projectRoot),
59
+ dependencies: [...new Set(items.flatMap((item) => item.dependencies ?? []))].sort(),
60
+ devDependencies: [...new Set(items.flatMap((item) => item.devDependencies ?? []))].sort(),
61
+ noInstall: options.noInstall,
62
+ dryRun: options.dryRun,
63
+ log: logger,
64
+ });
65
+ const written = results.filter((result) => result.status === "written").length;
66
+ const kept = results.filter((result) => result.status === "skipped").length;
67
+ logger.raw("");
68
+ if (options.dryRun) {
69
+ logger.info(`Dry run: ${items.length} item(s), ${results.length} file(s), ${written} new.`);
70
+ return 0;
71
+ }
72
+ logger.success(`Installed ${items.map((item) => item.name).join(", ")} (${written} file${written === 1 ? "" : "s"} written${kept ? `, ${kept} kept` : ""}).`);
73
+ for (const item of items) {
74
+ if (item.docs)
75
+ logger.dim(` ${item.docs.replace("https://abackui.com", "")}`);
76
+ }
77
+ return 0;
78
+ }
79
+ export function describeInstallCommand(command) {
80
+ return `${path.basename(command.command)} ${command.args.join(" ")}`;
81
+ }
82
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Logger } from "../logger.js";
2
+ import type { RegistryFetch } from "../types.js";
3
+ export interface DiffCommandOptions {
4
+ cwd: string;
5
+ items: string[];
6
+ all?: boolean;
7
+ json?: boolean;
8
+ registry?: string;
9
+ logger: Logger;
10
+ fetchImpl?: RegistryFetch;
11
+ }
12
+ export declare function runDiff(options: DiffCommandOptions): Promise<number>;
13
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoF1E"}
@@ -0,0 +1,85 @@
1
+ import { findProjectRoot, loadConfig, resolveInstallDirs } from "../config.js";
2
+ import { commandError } from "../errors.js";
3
+ import { diffItems, trimDiff } from "../diff.js";
4
+ import { RegistryClient } from "../registry.js";
5
+ import { registryBaseFromConfig } from "./add.js";
6
+ export async function runDiff(options) {
7
+ if (options.items.length === 0 && !options.all) {
8
+ throw commandError("Name the items to compare, or pass --all to compare every installed item, for example: aback-ui diff button");
9
+ }
10
+ const projectRoot = await findProjectRoot(options.cwd);
11
+ if (!projectRoot) {
12
+ throw commandError(`No package.json found from ${options.cwd}.`);
13
+ }
14
+ const config = await loadConfig(projectRoot);
15
+ if (!config) {
16
+ throw commandError("No aback-ui.json found. Run `aback-ui init` first.");
17
+ }
18
+ const client = new RegistryClient({
19
+ registry: options.registry ?? process.env.ABACK_UI_REGISTRY ?? registryBaseFromConfig(config),
20
+ cwd: projectRoot,
21
+ registries: config.registries,
22
+ fetchImpl: options.fetchImpl,
23
+ });
24
+ let specifiers = options.items;
25
+ if (options.all) {
26
+ const index = await client.index();
27
+ specifiers = index.items
28
+ .filter((item) => item.type === "registry:ui" || item.type === "registry:block")
29
+ .map((item) => item.name);
30
+ }
31
+ if (!options.json) {
32
+ options.logger.step(`Comparing ${specifiers.length} item(s) with the registry`);
33
+ }
34
+ const items = [];
35
+ for (const specifier of specifiers) {
36
+ items.push(await client.item(specifier));
37
+ }
38
+ const dirs = await resolveInstallDirs(projectRoot, config);
39
+ const results = await diffItems({ projectRoot, dirs, items });
40
+ if (options.json) {
41
+ options.logger.raw(JSON.stringify(results.map((result) => ({
42
+ item: result.item,
43
+ target: result.target,
44
+ status: result.status,
45
+ changes: result.lines.filter((line) => line.type !== "context").length,
46
+ })), null, 2));
47
+ return 0;
48
+ }
49
+ const changed = results.filter((result) => result.status !== "unchanged");
50
+ if (changed.length === 0) {
51
+ options.logger.success("Installed files match the registry.");
52
+ return 0;
53
+ }
54
+ for (const result of results) {
55
+ if (result.status === "unchanged")
56
+ continue;
57
+ options.logger.raw("");
58
+ options.logger.raw(`${result.target}${result.status === "missing" ? " (missing)" : ""}`);
59
+ if (result.status === "missing") {
60
+ options.logger.warn("The registry file is not installed. Run `aback-ui add` to add it.");
61
+ continue;
62
+ }
63
+ printDiff(result, options.logger);
64
+ }
65
+ options.logger.raw("");
66
+ options.logger.info(`${changed.length} of ${results.length} file(s) differ. "−" is your file, "+" is the registry version.`);
67
+ return 0;
68
+ }
69
+ function printDiff(result, logger) {
70
+ for (const line of trimDiff(result.lines)) {
71
+ if (line === "gap") {
72
+ logger.dim(" …");
73
+ }
74
+ else if (line.type === "add") {
75
+ logger.raw(` + ${line.text}`);
76
+ }
77
+ else if (line.type === "remove") {
78
+ logger.raw(` - ${line.text}`);
79
+ }
80
+ else {
81
+ logger.dim(` ${line.text}`);
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Logger } from "../logger.js";
2
+ export interface DoctorCommandOptions {
3
+ cwd: string;
4
+ json?: boolean;
5
+ logger: Logger;
6
+ }
7
+ export declare function runDoctor(options: DoctorCommandOptions): Promise<number>;
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AASD,wBAAsB,SAAS,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C9E"}