@donotdev/cli 0.0.19 → 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 +135 -47
- package/dist/bin/commands/bump.js +5 -2
- package/dist/bin/commands/create-app.js +1 -1
- package/dist/bin/commands/create-project.js +13 -2
- package/dist/bin/commands/deploy.js +18 -0
- package/dist/bin/commands/setup.js +3 -0
- package/dist/bin/commands/staging.js +18 -0
- package/dist/bin/commands/type-check.js +10 -4
- package/dist/bin/dndev.js +120 -179
- package/dist/bin/donotdev.js +120 -179
- package/dist/index.js +31 -2
- package/package.json +1 -1
- 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 +3 -1
- package/templates/app-demo/src/config/app.ts.example +1 -0
- 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 +12 -0
- package/templates/app-demo/src/entities/quote.ts.example +70 -0
- package/templates/app-demo/src/pages/ChangelogPage.tsx.example +28 -1
- package/templates/app-demo/src/pages/ConditionalFormPage.tsx.example +88 -0
- package/templates/app-demo/src/pages/DashboardPage.tsx.example +2 -0
- package/templates/app-demo/src/pages/HomePage.tsx.example +355 -2
- package/templates/app-demo/src/pages/OnboardingPage.tsx.example +47 -0
- package/templates/app-demo/src/pages/PricingPage.tsx.example +28 -1
- package/templates/app-demo/src/pages/ProductsPage.tsx.example +2 -0
- package/templates/app-demo/src/pages/ProfilePage.tsx.example +2 -0
- package/templates/app-demo/src/pages/SettingsPage.tsx.example +2 -0
- package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +22 -16
- package/templates/app-demo/src/pages/ShowcasePage.tsx.example +3 -1
- 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 +12 -1
- package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +10 -1
- package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +10 -1
- package/templates/app-demo/src/themes.css.example +289 -77
- package/templates/app-demo/stats.html.example +4949 -0
- 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/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/dist/bin/donotdev.js
CHANGED
|
@@ -753,11 +753,47 @@ var init_command_registry = __esm({
|
|
|
753
753
|
// packages/cli/src/bin/dndev.mjs
|
|
754
754
|
init_utils();
|
|
755
755
|
init_command_registry();
|
|
756
|
-
import { readFileSync } from "node:fs";
|
|
757
756
|
import { Command } from "commander";
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
)
|
|
757
|
+
|
|
758
|
+
// packages/tooling/src/cli/entry-helpers.ts
|
|
759
|
+
init_utils();
|
|
760
|
+
function baseName2(commanderName) {
|
|
761
|
+
return commanderName.split(" ")[0] ?? commanderName;
|
|
762
|
+
}
|
|
763
|
+
function extractCommonOptions(commanderOptions) {
|
|
764
|
+
const quiet = process.env.QUIET === "true" || process.env.QUIET === "1" || commanderOptions.quiet || false;
|
|
765
|
+
const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1" || commanderOptions.debug || false;
|
|
766
|
+
const verbose = !debug && (process.env.VERBOSE === "true" || process.env.VERBOSE === "1" || commanderOptions.verbose || false);
|
|
767
|
+
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun || commanderOptions.dry || false;
|
|
768
|
+
return { dryRun, quiet, verbose, debug };
|
|
769
|
+
}
|
|
770
|
+
function addCommonOptions(cmd) {
|
|
771
|
+
cmd.option("--dry, --dry-run", "Preview changes without applying").option("--verbose", "Verbose output").option("--debug", "Debug output").option("-q, --quiet", "Quiet output (errors only)");
|
|
772
|
+
}
|
|
773
|
+
function registerCommand(program2, def, action) {
|
|
774
|
+
const cmd = program2.command(def.name);
|
|
775
|
+
if (def.alias) {
|
|
776
|
+
const aliases = Array.isArray(def.alias) ? def.alias : [def.alias];
|
|
777
|
+
for (const a of aliases) cmd.alias(a);
|
|
778
|
+
}
|
|
779
|
+
cmd.description(def.description);
|
|
780
|
+
if (def.options) {
|
|
781
|
+
for (const opt of def.options) {
|
|
782
|
+
cmd.option(opt.flags, opt.description);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
addCommonOptions(cmd);
|
|
786
|
+
cmd.action(async (...commanderArgs) => {
|
|
787
|
+
const commanderOptions = commanderArgs[commanderArgs.length - 2];
|
|
788
|
+
const positionalArgs = commanderArgs.slice(0, -2);
|
|
789
|
+
const commonOptions = extractCommonOptions(commanderOptions);
|
|
790
|
+
const parsedOptions = { ...commonOptions, ...commanderOptions };
|
|
791
|
+
await action(parsedOptions, ...positionalArgs);
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
// packages/cli/src/bin/dndev.mjs
|
|
796
|
+
var CLI_VERSION = true ? "0.0.20" : "0.0.0";
|
|
761
797
|
var args = process.argv.slice(2);
|
|
762
798
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v")) {
|
|
763
799
|
console.log(CLI_VERSION);
|
|
@@ -772,214 +808,119 @@ if (args.length === 0 || args.length === 1 && (args[0] === "--help" || args[0] =
|
|
|
772
808
|
}
|
|
773
809
|
var program = new Command();
|
|
774
810
|
program.name("dndev").description("DoNotDev Framework CLI").version(CLI_VERSION, "-v, --version", "display version number").usage("<command>[:<app>] [options]").helpCommand("help [command]", "display help for command");
|
|
775
|
-
function
|
|
776
|
-
const quiet = process.env.QUIET === "true" || process.env.QUIET === "1" || commanderOptions.quiet || false;
|
|
777
|
-
const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1" || commanderOptions.debug || false;
|
|
778
|
-
const verbose = !debug && (process.env.VERBOSE === "true" || process.env.VERBOSE === "1" || commanderOptions.verbose || false);
|
|
779
|
-
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun || false;
|
|
780
|
-
return { dryRun, quiet, verbose, debug };
|
|
781
|
-
}
|
|
782
|
-
function addCommonOptions(cmd) {
|
|
783
|
-
cmd.option("-d, --dry-run", "Preview changes without applying").option("--verbose", "Verbose output").option("--debug", "Debug output").option("-q, --quiet", "Quiet output (errors only)");
|
|
784
|
-
}
|
|
785
|
-
async function runAppCommand(commandPath, app) {
|
|
811
|
+
async function runAppCommand(commandPath, app, commonOptions) {
|
|
786
812
|
const savedArgv = process.argv;
|
|
787
813
|
process.argv = app ? [savedArgv[0], savedArgv[1], app] : [savedArgv[0], savedArgv[1]];
|
|
788
814
|
try {
|
|
789
815
|
const { main } = await import(commandPath);
|
|
790
|
-
process.
|
|
816
|
+
process.exitCode = await main(commonOptions);
|
|
817
|
+
} catch (error) {
|
|
818
|
+
console.error(`Command failed: ${error.message}`);
|
|
819
|
+
process.exitCode = error.context?.exitCode || 1;
|
|
791
820
|
} finally {
|
|
792
821
|
process.argv = savedArgv;
|
|
793
822
|
}
|
|
794
823
|
}
|
|
795
|
-
function
|
|
796
|
-
return
|
|
824
|
+
function makeStandardAction(commandPath) {
|
|
825
|
+
return async (options, ...positionalArgs) => {
|
|
826
|
+
try {
|
|
827
|
+
const { main } = await import(commandPath);
|
|
828
|
+
await main(options, ...positionalArgs);
|
|
829
|
+
} catch (error) {
|
|
830
|
+
console.error(`Command failed: ${error.message}`);
|
|
831
|
+
process.exitCode = error.context?.exitCode || 1;
|
|
832
|
+
}
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
function makeAppAction(commandPath) {
|
|
836
|
+
return async (options, app) => {
|
|
837
|
+
await runAppCommand(commandPath, app, extractCommonOptions(options));
|
|
838
|
+
};
|
|
797
839
|
}
|
|
798
840
|
var ACTION_OVERRIDES = {
|
|
799
|
-
"create-app": (
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
functions: options.functions,
|
|
811
|
-
backend: options.backend,
|
|
812
|
-
firebaseProjectId: options.project,
|
|
813
|
-
firebaseRegion: options.region
|
|
814
|
-
});
|
|
815
|
-
} else {
|
|
816
|
-
await main();
|
|
817
|
-
}
|
|
818
|
-
});
|
|
819
|
-
},
|
|
820
|
-
"format": (cmd) => {
|
|
821
|
-
cmd.action(async (commanderOptions) => {
|
|
822
|
-
const commonOptions = extractCommonOptions(commanderOptions);
|
|
823
|
-
const options = { ...commonOptions, ...commanderOptions };
|
|
824
|
-
try {
|
|
825
|
-
const { main } = await import("./commands/format.js");
|
|
826
|
-
process.exitCode = await main(options);
|
|
827
|
-
} catch (error) {
|
|
828
|
-
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
829
|
-
process.exit(error.context?.exitCode || 1);
|
|
830
|
-
}
|
|
831
|
-
throw error;
|
|
832
|
-
}
|
|
833
|
-
});
|
|
834
|
-
},
|
|
835
|
-
"type-check": (cmd) => {
|
|
836
|
-
cmd.action(async (app, commanderOptions) => {
|
|
837
|
-
const commonOptions = extractCommonOptions(commanderOptions);
|
|
838
|
-
const options = { ...commonOptions, package: app };
|
|
839
|
-
try {
|
|
840
|
-
const { main } = await import("./commands/type-check.js");
|
|
841
|
-
process.exit(await main(options));
|
|
842
|
-
} catch (error) {
|
|
843
|
-
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
844
|
-
process.exit(error.context?.exitCode || 1);
|
|
845
|
-
}
|
|
846
|
-
throw error;
|
|
847
|
-
}
|
|
848
|
-
});
|
|
841
|
+
"create-app": async (options, name) => {
|
|
842
|
+
const appName = name || options.name;
|
|
843
|
+
const { main } = await import("./commands/create-app.js");
|
|
844
|
+
if (appName) {
|
|
845
|
+
await main({
|
|
846
|
+
...options,
|
|
847
|
+
name: appName
|
|
848
|
+
});
|
|
849
|
+
} else {
|
|
850
|
+
await main(options);
|
|
851
|
+
}
|
|
849
852
|
},
|
|
850
|
-
"
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
const options = { ...commonOptions, ...commanderOptions };
|
|
854
|
-
if (app) options.app = app;
|
|
855
|
-
const { main } = await import("./commands/cacheout.js");
|
|
856
|
-
process.exitCode = await main(options);
|
|
857
|
-
});
|
|
853
|
+
"type-check": async (options, app) => {
|
|
854
|
+
const { main } = await import("./commands/type-check.js");
|
|
855
|
+
process.exitCode = await main({ ...options, package: app });
|
|
858
856
|
},
|
|
859
|
-
"
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
try {
|
|
864
|
-
const { main } = await import("./commands/bump.js");
|
|
865
|
-
process.exitCode = await main(options);
|
|
866
|
-
} catch (error) {
|
|
867
|
-
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
868
|
-
process.exit(error.context?.exitCode || 1);
|
|
869
|
-
}
|
|
870
|
-
throw error;
|
|
871
|
-
}
|
|
872
|
-
});
|
|
857
|
+
"cacheout": async (options, app) => {
|
|
858
|
+
if (app) options.app = app;
|
|
859
|
+
const { main } = await import("./commands/cacheout.js");
|
|
860
|
+
process.exitCode = await main(options);
|
|
873
861
|
},
|
|
874
|
-
"staging": (
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
const options = { ...commonOptions, ...commanderOptions, app, staging: true };
|
|
878
|
-
const { main } = await import("./commands/deploy.js");
|
|
879
|
-
await main(options);
|
|
880
|
-
});
|
|
862
|
+
"staging": async (options, app) => {
|
|
863
|
+
const { main } = await import("./commands/deploy.js");
|
|
864
|
+
await main({ ...options, app, staging: true });
|
|
881
865
|
},
|
|
882
|
-
"deploy": (
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
const options = { ...commonOptions, ...commanderOptions, app };
|
|
886
|
-
const { main } = await import("./commands/deploy.js");
|
|
887
|
-
await main(options);
|
|
888
|
-
});
|
|
866
|
+
"deploy": async (options, app) => {
|
|
867
|
+
const { main } = await import("./commands/deploy.js");
|
|
868
|
+
await main({ ...options, app });
|
|
889
869
|
},
|
|
890
|
-
"sync-secrets": (
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
if (options.project) options.projectId = options.project;
|
|
895
|
-
const { main } = await import("./commands/sync-secrets.js");
|
|
896
|
-
process.exitCode = await main(options);
|
|
897
|
-
});
|
|
870
|
+
"sync-secrets": async (options) => {
|
|
871
|
+
if (options.project) options.projectId = options.project;
|
|
872
|
+
const { main } = await import("./commands/sync-secrets.js");
|
|
873
|
+
process.exitCode = await main(options);
|
|
898
874
|
},
|
|
899
|
-
"make-admin": (
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
875
|
+
"make-admin": async (options, userId) => {
|
|
876
|
+
const args2 = [];
|
|
877
|
+
if (userId) args2.push(userId);
|
|
878
|
+
if (options.project) args2.push(`--project=${options.project}`);
|
|
879
|
+
if (options.projectId) args2.push(`--project-id=${options.projectId}`);
|
|
880
|
+
if (options.super) args2.push("--super");
|
|
881
|
+
if (options.dryRun) args2.push("--dry-run");
|
|
882
|
+
if (options.verbose) args2.push("--verbose");
|
|
883
|
+
if (options.debug) args2.push("--debug");
|
|
884
|
+
try {
|
|
906
885
|
const { main } = await import("./commands/make-admin.js");
|
|
907
886
|
await main(args2);
|
|
908
|
-
})
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
const commonOptions = extractCommonOptions(commanderOptions);
|
|
913
|
-
const { main } = await import("./commands/coach.js");
|
|
914
|
-
process.exitCode = await main(commonOptions);
|
|
915
|
-
});
|
|
887
|
+
} catch (error) {
|
|
888
|
+
console.error(`make-admin failed: ${error.message}`);
|
|
889
|
+
process.exitCode = error.context?.exitCode || 1;
|
|
890
|
+
}
|
|
916
891
|
},
|
|
917
|
-
"setup": (
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
const options = { ...commonOptions, provider };
|
|
921
|
-
const { main } = await import("./commands/setup.js");
|
|
922
|
-
process.exitCode = await main(options);
|
|
923
|
-
});
|
|
892
|
+
"setup": async (options, provider) => {
|
|
893
|
+
const { main } = await import("./commands/setup.js");
|
|
894
|
+
process.exitCode = await main({ ...options, provider });
|
|
924
895
|
},
|
|
925
|
-
"doctor": (
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
const options = { ...commonOptions, check: commanderOptions.check };
|
|
929
|
-
const { main } = await import("./commands/doctor.js");
|
|
930
|
-
process.exit(await main(options));
|
|
931
|
-
});
|
|
896
|
+
"doctor": async (options) => {
|
|
897
|
+
const { main } = await import("./commands/doctor.js");
|
|
898
|
+
process.exitCode = await main({ ...options, check: options.check });
|
|
932
899
|
},
|
|
933
|
-
"
|
|
934
|
-
|
|
935
|
-
|
|
900
|
+
"wai": async () => {
|
|
901
|
+
const { main } = await import("./commands/wai.js");
|
|
902
|
+
process.exitCode = await main();
|
|
936
903
|
},
|
|
937
|
-
"
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
process.exit(await main());
|
|
941
|
-
});
|
|
904
|
+
"agent:setup": async (options) => {
|
|
905
|
+
const { main } = await import("./commands/agent-setup.js");
|
|
906
|
+
await main(options);
|
|
942
907
|
}
|
|
943
908
|
};
|
|
944
|
-
|
|
945
|
-
for (const def of publicCommands) {
|
|
909
|
+
for (const def of getPublicCommands()) {
|
|
946
910
|
const cmdName = baseName2(def.name);
|
|
947
911
|
const wrapperFile = def.wrapperFile ?? cmdName;
|
|
948
912
|
const commandPath = `./commands/${wrapperFile}.js`;
|
|
949
|
-
const cmd = program.command(def.name);
|
|
950
|
-
if (def.alias) {
|
|
951
|
-
const aliases = Array.isArray(def.alias) ? def.alias : [def.alias];
|
|
952
|
-
for (const a of aliases) cmd.alias(a);
|
|
953
|
-
}
|
|
954
|
-
cmd.description(def.description);
|
|
955
|
-
if (def.options) {
|
|
956
|
-
for (const opt of def.options) {
|
|
957
|
-
cmd.option(opt.flags, opt.description);
|
|
958
|
-
}
|
|
959
|
-
}
|
|
960
|
-
addCommonOptions(cmd);
|
|
961
913
|
const override = ACTION_OVERRIDES[def.name] ?? ACTION_OVERRIDES[cmdName];
|
|
914
|
+
let action;
|
|
962
915
|
if (override) {
|
|
963
|
-
|
|
964
|
-
if (result === "skip") continue;
|
|
916
|
+
action = override;
|
|
965
917
|
} else if (def.actionPattern === "app") {
|
|
966
|
-
|
|
918
|
+
action = makeAppAction(commandPath);
|
|
967
919
|
} else {
|
|
968
|
-
|
|
969
|
-
const commanderOptions = commanderArgs[commanderArgs.length - 2];
|
|
970
|
-
const positionalArgs = commanderArgs.slice(0, -2);
|
|
971
|
-
const commonOptions = extractCommonOptions(commanderOptions);
|
|
972
|
-
const options = { ...commonOptions, ...commanderOptions };
|
|
973
|
-
const { main } = await import(commandPath);
|
|
974
|
-
await main(options, ...positionalArgs);
|
|
975
|
-
});
|
|
920
|
+
action = makeStandardAction(commandPath);
|
|
976
921
|
}
|
|
922
|
+
registerCommand(program, def, action);
|
|
977
923
|
}
|
|
978
|
-
program.command("agent").alias("agent:setup").description("Configure MCP server for all AI agents (Cursor, Claude Code, Gemini, Claude Desktop)").option("-d, --dry-run", "Preview changes without applying").action(async (commanderOptions) => {
|
|
979
|
-
const options = extractCommonOptions(commanderOptions);
|
|
980
|
-
const { main } = await import("./commands/agent-setup.js");
|
|
981
|
-
await main(options);
|
|
982
|
-
});
|
|
983
924
|
function preprocessArgs(rawArgs) {
|
|
984
925
|
if (rawArgs.length === 0) return rawArgs;
|
|
985
926
|
const firstArg = rawArgs[0];
|
package/dist/index.js
CHANGED
|
@@ -18885,6 +18885,14 @@ function generateCleanPackageJson(functionsDir) {
|
|
|
18885
18885
|
}
|
|
18886
18886
|
const cleanPackageJson = { ...packageJson };
|
|
18887
18887
|
if (cleanPackageJson.dependencies) {
|
|
18888
|
+
const removedDeps = Object.entries(cleanPackageJson.dependencies).filter(
|
|
18889
|
+
([, version]) => String(version).startsWith("file:") || String(version).startsWith("workspace:")
|
|
18890
|
+
);
|
|
18891
|
+
if (removedDeps.length > 0) {
|
|
18892
|
+
log.warn(
|
|
18893
|
+
`Filtering out ${removedDeps.length} workspace/file dep(s) from dependencies: ${removedDeps.map(([name]) => name).join(", ")}`
|
|
18894
|
+
);
|
|
18895
|
+
}
|
|
18888
18896
|
cleanPackageJson.dependencies = Object.fromEntries(
|
|
18889
18897
|
Object.entries(cleanPackageJson.dependencies).filter(
|
|
18890
18898
|
([, version]) => !String(version).startsWith("file:") && !String(version).startsWith("workspace:")
|
|
@@ -18892,6 +18900,16 @@ function generateCleanPackageJson(functionsDir) {
|
|
|
18892
18900
|
);
|
|
18893
18901
|
}
|
|
18894
18902
|
if (cleanPackageJson.devDependencies) {
|
|
18903
|
+
const removedDevDeps = Object.entries(
|
|
18904
|
+
cleanPackageJson.devDependencies
|
|
18905
|
+
).filter(
|
|
18906
|
+
([, version]) => String(version).startsWith("file:") || String(version).startsWith("workspace:")
|
|
18907
|
+
);
|
|
18908
|
+
if (removedDevDeps.length > 0) {
|
|
18909
|
+
log.warn(
|
|
18910
|
+
`Filtering out ${removedDevDeps.length} workspace/file dep(s) from devDependencies: ${removedDevDeps.map(([name]) => name).join(", ")}`
|
|
18911
|
+
);
|
|
18912
|
+
}
|
|
18895
18913
|
cleanPackageJson.devDependencies = Object.fromEntries(
|
|
18896
18914
|
Object.entries(cleanPackageJson.devDependencies).filter(
|
|
18897
18915
|
([, version]) => !String(version).startsWith("file:") && !String(version).startsWith("workspace:")
|
|
@@ -20493,7 +20511,7 @@ async function createApp(appName, appConfig, workspaceRoot, templatesRoot) {
|
|
|
20493
20511
|
const firebaseJson = readSync(firebaseJsonDest, {
|
|
20494
20512
|
format: "json"
|
|
20495
20513
|
});
|
|
20496
|
-
if (firebaseJson.hosting?.rewrites) {
|
|
20514
|
+
if (firebaseJson.hosting?.rewrites && Array.isArray(firebaseJson.hosting.rewrites)) {
|
|
20497
20515
|
firebaseJson.hosting.rewrites = firebaseJson.hosting.rewrites.filter(
|
|
20498
20516
|
(r2) => r2.destination !== "/index.html"
|
|
20499
20517
|
);
|
|
@@ -20781,6 +20799,14 @@ async function main9(options) {
|
|
|
20781
20799
|
process.exit(0);
|
|
20782
20800
|
}
|
|
20783
20801
|
if (action === "replace") {
|
|
20802
|
+
const confirmDelete = await askForConfirmation(
|
|
20803
|
+
`This will permanently delete "${projectDirNormalized}". Are you sure?`,
|
|
20804
|
+
false
|
|
20805
|
+
);
|
|
20806
|
+
if (!confirmDelete) {
|
|
20807
|
+
Se("Project creation cancelled.");
|
|
20808
|
+
process.exit(0);
|
|
20809
|
+
}
|
|
20784
20810
|
const s2 = Y2();
|
|
20785
20811
|
s2.start("Removing existing project...");
|
|
20786
20812
|
await remove(projectDirNormalized);
|
|
@@ -21139,7 +21165,10 @@ async function main9(options) {
|
|
|
21139
21165
|
await createApp(appName, appConfig, projectDirNormalized, templatesRoot);
|
|
21140
21166
|
}
|
|
21141
21167
|
s.start("Updating root package.json with scripts...");
|
|
21142
|
-
await updateRootPackageJson(
|
|
21168
|
+
await updateRootPackageJson(
|
|
21169
|
+
projectDirNormalized,
|
|
21170
|
+
isMergeMode ? allAppNames : appNames
|
|
21171
|
+
);
|
|
21143
21172
|
s.stop("Root package.json updated");
|
|
21144
21173
|
Se("\u{1F389} Project created successfully!");
|
|
21145
21174
|
const cdCommand = executionMode === "development" ? `cd ../${projectName}` : `cd ${projectName}`;
|
package/package.json
CHANGED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" xmlns:v="https://vecta.io/nano"><path d="M11.995 68.133c-.747.14-2.114 1.276-2.986 2.409l-1.557 2.199-.062 104.273.684 251.717c.935 2.835 3.423 4.749 6.347 4.89 2.366.142 3.61-.566 10.767-5.599l42.311-30.054L112.3 366.14l16.366-11.768c3.234-2.268 6.098-4.749 6.346-5.599 1.369-3.828 9.271-32.679 9.023-32.891-.124-.213-1.743.78-3.547 2.198-1.803 1.347-8.773 6.309-15.432 10.916L87.1 355.862l-24.891 17.65-23.831 16.729c-5.413 3.898-10.143 7.017-10.454 7.017-.685 0-.809-291.837-.063-292.334.249-.141 1.619.497 3.049 1.559l51.521 37.711 18.668 13.61 20.222 14.674 13.69 9.996 9.333 6.734 12.756 9.215c10.455 7.798 15.992 11.767 16.553 11.908.374.073 1.99-4.889 3.609-11.058l3.048-11.202-5.537-4.038-10.641-7.799c-2.863-1.984-10.391-7.584-16.8-12.405l-23.21-17.154-20.721-15.24L89.4 121.157c-2.613-1.986-7.653-5.671-11.2-8.223L23.506 73.096c-6.471-4.679-8.774-5.671-11.512-4.962l.001-.001zm235.829 4.466c-1.057.708-2.302 2.055-2.737 2.977-.622 1.276-.809 14.673-.746 62.733l.062 61.104 4.915 8.01 10.206 16.871 5.225 8.861.187-62.308 1.057-61.812c.56.212 6.098 4.111 12.321 8.648l43.806 31.97c1.307.991 1.431.708 5.973-9.641l4.667-10.705-1.618-1.346-14.747-10.845-20.844-15.313-36.65-26.864c-5.788-4.182-7.841-4.608-11.077-2.34zm-34.784 196.85l-7.279 15.807-11.511 25.166c.123.141 5.351-3.474 11.697-7.939l18.356-13.042 8.027-5.813c1.057-.922.685-1.701-6.347-13.469l-7.466-12.546-5.477 11.838v-.002z" fill="var(--primary,#dc143c)"/><path d="M376.752 57.145l-4.977 11.2c-1.432 2.907-4.792 10.066-7.468 15.95l-9.955 21.619-25.388 54.583-11.2 24.101-20.658 43.949-11.7 24.81-7.84 16.304c-.809 1.347-.621 1.631-15.679-23.747l-26.072-43.949-22.213-37.71c-8.587-14.815-10.267-16.73-12.322-14.319-.435.566-2.676 8.009-4.978 16.586l-22.711 82.228-13.378 47.494-8.153 29.064-18.232 64.86-12.133 43.382-4.355 16.162c.186 0 3.671-7.443 14.871-31.898l10.578-22.684 8.088-17.013 8.774-18.43 9.771-20.556 7.901-16.659 9.333-19.848 9.957-21.267 10.765-23.038c6.844-14.957 9.397-20.061 10.08-20.273.374-.142 3.485 4.606 6.968 10.562l24.828 41.255 31.981 52.809c5.289 8.932 6.846 11.06 8.153 11.2.87.142 1.929-.212 2.302-.779.685-.851 19.6-65.499 44.054-150.421l25.823-88.889 17.798-62.168c-.125-.141-1.308 2.34-2.615 5.53h.002z" fill="var(--accent,#ffd700)"/><path d="M359.081 153.904l-3.111 11.555c-1.369 4.89-2.302 9.074-2.053 9.287s5.041 3.757 10.703 7.869l33.289 24.314 37.645 27.505 19.601 14.318 6.409 4.536c2.489 1.49 5.538-.991-32.542 26.369l-38.269 27.432-31.236 22.402-33.913 24.456-28.187 20.273-12.134 8.648c-10.019 7.16-19.413 13.681-19.848 13.681-.188 0-.374-14.248-.374-31.757v-31.686l-4.419-7.088-10.019-16.518c-3.111-5.102-5.849-9.356-6.098-9.356s-.375 11.909-.249 26.37l.249 64.223v37.711l2.054 2.623c1.866 2.268 2.489 2.553 4.914 2.553 3.237 0 4.169-.568 18.855-11.202l76.535-55.291 21.78-15.807 120.403-86.411c3.67-2.552 5.102-4.748 5.475-8.434.188-2.409 0-3.971-.746-5.599-1.244-2.623-2.677-3.686-48.908-37.711l-51.023-37.642-14.624-10.774-12.88-9.427c-2.986-2.199-5.724-4.041-6.035-4.041-.374 0-.934 1.206-1.245 2.622l.001-.003z" fill="var(--primary,#dc143c)"/></svg>
|
|
Binary file
|
|
Binary file
|
|
@@ -26,5 +26,7 @@ import { appConfig } from './config/app';
|
|
|
26
26
|
* @author AMBROISE PARK Consulting
|
|
27
27
|
*/
|
|
28
28
|
export function App() {
|
|
29
|
-
return
|
|
29
|
+
return (
|
|
30
|
+
<ViteAppProviders config={appConfig} layout={{ breadcrumbs: 'smart' }} />
|
|
31
|
+
);
|
|
30
32
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// apps/demo/src/entities/booking.ts
|
|
2
|
+
|
|
3
|
+
import { defineEntity, when } from '@donotdev/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Booking entity — demonstrates complex conditional logic.
|
|
7
|
+
*
|
|
8
|
+
* - groupSize: visible only for group bookings
|
|
9
|
+
* - companyName: visible only for corporate bookings
|
|
10
|
+
* - invoiceAddress: visible for corporate OR group with 10+ people
|
|
11
|
+
*/
|
|
12
|
+
export const bookingEntity = defineEntity({
|
|
13
|
+
name: 'Booking',
|
|
14
|
+
collection: 'bookings',
|
|
15
|
+
fields: {
|
|
16
|
+
bookingType: {
|
|
17
|
+
name: 'bookingType',
|
|
18
|
+
type: 'select',
|
|
19
|
+
label: 'Booking Type',
|
|
20
|
+
visibility: 'user',
|
|
21
|
+
validation: {
|
|
22
|
+
required: true,
|
|
23
|
+
options: [
|
|
24
|
+
{ value: 'individual', label: 'Individual' },
|
|
25
|
+
{ value: 'group', label: 'Group (5+)' },
|
|
26
|
+
{ value: 'corporate', label: 'Corporate' },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
groupSize: {
|
|
31
|
+
name: 'groupSize',
|
|
32
|
+
type: 'number',
|
|
33
|
+
label: 'Number of People',
|
|
34
|
+
visibility: 'user',
|
|
35
|
+
conditions: {
|
|
36
|
+
visible: when('bookingType').equals('group'),
|
|
37
|
+
required: when('bookingType').equals('group'),
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
companyName: {
|
|
41
|
+
name: 'companyName',
|
|
42
|
+
type: 'text',
|
|
43
|
+
label: 'Company Name',
|
|
44
|
+
visibility: 'user',
|
|
45
|
+
conditions: {
|
|
46
|
+
visible: when('bookingType').equals('corporate'),
|
|
47
|
+
required: when('bookingType').equals('corporate'),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
invoiceAddress: {
|
|
51
|
+
name: 'invoiceAddress',
|
|
52
|
+
type: 'address',
|
|
53
|
+
label: 'Invoice Address',
|
|
54
|
+
visibility: 'user',
|
|
55
|
+
conditions: {
|
|
56
|
+
visible: when('bookingType')
|
|
57
|
+
.equals('corporate')
|
|
58
|
+
.or(when('groupSize').greaterThan(10)),
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
date: {
|
|
62
|
+
name: 'date',
|
|
63
|
+
type: 'date',
|
|
64
|
+
label: 'Booking Date',
|
|
65
|
+
visibility: 'user',
|
|
66
|
+
validation: { required: true },
|
|
67
|
+
},
|
|
68
|
+
notes: {
|
|
69
|
+
name: 'notes',
|
|
70
|
+
type: 'textarea',
|
|
71
|
+
label: 'Special Requests',
|
|
72
|
+
visibility: 'user',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
});
|