@swarm.ing/pieui 2.0.11 → 2.0.14
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/dist/cli.js +298 -235
- package/dist/code/args.d.ts.map +1 -1
- package/dist/code/commands/create.d.ts.map +1 -1
- package/dist/code/commands/login.d.ts +11 -0
- package/dist/code/commands/login.d.ts.map +1 -0
- package/dist/code/public/favicon.ico +0 -0
- package/dist/code/public/favicon.svg +1 -0
- package/dist/code/public/pieui.png +0 -0
- package/dist/code/public/swarm.ing.png +0 -0
- package/dist/code/templates/env.d.ts +2 -0
- package/dist/code/templates/env.d.ts.map +1 -0
- package/dist/code/templates/homePage.d.ts +2 -0
- package/dist/code/templates/homePage.d.ts.map +1 -0
- package/dist/code/templates/index.d.ts +6 -1
- package/dist/code/templates/index.d.ts.map +1 -1
- package/dist/code/templates/loadingScreen.d.ts +2 -0
- package/dist/code/templates/loadingScreen.d.ts.map +1 -0
- package/dist/code/templates/nextConfig.d.ts +1 -1
- package/dist/code/templates/nextConfig.d.ts.map +1 -1
- package/dist/code/templates/rootLayout.d.ts +2 -0
- package/dist/code/templates/rootLayout.d.ts.map +1 -0
- package/dist/code/templates/sharedPage.d.ts +2 -0
- package/dist/code/templates/sharedPage.d.ts.map +1 -0
- package/package.json +5 -13
- package/dist/__tests__/step1-local.test.d.cts +0 -2
- package/dist/__tests__/step1-local.test.d.cts.map +0 -1
- package/dist/__tests__/step2-remote.test.d.cts +0 -2
- package/dist/__tests__/step2-remote.test.d.cts.map +0 -1
- package/dist/__tests__/step3-contract.test.d.cts +0 -2
- package/dist/__tests__/step3-contract.test.d.cts.map +0 -1
- package/dist/__tests__/step4-ci.test.d.cts +0 -2
- package/dist/__tests__/step4-ci.test.d.cts.map +0 -1
- package/dist/__tests__/step5-regres.test.d.cts +0 -2
- package/dist/__tests__/step5-regres.test.d.cts.map +0 -1
- package/dist/create.d.ts +0 -3
- package/dist/create.d.ts.map +0 -1
- package/dist/create.js +0 -162
package/dist/cli.js
CHANGED
|
@@ -193140,6 +193140,7 @@ var printUsage = () => {
|
|
|
193140
193140
|
console.log("Commands:");
|
|
193141
193141
|
console.log(" create <AppName> Create a Next.js app and run pieui init inside it");
|
|
193142
193142
|
console.log(" create-pie-app <AppName> Create a blank Next.js web template for PieUI (bun create next-app under the hood)");
|
|
193143
|
+
console.log(" login Sign in to PieUI and save credentials to .pie/config.json");
|
|
193143
193144
|
console.log(" init Initialize piecomponents directory with registry.ts");
|
|
193144
193145
|
console.log(" card add [type] <ComponentName> [--io] [--ajax] Create a new component in piecomponents directory");
|
|
193145
193146
|
console.log(" page add <path> Create app/<path>/page.tsx from the standard Pie page template");
|
|
@@ -193188,6 +193189,7 @@ var printUsage = () => {
|
|
|
193188
193189
|
console.log(" complex-container Container with array content");
|
|
193189
193190
|
console.log("");
|
|
193190
193191
|
console.log("Examples:");
|
|
193192
|
+
console.log(" pieui login");
|
|
193191
193193
|
console.log(" pieui init");
|
|
193192
193194
|
console.log(" pieui create my-pie-app");
|
|
193193
193195
|
console.log(" pieui create-pie-app my-pie-app");
|
|
@@ -193249,12 +193251,104 @@ export type ${componentName}Props = ${baseInterface}<${componentName}Data>
|
|
|
193249
193251
|
`;
|
|
193250
193252
|
};
|
|
193251
193253
|
|
|
193254
|
+
// src/code/templates/env.ts
|
|
193255
|
+
var envTemplate = () => `PIE_ENABLE_RENDERING_LOG=true
|
|
193256
|
+
PIE_API_SERVER=http://localhost:8008/
|
|
193257
|
+
PIE_CENTRIFUGE_SERVER=wss://localhost:8000/connection/websocket
|
|
193258
|
+
|
|
193259
|
+
NEXT_PUBLIC_PIE_ENABLE_RENDERING_LOG=true
|
|
193260
|
+
NEXT_PUBLIC_PIE_API_SERVER=http://localhost:8008/
|
|
193261
|
+
NEXT_PUBLIC_PIE_CENTRIFUGE_SERVER=wss://localhost:8000/connection/websocket
|
|
193262
|
+
`;
|
|
193263
|
+
|
|
193264
|
+
// src/code/templates/homePage.ts
|
|
193265
|
+
var homePageTemplate = `"use client";
|
|
193266
|
+
|
|
193267
|
+
import PiePage from "@/app/_shared/page";
|
|
193268
|
+
import { Suspense } from "react";
|
|
193269
|
+
|
|
193270
|
+
export default function HomePage() {
|
|
193271
|
+
return (
|
|
193272
|
+
<Suspense fallback={<></>}>
|
|
193273
|
+
<PiePage />
|
|
193274
|
+
</Suspense>
|
|
193275
|
+
);
|
|
193276
|
+
}
|
|
193277
|
+
`;
|
|
193278
|
+
|
|
193279
|
+
// src/code/templates/loadingScreen.ts
|
|
193280
|
+
var loadingScreenTemplate = `"use client";
|
|
193281
|
+
|
|
193282
|
+
export default function LoadingScreen() {
|
|
193283
|
+
return (
|
|
193284
|
+
<div className="flex min-h-screen items-center justify-center text-sm text-neutral-500">
|
|
193285
|
+
Loading...
|
|
193286
|
+
</div>
|
|
193287
|
+
);
|
|
193288
|
+
}
|
|
193289
|
+
`;
|
|
193290
|
+
|
|
193291
|
+
// src/code/templates/rootLayout.ts
|
|
193292
|
+
var rootLayoutTemplate = `import type { Metadata } from "next";
|
|
193293
|
+
import "./globals.css";
|
|
193294
|
+
|
|
193295
|
+
export const metadata: Metadata = {
|
|
193296
|
+
title: "PieUI Project",
|
|
193297
|
+
description: "Generated by PieUI.",
|
|
193298
|
+
applicationName: "PieUI Project",
|
|
193299
|
+
icons: {
|
|
193300
|
+
icon: "/favicon.ico",
|
|
193301
|
+
shortcut: "/favicon.ico",
|
|
193302
|
+
},
|
|
193303
|
+
};
|
|
193304
|
+
|
|
193305
|
+
export default function RootLayout({
|
|
193306
|
+
children,
|
|
193307
|
+
}: Readonly<{
|
|
193308
|
+
children: React.ReactNode;
|
|
193309
|
+
}>) {
|
|
193310
|
+
return (
|
|
193311
|
+
<html lang="en">
|
|
193312
|
+
<body>{children}</body>
|
|
193313
|
+
</html>
|
|
193314
|
+
);
|
|
193315
|
+
}
|
|
193316
|
+
`;
|
|
193317
|
+
|
|
193318
|
+
// src/code/templates/sharedPage.ts
|
|
193319
|
+
var sharedPageTemplate = `"use client";
|
|
193320
|
+
|
|
193321
|
+
import { useRouter } from "next/navigation";
|
|
193322
|
+
import { PieRoot } from "@swarm.ing/pieui";
|
|
193323
|
+
import "@/piecomponents/registry";
|
|
193324
|
+
import { usePathname, useSearchParams } from "next/navigation";
|
|
193325
|
+
|
|
193326
|
+
export default function PiePage() {
|
|
193327
|
+
const router = useRouter();
|
|
193328
|
+
const pathname = usePathname();
|
|
193329
|
+
const searchParams = useSearchParams();
|
|
193330
|
+
const search = searchParams.toString();
|
|
193331
|
+
|
|
193332
|
+
return (
|
|
193333
|
+
<PieRoot
|
|
193334
|
+
location={{ pathname, search }}
|
|
193335
|
+
config={{
|
|
193336
|
+
apiServer: process.env.PIE_API_SERVER!,
|
|
193337
|
+
centrifugeServer: process.env.PIE_CENTRIFUGE_SERVER!,
|
|
193338
|
+
enableRenderingLog: true,
|
|
193339
|
+
}}
|
|
193340
|
+
onNavigate={(url) => router.push(url)}
|
|
193341
|
+
fallback={<></>}
|
|
193342
|
+
/>
|
|
193343
|
+
);
|
|
193344
|
+
}
|
|
193345
|
+
`;
|
|
193346
|
+
|
|
193252
193347
|
// src/code/templates/nextConfig.ts
|
|
193253
193348
|
var REQUIRED_NEXT_CONFIG_ENV_KEYS = [
|
|
193254
193349
|
"PIE_API_SERVER",
|
|
193255
193350
|
"PIE_CENTRIFUGE_SERVER",
|
|
193256
|
-
"PIE_ENABLE_RENDERING_LOG"
|
|
193257
|
-
"PIE_PLATFORM"
|
|
193351
|
+
"PIE_ENABLE_RENDERING_LOG"
|
|
193258
193352
|
];
|
|
193259
193353
|
var nextConfigTemplate = () => `import type { NextConfig } from "next";
|
|
193260
193354
|
|
|
@@ -193265,7 +193359,6 @@ const nextConfig: NextConfig = {
|
|
|
193265
193359
|
PIE_API_SERVER: process.env.PIE_API_SERVER,
|
|
193266
193360
|
PIE_CENTRIFUGE_SERVER: process.env.PIE_CENTRIFUGE_SERVER,
|
|
193267
193361
|
PIE_ENABLE_RENDERING_LOG: process.env.PIE_ENABLE_RENDERING_LOG,
|
|
193268
|
-
PIE_PLATFORM: process.env.PIE_PLATFORM || "telegram",
|
|
193269
193362
|
},
|
|
193270
193363
|
reactStrictMode: true,
|
|
193271
193364
|
transpilePackages: ["@swarm.ing/pieui"],
|
|
@@ -193569,12 +193662,7 @@ var ensureNextConfig = (resolvedOutDir) => {
|
|
|
193569
193662
|
}
|
|
193570
193663
|
};
|
|
193571
193664
|
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
|
-
};
|
|
193665
|
+
var envEntryFor = (key) => ` ${key}: process.env.${key},`;
|
|
193578
193666
|
var ensureEnvKeys = (content) => {
|
|
193579
193667
|
const missingKeys = REQUIRED_NEXT_CONFIG_ENV_KEYS.filter((key) => !content.includes(key));
|
|
193580
193668
|
if (missingKeys.length === 0)
|
|
@@ -198293,143 +198381,9 @@ ${text2}` : ""}`);
|
|
|
198293
198381
|
[pieui] ${text}` : ""}`);
|
|
198294
198382
|
};
|
|
198295
198383
|
|
|
198296
|
-
// src/code/commands/
|
|
198384
|
+
// src/code/commands/pageAdd.ts
|
|
198297
198385
|
var import_fs11 = __toESM(require("fs"));
|
|
198298
198386
|
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
198387
|
var normalizePagePath = (pagePath) => {
|
|
198434
198388
|
const trimmed = pagePath.trim();
|
|
198435
198389
|
if (!trimmed) {
|
|
@@ -198439,7 +198393,7 @@ var normalizePagePath = (pagePath) => {
|
|
|
198439
198393
|
const withoutRelativePrefix = normalizedSlashes.replace(/^\.\/+/, "");
|
|
198440
198394
|
const withoutAppPrefix = withoutRelativePrefix.replace(/^app\//, "");
|
|
198441
198395
|
const withoutEdgeSlashes = withoutAppPrefix.replace(/^\/+|\/+$/g, "");
|
|
198442
|
-
const normalized =
|
|
198396
|
+
const normalized = import_path13.default.posix.normalize(withoutEdgeSlashes);
|
|
198443
198397
|
if (!normalized || normalized === ".") {
|
|
198444
198398
|
throw new Error("Path is required for page add command");
|
|
198445
198399
|
}
|
|
@@ -198459,98 +198413,80 @@ var pageComponentNameForPath = (pagePath) => {
|
|
|
198459
198413
|
var pageAddCommand = (pagePath) => {
|
|
198460
198414
|
const normalizedPath = normalizePagePath(pagePath);
|
|
198461
198415
|
const pageComponentName = pageComponentNameForPath(normalizedPath);
|
|
198462
|
-
const appDir =
|
|
198463
|
-
const targetFile =
|
|
198464
|
-
const relativeTarget =
|
|
198465
|
-
if (relativeTarget.startsWith("..") ||
|
|
198416
|
+
const appDir = import_path13.default.join(process.cwd(), "app");
|
|
198417
|
+
const targetFile = import_path13.default.join(appDir, normalizedPath, "page.tsx");
|
|
198418
|
+
const relativeTarget = import_path13.default.relative(appDir, targetFile);
|
|
198419
|
+
if (relativeTarget.startsWith("..") || import_path13.default.isAbsolute(relativeTarget)) {
|
|
198466
198420
|
throw new Error("Page path must stay inside the app directory");
|
|
198467
198421
|
}
|
|
198468
|
-
if (
|
|
198422
|
+
if (import_fs11.default.existsSync(targetFile)) {
|
|
198469
198423
|
console.error(`[pieui] Error: Page already exists at app/${normalizedPath}/page.tsx`);
|
|
198470
198424
|
process.exit(1);
|
|
198471
198425
|
}
|
|
198472
|
-
|
|
198473
|
-
|
|
198426
|
+
import_fs11.default.mkdirSync(import_path13.default.dirname(targetFile), { recursive: true });
|
|
198427
|
+
import_fs11.default.writeFileSync(targetFile, pageTemplate(pageComponentName), "utf8");
|
|
198474
198428
|
console.log(`[pieui] Page created successfully at app/${normalizedPath}/page.tsx`);
|
|
198475
198429
|
};
|
|
198476
198430
|
|
|
198477
198431
|
// src/code/commands/create.ts
|
|
198478
|
-
var
|
|
198479
|
-
var
|
|
198480
|
-
var
|
|
198481
|
-
var
|
|
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
|
-
`;
|
|
198432
|
+
var import_fs12 = __toESM(require("fs"));
|
|
198433
|
+
var import_path14 = __toESM(require("path"));
|
|
198434
|
+
var import_child_process = require("child_process");
|
|
198435
|
+
var DEFAULT_TEMPLATE_SPEC = "next-app@latest";
|
|
198533
198436
|
var clearDirectory = (targetDir) => {
|
|
198534
|
-
if (!
|
|
198437
|
+
if (!import_fs12.default.existsSync(targetDir))
|
|
198535
198438
|
return;
|
|
198536
|
-
for (const entry of
|
|
198537
|
-
|
|
198439
|
+
for (const entry of import_fs12.default.readdirSync(targetDir)) {
|
|
198440
|
+
import_fs12.default.rmSync(import_path14.default.join(targetDir, entry), { recursive: true, force: true });
|
|
198538
198441
|
}
|
|
198539
198442
|
};
|
|
198540
198443
|
var writeFile = (filePath, content) => {
|
|
198541
|
-
|
|
198542
|
-
|
|
198444
|
+
import_fs12.default.mkdirSync(import_path14.default.dirname(filePath), { recursive: true });
|
|
198445
|
+
import_fs12.default.writeFileSync(filePath, content, "utf8");
|
|
198446
|
+
};
|
|
198447
|
+
var resolveTemplatePublicDir = () => {
|
|
198448
|
+
const entrypointPath = process.argv[1] ? import_path14.default.resolve(process.argv[1]) : import_path14.default.join(process.cwd(), "src", "cli.ts");
|
|
198449
|
+
const entrypointDir = import_path14.default.dirname(entrypointPath);
|
|
198450
|
+
const candidateDirs = [
|
|
198451
|
+
import_path14.default.join(entrypointDir, "code", "public"),
|
|
198452
|
+
import_path14.default.join(process.cwd(), "src", "code", "public")
|
|
198453
|
+
];
|
|
198454
|
+
for (const candidateDir of candidateDirs) {
|
|
198455
|
+
if (import_fs12.default.existsSync(candidateDir)) {
|
|
198456
|
+
return candidateDir;
|
|
198457
|
+
}
|
|
198458
|
+
}
|
|
198459
|
+
throw new Error("[pieui] Could not resolve bundled public template assets");
|
|
198543
198460
|
};
|
|
198544
198461
|
var scaffoldCreateAppFiles = (appDir) => {
|
|
198545
|
-
clearDirectory(
|
|
198546
|
-
writeFile(
|
|
198547
|
-
writeFile(
|
|
198548
|
-
|
|
198462
|
+
clearDirectory(import_path14.default.join(appDir, "public"));
|
|
198463
|
+
writeFile(import_path14.default.join(appDir, "app", "_shared", "page.tsx"), sharedPageTemplate);
|
|
198464
|
+
writeFile(import_path14.default.join(appDir, "app", "page.tsx"), homePageTemplate);
|
|
198465
|
+
writeFile(import_path14.default.join(appDir, "app", "layout.tsx"), rootLayoutTemplate);
|
|
198466
|
+
import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "_shared", "simple.tsx"), {
|
|
198467
|
+
force: true
|
|
198468
|
+
});
|
|
198469
|
+
import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "piecache.json"), { force: true });
|
|
198470
|
+
import_fs12.default.rmSync(import_path14.default.join(appDir, "app", "favicon.ico"), { force: true });
|
|
198471
|
+
writeFile(import_path14.default.join(appDir, "components", "LoadingScreen.tsx"), loadingScreenTemplate);
|
|
198472
|
+
import_fs12.default.rmSync(import_path14.default.join(appDir, "components", "ErrorToast.tsx"), { force: true });
|
|
198473
|
+
import_fs12.default.cpSync(resolveTemplatePublicDir(), import_path14.default.join(appDir, "public"), {
|
|
198474
|
+
recursive: true,
|
|
198549
198475
|
force: true
|
|
198550
198476
|
});
|
|
198551
|
-
|
|
198552
|
-
|
|
198553
|
-
|
|
198477
|
+
};
|
|
198478
|
+
var runBunCommand = (bunBin, args, cwd) => {
|
|
198479
|
+
const result = import_child_process.spawnSync(bunBin, args, {
|
|
198480
|
+
cwd,
|
|
198481
|
+
stdio: "inherit",
|
|
198482
|
+
env: process.env
|
|
198483
|
+
});
|
|
198484
|
+
if (result.error) {
|
|
198485
|
+
throw result.error;
|
|
198486
|
+
}
|
|
198487
|
+
if (result.status !== 0) {
|
|
198488
|
+
throw new Error(`${args.join(" ")} failed (exit code ${result.status ?? "unknown"})`);
|
|
198489
|
+
}
|
|
198554
198490
|
};
|
|
198555
198491
|
var createCommand = (appName) => {
|
|
198556
198492
|
const trimmedAppName = appName.trim();
|
|
@@ -198558,15 +198494,15 @@ var createCommand = (appName) => {
|
|
|
198558
198494
|
console.error("[pieui] Error: App name is required for create command");
|
|
198559
198495
|
process.exit(1);
|
|
198560
198496
|
}
|
|
198561
|
-
const appDir =
|
|
198562
|
-
if (
|
|
198497
|
+
const appDir = import_path14.default.resolve(process.cwd(), trimmedAppName);
|
|
198498
|
+
if (import_fs12.default.existsSync(appDir)) {
|
|
198563
198499
|
console.error(`[pieui] Error: Target directory already exists: ${trimmedAppName}`);
|
|
198564
198500
|
process.exit(1);
|
|
198565
198501
|
}
|
|
198566
198502
|
const bunBin = process.env.PIEUI_CREATE_BUN_BIN || "bun";
|
|
198567
|
-
const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC ||
|
|
198503
|
+
const templateSpec = process.env.PIEUI_CREATE_NEXT_APP_SPEC || DEFAULT_TEMPLATE_SPEC;
|
|
198568
198504
|
console.log(`[pieui] Creating Next.js app in "${trimmedAppName}"...`);
|
|
198569
|
-
const result =
|
|
198505
|
+
const result = import_child_process.spawnSync(bunBin, ["create", templateSpec, trimmedAppName, "--yes"], {
|
|
198570
198506
|
cwd: process.cwd(),
|
|
198571
198507
|
stdio: "inherit",
|
|
198572
198508
|
env: process.env
|
|
@@ -198579,12 +198515,144 @@ var createCommand = (appName) => {
|
|
|
198579
198515
|
}
|
|
198580
198516
|
scaffoldCreateAppFiles(appDir);
|
|
198581
198517
|
initCommand(trimmedAppName);
|
|
198582
|
-
|
|
198583
|
-
|
|
198584
|
-
|
|
198585
|
-
console.log(" 2. bun run dev");
|
|
198518
|
+
writeFile(import_path14.default.join(appDir, ".env"), envTemplate());
|
|
198519
|
+
runBunCommand(bunBin, ["install"], appDir);
|
|
198520
|
+
runBunCommand(bunBin, ["run", "dev"], appDir);
|
|
198586
198521
|
};
|
|
198587
198522
|
|
|
198523
|
+
// src/code/commands/login.ts
|
|
198524
|
+
var import_node_child_process = require("node:child_process");
|
|
198525
|
+
var import_node_crypto = require("node:crypto");
|
|
198526
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
198527
|
+
var import_node_path2 = __toESM(require("node:path"));
|
|
198528
|
+
var CONNECT_BASE = "https://pieui.swarm.ing/connect";
|
|
198529
|
+
var CREDENTIALS_API = "https://api-pieui.swarm.ing/api/external/credentials";
|
|
198530
|
+
var CODE_LENGTH = 32;
|
|
198531
|
+
var generateCode = (length = CODE_LENGTH) => {
|
|
198532
|
+
const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
198533
|
+
let out = "";
|
|
198534
|
+
for (let i = 0;i < length; i++) {
|
|
198535
|
+
out += alphabet[import_node_crypto.randomInt(alphabet.length)];
|
|
198536
|
+
}
|
|
198537
|
+
return out;
|
|
198538
|
+
};
|
|
198539
|
+
var tryOpenBrowser = (url) => {
|
|
198540
|
+
try {
|
|
198541
|
+
if (process.platform === "win32") {
|
|
198542
|
+
import_node_child_process.execFile("cmd", ["/c", "start", "", url], () => {
|
|
198543
|
+
});
|
|
198544
|
+
} else if (process.platform === "darwin") {
|
|
198545
|
+
import_node_child_process.execFile("open", [url], () => {
|
|
198546
|
+
});
|
|
198547
|
+
} else {
|
|
198548
|
+
import_node_child_process.execFile("xdg-open", [url], () => {
|
|
198549
|
+
});
|
|
198550
|
+
}
|
|
198551
|
+
} catch {
|
|
198552
|
+
}
|
|
198553
|
+
};
|
|
198554
|
+
var defaultSleep = (ms2) => new Promise((resolve) => setTimeout(resolve, ms2));
|
|
198555
|
+
var PIE_ENV_MAP = [
|
|
198556
|
+
["PIE_USER_ID", "user_id"],
|
|
198557
|
+
["PIE_PROJECT", "project"],
|
|
198558
|
+
["PIE_API_KEY", "api_key"]
|
|
198559
|
+
];
|
|
198560
|
+
var formatEnvValue = (val) => {
|
|
198561
|
+
if (/[\s#'"\\]/.test(val) || val === "") {
|
|
198562
|
+
return `"${val.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
|
|
198563
|
+
}
|
|
198564
|
+
return val;
|
|
198565
|
+
};
|
|
198566
|
+
var appendPieCredentialsToEnv = (cwd, config) => {
|
|
198567
|
+
if (typeof config !== "object" || config === null) {
|
|
198568
|
+
return;
|
|
198569
|
+
}
|
|
198570
|
+
const c = config;
|
|
198571
|
+
const entries = {};
|
|
198572
|
+
for (const [envKey, jsonKey] of PIE_ENV_MAP) {
|
|
198573
|
+
const v2 = c[jsonKey];
|
|
198574
|
+
if (v2 !== undefined && v2 !== null) {
|
|
198575
|
+
entries[envKey] = String(v2);
|
|
198576
|
+
}
|
|
198577
|
+
}
|
|
198578
|
+
if (Object.keys(entries).length === 0) {
|
|
198579
|
+
return;
|
|
198580
|
+
}
|
|
198581
|
+
const envPath = import_node_path2.default.join(cwd, ".env");
|
|
198582
|
+
let content = import_node_fs.default.existsSync(envPath) ? import_node_fs.default.readFileSync(envPath, "utf8") : "";
|
|
198583
|
+
if (content.length > 0 && !content.endsWith(`
|
|
198584
|
+
`)) {
|
|
198585
|
+
content += `
|
|
198586
|
+
`;
|
|
198587
|
+
}
|
|
198588
|
+
const additions = PIE_ENV_MAP.filter(([envKey]) => (envKey in entries)).map(([envKey]) => `${envKey}=${formatEnvValue(entries[envKey])}`);
|
|
198589
|
+
content += `${additions.join(`
|
|
198590
|
+
`)}
|
|
198591
|
+
`;
|
|
198592
|
+
import_node_fs.default.writeFileSync(envPath, content, "utf8");
|
|
198593
|
+
console.log(`[pie] Appended credentials to ${envPath}`);
|
|
198594
|
+
};
|
|
198595
|
+
async function loginCommand(options = {}) {
|
|
198596
|
+
const {
|
|
198597
|
+
cwd = process.cwd(),
|
|
198598
|
+
pollIntervalMs = 3000,
|
|
198599
|
+
openBrowser = tryOpenBrowser,
|
|
198600
|
+
fetchImpl = fetch,
|
|
198601
|
+
sleepImpl = defaultSleep
|
|
198602
|
+
} = options;
|
|
198603
|
+
const code = generateCode(CODE_LENGTH);
|
|
198604
|
+
const connectUrl = `${CONNECT_BASE}?${new URLSearchParams({ code }).toString()}`;
|
|
198605
|
+
console.log(`Open link in browser:
|
|
198606
|
+
`);
|
|
198607
|
+
console.log(connectUrl);
|
|
198608
|
+
try {
|
|
198609
|
+
openBrowser(connectUrl);
|
|
198610
|
+
} catch {
|
|
198611
|
+
}
|
|
198612
|
+
const pieDir = import_node_path2.default.join(cwd, ".pie");
|
|
198613
|
+
const configPath = import_node_path2.default.join(pieDir, "config.json");
|
|
198614
|
+
const url = `${CREDENTIALS_API}?${new URLSearchParams({ code }).toString()}`;
|
|
198615
|
+
let first = true;
|
|
198616
|
+
while (true) {
|
|
198617
|
+
if (!first) {
|
|
198618
|
+
await sleepImpl(pollIntervalMs);
|
|
198619
|
+
}
|
|
198620
|
+
first = false;
|
|
198621
|
+
const ac = new AbortController;
|
|
198622
|
+
const timer = setTimeout(() => ac.abort(), 30000);
|
|
198623
|
+
let response;
|
|
198624
|
+
try {
|
|
198625
|
+
response = await fetchImpl(url, { signal: ac.signal });
|
|
198626
|
+
} finally {
|
|
198627
|
+
clearTimeout(timer);
|
|
198628
|
+
}
|
|
198629
|
+
if (!response.ok) {
|
|
198630
|
+
throw new Error(`[pieui] Login poll failed: HTTP ${response.status} ${response.statusText}`);
|
|
198631
|
+
}
|
|
198632
|
+
const data = await response.json();
|
|
198633
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
198634
|
+
continue;
|
|
198635
|
+
}
|
|
198636
|
+
const record = data;
|
|
198637
|
+
const status = record.status;
|
|
198638
|
+
if (status === "error") {
|
|
198639
|
+
const detail = typeof record.message === "string" && record.message || typeof record.error === "string" && record.error || "unknown error";
|
|
198640
|
+
throw new Error(`Login failed: ${detail}`);
|
|
198641
|
+
}
|
|
198642
|
+
if (status === "ok") {
|
|
198643
|
+
if (!("config" in record)) {
|
|
198644
|
+
throw new Error("Login succeeded but response had no 'config' field");
|
|
198645
|
+
}
|
|
198646
|
+
import_node_fs.default.mkdirSync(pieDir, { recursive: true });
|
|
198647
|
+
import_node_fs.default.writeFileSync(configPath, `${JSON.stringify(record.config, null, 2)}
|
|
198648
|
+
`, "utf8");
|
|
198649
|
+
console.log(`[pie] Saved credentials to ${configPath}`);
|
|
198650
|
+
appendPieCredentialsToEnv(cwd, record.config);
|
|
198651
|
+
return;
|
|
198652
|
+
}
|
|
198653
|
+
}
|
|
198654
|
+
}
|
|
198655
|
+
|
|
198588
198656
|
// src/cli.ts
|
|
198589
198657
|
var main = async () => {
|
|
198590
198658
|
const {
|
|
@@ -198609,14 +198677,6 @@ var main = async () => {
|
|
|
198609
198677
|
case "init":
|
|
198610
198678
|
initCommand(outDir);
|
|
198611
198679
|
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
198680
|
case "create":
|
|
198621
198681
|
if (!createAppName) {
|
|
198622
198682
|
console.error("[pieui] Error: App name is required for create command");
|
|
@@ -198722,6 +198782,9 @@ var main = async () => {
|
|
|
198722
198782
|
console.log(`[pieui] Append mode: ${append}`);
|
|
198723
198783
|
await postbuildCommand(srcDir, outDir, append);
|
|
198724
198784
|
return;
|
|
198785
|
+
case "login":
|
|
198786
|
+
await loginCommand();
|
|
198787
|
+
return;
|
|
198725
198788
|
default:
|
|
198726
198789
|
printUsage();
|
|
198727
198790
|
process.exit(1);
|
package/dist/code/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/code/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKR,UAAU,EACb,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAG,UA0I1C,CAAA;AAED,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/code/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKR,UAAU,EACb,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAG,UA0I1C,CAAA;AAED,eAAO,MAAM,UAAU,YA0JtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/code/commands/create.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const CONNECT_BASE = "https://pieui.swarm.ing/connect";
|
|
2
|
+
export declare const CREDENTIALS_API = "https://api-pieui.swarm.ing/api/external/credentials";
|
|
3
|
+
export type LoginCommandOptions = {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
pollIntervalMs?: number;
|
|
6
|
+
openBrowser?: (url: string) => void;
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
sleepImpl?: (ms: number) => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
export declare function loginCommand(options?: LoginCommandOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/code/commands/login.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,oCAAoC,CAAA;AAC7D,eAAO,MAAM,eAAe,yDAC8B,CAAA;AA2E1D,MAAM,MAAM,mBAAmB,GAAG;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C,CAAA;AAED,wBAAsB,YAAY,CAC9B,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,IAAI,CAAC,CAiFf"}
|
|
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 @@
|
|
|
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,
|
|
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"
|
|
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,
|
|
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.
|
|
3
|
+
"version": "2.0.14",
|
|
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 &&
|
|
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 &&
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"step1-local.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step1-local.test.cjs"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"step2-remote.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step2-remote.test.cjs"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"step3-contract.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step3-contract.test.cjs"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"step4-ci.test.d.cts","sourceRoot":"","sources":["../../src/__tests__/step4-ci.test.cjs"],"names":[],"mappings":""}
|
|
@@ -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
package/dist/create.d.ts.map
DELETED
|
@@ -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();
|