@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.
Files changed (45) hide show
  1. package/dependencies-matrix.json +135 -47
  2. package/dist/bin/commands/bump.js +5 -2
  3. package/dist/bin/commands/create-app.js +1 -1
  4. package/dist/bin/commands/create-project.js +13 -2
  5. package/dist/bin/commands/deploy.js +18 -0
  6. package/dist/bin/commands/setup.js +3 -0
  7. package/dist/bin/commands/staging.js +18 -0
  8. package/dist/bin/commands/type-check.js +10 -4
  9. package/dist/bin/dndev.js +120 -179
  10. package/dist/bin/donotdev.js +120 -179
  11. package/dist/index.js +31 -2
  12. package/package.json +1 -1
  13. package/templates/app-demo/public/apple-touch-icon.png.example +0 -0
  14. package/templates/app-demo/public/favicon.svg.example +1 -0
  15. package/templates/app-demo/public/icon-192x192.png.example +0 -0
  16. package/templates/app-demo/public/icon-512x512.png.example +0 -0
  17. package/templates/app-demo/src/App.tsx.example +3 -1
  18. package/templates/app-demo/src/config/app.ts.example +1 -0
  19. package/templates/app-demo/src/entities/booking.ts.example +75 -0
  20. package/templates/app-demo/src/entities/onboarding.ts.example +160 -0
  21. package/templates/app-demo/src/entities/product.ts.example +12 -0
  22. package/templates/app-demo/src/entities/quote.ts.example +70 -0
  23. package/templates/app-demo/src/pages/ChangelogPage.tsx.example +28 -1
  24. package/templates/app-demo/src/pages/ConditionalFormPage.tsx.example +88 -0
  25. package/templates/app-demo/src/pages/DashboardPage.tsx.example +2 -0
  26. package/templates/app-demo/src/pages/HomePage.tsx.example +355 -2
  27. package/templates/app-demo/src/pages/OnboardingPage.tsx.example +47 -0
  28. package/templates/app-demo/src/pages/PricingPage.tsx.example +28 -1
  29. package/templates/app-demo/src/pages/ProductsPage.tsx.example +2 -0
  30. package/templates/app-demo/src/pages/ProfilePage.tsx.example +2 -0
  31. package/templates/app-demo/src/pages/SettingsPage.tsx.example +2 -0
  32. package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +22 -16
  33. package/templates/app-demo/src/pages/ShowcasePage.tsx.example +3 -1
  34. package/templates/app-demo/src/pages/components/ComponentRenderer.tsx.example +147 -51
  35. package/templates/app-demo/src/pages/components/ComponentsData.tsx.example +103 -21
  36. package/templates/app-demo/src/pages/components/componentConfig.ts.example +139 -59
  37. package/templates/app-demo/src/pages/legal/LegalPage.tsx.example +12 -1
  38. package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +10 -1
  39. package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +10 -1
  40. package/templates/app-demo/src/themes.css.example +289 -77
  41. package/templates/app-demo/stats.html.example +4949 -0
  42. package/templates/app-next/src/locales/home_en.json.example +6 -6
  43. package/templates/app-vite/src/locales/home_en.json.example +6 -6
  44. package/templates/root-consumer/guides/dndev/advanced/COOKIE_REFERENCE.md.example +252 -252
  45. package/templates/root-consumer/guides/dndev/advanced/VERSION_CONTROL.md.example +174 -174
@@ -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
- var CLI_VERSION = JSON.parse(
759
- readFileSync(new URL("../../package.json", import.meta.url), "utf-8")
760
- ).version;
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 extractCommonOptions(commanderOptions) {
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.exit(await main());
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 baseName2(name) {
796
- return name.split(" ")[0] ?? name;
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": (cmd) => {
800
- cmd.option("--project <id>", "Firebase project ID (default: app name)");
801
- cmd.option("--region <region>", "Firebase region (default: europe-west1)");
802
- cmd.action(async (name, options) => {
803
- const { main } = await import("./commands/create-app.js");
804
- const appName = name || options.name;
805
- if (appName) {
806
- await main({
807
- name: appName,
808
- builder: options.builder,
809
- host: options.host,
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
- "cacheout": (cmd) => {
851
- cmd.action(async (app, commanderOptions) => {
852
- const commonOptions = extractCommonOptions(commanderOptions);
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
- "bump": (cmd) => {
860
- cmd.action(async (commanderOptions) => {
861
- const commonOptions = extractCommonOptions(commanderOptions);
862
- const options = { ...commonOptions, ...commanderOptions };
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": (cmd) => {
875
- cmd.action(async (app, commanderOptions) => {
876
- const commonOptions = extractCommonOptions(commanderOptions);
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": (cmd) => {
883
- cmd.action(async (app, commanderOptions) => {
884
- const commonOptions = extractCommonOptions(commanderOptions);
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": (cmd) => {
891
- cmd.action(async (commanderOptions) => {
892
- const commonOptions = extractCommonOptions(commanderOptions);
893
- const options = { ...commonOptions, ...commanderOptions };
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": (cmd) => {
900
- cmd.action(async (userId, commanderOptions) => {
901
- const args2 = [];
902
- if (userId) args2.push(userId);
903
- if (commanderOptions.project) args2.push(`--project=${commanderOptions.project}`);
904
- if (commanderOptions.projectId) args2.push(`--project-id=${commanderOptions.projectId}`);
905
- if (commanderOptions.super) args2.push("--super");
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
- "coach": (cmd) => {
911
- cmd.action(async (commanderOptions) => {
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": (cmd) => {
918
- cmd.action(async (provider, commanderOptions) => {
919
- const commonOptions = extractCommonOptions(commanderOptions);
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": (cmd) => {
926
- cmd.action(async (commanderOptions) => {
927
- const commonOptions = extractCommonOptions(commanderOptions);
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
- "agent:setup": (cmd) => {
934
- cmd.removeCommand?.();
935
- return "skip";
900
+ "wai": async () => {
901
+ const { main } = await import("./commands/wai.js");
902
+ process.exitCode = await main();
936
903
  },
937
- "wai": (cmd) => {
938
- cmd.action(async () => {
939
- const { main } = await import("./commands/wai.js");
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
- var publicCommands = getPublicCommands();
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
- const result = override(cmd);
964
- if (result === "skip") continue;
916
+ action = override;
965
917
  } else if (def.actionPattern === "app") {
966
- cmd.action((app) => runAppCommand(commandPath, app));
918
+ action = makeAppAction(commandPath);
967
919
  } else {
968
- cmd.action(async (...commanderArgs) => {
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(projectDirNormalized, appNames);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/cli",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "description": "Command-line interface for DoNotDev Framework",
5
5
  "type": "module",
6
6
  "private": false,
@@ -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>
@@ -26,5 +26,7 @@ import { appConfig } from './config/app';
26
26
  * @author AMBROISE PARK Consulting
27
27
  */
28
28
  export function App() {
29
- return <ViteAppProviders config={appConfig} layout={{ breadcrumbs: 'smart' }} />;
29
+ return (
30
+ <ViteAppProviders config={appConfig} layout={{ breadcrumbs: 'smart' }} />
31
+ );
30
32
  }
@@ -1,3 +1,4 @@
1
+ // apps/demo/src/config/app.ts
1
2
  /**
2
3
  * @fileoverview Application configuration
3
4
  * @description Defines application metadata, layout preset, and feature flags
@@ -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
+ });