@swarm.ing/pieui 2.0.11 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/cli.js +160 -235
  2. package/dist/code/commands/create.d.ts.map +1 -1
  3. package/dist/code/public/favicon.ico +0 -0
  4. package/dist/code/public/favicon.svg +1 -0
  5. package/dist/code/public/pieui.png +0 -0
  6. package/dist/code/public/swarm.ing.png +0 -0
  7. package/dist/code/templates/env.d.ts +2 -0
  8. package/dist/code/templates/env.d.ts.map +1 -0
  9. package/dist/code/templates/homePage.d.ts +2 -0
  10. package/dist/code/templates/homePage.d.ts.map +1 -0
  11. package/dist/code/templates/index.d.ts +6 -1
  12. package/dist/code/templates/index.d.ts.map +1 -1
  13. package/dist/code/templates/loadingScreen.d.ts +2 -0
  14. package/dist/code/templates/loadingScreen.d.ts.map +1 -0
  15. package/dist/code/templates/nextConfig.d.ts +1 -1
  16. package/dist/code/templates/nextConfig.d.ts.map +1 -1
  17. package/dist/code/templates/rootLayout.d.ts +2 -0
  18. package/dist/code/templates/rootLayout.d.ts.map +1 -0
  19. package/dist/code/templates/sharedPage.d.ts +2 -0
  20. package/dist/code/templates/sharedPage.d.ts.map +1 -0
  21. package/package.json +5 -13
  22. package/dist/__tests__/step1-local.test.d.cts +0 -2
  23. package/dist/__tests__/step1-local.test.d.cts.map +0 -1
  24. package/dist/__tests__/step2-remote.test.d.cts +0 -2
  25. package/dist/__tests__/step2-remote.test.d.cts.map +0 -1
  26. package/dist/__tests__/step3-contract.test.d.cts +0 -2
  27. package/dist/__tests__/step3-contract.test.d.cts.map +0 -1
  28. package/dist/__tests__/step4-ci.test.d.cts +0 -2
  29. package/dist/__tests__/step4-ci.test.d.cts.map +0 -1
  30. package/dist/__tests__/step5-regres.test.d.cts +0 -2
  31. package/dist/__tests__/step5-regres.test.d.cts.map +0 -1
  32. package/dist/create.d.ts +0 -3
  33. package/dist/create.d.ts.map +0 -1
  34. package/dist/create.js +0 -162
package/dist/cli.js CHANGED
@@ -193249,12 +193249,104 @@ export type ${componentName}Props = ${baseInterface}<${componentName}Data>
193249
193249
  `;
193250
193250
  };
193251
193251
 
193252
+ // src/code/templates/env.ts
193253
+ var envTemplate = () => `PIE_ENABLE_RENDERING_LOG=true
193254
+ PIE_API_SERVER=http://localhost:8008/
193255
+ PIE_CENTRIFUGE_SERVER=wss://localhost:8000/connection/websocket
193256
+
193257
+ NEXT_PUBLIC_PIE_ENABLE_RENDERING_LOG=true
193258
+ NEXT_PUBLIC_PIE_API_SERVER=http://localhost:8008/
193259
+ NEXT_PUBLIC_PIE_CENTRIFUGE_SERVER=wss://localhost:8000/connection/websocket
193260
+ `;
193261
+
193262
+ // src/code/templates/homePage.ts
193263
+ var homePageTemplate = `"use client";
193264
+
193265
+ import PiePage from "@/app/_shared/page";
193266
+ import { Suspense } from "react";
193267
+
193268
+ export default function HomePage() {
193269
+ return (
193270
+ <Suspense fallback={<></>}>
193271
+ <PiePage />
193272
+ </Suspense>
193273
+ );
193274
+ }
193275
+ `;
193276
+
193277
+ // src/code/templates/loadingScreen.ts
193278
+ var loadingScreenTemplate = `"use client";
193279
+
193280
+ export default function LoadingScreen() {
193281
+ return (
193282
+ <div className="flex min-h-screen items-center justify-center text-sm text-neutral-500">
193283
+ Loading...
193284
+ </div>
193285
+ );
193286
+ }
193287
+ `;
193288
+
193289
+ // src/code/templates/rootLayout.ts
193290
+ var rootLayoutTemplate = `import type { Metadata } from "next";
193291
+ import "./globals.css";
193292
+
193293
+ export const metadata: Metadata = {
193294
+ title: "PieUI Project",
193295
+ description: "Generated by PieUI.",
193296
+ applicationName: "PieUI Project",
193297
+ icons: {
193298
+ icon: "/favicon.ico",
193299
+ shortcut: "/favicon.ico",
193300
+ },
193301
+ };
193302
+
193303
+ export default function RootLayout({
193304
+ children,
193305
+ }: Readonly<{
193306
+ children: React.ReactNode;
193307
+ }>) {
193308
+ return (
193309
+ <html lang="en">
193310
+ <body>{children}</body>
193311
+ </html>
193312
+ );
193313
+ }
193314
+ `;
193315
+
193316
+ // src/code/templates/sharedPage.ts
193317
+ var sharedPageTemplate = `"use client";
193318
+
193319
+ import { useRouter } from "next/navigation";
193320
+ import { PieRoot } from "@swarm.ing/pieui";
193321
+ import "@/piecomponents/registry";
193322
+ import { usePathname, useSearchParams } from "next/navigation";
193323
+
193324
+ export default function PiePage() {
193325
+ const router = useRouter();
193326
+ const pathname = usePathname();
193327
+ const searchParams = useSearchParams();
193328
+ const search = searchParams.toString();
193329
+
193330
+ return (
193331
+ <PieRoot
193332
+ location={{ pathname, search }}
193333
+ config={{
193334
+ apiServer: process.env.PIE_API_SERVER!,
193335
+ centrifugeServer: process.env.PIE_CENTRIFUGE_SERVER!,
193336
+ enableRenderingLog: true,
193337
+ }}
193338
+ onNavigate={(url) => router.push(url)}
193339
+ fallback={<></>}
193340
+ />
193341
+ );
193342
+ }
193343
+ `;
193344
+
193252
193345
  // src/code/templates/nextConfig.ts
193253
193346
  var REQUIRED_NEXT_CONFIG_ENV_KEYS = [
193254
193347
  "PIE_API_SERVER",
193255
193348
  "PIE_CENTRIFUGE_SERVER",
193256
- "PIE_ENABLE_RENDERING_LOG",
193257
- "PIE_PLATFORM"
193349
+ "PIE_ENABLE_RENDERING_LOG"
193258
193350
  ];
193259
193351
  var nextConfigTemplate = () => `import type { NextConfig } from "next";
