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/config.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export class ConfigError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "ConfigError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
async function exists(file) {
|
|
10
|
+
try {
|
|
11
|
+
await access(file);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function existsPath(file) {
|
|
19
|
+
return exists(file);
|
|
20
|
+
}
|
|
21
|
+
/** Walk upward from `start` until a package.json is found. */
|
|
22
|
+
export async function findProjectRoot(start) {
|
|
23
|
+
let current = path.resolve(start);
|
|
24
|
+
for (;;) {
|
|
25
|
+
if (await exists(path.join(current, "package.json")))
|
|
26
|
+
return current;
|
|
27
|
+
const parent = path.dirname(current);
|
|
28
|
+
if (parent === current)
|
|
29
|
+
return null;
|
|
30
|
+
current = parent;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function readPackageJson(root) {
|
|
34
|
+
const file = path.join(root, "package.json");
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(await readFile(file, "utf8"));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new ConfigError(`Could not read ${file}: ${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function detectPackageManager(root) {
|
|
43
|
+
if ((await exists(path.join(root, "bun.lock"))) || (await exists(path.join(root, "bun.lockb")))) {
|
|
44
|
+
return "bun";
|
|
45
|
+
}
|
|
46
|
+
if (await exists(path.join(root, "pnpm-lock.yaml")))
|
|
47
|
+
return "pnpm";
|
|
48
|
+
if (await exists(path.join(root, "yarn.lock")))
|
|
49
|
+
return "yarn";
|
|
50
|
+
if (await exists(path.join(root, "package-lock.json")))
|
|
51
|
+
return "npm";
|
|
52
|
+
try {
|
|
53
|
+
const pkg = await readPackageJson(root);
|
|
54
|
+
if (pkg.packageManager?.startsWith("bun"))
|
|
55
|
+
return "bun";
|
|
56
|
+
if (pkg.packageManager?.startsWith("pnpm"))
|
|
57
|
+
return "pnpm";
|
|
58
|
+
if (pkg.packageManager?.startsWith("yarn"))
|
|
59
|
+
return "yarn";
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Fall through to npm.
|
|
63
|
+
}
|
|
64
|
+
return "npm";
|
|
65
|
+
}
|
|
66
|
+
export function detectFramework(pkg) {
|
|
67
|
+
const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
68
|
+
if (dependencies.next)
|
|
69
|
+
return "next";
|
|
70
|
+
if (dependencies["@remix-run/react"])
|
|
71
|
+
return "remix";
|
|
72
|
+
if (dependencies.astro)
|
|
73
|
+
return "astro";
|
|
74
|
+
if (dependencies.vite)
|
|
75
|
+
return "vite";
|
|
76
|
+
return "unknown";
|
|
77
|
+
}
|
|
78
|
+
/** Major version of the installed Tailwind package, or null when absent. */
|
|
79
|
+
export function detectTailwindMajor(pkg) {
|
|
80
|
+
const version = pkg.devDependencies?.tailwindcss ?? pkg.dependencies?.tailwindcss;
|
|
81
|
+
if (!version)
|
|
82
|
+
return null;
|
|
83
|
+
const match = /(\d+)/.exec(version);
|
|
84
|
+
return match?.[1] ? Number(match[1]) : null;
|
|
85
|
+
}
|
|
86
|
+
export async function detectSrcDir(root) {
|
|
87
|
+
const candidates = ["src/app", "src/pages", "src/components", "src/lib", "src/routes"];
|
|
88
|
+
for (const candidate of candidates) {
|
|
89
|
+
if (await exists(path.join(root, candidate)))
|
|
90
|
+
return "src";
|
|
91
|
+
}
|
|
92
|
+
return "";
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Strip comments and trailing commas from a JSON-with-comments file. The scan
|
|
96
|
+
* skips over strings, because tsconfig paths such as "@/*" and "**\/*.ts"
|
|
97
|
+
* look like comment markers.
|
|
98
|
+
*/
|
|
99
|
+
export function parseJsonc(source) {
|
|
100
|
+
let output = "";
|
|
101
|
+
let index = 0;
|
|
102
|
+
while (index < source.length) {
|
|
103
|
+
const char = source[index];
|
|
104
|
+
const next = source[index + 1];
|
|
105
|
+
if (char === '"') {
|
|
106
|
+
let end = index + 1;
|
|
107
|
+
while (end < source.length && source[end] !== '"') {
|
|
108
|
+
end += source[end] === "\\" ? 2 : 1;
|
|
109
|
+
}
|
|
110
|
+
output += source.slice(index, end + 1);
|
|
111
|
+
index = end + 1;
|
|
112
|
+
}
|
|
113
|
+
else if (char === "/" && next === "/") {
|
|
114
|
+
while (index < source.length && source[index] !== "\n")
|
|
115
|
+
index += 1;
|
|
116
|
+
}
|
|
117
|
+
else if (char === "/" && next === "*") {
|
|
118
|
+
const end = source.indexOf("*/", index + 2);
|
|
119
|
+
index = end === -1 ? source.length : end + 2;
|
|
120
|
+
}
|
|
121
|
+
else if (char === "}" || char === "]") {
|
|
122
|
+
output = output.replace(/,\s*$/, "");
|
|
123
|
+
output += char;
|
|
124
|
+
index += 1;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
output += char;
|
|
128
|
+
index += 1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return JSON.parse(output);
|
|
132
|
+
}
|
|
133
|
+
export async function readTsconfig(root) {
|
|
134
|
+
for (const name of ["tsconfig.json", "jsconfig.json"]) {
|
|
135
|
+
const file = path.join(root, name);
|
|
136
|
+
if (!(await exists(file)))
|
|
137
|
+
continue;
|
|
138
|
+
try {
|
|
139
|
+
const parsed = parseJsonc(await readFile(file, "utf8"));
|
|
140
|
+
return {
|
|
141
|
+
baseUrl: parsed.compilerOptions?.baseUrl,
|
|
142
|
+
paths: parsed.compilerOptions?.paths ?? {},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new ConfigError(`Could not read ${name}: ${error.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return { paths: {} };
|
|
150
|
+
}
|
|
151
|
+
function isInside(root, candidate) {
|
|
152
|
+
const relative = path.relative(root, candidate);
|
|
153
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Resolve a path alias such as `@/components/ui` against the tsconfig paths.
|
|
157
|
+
* Returns null when the alias has no mapping or escapes the project.
|
|
158
|
+
*/
|
|
159
|
+
export function resolveAlias(alias, tsconfig, root) {
|
|
160
|
+
let best = null;
|
|
161
|
+
for (const [key, targets] of Object.entries(tsconfig.paths)) {
|
|
162
|
+
const target = targets[0];
|
|
163
|
+
if (!target)
|
|
164
|
+
continue;
|
|
165
|
+
if (key.endsWith("/*")) {
|
|
166
|
+
const keyPrefix = key.slice(0, -1); // keep the trailing slash
|
|
167
|
+
if (!alias.startsWith(keyPrefix))
|
|
168
|
+
continue;
|
|
169
|
+
if (best && best.key.length >= key.length)
|
|
170
|
+
continue;
|
|
171
|
+
best = { key, target };
|
|
172
|
+
}
|
|
173
|
+
else if (key === alias) {
|
|
174
|
+
best = { key, target };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!best)
|
|
178
|
+
return null;
|
|
179
|
+
const targetBase = best.target.replace(/\*$/, "");
|
|
180
|
+
const remainder = best.key.endsWith("/*")
|
|
181
|
+
? alias.slice(best.key.length - 1) // drop the wildcard, keep the slash
|
|
182
|
+
: "";
|
|
183
|
+
const baseDirectory = tsconfig.baseUrl
|
|
184
|
+
? path.resolve(root, tsconfig.baseUrl)
|
|
185
|
+
: root;
|
|
186
|
+
const resolved = path.resolve(baseDirectory, `${targetBase}${remainder}`);
|
|
187
|
+
if (!isInside(root, resolved))
|
|
188
|
+
return null;
|
|
189
|
+
return { absolute: resolved, prefix: alias };
|
|
190
|
+
}
|
|
191
|
+
/** Best-effort alias from the tsconfig: prefer `@/*`, otherwise the first wildcard. */
|
|
192
|
+
export function detectAlias(tsconfig, root) {
|
|
193
|
+
const preferred = tsconfig.paths["@/*"]?.[0];
|
|
194
|
+
if (preferred) {
|
|
195
|
+
const resolved = resolveAlias("@/__aback_probe__", tsconfig, root);
|
|
196
|
+
if (resolved) {
|
|
197
|
+
return {
|
|
198
|
+
prefix: "@/",
|
|
199
|
+
base: path.dirname(resolved.absolute),
|
|
200
|
+
paths: tsconfig.paths,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
for (const key of Object.keys(tsconfig.paths)) {
|
|
205
|
+
if (!key.endsWith("/*"))
|
|
206
|
+
continue;
|
|
207
|
+
const prefix = key.slice(0, -1);
|
|
208
|
+
const resolved = resolveAlias(`${prefix}__aback_probe__`, tsconfig, root);
|
|
209
|
+
if (resolved) {
|
|
210
|
+
return {
|
|
211
|
+
prefix,
|
|
212
|
+
base: path.dirname(resolved.absolute),
|
|
213
|
+
paths: tsconfig.paths,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const CSS_CANDIDATES = [
|
|
220
|
+
"app/globals.css",
|
|
221
|
+
"src/app/globals.css",
|
|
222
|
+
"styles/globals.css",
|
|
223
|
+
"src/styles/globals.css",
|
|
224
|
+
"src/index.css",
|
|
225
|
+
"src/styles/index.css",
|
|
226
|
+
"app/globals.scss",
|
|
227
|
+
];
|
|
228
|
+
export async function detectCssFile(root) {
|
|
229
|
+
for (const candidate of CSS_CANDIDATES) {
|
|
230
|
+
if (await exists(path.join(root, candidate)))
|
|
231
|
+
return candidate;
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
/** The project configuration file `aback-ui init` writes. */
|
|
236
|
+
export const CONFIG_FILE = "aback-ui.json";
|
|
237
|
+
export async function loadConfig(root) {
|
|
238
|
+
const file = path.join(root, CONFIG_FILE);
|
|
239
|
+
if (!(await exists(file)))
|
|
240
|
+
return null;
|
|
241
|
+
try {
|
|
242
|
+
return JSON.parse(await readFile(file, "utf8"));
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
throw new ConfigError(`${CONFIG_FILE} is not valid JSON: ${error.message}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
export async function writeConfig(root, config) {
|
|
249
|
+
await writeFile(path.join(root, CONFIG_FILE), `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
250
|
+
}
|
|
251
|
+
export function createConfig({ aliasPrefix, css, rsc, tsx, framework }) {
|
|
252
|
+
return {
|
|
253
|
+
$schema: "https://abackui.com/schema/aback-ui.json",
|
|
254
|
+
style: "aback",
|
|
255
|
+
rsc,
|
|
256
|
+
tsx,
|
|
257
|
+
tailwind: {
|
|
258
|
+
css,
|
|
259
|
+
},
|
|
260
|
+
aliases: {
|
|
261
|
+
components: `${aliasPrefix}components`,
|
|
262
|
+
utils: `${aliasPrefix}lib/utils`,
|
|
263
|
+
ui: `${aliasPrefix}components/ui`,
|
|
264
|
+
lib: `${aliasPrefix}lib`,
|
|
265
|
+
hooks: `${aliasPrefix}hooks`,
|
|
266
|
+
},
|
|
267
|
+
registries: {
|
|
268
|
+
"@aback": "https://abackui.com/r/{name}.json",
|
|
269
|
+
},
|
|
270
|
+
framework,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/** Project directories for each alias, resolved against the project root. */
|
|
274
|
+
export async function resolveInstallDirs(root, config) {
|
|
275
|
+
const tsconfig = await readTsconfig(root);
|
|
276
|
+
const alias = detectAlias(tsconfig, root);
|
|
277
|
+
const base = alias?.base ?? path.join(root, await detectSrcDir(root));
|
|
278
|
+
function resolve(aliasValue, fallback) {
|
|
279
|
+
if (!aliasValue)
|
|
280
|
+
return path.join(base, fallback);
|
|
281
|
+
const resolved = resolveAlias(aliasValue, tsconfig, root);
|
|
282
|
+
return resolved?.absolute ?? path.join(base, fallback);
|
|
283
|
+
}
|
|
284
|
+
const components = resolve(config.aliases?.components, "components");
|
|
285
|
+
return {
|
|
286
|
+
components,
|
|
287
|
+
ui: resolve(config.aliases?.ui, "components/ui"),
|
|
288
|
+
blocks: path.join(components, "blocks"),
|
|
289
|
+
lib: resolve(config.aliases?.lib, "lib"),
|
|
290
|
+
hooks: resolve(config.aliases?.hooks, "hooks"),
|
|
291
|
+
styles: path.join(root, "styles"),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
export async function ensureDirectory(directory) {
|
|
295
|
+
await mkdir(directory, { recursive: true });
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/diff.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { InstallDirs, RegistryItem } from "./types.js";
|
|
2
|
+
export type DiffLineType = "add" | "remove" | "context";
|
|
3
|
+
export interface DiffLine {
|
|
4
|
+
type: DiffLineType;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export type DiffStatus = "unchanged" | "modified" | "missing";
|
|
8
|
+
export interface FileDiff {
|
|
9
|
+
item: string;
|
|
10
|
+
target: string;
|
|
11
|
+
absolutePath: string;
|
|
12
|
+
status: DiffStatus;
|
|
13
|
+
lines: DiffLine[];
|
|
14
|
+
}
|
|
15
|
+
/** A line-based longest-common-subsequence diff; enough for source files. */
|
|
16
|
+
export declare function diffLines(before: string, after: string): DiffLine[];
|
|
17
|
+
export interface DiffItemsOptions {
|
|
18
|
+
projectRoot: string;
|
|
19
|
+
dirs: InstallDirs;
|
|
20
|
+
items: RegistryItem[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compare the files currently on disk with the registry version. The diff is
|
|
24
|
+
* written from the installed file (`-`) to the registry file (`+`), so it says
|
|
25
|
+
* what reinstalling would change.
|
|
26
|
+
*/
|
|
27
|
+
export declare function diffItems({ projectRoot, dirs, items, }: DiffItemsOptions): Promise<FileDiff[]>;
|
|
28
|
+
/** Keep two context lines around each change and cap very large diffs. */
|
|
29
|
+
export declare function trimDiff(lines: DiffLine[], context?: number, maxLines?: number): Array<DiffLine | "gap">;
|
|
30
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAuCnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,EAC9B,WAAW,EACX,IAAI,EACJ,KAAK,GACN,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA2CxC;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,SAAI,EAAE,QAAQ,SAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CA4BhG"}
|
package/dist/diff.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { existsPath } from "./config.js";
|
|
4
|
+
import { resolveTargetPath, toPosix } from "./paths.js";
|
|
5
|
+
/** A line-based longest-common-subsequence diff; enough for source files. */
|
|
6
|
+
export function diffLines(before, after) {
|
|
7
|
+
const a = before.split("\n");
|
|
8
|
+
const b = after.split("\n");
|
|
9
|
+
const n = a.length;
|
|
10
|
+
const m = b.length;
|
|
11
|
+
const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
12
|
+
for (let i = n - 1; i >= 0; i -= 1) {
|
|
13
|
+
for (let j = m - 1; j >= 0; j -= 1) {
|
|
14
|
+
dp[i][j] =
|
|
15
|
+
a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const lines = [];
|
|
19
|
+
let i = 0;
|
|
20
|
+
let j = 0;
|
|
21
|
+
while (i < n && j < m) {
|
|
22
|
+
if (a[i] === b[j]) {
|
|
23
|
+
lines.push({ type: "context", text: a[i] ?? "" });
|
|
24
|
+
i += 1;
|
|
25
|
+
j += 1;
|
|
26
|
+
}
|
|
27
|
+
else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
28
|
+
lines.push({ type: "remove", text: a[i] ?? "" });
|
|
29
|
+
i += 1;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
lines.push({ type: "add", text: b[j] ?? "" });
|
|
33
|
+
j += 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
while (i < n) {
|
|
37
|
+
lines.push({ type: "remove", text: a[i] ?? "" });
|
|
38
|
+
i += 1;
|
|
39
|
+
}
|
|
40
|
+
while (j < m) {
|
|
41
|
+
lines.push({ type: "add", text: b[j] ?? "" });
|
|
42
|
+
j += 1;
|
|
43
|
+
}
|
|
44
|
+
return lines;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Compare the files currently on disk with the registry version. The diff is
|
|
48
|
+
* written from the installed file (`-`) to the registry file (`+`), so it says
|
|
49
|
+
* what reinstalling would change.
|
|
50
|
+
*/
|
|
51
|
+
export async function diffItems({ projectRoot, dirs, items, }) {
|
|
52
|
+
const results = [];
|
|
53
|
+
for (const item of items) {
|
|
54
|
+
for (const file of item.files) {
|
|
55
|
+
const target = file.target ?? file.path;
|
|
56
|
+
const absolutePath = resolveTargetPath(target, dirs, projectRoot);
|
|
57
|
+
const display = toPosix(path.relative(projectRoot, absolutePath));
|
|
58
|
+
if (!(await existsPath(absolutePath))) {
|
|
59
|
+
results.push({
|
|
60
|
+
item: item.name,
|
|
61
|
+
target: display,
|
|
62
|
+
absolutePath,
|
|
63
|
+
status: "missing",
|
|
64
|
+
lines: [],
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const installed = await readFile(absolutePath, "utf8");
|
|
69
|
+
if (installed === file.content) {
|
|
70
|
+
results.push({
|
|
71
|
+
item: item.name,
|
|
72
|
+
target: display,
|
|
73
|
+
absolutePath,
|
|
74
|
+
status: "unchanged",
|
|
75
|
+
lines: [],
|
|
76
|
+
});
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
results.push({
|
|
80
|
+
item: item.name,
|
|
81
|
+
target: display,
|
|
82
|
+
absolutePath,
|
|
83
|
+
status: "modified",
|
|
84
|
+
lines: diffLines(installed, file.content),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
/** Keep two context lines around each change and cap very large diffs. */
|
|
91
|
+
export function trimDiff(lines, context = 2, maxLines = 120) {
|
|
92
|
+
const keep = new Set();
|
|
93
|
+
lines.forEach((line, index) => {
|
|
94
|
+
if (line.type === "context")
|
|
95
|
+
return;
|
|
96
|
+
for (let offset = -context; offset <= context; offset += 1) {
|
|
97
|
+
const target = index + offset;
|
|
98
|
+
if (target >= 0 && target < lines.length)
|
|
99
|
+
keep.add(target);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const output = [];
|
|
103
|
+
let gap = false;
|
|
104
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
105
|
+
if (!keep.has(index)) {
|
|
106
|
+
gap = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (gap && output.length > 0)
|
|
110
|
+
output.push("gap");
|
|
111
|
+
gap = false;
|
|
112
|
+
output.push(lines[index]);
|
|
113
|
+
}
|
|
114
|
+
if (gap)
|
|
115
|
+
output.push("gap");
|
|
116
|
+
if (output.length > maxLines) {
|
|
117
|
+
return [...output.slice(0, maxLines), "gap"];
|
|
118
|
+
}
|
|
119
|
+
return output;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type DoctorStatus = "pass" | "warn" | "fail" | "skip";
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
status: DoctorStatus;
|
|
6
|
+
detail: string;
|
|
7
|
+
/** What the developer should do when the check is not passing. */
|
|
8
|
+
hint?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DoctorSummary {
|
|
11
|
+
passed: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
errors: number;
|
|
14
|
+
skipped: number;
|
|
15
|
+
ok: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface DoctorReport {
|
|
18
|
+
root: string;
|
|
19
|
+
checks: DoctorCheck[];
|
|
20
|
+
summary: DoctorSummary;
|
|
21
|
+
}
|
|
22
|
+
export interface DoctorOptions {
|
|
23
|
+
root: string;
|
|
24
|
+
/** Node version to test, defaulting to the running process. */
|
|
25
|
+
nodeVersion?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Inspect a project without changing it.
|
|
29
|
+
*
|
|
30
|
+
* Every check is local and deterministic: no registry request, no package
|
|
31
|
+
* install, and no file writes. That makes `doctor` safe to run in CI and in a
|
|
32
|
+
* pre-commit hook, and it means the result never depends on network access.
|
|
33
|
+
*/
|
|
34
|
+
export declare function diagnoseProject(options: DoctorOptions): Promise<DoctorReport>;
|
|
35
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgCD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2RnF"}
|