@donotdev/cli 0.0.18 → 0.0.19

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 (131) hide show
  1. package/dependencies-matrix.json +55 -156
  2. package/dist/bin/commands/coach.js +8177 -0
  3. package/dist/bin/commands/create-app.js +5 -5
  4. package/dist/bin/commands/create-project.js +10 -7
  5. package/dist/bin/commands/deploy.js +81 -59
  6. package/dist/bin/commands/doctor.js +243 -698
  7. package/dist/bin/commands/emu.js +2 -2
  8. package/dist/bin/commands/format.js +4 -1
  9. package/dist/bin/commands/get-demo.js +8351 -0
  10. package/dist/bin/commands/make-admin.js +773 -152
  11. package/dist/bin/commands/setup.js +519 -1711
  12. package/dist/bin/commands/staging.js +17852 -0
  13. package/dist/bin/commands/sync-secrets.js +2 -11
  14. package/dist/bin/commands/type-check.js +7733 -1713
  15. package/dist/bin/dndev.js +913 -185
  16. package/dist/bin/donotdev.js +913 -185
  17. package/dist/index.js +96 -65
  18. package/package.json +1 -1
  19. package/templates/app-demo/index.html.example +147 -10
  20. package/templates/app-demo/src/App.tsx.example +7 -13
  21. package/templates/app-demo/src/config/app.ts.example +12 -48
  22. package/templates/app-demo/src/entities/product.ts.example +38 -0
  23. package/templates/app-demo/src/globals.css.example +5 -1
  24. package/templates/app-demo/src/main.tsx.example +13 -7
  25. package/templates/app-demo/src/pages/ChangelogPage.tsx.example +14 -0
  26. package/templates/app-demo/src/pages/DashboardPage.tsx.example +15 -0
  27. package/templates/app-demo/src/pages/HomePage.tsx.example +3 -77
  28. package/templates/app-demo/src/pages/PricingPage.tsx.example +14 -0
  29. package/templates/app-demo/src/pages/ProductsPage.tsx.example +17 -0
  30. package/templates/app-demo/src/pages/ProfilePage.tsx.example +16 -0
  31. package/templates/app-demo/src/pages/SettingsPage.tsx.example +15 -0
  32. package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +112 -0
  33. package/templates/app-demo/src/pages/ShowcasePage.tsx.example +91 -0
  34. package/templates/app-demo/src/pages/legal/LegalPage.tsx.example +14 -0
  35. package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +14 -0
  36. package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +14 -0
  37. package/templates/app-demo/tsconfig.json.example +1 -1
  38. package/templates/app-demo/vite.config.ts.example +23 -48
  39. package/templates/app-expo/README.md.example +1 -1
  40. package/templates/app-expo/app/index.tsx.example +1 -1
  41. package/templates/app-vite/src/pages/HomePage.tsx.example +8 -10
  42. package/templates/overlay-firebase/env.fragment.example +1 -1
  43. package/templates/overlay-firebase/env.fragment.expo.example +1 -1
  44. package/templates/overlay-firebase/env.fragment.nextjs.example +1 -1
  45. package/templates/overlay-supabase/env.fragment.example +1 -1
  46. package/templates/overlay-supabase/env.fragment.expo.example +1 -1
  47. package/templates/overlay-supabase/env.fragment.nextjs.example +1 -1
  48. package/templates/overlay-vercel/env.fragment.example +1 -1
  49. package/templates/overlay-vercel/env.fragment.nextjs.example +1 -1
  50. package/templates/root-consumer/AI.md.example +4 -3
  51. package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +21 -6
  52. package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +16 -179
  53. package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +19 -21
  54. package/templates/root-consumer/guides/dndev/GOTCHAS.md.example +14 -3
  55. package/templates/root-consumer/guides/dndev/INDEX.md.example +2 -2
  56. package/templates/root-consumer/guides/dndev/SETUP_APP_CONFIG.md.example +3 -3
  57. package/templates/root-consumer/guides/dndev/SETUP_BLOG.md.example +19 -2
  58. package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +35 -1
  59. package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +17 -12
  60. package/templates/root-consumer/guides/dndev/SETUP_LAYOUTS.md.example +32 -0
  61. package/templates/root-consumer/guides/dndev/SETUP_OAUTH_PROVIDERS.md.example +1 -1
  62. package/templates/root-consumer/guides/dndev/SETUP_PAGES.md.example +19 -15
  63. package/templates/root-consumer/guides/dndev/SETUP_STRIPE.md.example +2 -2
  64. package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +17 -12
  65. package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +37 -16
  66. package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +18 -18
  67. package/templates/root-consumer/guides/dndev/essences_reference.css.example +119 -2
  68. package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +14 -0
  69. package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +6 -0
  70. package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +14 -0
  71. package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +4 -5
  72. package/templates/root-consumer/guides/wai-way/page_patterns.md.example +2 -2
  73. package/dist/bin/commands/agent-setup.d.ts +0 -6
  74. package/dist/bin/commands/agent-setup.d.ts.map +0 -1
  75. package/dist/bin/commands/agent-setup.js.map +0 -1
  76. package/dist/bin/commands/build.d.ts +0 -11
  77. package/dist/bin/commands/build.d.ts.map +0 -1
  78. package/dist/bin/commands/build.js.map +0 -1
  79. package/dist/bin/commands/bump.d.ts +0 -11
  80. package/dist/bin/commands/bump.d.ts.map +0 -1
  81. package/dist/bin/commands/bump.js.map +0 -1
  82. package/dist/bin/commands/cacheout.d.ts +0 -11
  83. package/dist/bin/commands/cacheout.d.ts.map +0 -1
  84. package/dist/bin/commands/cacheout.js.map +0 -1
  85. package/dist/bin/commands/create-app.d.ts +0 -11
  86. package/dist/bin/commands/create-app.d.ts.map +0 -1
  87. package/dist/bin/commands/create-app.js.map +0 -1
  88. package/dist/bin/commands/create-project.d.ts +0 -11
  89. package/dist/bin/commands/create-project.d.ts.map +0 -1
  90. package/dist/bin/commands/create-project.js.map +0 -1
  91. package/dist/bin/commands/deploy.d.ts +0 -11
  92. package/dist/bin/commands/deploy.d.ts.map +0 -1
  93. package/dist/bin/commands/deploy.js.map +0 -1
  94. package/dist/bin/commands/dev.d.ts +0 -11
  95. package/dist/bin/commands/dev.d.ts.map +0 -1
  96. package/dist/bin/commands/dev.js.map +0 -1
  97. package/dist/bin/commands/doctor.d.ts +0 -6
  98. package/dist/bin/commands/doctor.d.ts.map +0 -1
  99. package/dist/bin/commands/doctor.js.map +0 -1
  100. package/dist/bin/commands/emu.d.ts +0 -11
  101. package/dist/bin/commands/emu.d.ts.map +0 -1
  102. package/dist/bin/commands/emu.js.map +0 -1
  103. package/dist/bin/commands/format.d.ts +0 -11
  104. package/dist/bin/commands/format.d.ts.map +0 -1
  105. package/dist/bin/commands/format.js.map +0 -1
  106. package/dist/bin/commands/make-admin.d.ts +0 -11
  107. package/dist/bin/commands/make-admin.d.ts.map +0 -1
  108. package/dist/bin/commands/make-admin.js.map +0 -1
  109. package/dist/bin/commands/preview.d.ts +0 -11
  110. package/dist/bin/commands/preview.d.ts.map +0 -1
  111. package/dist/bin/commands/preview.js.map +0 -1
  112. package/dist/bin/commands/setup.d.ts +0 -6
  113. package/dist/bin/commands/setup.d.ts.map +0 -1
  114. package/dist/bin/commands/setup.js.map +0 -1
  115. package/dist/bin/commands/sync-secrets.d.ts +0 -11
  116. package/dist/bin/commands/sync-secrets.d.ts.map +0 -1
  117. package/dist/bin/commands/sync-secrets.js.map +0 -1
  118. package/dist/bin/commands/type-check.d.ts +0 -14
  119. package/dist/bin/commands/type-check.d.ts.map +0 -1
  120. package/dist/bin/commands/type-check.js.map +0 -1
  121. package/dist/bin/commands/wai.d.ts +0 -11
  122. package/dist/bin/commands/wai.d.ts.map +0 -1
  123. package/dist/bin/commands/wai.js.map +0 -1
  124. package/dist/index.d.ts +0 -8
  125. package/dist/index.d.ts.map +0 -1
  126. package/dist/index.js.map +0 -1
  127. package/templates/app-demo/src/components/ThemeToggle.tsx.example +0 -48
  128. package/templates/app-demo/src/pages/DetailPage.tsx.example +0 -103
  129. package/templates/app-demo/src/pages/FullPage.tsx.example +0 -142
  130. package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +0 -266
  131. package/templates/app-demo/src/pages/components/LayoutRoute.tsx.example +0 -20