193260
193352
 
@@ -193265,7 +193357,6 @@ const nextConfig: NextConfig = {
193265
193357
  PIE_API_SERVER: process.env.PIE_API_SERVER,
193266
193358
  PIE_CENTRIFUGE_SERVER: process.env.PIE_CENTRIFUGE_SERVER,
193267
193359
  PIE_ENABLE_RENDERING_LOG: process.env.PIE_ENABLE_RENDERING_LOG,
193268
- PIE_PLATFORM: process.env.PIE_PLATFORM || "telegram",
193269
193360
  },
193270
193361
  reactStrictMode: true,
193271
193362
  transpilePackages: ["@swarm.ing/pieui"],
@@ -193569,12 +193660,7 @@ var ensureNextConfig = (resolvedOutDir) => {
193569
193660
  }
193570
193661
  };
193571
193662
  var CONFIG_OBJECT_OPEN = /(const\s+nextConfig\s*(?::\s*[A-Za-z_][\w.]*)?\s*=\s*|module\.exports\s*=\s*|export\s+default\s*)\{/;
193572
- var envEntryFor = (key) => {
193573
- if (key === "PIE_PLATFORM") {
193574
- return ` ${key}: process.env.${key} || "telegram",`;
193575
- }
193576
- return ` ${key}: process.env.${key},`;
193577
- };
193663
+ var envEntryFor = (key) => ` ${key}: process.env.${key},`;
193578
193664
  var ensureEnvKeys = (content) => {
193579
193665
  const missingKeys = REQUIRED_NEXT_CONFIG_ENV_KEYS.filter((key) => !content.includes(key));
193580
193666
  if (missingKeys.length === 0)
@@ -198293,143 +198379,9 @@ ${text2}` : ""}`);
198293
198379
  [pieui] ${text}` : ""}`);
198294
198380
  };
198295
198381
 
198296
- // src/code/commands/createPieApp.ts
198382
+ // src/code/commands/pageAdd.ts
198297
198383
  var import_fs11 = __toESM(require("fs"));
198298
198384
  var import_path13 = __toESM(require("path"));
