forge-admin 0.0.0

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/README.md +73 -0
  2. package/app.db +0 -0
  3. package/components.json +20 -0
  4. package/dist/assets/index-BPVmexx_.css +1 -0
  5. package/dist/assets/index-BtNewH3n.js +258 -0
  6. package/dist/favicon.ico +0 -0
  7. package/dist/index.html +27 -0
  8. package/dist/placeholder.svg +1 -0
  9. package/dist/robots.txt +14 -0
  10. package/eslint.config.js +26 -0
  11. package/index.html +26 -0
  12. package/package.json +107 -0
  13. package/postcss.config.js +6 -0
  14. package/public/favicon.ico +0 -0
  15. package/public/placeholder.svg +1 -0
  16. package/public/robots.txt +14 -0
  17. package/src/App.css +42 -0
  18. package/src/App.tsx +32 -0
  19. package/src/admin/convertSchema.ts +83 -0
  20. package/src/admin/factory.ts +12 -0
  21. package/src/admin/introspecter.ts +6 -0
  22. package/src/admin/router.ts +38 -0
  23. package/src/admin/schema.ts +17 -0
  24. package/src/admin/sqlite.ts +73 -0
  25. package/src/admin/types.ts +35 -0
  26. package/src/components/AdminLayout.tsx +19 -0
  27. package/src/components/AdminSidebar.tsx +102 -0
  28. package/src/components/DataTable.tsx +166 -0
  29. package/src/components/ModelForm.tsx +221 -0
  30. package/src/components/NavLink.tsx +28 -0
  31. package/src/components/StatCard.tsx +32 -0
  32. package/src/components/ui/accordion.tsx +52 -0
  33. package/src/components/ui/alert-dialog.tsx +104 -0
  34. package/src/components/ui/alert.tsx +43 -0
  35. package/src/components/ui/aspect-ratio.tsx +5 -0
  36. package/src/components/ui/avatar.tsx +38 -0
  37. package/src/components/ui/badge.tsx +29 -0
  38. package/src/components/ui/breadcrumb.tsx +90 -0
  39. package/src/components/ui/button.tsx +47 -0
  40. package/src/components/ui/calendar.tsx +54 -0
  41. package/src/components/ui/card.tsx +43 -0
  42. package/src/components/ui/carousel.tsx +224 -0
  43. package/src/components/ui/chart.tsx +303 -0
  44. package/src/components/ui/checkbox.tsx +26 -0
  45. package/src/components/ui/collapsible.tsx +9 -0
  46. package/src/components/ui/command.tsx +132 -0
  47. package/src/components/ui/context-menu.tsx +178 -0
  48. package/src/components/ui/dialog.tsx +95 -0
  49. package/src/components/ui/drawer.tsx +87 -0
  50. package/src/components/ui/dropdown-menu.tsx +179 -0
  51. package/src/components/ui/form.tsx +129 -0
  52. package/src/components/ui/hover-card.tsx +27 -0
  53. package/src/components/ui/input-otp.tsx +61 -0
  54. package/src/components/ui/input.tsx +22 -0
  55. package/src/components/ui/label.tsx +17 -0
  56. package/src/components/ui/menubar.tsx +207 -0
  57. package/src/components/ui/navigation-menu.tsx +120 -0
  58. package/src/components/ui/pagination.tsx +81 -0
  59. package/src/components/ui/popover.tsx +29 -0
  60. package/src/components/ui/progress.tsx +23 -0
  61. package/src/components/ui/radio-group.tsx +36 -0
  62. package/src/components/ui/resizable.tsx +37 -0
  63. package/src/components/ui/scroll-area.tsx +38 -0
  64. package/src/components/ui/select.tsx +143 -0
  65. package/src/components/ui/separator.tsx +20 -0
  66. package/src/components/ui/sheet.tsx +107 -0
  67. package/src/components/ui/sidebar.tsx +637 -0
  68. package/src/components/ui/skeleton.tsx +7 -0
  69. package/src/components/ui/slider.tsx +23 -0
  70. package/src/components/ui/sonner.tsx +27 -0
  71. package/src/components/ui/switch.tsx +27 -0
  72. package/src/components/ui/table.tsx +72 -0
  73. package/src/components/ui/tabs.tsx +53 -0
  74. package/src/components/ui/textarea.tsx +21 -0
  75. package/src/components/ui/toast.tsx +111 -0
  76. package/src/components/ui/toaster.tsx +24 -0
  77. package/src/components/ui/toggle-group.tsx +49 -0
  78. package/src/components/ui/toggle.tsx +37 -0
  79. package/src/components/ui/tooltip.tsx +28 -0
  80. package/src/components/ui/use-toast.ts +3 -0
  81. package/src/config/define.ts +6 -0
  82. package/src/config/index.ts +0 -0
  83. package/src/config/load.ts +45 -0
  84. package/src/config/types.ts +5 -0
  85. package/src/hooks/use-mobile.tsx +19 -0
  86. package/src/hooks/use-toast.ts +186 -0
  87. package/src/index.css +142 -0
  88. package/src/lib/models.ts +138 -0
  89. package/src/lib/utils.ts +6 -0
  90. package/src/main.tsx +5 -0
  91. package/src/orm/cli/makemigrations.ts +63 -0
  92. package/src/orm/cli/migrate.ts +127 -0
  93. package/src/orm/cli.ts +30 -0
  94. package/src/orm/core/base-model.ts +6 -0
  95. package/src/orm/core/manager.ts +27 -0
  96. package/src/orm/core/query-builder.ts +74 -0
  97. package/src/orm/db/connection.ts +0 -0
  98. package/src/orm/db/sql-types.ts +72 -0
  99. package/src/orm/db/sqlite.ts +4 -0
  100. package/src/orm/decorators/field.ts +80 -0
  101. package/src/orm/decorators/model.ts +36 -0
  102. package/src/orm/decorators/relations.ts +0 -0
  103. package/src/orm/metadata/field-metadata.ts +0 -0
  104. package/src/orm/metadata/field-types.ts +12 -0
  105. package/src/orm/metadata/get-meta.ts +9 -0
  106. package/src/orm/metadata/index.ts +15 -0
  107. package/src/orm/metadata/keys.ts +2 -0
  108. package/src/orm/metadata/model-registry.ts +53 -0
  109. package/src/orm/metadata/modifiers.ts +26 -0
  110. package/src/orm/metadata/types.ts +45 -0
  111. package/src/orm/migration-engine/diff.ts +243 -0
  112. package/src/orm/migration-engine/operations.ts +186 -0
  113. package/src/orm/schema/build.ts +138 -0
  114. package/src/orm/schema/state.ts +23 -0
  115. package/src/orm/schema/writeMigrations.ts +21 -0
  116. package/src/orm/syncdb.ts +25 -0
  117. package/src/pages/Dashboard.tsx +127 -0
  118. package/src/pages/Index.tsx +18 -0
  119. package/src/pages/ModelPage.tsx +177 -0
  120. package/src/pages/NotFound.tsx +24 -0
  121. package/src/pages/SchemaEditor.tsx +170 -0
  122. package/src/pages/Settings.tsx +166 -0
  123. package/src/server.ts +69 -0
  124. package/src/vite-env.d.ts +1 -0
  125. package/tailwind.config.js +112 -0
  126. package/tailwind.config.ts +114 -0
  127. package/tsconfig.app.json +30 -0
  128. package/tsconfig.json +16 -0
  129. package/tsconfig.node.json +22 -0
  130. package/vite.config.js +23 -0
  131. package/vite.config.ts +18 -0