@@ -1,11 +1,24 @@
1
1
  // apps/demo/src/main.tsx
2
2
 
3
+ /**
4
+ * @fileoverview Demo application entry point
5
+ * @description Main entry point for the DoNotDev framework demo application
6
+ *
7
+ * Initializes React with StrictMode for development safety.
8
+ * Shell loader management is handled by BaseStoresInitializer for optimal timing.
9
+ *
10
+ * @version 0.0.1
11
+ * @since 0.0.1
12
+ * @author AMBROISE PARK Consulting
13
+ */
14
+
3
15
  import './globals.css';
4
16
  import React from 'react';
5
17
  import ReactDOM from 'react-dom/client';
6
18
 
7
19
  import { App } from './App';
8
20
 
21
+ // Ensure the root element exists
9
22
  const rootElement = document.getElementById('root');
10
23
  if (!rootElement) {
11
24
  throw new Error(
@@ -13,13 +26,6 @@ if (!rootElement) {
13
26
  );
14
27
  }
15
28
 
16
- // Remove shell loader (fade out then remove)
17
- const shellLoader = document.getElementById('shell-loader');
18
- if (shellLoader) {
19
- shellLoader.classList.add('shell-loader--fading');
20
- window.setTimeout(() => shellLoader.remove(), 300);
21
- }
22
-
23
29
  ReactDOM.createRoot(rootElement).render(
24
30
  <React.StrictMode>
25
31
  <App />
@@ -0,0 +1,14 @@
1
+ import { History } from 'lucide-react';
2
+
3
+ import { WhatsNewTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <History />,
9
+ preset: 'docs',
10
+ };
11
+
12
+ export default function ChangelogPage() {
13
+ return <WhatsNewTemplate />;
14
+ }
@@ -0,0 +1,15 @@
1
+ import { LayoutDashboard } from 'lucide-react';
2
+
3
+ import { DashboardTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <LayoutDashboard />,
9
+ auth: true,
10
+ preset: 'admin',
11
+ };
12
+
13
+ export default function DashboardPage() {
14
+ return <DashboardTemplate />;
15
+ }
@@ -1,79 +1,5 @@
1
- // apps/demo/src/pages/HomePage.tsx
2
-
3
- import { useMemo } from 'react';
4
- import { useNavigate, useOutletContext } from 'react-router-dom';
5
-
6
- import {
7
- Badge,
8
- Card,
9
- Grid,
10
- Section,
11
- Stack,
12
- } from '@donotdev/components';
13
-
14
- import {
15
- COMPONENT_CONFIGS,
16
- getCSSFamilies,
17
- } from './components/componentConfig';
18
- import type { CSSFamily } from './components/ComponentsData';
19
-
20
- type LayoutContext = {
21
- selectedTab: CSSFamily | 'all';
22
- searchQuery: string;
23
- };
1
+ import { HomeTemplate } from '@donotdev/templates';
24
2
 
25
3
  export default function HomePage() {
26
- const navigate = useNavigate();
27
- const {
28
- selectedTab,
29
- searchQuery,
30
- } = useOutletContext<LayoutContext>();
31
-
32
- const componentsInTab = useMemo(() => {
33
- return COMPONENT_CONFIGS.filter((config) => {
34
- if (selectedTab !== 'all' && config.cssFamily !== selectedTab)
35
- return false;
36
-
37
- const matchesSearch =
38
- searchQuery === '' ||
39
- config.name.toLowerCase().includes(searchQuery.toLowerCase());
40
-
41
- return matchesSearch;
42
- }).sort((a, b) => a.name.localeCompare(b.name));
43
- }, [selectedTab, searchQuery]);
44
-
45
- const cssFamilies = getCSSFamilies();
46
-
47
- return (
48
- <Section
49
- title={
50
- cssFamilies.find((f) => f.id === selectedTab)?.label ||
51
- 'Components'
52
- }
53
- subtitle={`${componentsInTab.length} components`}
54
- >
55
- <Grid cols="auto-fit" minColWidth="240px">
56
- {componentsInTab.map((config) => {
57
- const isFullPageComponent = config.cssFamily === 'layout';
58
- return (
59
- <Card
60
- key={config.id}
61
- title={config.name}
62
- onClick={() =>
63
- isFullPageComponent
64
- ? navigate('/full')
65
- : navigate(`/component/${config.id}`)
66
- }
67
- >
68
- <Stack direction="row" justify="end">
69
- <Badge variant="secondary">
70
- {cssFamilies.find((f) => f.id === config.cssFamily)?.label || config.cssFamily}
71
- </Badge>
72
- </Stack>
73
- </Card>
74
- );
75
- })}
76
- </Grid>
77
- </Section>
78
- );
79
- }
4
+ return <HomeTemplate />;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { CreditCard } from 'lucide-react';
2
+
3
+ import { SubscriptionTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <CreditCard />,
9
+ hideFromMenu: true,
10
+ };
11
+
12
+ export default function PricingPage() {
13
+ return <SubscriptionTemplate />;
14
+ }
@@ -0,0 +1,17 @@
1
+ import { Package } from 'lucide-react';
2
+
3
+ import { ProductCardListTemplate } from '@donotdev/templates';
4
+
5
+ import { productEntity } from '../entities/product';
6
+
7
+ import type { PageMeta } from '@donotdev/core';
8
+
9
+ export const meta: PageMeta = {
10
+ icon: <Package />,
11
+ auth: true,
12
+ preset: 'admin',
13
+ };
14
+
15
+ export default function ProductsPage() {
16
+ return <ProductCardListTemplate entity={productEntity} />;
17
+ }
@@ -0,0 +1,16 @@
1
+ import { User } from 'lucide-react';
2
+
3
+ import { ProfileTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <User />,
9
+ auth: true,
10
+ preset: 'admin',
11
+ hideFromMenu: true,
12
+ };
13
+
14
+ export default function ProfilePage() {
15
+ return <ProfileTemplate billingPath="/pricing" />;
16
+ }
@@ -0,0 +1,15 @@
1
+ import { Settings } from 'lucide-react';
2
+
3
+ import { SettingsTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <Settings />,
9
+ auth: true,
10
+ preset: 'admin',
11
+ };
12
+
13
+ export default function SettingsPage() {
14
+ return <SettingsTemplate />;
15
+ }
@@ -0,0 +1,112 @@
1
+ import { useMemo } from 'react';
2
+ import { useParams, Navigate } from 'react-router-dom';
3
+
4
+ import {
5
+ Badge,
6
+ Grid,
7
+ Stack,
8
+ Text,
9
+ } from '@donotdev/components';
10
+ import { PageContainer } from '@donotdev/ui';
11
+
12
+ import {
13
+ COMPONENT_CONFIGS,
14
+ getCSSFamilies,
15
+ } from './components/componentConfig';
16
+ import { ComponentRenderer } from './components/ComponentRenderer';
17
+
18
+ import type { PageMeta } from '@donotdev/core';
19
+ import type { ComponentConfig } from './components/componentConfig';
20
+
21
+ export const meta: PageMeta = {
22
+ route: { params: ['id'] },
23
+ hideFromMenu: true,
24
+ preset: 'admin',
25
+ };
26
+
27
+ export default function ShowcaseDetailPage() {
28
+ const { id } = useParams<{ id: string }>();
29
+
30
+ const config = useMemo(() => {
31
+ return COMPONENT_CONFIGS.find((c) => c.id === id);
32
+ }, [id]);
33
+
34
+ const cssFamilies = getCSSFamilies();
35
+
36
+ if (!config) {
37
+ return <Navigate to="/showcase" replace />;
38
+ }
39
+
40
+ const generateVariants = (
41
+ config: ComponentConfig
42
+ ): Array<Record<string, any>> => {
43
+ const variants: Array<Record<string, any>> = [{}];
44
+
45
+ const dimensions = ['variant', 'size', 'tone', 'type', 'side', 'mode'] as const;
46
+
47
+ dimensions.forEach((dim) => {
48
+ const values = config.variants[dim];
49
+ if (values?.length) {
50
+ const newVariants: Array<Record<string, any>> = [];
51
+ variants.forEach((base) => {
52
+ values.forEach((value) => {
53
+ newVariants.push({ ...base, [dim]: value });
54
+ });
55
+ });
56
+ variants.length = 0;
57
+ variants.push(...newVariants);
58
+ }
59
+ });
60
+
61
+ return variants.length > 0 ? variants : [{}];
62
+ };
63
+
64
+ const allVariants = generateVariants(config);
65
+
66
+ return (
67
+ <PageContainer>
68
+ <Stack gap="large" align="center">
69
+ <Stack gap="tight" align="center">
70
+ <Text level="h2">{config.name}</Text>
71
+ <Badge variant="outline">
72
+ {cssFamilies.find((f) => f.id === config.cssFamily)?.label ||
73
+ config.cssFamily}
74
+ </Badge>
75
+ </Stack>
76
+
77
+ <Grid cols="auto-fit" minColWidth="320px" gap="large">
78
+ {allVariants.map((variantProps, idx) => {
79
+ const variantLabels = Object.entries(variantProps)
80
+ .filter(([_, v]) => v)
81
+ .map(([k, v]) => `${k}: ${v}`);
82
+
83
+ return (
84
+ <Stack key={idx} align="center">
85
+ {variantLabels.length > 0 && (
86
+ <Stack
87
+ direction="row"
88
+ gap="tight"
89
+ wrap="wrap"
90
+ justify="center"
91
+ >
92
+ {variantLabels.map((label) => (
93
+ <Badge key={label} variant="secondary">
94
+ {label}
95
+ </Badge>
96
+ ))}
97
+ </Stack>
98
+ )}
99
+ <Stack align="center" justify="center">
100
+ <ComponentRenderer
101
+ config={config}
102
+ variantProps={variantProps}
103
+ />
104
+ </Stack>
105
+ </Stack>
106
+ );
107
+ })}
108
+ </Grid>
109
+ </Stack>
110
+ </PageContainer>
111
+ );
112
+ }
@@ -0,0 +1,91 @@
1
+ import { useMemo, useState } from 'react';
2
+ import { useNavigate } from 'react-router-dom';
3
+ import { Component } from 'lucide-react';
4
+
5
+ import {
6
+ Badge,
7
+ Card,
8
+ Grid,
9
+ Input,
10
+ Section,
11
+ Stack,
12
+ Tabs,
13
+ } from '@donotdev/components';
14
+
15
+ import {
16
+ COMPONENT_CONFIGS,
17
+ getCSSFamilies,
18
+ } from './components/componentConfig';
19
+
20
+ import type { PageMeta } from '@donotdev/core';
21
+ import type { CSSFamily } from './components/ComponentsData';
22
+
23
+ export const meta: PageMeta = {
24
+ icon: <Component />,
25
+ preset: 'admin',
26
+ };
27
+
28
+ export default function ShowcasePage() {
29
+ const navigate = useNavigate();
30
+ const [selectedTab, setSelectedTab] = useState<CSSFamily | 'all'>('all');
31
+ const [searchQuery, setSearchQuery] = useState('');
32
+
33
+ const componentsInTab = useMemo(() => {
34
+ return COMPONENT_CONFIGS.filter((config) => {
35
+ if (selectedTab !== 'all' && config.cssFamily !== selectedTab)
36
+ return false;
37
+ return (
38
+ searchQuery === '' ||
39
+ config.name.toLowerCase().includes(searchQuery.toLowerCase())
40
+ );
41
+ }).sort((a, b) => a.name.localeCompare(b.name));
42
+ }, [selectedTab, searchQuery]);
43
+
44
+ const cssFamilies = getCSSFamilies();
45
+
46
+ return (
47
+ <Stack gap="large">
48
+ <Stack direction="row" gap="medium" align="end" wrap="wrap">
49
+ <Input
50
+ placeholder="Filter components..."
51
+ value={searchQuery}
52
+ onChange={(e) => setSearchQuery(e.target.value)}
53
+ />
54
+ </Stack>
55
+
56
+ <Tabs
57
+ items={cssFamilies.map((family) => ({
58
+ value: family.id,
59
+ label: family.label,
60
+ content: null,
61
+ }))}
62
+ value={selectedTab}
63
+ onValueChange={(value) => setSelectedTab(value as CSSFamily | 'all')}
64
+ />
65
+
66
+ <Section
67
+ title={
68
+ cssFamilies.find((f) => f.id === selectedTab)?.label || 'Components'
69
+ }
70
+ >
71
+ <Grid cols={[1, 2, 3, 4]} gap="medium">
72
+ {componentsInTab.map((config) => (
73
+ <Card
74
+ key={config.id}
75
+ title={config.name}
76
+ clickable
77
+ onClick={() => navigate(`/showcase/${config.id}`)}
78
+ >
79
+ <Stack direction="row" justify="end">
80
+ <Badge variant="secondary">
81
+ {cssFamilies.find((f) => f.id === config.cssFamily)?.label ||
82
+ config.cssFamily}
83
+ </Badge>
84
+ </Stack>
85
+ </Card>
86
+ ))}
87
+ </Grid>
88
+ </Section>
89
+ </Stack>
90
+ );
91
+ }
@@ -0,0 +1,14 @@
1
+ import { Scale } from 'lucide-react';
2
+
3
+ import { LegalNoticeTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <Scale />,
9
+ hideFromMenu: true,
10
+ };
11
+
12
+ export default function LegalPage() {
13
+ return <LegalNoticeTemplate />;
14
+ }
@@ -0,0 +1,14 @@
1
+ import { Shield } from 'lucide-react';
2
+
3
+ import { PrivacyPolicyTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <Shield />,
9
+ hideFromMenu: true,
10
+ };
11
+
12
+ export default function PrivacyPage() {
13
+ return <PrivacyPolicyTemplate />;
14
+ }
@@ -0,0 +1,14 @@
1
+ import { FileText } from 'lucide-react';
2
+
3
+ import { TermsOfServiceTemplate } from '@donotdev/templates';
4
+
5
+ import type { PageMeta } from '@donotdev/core';
6
+
7
+ export const meta: PageMeta = {
8
+ icon: <FileText />,
9
+ hideFromMenu: true,
10
+ };
11
+
12
+ export default function TermsPage() {
13
+ return <TermsOfServiceTemplate />;
14
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../tsconfig.json",
2
+ "extends": "../../tsconfig.vite.json",
3
3
  "compilerOptions": {
4
4
  "baseUrl": ".",
5
5
  "types": ["node", "vite/client"]
@@ -1,53 +1,28 @@
1
1
  // apps/demo/vite.config.ts
2
- import react from '@vitejs/plugin-react';
3
- import { defineConfig } from 'vite';
4
- import tsconfigPaths from 'vite-tsconfig-paths';
5
- import autoprefixer from 'autoprefixer';
6
- // @ts-expect-error - postcss-import doesn't have type definitions
7
- import postcssImport from 'postcss-import';
8
- import postcssNesting from 'postcss-nesting';
9
- import { resolve as pathResolve } from 'node:path';
10
- import { createRequire } from 'node:module';
11
2
 
12
- const require = createRequire(import.meta.url);
3
+ /**
4
+ * @fileoverview Vite build configuration for the demo app
5
+ * @description Configures Vite build tool with application settings, development server, HMR, and file watching options for the demo application.
6
+ * @version 0.0.1
7
+ * @since 0.0.1
8
+ * @author AMBROISE PARK Consulting
9
+ */
13
10
 
14
- export default defineConfig({
15
- plugins: [
16
- react({
17
- jsxRuntime: 'automatic',
18
- }),
19
- tsconfigPaths({
20
- ignoreConfigErrors: true,
21
- }),
22
- ],
23
- css: {
24
- postcss: {
25
- plugins: [
26
- postcssImport({
27
- resolve: (id: string, basedir: string) => {
28
- // Handle package imports like '@donotdev/components/styles'
29
- if (!id.startsWith('.')) {
30
- try {
31
- return require.resolve(id, { paths: [basedir] });
32
- } catch {
33
- // Fallback to relative resolution
34
- return pathResolve(basedir, id);
35
- }
36
- }
37
- // Relative imports
38
- return pathResolve(basedir, id);
39
- },
40
- }),
41
- postcssNesting,
42
- autoprefixer,
43
- ],
11
+ import { defineViteConfig } from '@donotdev/core/vite';
12
+
13
+ import { appConfig } from './src/config/app';
14
+
15
+ // Features and SEO are now in app.ts (runtime config)
16
+ // Only build-time configs (routes, themes, i18n, assets) go here
17
+ export default defineViteConfig({
18
+ appConfig,
19
+ server: {
20
+ port: 3003,
21
+ https: false,
22
+
23
+ // HMR Configuration - Enabled for debugging
24
+ hmr: {
25
+ overlay: true, // Show error overlay in browser
44
26
  },
45
27
  },
46
- optimizeDeps: {
47
- include: ['react', 'react-dom', 'react/jsx-runtime'],
48
- },
49
- resolve: {
50
- dedupe: ['react', 'react-dom'],
51
- preserveSymlinks: false,
52
- },
53
- });
28
+ });
@@ -8,7 +8,7 @@ Mobile app built with DoNotDev Framework and Expo.
8
8
 
9
9
  - Node.js 20+ and Bun 1.3+
10
10
  - Expo Go app on your phone (for development)
11
- - Firebase project (run `dndev setup firebase`)
11
+ - Provider configured (run `dndev coach` then `dndev setup`)
12
12
 
13
13
  ### Development
14
14
 
@@ -33,7 +33,7 @@ export default function HomePage() {
33
33
  <View>
34
34
  <Text level="h3">1. Backend Setup</Text>
35
35
  <Text level="small">
36
- Run: dndev setup
36
+ Run: dndev coach → fill .env → dndev setup
37
37
  </Text>
38
38
  </View>
39
39
 
@@ -51,17 +51,15 @@ export default function HomePage() {
51
51
  />
52
52
 
53
53
  <Card
54
- title="2. Firebase Setup"
54
+ title="2. Provider Setup"
55
55
  content={[
56
- 'Run: dndev setup firebase',
57
- 'This will:',
58
- ' - Create or select a Firebase project',
59
- ' - Create a web app if needed',
60
- ' - Write Firebase config to your .env automatically',
61
- ' - Update .firebaserc with your project ID',
62
- 'Then follow the prompts for the 2 manual steps:',
63
- ' - Download service account key',
64
- ' - Enable Auth + Firestore in Firebase Console',
56
+ 'Run: dndev coach',
57
+ 'This shows what to configure:',
58
+ ' - Which dashboard to visit',
59
+ ' - What to copy and where to paste it',
60
+ 'Fill in your .env values, then run:',
61
+ ' dndev setup',
62
+ 'Setup validates, automates, and health-checks.',
65
63
  ]}
66
64
  />
67
65
  </Grid>
@@ -3,7 +3,7 @@
3
3
  # Firebase Configuration
4
4
  # =============================================================================
5
5
  # Get these values from your Firebase project settings
6
- # Run `dndev setup firebase` to auto-populate, or copy from Firebase Console
6
+ # Run `dndev coach` to see where to get these, then `dndev setup` to validate
7
7
  VITE_FIREBASE_API_KEY=
8
8
  VITE_FIREBASE_PROJECT_ID=
9
9
  # Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
@@ -3,7 +3,7 @@
3
3
  # Firebase Configuration
4
4
  # =============================================================================
5
5
  # Get these values from your Firebase project settings
6
- # Run `dndev setup firebase` to auto-populate, or copy from Firebase Console
6
+ # Run `dndev coach` to see where to get these, then `dndev setup` to validate
7
7
  EXPO_PUBLIC_FIREBASE_API_KEY=
8
8
  EXPO_PUBLIC_FIREBASE_PROJECT_ID=
9
9
  # Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
@@ -3,7 +3,7 @@
3
3
  # Firebase Configuration
4
4
  # =============================================================================
5
5
  # Get these values from your Firebase project settings
6
- # Run `dndev setup firebase` to auto-populate, or copy from Firebase Console
6
+ # Run `dndev coach` to see where to get these, then `dndev setup` to validate
7
7
  NEXT_PUBLIC_FIREBASE_API_KEY=
8
8
  NEXT_PUBLIC_FIREBASE_PROJECT_ID=
9
9
  # Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
@@ -6,7 +6,7 @@
6
6
  # - Project URL: the https://xxx.supabase.co URL
7
7
  # - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
8
8
  #
9
- # Then run: dndev setup supabase
9
+ # Then run: dndev setup
10
10
  # =============================================================================
11
11
  VITE_SUPABASE_URL=
12
12
  VITE_SUPABASE_PUBLIC_KEY=
@@ -6,7 +6,7 @@
6
6
  # - Project URL: the https://xxx.supabase.co URL
7
7
  # - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
8
8
  #
9
- # Then run: dndev setup supabase
9
+ # Then run: dndev setup
10
10
  # =============================================================================
11
11
  EXPO_PUBLIC_SUPABASE_URL=
12
12
  EXPO_PUBLIC_SUPABASE_PUBLIC_KEY=
@@ -6,7 +6,7 @@
6
6
  # - Project URL: the https://xxx.supabase.co URL
7
7
  # - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
8
8
  #
9
- # Then run: dndev setup supabase
9
+ # Then run: dndev setup
10
10
  # =============================================================================
11
11
  NEXT_PUBLIC_SUPABASE_URL=
12
12
  NEXT_PUBLIC_SUPABASE_PUBLIC_KEY=