@donotdev/cli 0.0.18 → 0.0.20
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/dependencies-matrix.json +42 -55
- package/dist/bin/commands/bump.js +5 -2
- package/dist/bin/commands/coach.js +8177 -0
- package/dist/bin/commands/create-app.js +6 -6
- package/dist/bin/commands/create-project.js +23 -9
- package/dist/bin/commands/deploy.js +99 -59
- package/dist/bin/commands/doctor.js +243 -698
- package/dist/bin/commands/emu.js +2 -2
- package/dist/bin/commands/format.js +4 -1
- package/dist/bin/commands/get-demo.js +8351 -0
- package/dist/bin/commands/make-admin.js +773 -152
- package/dist/bin/commands/setup.js +524 -1713
- package/dist/bin/commands/staging.js +17870 -0
- package/dist/bin/commands/sync-secrets.js +2 -11
- package/dist/bin/commands/type-check.js +7738 -1712
- package/dist/bin/dndev.js +868 -199
- package/dist/bin/donotdev.js +868 -199
- package/dist/index.js +127 -67
- package/package.json +1 -1
- package/templates/app-demo/index.html.example +147 -10
- package/templates/app-demo/public/apple-touch-icon.png.example +0 -0
- package/templates/app-demo/public/favicon.svg.example +1 -0
- package/templates/app-demo/public/icon-192x192.png.example +0 -0
- package/templates/app-demo/public/icon-512x512.png.example +0 -0
- package/templates/app-demo/src/App.tsx.example +7 -11
- package/templates/app-demo/src/config/app.ts.example +13 -48
- package/templates/app-demo/src/entities/booking.ts.example +75 -0
- package/templates/app-demo/src/entities/onboarding.ts.example +160 -0
- package/templates/app-demo/src/entities/product.ts.example +50 -0
- package/templates/app-demo/src/entities/quote.ts.example +70 -0
- package/templates/app-demo/src/globals.css.example +5 -1
- package/templates/app-demo/src/main.tsx.example +13 -7
- package/templates/app-demo/src/pages/ChangelogPage.tsx.example +41 -0
- package/templates/app-demo/src/pages/ConditionalFormPage.tsx.example +88 -0
- package/templates/app-demo/src/pages/DashboardPage.tsx.example +17 -0
- package/templates/app-demo/src/pages/HomePage.tsx.example +339 -60
- package/templates/app-demo/src/pages/OnboardingPage.tsx.example +47 -0
- package/templates/app-demo/src/pages/PricingPage.tsx.example +41 -0
- package/templates/app-demo/src/pages/ProductsPage.tsx.example +19 -0
- package/templates/app-demo/src/pages/ProfilePage.tsx.example +18 -0
- package/templates/app-demo/src/pages/SettingsPage.tsx.example +17 -0
- package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +118 -0
- package/templates/app-demo/src/pages/ShowcasePage.tsx.example +93 -0
- package/templates/app-demo/src/pages/components/ComponentRenderer.tsx.example +147 -51
- package/templates/app-demo/src/pages/components/ComponentsData.tsx.example +103 -21
- package/templates/app-demo/src/pages/components/componentConfig.ts.example +139 -59
- package/templates/app-demo/src/pages/legal/LegalPage.tsx.example +25 -0
- package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +23 -0
- package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +23 -0
- package/templates/app-demo/src/themes.css.example +289 -77
- package/templates/app-demo/stats.html.example +4949 -0
- package/templates/app-demo/tsconfig.json.example +1 -1
- package/templates/app-demo/vite.config.ts.example +23 -48
- package/templates/app-expo/README.md.example +1 -1
- package/templates/app-expo/app/index.tsx.example +1 -1
- package/templates/app-next/src/locales/home_en.json.example +6 -6
- package/templates/app-vite/src/locales/home_en.json.example +6 -6
- package/templates/app-vite/src/pages/HomePage.tsx.example +8 -10
- package/templates/overlay-firebase/env.fragment.example +1 -1
- package/templates/overlay-firebase/env.fragment.expo.example +1 -1
- package/templates/overlay-firebase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-supabase/env.fragment.example +1 -1
- package/templates/overlay-supabase/env.fragment.expo.example +1 -1
- package/templates/overlay-supabase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-vercel/env.fragment.example +1 -1
- package/templates/overlay-vercel/env.fragment.nextjs.example +1 -1
- package/templates/root-consumer/AI.md.example +4 -3
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +21 -6
- package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +16 -179
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +19 -21
- package/templates/root-consumer/guides/dndev/GOTCHAS.md.example +14 -3
- package/templates/root-consumer/guides/dndev/INDEX.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_APP_CONFIG.md.example +3 -3
- package/templates/root-consumer/guides/dndev/SETUP_BLOG.md.example +19 -2
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +35 -1
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_LAYOUTS.md.example +32 -0
- package/templates/root-consumer/guides/dndev/SETUP_OAUTH_PROVIDERS.md.example +1 -1
- package/templates/root-consumer/guides/dndev/SETUP_PAGES.md.example +19 -15
- package/templates/root-consumer/guides/dndev/SETUP_STRIPE.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +37 -16
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +18 -18
- package/templates/root-consumer/guides/dndev/advanced/COOKIE_REFERENCE.md.example +252 -252
- package/templates/root-consumer/guides/dndev/advanced/VERSION_CONTROL.md.example +174 -174
- package/templates/root-consumer/guides/dndev/essences_reference.css.example +119 -2
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +6 -0
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +4 -5
- package/templates/root-consumer/guides/wai-way/page_patterns.md.example +2 -2
- package/dist/bin/commands/agent-setup.d.ts +0 -6
- package/dist/bin/commands/agent-setup.d.ts.map +0 -1
- package/dist/bin/commands/agent-setup.js.map +0 -1
- package/dist/bin/commands/build.d.ts +0 -11
- package/dist/bin/commands/build.d.ts.map +0 -1
- package/dist/bin/commands/build.js.map +0 -1
- package/dist/bin/commands/bump.d.ts +0 -11
- package/dist/bin/commands/bump.d.ts.map +0 -1
- package/dist/bin/commands/bump.js.map +0 -1
- package/dist/bin/commands/cacheout.d.ts +0 -11
- package/dist/bin/commands/cacheout.d.ts.map +0 -1
- package/dist/bin/commands/cacheout.js.map +0 -1
- package/dist/bin/commands/create-app.d.ts +0 -11
- package/dist/bin/commands/create-app.d.ts.map +0 -1
- package/dist/bin/commands/create-app.js.map +0 -1
- package/dist/bin/commands/create-project.d.ts +0 -11
- package/dist/bin/commands/create-project.d.ts.map +0 -1
- package/dist/bin/commands/create-project.js.map +0 -1
- package/dist/bin/commands/deploy.d.ts +0 -11
- package/dist/bin/commands/deploy.d.ts.map +0 -1
- package/dist/bin/commands/deploy.js.map +0 -1
- package/dist/bin/commands/dev.d.ts +0 -11
- package/dist/bin/commands/dev.d.ts.map +0 -1
- package/dist/bin/commands/dev.js.map +0 -1
- package/dist/bin/commands/doctor.d.ts +0 -6
- package/dist/bin/commands/doctor.d.ts.map +0 -1
- package/dist/bin/commands/doctor.js.map +0 -1
- package/dist/bin/commands/emu.d.ts +0 -11
- package/dist/bin/commands/emu.d.ts.map +0 -1
- package/dist/bin/commands/emu.js.map +0 -1
- package/dist/bin/commands/format.d.ts +0 -11
- package/dist/bin/commands/format.d.ts.map +0 -1
- package/dist/bin/commands/format.js.map +0 -1
- package/dist/bin/commands/make-admin.d.ts +0 -11
- package/dist/bin/commands/make-admin.d.ts.map +0 -1
- package/dist/bin/commands/make-admin.js.map +0 -1
- package/dist/bin/commands/preview.d.ts +0 -11
- package/dist/bin/commands/preview.d.ts.map +0 -1
- package/dist/bin/commands/preview.js.map +0 -1
- package/dist/bin/commands/setup.d.ts +0 -6
- package/dist/bin/commands/setup.d.ts.map +0 -1
- package/dist/bin/commands/setup.js.map +0 -1
- package/dist/bin/commands/sync-secrets.d.ts +0 -11
- package/dist/bin/commands/sync-secrets.d.ts.map +0 -1
- package/dist/bin/commands/sync-secrets.js.map +0 -1
- package/dist/bin/commands/type-check.d.ts +0 -14
- package/dist/bin/commands/type-check.d.ts.map +0 -1
- package/dist/bin/commands/type-check.js.map +0 -1
- package/dist/bin/commands/wai.d.ts +0 -11
- package/dist/bin/commands/wai.d.ts.map +0 -1
- package/dist/bin/commands/wai.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/templates/app-demo/src/components/ThemeToggle.tsx.example +0 -48
- package/templates/app-demo/src/pages/DetailPage.tsx.example +0 -103
- package/templates/app-demo/src/pages/FullPage.tsx.example +0 -142
- package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +0 -266
- package/templates/app-demo/src/pages/components/LayoutRoute.tsx.example +0 -20
|
@@ -8649,10 +8649,10 @@ function generateScripts(templateName, options) {
|
|
|
8649
8649
|
scripts.lint = "eslint .";
|
|
8650
8650
|
scripts["type-check"] = "tsc --noEmit";
|
|
8651
8651
|
} else if (templateName === "consumer-root") {
|
|
8652
|
-
scripts.dev = "
|
|
8652
|
+
scripts.dev = "dndev dev";
|
|
8653
8653
|
scripts.build = "turbo run build";
|
|
8654
8654
|
scripts.lint = "turbo run lint";
|
|
8655
|
-
scripts["type-check"] = "
|
|
8655
|
+
scripts["type-check"] = "dndev tc";
|
|
8656
8656
|
} else if (templateName.includes("functions")) {
|
|
8657
8657
|
scripts.build = "node build.mjs";
|
|
8658
8658
|
scripts["build:tsc"] = "tsc";
|
|
@@ -8663,9 +8663,9 @@ function generateScripts(templateName, options) {
|
|
|
8663
8663
|
scripts.dev = "vercel dev";
|
|
8664
8664
|
}
|
|
8665
8665
|
} else if (templateName === "demo") {
|
|
8666
|
-
scripts.dev = "
|
|
8667
|
-
scripts.build = "tsc --noEmit &&
|
|
8668
|
-
scripts.preview = "
|
|
8666
|
+
scripts.dev = "vite";
|
|
8667
|
+
scripts.build = "tsc --noEmit && vite build --mode production";
|
|
8668
|
+
scripts.preview = "vite preview";
|
|
8669
8669
|
scripts["type-check"] = "tsc --noEmit";
|
|
8670
8670
|
} else if (templateName === "entities") {
|
|
8671
8671
|
}
|
|
@@ -9103,7 +9103,7 @@ async function createApp(appName, appConfig, workspaceRoot, templatesRoot) {
|
|
|
9103
9103
|
const firebaseJson = readSync(firebaseJsonDest, {
|
|
9104
9104
|
format: "json"
|
|
9105
9105
|
});
|
|
9106
|
-
if (firebaseJson.hosting?.rewrites) {
|
|
9106
|
+
if (firebaseJson.hosting?.rewrites && Array.isArray(firebaseJson.hosting.rewrites)) {
|
|
9107
9107
|
firebaseJson.hosting.rewrites = firebaseJson.hosting.rewrites.filter(
|
|
9108
9108
|
(r2) => r2.destination !== "/index.html"
|
|
9109
9109
|
);
|
|
@@ -8969,10 +8969,10 @@ function generateScripts(templateName, options) {
|
|
|
8969
8969
|
scripts.lint = "eslint .";
|
|
8970
8970
|
scripts["type-check"] = "tsc --noEmit";
|
|
8971
8971
|
} else if (templateName === "consumer-root") {
|
|
8972
|
-
scripts.dev = "
|
|
8972
|
+
scripts.dev = "dndev dev";
|
|
8973
8973
|
scripts.build = "turbo run build";
|
|
8974
8974
|
scripts.lint = "turbo run lint";
|
|
8975
|
-
scripts["type-check"] = "
|
|
8975
|
+
scripts["type-check"] = "dndev tc";
|
|
8976
8976
|
} else if (templateName.includes("functions")) {
|
|
8977
8977
|
scripts.build = "node build.mjs";
|
|
8978
8978
|
scripts["build:tsc"] = "tsc";
|
|
@@ -8983,9 +8983,9 @@ function generateScripts(templateName, options) {
|
|
|
8983
8983
|
scripts.dev = "vercel dev";
|
|
8984
8984
|
}
|
|
8985
8985
|
} else if (templateName === "demo") {
|
|
8986
|
-
scripts.dev = "
|
|
8987
|
-
scripts.build = "tsc --noEmit &&
|
|
8988
|
-
scripts.preview = "
|
|
8986
|
+
scripts.dev = "vite";
|
|
8987
|
+
scripts.build = "tsc --noEmit && vite build --mode production";
|
|
8988
|
+
scripts.preview = "vite preview";
|
|
8989
8989
|
scripts["type-check"] = "tsc --noEmit";
|
|
8990
8990
|
} else if (templateName === "entities") {
|
|
8991
8991
|
}
|
|
@@ -9423,7 +9423,7 @@ async function createApp(appName, appConfig, workspaceRoot, templatesRoot) {
|
|
|
9423
9423
|
const firebaseJson = readSync(firebaseJsonDest, {
|
|
9424
9424
|
format: "json"
|
|
9425
9425
|
});
|
|
9426
|
-
if (firebaseJson.hosting?.rewrites) {
|
|
9426
|
+
if (firebaseJson.hosting?.rewrites && Array.isArray(firebaseJson.hosting.rewrites)) {
|
|
9427
9427
|
firebaseJson.hosting.rewrites = firebaseJson.hosting.rewrites.filter(
|
|
9428
9428
|
(r2) => r2.destination !== "/index.html"
|
|
9429
9429
|
);
|
|
@@ -9670,6 +9670,14 @@ async function main(options) {
|
|
|
9670
9670
|
process.exit(0);
|
|
9671
9671
|
}
|
|
9672
9672
|
if (action === "replace") {
|
|
9673
|
+
const confirmDelete = await askForConfirmation(
|
|
9674
|
+
`This will permanently delete "${projectDirNormalized}". Are you sure?`,
|
|
9675
|
+
false
|
|
9676
|
+
);
|
|
9677
|
+
if (!confirmDelete) {
|
|
9678
|
+
Se("Project creation cancelled.");
|
|
9679
|
+
process.exit(0);
|
|
9680
|
+
}
|
|
9673
9681
|
const s2 = Y2();
|
|
9674
9682
|
s2.start("Removing existing project...");
|
|
9675
9683
|
await remove(projectDirNormalized);
|
|
@@ -9724,7 +9732,8 @@ async function main(options) {
|
|
|
9724
9732
|
Me(`Configuring "${trimmedName}"...`, "\u2699\uFE0F");
|
|
9725
9733
|
const config = await collectAppConfig(trimmedName);
|
|
9726
9734
|
appConfigs[trimmedName] = config;
|
|
9727
|
-
if (config.backend !== "none" || config.functions !== "none")
|
|
9735
|
+
if (config.backend !== "none" || config.functions !== "none")
|
|
9736
|
+
anyAppNeedsBackend = true;
|
|
9728
9737
|
}
|
|
9729
9738
|
let installDemoApp = await askForConfirmation(
|
|
9730
9739
|
"Would you like to install the demo app? (component showcase)",
|
|
@@ -9850,7 +9859,9 @@ async function main(options) {
|
|
|
9850
9859
|
overwrite: true
|
|
9851
9860
|
});
|
|
9852
9861
|
const relativeMonorepoPath = executionMode === "development" ? calculateRelativePath(projectDirNormalized, monorepoRoot) : "";
|
|
9853
|
-
const primaryPlatform = Object.values(appConfigs).find(
|
|
9862
|
+
const primaryPlatform = Object.values(appConfigs).find(
|
|
9863
|
+
(c) => c.backend !== "none"
|
|
9864
|
+
)?.backend ?? "firebase";
|
|
9854
9865
|
const rootPackageJson = generatePackageJson(
|
|
9855
9866
|
"consumer-root",
|
|
9856
9867
|
executionMode,
|
|
@@ -10025,7 +10036,10 @@ async function main(options) {
|
|
|
10025
10036
|
await createApp(appName, appConfig, projectDirNormalized, templatesRoot);
|
|
10026
10037
|
}
|
|
10027
10038
|
s.start("Updating root package.json with scripts...");
|
|
10028
|
-
await updateRootPackageJson(
|
|
10039
|
+
await updateRootPackageJson(
|
|
10040
|
+
projectDirNormalized,
|
|
10041
|
+
isMergeMode ? allAppNames : appNames
|
|
10042
|
+
);
|
|
10029
10043
|
s.stop("Root package.json updated");
|
|
10030
10044
|
Se("\u{1F389} Project created successfully!");
|
|
10031
10045
|
const cdCommand = executionMode === "development" ? `cd ../${projectName}` : `cd ${projectName}`;
|
|
@@ -7847,7 +7847,7 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
|
7847
7847
|
function readdirSync2(dirPath, options) {
|
|
7848
7848
|
return pathResolverInstance.readdirSync(dirPath, options);
|
|
7849
7849
|
}
|
|
7850
|
-
var pathResolverInstance, resolvePackage, normalizePath, pathExists, readSync,
|
|
7850
|
+
var pathResolverInstance, resolvePackage, normalizePath, pathExists, readSync, writeSync, removeSync, statSync2, ensureDirSync, getRelativePathBetween, getDirname, joinPath;
|
|
7851
7851
|
var init_pathResolver = __esm({
|
|
7852
7852
|
"packages/tooling/src/utils/pathResolver.ts"() {
|
|
7853
7853
|
"use strict";
|
|
@@ -7860,12 +7860,9 @@ var init_pathResolver = __esm({
|
|
|
7860
7860
|
};
|
|
7861
7861
|
pathExists = (filePath, silent = false) => pathResolverInstance.pathExists(filePath, silent);
|
|
7862
7862
|
readSync = (filePath, options) => pathResolverInstance.readSync(filePath, options);
|
|
7863
|
-
write = async (filePath, content, options) => pathResolverInstance.write(filePath, content, options);
|
|
7864
7863
|
writeSync = (filePath, content, options) => pathResolverInstance.writeSync(filePath, content, options);
|
|
7865
|
-
remove = async (path) => pathResolverInstance.remove(path);
|
|
7866
7864
|
removeSync = (path) => pathResolverInstance.removeSync(path);
|
|
7867
7865
|
statSync2 = (filePath) => pathResolverInstance.statSync(filePath);
|
|
7868
|
-
ensureDir = async (dirPath) => pathResolverInstance.ensureDir(dirPath);
|
|
7869
7866
|
ensureDirSync = (dirPath) => pathResolverInstance.ensureDirSync(dirPath);
|
|
7870
7867
|
getRelativePathBetween = (from, to) => {
|
|
7871
7868
|
return normalizePath(relative2(from, to));
|
|
@@ -8181,21 +8178,21 @@ function getCLIInstallInstructions(tool) {
|
|
|
8181
8178
|
]
|
|
8182
8179
|
},
|
|
8183
8180
|
[CLI_TOOLS.YARN]: {
|
|
8184
|
-
win32: ["
|
|
8185
|
-
darwin: ["
|
|
8186
|
-
linux: ["
|
|
8181
|
+
win32: ["bun install -g yarn", "Or: choco install yarn"],
|
|
8182
|
+
darwin: ["bun install -g yarn", "Or: brew install yarn"],
|
|
8183
|
+
linux: ["bun install -g yarn", "Or check your package manager"]
|
|
8187
8184
|
},
|
|
8188
8185
|
[CLI_TOOLS.FIREBASE]: {
|
|
8189
8186
|
win32: [
|
|
8190
|
-
"
|
|
8187
|
+
"bun install -g firebase-tools",
|
|
8191
8188
|
"Or download standalone binary: https://firebase.google.com/docs/cli#windows-standalone-binary"
|
|
8192
8189
|
],
|
|
8193
8190
|
darwin: [
|
|
8194
|
-
"
|
|
8191
|
+
"bun install -g firebase-tools",
|
|
8195
8192
|
"Or: brew install firebase-cli"
|
|
8196
8193
|
],
|
|
8197
8194
|
linux: [
|
|
8198
|
-
"
|
|
8195
|
+
"bun install -g firebase-tools",
|
|
8199
8196
|
"Or check your package manager (dnf, apt, pacman, etc.)"
|
|
8200
8197
|
]
|
|
8201
8198
|
},
|
|
@@ -8212,25 +8209,25 @@ function getCLIInstallInstructions(tool) {
|
|
|
8212
8209
|
]
|
|
8213
8210
|
},
|
|
8214
8211
|
[CLI_TOOLS.VERCEL]: {
|
|
8215
|
-
win32: ["
|
|
8212
|
+
win32: ["bun install -g vercel", "Or: bunx vercel (no install)"],
|
|
8216
8213
|
darwin: [
|
|
8217
|
-
"
|
|
8214
|
+
"bun install -g vercel",
|
|
8218
8215
|
"Or: brew install vercel",
|
|
8219
|
-
"Or:
|
|
8216
|
+
"Or: bunx vercel"
|
|
8220
8217
|
],
|
|
8221
|
-
linux: ["
|
|
8218
|
+
linux: ["bun install -g vercel", "Or: bunx vercel"]
|
|
8222
8219
|
},
|
|
8223
8220
|
[CLI_TOOLS.SENTRY_CLI]: {
|
|
8224
8221
|
win32: [
|
|
8225
|
-
"
|
|
8222
|
+
"bun install -g @sentry/cli",
|
|
8226
8223
|
"Or download from: https://github.com/getsentry/sentry-cli/releases"
|
|
8227
8224
|
],
|
|
8228
8225
|
darwin: [
|
|
8229
|
-
"
|
|
8226
|
+
"bun install -g @sentry/cli",
|
|
8230
8227
|
"Or: brew install getsentry/tools/sentry-cli"
|
|
8231
8228
|
],
|
|
8232
8229
|
linux: [
|
|
8233
|
-
"
|
|
8230
|
+
"bun install -g @sentry/cli",
|
|
8234
8231
|
"Or: curl -sL https://sentry.io/get-cli/ | bash"
|
|
8235
8232
|
]
|
|
8236
8233
|
},
|
|
@@ -8259,9 +8256,9 @@ function getCLIInstallInstructions(tool) {
|
|
|
8259
8256
|
]
|
|
8260
8257
|
},
|
|
8261
8258
|
[CLI_TOOLS.TSX]: {
|
|
8262
|
-
win32: ["
|
|
8263
|
-
darwin: ["
|
|
8264
|
-
linux: ["
|
|
8259
|
+
win32: ["bun install -g tsx"],
|
|
8260
|
+
darwin: ["bun install -g tsx"],
|
|
8261
|
+
linux: ["bun install -g tsx"]
|
|
8265
8262
|
}
|
|
8266
8263
|
};
|
|
8267
8264
|
const platformInstructions = instructions[tool]?.[platform] || instructions[tool]?.linux || [];
|
|
@@ -8356,14 +8353,27 @@ function readEnvVar(filePath, varName) {
|
|
|
8356
8353
|
}
|
|
8357
8354
|
return null;
|
|
8358
8355
|
}
|
|
8359
|
-
function
|
|
8360
|
-
if (process.env
|
|
8361
|
-
const
|
|
8362
|
-
if (fromEnv) return fromEnv;
|
|
8363
|
-
const fromLocal = readEnvVar(joinPath(appDir, ".env.local"), "VERCEL_TOKEN");
|
|
8356
|
+
function resolveVercelVar(appDir, varName) {
|
|
8357
|
+
if (process.env[varName]) return process.env[varName];
|
|
8358
|
+
const fromLocal = readEnvVar(joinPath(appDir, ".env.local"), varName);
|
|
8364
8359
|
if (fromLocal) return fromLocal;
|
|
8360
|
+
const fromEnv = readEnvVar(joinPath(appDir, ".env"), varName);
|
|
8361
|
+
if (fromEnv) return fromEnv;
|
|
8365
8362
|
return null;
|
|
8366
8363
|
}
|
|
8364
|
+
function resolveVercelCredentials(appDir) {
|
|
8365
|
+
const token = resolveVercelVar(appDir, "VERCEL_TOKEN");
|
|
8366
|
+
const orgId = resolveVercelVar(appDir, "VERCEL_ORG_ID");
|
|
8367
|
+
const projectId = resolveVercelVar(appDir, "VERCEL_PROJECT_ID");
|
|
8368
|
+
const missing = [];
|
|
8369
|
+
if (!token) missing.push("VERCEL_TOKEN");
|
|
8370
|
+
if (!orgId) missing.push("VERCEL_ORG_ID");
|
|
8371
|
+
if (!projectId) missing.push("VERCEL_PROJECT_ID");
|
|
8372
|
+
if (missing.length > 0) return { missing };
|
|
8373
|
+
return {
|
|
8374
|
+
credentials: { token, orgId, projectId }
|
|
8375
|
+
};
|
|
8376
|
+
}
|
|
8367
8377
|
var init_vercel_token = __esm({
|
|
8368
8378
|
"packages/tooling/src/cli/setup/vercel-token.ts"() {
|
|
8369
8379
|
"use strict";
|
|
@@ -15943,10 +15953,7 @@ async function setFirebaseSecret(key, value, projectId, dryRun = false, cwd) {
|
|
|
15943
15953
|
}
|
|
15944
15954
|
try {
|
|
15945
15955
|
log.info(`Setting Firebase secret: ${key} (project: ${finalProjectId})`);
|
|
15946
|
-
const
|
|
15947
|
-
await ensureDir(tempDir);
|
|
15948
|
-
const tempFile = joinPath(tempDir, `secret-${key}-${Date.now()}.txt`);
|
|
15949
|
-
await write(tempFile, value);
|
|
15956
|
+
const tempFile = "";
|
|
15950
15957
|
try {
|
|
15951
15958
|
const args = ["functions:secrets:set", key, "--project", finalProjectId];
|
|
15952
15959
|
const firebaseCmd = process.platform === "win32" ? "firebase.cmd" : "firebase";
|
|
@@ -16021,9 +16028,6 @@ ${errorOutput}`
|
|
|
16021
16028
|
}
|
|
16022
16029
|
log.success(`Firebase secret ${key} set successfully`);
|
|
16023
16030
|
} finally {
|
|
16024
|
-
if (pathExists(tempFile)) {
|
|
16025
|
-
await remove(tempFile);
|
|
16026
|
-
}
|
|
16027
16031
|
}
|
|
16028
16032
|
} catch (err) {
|
|
16029
16033
|
log.error(`Failed to set Firebase secret ${key}:`, err);
|
|
@@ -16601,33 +16605,39 @@ init_cli_output();
|
|
|
16601
16605
|
init_vercel_token();
|
|
16602
16606
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
16603
16607
|
async function deployVercelFrontend(appDir, _config) {
|
|
16604
|
-
const
|
|
16605
|
-
|
|
16606
|
-
|
|
16607
|
-
|
|
16608
|
-
|
|
16609
|
-
|
|
16610
|
-
const args = ["vercel", "--prod", "--yes"];
|
|
16611
|
-
if (token) {
|
|
16612
|
-
args.push("--token", token);
|
|
16608
|
+
const result = resolveVercelCredentials(appDir);
|
|
16609
|
+
if (result.missing) {
|
|
16610
|
+
throw new Error(
|
|
16611
|
+
`Missing Vercel credentials in .env.local: ${result.missing.join(", ")}
|
|
16612
|
+
Add them to apps/<app>/.env.local \u2014 see guides/dndev/SETUP_VERCEL.md`
|
|
16613
|
+
);
|
|
16613
16614
|
}
|
|
16614
|
-
|
|
16615
|
-
|
|
16615
|
+
const { token, orgId, projectId } = result.credentials;
|
|
16616
|
+
log.debug("Using Vercel credentials from .env (token-based auth)");
|
|
16617
|
+
log.info("Deploying to Vercel...");
|
|
16618
|
+
const deployResult = spawnSync3(
|
|
16619
|
+
"bunx",
|
|
16620
|
+
["vercel", "deploy", "--prod", "--yes", "--token", token],
|
|
16621
|
+
{
|
|
16616
16622
|
cwd: appDir,
|
|
16617
|
-
|
|
16618
|
-
|
|
16619
|
-
|
|
16620
|
-
|
|
16621
|
-
|
|
16622
|
-
|
|
16623
|
-
|
|
16624
|
-
|
|
16625
|
-
);
|
|
16623
|
+
// stdout piped to capture deployment URL, stderr inherits for progress
|
|
16624
|
+
stdio: ["inherit", "pipe", "inherit"],
|
|
16625
|
+
encoding: "utf-8",
|
|
16626
|
+
env: {
|
|
16627
|
+
...process.env,
|
|
16628
|
+
VERCEL_ORG_ID: orgId,
|
|
16629
|
+
VERCEL_PROJECT_ID: projectId
|
|
16630
|
+
}
|
|
16626
16631
|
}
|
|
16627
|
-
|
|
16628
|
-
|
|
16629
|
-
|
|
16630
|
-
|
|
16632
|
+
);
|
|
16633
|
+
if (deployResult.status !== 0) {
|
|
16634
|
+
throw new Error(`vercel deploy exited with code ${deployResult.status}`);
|
|
16635
|
+
}
|
|
16636
|
+
const deployUrl = deployResult.stdout?.trim();
|
|
16637
|
+
if (deployUrl) {
|
|
16638
|
+
log.success(`Production: ${deployUrl}`);
|
|
16639
|
+
} else {
|
|
16640
|
+
log.success("Frontend deployed to Vercel");
|
|
16631
16641
|
}
|
|
16632
16642
|
}
|
|
16633
16643
|
|
|
@@ -16691,6 +16701,14 @@ function generateCleanPackageJson(functionsDir) {
|
|
|
16691
16701
|
}
|
|
16692
16702
|
const cleanPackageJson = { ...packageJson };
|
|
16693
16703
|
if (cleanPackageJson.dependencies) {
|
|
16704
|
+
const removedDeps = Object.entries(cleanPackageJson.dependencies).filter(
|
|
16705
|
+
([, version]) => String(version).startsWith("file:") || String(version).startsWith("workspace:")
|
|
16706
|
+
);
|
|
16707
|
+
if (removedDeps.length > 0) {
|
|
16708
|
+
log.warn(
|
|
16709
|
+
`Filtering out ${removedDeps.length} workspace/file dep(s) from dependencies: ${removedDeps.map(([name]) => name).join(", ")}`
|
|
16710
|
+
);
|
|
16711
|
+
}
|
|
16694
16712
|
cleanPackageJson.dependencies = Object.fromEntries(
|
|
16695
16713
|
Object.entries(cleanPackageJson.dependencies).filter(
|
|
16696
16714
|
([, version]) => !String(version).startsWith("file:") && !String(version).startsWith("workspace:")
|
|
@@ -16698,6 +16716,16 @@ function generateCleanPackageJson(functionsDir) {
|
|
|
16698
16716
|
);
|
|
16699
16717
|
}
|
|
16700
16718
|
if (cleanPackageJson.devDependencies) {
|
|
16719
|
+
const removedDevDeps = Object.entries(
|
|
16720
|
+
cleanPackageJson.devDependencies
|
|
16721
|
+
).filter(
|
|
16722
|
+
([, version]) => String(version).startsWith("file:") || String(version).startsWith("workspace:")
|
|
16723
|
+
);
|
|
16724
|
+
if (removedDevDeps.length > 0) {
|
|
16725
|
+
log.warn(
|
|
16726
|
+
`Filtering out ${removedDevDeps.length} workspace/file dep(s) from devDependencies: ${removedDevDeps.map(([name]) => name).join(", ")}`
|
|
16727
|
+
);
|
|
16728
|
+
}
|
|
16701
16729
|
cleanPackageJson.devDependencies = Object.fromEntries(
|
|
16702
16730
|
Object.entries(cleanPackageJson.devDependencies).filter(
|
|
16703
16731
|
([, version]) => !String(version).startsWith("file:") && !String(version).startsWith("workspace:")
|
|
@@ -16989,7 +17017,7 @@ async function deployFunctions(appDir, serviceAccountPath, projectId, config) {
|
|
|
16989
17017
|
|
|
16990
17018
|
To fix this, run:
|
|
16991
17019
|
cd ${functionsDir}
|
|
16992
|
-
|
|
17020
|
+
bun install --production`,
|
|
16993
17021
|
"file-not-found",
|
|
16994
17022
|
{ context: { missingPackages, functionsDir } }
|
|
16995
17023
|
);
|
|
@@ -17354,7 +17382,19 @@ function detectProvider(appDir) {
|
|
|
17354
17382
|
const supabaseFunctionsDir = joinPath(supabaseDir, "functions");
|
|
17355
17383
|
const supabaseMigrationsDir = joinPath(supabaseDir, "migrations");
|
|
17356
17384
|
const hasFirebase = pathExists(firebaseJsonPath);
|
|
17357
|
-
|
|
17385
|
+
let hasSupabase = pathExists(supabaseDir) || pathExists(supabaseConfigPath);
|
|
17386
|
+
if (!hasSupabase) {
|
|
17387
|
+
try {
|
|
17388
|
+
const envPath = joinPath(appDir, ".env");
|
|
17389
|
+
if (pathExists(envPath)) {
|
|
17390
|
+
const envContent = readSync(envPath);
|
|
17391
|
+
if (envContent.match(/VITE_SUPABASE_URL=.+/)) {
|
|
17392
|
+
hasSupabase = true;
|
|
17393
|
+
}
|
|
17394
|
+
}
|
|
17395
|
+
} catch {
|
|
17396
|
+
}
|
|
17397
|
+
}
|
|
17358
17398
|
let provider = "unknown";
|
|
17359
17399
|
if (hasFirebase && hasSupabase) {
|
|
17360
17400
|
provider = "both";
|
|
@@ -17718,7 +17758,7 @@ async function main2(options = {}) {
|
|
|
17718
17758
|
if (shouldDeployVercelFrontend) {
|
|
17719
17759
|
requireCLI(
|
|
17720
17760
|
CLI_TOOLS.VERCEL,
|
|
17721
|
-
"Vercel CLI is required to deploy the frontend.\nInstall:
|
|
17761
|
+
"Vercel CLI is required to deploy the frontend.\nInstall: bun install -g vercel"
|
|
17722
17762
|
);
|
|
17723
17763
|
}
|
|
17724
17764
|
if (shouldDeployFirebaseFrontend && serviceAccountPath && config.project) {
|