@donotdev/cli 0.0.14 → 0.0.15
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 +356 -88
- package/dist/bin/commands/agent-setup.js +7 -1
- package/dist/bin/commands/build.js +118 -38
- package/dist/bin/commands/bump.js +74 -28
- package/dist/bin/commands/cacheout.js +37 -9
- package/dist/bin/commands/create-app.js +222 -115
- package/dist/bin/commands/create-project.js +455 -140
- package/dist/bin/commands/deploy.js +1736 -697
- package/dist/bin/commands/dev.js +138 -23
- package/dist/bin/commands/emu.js +215 -58
- package/dist/bin/commands/format.js +37 -9
- package/dist/bin/commands/lint.js +37 -9
- package/dist/bin/commands/preview.js +142 -23
- package/dist/bin/commands/supabase-setup.d.ts +6 -0
- package/dist/bin/commands/supabase-setup.d.ts.map +1 -0
- package/dist/bin/commands/supabase-setup.js +7 -0
- package/dist/bin/commands/supabase-setup.js.map +1 -0
- package/dist/bin/commands/sync-secrets.js +211 -34
- package/dist/bin/commands/type-check.d.ts +14 -0
- package/dist/bin/commands/type-check.d.ts.map +1 -0
- package/dist/bin/commands/type-check.js +314 -0
- package/dist/bin/commands/type-check.js.map +1 -0
- package/dist/bin/commands/wai.js +3 -1
- package/dist/bin/dndev.js +27 -2
- package/dist/bin/donotdev.js +27 -2
- package/dist/index.js +3960 -3015
- package/package.json +2 -2
- package/templates/app-demo/src/App.tsx.example +1 -0
- package/templates/app-demo/src/pages/FullPage.tsx.example +2 -2
- package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +2 -2
- package/templates/app-demo/src/themes.css.example +5 -12
- package/templates/app-expo/.env.example +64 -0
- package/templates/app-expo/.expo/README.md.example +5 -0
- package/templates/app-expo/.gitignore.example +36 -0
- package/templates/app-expo/README.md.example +58 -0
- package/templates/app-expo/app/.gitkeep +2 -0
- package/templates/app-expo/app/_layout.tsx.example +41 -0
- package/templates/app-expo/app/form.tsx.example +52 -0
- package/templates/app-expo/app/index.tsx.example +89 -0
- package/templates/app-expo/app/list.tsx.example +32 -0
- package/templates/app-expo/app/profile.tsx.example +76 -0
- package/templates/app-expo/app/signin.tsx.example +53 -0
- package/templates/app-expo/app.json.example +39 -0
- package/templates/app-expo/babel.config.js.example +10 -0
- package/templates/app-expo/eas.json.example +20 -0
- package/templates/app-expo/expo-env.d.ts.example +4 -0
- package/templates/app-expo/metro.config.js.example +20 -0
- package/templates/app-expo/service-account-key.json.example +12 -0
- package/templates/app-expo/tsconfig.json.example +19 -0
- package/templates/app-next/.env.example +4 -33
- package/templates/app-next/src/app/ClientLayout.tsx.example +2 -0
- package/templates/app-next/src/app/layout.tsx.example +7 -6
- package/templates/app-next/src/globals.css.example +2 -11
- package/templates/app-next/src/pages/HomePage.tsx.example +1 -1
- package/templates/app-next/src/themes.css.example +10 -13
- package/templates/app-vite/.env.example +3 -32
- package/templates/app-vite/index.html.example +2 -24
- package/templates/app-vite/src/App.tsx.example +2 -0
- package/templates/app-vite/src/globals.css.example +2 -12
- package/templates/app-vite/src/pages/FormPageExample.tsx.example +1 -2
- package/templates/app-vite/src/pages/HomePage.tsx.example +1 -1
- package/templates/app-vite/src/themes.css.example +109 -79
- package/templates/app-vite/vercel.json.example +11 -0
- package/templates/functions-firebase/build.mjs.example +2 -72
- package/templates/functions-firebase/functions-firebase/.env.example.example +23 -25
- package/templates/functions-firebase/functions-firebase/build.mjs.example +2 -72
- package/templates/functions-firebase/functions-firebase/tsconfig.json.example +1 -1
- package/templates/functions-supabase/supabase/functions/cancel-subscription/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/change-plan/index.ts.example +11 -0
- package/templates/functions-supabase/supabase/functions/create-checkout-session/index.ts.example +11 -0
- package/templates/functions-supabase/supabase/functions/create-customer-portal/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/crud/index.ts.example +16 -0
- package/templates/functions-supabase/supabase/functions/delete-account/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/get-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/get-user-auth-status/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/refresh-subscription-status/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/remove-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/set-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/migrations/20250101000000_idempotency.sql +24 -0
- package/templates/functions-supabase/supabase/migrations/20250101000001_rate_limits.sql +22 -0
- package/templates/functions-supabase/supabase/migrations/20250101000002_cleanup_jobs.sql +28 -0
- package/templates/functions-supabase/supabase/migrations/20250101000003_operation_metrics.sql +28 -0
- package/templates/functions-vercel/functions-vercel/tsconfig.json.example +1 -1
- package/templates/functions-vercel/functions-vercel/vercel.json.example +1 -1
- package/templates/functions-vercel/vercel.json.example +1 -1
- package/templates/github/github/workflows/firebase-deploy.yml.example +1 -1
- package/templates/github/workflows/firebase-deploy.yml.example +1 -1
- package/templates/overlay-firebase/env.fragment.example +34 -0
- package/templates/overlay-firebase/env.fragment.expo.example +34 -0
- package/templates/overlay-firebase/env.fragment.nextjs.example +34 -0
- package/templates/overlay-firebase/src/config/providers.expo.ts.example +49 -0
- package/templates/overlay-firebase/src/config/providers.ts.example +23 -0
- package/templates/overlay-supabase/env.fragment.example +7 -0
- package/templates/overlay-supabase/env.fragment.expo.example +7 -0
- package/templates/overlay-supabase/env.fragment.nextjs.example +7 -0
- package/templates/overlay-supabase/src/config/providers.expo.ts.example +35 -0
- package/templates/overlay-supabase/src/config/providers.ts.example +33 -0
- package/templates/overlay-supabase/vercel.headers.example +23 -0
- package/templates/overlay-supabase/vercel.json.example +22 -0
- package/templates/overlay-vercel/env.fragment.example +34 -0
- package/templates/overlay-vercel/env.fragment.nextjs.example +34 -0
- package/templates/overlay-vercel/src/config/providers.ts.example +24 -0
- package/templates/root-consumer/.claude/agents/architect.md.example +2 -310
- package/templates/root-consumer/.claude/agents/builder.md.example +2 -326
- package/templates/root-consumer/.claude/agents/coder.md.example +2 -83
- package/templates/root-consumer/.claude/agents/extractor.md.example +2 -231
- package/templates/root-consumer/.claude/agents/polisher.md.example +2 -132
- package/templates/root-consumer/.claude/agents/prompt-engineer.md.example +2 -81
- package/templates/root-consumer/.claude/commands/grill.md.example +30 -0
- package/templates/root-consumer/.claude/commands/techdebt.md.example +28 -0
- package/templates/root-consumer/.clinerules.example +1 -0
- package/templates/root-consumer/.cursor/rules/no-docs.mdc.example +15 -0
- package/templates/root-consumer/.cursorrules.example +1 -0
- package/templates/root-consumer/.github/copilot-instructions.md.example +1 -0
- package/templates/root-consumer/.windsurfrules.example +1 -0
- package/templates/root-consumer/AI.md.example +29 -123
- package/templates/root-consumer/CLAUDE.md.example +1 -134
- package/templates/root-consumer/CONVENTIONS.md.example +1 -0
- package/templates/root-consumer/GEMINI.md.example +1 -0
- package/templates/root-consumer/firebase.json.example +1 -1
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +20 -0
- package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +0 -18
- package/templates/root-consumer/guides/dndev/COMPONENTS_UI.md.example +1 -1
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +99 -30
- package/templates/root-consumer/guides/dndev/INDEX.md.example +3 -1
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +143 -12
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +9 -3
- package/templates/root-consumer/guides/dndev/SETUP_SOC2.md.example +234 -0
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +124 -0
- package/templates/root-consumer/guides/dndev/SETUP_THEMES.md.example +6 -2
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +176 -0
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +5 -9
- package/templates/root-consumer/guides/dndev/essences_reference.css.example +174 -0
- package/templates/root-consumer/guides/wai-way/agents/builder.md.example +10 -0
- package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +25 -5
- package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +13 -2
- package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +2 -2
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +47 -11
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +15 -4
- package/templates/root-consumer/guides/wai-way/spec_template.md.example +7 -6
- package/templates/app-payload/.env.example +0 -28
- package/templates/app-payload/README.md.example +0 -233
- package/templates/app-payload/collections/Company.ts.example +0 -125
- package/templates/app-payload/collections/Hero.ts.example +0 -62
- package/templates/app-payload/collections/Media.ts.example +0 -41
- package/templates/app-payload/collections/Products.ts.example +0 -115
- package/templates/app-payload/collections/Services.ts.example +0 -104
- package/templates/app-payload/collections/Testimonials.ts.example +0 -92
- package/templates/app-payload/collections/Users.ts.example +0 -35
- package/templates/app-payload/src/server.ts.example +0 -79
- package/templates/app-payload/tsconfig.json.example +0 -24
|
@@ -596,7 +596,13 @@ async function main(options = {}) {
|
|
|
596
596
|
log.error(`Failed to configure Gemini: ${e2.message}`);
|
|
597
597
|
}
|
|
598
598
|
}
|
|
599
|
-
const claudeConfigPath = isWindows ? join(process.env.APPDATA || "", "Claude", "claude_desktop_config.json") : isMac ? join(
|
|
599
|
+
const claudeConfigPath = isWindows ? join(process.env.APPDATA || "", "Claude", "claude_desktop_config.json") : isMac ? join(
|
|
600
|
+
homeDir,
|
|
601
|
+
"Library",
|
|
602
|
+
"Application Support",
|
|
603
|
+
"Claude",
|
|
604
|
+
"claude_desktop_config.json"
|
|
605
|
+
) : null;
|
|
600
606
|
if (claudeConfigPath) {
|
|
601
607
|
if (options.dryRun) {
|
|
602
608
|
Me(`[DRY RUN] Would update ${claudeConfigPath}`, "Claude Desktop");
|
|
@@ -7603,11 +7603,39 @@ var init_PathResolver = __esm({
|
|
|
7603
7603
|
});
|
|
7604
7604
|
|
|
7605
7605
|
// packages/tooling/src/utils/errors.ts
|
|
7606
|
-
var DoNotDevError;
|
|
7606
|
+
var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
|
|
7607
7607
|
var init_errors = __esm({
|
|
7608
7608
|
"packages/tooling/src/utils/errors.ts"() {
|
|
7609
7609
|
"use strict";
|
|
7610
7610
|
init_utils();
|
|
7611
|
+
DO_NOT_DEV_ERROR_CODES = {
|
|
7612
|
+
CONFIGURATION_ERROR: "configuration-error",
|
|
7613
|
+
CONFIG_NOT_FOUND: "config-not-found",
|
|
7614
|
+
CONFIG_INVALID: "config-invalid",
|
|
7615
|
+
PATH_RESOLUTION_ERROR: "path-resolution-error",
|
|
7616
|
+
FILE_OPERATION_ERROR: "file-operation-error",
|
|
7617
|
+
FILE_NOT_FOUND: "file-not-found",
|
|
7618
|
+
PERMISSION_DENIED: "permission-denied",
|
|
7619
|
+
GENERATION_ERROR: "generation-error",
|
|
7620
|
+
TEMPLATE_ERROR: "template-error",
|
|
7621
|
+
TEMPLATE_NOT_FOUND: "template-not-found",
|
|
7622
|
+
CLI_EXECUTION_ERROR: "cli-execution-error",
|
|
7623
|
+
COMMAND_NOT_FOUND: "command-not-found",
|
|
7624
|
+
COMMAND_FAILED: "command-failed",
|
|
7625
|
+
VALIDATION_ERROR: "validation-error",
|
|
7626
|
+
SCHEMA_ERROR: "schema-error",
|
|
7627
|
+
DEPENDENCY_ERROR: "dependency-error",
|
|
7628
|
+
DEPENDENCY_NOT_FOUND: "dependency-not-found",
|
|
7629
|
+
DEPENDENCY_VERSION_ERROR: "dependency-version-error",
|
|
7630
|
+
INVALID_ARGUMENT: "invalid-argument",
|
|
7631
|
+
MISSING_ARGUMENT: "missing-argument",
|
|
7632
|
+
MISSING_PROJECT_ID: "missing-project-id",
|
|
7633
|
+
FIREBASE_CLI_ERROR: "firebase-cli-error",
|
|
7634
|
+
DEPLOYMENT_FAILED: "deployment-failed",
|
|
7635
|
+
OPERATION_CANCELLED: "operation-cancelled",
|
|
7636
|
+
TIMEOUT_ERROR: "timeout-error",
|
|
7637
|
+
UNKNOWN_ERROR: "unknown-error"
|
|
7638
|
+
};
|
|
7611
7639
|
DoNotDevError = class _DoNotDevError extends Error {
|
|
7612
7640
|
/** The error code categorizing this error */
|
|
7613
7641
|
code;
|
|
@@ -7627,7 +7655,7 @@ var init_errors = __esm({
|
|
|
7627
7655
|
* @param {Record<string, any>} [options.context] - Additional context data
|
|
7628
7656
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7629
7657
|
*/
|
|
7630
|
-
constructor(message, code =
|
|
7658
|
+
constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7631
7659
|
super(message);
|
|
7632
7660
|
this.name = "DoNotDevError";
|
|
7633
7661
|
this.code = code;
|
|
@@ -7658,7 +7686,7 @@ var init_errors = __esm({
|
|
|
7658
7686
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7659
7687
|
* @returns {DoNotDevError} New DoNotDev error wrapping the original
|
|
7660
7688
|
*/
|
|
7661
|
-
static from(error2, context, code =
|
|
7689
|
+
static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7662
7690
|
if (!(error2 instanceof Error)) {
|
|
7663
7691
|
return new _DoNotDevError(
|
|
7664
7692
|
`Unknown error: ${String(error2)}`,
|
|
@@ -7695,21 +7723,21 @@ var init_errors = __esm({
|
|
|
7695
7723
|
}
|
|
7696
7724
|
const message = error2.message.toLowerCase();
|
|
7697
7725
|
if (error2.name === "ValidationError" || message.includes("validation")) {
|
|
7698
|
-
return
|
|
7726
|
+
return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
|
|
7699
7727
|
}
|
|
7700
7728
|
if (message.includes("not found") || message.includes("no such file")) {
|
|
7701
|
-
return
|
|
7729
|
+
return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
|
|
7702
7730
|
}
|
|
7703
7731
|
if (message.includes("permission") || message.includes("access denied")) {
|
|
7704
|
-
return
|
|
7732
|
+
return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
|
|
7705
7733
|
}
|
|
7706
7734
|
if (message.includes("timeout") || message.includes("timed out")) {
|
|
7707
|
-
return
|
|
7735
|
+
return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
|
|
7708
7736
|
}
|
|
7709
7737
|
if (message.includes("dependency") || message.includes("module not found")) {
|
|
7710
|
-
return
|
|
7738
|
+
return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
|
|
7711
7739
|
}
|
|
7712
|
-
return
|
|
7740
|
+
return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
|
|
7713
7741
|
}
|
|
7714
7742
|
};
|
|
7715
7743
|
}
|
|
@@ -7751,6 +7779,52 @@ var init_pathResolver = __esm({
|
|
|
7751
7779
|
}
|
|
7752
7780
|
});
|
|
7753
7781
|
|
|
7782
|
+
// packages/tooling/src/utils/typed-file-operations.ts
|
|
7783
|
+
function readFirebaseJson(filePath) {
|
|
7784
|
+
if (!pathExists(filePath)) {
|
|
7785
|
+
throw new DoNotDevError(
|
|
7786
|
+
`firebase.json not found: ${filePath}`,
|
|
7787
|
+
DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND,
|
|
7788
|
+
{ context: { filePath } }
|
|
7789
|
+
);
|
|
7790
|
+
}
|
|
7791
|
+
const content = readSync(filePath, { format: "json" });
|
|
7792
|
+
if (!content || typeof content !== "object") {
|
|
7793
|
+
throw new DoNotDevError(
|
|
7794
|
+
`Invalid firebase.json: ${filePath}`,
|
|
7795
|
+
DO_NOT_DEV_ERROR_CODES.CONFIG_INVALID,
|
|
7796
|
+
{ context: { filePath } }
|
|
7797
|
+
);
|
|
7798
|
+
}
|
|
7799
|
+
return content;
|
|
7800
|
+
}
|
|
7801
|
+
function readPackageJson(filePath) {
|
|
7802
|
+
if (!pathExists(filePath)) {
|
|
7803
|
+
throw new DoNotDevError(
|
|
7804
|
+
`package.json not found: ${filePath}`,
|
|
7805
|
+
DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND,
|
|
7806
|
+
{ context: { filePath } }
|
|
7807
|
+
);
|
|
7808
|
+
}
|
|
7809
|
+
const content = readSync(filePath, { format: "json" });
|
|
7810
|
+
if (!content || typeof content !== "object" || !("name" in content)) {
|
|
7811
|
+
throw new DoNotDevError(
|
|
7812
|
+
`Invalid package.json: ${filePath}`,
|
|
7813
|
+
DO_NOT_DEV_ERROR_CODES.CONFIG_INVALID,
|
|
7814
|
+
{ context: { filePath } }
|
|
7815
|
+
);
|
|
7816
|
+
}
|
|
7817
|
+
return content;
|
|
7818
|
+
}
|
|
7819
|
+
var init_typed_file_operations = __esm({
|
|
7820
|
+
"packages/tooling/src/utils/typed-file-operations.ts"() {
|
|
7821
|
+
"use strict";
|
|
7822
|
+
init_utils();
|
|
7823
|
+
init_pathResolver();
|
|
7824
|
+
init_errors();
|
|
7825
|
+
}
|
|
7826
|
+
});
|
|
7827
|
+
|
|
7754
7828
|
// packages/tooling/src/bundler/utils.ts
|
|
7755
7829
|
import { Buffer as Buffer2 } from "node:buffer";
|
|
7756
7830
|
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "node:fs";
|
|
@@ -7778,6 +7852,32 @@ var init_utils = __esm({
|
|
|
7778
7852
|
}
|
|
7779
7853
|
});
|
|
7780
7854
|
|
|
7855
|
+
// packages/tooling/src/utils/cli-input.ts
|
|
7856
|
+
async function askForSelection(message, choices, defaultValue = 0) {
|
|
7857
|
+
const options = choices.map((choice) => ({
|
|
7858
|
+
value: choice.value,
|
|
7859
|
+
label: choice.title,
|
|
7860
|
+
hint: choice.hint
|
|
7861
|
+
}));
|
|
7862
|
+
const result = await ve({
|
|
7863
|
+
message,
|
|
7864
|
+
options,
|
|
7865
|
+
initialValue: choices[defaultValue]?.value
|
|
7866
|
+
});
|
|
7867
|
+
if (pD(result)) {
|
|
7868
|
+
xe("Operation cancelled.");
|
|
7869
|
+
process.exit(0);
|
|
7870
|
+
}
|
|
7871
|
+
return result;
|
|
7872
|
+
}
|
|
7873
|
+
var init_cli_input = __esm({
|
|
7874
|
+
"packages/tooling/src/utils/cli-input.ts"() {
|
|
7875
|
+
"use strict";
|
|
7876
|
+
init_utils();
|
|
7877
|
+
init_dist2();
|
|
7878
|
+
}
|
|
7879
|
+
});
|
|
7880
|
+
|
|
7781
7881
|
// packages/cli/src/bin/commands/build.ts
|
|
7782
7882
|
init_utils();
|
|
7783
7883
|
|
|
@@ -7798,6 +7898,7 @@ init_dist2();
|
|
|
7798
7898
|
// packages/tooling/src/utils/app-detection.ts
|
|
7799
7899
|
init_utils();
|
|
7800
7900
|
init_pathResolver();
|
|
7901
|
+
init_typed_file_operations();
|
|
7801
7902
|
function detectApps(projectRoot) {
|
|
7802
7903
|
const apps = [];
|
|
7803
7904
|
const appsDir = joinPath(projectRoot, "apps");
|
|
@@ -7818,9 +7919,7 @@ function detectApps(projectRoot) {
|
|
|
7818
7919
|
const packageJsonPath = joinPath(projectRoot, "package.json");
|
|
7819
7920
|
if (pathExists(packageJsonPath)) {
|
|
7820
7921
|
try {
|
|
7821
|
-
const packageJson =
|
|
7822
|
-
format: "json"
|
|
7823
|
-
});
|
|
7922
|
+
const packageJson = readPackageJson(packageJsonPath);
|
|
7824
7923
|
if (packageJson && (packageJson.dependencies?.vite || packageJson.devDependencies?.vite || packageJson.dependencies?.next || packageJson.devDependencies?.next)) {
|
|
7825
7924
|
const pathParts = projectRoot.split(/[/\\]/);
|
|
7826
7925
|
const appName = pathParts[pathParts.length - 1] || "app";
|
|
@@ -7840,10 +7939,10 @@ function analyzeApp(appPath, appName) {
|
|
|
7840
7939
|
if (!pathExists(packageJsonPath)) {
|
|
7841
7940
|
return null;
|
|
7842
7941
|
}
|
|
7843
|
-
let packageJson;
|
|
7942
|
+
let packageJson = null;
|
|
7844
7943
|
try {
|
|
7845
|
-
packageJson =
|
|
7846
|
-
if (!packageJson) {
|
|
7944
|
+
packageJson = readPackageJson(packageJsonPath);
|
|
7945
|
+
if (!packageJson.name) {
|
|
7847
7946
|
return null;
|
|
7848
7947
|
}
|
|
7849
7948
|
} catch {
|
|
@@ -7916,31 +8015,12 @@ async function selectApp(projectRoot, appName) {
|
|
|
7916
8015
|
return apps.find((a) => a.name === selected) || null;
|
|
7917
8016
|
}
|
|
7918
8017
|
|
|
7919
|
-
// packages/tooling/src/utils/cli-input.ts
|
|
7920
|
-
init_utils();
|
|
7921
|
-
init_dist2();
|
|
7922
|
-
async function askForSelection(message, choices, defaultValue = 0) {
|
|
7923
|
-
const options = choices.map((choice) => ({
|
|
7924
|
-
value: choice.value,
|
|
7925
|
-
label: choice.title,
|
|
7926
|
-
hint: choice.hint
|
|
7927
|
-
}));
|
|
7928
|
-
const result = await ve({
|
|
7929
|
-
message,
|
|
7930
|
-
options,
|
|
7931
|
-
initialValue: choices[defaultValue]?.value
|
|
7932
|
-
});
|
|
7933
|
-
if (pD(result)) {
|
|
7934
|
-
xe("Operation cancelled.");
|
|
7935
|
-
process.exit(0);
|
|
7936
|
-
}
|
|
7937
|
-
return result;
|
|
7938
|
-
}
|
|
7939
|
-
|
|
7940
8018
|
// packages/tooling/src/apps/build.ts
|
|
8019
|
+
init_cli_input();
|
|
7941
8020
|
init_cli_output();
|
|
7942
8021
|
init_errors();
|
|
7943
8022
|
init_pathResolver();
|
|
8023
|
+
init_typed_file_operations();
|
|
7944
8024
|
function validateFirebaseJson(appDir) {
|
|
7945
8025
|
const firebaseJsonPath = joinPath(appDir, "firebase.json");
|
|
7946
8026
|
if (!pathExists(firebaseJsonPath)) {
|
|
@@ -7951,8 +8031,8 @@ function validateFirebaseJson(appDir) {
|
|
|
7951
8031
|
};
|
|
7952
8032
|
}
|
|
7953
8033
|
try {
|
|
7954
|
-
const config =
|
|
7955
|
-
if (!config) {
|
|
8034
|
+
const config = readFirebaseJson(firebaseJsonPath);
|
|
8035
|
+
if (!config.projectId) {
|
|
7956
8036
|
return {
|
|
7957
8037
|
valid: false,
|
|
7958
8038
|
hasHosting: false,
|
|
@@ -7565,11 +7565,39 @@ var init_PathResolver = __esm({
|
|
|
7565
7565
|
});
|
|
7566
7566
|
|
|
7567
7567
|
// packages/tooling/src/utils/errors.ts
|
|
7568
|
-
var DoNotDevError;
|
|
7568
|
+
var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
|
|
7569
7569
|
var init_errors = __esm({
|
|
7570
7570
|
"packages/tooling/src/utils/errors.ts"() {
|
|
7571
7571
|
"use strict";
|
|
7572
7572
|
init_utils();
|
|
7573
|
+
DO_NOT_DEV_ERROR_CODES = {
|
|
7574
|
+
CONFIGURATION_ERROR: "configuration-error",
|
|
7575
|
+
CONFIG_NOT_FOUND: "config-not-found",
|
|
7576
|
+
CONFIG_INVALID: "config-invalid",
|
|
7577
|
+
PATH_RESOLUTION_ERROR: "path-resolution-error",
|
|
7578
|
+
FILE_OPERATION_ERROR: "file-operation-error",
|
|
7579
|
+
FILE_NOT_FOUND: "file-not-found",
|
|
7580
|
+
PERMISSION_DENIED: "permission-denied",
|
|
7581
|
+
GENERATION_ERROR: "generation-error",
|
|
7582
|
+
TEMPLATE_ERROR: "template-error",
|
|
7583
|
+
TEMPLATE_NOT_FOUND: "template-not-found",
|
|
7584
|
+
CLI_EXECUTION_ERROR: "cli-execution-error",
|
|
7585
|
+
COMMAND_NOT_FOUND: "command-not-found",
|
|
7586
|
+
COMMAND_FAILED: "command-failed",
|
|
7587
|
+
VALIDATION_ERROR: "validation-error",
|
|
7588
|
+
SCHEMA_ERROR: "schema-error",
|
|
7589
|
+
DEPENDENCY_ERROR: "dependency-error",
|
|
7590
|
+
DEPENDENCY_NOT_FOUND: "dependency-not-found",
|
|
7591
|
+
DEPENDENCY_VERSION_ERROR: "dependency-version-error",
|
|
7592
|
+
INVALID_ARGUMENT: "invalid-argument",
|
|
7593
|
+
MISSING_ARGUMENT: "missing-argument",
|
|
7594
|
+
MISSING_PROJECT_ID: "missing-project-id",
|
|
7595
|
+
FIREBASE_CLI_ERROR: "firebase-cli-error",
|
|
7596
|
+
DEPLOYMENT_FAILED: "deployment-failed",
|
|
7597
|
+
OPERATION_CANCELLED: "operation-cancelled",
|
|
7598
|
+
TIMEOUT_ERROR: "timeout-error",
|
|
7599
|
+
UNKNOWN_ERROR: "unknown-error"
|
|
7600
|
+
};
|
|
7573
7601
|
DoNotDevError = class _DoNotDevError extends Error {
|
|
7574
7602
|
/** The error code categorizing this error */
|
|
7575
7603
|
code;
|
|
@@ -7589,7 +7617,7 @@ var init_errors = __esm({
|
|
|
7589
7617
|
* @param {Record<string, any>} [options.context] - Additional context data
|
|
7590
7618
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7591
7619
|
*/
|
|
7592
|
-
constructor(message, code =
|
|
7620
|
+
constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7593
7621
|
super(message);
|
|
7594
7622
|
this.name = "DoNotDevError";
|
|
7595
7623
|
this.code = code;
|
|
@@ -7620,7 +7648,7 @@ var init_errors = __esm({
|
|
|
7620
7648
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7621
7649
|
* @returns {DoNotDevError} New DoNotDev error wrapping the original
|
|
7622
7650
|
*/
|
|
7623
|
-
static from(error2, context, code =
|
|
7651
|
+
static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7624
7652
|
if (!(error2 instanceof Error)) {
|
|
7625
7653
|
return new _DoNotDevError(
|
|
7626
7654
|
`Unknown error: ${String(error2)}`,
|
|
@@ -7657,21 +7685,21 @@ var init_errors = __esm({
|
|
|
7657
7685
|
}
|
|
7658
7686
|
const message = error2.message.toLowerCase();
|
|
7659
7687
|
if (error2.name === "ValidationError" || message.includes("validation")) {
|
|
7660
|
-
return
|
|
7688
|
+
return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
|
|
7661
7689
|
}
|
|
7662
7690
|
if (message.includes("not found") || message.includes("no such file")) {
|
|
7663
|
-
return
|
|
7691
|
+
return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
|
|
7664
7692
|
}
|
|
7665
7693
|
if (message.includes("permission") || message.includes("access denied")) {
|
|
7666
|
-
return
|
|
7694
|
+
return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
|
|
7667
7695
|
}
|
|
7668
7696
|
if (message.includes("timeout") || message.includes("timed out")) {
|
|
7669
|
-
return
|
|
7697
|
+
return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
|
|
7670
7698
|
}
|
|
7671
7699
|
if (message.includes("dependency") || message.includes("module not found")) {
|
|
7672
|
-
return
|
|
7700
|
+
return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
|
|
7673
7701
|
}
|
|
7674
|
-
return
|
|
7702
|
+
return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
|
|
7675
7703
|
}
|
|
7676
7704
|
};
|
|
7677
7705
|
}
|
|
@@ -7694,16 +7722,19 @@ function getDirnameFromUrl(importMetaUrl) {
|
|
|
7694
7722
|
return dirname2(fileURLToPath2(importMetaUrl));
|
|
7695
7723
|
}
|
|
7696
7724
|
function detectExecutionMode() {
|
|
7697
|
-
const fileUrlPath =
|
|
7698
|
-
if (
|
|
7699
|
-
return "
|
|
7725
|
+
const fileUrlPath = fileURLToPath2(import.meta.url);
|
|
7726
|
+
if (fileUrlPath.includes("node_modules")) {
|
|
7727
|
+
return "published";
|
|
7728
|
+
}
|
|
7729
|
+
if (fileUrlPath.includes("/dist/")) {
|
|
7730
|
+
return "published";
|
|
7700
7731
|
}
|
|
7701
|
-
return "
|
|
7732
|
+
return "development";
|
|
7702
7733
|
}
|
|
7703
7734
|
function getTemplatesRoot() {
|
|
7704
7735
|
const mode = detectExecutionMode();
|
|
7705
7736
|
if (mode === "development") {
|
|
7706
|
-
const fileUrlPath =
|
|
7737
|
+
const fileUrlPath = fileURLToPath2(import.meta.url);
|
|
7707
7738
|
const frameworkRoot = normalizePath(dirname2(fileUrlPath), "../../../..");
|
|
7708
7739
|
return normalizePath(frameworkRoot, PACKAGE_PATHS.CLI, "templates");
|
|
7709
7740
|
} else {
|
|
@@ -7884,18 +7915,7 @@ var init_utils = __esm({
|
|
|
7884
7915
|
}
|
|
7885
7916
|
});
|
|
7886
7917
|
|
|
7887
|
-
// packages/cli/src/bin/commands/bump.ts
|
|
7888
|
-
init_utils();
|
|
7889
|
-
|
|
7890
|
-
// packages/tooling/src/index.ts
|
|
7891
|
-
init_utils();
|
|
7892
|
-
|
|
7893
|
-
// packages/tooling/src/cli/index.ts
|
|
7894
|
-
init_utils();
|
|
7895
|
-
|
|
7896
7918
|
// packages/tooling/src/utils/cli-input.ts
|
|
7897
|
-
init_utils();
|
|
7898
|
-
init_dist2();
|
|
7899
7919
|
async function askForConfirmation(message, defaultValue = false) {
|
|
7900
7920
|
const result = await ye({
|
|
7901
7921
|
message,
|
|
@@ -7924,6 +7944,22 @@ async function askForSelection(message, choices, defaultValue = 0) {
|
|
|
7924
7944
|
}
|
|
7925
7945
|
return result;
|
|
7926
7946
|
}
|
|
7947
|
+
var init_cli_input = __esm({
|
|
7948
|
+
"packages/tooling/src/utils/cli-input.ts"() {
|
|
7949
|
+
"use strict";
|
|
7950
|
+
init_utils();
|
|
7951
|
+
init_dist2();
|
|
7952
|
+
}
|
|
7953
|
+
});
|
|
7954
|
+
|
|
7955
|
+
// packages/cli/src/bin/commands/bump.ts
|
|
7956
|
+
init_utils();
|
|
7957
|
+
|
|
7958
|
+
// packages/tooling/src/index.ts
|
|
7959
|
+
init_utils();
|
|
7960
|
+
|
|
7961
|
+
// packages/tooling/src/cli/index.ts
|
|
7962
|
+
init_utils();
|
|
7927
7963
|
|
|
7928
7964
|
// packages/tooling/src/utils/matrix.ts
|
|
7929
7965
|
init_utils();
|
|
@@ -8070,6 +8106,7 @@ function compareVersions(current, expected) {
|
|
|
8070
8106
|
|
|
8071
8107
|
// packages/tooling/src/maintenance/bump.ts
|
|
8072
8108
|
init_utils();
|
|
8109
|
+
init_cli_input();
|
|
8073
8110
|
init_cli_output();
|
|
8074
8111
|
init_pathResolver();
|
|
8075
8112
|
|
|
@@ -8112,13 +8149,22 @@ function getSourceTemplatesPath() {
|
|
|
8112
8149
|
}
|
|
8113
8150
|
const appRoot = getAppRoot();
|
|
8114
8151
|
if (appRoot) {
|
|
8115
|
-
const directPath = joinPath(
|
|
8152
|
+
const directPath = joinPath(
|
|
8153
|
+
appRoot,
|
|
8154
|
+
"node_modules",
|
|
8155
|
+
"@donotdev",
|
|
8156
|
+
"cli",
|
|
8157
|
+
"templates",
|
|
8158
|
+
"root-consumer"
|
|
8159
|
+
);
|
|
8116
8160
|
if (pathExists(directPath)) {
|
|
8117
8161
|
log.info("Found templates via node_modules lookup");
|
|
8118
8162
|
return normalizePath(directPath);
|
|
8119
8163
|
}
|
|
8120
8164
|
}
|
|
8121
|
-
log.warn(
|
|
8165
|
+
log.warn(
|
|
8166
|
+
"Could not find @donotdev/cli templates. Is @donotdev/cli installed?"
|
|
8167
|
+
);
|
|
8122
8168
|
return null;
|
|
8123
8169
|
}
|
|
8124
8170
|
async function syncFile(sourcePath, destPath, preserveIfExists, appRoot) {
|
|
@@ -8149,7 +8195,7 @@ async function syncFile(sourcePath, destPath, preserveIfExists, appRoot) {
|
|
|
8149
8195
|
}
|
|
8150
8196
|
}
|
|
8151
8197
|
await ensureDir(getDirname(destPathWithoutExample));
|
|
8152
|
-
await write(destPathWithoutExample, content, { format: "text" });
|
|
8198
|
+
await write(destPathWithoutExample, content, { format: "text", overwrite: true });
|
|
8153
8199
|
return true;
|
|
8154
8200
|
}
|
|
8155
8201
|
async function syncTemplates(sourceRoot, destRoot, dryRun) {
|
|
@@ -7215,11 +7215,39 @@ var init_PathResolver = __esm({
|
|
|
7215
7215
|
});
|
|
7216
7216
|
|
|
7217
7217
|
// packages/tooling/src/utils/errors.ts
|
|
7218
|
-
var DoNotDevError;
|
|
7218
|
+
var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
|
|
7219
7219
|
var init_errors = __esm({
|
|
7220
7220
|
"packages/tooling/src/utils/errors.ts"() {
|
|
7221
7221
|
"use strict";
|
|
7222
7222
|
init_utils();
|
|
7223
|
+
DO_NOT_DEV_ERROR_CODES = {
|
|
7224
|
+
CONFIGURATION_ERROR: "configuration-error",
|
|
7225
|
+
CONFIG_NOT_FOUND: "config-not-found",
|
|
7226
|
+
CONFIG_INVALID: "config-invalid",
|
|
7227
|
+
PATH_RESOLUTION_ERROR: "path-resolution-error",
|
|
7228
|
+
FILE_OPERATION_ERROR: "file-operation-error",
|
|
7229
|
+
FILE_NOT_FOUND: "file-not-found",
|
|
7230
|
+
PERMISSION_DENIED: "permission-denied",
|
|
7231
|
+
GENERATION_ERROR: "generation-error",
|
|
7232
|
+
TEMPLATE_ERROR: "template-error",
|
|
7233
|
+
TEMPLATE_NOT_FOUND: "template-not-found",
|
|
7234
|
+
CLI_EXECUTION_ERROR: "cli-execution-error",
|
|
7235
|
+
COMMAND_NOT_FOUND: "command-not-found",
|
|
7236
|
+
COMMAND_FAILED: "command-failed",
|
|
7237
|
+
VALIDATION_ERROR: "validation-error",
|
|
7238
|
+
SCHEMA_ERROR: "schema-error",
|
|
7239
|
+
DEPENDENCY_ERROR: "dependency-error",
|
|
7240
|
+
DEPENDENCY_NOT_FOUND: "dependency-not-found",
|
|
7241
|
+
DEPENDENCY_VERSION_ERROR: "dependency-version-error",
|
|
7242
|
+
INVALID_ARGUMENT: "invalid-argument",
|
|
7243
|
+
MISSING_ARGUMENT: "missing-argument",
|
|
7244
|
+
MISSING_PROJECT_ID: "missing-project-id",
|
|
7245
|
+
FIREBASE_CLI_ERROR: "firebase-cli-error",
|
|
7246
|
+
DEPLOYMENT_FAILED: "deployment-failed",
|
|
7247
|
+
OPERATION_CANCELLED: "operation-cancelled",
|
|
7248
|
+
TIMEOUT_ERROR: "timeout-error",
|
|
7249
|
+
UNKNOWN_ERROR: "unknown-error"
|
|
7250
|
+
};
|
|
7223
7251
|
DoNotDevError = class _DoNotDevError extends Error {
|
|
7224
7252
|
/** The error code categorizing this error */
|
|
7225
7253
|
code;
|
|
@@ -7239,7 +7267,7 @@ var init_errors = __esm({
|
|
|
7239
7267
|
* @param {Record<string, any>} [options.context] - Additional context data
|
|
7240
7268
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7241
7269
|
*/
|
|
7242
|
-
constructor(message, code =
|
|
7270
|
+
constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7243
7271
|
super(message);
|
|
7244
7272
|
this.name = "DoNotDevError";
|
|
7245
7273
|
this.code = code;
|
|
@@ -7270,7 +7298,7 @@ var init_errors = __esm({
|
|
|
7270
7298
|
* @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
|
|
7271
7299
|
* @returns {DoNotDevError} New DoNotDev error wrapping the original
|
|
7272
7300
|
*/
|
|
7273
|
-
static from(error2, context, code =
|
|
7301
|
+
static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
|
|
7274
7302
|
if (!(error2 instanceof Error)) {
|
|
7275
7303
|
return new _DoNotDevError(
|
|
7276
7304
|
`Unknown error: ${String(error2)}`,
|
|
@@ -7307,21 +7335,21 @@ var init_errors = __esm({
|
|
|
7307
7335
|
}
|
|
7308
7336
|
const message = error2.message.toLowerCase();
|
|
7309
7337
|
if (error2.name === "ValidationError" || message.includes("validation")) {
|
|
7310
|
-
return
|
|
7338
|
+
return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
|
|
7311
7339
|
}
|
|
7312
7340
|
if (message.includes("not found") || message.includes("no such file")) {
|
|
7313
|
-
return
|
|
7341
|
+
return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
|
|
7314
7342
|
}
|
|
7315
7343
|
if (message.includes("permission") || message.includes("access denied")) {
|
|
7316
|
-
return
|
|
7344
|
+
return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
|
|
7317
7345
|
}
|
|
7318
7346
|
if (message.includes("timeout") || message.includes("timed out")) {
|
|
7319
|
-
return
|
|
7347
|
+
return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
|
|
7320
7348
|
}
|
|
7321
7349
|
if (message.includes("dependency") || message.includes("module not found")) {
|
|
7322
|
-
return
|
|
7350
|
+
return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
|
|
7323
7351
|
}
|
|
7324
|
-
return
|
|
7352
|
+
return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
|
|
7325
7353
|
}
|
|
7326
7354
|
};
|
|
7327
7355
|
}
|