@sntlr/registry-shell 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/adapter/custom.d.ts +47 -0
- package/dist/adapter/custom.js +53 -0
- package/dist/adapter/custom.js.map +1 -0
- package/dist/adapter/default.d.ts +40 -0
- package/dist/adapter/default.js +202 -0
- package/dist/adapter/default.js.map +1 -0
- package/dist/cli/build.d.ts +1 -0
- package/dist/cli/build.js +31 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/dev.d.ts +1 -0
- package/dist/cli/dev.js +26 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +49 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +70 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/shared.d.ts +33 -0
- package/dist/cli/shared.js +278 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/start.d.ts +1 -0
- package/dist/cli/start.js +24 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/config-loader.d.ts +49 -0
- package/dist/config-loader.js +140 -0
- package/dist/define-config.d.ts +188 -0
- package/dist/define-config.js +21 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/package.json +124 -0
- package/src/adapter/custom.ts +90 -0
- package/src/adapter/default.ts +241 -0
- package/src/cli/build.ts +38 -0
- package/src/cli/dev.ts +38 -0
- package/src/cli/index.ts +52 -0
- package/src/cli/init.ts +76 -0
- package/src/cli/shared.ts +306 -0
- package/src/cli/start.ts +28 -0
- package/src/config-loader.ts +190 -0
- package/src/define-config.ts +206 -0
- package/src/index.ts +17 -0
- package/src/next-app/app/[...asset]/route.ts +81 -0
- package/src/next-app/app/_user-global.css +6 -0
- package/src/next-app/app/_user-sources.css +9 -0
- package/src/next-app/app/a11y/[name]/route.ts +19 -0
- package/src/next-app/app/api/search-index/route.ts +19 -0
- package/src/next-app/app/components/[name]/page.tsx +61 -0
- package/src/next-app/app/components/layout.tsx +18 -0
- package/src/next-app/app/docs/[slug]/page.tsx +53 -0
- package/src/next-app/app/docs/layout.tsx +18 -0
- package/src/next-app/app/globals.css +329 -0
- package/src/next-app/app/layout.tsx +102 -0
- package/src/next-app/app/page.tsx +9 -0
- package/src/next-app/app/preview-snapshot/[name]/page.tsx +20 -0
- package/src/next-app/app/preview-snapshot/layout.tsx +17 -0
- package/src/next-app/app/props/[name]/route.ts +19 -0
- package/src/next-app/app/r/[name]/route.ts +14 -0
- package/src/next-app/app/tests/[name]/route.ts +19 -0
- package/src/next-app/components/a11y-info.tsx +287 -0
- package/src/next-app/components/a11y-provider.tsx +39 -0
- package/src/next-app/components/component-breadcrumb.tsx +55 -0
- package/src/next-app/components/component-icon.tsx +140 -0
- package/src/next-app/components/component-preview.tsx +13 -0
- package/src/next-app/components/component-tabs.tsx +209 -0
- package/src/next-app/components/docs-toc.tsx +86 -0
- package/src/next-app/components/global-mobile-sidebar.tsx +35 -0
- package/src/next-app/components/header.tsx +188 -0
- package/src/next-app/components/heading-anchor.tsx +52 -0
- package/src/next-app/components/homepage-demo.tsx +180 -0
- package/src/next-app/components/locale-toggle.tsx +35 -0
- package/src/next-app/components/localized-mdx-client.tsx +14 -0
- package/src/next-app/components/localized-mdx.tsx +27 -0
- package/src/next-app/components/mobile-sidebar.tsx +22 -0
- package/src/next-app/components/nav-data-provider.tsx +37 -0
- package/src/next-app/components/navigation-progress.tsx +62 -0
- package/src/next-app/components/preview-canvas.tsx +368 -0
- package/src/next-app/components/preview-controls.tsx +94 -0
- package/src/next-app/components/preview-layout.tsx +218 -0
- package/src/next-app/components/props-table.tsx +134 -0
- package/src/next-app/components/resizable-preview.tsx +101 -0
- package/src/next-app/components/search.tsx +177 -0
- package/src/next-app/components/settings-modal.tsx +98 -0
- package/src/next-app/components/shell-ui/accordion.tsx +70 -0
- package/src/next-app/components/shell-ui/backdrop.tsx +29 -0
- package/src/next-app/components/shell-ui/badge.tsx +55 -0
- package/src/next-app/components/shell-ui/breadcrumb.tsx +120 -0
- package/src/next-app/components/shell-ui/button.tsx +64 -0
- package/src/next-app/components/shell-ui/card.tsx +127 -0
- package/src/next-app/components/shell-ui/checkbox.tsx +33 -0
- package/src/next-app/components/shell-ui/dialog.tsx +171 -0
- package/src/next-app/components/shell-ui/empty-state.tsx +66 -0
- package/src/next-app/components/shell-ui/input.tsx +27 -0
- package/src/next-app/components/shell-ui/kbd.tsx +30 -0
- package/src/next-app/components/shell-ui/label.tsx +25 -0
- package/src/next-app/components/shell-ui/select.tsx +204 -0
- package/src/next-app/components/shell-ui/separator.tsx +32 -0
- package/src/next-app/components/shell-ui/skeleton.tsx +18 -0
- package/src/next-app/components/shell-ui/table.tsx +124 -0
- package/src/next-app/components/shell-ui/tabs.tsx +102 -0
- package/src/next-app/components/shell-ui/toggle.tsx +56 -0
- package/src/next-app/components/sidebar-layout.tsx +37 -0
- package/src/next-app/components/sidebar-provider.tsx +75 -0
- package/src/next-app/components/sidebar.tsx +222 -0
- package/src/next-app/components/snapshot-preview.tsx +28 -0
- package/src/next-app/components/test-info.tsx +155 -0
- package/src/next-app/components/theme-provider.tsx +16 -0
- package/src/next-app/components/theme-toggle.tsx +21 -0
- package/src/next-app/components/translated-text.tsx +8 -0
- package/src/next-app/fallback/homepage.tsx +112 -0
- package/src/next-app/fallback/previews.ts +17 -0
- package/src/next-app/hooks/use-active-section.ts +23 -0
- package/src/next-app/hooks/use-controls.ts +72 -0
- package/src/next-app/hooks/use-mobile.ts +19 -0
- package/src/next-app/lib/branding.ts +52 -0
- package/src/next-app/lib/components-nav.ts +8 -0
- package/src/next-app/lib/docs.ts +16 -0
- package/src/next-app/lib/github.ts +38 -0
- package/src/next-app/lib/i18n.tsx +630 -0
- package/src/next-app/lib/locales.ts +17 -0
- package/src/next-app/lib/preview-loader.ts +7 -0
- package/src/next-app/lib/registry-adapter.ts +199 -0
- package/src/next-app/lib/utils.ts +6 -0
- package/src/next-app/next-env.d.ts +6 -0
- package/src/next-app/next.config.ts +101 -0
- package/src/next-app/postcss.config.mjs +7 -0
- package/src/next-app/public/favicon.ico +0 -0
- package/src/next-app/public/favicon_dark.svg +3 -0
- package/src/next-app/public/favicon_light.svg +3 -0
- package/src/next-app/registry.config.ts +50 -0
- package/src/next-app/tsconfig.json +29 -0
- package/src/next-app/user-aliases.d.ts +17 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @sntlr/registry-shell CLI entry.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* init Scaffold registry-shell.config.ts and add a script to package.json.
|
|
7
|
+
* dev Run `next dev` pointed at the user's current directory.
|
|
8
|
+
* build Run `next build` pointed at the user's current directory.
|
|
9
|
+
* start Run `next start` for a built shell.
|
|
10
|
+
*/
|
|
11
|
+
declare const USAGE = "Usage: registry-shell <command> [args]\n\nCommands:\n init Scaffold registry-shell.config.ts in the current project.\n dev Start the shell in dev mode on http://localhost:3000.\n build Build the shell for production.\n start Start the production server against a prior build.\n";
|
|
12
|
+
declare function main(): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* @sntlr/registry-shell CLI entry.
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* init Scaffold registry-shell.config.ts and add a script to package.json.
|
|
8
|
+
* dev Run `next dev` pointed at the user's current directory.
|
|
9
|
+
* build Run `next build` pointed at the user's current directory.
|
|
10
|
+
* start Run `next start` for a built shell.
|
|
11
|
+
*/
|
|
12
|
+
const USAGE = `Usage: registry-shell <command> [args]
|
|
13
|
+
|
|
14
|
+
Commands:
|
|
15
|
+
init Scaffold registry-shell.config.ts in the current project.
|
|
16
|
+
dev Start the shell in dev mode on http://localhost:3000.
|
|
17
|
+
build Build the shell for production.
|
|
18
|
+
start Start the production server against a prior build.
|
|
19
|
+
`;
|
|
20
|
+
async function main() {
|
|
21
|
+
const [, , cmd, ...args] = process.argv;
|
|
22
|
+
if (!cmd || cmd === "--help" || cmd === "-h") {
|
|
23
|
+
console.log(USAGE);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
switch (cmd) {
|
|
27
|
+
case "init":
|
|
28
|
+
await (await import("./init.js")).run(args);
|
|
29
|
+
break;
|
|
30
|
+
case "dev":
|
|
31
|
+
await (await import("./dev.js")).run(args);
|
|
32
|
+
break;
|
|
33
|
+
case "build":
|
|
34
|
+
await (await import("./build.js")).run(args);
|
|
35
|
+
break;
|
|
36
|
+
case "start":
|
|
37
|
+
await (await import("./start.js")).run(args);
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
console.error(`Unknown command: ${cmd}\n`);
|
|
41
|
+
console.log(USAGE);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
main().catch((err) => {
|
|
46
|
+
console.error(err instanceof Error ? err.message : err);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;GAQG;AAEH,MAAM,KAAK,GAAG;;;;;;;CAOb,CAAA;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;IAEvC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,MAAM,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAK;QACP,KAAK,KAAK;YACR,MAAM,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAK;QACP,KAAK,OAAO;YACV,MAAM,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAK;QACP,KAAK,OAAO;YACV,MAAM,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAK;QACP;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function run(_args: string[]): Promise<void>;
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `registry-shell init` — scaffold `registry-shell.config.ts` in the current
|
|
3
|
+
* directory and add a `shell` script to the project's package.json.
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
const TEMPLATE = `import { defineConfig } from "@sntlr/registry-shell"
|
|
8
|
+
|
|
9
|
+
export default defineConfig({
|
|
10
|
+
branding: {
|
|
11
|
+
siteName: "My UI",
|
|
12
|
+
shortName: "UI",
|
|
13
|
+
// siteUrl: "https://ui.example.com",
|
|
14
|
+
// github: { owner: "my-org", repo: "my-ui" },
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
// All path overrides are optional — these are the defaults:
|
|
18
|
+
// paths: {
|
|
19
|
+
// components: "components/ui",
|
|
20
|
+
// blocks: "registry/new-york/blocks",
|
|
21
|
+
// previews: "components/previews/index.ts",
|
|
22
|
+
// docs: "content/docs",
|
|
23
|
+
// registryJson: "public/r",
|
|
24
|
+
// skipBlocks: [],
|
|
25
|
+
// // Optional: your own global CSS (brand fonts, token overrides,
|
|
26
|
+
// // extra @source directives). Imported after the shell's globals so
|
|
27
|
+
// // your :root { --primary: ... } wins the cascade.
|
|
28
|
+
// // globalCss: "./styles/theme.css",
|
|
29
|
+
// },
|
|
30
|
+
|
|
31
|
+
// Custom homepage component (optional):
|
|
32
|
+
// homePage: "./components/homepage",
|
|
33
|
+
})
|
|
34
|
+
`;
|
|
35
|
+
export async function run(_args) {
|
|
36
|
+
const cwd = process.cwd();
|
|
37
|
+
const configPath = path.join(cwd, "registry-shell.config.ts");
|
|
38
|
+
if (fs.existsSync(configPath)) {
|
|
39
|
+
console.log(`[registry-shell] Config already exists: ${configPath}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
fs.writeFileSync(configPath, TEMPLATE, "utf-8");
|
|
43
|
+
console.log(`[registry-shell] Wrote ${configPath}`);
|
|
44
|
+
}
|
|
45
|
+
// Add "shell" script to package.json if missing.
|
|
46
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
47
|
+
if (fs.existsSync(pkgPath)) {
|
|
48
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
49
|
+
pkg.scripts = pkg.scripts ?? {};
|
|
50
|
+
const scripts = pkg.scripts;
|
|
51
|
+
let changed = false;
|
|
52
|
+
if (!scripts.shell) {
|
|
53
|
+
scripts.shell = "registry-shell dev";
|
|
54
|
+
changed = true;
|
|
55
|
+
}
|
|
56
|
+
if (!scripts["shell:build"]) {
|
|
57
|
+
scripts["shell:build"] = "registry-shell build";
|
|
58
|
+
changed = true;
|
|
59
|
+
}
|
|
60
|
+
if (changed) {
|
|
61
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf-8");
|
|
62
|
+
console.log(`[registry-shell] Added "shell" / "shell:build" scripts to package.json`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(`[registry-shell] No package.json found — skipped script injection. Run \`npm init\` first.`);
|
|
67
|
+
}
|
|
68
|
+
console.log(`\nNext steps:\n 1. Edit registry-shell.config.ts (branding at minimum)\n 2. Run: npm run shell`);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BhB,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,KAAe;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAA;IAE7D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAA;IACtE,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,iDAAiD;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAA4B,CAAA;QACpF,GAAG,CAAC,OAAO,GAAI,GAAG,CAAC,OAA8C,IAAI,EAAE,CAAA;QACvE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAiC,CAAA;QACrD,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAA;YACpC,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,aAAa,CAAC,GAAG,sBAAsB,CAAA;YAC/C,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAA;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,kGAAkG,CACnG,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ShellConfig } from "../define-config.js";
|
|
2
|
+
export declare const NEXT_BIN: string;
|
|
3
|
+
/** Walk upward from cwd looking for a config file. Returns null if none. */
|
|
4
|
+
export declare function findConfigFile(cwd?: string): string | null;
|
|
5
|
+
/** Absolute path to the Next.js app bundled inside the shell package. */
|
|
6
|
+
export declare function nextAppDir(): string;
|
|
7
|
+
export interface LoadedConfig {
|
|
8
|
+
configPath: string;
|
|
9
|
+
root: string;
|
|
10
|
+
config: ShellConfig;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Read + parse the user's config file via jiti (zero-build TS). Returns null
|
|
14
|
+
* when no config is found (shell-only mode).
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadUserConfig(): LoadedConfig | null;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a CSS file containing `@source` directives that tell Tailwind v4
|
|
19
|
+
* to scan the user's component/block/doc files for utility classes. Without
|
|
20
|
+
* this, classes used only in the user's files don't end up in the bundled
|
|
21
|
+
* stylesheet. Rewritten every time the CLI boots so path changes in the
|
|
22
|
+
* user's config take effect immediately.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* The shell's `.next/` build output is keyed to the active config. When the
|
|
26
|
+
* user switches from a wired registry to shell-only (or swaps registries
|
|
27
|
+
* altogether), the old build has eager references to files that may no
|
|
28
|
+
* longer resolve. Detect that by stamping the current mode and clearing
|
|
29
|
+
* `.next/` when it changes.
|
|
30
|
+
*/
|
|
31
|
+
export declare function clearStaleNextCacheIfModeChanged(loaded: LoadedConfig | null): void;
|
|
32
|
+
export declare function writeUserSourcesCss(loaded: LoadedConfig | null): void;
|
|
33
|
+
export declare function buildEnvVars(loaded: LoadedConfig | null): Record<string, string>;
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers shared across CLI commands: locating the shell's bundled Next app,
|
|
3
|
+
* finding the user's config file, and injecting the env vars the Next app
|
|
4
|
+
* reads at boot.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { createRequire } from "node:module";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { createJiti } from "jiti";
|
|
11
|
+
/**
|
|
12
|
+
* Absolute path to the Next.js CLI binary shipped with the shell package.
|
|
13
|
+
* Resolves against the shell's own node_modules so a consumer doesn't need
|
|
14
|
+
* to declare Next as a direct dep — they depend on `@sntlr/registry-shell`
|
|
15
|
+
* and transitively get Next.
|
|
16
|
+
*/
|
|
17
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
18
|
+
export const NEXT_BIN = requireFromHere.resolve("next/dist/bin/next");
|
|
19
|
+
// `path` / `fs` already imported above; ensure both stay usable below.
|
|
20
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const CONFIG_FILE_CANDIDATES = [
|
|
22
|
+
"registry-shell.config.ts",
|
|
23
|
+
"registry-shell.config.js",
|
|
24
|
+
"registry-shell.config.mjs",
|
|
25
|
+
];
|
|
26
|
+
/** Walk upward from cwd looking for a config file. Returns null if none. */
|
|
27
|
+
export function findConfigFile(cwd = process.cwd()) {
|
|
28
|
+
let dir = cwd;
|
|
29
|
+
while (true) {
|
|
30
|
+
for (const name of CONFIG_FILE_CANDIDATES) {
|
|
31
|
+
const candidate = path.join(dir, name);
|
|
32
|
+
if (fs.existsSync(candidate))
|
|
33
|
+
return candidate;
|
|
34
|
+
}
|
|
35
|
+
const parent = path.dirname(dir);
|
|
36
|
+
if (parent === dir)
|
|
37
|
+
return null;
|
|
38
|
+
dir = parent;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Absolute path to the Next.js app bundled inside the shell package. */
|
|
42
|
+
export function nextAppDir() {
|
|
43
|
+
// When running from dist (published), this file is at dist/cli/shared.js.
|
|
44
|
+
// When running from source via tsx, it's at src/cli/shared.ts.
|
|
45
|
+
// In both cases, next-app lives at ../next-app relative to the cli dir.
|
|
46
|
+
const distNextApp = path.resolve(HERE, "../next-app");
|
|
47
|
+
if (fs.existsSync(distNextApp))
|
|
48
|
+
return distNextApp;
|
|
49
|
+
const srcNextApp = path.resolve(HERE, "../../src/next-app");
|
|
50
|
+
if (fs.existsSync(srcNextApp))
|
|
51
|
+
return srcNextApp;
|
|
52
|
+
throw new Error(`[registry-shell] Couldn't locate the bundled Next app. Looked in:\n ${distNextApp}\n ${srcNextApp}`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Read + parse the user's config file via jiti (zero-build TS). Returns null
|
|
56
|
+
* when no config is found (shell-only mode).
|
|
57
|
+
*/
|
|
58
|
+
export function loadUserConfig() {
|
|
59
|
+
const configPath = findConfigFile();
|
|
60
|
+
if (!configPath)
|
|
61
|
+
return null;
|
|
62
|
+
const jiti = createJiti(import.meta.url, { interopDefault: true });
|
|
63
|
+
const loaded = jiti(configPath);
|
|
64
|
+
const config = (loaded && typeof loaded === "object" && "default" in loaded
|
|
65
|
+
? loaded.default
|
|
66
|
+
: loaded);
|
|
67
|
+
if (!config?.branding) {
|
|
68
|
+
throw new Error(`[registry-shell] Invalid config at ${configPath}: missing required \`branding\`.`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
configPath,
|
|
72
|
+
root: path.dirname(configPath),
|
|
73
|
+
config,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generate a CSS file containing `@source` directives that tell Tailwind v4
|
|
78
|
+
* to scan the user's component/block/doc files for utility classes. Without
|
|
79
|
+
* this, classes used only in the user's files don't end up in the bundled
|
|
80
|
+
* stylesheet. Rewritten every time the CLI boots so path changes in the
|
|
81
|
+
* user's config take effect immediately.
|
|
82
|
+
*/
|
|
83
|
+
/**
|
|
84
|
+
* The shell's `.next/` build output is keyed to the active config. When the
|
|
85
|
+
* user switches from a wired registry to shell-only (or swaps registries
|
|
86
|
+
* altogether), the old build has eager references to files that may no
|
|
87
|
+
* longer resolve. Detect that by stamping the current mode and clearing
|
|
88
|
+
* `.next/` when it changes.
|
|
89
|
+
*/
|
|
90
|
+
export function clearStaleNextCacheIfModeChanged(loaded) {
|
|
91
|
+
const nextApp = nextAppDir();
|
|
92
|
+
const nextDir = path.join(nextApp, ".next");
|
|
93
|
+
const stampPath = path.join(nextApp, ".registry-shell-mode");
|
|
94
|
+
const currentMode = loaded?.configPath ?? "<shell-only>";
|
|
95
|
+
let previousMode = "<never>";
|
|
96
|
+
if (fs.existsSync(stampPath)) {
|
|
97
|
+
try {
|
|
98
|
+
previousMode = fs.readFileSync(stampPath, "utf-8").trim();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
/* ignore */
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (fs.existsSync(nextDir) && previousMode !== currentMode) {
|
|
105
|
+
console.log(`[registry-shell] Mode changed (${previousMode} → ${currentMode}) — clearing .next cache.`);
|
|
106
|
+
// Windows can hold file locks (antivirus, IDE indexers) for a moment
|
|
107
|
+
// after the previous Next process exits. Retry a few times; if the
|
|
108
|
+
// directory still won't remove, clear its contents in place instead.
|
|
109
|
+
const tryRemove = (attempt = 0) => {
|
|
110
|
+
try {
|
|
111
|
+
fs.rmSync(nextDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
if (attempt < 5)
|
|
116
|
+
return tryRemove(attempt + 1);
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
if (!tryRemove()) {
|
|
121
|
+
try {
|
|
122
|
+
for (const entry of fs.readdirSync(nextDir)) {
|
|
123
|
+
fs.rmSync(path.join(nextDir, entry), {
|
|
124
|
+
recursive: true,
|
|
125
|
+
force: true,
|
|
126
|
+
maxRetries: 5,
|
|
127
|
+
retryDelay: 200,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
console.log("[registry-shell] Directory locked — cleared contents instead.");
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.warn(`[registry-shell] Couldn't clear .next cache cleanly (${err.message}). ` +
|
|
134
|
+
`Continuing; you may see stale-build warnings.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
fs.writeFileSync(stampPath, currentMode + "\n", "utf-8");
|
|
139
|
+
}
|
|
140
|
+
export function writeUserSourcesCss(loaded) {
|
|
141
|
+
const nextApp = nextAppDir();
|
|
142
|
+
const appDir = path.join(nextApp, "app");
|
|
143
|
+
const sourcesTarget = path.join(appDir, "_user-sources.css");
|
|
144
|
+
const globalTarget = path.join(appDir, "_user-global.css");
|
|
145
|
+
// Tailwind 4 resolves `@source` paths relative to the CSS file on disk and
|
|
146
|
+
// handles platform-specific separators. Use relative paths so Windows
|
|
147
|
+
// drive-letter handling doesn't trip the scanner.
|
|
148
|
+
const rel = (abs) => {
|
|
149
|
+
const r = path.relative(appDir, abs).replace(/\\/g, "/");
|
|
150
|
+
return r.startsWith(".") ? r : `./${r}`;
|
|
151
|
+
};
|
|
152
|
+
// ── _user-sources.css — `@source` directives only ──────────────────
|
|
153
|
+
// Imported near the TOP of globals.css so Tailwind's class scanner
|
|
154
|
+
// picks up utility usage from the listed dirs.
|
|
155
|
+
const sources = ["/* Auto-generated by @sntlr/registry-shell. Do not edit. */"];
|
|
156
|
+
sources.push(`@source "${rel(path.join(nextApp, "app"))}";`);
|
|
157
|
+
sources.push(`@source "${rel(path.join(nextApp, "components"))}";`);
|
|
158
|
+
sources.push(`@source "${rel(path.join(nextApp, "lib"))}";`);
|
|
159
|
+
sources.push(`@source "${rel(path.join(nextApp, "hooks"))}";`);
|
|
160
|
+
sources.push(`@source "${rel(path.join(nextApp, "fallback"))}";`);
|
|
161
|
+
if (loaded) {
|
|
162
|
+
const paths = loaded.config.paths ?? {};
|
|
163
|
+
const resolve = (r, fallback) => path.resolve(loaded.root, r ?? fallback);
|
|
164
|
+
sources.push(`@source "${rel(resolve(paths.components, "components/ui"))}";`);
|
|
165
|
+
sources.push(`@source "${rel(resolve(paths.blocks, "registry/new-york/blocks"))}";`);
|
|
166
|
+
sources.push(`@source "${rel(resolve(paths.previews?.replace(/\/index\.[tj]sx?$/, ""), "components/previews"))}";`);
|
|
167
|
+
if (loaded.config.homePage) {
|
|
168
|
+
sources.push(`@source "${rel(resolve(loaded.config.homePage, ""))}";`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
fs.writeFileSync(sourcesTarget, sources.join("\n") + "\n", "utf-8");
|
|
172
|
+
// ── _user-global.css — user's extra theme/tokens ──────────────────
|
|
173
|
+
// Imported at the BOTTOM of globals.css so `:root { --primary: ... }`
|
|
174
|
+
// style overrides win the cascade over the shell's defaults. Absent
|
|
175
|
+
// when paths.globalCss is not configured (file is written as a no-op
|
|
176
|
+
// so the `@import` in globals.css never 404s).
|
|
177
|
+
const globalLines = ["/* Auto-generated by @sntlr/registry-shell. Do not edit. */"];
|
|
178
|
+
if (loaded) {
|
|
179
|
+
const userGlobal = loaded.config.paths?.globalCss;
|
|
180
|
+
if (userGlobal) {
|
|
181
|
+
const abs = path.resolve(loaded.root, userGlobal);
|
|
182
|
+
if (!fs.existsSync(abs)) {
|
|
183
|
+
console.warn(`[registry-shell] paths.globalCss points at ${abs} but the file doesn't exist — skipping.`);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
globalLines.push(`@import "${rel(abs)}";`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
fs.writeFileSync(globalTarget, globalLines.join("\n") + "\n", "utf-8");
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Build the env-var bag the Next app reads at startup. The CLI spreads this
|
|
194
|
+
* into child `next` processes.
|
|
195
|
+
*/
|
|
196
|
+
/**
|
|
197
|
+
* Resolve the locale list the client's locale toggle should offer. Uses the
|
|
198
|
+
* explicit `locales` array if provided, otherwise auto-scans subfolders of
|
|
199
|
+
* the registry's docs path. Mirrors the logic in the server config-loader
|
|
200
|
+
* but runs client-side via inlined env vars.
|
|
201
|
+
*/
|
|
202
|
+
function resolveLocaleList(root, config) {
|
|
203
|
+
if (!config.multilocale)
|
|
204
|
+
return [];
|
|
205
|
+
if (config.locales && config.locales.length > 0)
|
|
206
|
+
return [...config.locales];
|
|
207
|
+
const docsAbs = path.resolve(root, config.paths?.docs ?? "content/docs");
|
|
208
|
+
if (!fs.existsSync(docsAbs)) {
|
|
209
|
+
return config.defaultLocale ? [config.defaultLocale] : [];
|
|
210
|
+
}
|
|
211
|
+
const found = fs
|
|
212
|
+
.readdirSync(docsAbs, { withFileTypes: true })
|
|
213
|
+
.filter((d) => d.isDirectory())
|
|
214
|
+
.map((d) => d.name);
|
|
215
|
+
if (config.defaultLocale && found.includes(config.defaultLocale)) {
|
|
216
|
+
return [config.defaultLocale, ...found.filter((l) => l !== config.defaultLocale)];
|
|
217
|
+
}
|
|
218
|
+
return found;
|
|
219
|
+
}
|
|
220
|
+
export function buildEnvVars(loaded) {
|
|
221
|
+
// Always set SHELL_APP_ROOT so the Next app can resolve its own bundled
|
|
222
|
+
// files (fallbacks, globals.css) independently of process.cwd().
|
|
223
|
+
const base = { SHELL_APP_ROOT: nextAppDir() };
|
|
224
|
+
if (!loaded)
|
|
225
|
+
return base;
|
|
226
|
+
const { configPath, root, config } = loaded;
|
|
227
|
+
const b = config.branding;
|
|
228
|
+
const env = {
|
|
229
|
+
...base,
|
|
230
|
+
USER_CONFIG_PATH: configPath,
|
|
231
|
+
USER_REGISTRY_ROOT: root,
|
|
232
|
+
NEXT_PUBLIC_SHELL_SITE_NAME: b.siteName,
|
|
233
|
+
NEXT_PUBLIC_SHELL_SHORT_NAME: b.shortName,
|
|
234
|
+
};
|
|
235
|
+
if (b.siteUrl)
|
|
236
|
+
env.NEXT_PUBLIC_SHELL_SITE_URL = b.siteUrl;
|
|
237
|
+
if (b.description)
|
|
238
|
+
env.NEXT_PUBLIC_SHELL_DESCRIPTION = b.description;
|
|
239
|
+
if (b.ogImage)
|
|
240
|
+
env.NEXT_PUBLIC_SHELL_OG_IMAGE = b.ogImage;
|
|
241
|
+
if (b.twitterHandle)
|
|
242
|
+
env.NEXT_PUBLIC_SHELL_TWITTER_HANDLE = b.twitterHandle;
|
|
243
|
+
if (b.github?.owner)
|
|
244
|
+
env.NEXT_PUBLIC_SHELL_GITHUB_OWNER = b.github.owner;
|
|
245
|
+
if (b.github?.repo)
|
|
246
|
+
env.NEXT_PUBLIC_SHELL_GITHUB_REPO = b.github.repo;
|
|
247
|
+
if (b.github?.label)
|
|
248
|
+
env.NEXT_PUBLIC_SHELL_GITHUB_LABEL = b.github.label;
|
|
249
|
+
if (b.github && b.github.showStars === false) {
|
|
250
|
+
env.NEXT_PUBLIC_SHELL_GITHUB_SHOW_STARS = "false";
|
|
251
|
+
}
|
|
252
|
+
if (b.logoAlt)
|
|
253
|
+
env.NEXT_PUBLIC_SHELL_LOGO_ALT = b.logoAlt;
|
|
254
|
+
if (b.faviconDark)
|
|
255
|
+
env.NEXT_PUBLIC_SHELL_FAVICON_DARK = b.faviconDark;
|
|
256
|
+
if (b.faviconLight)
|
|
257
|
+
env.NEXT_PUBLIC_SHELL_FAVICON_LIGHT = b.faviconLight;
|
|
258
|
+
if (b.faviconIco)
|
|
259
|
+
env.NEXT_PUBLIC_SHELL_FAVICON_ICO = b.faviconIco;
|
|
260
|
+
if (config.homePage)
|
|
261
|
+
env.USER_HOMEPAGE_PATH = config.homePage;
|
|
262
|
+
if (config.installCommandTemplate !== undefined) {
|
|
263
|
+
env.NEXT_PUBLIC_SHELL_INSTALL_CMD = config.installCommandTemplate;
|
|
264
|
+
}
|
|
265
|
+
if (config.transpilePackages && config.transpilePackages.length > 0) {
|
|
266
|
+
env.USER_TRANSPILE_PACKAGES = config.transpilePackages.join(",");
|
|
267
|
+
}
|
|
268
|
+
// Multilocale signalling for the locale toggle. Resolves the toggle's
|
|
269
|
+
// locale set from explicit config or auto-scan of doc subfolders so the
|
|
270
|
+
// client has a complete list at build time.
|
|
271
|
+
if (config.multilocale && config.defaultLocale) {
|
|
272
|
+
env.NEXT_PUBLIC_SHELL_DEFAULT_LOCALE = config.defaultLocale;
|
|
273
|
+
const locales = resolveLocaleList(loaded.root, config);
|
|
274
|
+
env.NEXT_PUBLIC_SHELL_LOCALES = locales.join(",");
|
|
275
|
+
}
|
|
276
|
+
return env;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC;;;;;GAKG;AACH,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACtD,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAErE,uEAAuE;AAEvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,MAAM,sBAAsB,GAAG;IAC7B,0BAA0B;IAC1B,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAA;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACxD,IAAI,GAAG,GAAG,GAAG,CAAA;IACb,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAA;QAChD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC/B,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,UAAU;IACxB,0EAA0E;IAC1E,+DAA+D;IAC/D,wEAAwE;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAA;IAElD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;IAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAA;IAEhD,MAAM,IAAI,KAAK,CACb,wEAAwE,WAAW,OAAO,UAAU,EAAE,CACvG,CAAA;AACH,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAA;IACnC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAE5B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAY,CAAA;IAC1C,MAAM,MAAM,GAAG,CACb,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM;QACzD,CAAC,CAAE,MAAmC,CAAC,OAAO;QAC9C,CAAC,CAAE,MAAsB,CAC5B,CAAA;IAED,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,sCAAsC,UAAU,kCAAkC,CACnF,CAAA;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9B,MAAM;KACP,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAAC,MAA2B;IAC1E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,MAAM,EAAE,UAAU,IAAI,cAAc,CAAA;IAExD,IAAI,YAAY,GAAG,SAAS,CAAA;IAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CACT,kCAAkC,YAAY,MAAM,WAAW,2BAA2B,CAC3F,CAAA;QACD,qEAAqE;QACrE,mEAAmE;QACnE,qEAAqE;QACrE,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,CAAC,EAAW,EAAE;YACzC,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;gBACpF,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,OAAO,GAAG,CAAC;oBAAE,OAAO,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;gBAC9C,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC,CAAA;QACD,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;wBACnC,SAAS,EAAE,IAAI;wBACf,KAAK,EAAE,IAAI;wBACX,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,GAAG;qBAChB,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,wDAAyD,GAAa,CAAC,OAAO,KAAK;oBACjF,+CAA+C,CAClD,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAE1D,2EAA2E;IAC3E,sEAAsE;IACtE,kDAAkD;IAClD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxD,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;IACzC,CAAC,CAAA;IAED,sEAAsE;IACtE,mEAAmE;IACnE,+CAA+C;IAC/C,MAAM,OAAO,GAAG,CAAC,6DAA6D,CAAC,CAAA;IAC/E,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAA;IACnE,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;IAC9D,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;IAEjE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;QACvC,MAAM,OAAO,GAAG,CAAC,CAAqB,EAAE,QAAgB,EAAE,EAAE,CAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAA;QAE1C,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7E,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAA;QACpF,OAAO,CAAC,IAAI,CACV,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,CACtG,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;IAEnE,qEAAqE;IACrE,sEAAsE;IACtE,oEAAoE;IACpE,qEAAqE;IACrE,+CAA+C;IAC/C,MAAM,WAAW,GAAG,CAAC,6DAA6D,CAAC,CAAA;IACnF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAA;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;YACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CACV,8CAA8C,GAAG,yCAAyC,CAC3F,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AACxE,CAAC;AAED;;;GAGG;AACH;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAmB;IAC1D,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO,EAAE,CAAA;IAClC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAE3E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,cAAc,CAAC,CAAA;IACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,CAAC;IACD,MAAM,KAAK,GAAG,EAAE;SACb,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAErB,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA2B;IACtD,wEAAwE;IACxE,iEAAiE;IACjE,MAAM,IAAI,GAA2B,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAA;IACrE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAA;IAEzB,MAAM,GAAG,GAA2B;QAClC,GAAG,IAAI;QACP,gBAAgB,EAAE,UAAU;QAC5B,kBAAkB,EAAE,IAAI;QACxB,2BAA2B,EAAE,CAAC,CAAC,QAAQ;QACvC,4BAA4B,EAAE,CAAC,CAAC,SAAS;KAC1C,CAAA;IAED,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC,OAAO,CAAA;IACzD,IAAI,CAAC,CAAC,WAAW;QAAE,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC,WAAW,CAAA;IACpE,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC,OAAO,CAAA;IACzD,IAAI,CAAC,CAAC,aAAa;QAAE,GAAG,CAAC,gCAAgC,GAAG,CAAC,CAAC,aAAa,CAAA;IAC3E,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK;QAAE,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;IACxE,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI;QAAE,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;IACrE,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK;QAAE,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;IACxE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAC7C,GAAG,CAAC,mCAAmC,GAAG,OAAO,CAAA;IACnD,CAAC;IACD,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC,OAAO,CAAA;IACzD,IAAI,CAAC,CAAC,WAAW;QAAE,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC,WAAW,CAAA;IACrE,IAAI,CAAC,CAAC,YAAY;QAAE,GAAG,CAAC,+BAA+B,GAAG,CAAC,CAAC,YAAY,CAAA;IACxE,IAAI,CAAC,CAAC,UAAU;QAAE,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC,UAAU,CAAA;IAElE,IAAI,MAAM,CAAC,QAAQ;QAAE,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC7D,IAAI,MAAM,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QAChD,GAAG,CAAC,6BAA6B,GAAG,MAAM,CAAC,sBAAsB,CAAA;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,4CAA4C;IAC5C,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAC/C,GAAG,CAAC,gCAAgC,GAAG,MAAM,CAAC,aAAa,CAAA;QAC3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtD,GAAG,CAAC,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function run(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `registry-shell start` — run `next start` for a prior `registry-shell build`.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors build.ts: passes `USER_DIST_DIR` pointing at `<user-project>/.next`
|
|
5
|
+
* so `next start` reads the build output from where build.ts wrote it.
|
|
6
|
+
*/
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { NEXT_BIN, buildEnvVars, loadUserConfig, nextAppDir } from "./shared.js";
|
|
10
|
+
export async function run(args) {
|
|
11
|
+
const loaded = loadUserConfig();
|
|
12
|
+
const userDistDir = loaded
|
|
13
|
+
? path.resolve(loaded.root, loaded.config.paths?.buildOutput ?? ".next")
|
|
14
|
+
: undefined;
|
|
15
|
+
const env = {
|
|
16
|
+
...process.env,
|
|
17
|
+
...buildEnvVars(loaded),
|
|
18
|
+
...(userDistDir ? { USER_DIST_DIR: userDistDir } : {}),
|
|
19
|
+
};
|
|
20
|
+
const portArgs = loaded?.config.port ? ["-p", String(loaded.config.port)] : [];
|
|
21
|
+
const child = spawn(process.execPath, [NEXT_BIN, "start", nextAppDir(), ...portArgs, ...args], { stdio: "inherit", env });
|
|
22
|
+
child.on("exit", (code) => process.exit(code ?? 0));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEhF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,WAAW,GAAG,MAAM;QACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC;QACxE,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,YAAY,CAAC,MAAM,CAAC;QACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,EACvD,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAC1B,CAAA;IACD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads the user's `registry-shell.config.ts` at server boot. Uses `jiti` so
|
|
3
|
+
* the user doesn't need a build step or TS tooling of their own — the shell
|
|
4
|
+
* parses TS on the fly.
|
|
5
|
+
*
|
|
6
|
+
* Called once at Next.js server startup (see src/next-app/registry.config.ts).
|
|
7
|
+
* The returned `ResolvedShellConfig` contains absolute paths and defaults
|
|
8
|
+
* applied.
|
|
9
|
+
*/
|
|
10
|
+
import "server-only";
|
|
11
|
+
import type { BrandingConfig } from "./define-config.js";
|
|
12
|
+
export interface ResolvedShellConfig {
|
|
13
|
+
/** Absolute path to the user's registry root (dir containing the config). */
|
|
14
|
+
root: string;
|
|
15
|
+
/** Absolute path to the config file itself. */
|
|
16
|
+
configPath: string;
|
|
17
|
+
branding: Required<BrandingConfig>;
|
|
18
|
+
/** All paths resolved to absolute locations. */
|
|
19
|
+
paths: {
|
|
20
|
+
components: string;
|
|
21
|
+
blocks: string;
|
|
22
|
+
previews: string;
|
|
23
|
+
docs: string;
|
|
24
|
+
registryJson: string;
|
|
25
|
+
a11y: string;
|
|
26
|
+
tests: string;
|
|
27
|
+
props: string;
|
|
28
|
+
skipBlocks: Set<string>;
|
|
29
|
+
/** Absolute path to user's extra global CSS, or null when not configured. */
|
|
30
|
+
globalCss: string | null;
|
|
31
|
+
};
|
|
32
|
+
/** Absolute path to a custom homepage module, or null. */
|
|
33
|
+
homePage: string | null;
|
|
34
|
+
/** Absolute path to a custom adapter module, or null. */
|
|
35
|
+
adapter: string | null;
|
|
36
|
+
extraTranslations: Record<string, Record<string, string>>;
|
|
37
|
+
/** When true, docs live under per-locale subfolders. */
|
|
38
|
+
multilocale: boolean;
|
|
39
|
+
/** Locale subfolder containing the canonical doc set. Empty when multilocale is off. */
|
|
40
|
+
defaultLocale: string;
|
|
41
|
+
/** Explicit locale list (resolved — may be empty in single-locale mode). */
|
|
42
|
+
locales: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read env vars set by the CLI, load the config file, resolve paths. Returns
|
|
46
|
+
* `null` when no config is set (shell-only dev mode) — the Next app falls
|
|
47
|
+
* back to built-in shell docs.
|
|
48
|
+
*/
|
|
49
|
+
export declare function loadResolvedConfig(): ResolvedShellConfig | null;
|