198299
- var import_child_process = require("child_process");
198300
- var DEFAULT_TEMPLATE_SPEC = "next-app@latest";
198301
- var SHARED_TEMPLATE_DIR_ENV = "PIEUI_SHARED_TEMPLATE_DIR";
198302
- var AI_EXCHANGE_BOT_DIR_ENV = "PIEUI_AI_EXCHANGE_BOT_DIR";
198303
- var BACKEND_LINK_COMMENT = "// TODO(pie-backend): Link generated Python Unicorn backend routes here once backend template sync is enabled.";
198304
- var updateNextScriptsToBun = (packageJsonPath) => {
198305
- if (!import_fs11.default.existsSync(packageJsonPath))
198306
- return;
198307
- try {
198308
- const pkg = JSON.parse(import_fs11.default.readFileSync(packageJsonPath, "utf8"));
198309
- if (!pkg.scripts)
198310
- return;
198311
- const updates = {
198312
- dev: "bun --bun next dev",
198313
- build: "bun --bun next build",
198314
- start: "bun --bun next start"
198315
- };
198316
- for (const [scriptName, scriptValue] of Object.entries(updates)) {
198317
- if (pkg.scripts[scriptName]) {
198318
- pkg.scripts[scriptName] = scriptValue;
198319
- }
198320
- }
198321
- import_fs11.default.writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}
198322
- `, "utf8");
198323
- } catch {
198324
- }
198325
- };
198326
- var appendBackendLinkComment = (pagePath) => {
198327
- if (!import_fs11.default.existsSync(pagePath))
198328
- return;
198329
- const page = import_fs11.default.readFileSync(pagePath, "utf8");
198330
- if (page.includes(BACKEND_LINK_COMMENT))
198331
- return;
198332
- import_fs11.default.writeFileSync(pagePath, `${page.trimEnd()}
198333
-
198334
- ${BACKEND_LINK_COMMENT}
198335
- `, "utf8");
198336
- };
198337
- var uniq = (items) => [...new Set(items)];
198338
- var isDirectory = (target) => {
198339
- try {
198340
- return import_fs11.default.statSync(target).isDirectory();
198341
- } catch {
198342
- return false;
198343
- }
198344
- };
198345
- var resolveSharedTemplateDir = () => {
198346
- const explicitSharedDir = process.env[SHARED_TEMPLATE_DIR_ENV];
198347
- if (explicitSharedDir) {
198348
- const normalized = import_path13.default.resolve(explicitSharedDir);
198349
- if (!isDirectory(normalized)) {
198350
- throw new Error(`${SHARED_TEMPLATE_DIR_ENV} points to a missing directory: ${normalized}`);
198351
- }
198352
- return normalized;
198353
- }
198354
- const cwd = process.cwd();
198355
- const baseDirs = [cwd, import_path13.default.resolve(cwd, ".."), import_path13.default.resolve(cwd, "../..")];
198356
- const explicitRepoDir = process.env[AI_EXCHANGE_BOT_DIR_ENV];
198357
- if (explicitRepoDir) {
198358
- baseDirs.unshift(import_path13.default.resolve(explicitRepoDir));
198359
- }
198360
- const repoNames = ["ai-exchange-bot", "ai-exchange-web", "a-exchange-web"];
198361
- const repoCandidates = uniq([
198362
- ...baseDirs,
198363
- ...baseDirs.flatMap((base) => repoNames.map((name) => import_path13.default.join(base, name)))
198364
- ]).filter((candidate) => isDirectory(candidate));
198365
- const sharedSubpaths = [
198366
- "_shared",
198367
- "src/_shared",
198368
- "app/_shared",
198369
- "pages/_shared",
198370
- "pages/components/_shared",
198371
- "apps/web/_shared",
198372
- "apps/web/src/_shared"
198373
- ];
198374
- for (const repoDir of repoCandidates) {
198375
- for (const subpath of sharedSubpaths) {
198376
- const candidate = import_path13.default.join(repoDir, subpath);
198377
- if (isDirectory(candidate)) {
198378
- return candidate;
198379
- }
198380
- }
198381
- }
198382
- throw new Error([
198383
- "Could not locate a _shared template directory from ai-exchange-bot.",
198384
- `Set ${SHARED_TEMPLATE_DIR_ENV}=/absolute/path/to/_shared`,
198385
- `or ${AI_EXCHANGE_BOT_DIR_ENV}=/absolute/path/to/ai-exchange-bot.`
198386
- ].join(" "));
198387
- };
198388
- var copySharedTemplate = (sharedTemplateDir, appDir) => {
198389
- const destination = import_path13.default.join(appDir, "_shared");
198390
- import_fs11.default.cpSync(sharedTemplateDir, destination, { recursive: true, force: true });
198391
- };
198392
- var createPieAppCommand = (appName) => {
198393
- const trimmedAppName = appName.trim();
198394
- if (!trimmedAppName) {
198395
- console.error("[pieui] Error: App name is required for create-pie-app command");
198396
- process.exit(1);
198397
- }
198398
- const appDir = import_path13.default.resolve(process.cwd(), trimmedAppName);
198399
- if (import_fs11.default.existsSync(appDir)) {
198400
- console.error(`[pieui] Error: Target directory already exists: ${trimmedAppName}`);
198401
- process.exit(1);
198402
- }
198403
- const bunBin = process.env.PIEUI_CREATE_BUN_BIN || "bun";
198404
- const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC || DEFAULT_TEMPLATE_SPEC;
198405
- console.log(`[pieui] Creating blank PieUI web template in "${trimmedAppName}"...`);
198406
- const args = ["create", templateSpec, trimmedAppName, "--yes"];
198407
- const result = import_child_process.spawnSync(bunBin, args, {
198408
- cwd: process.cwd(),
198409
- stdio: "inherit",
198410
- env: process.env
198411
- });
198412
- if (result.error) {
198413
- throw result.error;
198414
- }
198415
- if (result.status !== 0) {
198416
- throw new Error(`create-pie-app failed (exit code ${result.status ?? "unknown"})`);
198417
- }
198418
- const sharedTemplateDir = resolveSharedTemplateDir();
198419
- copySharedTemplate(sharedTemplateDir, appDir);
198420
- updateNextScriptsToBun(import_path13.default.join(appDir, "package.json"));
198421
- appendBackendLinkComment(import_path13.default.join(appDir, "app", "page.tsx"));
198422
- console.log("[pieui] Template created successfully.");
198423
- console.log(`[pieui] Copied _shared from: ${sharedTemplateDir}`);
198424
- console.log(`[pieui] Next steps:`);
198425
- console.log(` 1. cd ${trimmedAppName}`);
198426
- console.log(` 2. bun install`);
198427
- console.log(` 3. bun run dev`);
198428
- };
198429
-
198430
- // src/code/commands/pageAdd.ts
198431
- var import_fs12 = __toESM(require("fs"));
198432
- var import_path14 = __toESM(require("path"));
198433
198385
  var normalizePagePath = (pagePath) => {
198434
198386
  const trimmed = pagePath.trim();
198435
198387
  if (!trimmed) {
@@ -198439,7 +198391,7 @@ var normalizePagePath = (pagePath) => {
198439
198391
  const withoutRelativePrefix = normalizedSlashes.replace(/^\.\/+/, "");
198440
198392
  const withoutAppPrefix = withoutRelativePrefix.replace(/^app\//, "");
198441
198393
  const withoutEdgeSlashes = withoutAppPrefix.replace(/^\/+|\/+$/g, "");
198442
- const normalized = import_path14.default.posix.normalize(withoutEdgeSlashes);
198394
+ const normalized = import_path13.default.posix.normalize(withoutEdgeSlashes);
198443
198395
  if (!normalized || normalized === ".") {
198444
198396
  throw new Error("Path is required for page add command");
198445
198397
  }
@@ -198459,98 +198411,80 @@ var pageComponentNameForPath = (pagePath) => {
198459
198411
  var pageAddCommand = (pagePath) => {
198460
198412
  const normalizedPath = normalizePagePath(pagePath);
198461
198413
  const pageComponentName = pageComponentNameForPath(normalizedPath);
198462
- const appDir = import_path14.default.join(process.cwd(), "app");
198463
- const targetFile = import_path14.default.join(appDir, normalizedPath, "page.tsx");
198464
- const relativeTarget = import_path14.default.relative(appDir, targetFile);
198465
- if (relativeTarget.startsWith("..") || import_path14.default.isAbsolute(relativeTarget)) {
198414
+ const appDir = import_path13.default.join(process.cwd(), "app");
198415
+ const targetFile = import_path13.default.join(appDir, normalizedPath, "page.tsx");
198416
+ const relativeTarget = import_path13.default.relative(appDir, targetFile);
198417
+ if (relativeTarget.startsWith("..") || import_path13.default.isAbsolute(relativeTarget)) {
198466
198418
  throw new Error("Page path must stay inside the app directory");
198467
198419
  }
198468
- if (import_fs12.default.existsSync(targetFile)) {
198420
+ if (import_fs11.default.existsSync(targetFile)) {
198469
198421
  console.error(`[pieui] Error: Page already exists at app/${normalizedPath}/page.tsx`);
198470
198422
  process.exit(1);
198471
198423
  }
198472
- import_fs12.default.mkdirSync(import_path14.default.dirname(targetFile), { recursive: true });
198473
- import_fs12.default.writeFileSync(targetFile, pageTemplate(pageComponentName), "utf8");
198424
+ import_fs11.default.mkdirSync(import_path13.default.dirname(targetFile), { recursive: true });
198425
+ import_fs11.default.writeFileSync(targetFile, pageTemplate(pageComponentName), "utf8");
198474
198426
  console.log(`[pieui] Page created successfully at app/${normalizedPath}/page.tsx`);
198475
198427
  };
198476
198428
 
198477
198429
  // src/code/commands/create.ts
198478
- var import_fs13 = __toESM(require("fs"));
198479
- var import_path15 = __toESM(require("path"));
198480
- var import_child_process2 = require("child_process");
198481
- var DEFAULT_TEMPLATE_SPEC2 = "next-app@latest";
198482
- var SHARED_PAGE_TEMPLATE = `"use client";
198483
-
198484
- import { useRouter } from "next/navigation";
198485
- import { PieRoot } from "@swarm.ing/pieui";
198486
- import "@/piecomponents/registry";
198487
- import { usePathname, useSearchParams } from "next/navigation";
198488
- import LoadingScreen from "@/components/LoadingScreen";
198489
-
198490
- export default function PiePage() {
198491
- const router = useRouter();
198492
- const pathname = usePathname();
198493
- const searchParams = useSearchParams();
198494
- const search = searchParams.toString();
198495
-
198496
- return (
198497
- <PieRoot
198498
- location={{ pathname, search }}
198499
- config={{
198500
- apiServer: process.env.PIE_API_SERVER!,
198501
- centrifugeServer: process.env.PIE_CENTRIFUGE_SERVER!,
198502
- enableRenderingLog: true,
198503
- }}
198504
- onNavigate={(url) => router.push(url)}
198505
- fallback={<></>}
198506
- />
198507
- );
198508
- }
198509
- `;
198510
- var HOME_PAGE_TEMPLATE = `"use client";
198511
-
198512
- import PiePage from "@/app/_shared/page";
198513
- import { Suspense } from "react";
198514
-
198515
- export default function HomePage() {
198516
- return (
198517
- <Suspense fallback={<></>}>
198518
- <PiePage />
198519
- </Suspense>
198520
- );
198521
- }
198522
- `;
198523
- var LOADING_SCREEN_TEMPLATE = `"use client";
198524
-
198525
- export default function LoadingScreen() {
198526
- return (
198527
- <div className="flex min-h-screen items-center justify-center text-sm text-neutral-500">
198528
- Loading...
198529
- </div>
198530
- );
198531
- }
198532
- `;
198430
+ var import_fs12 = __toESM(require("fs"));
198431
+ var import_path14 = __toESM(require("path"));
198432
+ var import_child_process = require("child_process");
198433
+ var DEFAULT_TEMPLATE_SPEC = "next-app@latest";
198533
198434
  var clearDirectory = (targetDir) => {
198534
- if (!import_fs13.default.existsSync(targetDir))
198435
+ if (!import_fs12.default.existsSync(targetDir))
198535
198436
  return;
198536
- for (const entry of import_fs13.default.readdirSync(targetDir)) {
198537
- import_fs13.default.rmSync(import_path15.default.join(targetDir, entry), { recursive: true, force: true });
198437
+ for (const entry of import_fs12.default.readdirSync(targetDir)) {
198438
+ import_fs12.default.rmSync(import_path14.default.join(targetDir, entry), { recursive: true, force: true });
198538
198439
  }
198539
198440
  };
198540
198441
  var writeFile = (filePath, content) => {
198541
- import_fs13.default.mkdirSync(import_path15.default.dirname(filePath), { recursive: true });
198542
- import_fs13.default.writeFileSync(filePath, content, "utf8");
198442
+ import_fs12.default.mkdirSync(import_path14.default.dirname(filePath), { recursive: true });
198443
+ import_fs12.default.writeFileSync(filePath, content, "utf8");
198444
+ };
198445
+ var resolveTemplatePublicDir = () => {
198446
+ const entrypointPath = process.argv[1] ? import_path14.default.resolve(process.argv[1]) : import_path14.default.join(process.cwd(), "src", "cli.ts");
198447
+ const entrypointDir = import_path14.default.dirname(entrypointPath);
198448
+ const candidateDirs = [
198449
+ import_path14.default.join(entrypointDir, "code", "public"),
198450
+ import_path14.default.join(process.cwd(), "src", "code", "public")
198451
+ ];
198452
+ for (const candidateDir of candidateDirs) {
198453
+ if (import_fs12.default.existsSync(candidateDir)) {
198454
+ return candidateDir;
198455
+ }
198456
+ }
198457
+ throw new Error("[pieui] Could not resolve bundled public template assets");
198543
198458
  };
198544
198459
  var scaffoldCreateAppFiles = (appDir) => {
198545
- clearDirectory(import_path15.default.join(appDir, "public"));
198546
- writeFile(import_path15.default.join(appDir, "app", "_shared", "page.tsx"), SHARED_PAGE_TEMPLATE);
198547
- writeFile(import_path15.default.join(appDir, "app", "page.tsx"), HOME_PAGE_TEMPLATE);
198548
- import_fs13.default.rmSync(import_path15.default.join(appDir, "app", "_shared", "simple.tsx"), {
198460
+ clearDirectory(import_path14.default.join(appDir, "public"));
198461
+ writeFile(import_path14.default.join(appDir, "app", "_shared", "page.tsx"), sharedPageTemplate);
198462
+ writeFile(import_path14.default.join(appDir, "app", "page.tsx"), homePageTemplate);
198463
+ writeFile(import_path14.default.join(appDir, "app", "layout.tsx"), rootLayoutTemplate);
198464
+ import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "_shared", "simple.tsx"), {
198465
+ force: true
198466
+ });
198467
+ import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "piecache.json"), { force: true });
198468
+ import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "favicon.ico"), { force: true });
198469
+ writeFile(import_path14.default.join(appDir, "components", "LoadingScreen.tsx"), loadingScreenTemplate);
198470
+ import_fs12.default.rmSync(import_path14.default.join(appDir, "components", "ErrorToast.tsx"), { force: true });
198471
+ import_fs12.default.cpSync(resolveTemplatePublicDir(), import_path14.default.join(appDir, "public"), {
198472
+ recursive: true,
198549
198473
  force: true
198550
198474
  });
198551
- import_fs13.default.rmSync(import_path15.default.join(appDir, "app", "piecache.json"), { force: true });
198552
- writeFile(import_path15.default.join(appDir, "components", "LoadingScreen.tsx"), LOADING_SCREEN_TEMPLATE);
198553
- import_fs13.default.rmSync(import_path15.default.join(appDir, "components", "ErrorToast.tsx"), { force: true });
198475
+ };
198476
+ var runBunCommand = (bunBin, args, cwd) => {
198477
+ const result = import_child_process.spawnSync(bunBin, args, {
198478
+ cwd,
198479
+ stdio: "inherit",
198480
+ env: process.env
198481
+ });
198482
+ if (result.error) {
198483
+ throw result.error;
198484
+ }
198485
+ if (result.status !== 0) {
198486
+ throw new Error(`${args.join(" ")} failed (exit code ${result.status ?? "unknown"})`);
198487
+ }
198554
198488
  };
198555
198489
  var createCommand = (appName) => {
198556
198490
  const trimmedAppName = appName.trim();
@@ -198558,15 +198492,15 @@ var createCommand = (appName) => {
198558
198492
  console.error("[pieui] Error: App name is required for create command");
198559
198493
  process.exit(1);
198560
198494
  }
198561
- const appDir = import_path15.default.resolve(process.cwd(), trimmedAppName);
198562
- if (import_fs13.default.existsSync(appDir)) {
198495
+ const appDir = import_path14.default.resolve(process.cwd(), trimmedAppName);
198496
+ if (import_fs12.default.existsSync(appDir)) {
198563
198497
  console.error(`[pieui] Error: Target directory already exists: ${trimmedAppName}`);
198564
198498
  process.exit(1);
198565
198499
  }
198566
198500
  const bunBin = process.env.PIEUI_CREATE_BUN_BIN || "bun";
198567
- const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC || DEFAULT_TEMPLATE_SPEC2;
198501
+ const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC || DEFAULT_TEMPLATE_SPEC;
198568
198502
  console.log(`[pieui] Creating Next.js app in "${trimmedAppName}"...`);
198569
- const result = import_child_process2.spawnSync(bunBin, ["create", templateSpec, trimmedAppName, "--yes"], {
198503
+ const result = import_child_process.spawnSync(bunBin, ["create", templateSpec, trimmedAppName, "--yes"], {
198570
198504
  cwd: process.cwd(),
198571
198505
  stdio: "inherit",
198572
198506
  env: process.env
@@ -198579,10 +198513,9 @@ var createCommand = (appName) => {
198579
198513
  }
198580
198514
  scaffoldCreateAppFiles(appDir);
198581
198515
  initCommand(trimmedAppName);
198582
- console.log("[pieui] App created successfully.");
198583
- console.log("[pieui] Next steps:");
198584
- console.log(` 1. cd ${trimmedAppName}`);
198585
- console.log(" 2. bun run dev");
198516
+ writeFile(import_path14.default.join(appDir, ".env"), envTemplate());
198517
+ runBunCommand(bunBin, ["install"], appDir);
198518
+ runBunCommand(bunBin, ["run", "dev"], appDir);
198586
198519
  };
198587
198520
 
198588
198521
  // src/cli.ts
@@ -198609,14 +198542,6 @@ var main = async () => {
198609
198542
  case "init":
198610
198543
  initCommand(outDir);
198611
198544
  return;
198612
- case "create-pie-app":
198613
- if (!createAppName) {
198614
- console.error("[pieui] Error: App name is required for create-pie-app command");
198615
- printUsage();
198616
- process.exit(1);
198617
- }
198618
- createPieAppCommand(createAppName);
198619
- return;
198620
198545
  case "create":
198621
198546
  if (!createAppName) {
198622
198547
  console.error("[pieui] Error: App name is required for create command");
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/code/commands/create.ts"],"names":[],"mappings":"AAyFA,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,SA+C5C,CAAA"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/code/commands/create.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,SA6C5C,CAAA"}
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1000" viewBox="0 0 1000 1000"><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description><dc:creator>RealFaviconGenerator</dc:creator><dc:source>https://realfavicongenerator.net</dc:source></rdf:Description></rdf:RDF></metadata><image width="1000" height="1000" xlink:href="data:image/png;base64,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"></image></svg>
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ export declare const envTemplate: () => string;
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/code/templates/env.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAAO,MAO9B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const homePageTemplate = "\"use client\";\n\nimport PiePage from \"@/app/_shared/page\";\nimport { Suspense } from \"react\";\n\nexport default function HomePage() {\n return (\n <Suspense fallback={<></>}>\n <PiePage />\n </Suspense>\n );\n}\n";
2
+ //# sourceMappingURL=homePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homePage.d.ts","sourceRoot":"","sources":["../../../src/code/templates/homePage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,4OAY5B,CAAA"}
@@ -1,7 +1,12 @@
1
1
  import { componentIndexTemplate } from './componentIndex';
2
2
  import { componentTypesTemplate } from './componentTypes';
3
+ import { envTemplate } from './env';
4
+ import { homePageTemplate } from './homePage';
5
+ import { loadingScreenTemplate } from './loadingScreen';
3
6
  import { registerCallTemplate } from './registerCall';
7
+ import { rootLayoutTemplate } from './rootLayout';
8
+ import { sharedPageTemplate } from './sharedPage';
4
9
  import { nextConfigTemplate, REQUIRED_NEXT_CONFIG_ENV_KEYS } from './nextConfig';
5
10
  import { baseInterfaceFor, componentTemplateFor, pageTemplate } from './pages';
6
- export { baseInterfaceFor, componentTemplateFor, componentIndexTemplate, componentTypesTemplate, pageTemplate, registerCallTemplate, nextConfigTemplate, REQUIRED_NEXT_CONFIG_ENV_KEYS, };
11
+ export { baseInterfaceFor, componentTemplateFor, componentIndexTemplate, componentTypesTemplate, envTemplate, homePageTemplate, loadingScreenTemplate, pageTemplate, registerCallTemplate, nextConfigTemplate, REQUIRED_NEXT_CONFIG_ENV_KEYS, rootLayoutTemplate, sharedPageTemplate, };
7
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACf,MAAM,SAAS,CAAA;AAEhB,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,GAChC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACf,MAAM,SAAS,CAAA;AAEhB,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,kBAAkB,EAClB,kBAAkB,GACrB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const loadingScreenTemplate = "\"use client\";\n\nexport default function LoadingScreen() {\n return (\n <div className=\"flex min-h-screen items-center justify-center text-sm text-neutral-500\">\n Loading...\n </div>\n );\n}\n";
2
+ //# sourceMappingURL=loadingScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadingScreen.d.ts","sourceRoot":"","sources":["../../../src/code/templates/loadingScreen.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,sNASjC,CAAA"}
@@ -1,3 +1,3 @@
1
- export declare const REQUIRED_NEXT_CONFIG_ENV_KEYS: readonly ["PIE_API_SERVER", "PIE_CENTRIFUGE_SERVER", "PIE_ENABLE_RENDERING_LOG", "PIE_PLATFORM"];
1
+ export declare const REQUIRED_NEXT_CONFIG_ENV_KEYS: readonly ["PIE_API_SERVER", "PIE_CENTRIFUGE_SERVER", "PIE_ENABLE_RENDERING_LOG"];
2
2
  export declare const nextConfigTemplate: () => string;
3
3
  //# sourceMappingURL=nextConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nextConfig.d.ts","sourceRoot":"","sources":["../../../src/code/templates/nextConfig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,kGAKhC,CAAA;AAEV,eAAO,MAAM,kBAAkB,QAAO,MAiBrC,CAAA"}
1
+ {"version":3,"file":"nextConfig.d.ts","sourceRoot":"","sources":["../../../src/code/templates/nextConfig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,kFAIhC,CAAA;AAEV,eAAO,MAAM,kBAAkB,QAAO,MAgBrC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const rootLayoutTemplate = "import type { Metadata } from \"next\";\nimport \"./globals.css\";\n\nexport const metadata: Metadata = {\n title: \"PieUI Project\",\n description: \"Generated by PieUI.\",\n applicationName: \"PieUI Project\",\n icons: {\n icon: \"/favicon.ico\",\n shortcut: \"/favicon.ico\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n";
2
+ //# sourceMappingURL=rootLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootLayout.d.ts","sourceRoot":"","sources":["../../../src/code/templates/rootLayout.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,mfAwB9B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const sharedPageTemplate = "\"use client\";\n\nimport { useRouter } from \"next/navigation\";\nimport { PieRoot } from \"@swarm.ing/pieui\";\nimport \"@/piecomponents/registry\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\n\nexport default function PiePage() {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const search = searchParams.toString();\n\n return (\n <PieRoot\n location={{ pathname, search }}\n config={{\n apiServer: process.env.PIE_API_SERVER!,\n centrifugeServer: process.env.PIE_CENTRIFUGE_SERVER!,\n enableRenderingLog: true,\n }}\n onNavigate={(url) => router.push(url)}\n fallback={<></>}\n />\n );\n}\n";
2
+ //# sourceMappingURL=sharedPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedPage.d.ts","sourceRoot":"","sources":["../../../src/code/templates/sharedPage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,uuBA0B9B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swarm.ing/pieui",
3
- "version": "2.0.11",
3
+ "version": "2.0.13",
4
4
  "description": "A React component library featuring PieCard component",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,8 +10,7 @@
10
10
  "module": "dist/index.esm.js",
11
11
  "types": "dist/index.d.ts",
12
12
  "bin": {
13
- "pieui": "dist/cli.js",
14
- "create-pieui": "dist/create.js"
13
+ "pieui": "dist/cli.js"
15
14
  },
16
15
  "files": [
17
16
  "dist"
@@ -32,7 +31,7 @@
32
31
  }
33
32
  },
34
33
  "scripts": {
35
- "build": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm && NODE_ENV=production bun run build:cjs && NODE_ENV=production bun run build:components:esm && NODE_ENV=production bun run build:components:cjs && bun run build:banner && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && NODE_ENV=production bun run build:create && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
34
+ "build": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm && NODE_ENV=production bun run build:cjs && NODE_ENV=production bun run build:components:esm && NODE_ENV=production bun run build:components:cjs && bun run build:banner && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
36
35
  "build:banner": "node -e \"const fs=require('fs');['dist/index.esm.js','dist/index.js','dist/components/index.esm.js','dist/components/index.js'].forEach(f=>{if(fs.existsSync(f)){fs.writeFileSync(f,'\\\"use client\\\";\\n'+fs.readFileSync(f,'utf8'))}})\"",
37
36
  "build:clean": "rm -rf dist",
38
37
  "build:esm": "bun build src/index.ts --outfile dist/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --minify --packages=external",
@@ -43,18 +42,11 @@
43
42
  "build:cjs:debug": "bun build src/index.ts --outfile dist/index.js --format cjs --target node --jsx=automatic --jsx-import-source=react --packages=external",
44
43
  "build:components:esm:debug": "bun build src/components/index.ts --outfile dist/components/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --packages=external",
45
44
  "build:components:cjs:debug": "bun build src/components/index.ts --outfile dist/components/index.js --format cjs --target node --jsx=automatic --jsx-import-source=react --packages=external",
46
- "build:debug": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm:debug && NODE_ENV=production bun run build:cjs:debug && NODE_ENV=production bun run build:components:esm:debug && NODE_ENV=production bun run build:components:cjs:debug && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && NODE_ENV=production bun run build:create && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
45
+ "build:debug": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm:debug && NODE_ENV=production bun run build:cjs:debug && NODE_ENV=production bun run build:components:esm:debug && NODE_ENV=production bun run build:components:cjs:debug && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
47
46
  "build:types": "tsc --emitDeclarationOnly",
48
- "build:cli": "bun build src/cli.ts --outfile dist/cli.js --format cjs --target node --external vm2",
49
- "build:create": "bun build src/create.ts --outfile dist/create.js --format cjs --target node --external vm2",
47
+ "build:cli": "bun build src/cli.ts --outfile dist/cli.js --format cjs --target node --external vm2 && mkdir -p dist/code && cp -R src/code/public dist/code/",
50
48
  "dev": "bun run src/index.ts",
51
49
  "test": "bun test",
52
- "test:step1": "bun test src/__tests__/step1-local.test.cjs",
53
- "test:step2": "bun test src/__tests__/step2-remote.test.cjs",
54
- "test:step3": "bun test src/__tests__/step3-contract.test.cjs",
55
- "test:step4": "bun test src/__tests__/step4-ci.test.cjs",
56
- "test:step5": "bun test src/__tests__/step5-regres.test.cjs",
57
- "test:steps": "bun test src/__tests__/step1-local.test.cjs src/__tests__/step2-remote.test.cjs src/__tests__/step3-contract.test.cjs src/__tests__/step4-ci.test.cjs src/__tests__/step5-regres.test.cjs",
58
50
  "test:cleanup": "node scripts/cleanup-test-artifacts.mjs",
59
51
  "typecheck": "tsc --noEmit",
60
52
  "lint": "prettier --write ./",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=step1-local.test.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step1-local.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step1-local.test.cjs"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=step2-remote.test.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step2-remote.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step2-remote.test.cjs"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=step3-contract.test.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step3-contract.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step3-contract.test.cjs"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=step4-ci.test.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step4-ci.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step4-ci.test.cjs"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=step5-regres.test.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step5-regres.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step5-regres.test.cjs"],"names":[],"mappings":""}
package/dist/create.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=create.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":""}
package/dist/create.js DELETED
@@ -1,162 +0,0 @@
1
- #!/usr/bin/env node
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
-
19
- // src/code/commands/createPieApp.ts
20
- var import_fs = __toESM(require("fs"));
21
- var import_path = __toESM(require("path"));
22
- var import_child_process = require("child_process");
23
- var DEFAULT_TEMPLATE_SPEC = "next-app@latest";
24
- var SHARED_TEMPLATE_DIR_ENV = "PIEUI_SHARED_TEMPLATE_DIR";
25
- var AI_EXCHANGE_BOT_DIR_ENV = "PIEUI_AI_EXCHANGE_BOT_DIR";
26
- var BACKEND_LINK_COMMENT = "// TODO(pie-backend): Link generated Python Unicorn backend routes here once backend template sync is enabled.";
27
- var updateNextScriptsToBun = (packageJsonPath) => {
28
- if (!import_fs.default.existsSync(packageJsonPath))
29
- return;
30
- try {
31
- const pkg = JSON.parse(import_fs.default.readFileSync(packageJsonPath, "utf8"));
32
- if (!pkg.scripts)
33
- return;
34
- const updates = {
35
- dev: "bun --bun next dev",
36
- build: "bun --bun next build",
37
- start: "bun --bun next start"
38
- };
39
- for (const [scriptName, scriptValue] of Object.entries(updates)) {
40
- if (pkg.scripts[scriptName]) {
41
- pkg.scripts[scriptName] = scriptValue;
42
- }
43
- }
44
- import_fs.default.writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}
45
- `, "utf8");
46
- } catch {
47
- }
48
- };
49
- var appendBackendLinkComment = (pagePath) => {
50
- if (!import_fs.default.existsSync(pagePath))
51
- return;
52
- const page = import_fs.default.readFileSync(pagePath, "utf8");
53
- if (page.includes(BACKEND_LINK_COMMENT))
54
- return;
55
- import_fs.default.writeFileSync(pagePath, `${page.trimEnd()}
56
-
57
- ${BACKEND_LINK_COMMENT}
58
- `, "utf8");
59
- };
60
- var uniq = (items) => [...new Set(items)];
61
- var isDirectory = (target) => {
62
- try {
63
- return import_fs.default.statSync(target).isDirectory();
64
- } catch {
65
- return false;
66
- }
67
- };
68
- var resolveSharedTemplateDir = () => {
69
- const explicitSharedDir = process.env[SHARED_TEMPLATE_DIR_ENV];
70
- if (explicitSharedDir) {
71
- const normalized = import_path.default.resolve(explicitSharedDir);
72
- if (!isDirectory(normalized)) {
73
- throw new Error(`${SHARED_TEMPLATE_DIR_ENV} points to a missing directory: ${normalized}`);
74
- }
75
- return normalized;
76
- }
77
- const cwd = process.cwd();
78
- const baseDirs = [cwd, import_path.default.resolve(cwd, ".."), import_path.default.resolve(cwd, "../..")];
79
- const explicitRepoDir = process.env[AI_EXCHANGE_BOT_DIR_ENV];
80
- if (explicitRepoDir) {
81
- baseDirs.unshift(import_path.default.resolve(explicitRepoDir));
82
- }
83
- const repoNames = ["ai-exchange-bot", "ai-exchange-web", "a-exchange-web"];
84
- const repoCandidates = uniq([
85
- ...baseDirs,
86
- ...baseDirs.flatMap((base) => repoNames.map((name) => import_path.default.join(base, name)))
87
- ]).filter((candidate) => isDirectory(candidate));
88
- const sharedSubpaths = [
89
- "_shared",
90
- "src/_shared",
91
- "app/_shared",
92
- "pages/_shared",
93
- "pages/components/_shared",
94
- "apps/web/_shared",
95
- "apps/web/src/_shared"
96
- ];
97
- for (const repoDir of repoCandidates) {
98
- for (const subpath of sharedSubpaths) {
99
- const candidate = import_path.default.join(repoDir, subpath);
100
- if (isDirectory(candidate)) {
101
- return candidate;
102
- }
103
- }
104
- }
105
- throw new Error([
106
- "Could not locate a _shared template directory from ai-exchange-bot.",
107
- `Set ${SHARED_TEMPLATE_DIR_ENV}=/absolute/path/to/_shared`,
108
- `or ${AI_EXCHANGE_BOT_DIR_ENV}=/absolute/path/to/ai-exchange-bot.`
109
- ].join(" "));
110
- };
111
- var copySharedTemplate = (sharedTemplateDir, appDir) => {
112
- const destination = import_path.default.join(appDir, "_shared");
113
- import_fs.default.cpSync(sharedTemplateDir, destination, { recursive: true, force: true });
114
- };
115
- var createPieAppCommand = (appName) => {
116
- const trimmedAppName = appName.trim();
117
- if (!trimmedAppName) {
118
- console.error("[pieui] Error: App name is required for create-pie-app command");
119
- process.exit(1);
120
- }
121
- const appDir = import_path.default.resolve(process.cwd(), trimmedAppName);
122
- if (import_fs.default.existsSync(appDir)) {
123
- console.error(`[pieui] Error: Target directory already exists: ${trimmedAppName}`);
124
- process.exit(1);
125
- }
126
- const bunBin = process.env.PIEUI_CREATE_BUN_BIN || "bun";
127
- const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC || DEFAULT_TEMPLATE_SPEC;
128
- console.log(`[pieui] Creating blank PieUI web template in "${trimmedAppName}"...`);
129
- const args = ["create", templateSpec, trimmedAppName, "--yes"];
130
- const result = import_child_process.spawnSync(bunBin, args, {
131
- cwd: process.cwd(),
132
- stdio: "inherit",
133
- env: process.env
134
- });
135
- if (result.error) {
136
- throw result.error;
137
- }
138
- if (result.status !== 0) {
139
- throw new Error(`create-pie-app failed (exit code ${result.status ?? "unknown"})`);
140
- }
141
- const sharedTemplateDir = resolveSharedTemplateDir();
142
- copySharedTemplate(sharedTemplateDir, appDir);
143
- updateNextScriptsToBun(import_path.default.join(appDir, "package.json"));
144
- appendBackendLinkComment(import_path.default.join(appDir, "app", "page.tsx"));
145
- console.log("[pieui] Template created successfully.");
146
- console.log(`[pieui] Copied _shared from: ${sharedTemplateDir}`);
147
- console.log(`[pieui] Next steps:`);
148
- console.log(` 1. cd ${trimmedAppName}`);
149
- console.log(` 2. bun install`);
150
- console.log(` 3. bun run dev`);
151
- };
152
-
153
- // src/create.ts
154
- var main = () => {
155
- const [appName = ""] = process.argv.slice(2);
156
- if (!appName) {
157
- console.error("Usage: bun create pieui@latest <app-name>");
158
- process.exit(1);
159
- }
160
- createPieAppCommand(appName);
161
- };
162
- main();