package/src/server.ts ADDED
@@ -0,0 +1,69 @@
1
+ // src/server.ts
2
+ import express from "express";
3
+ import bodyParser from "body-parser";
4
+ import { adminRouter } from "./admin/router";
5
+ import path from "path";
6
+ import { fileURLToPath } from "url";
7
+
8
+
9
+ const app = express();
10
+ app.use(bodyParser.json());
11
+
12
+ // 🔑 WIRE adminRouter HERE
13
+
14
+ app.get("/admin/schema", (_req, res) => {
15
+ res.json(adminRouter.schema());
16
+ });
17
+
18
+ app.get("/admin/:model", (req, res) => {
19
+ res.json(adminRouter.list(req.params.model));
20
+ });
21
+
22
+ app.post("/admin/:model", (req, res) => {
23
+ res.json(adminRouter.create(req.params.model, req.body));
24
+ });
25
+
26
+ app.put("/admin/:model/:id", (req, res) => {
27
+ res.json(
28
+ adminRouter.update(
29
+ req.params.model,
30
+ Number(req.params.id),
31
+ req.body
32
+ )
33
+ );
34
+ });
35
+
36
+ app.delete("/admin/:model/:id", (req, res) => {
37
+ res.json(
38
+ adminRouter.delete(
39
+ req.params.model,
40
+ Number(req.params.id)
41
+ )
42
+ );
43
+ });
44
+
45
+ const __filename = fileURLToPath(import.meta.url);
46
+ const __dirname = path.dirname(__filename);
47
+
48
+ // Serve static assets
49
+ app.use(
50
+ express.static(
51
+ path.join(__dirname, "../dist")
52
+ )
53
+ );
54
+
55
+ // React router fallback
56
+ app.use((_req, res, next) => {
57
+ if (_req.method !== "GET") {
58
+ return next();
59
+ }
60
+
61
+ res.sendFile(
62
+ path.join(__dirname, "../dist/index.html")
63
+ );
64
+ });
65
+
66
+ app.listen(3000, () => {
67
+ console.log("Admin backend running on http://localhost:3000");
68
+ });
69
+
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,112 @@
1
+ export default {
2
+ darkMode: ["class"],
3
+ content: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"],
4
+ prefix: "",
5
+ theme: {
6
+ container: {
7
+ center: true,
8
+ padding: "2rem",
9
+ screens: {
10
+ "2xl": "1400px",
11
+ },
12
+ },
13
+ extend: {
14
+ fontFamily: {
15
+ sans: ['Inter', 'system-ui', 'sans-serif'],
16
+ mono: ['JetBrains Mono', 'monospace'],
17
+ },
18
+ colors: {
19
+ border: "hsl(var(--border))",
20
+ input: "hsl(var(--input))",
21
+ ring: "hsl(var(--ring))",
22
+ background: "hsl(var(--background))",
23
+ foreground: "hsl(var(--foreground))",
24
+ primary: {
25
+ DEFAULT: "hsl(var(--primary))",
26
+ foreground: "hsl(var(--primary-foreground))",
27
+ },
28
+ secondary: {
29
+ DEFAULT: "hsl(var(--secondary))",
30
+ foreground: "hsl(var(--secondary-foreground))",
31
+ },
32
+ destructive: {
33
+ DEFAULT: "hsl(var(--destructive))",
34
+ foreground: "hsl(var(--destructive-foreground))",
35
+ },
36
+ muted: {
37
+ DEFAULT: "hsl(var(--muted))",
38
+ foreground: "hsl(var(--muted-foreground))",
39
+ },
40
+ accent: {
41
+ DEFAULT: "hsl(var(--accent))",
42
+ foreground: "hsl(var(--accent-foreground))",
43
+ },
44
+ popover: {
45
+ DEFAULT: "hsl(var(--popover))",
46
+ foreground: "hsl(var(--popover-foreground))",
47
+ },
48
+ card: {
49
+ DEFAULT: "hsl(var(--card))",
50
+ foreground: "hsl(var(--card-foreground))",
51
+ },
52
+ success: {
53
+ DEFAULT: "hsl(var(--success))",
54
+ foreground: "hsl(var(--success-foreground))",
55
+ },
56
+ warning: {
57
+ DEFAULT: "hsl(var(--warning))",
58
+ foreground: "hsl(var(--warning-foreground))",
59
+ },
60
+ info: {
61
+ DEFAULT: "hsl(var(--info))",
62
+ foreground: "hsl(var(--info-foreground))",
63
+ },
64
+ sidebar: {
65
+ DEFAULT: "hsl(var(--sidebar-background))",
66
+ foreground: "hsl(var(--sidebar-foreground))",
67
+ primary: "hsl(var(--sidebar-primary))",
68
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
69
+ accent: "hsl(var(--sidebar-accent))",
70
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
71
+ border: "hsl(var(--sidebar-border))",
72
+ ring: "hsl(var(--sidebar-ring))",
73
+ },
74
+ },
75
+ borderRadius: {
76
+ lg: "var(--radius)",
77
+ md: "calc(var(--radius) - 2px)",
78
+ sm: "calc(var(--radius) - 4px)",
79
+ },
80
+ keyframes: {
81
+ "accordion-down": {
82
+ from: { height: "0" },
83
+ to: { height: "var(--radix-accordion-content-height)" },
84
+ },
85
+ "accordion-up": {
86
+ from: { height: "var(--radix-accordion-content-height)" },
87
+ to: { height: "0" },
88
+ },
89
+ "fade-in": {
90
+ from: { opacity: "0", transform: "translateY(10px)" },
91
+ to: { opacity: "1", transform: "translateY(0)" },
92
+ },
93
+ "slide-in": {
94
+ from: { opacity: "0", transform: "translateX(-10px)" },
95
+ to: { opacity: "1", transform: "translateX(0)" },
96
+ },
97
+ "pulse-glow": {
98
+ "0%, 100%": { boxShadow: "0 0 20px hsl(var(--primary) / 0.15)" },
99
+ "50%": { boxShadow: "0 0 30px hsl(var(--primary) / 0.25)" },
100
+ },
101
+ },
102
+ animation: {
103
+ "accordion-down": "accordion-down 0.2s ease-out",
104
+ "accordion-up": "accordion-up 0.2s ease-out",
105
+ "fade-in": "fade-in 0.3s ease-out",
106
+ "slide-in": "slide-in 0.3s ease-out",
107
+ "pulse-glow": "pulse-glow 2s ease-in-out infinite",
108
+ },
109
+ },
110
+ },
111
+ plugins: [require("tailwindcss-animate")],
112
+ };
@@ -0,0 +1,114 @@
1
+ import type { Config } from "tailwindcss";
2
+
3
+ export default {
4
+ darkMode: ["class"],
5
+ content: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"],
6
+ prefix: "",
7
+ theme: {
8
+ container: {
9
+ center: true,
10
+ padding: "2rem",
11
+ screens: {
12
+ "2xl": "1400px",
13
+ },
14
+ },
15
+ extend: {
16
+ fontFamily: {
17
+ sans: ['Inter', 'system-ui', 'sans-serif'],
18
+ mono: ['JetBrains Mono', 'monospace'],
19
+ },
20
+ colors: {
21
+ border: "hsl(var(--border))",
22
+ input: "hsl(var(--input))",
23
+ ring: "hsl(var(--ring))",
24
+ background: "hsl(var(--background))",
25
+ foreground: "hsl(var(--foreground))",
26
+ primary: {
27
+ DEFAULT: "hsl(var(--primary))",
28
+ foreground: "hsl(var(--primary-foreground))",
29
+ },
30
+ secondary: {
31
+ DEFAULT: "hsl(var(--secondary))",
32
+ foreground: "hsl(var(--secondary-foreground))",
33
+ },
34
+ destructive: {
35
+ DEFAULT: "hsl(var(--destructive))",
36
+ foreground: "hsl(var(--destructive-foreground))",
37
+ },
38
+ muted: {
39
+ DEFAULT: "hsl(var(--muted))",
40
+ foreground: "hsl(var(--muted-foreground))",
41
+ },
42
+ accent: {
43
+ DEFAULT: "hsl(var(--accent))",
44
+ foreground: "hsl(var(--accent-foreground))",
45
+ },
46
+ popover: {
47
+ DEFAULT: "hsl(var(--popover))",
48
+ foreground: "hsl(var(--popover-foreground))",
49
+ },
50
+ card: {
51
+ DEFAULT: "hsl(var(--card))",
52
+ foreground: "hsl(var(--card-foreground))",
53
+ },
54
+ success: {
55
+ DEFAULT: "hsl(var(--success))",
56
+ foreground: "hsl(var(--success-foreground))",
57
+ },
58
+ warning: {
59
+ DEFAULT: "hsl(var(--warning))",
60
+ foreground: "hsl(var(--warning-foreground))",
61
+ },
62
+ info: {
63
+ DEFAULT: "hsl(var(--info))",
64
+ foreground: "hsl(var(--info-foreground))",
65
+ },
66
+ sidebar: {
67
+ DEFAULT: "hsl(var(--sidebar-background))",
68
+ foreground: "hsl(var(--sidebar-foreground))",
69
+ primary: "hsl(var(--sidebar-primary))",
70
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
71
+ accent: "hsl(var(--sidebar-accent))",
72
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
73
+ border: "hsl(var(--sidebar-border))",
74
+ ring: "hsl(var(--sidebar-ring))",
75
+ },
76
+ },
77
+ borderRadius: {
78
+ lg: "var(--radius)",
79
+ md: "calc(var(--radius) - 2px)",
80
+ sm: "calc(var(--radius) - 4px)",
81
+ },
82
+ keyframes: {
83
+ "accordion-down": {
84
+ from: { height: "0" },
85
+ to: { height: "var(--radix-accordion-content-height)" },
86
+ },
87
+ "accordion-up": {
88
+ from: { height: "var(--radix-accordion-content-height)" },
89
+ to: { height: "0" },
90
+ },
91
+ "fade-in": {
92
+ from: { opacity: "0", transform: "translateY(10px)" },
93
+ to: { opacity: "1", transform: "translateY(0)" },
94
+ },
95
+ "slide-in": {
96
+ from: { opacity: "0", transform: "translateX(-10px)" },
97
+ to: { opacity: "1", transform: "translateX(0)" },
98
+ },
99
+ "pulse-glow": {
100
+ "0%, 100%": { boxShadow: "0 0 20px hsl(var(--primary) / 0.15)" },
101
+ "50%": { boxShadow: "0 0 30px hsl(var(--primary) / 0.25)" },
102
+ },
103
+ },
104
+ animation: {
105
+ "accordion-down": "accordion-down 0.2s ease-out",
106
+ "accordion-up": "accordion-up 0.2s ease-out",
107
+ "fade-in": "fade-in 0.3s ease-out",
108
+ "slide-in": "slide-in 0.3s ease-out",
109
+ "pulse-glow": "pulse-glow 2s ease-in-out infinite",
110
+ },
111
+ },
112
+ },
113
+ plugins: [require("tailwindcss-animate")],
114
+ } satisfies Config;
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "isolatedModules": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+
17
+ /* Linting */
18
+ "strict": false,
19
+ "noUnusedLocals": false,
20
+ "noUnusedParameters": false,
21
+ "noImplicitAny": false,
22
+ "noFallthroughCasesInSwitch": false,
23
+
24
+ "baseUrl": ".",
25
+ "paths": {
26
+ "@/*": ["./src/*"]
27
+ }
28
+ },
29
+ "include": ["src"]
30
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "files": [],
3
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
4
+ "compilerOptions": {
5
+ "baseUrl": ".",
6
+ "paths": {
7
+ "@/*": ["./src/*"]
8
+ },
9
+ "noImplicitAny": false,
10
+ "noUnusedParameters": false,
11
+ "skipLibCheck": true,
12
+ "allowJs": true,
13
+ "noUnusedLocals": false,
14
+ "strictNullChecks": false
15
+ }
16
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2023"],
5
+ "module": "ESNext",
6
+ "skipLibCheck": true,
7
+
8
+ /* Bundler mode */
9
+ "moduleResolution": "bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "isolatedModules": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true,
14
+
15
+ /* Linting */
16
+ "strict": true,
17
+ "noUnusedLocals": false,
18
+ "noUnusedParameters": false,
19
+ "noFallthroughCasesInSwitch": true
20
+ },
21
+ "include": ["vite.config.ts"]
22
+ }
package/vite.config.js ADDED
@@ -0,0 +1,23 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react-swc";
3
+ import path from "path";
4
+ import { componentTagger } from "lovable-tagger";
5
+ // https://vitejs.dev/config/
6
+ export default defineConfig(({ mode }) => ({
7
+ server: {
8
+ host: "::",
9
+ port: 8080,
10
+ proxy: {
11
+ "/admin": {
12
+ target: "http://localhost:3000",
13
+ changeOrigin: true,
14
+ },
15
+ },
16
+ },
17
+ plugins: [react(), mode === "development" && componentTagger()].filter(Boolean),
18
+ resolve: {
19
+ alias: {
20
+ "@": path.resolve(__dirname, "./src"),
21
+ },
22
+ },
23
+ }));
package/vite.config.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react-swc";
3
+ import path from "path";
4
+ import { componentTagger } from "lovable-tagger";
5
+
6
+ // https://vitejs.dev/config/
7
+ export default defineConfig(({ mode }) => ({
8
+ server: {
9
+ host: "::",
10
+ port: 8080,
11
+ },
12
+ plugins: [react(), mode === "development" && componentTagger()].filter(Boolean),
13
+ resolve: {
14
+ alias: {
15
+ "@": path.resolve(__dirname, "./src"),
16
+ },
17
+ },
18
+ }));