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.
- package/LICENSE +21 -0
- package/README.md +85 -2
- package/dist/args.d.ts +15 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +91 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +106 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +29 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +82 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/diff.d.ts +13 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +85 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +45 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +97 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +11 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +42 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/view.d.ts +11 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +43 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/config.d.ts +66 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +297 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +30 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +121 -0
- package/dist/diff.js.map +1 -0
- package/dist/doctor.d.ts +35 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +203 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.d.ts +3 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +48 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +53 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +119 -0
- package/dist/install.js.map +1 -0
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +47 -0
- package/dist/logger.js.map +1 -0
- package/dist/paths.d.ts +18 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +76 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompt.d.ts +13 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +25 -0
- package/dist/prompt.js.map +1 -0
- package/dist/registry.d.ts +49 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +216 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -4
- package/registry/accordion.json +32 -0
- package/registry/alert-dialog.json +28 -0
- package/registry/alert.json +31 -0
- package/registry/article-layout.json +38 -0
- package/registry/avatar.json +31 -0
- package/registry/badge.json +33 -0
- package/registry/breadcrumbs.json +32 -0
- package/registry/button.json +34 -0
- package/registry/calendar.json +29 -0
- package/registry/card.json +30 -0
- package/registry/checkbox.json +33 -0
- package/registry/code-block.json +29 -0
- package/registry/collapsible.json +28 -0
- package/registry/combobox.json +30 -0
- package/registry/command.json +34 -0
- package/registry/contact-form.json +37 -0
- package/registry/cookie-consent.json +28 -0
- package/registry/copy-button.json +33 -0
- package/registry/cta-banner.json +32 -0
- package/registry/dashboard-shell.json +32 -0
- package/registry/date-picker.json +32 -0
- package/registry/description-list.json +28 -0
- package/registry/dialog.json +33 -0
- package/registry/dropdown-menu.json +33 -0
- package/registry/dropzone.json +31 -0
- package/registry/empty-state.json +32 -0
- package/registry/faq.json +31 -0
- package/registry/feature-grid.json +33 -0
- package/registry/field.json +29 -0
- package/registry/hero.json +32 -0
- package/registry/hover-card.json +28 -0
- package/registry/index.json +1633 -0
- package/registry/input-group.json +30 -0
- package/registry/input.json +29 -0
- package/registry/kbd.json +29 -0
- package/registry/label.json +29 -0
- package/registry/layout.json +32 -0
- package/registry/newsletter.json +35 -0
- package/registry/not-found.json +34 -0
- package/registry/page-header.json +29 -0
- package/registry/pagination.json +25 -0
- package/registry/popover.json +28 -0
- package/registry/pricing.json +35 -0
- package/registry/progress.json +28 -0
- package/registry/radio-group.json +28 -0
- package/registry/rating.json +32 -0
- package/registry/reading-progress.json +29 -0
- package/registry/relative-time.json +29 -0
- package/registry/scroll-area.json +28 -0
- package/registry/section-heading.json +30 -0
- package/registry/select.json +32 -0
- package/registry/separator.json +32 -0
- package/registry/settings-section.json +32 -0
- package/registry/share-buttons.json +34 -0
- package/registry/sheet.json +34 -0
- package/registry/sign-in.json +31 -0
- package/registry/site-footer.json +31 -0
- package/registry/site-header.json +37 -0
- package/registry/skeleton.json +28 -0
- package/registry/skip-link.json +30 -0
- package/registry/slider.json +28 -0
- package/registry/spinner.json +32 -0
- package/registry/stat.json +32 -0
- package/registry/steps.json +31 -0
- package/registry/switch.json +32 -0
- package/registry/table-of-contents.json +32 -0
- package/registry/table.json +28 -0
- package/registry/tabs.json +29 -0
- package/registry/textarea.json +29 -0
- package/registry/theme-toggle.json +34 -0
- package/registry/theme.json +16 -0
- package/registry/toast.json +29 -0
- package/registry/toggle-group.json +29 -0
- package/registry/tooltip.json +29 -0
- package/registry/users-table.json +36 -0
- package/registry/utils.json +19 -0
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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"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -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"}
|
package/dist/registry.js
ADDED
|
@@ -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":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export interface RegistryFile {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
target?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RegistryItemMeta {
|
|
8
|
+
status?: string;
|
|
9
|
+
usedIn?: string[];
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface RegistryItem {
|
|
13
|
+
name: string;
|
|
14
|
+
type: string;
|
|
15
|
+
title?: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
dependencies?: string[];
|
|
18
|
+
devDependencies?: string[];
|
|
19
|
+
registryDependencies?: string[];
|
|
20
|
+
categories?: string[];
|
|
21
|
+
docs?: string;
|
|
22
|
+
meta?: RegistryItemMeta;
|
|
23
|
+
files: RegistryFile[];
|
|
24
|
+
}
|
|
25
|
+
export interface RegistryIndexItem {
|
|
26
|
+
name: string;
|
|
27
|
+
type: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
categories?: string[];
|
|
31
|
+
docs?: string;
|
|
32
|
+
dependencies?: string[];
|
|
33
|
+
registryDependencies?: string[];
|
|
34
|
+
meta?: RegistryItemMeta;
|
|
35
|
+
}
|
|
36
|
+
export interface RegistryIndex {
|
|
37
|
+
name?: string;
|
|
38
|
+
homepage?: string;
|
|
39
|
+
items: RegistryIndexItem[];
|
|
40
|
+
}
|
|
41
|
+
export type PackageManager = "bun" | "pnpm" | "yarn" | "npm";
|
|
42
|
+
export interface AbackConfig {
|
|
43
|
+
$schema?: string;
|
|
44
|
+
style?: string;
|
|
45
|
+
rsc?: boolean;
|
|
46
|
+
tsx?: boolean;
|
|
47
|
+
tailwind?: {
|
|
48
|
+
config?: string;
|
|
49
|
+
css?: string;
|
|
50
|
+
baseColor?: string;
|
|
51
|
+
cssVariables?: boolean;
|
|
52
|
+
[key: string]: unknown;
|
|
53
|
+
};
|
|
54
|
+
aliases?: {
|
|
55
|
+
components?: string;
|
|
56
|
+
utils?: string;
|
|
57
|
+
ui?: string;
|
|
58
|
+
lib?: string;
|
|
59
|
+
hooks?: string;
|
|
60
|
+
[key: string]: string | undefined;
|
|
61
|
+
};
|
|
62
|
+
registries?: Record<string, string>;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
export interface InstallDirs {
|
|
66
|
+
components: string;
|
|
67
|
+
ui: string;
|
|
68
|
+
blocks: string;
|
|
69
|
+
lib: string;
|
|
70
|
+
hooks: string;
|
|
71
|
+
styles: string;
|
|
72
|
+
}
|
|
73
|
+
export type OverwriteMode = "prompt" | "always" | "never";
|
|
74
|
+
export interface FileWriteResult {
|
|
75
|
+
item: string;
|
|
76
|
+
target: string;
|
|
77
|
+
absolutePath: string;
|
|
78
|
+
status: "written" | "unchanged" | "skipped";
|
|
79
|
+
}
|
|
80
|
+
export interface RegistryFetch {
|
|
81
|
+
(url: string): Promise<{
|
|
82
|
+
ok: boolean;
|
|
83
|
+
status: number;
|
|
84
|
+
json(): Promise<unknown>;
|
|
85
|
+
text(): Promise<string>;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aback-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "The Aback UI command line: add accessible React components and blocks to your project as source you own.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Aback Group",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/devvrat-hans/aback-ui.git",
|
|
11
|
+
"directory": "packages/cli"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://abackui.com/docs/cli",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/devvrat-hans/aback-ui/issues"
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=20.9.0"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"aback-ui": "dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"registry",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "rm -rf dist registry node_modules/.cache && tsc -p tsconfig.build.json && chmod +x dist/index.js && bun ../../scripts/bundle-registry.mjs",
|
|
41
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest",
|
|
44
|
+
"prepublishOnly": "bun run typecheck && bun run test && bun run build && bun ../../scripts/verify-publishable.mjs"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^24.10.1",
|
|
48
|
+
"typescript": "^5.9.3",
|
|
49
|
+
"vitest": "^5.0.5"
|
|
50
|
+
},
|
|
51
|
+
"keywords": [
|
|
52
|
+
"aback",
|
|
53
|
+
"aback-ui",
|
|
54
|
+
"cli",
|
|
55
|
+
"components",
|
|
56
|
+
"design-system",
|
|
57
|
+
"react",
|
|
58
|
+
"tailwindcss",
|
|
59
|
+
"ui"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://abackui.com/schema/registry-item.json",
|
|
3
|
+
"name": "accordion",
|
|
4
|
+
"type": "registry:ui",
|
|
5
|
+
"title": "Accordion",
|
|
6
|
+
"description": "Disclosure sections for FAQs and grouped settings, with full keyboard support.",
|
|
7
|
+
"dependencies": [
|
|
8
|
+
"radix-ui",
|
|
9
|
+
"@tabler/icons-react"
|
|
10
|
+
],
|
|
11
|
+
"registryDependencies": [
|
|
12
|
+
"https://abackui.com/r/utils.json"
|
|
13
|
+
],
|
|
14
|
+
"categories": [
|
|
15
|
+
"Navigation"
|
|
16
|
+
],
|
|
17
|
+
"docs": "https://abackui.com/docs/components/accordion",
|
|
18
|
+
"meta": {
|
|
19
|
+
"status": "stable",
|
|
20
|
+
"usedIn": [
|
|
21
|
+
"aback-tools"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
{
|
|
26
|
+
"path": "components/ui/accordion.tsx",
|
|
27
|
+
"content": "\"use client\";\n\nimport * as React from \"react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\nimport { IconChevronDown } from \"@tabler/icons-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Accordion = AccordionPrimitive.Root;\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b border-border\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between gap-3 py-4 text-left text-sm font-medium text-foreground\",\n \"outline-none transition-colors duration-200 hover:text-link\",\n \"focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <IconChevronDown\n aria-hidden=\"true\"\n className=\"size-5 shrink-0 text-muted-foreground transition-transform duration-200\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className={cn(\n \"overflow-hidden text-sm text-muted-foreground\",\n \"data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out]\",\n )}\n {...props}\n >\n <div className={cn(\"pb-4 leading-relaxed\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n",
|
|
28
|
+
"type": "registry:ui",
|
|
29
|
+
"target": "components/ui/accordion.tsx"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|