@fernir2/saas-kit-cli 0.1.22 → 0.1.24
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/base-repo/app-constants/aliases.cjs.js +1 -1
- package/base-repo/app-constants/aliases.js +1 -1
- package/cli/README.md +101 -0
- package/cli/bin/index.ts +357 -0
- package/cli/drizzle.config.ts +12 -0
- package/cli/eslint.config.js +10 -0
- package/cli/global-setup.ts +25 -0
- package/cli/next.config.js +55 -0
- package/cli/npm-commands/gen-meta/index.ts +3 -0
- package/cli/npm-commands/gen-schema/index.ts +5 -0
- package/cli/npm-commands/migrate-db/index.ts +5 -0
- package/cli/npm-commands/migrate-db/migrate-db.ts +15 -0
- package/cli/npm-commands/seed-db/index.ts +5 -0
- package/cli/npm-commands/seed-db/seed-db.ts +15 -0
- package/cli/package-template.json +61 -0
- package/cli/playwright.config.ts +34 -0
- package/cli/postcss.config.mjs +9 -0
- package/cli/src/app/favicon.ico +0 -0
- package/cli/src/app/globals.css +163 -0
- package/cli/src/app/layout.tsx +44 -0
- package/cli/src/app/page.tsx +9 -0
- package/cli/src/app/styles/common.css +74 -0
- package/cli/src/app/styles/rich-text-editor.css +130 -0
- package/cli/tailwind.config.ts +13 -0
- package/cli/tsconfig.json +65 -0
- package/cli/tsconfig.server.json +14 -0
- package/level2/cli/create-saas-kit-app/bin/index.cjs.js +4 -4
- package/level2/cli/create-saas-kit-app/bin/index.js +3 -3
- package/level2/fd-toolbox/api/api-client.cjs.js +1 -1
- package/level2/fd-toolbox/api/api-client.js +1 -1
- package/level2/fd-toolbox/api/api-path-names.cjs.js +2 -2
- package/level2/fd-toolbox/api/api-paths.cjs.js +1 -1
- package/level2/fd-toolbox/api/api-paths.js +1 -1
- package/level2/fd-toolbox/api/base-api.cjs.js +1 -1
- package/level2/fd-toolbox/api/base-api.js +1 -1
- package/level2/fd-toolbox/auth/login-states.cjs.js +1 -1
- package/level2/fd-toolbox/auth/login-states.js +1 -1
- package/level2/fd-toolbox/auth/session-storage.cjs.js +1 -1
- package/level2/fd-toolbox/auth/session-storage.js +1 -1
- package/level2/fd-toolbox/auth/tokens.cjs.js +1 -1
- package/level2/fd-toolbox/auth/tokens.js +1 -1
- package/level2/fd-toolbox/constants/constants.cjs.js +1 -1
- package/level2/fd-toolbox/constants/constants.js +1 -1
- package/level2/fd-toolbox/enums/enums.cjs.js +1 -1
- package/level2/fd-toolbox/enums/enums.js +1 -1
- package/level2/fd-toolbox/errors/error-handler.cjs.js +1 -1
- package/level2/fd-toolbox/errors/error-handler.js +1 -1
- package/level2/fd-toolbox/errors/errors.cjs.js +1 -1
- package/level2/fd-toolbox/errors/errors.js +1 -1
- package/level2/fd-toolbox/errors/problem-details.cjs.js +1 -1
- package/level2/fd-toolbox/errors/problem-details.js +1 -1
- package/level2/fd-toolbox/functions/value-checking-functions.cjs.js +1 -1
- package/level2/fd-toolbox/functions/value-checking-functions.js +1 -1
- package/level2/fd-toolbox/http/url/urls.cjs.js +1 -1
- package/level2/fd-toolbox/http/url/urls.js +1 -1
- package/level2/fd-toolbox/infra/env-config.cjs.js +2 -2
- package/level2/fd-toolbox/infra/env-config.js +2 -2
- package/level2/fd-toolbox/infra/env-functions.cjs.js +1 -1
- package/level2/fd-toolbox/infra/env-functions.js +1 -1
- package/level2/fd-toolbox/infra/env-schema.cjs.js +2 -2
- package/level2/fd-toolbox/infra/env-schema.js +2 -2
- package/level2/fd-toolbox/infra/env-store.cjs.js +1 -1
- package/level2/fd-toolbox/infra/env-store.js +1 -1
- package/level2/fd-toolbox/lib/environments.cjs.js +1 -1
- package/level2/fd-toolbox/lib/environments.js +1 -1
- package/level2/fd-toolbox/lib/utils.cjs.js +1 -1
- package/level2/fd-toolbox/lib/utils.js +1 -1
- package/level2/fd-toolbox/local-storage/local-storage.cjs.js +1 -1
- package/level2/fd-toolbox/local-storage/local-storage.js +1 -1
- package/level2/fd-toolbox/logging/loggers.cjs.js +1 -1
- package/level2/fd-toolbox/logging/loggers.js +1 -1
- package/level2/fd-toolbox/notifications.cjs.js +2 -2
- package/level2/fd-toolbox/notifications.js +2 -2
- package/level2/fd-toolbox/odata/odata-constants.cjs.js +1 -1
- package/level2/fd-toolbox/odata/odata-constants.js +1 -1
- package/level2/fd-toolbox/odata/odatas.cjs.js +1 -1
- package/level2/fd-toolbox/odata/odatas.js +1 -1
- package/level2/fd-toolbox/odata/services/odata-filters.cjs.js +1 -1
- package/level2/fd-toolbox/odata/services/odata-filters.js +1 -1
- package/level2/fd-toolbox/paths/paths-names.cjs.js +2 -2
- package/level2/fd-toolbox/paths/paths-names.js +1 -1
- package/level2/fd-toolbox/routing/login-routers.cjs.js +1 -1
- package/level2/fd-toolbox/routing/login-routers.js +1 -1
- package/level2/fd-toolbox/routing/paths.cjs.js +1 -1
- package/level2/fd-toolbox/routing/paths.js +1 -1
- package/level2/fd-toolbox/strings/strings-constants.cjs.js +1 -1
- package/level2/fd-toolbox/strings/strings-constants.js +1 -1
- package/level2/fd-toolbox/strings/strings.cjs.js +1 -1
- package/level2/fd-toolbox/strings/strings.js +1 -1
- package/level2/fd-toolbox/types/ensure-type.cjs.js +1 -1
- package/level2/fd-toolbox/types/ensure-type.js +1 -1
- package/level2/fd-toolbox-core/core/name-of.cjs.js +1 -1
- package/level2/fd-toolbox-core/core/name-of.js +1 -1
- package/level2/fd-toolbox-core/types/resource-with-id.cjs.js +1 -1
- package/level2/fd-toolbox-core/types/resource-with-id.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.1.0",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "npx tsx --tsconfig tsconfig.server.json server.ts",
|
|
7
|
+
"build": "next build && tsc --project tsconfig.server.json",
|
|
8
|
+
"lint": "eslint -c eslint.config.js",
|
|
9
|
+
"gen-schema": "npx tsx tools/npm-commands/gen-schema/index.ts",
|
|
10
|
+
"gen-meta": "npx tsx tools/npm-commands/gen-meta/index.ts",
|
|
11
|
+
"init-db": "npm run migrate-db && npm run seed-db",
|
|
12
|
+
"setup": "npm run gen-meta && npm run gen-schema && npm run init-db",
|
|
13
|
+
"start": "npm run setup && npm run dev",
|
|
14
|
+
"prod": "npm run setup && npm run build && npx tsx server.ts",
|
|
15
|
+
"migrate-db": "npx tsx tools/npm-commands/migrate-db/index.ts",
|
|
16
|
+
"seed-db": "npx tsx tools/npm-commands/seed-db/index.ts"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@fernir2/saas-kit": "0.0.150",
|
|
20
|
+
"@node-rs/argon2": "2.0.2",
|
|
21
|
+
"drizzle-orm": "0.41.0",
|
|
22
|
+
"eslint-plugin-github": "6.0.0",
|
|
23
|
+
"eslint-plugin-import": "2.32.0",
|
|
24
|
+
"eslint-plugin-sonarjs": "3.0.5",
|
|
25
|
+
"geist": "1.3.1",
|
|
26
|
+
"next": "15.4.5",
|
|
27
|
+
"quill": "2.0.3",
|
|
28
|
+
"react": "18",
|
|
29
|
+
"react-dom": "18",
|
|
30
|
+
"socket.io-client": "4.8.1",
|
|
31
|
+
"tailwindcss-animate": "1.0.7"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"playwright": "1.52.0",
|
|
35
|
+
"@eslint/eslintrc": "3.3.1",
|
|
36
|
+
"@eslint/js": "9.35.0",
|
|
37
|
+
"@types/node": "24.5.1",
|
|
38
|
+
"@types/react": "18",
|
|
39
|
+
"@types/react-dom": "18",
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "8.43.0",
|
|
41
|
+
"@typescript-eslint/eslint-plugin-tslint": "7.0.2",
|
|
42
|
+
"@typescript-eslint/parser": "8.43.0",
|
|
43
|
+
"drizzle-kit": "0.28.1",
|
|
44
|
+
"eslint": "9.35.0",
|
|
45
|
+
"eslint-config-next": "15.5.2",
|
|
46
|
+
"eslint-config-prettier": "9.1.0",
|
|
47
|
+
"eslint-plugin-react": "7.37.5",
|
|
48
|
+
"eslint-plugin-react-compiler": "19.1.0-rc.2",
|
|
49
|
+
"eslint-plugin-react-hooks": "5.2.0",
|
|
50
|
+
"eslint-plugin-react-refresh": "0.4.20",
|
|
51
|
+
"eslint-plugin-tailwindcss": "3.18.2",
|
|
52
|
+
"husky": "9.1.7",
|
|
53
|
+
"postcss": "8",
|
|
54
|
+
"prettier": "3.6.2",
|
|
55
|
+
"prettier-plugin-tailwindcss": "0.6.14",
|
|
56
|
+
"tailwindcss": "3.4.1",
|
|
57
|
+
"tsx": "4.19.1",
|
|
58
|
+
"typescript": "5.9.2",
|
|
59
|
+
"esbuild": "0.19.12"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineConfig, devices } from "playwright/test";
|
|
2
|
+
import { getDotenvConfig } from "@fernir2/saas-kit";
|
|
3
|
+
|
|
4
|
+
getDotenvConfig();
|
|
5
|
+
|
|
6
|
+
const baseUrl = "http://localhost:8080/";
|
|
7
|
+
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
timeout: 120000,
|
|
10
|
+
testDir: "test/",
|
|
11
|
+
fullyParallel: true,
|
|
12
|
+
globalSetup: "./global-setup.ts",
|
|
13
|
+
workers: undefined,
|
|
14
|
+
reporter: "html",
|
|
15
|
+
use: {
|
|
16
|
+
baseURL: baseUrl,
|
|
17
|
+
trace: "on-first-retry",
|
|
18
|
+
},
|
|
19
|
+
projects: [
|
|
20
|
+
{
|
|
21
|
+
name: "chromium",
|
|
22
|
+
use: { ...devices["Desktop Chrome"] },
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
webServer: {
|
|
26
|
+
command: "npm run prod",
|
|
27
|
+
url: baseUrl,
|
|
28
|
+
reuseExistingServer: true,
|
|
29
|
+
timeout: 120000,
|
|
30
|
+
env: {
|
|
31
|
+
NODE_ENV: "test",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
Binary file
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
@import "../../packages/level2/client/styles/common.css";
|
|
2
|
+
@import "quill/dist/quill.snow.css";
|
|
3
|
+
@import "../../packages/level2/client/styles/rich-text-editor.css";
|
|
4
|
+
|
|
5
|
+
@tailwind base;
|
|
6
|
+
@tailwind components;
|
|
7
|
+
@tailwind utilities;
|
|
8
|
+
|
|
9
|
+
@layer base {
|
|
10
|
+
:root {
|
|
11
|
+
--background: 0 0% 100%;
|
|
12
|
+
--foreground: 222.2 84% 4.9%;
|
|
13
|
+
--card: 0 0% 100%;
|
|
14
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
15
|
+
--popover: 0 0% 100%;
|
|
16
|
+
--popover-foreground: 222.2 84% 4.9%;
|
|
17
|
+
--primary: 222.2 47.4% 11.2%;
|
|
18
|
+
--primary-foreground: 210 40% 98%;
|
|
19
|
+
--secondary: 210 40% 96.1%;
|
|
20
|
+
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
21
|
+
--muted: 210 40% 96.1%;
|
|
22
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
23
|
+
--accent: 210 40% 96.1%;
|
|
24
|
+
--accent-foreground: 222.2 47.4% 11.2%;
|
|
25
|
+
--destructive: 0 84.2% 60.2%;
|
|
26
|
+
--destructive-foreground: 210 40% 98%;
|
|
27
|
+
--border: 214.3 31.8% 91.4%;
|
|
28
|
+
--input: 214.3 31.8% 91.4%;
|
|
29
|
+
--ring: 222.2 84% 4.9%;
|
|
30
|
+
--radius: 0.5rem;
|
|
31
|
+
|
|
32
|
+
--chart-1: 12 76% 61%;
|
|
33
|
+
--chart-2: 173 58% 39%;
|
|
34
|
+
--chart-3: 197 37% 24%;
|
|
35
|
+
--chart-4: 43 74% 66%;
|
|
36
|
+
--chart-5: 27 87% 67%;
|
|
37
|
+
|
|
38
|
+
--fd-accent: 190, 100%, 34%; /* accent-600 */
|
|
39
|
+
--fd-accent-light: 172, 100%, 37%; /* accent-100 */
|
|
40
|
+
|
|
41
|
+
--fd-tertiary-50: 216, 33%, 97%;
|
|
42
|
+
--fd-tertiary-200: 206, 35%, 86%;
|
|
43
|
+
--fd-tertiary-600: 206, 38%, 39%;
|
|
44
|
+
--fd-tertiary-700: 208, 38%, 32%;
|
|
45
|
+
--fd-tertiary-900: 208, 31%, 24%;
|
|
46
|
+
--fd-green-accent: 120, 100%, 34%;
|
|
47
|
+
|
|
48
|
+
--fd-shadow: 0, 0%, 0%, 0.25;
|
|
49
|
+
|
|
50
|
+
--fd-toolbar: var(--fd-tertiary-900);
|
|
51
|
+
--fd-toolbar-input: var(--fd-tertiary-700);
|
|
52
|
+
--fd-toolbar-hover: var(--fd-tertiary-700);
|
|
53
|
+
--fd-toolbar-keys: var(--fd-tertiary-200);
|
|
54
|
+
--fd-toolbar-placeholder: var(--fd-tertiary-50);
|
|
55
|
+
--fd-toolbar-shadow: var(--fd-shadow);
|
|
56
|
+
--fd-toolbar-separators: var(--fd-tertiary-600);
|
|
57
|
+
--fd-sidebar-icons: var(--fd-tertiary-50);
|
|
58
|
+
--fd-toolbar-icons: var(--fd-tertiary-50);
|
|
59
|
+
--fd-toolbar-border: var(--fd-tertiary-700);
|
|
60
|
+
--fd-toolbar-button: var(--fd-tertiary-600);
|
|
61
|
+
|
|
62
|
+
--subtle-400: 210, 10%, 65%;
|
|
63
|
+
--subtle-500: 220, 9%, 46%;
|
|
64
|
+
--subtle-700: 220, 20%, 27%;
|
|
65
|
+
|
|
66
|
+
--fd-enum-default-color: 0, 0%, 92%;
|
|
67
|
+
--fd-enum-color-1: 200, 50%, 87%;
|
|
68
|
+
--fd-enum-color-2: 120, 35%, 87%;
|
|
69
|
+
--fd-enum-color-3: 340, 61%, 91%;
|
|
70
|
+
--fd-enum-color-4: 19, 45%, 88%;
|
|
71
|
+
--fd-enum-color-5: 340, 61%, 91%;
|
|
72
|
+
--fd-enum-color-6: 9, 90%, 91%;
|
|
73
|
+
--fd-enum-color-7: 283, 44%, 90%;
|
|
74
|
+
--fd-enum-color-8: 9, 90%, 91%;
|
|
75
|
+
--fd-enum-color-9: 200, 50%, 87%;
|
|
76
|
+
--fd-enum-color-10: 38, 87%, 90%;
|
|
77
|
+
--fd-enum-color-11: 283, 44%, 90%;
|
|
78
|
+
--fd-enum-color-12: 283, 44%, 90%;
|
|
79
|
+
--fd-enum-color-13: 340, 61%, 91%;
|
|
80
|
+
--fd-enum-color-14: 283, 44%, 90%;
|
|
81
|
+
--fd-enum-color-15: 38, 87%, 90%;
|
|
82
|
+
--fd-enum-color-16: 0, 0%, 92%;
|
|
83
|
+
--fd-enum-color-17: 9, 90%, 91%;
|
|
84
|
+
--fd-enum-color-18: 19, 45%, 88%;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.dark {
|
|
88
|
+
--background: 222.2 84% 4.9%;
|
|
89
|
+
--foreground: 210 40% 98%;
|
|
90
|
+
--card: 222.2 84% 4.9%;
|
|
91
|
+
--card-foreground: 210 40% 98%;
|
|
92
|
+
--popover: 222.2 84% 4.9%;
|
|
93
|
+
--popover-foreground: 210 40% 98%;
|
|
94
|
+
--primary: 210 40% 98%;
|
|
95
|
+
--primary-foreground: 222.2 47.4% 11.2%;
|
|
96
|
+
--secondary: 217.2 32.6% 17.5%;
|
|
97
|
+
--secondary-foreground: 210 40% 98%;
|
|
98
|
+
--muted: 217.2 32.6% 17.5%;
|
|
99
|
+
--muted-foreground: 215 20.2% 65.1%;
|
|
100
|
+
--accent: 217.2 32.6% 17.5%;
|
|
101
|
+
--accent-foreground: 210 40% 98%;
|
|
102
|
+
--destructive: 0 62.8% 30.6%;
|
|
103
|
+
--destructive-foreground: 210 40% 98%;
|
|
104
|
+
--border: 217.2 32.6% 17.5%;
|
|
105
|
+
--input: 217.2 32.6% 17.5%;
|
|
106
|
+
--ring: 212.7 26.8% 83.9;
|
|
107
|
+
|
|
108
|
+
--radius: 0.5rem;
|
|
109
|
+
|
|
110
|
+
--fd-accent: 190, 100%, 34%; /* accent-600 */
|
|
111
|
+
--fd-accent-light: 172, 100%, 37%; /* accent-100 */
|
|
112
|
+
|
|
113
|
+
--fd-tertiary-50: 216, 33%, 97%;
|
|
114
|
+
--fd-tertiary-200: 206, 35%, 86%;
|
|
115
|
+
--fd-tertiary-600: 206, 38%, 39%;
|
|
116
|
+
--fd-tertiary-700: 208, 38%, 32%;
|
|
117
|
+
--fd-tertiary-900: 208, 31%, 24%;
|
|
118
|
+
|
|
119
|
+
--fd-shadow: 0, 0%, 0%, 0.25;
|
|
120
|
+
|
|
121
|
+
--fd-toolbar: var(--fd-tertiary-900);
|
|
122
|
+
--fd-toolbar-input: var(--fd-tertiary-700);
|
|
123
|
+
--fd-toolbar-hover: var(--fd-tertiary-700);
|
|
124
|
+
--fd-toolbar-keys: var(--fd-tertiary-200);
|
|
125
|
+
--fd-toolbar-placeholder: var(--fd-tertiary-50);
|
|
126
|
+
--fd-toolbar-shadow: var(--fd-shadow);
|
|
127
|
+
--fd-toolbar-separators: var(--fd-tertiary-600);
|
|
128
|
+
--fd-sidebar-icons: var(--fd-tertiary-50);
|
|
129
|
+
--fd-toolbar-icons: var(--fd-tertiary-50);
|
|
130
|
+
--fd-toolbar-border: var(--fd-tertiary-700);
|
|
131
|
+
--fd-toolbar-button: var(--fd-tertiary-600);
|
|
132
|
+
|
|
133
|
+
--subtle-400: 210, 10%, 65%;
|
|
134
|
+
--subtle-500: 220, 9%, 46%;
|
|
135
|
+
--subtle-700: 220, 20%, 27%;
|
|
136
|
+
|
|
137
|
+
--chart-1: 220 70% 50%;
|
|
138
|
+
--chart-2: 160 60% 45%;
|
|
139
|
+
--chart-3: 30 80% 55%;
|
|
140
|
+
--chart-4: 280 65% 60%;
|
|
141
|
+
--chart-5: 340 75% 55%;
|
|
142
|
+
|
|
143
|
+
--fd-enum-default-color: 0, 0%, 22%;
|
|
144
|
+
--fd-enum-color-1: 219, 43%, 30%;
|
|
145
|
+
--fd-enum-color-2: 152, 37%, 27%;
|
|
146
|
+
--fd-enum-color-3: 328, 37%, 30%;
|
|
147
|
+
--fd-enum-color-4: 27, 63%, 32%;
|
|
148
|
+
--fd-enum-color-5: 328, 37%, 30%;
|
|
149
|
+
--fd-enum-color-6: 10, 40%, 31%;
|
|
150
|
+
--fd-enum-color-7: 268, 38%, 29%;
|
|
151
|
+
--fd-enum-color-8: 10, 40%, 31%;
|
|
152
|
+
--fd-enum-color-9: 219, 43%, 30%;
|
|
153
|
+
--fd-enum-color-10: 37, 56%, 36%;
|
|
154
|
+
--fd-enum-color-11: 268, 38%, 29%;
|
|
155
|
+
--fd-enum-color-12: 268, 38%, 29%;
|
|
156
|
+
--fd-enum-color-13: 328, 37%, 30%;
|
|
157
|
+
--fd-enum-color-14: 268, 38%, 29%;
|
|
158
|
+
--fd-enum-color-15: 37, 56%, 36%;
|
|
159
|
+
--fd-enum-color-16: 0, 0%, 35%;
|
|
160
|
+
--fd-enum-color-17: 10, 40%, 31%;
|
|
161
|
+
--fd-enum-color-18: 27, 63%, 32%;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FdHtmlMetadata } from "@meta/client/framework";
|
|
2
|
+
import { GeistSans } from "geist/font/sans";
|
|
3
|
+
import "src/app/globals.css";
|
|
4
|
+
import { cn } from "@fd-toolbox/lib/utils";
|
|
5
|
+
import Favicon from "src/app/favicon.ico";
|
|
6
|
+
import { FdToaster } from "@fd-component-toolbox/toaster/FdToaster";
|
|
7
|
+
import { ReactNode } from "react";
|
|
8
|
+
import { FdProviders } from "@client/components/providers/FdProviders";
|
|
9
|
+
import { setSidebarResourceNames } from "@fd-app-toolbox/layout/sidebar/sidebar-resource-names-cache";
|
|
10
|
+
import { defaultGlobalConfig } from "@meta/providers/global-provider/default-config";
|
|
11
|
+
import { setMultiListEditResourceConfigs } from "@/app/config/multi-list-config";
|
|
12
|
+
import { setResourceListConfigs } from "@packages/level2/client/pages/view-page/resource-list-configs";
|
|
13
|
+
import { setEditResourceConfigs } from "@packages/level2/meta/edit-resource/config/fd-edit-resource-configs";
|
|
14
|
+
|
|
15
|
+
export const metadata: FdHtmlMetadata = {
|
|
16
|
+
title: "SaaS Kit",
|
|
17
|
+
icons: [{ rel: "icon", url: Favicon.src }],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default async function RootLayout({ children }: { children: ReactNode }) {
|
|
21
|
+
const sidebarResourceNames: string[] = [];
|
|
22
|
+
|
|
23
|
+
setSidebarResourceNames(sidebarResourceNames);
|
|
24
|
+
await setMultiListEditResourceConfigs();
|
|
25
|
+
await setResourceListConfigs();
|
|
26
|
+
setEditResourceConfigs();
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<html lang="en">
|
|
30
|
+
<body className={cn(GeistSans.className, "h-screen text-sm")}>
|
|
31
|
+
<div className="flex h-full flex-col">
|
|
32
|
+
<FdProviders
|
|
33
|
+
globalConfig={{
|
|
34
|
+
...defaultGlobalConfig,
|
|
35
|
+
}}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
</FdProviders>
|
|
39
|
+
</div>
|
|
40
|
+
<FdToaster />
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { fdRedirect } from "@fd-toolbox/server/framework";
|
|
2
|
+
import { getResourceListUrl } from "@meta/services/meta-navigations";
|
|
3
|
+
import { resourceNames } from "@fd-toolbox/resources/resource-names";
|
|
4
|
+
|
|
5
|
+
export default function Home() {
|
|
6
|
+
const afterLoginUrl = getResourceListUrl(resourceNames.contact);
|
|
7
|
+
|
|
8
|
+
fdRedirect(afterLoginUrl);
|
|
9
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
* {
|
|
7
|
+
@apply border-border;
|
|
8
|
+
}
|
|
9
|
+
body {
|
|
10
|
+
@apply bg-background text-foreground;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@supports not (-webkit-appearance: none) {
|
|
15
|
+
* {
|
|
16
|
+
scrollbar-width: thin;
|
|
17
|
+
scrollbar-color: hsl(var(--fd-toolbar)) hsl(var(--background));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@supports (-webkit-appearance: none) {
|
|
22
|
+
*::-webkit-scrollbar {
|
|
23
|
+
width: 15px;
|
|
24
|
+
height: 15px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
*::-webkit-scrollbar-track {
|
|
28
|
+
background: hsl(var(--background));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
*::-webkit-scrollbar-thumb {
|
|
32
|
+
width: 9px;
|
|
33
|
+
height: 9px;
|
|
34
|
+
background: hsl(var(--fd-toolbar));
|
|
35
|
+
border-radius: var(--radius);
|
|
36
|
+
border: 3px solid hsl(var(--background));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
*::-webkit-scrollbar-thumb:hover {
|
|
40
|
+
background: hsl(var(--fd-toolbar-hover));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
*::-webkit-scrollbar-button {
|
|
44
|
+
display: none;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.scrollbar-hidden {
|
|
49
|
+
-ms-overflow-style: none;
|
|
50
|
+
scrollbar-width: none;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@media (max-width: 426px) {
|
|
54
|
+
html,
|
|
55
|
+
body {
|
|
56
|
+
overflow: auto;
|
|
57
|
+
-ms-overflow-style: none;
|
|
58
|
+
scrollbar-width: none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
body::-webkit-scrollbar,
|
|
62
|
+
body *::-webkit-scrollbar {
|
|
63
|
+
display: none;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@layer base {
|
|
68
|
+
input:-webkit-autofill,
|
|
69
|
+
input:-webkit-autofill:hover,
|
|
70
|
+
input:-webkit-autofill:focus {
|
|
71
|
+
-webkit-box-shadow: 0 0 0px 1000px hsl(var(--background)) inset;
|
|
72
|
+
-webkit-text-fill-color: hsl(var(--foreground));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
div.ql-toolbar.ql-snow {
|
|
2
|
+
padding: 0.5rem 0.75rem;
|
|
3
|
+
border-top-right-radius: var(--radius);
|
|
4
|
+
border-top-left-radius: var(--radius);
|
|
5
|
+
border: 1px solid hsl(var(--border));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.ql-toolbar.ql-snow .ql-picker-label {
|
|
9
|
+
padding-left: 0;
|
|
10
|
+
border: none;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.ql-toolbar.ql-snow .ql-picker-label::before {
|
|
14
|
+
font-family: "__GeistSans_3a0388", serif;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.ql-editor {
|
|
18
|
+
font-size: 14px;
|
|
19
|
+
padding: 10px 12px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
div.ql-container.ql-snow {
|
|
23
|
+
height: max-content;
|
|
24
|
+
border: 1px solid hsl(var(--border));
|
|
25
|
+
border-bottom-right-radius: var(--radius);
|
|
26
|
+
border-bottom-left-radius: var(--radius);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.ql-tooltip {
|
|
30
|
+
display: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
|
|
34
|
+
z-index: 11;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.ql-picker-label,
|
|
38
|
+
.ql-picker-label .ql-stroke {
|
|
39
|
+
color: hsl(var(--popover-foreground));
|
|
40
|
+
stroke: hsl(var(--popover-foreground));
|
|
41
|
+
fill: hsl(var(--popover-foreground));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.ql-toolbar .ql-formats button {
|
|
45
|
+
color: hsl(var(--popover-foreground));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.ql-toolbar .ql-formats button .ql-stroke {
|
|
49
|
+
stroke: hsl(var(--popover-foreground));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.ql-toolbar .ql-formats button .ql-fill {
|
|
53
|
+
fill: hsl(var(--popover-foreground));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.ql-toolbar .ql-active,
|
|
57
|
+
.ql-toolbar .ql-active .ql-stroke,
|
|
58
|
+
.ql-toolbar .ql-active .ql-fill {
|
|
59
|
+
color: hsl(var(--popover-foreground));
|
|
60
|
+
fill: none;
|
|
61
|
+
stroke: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.ql-snow .ql-picker {
|
|
65
|
+
font-weight: 400;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.ql-editor.ql-blank::before {
|
|
69
|
+
left: 12px;
|
|
70
|
+
right: 12px;
|
|
71
|
+
color: hsl(var(--muted-foreground));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.ql-toolbar .ql-formats button:hover .ql-stroke,
|
|
75
|
+
.ql-toolbar .ql-picker .ql-picker-label:hover .ql-stroke,
|
|
76
|
+
.ql-toolbar .ql-picker .ql-picker-label.ql-active .ql-stroke,
|
|
77
|
+
.ql-toolbar .ql-formats button.ql-active .ql-stroke {
|
|
78
|
+
stroke: hsl(var(--foreground));
|
|
79
|
+
stroke-width: 2;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.ql-toolbar .ql-formats button:hover .ql-fill,
|
|
83
|
+
.ql-toolbar .ql-formats button.ql-active .ql-fill {
|
|
84
|
+
fill: hsl(var(--foreground));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.ql-toolbar .ql-picker .ql-picker-label:hover::before,
|
|
88
|
+
.ql-toolbar .ql-picker .ql-picker-label.ql-active::before,
|
|
89
|
+
.ql-picker .ql-picker-options .ql-picker-item.ql-selected::before {
|
|
90
|
+
color: hsl(var(--foreground));
|
|
91
|
+
font-weight: 600;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.ql-snow .ql-picker-options .ql-picker-item:hover {
|
|
95
|
+
border-radius: 0.375rem;
|
|
96
|
+
background: hsl(var(--muted) / 0.5);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.ql-toolbar .ql-formats button .ql-stroke,
|
|
100
|
+
.ql-toolbar .ql-picker .ql-picker-label .ql-stroke {
|
|
101
|
+
stroke: hsl(var(--foreground));
|
|
102
|
+
stroke-width: 1.2;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.ql-toolbar .ql-formats button .ql-fill {
|
|
106
|
+
fill: hsl(var(--foreground));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.ql-toolbar .ql-picker .ql-picker-label::before,
|
|
110
|
+
.ql-picker .ql-picker-options .ql-picker-item::before {
|
|
111
|
+
color: hsl(var(--foreground));
|
|
112
|
+
font-weight: 400;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
|
|
116
|
+
min-width: 12rem;
|
|
117
|
+
z-index: 50;
|
|
118
|
+
margin-right: 1rem;
|
|
119
|
+
border-radius: 0.375rem;
|
|
120
|
+
background-color: hsl(var(--background));
|
|
121
|
+
border: 1px solid hsl(var(--border));
|
|
122
|
+
box-shadow: 0rem 0rem 0.1rem 0.01rem hsl(var(--fd-toolbar-shadow));
|
|
123
|
+
outline: none;
|
|
124
|
+
pointer-events: auto;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.ql-snow .ql-picker-options .ql-picker-item {
|
|
128
|
+
width: 100%;
|
|
129
|
+
padding: 0.5rem 0.75rem;
|
|
130
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getTailwindConfig } from "@fernir2/saas-kit";
|
|
2
|
+
|
|
3
|
+
const config = getTailwindConfig();
|
|
4
|
+
|
|
5
|
+
config.content = [
|
|
6
|
+
"./pages/**/*.{ts,tsx}",
|
|
7
|
+
"./components/**/*.{ts,tsx}",
|
|
8
|
+
"./app/**/*.{ts,tsx}",
|
|
9
|
+
"./src/**/*.{ts,tsx}",
|
|
10
|
+
"./node_modules/@fernir2/saas-kit/src/**/*.{js,ts,jsx,tsx}",
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
export default config;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2023",
|
|
4
|
+
"experimentalDecorators": true,
|
|
5
|
+
"emitDecoratorMetadata": true,
|
|
6
|
+
"lib": ["ES2023", "dom", "dom.iterable"],
|
|
7
|
+
"allowJs": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
|
|
12
|
+
"module": "esnext",
|
|
13
|
+
"moduleResolution": "bundler",
|
|
14
|
+
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"jsx": "preserve",
|
|
18
|
+
"incremental": true,
|
|
19
|
+
"plugins": [{ "name": "next" }],
|
|
20
|
+
|
|
21
|
+
"baseUrl": "./",
|
|
22
|
+
"preserveSymlinks": false,
|
|
23
|
+
"paths": {
|
|
24
|
+
"@/*": ["./src/*"],
|
|
25
|
+
"@cli/*": ["./cli/*"],
|
|
26
|
+
"@adders/*": ["./adders/*"],
|
|
27
|
+
"@server/*": ["./server/*"],
|
|
28
|
+
"@schemas/*": ["./generated/*"],
|
|
29
|
+
"@npm-commands/*": ["./npm-commands/*"],
|
|
30
|
+
"@root/*": ["./*"]
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
"forceConsistentCasingInFileNames": true,
|
|
34
|
+
"noFallthroughCasesInSwitch": true,
|
|
35
|
+
"sourceMap": true,
|
|
36
|
+
"importHelpers": true,
|
|
37
|
+
"noEmitHelpers": true,
|
|
38
|
+
"downlevelIteration": true,
|
|
39
|
+
"pretty": true,
|
|
40
|
+
"noUnusedLocals": true,
|
|
41
|
+
"noUnusedParameters": true,
|
|
42
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
43
|
+
"noImplicitOverride": true,
|
|
44
|
+
"useUnknownInCatchVariables": true,
|
|
45
|
+
|
|
46
|
+
"noEmit": false,
|
|
47
|
+
"declaration": true,
|
|
48
|
+
"declarationDir": "./build/package/types",
|
|
49
|
+
"rootDir": "./",
|
|
50
|
+
"outDir": "./build/package/types-output",
|
|
51
|
+
"noEmitOnError": true
|
|
52
|
+
},
|
|
53
|
+
"include": [
|
|
54
|
+
"src",
|
|
55
|
+
"cli",
|
|
56
|
+
"server",
|
|
57
|
+
"adders",
|
|
58
|
+
"generated",
|
|
59
|
+
"next-env.d.ts",
|
|
60
|
+
"global.d.ts",
|
|
61
|
+
".next/types/**/*.ts",
|
|
62
|
+
"playwright.config.ts"
|
|
63
|
+
],
|
|
64
|
+
"exclude": ["node_modules", "dist", "build", ".next", "coverage"]
|
|
65
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"module": "es2022",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"lib": ["ES2022", "dom"],
|
|
8
|
+
"target": "ES2022",
|
|
9
|
+
"isolatedModules": false,
|
|
10
|
+
"noEmit": false,
|
|
11
|
+
"strict": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["server.ts"]
|
|
14
|
+
}
|