startx 0.3.1 → 0.6.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 (40) hide show
  1. package/apps/cli/package.json +43 -0
  2. package/apps/cli/src/commands/ping.ts +10 -0
  3. package/apps/cli/src/index.ts +12 -0
  4. package/apps/cli/src/types.ts +0 -0
  5. package/apps/cli/src/utils/inquirer.ts +160 -0
  6. package/apps/core-server/package.json +4 -1
  7. package/apps/startx-cli/eslint.config.ts +4 -0
  8. package/{packages/cli → apps/startx-cli}/package.json +7 -3
  9. package/apps/startx-cli/src/commands/init.ts +415 -0
  10. package/apps/startx-cli/src/configs/deps.ts +45 -0
  11. package/apps/startx-cli/src/configs/files.ts +51 -0
  12. package/apps/startx-cli/src/configs/scripts.ts +158 -0
  13. package/apps/startx-cli/src/constants.ts +4 -0
  14. package/apps/startx-cli/src/index.ts +21 -0
  15. package/apps/startx-cli/src/types.ts +64 -0
  16. package/apps/startx-cli/src/utils/cli-utils.ts +104 -0
  17. package/apps/startx-cli/src/utils/config.ts +104 -0
  18. package/apps/startx-cli/src/utils/file-handler.ts +130 -0
  19. package/apps/startx-cli/src/utils/inquirer.ts +160 -0
  20. package/apps/startx-cli/tsconfig.json +12 -0
  21. package/apps/startx-cli/tsdown.config.ts +18 -0
  22. package/configs/eslint-config/package.json +4 -1
  23. package/configs/tsdown-config/package.json +5 -1
  24. package/configs/typescript-config/package.json +4 -0
  25. package/configs/vitest-config/package.json +5 -5
  26. package/package.json +5 -4
  27. package/packages/@repo/constants/package.json +2 -2
  28. package/packages/@repo/db/package.json +6 -1
  29. package/packages/@repo/env/package.json +3 -3
  30. package/packages/@repo/lib/package.json +1 -1
  31. package/packages/@repo/logger/package.json +3 -2
  32. package/packages/@repo/mail/package.json +5 -1
  33. package/packages/@repo/mail/src/index.ts +0 -1
  34. package/packages/@repo/redis/package.json +3 -2
  35. package/packages/ui/package.json +3 -5
  36. package/startx.json +1 -1
  37. package/packages/cli/dist/index.mjs +0 -203
  38. /package/{packages → apps}/cli/eslint.config.ts +0 -0
  39. /package/{packages → apps}/cli/tsconfig.json +0 -0
  40. /package/{packages → apps}/cli/tsdown.config.ts +0 -0
@@ -0,0 +1,160 @@
1
+ import { input, select, checkbox } from "@inquirer/prompts";
2
+ import { type z, type ZodTypeAny, ZodEnum, ZodNumber } from "zod";
3
+
4
+ type PromptProps<T extends ZodTypeAny | undefined> = {
5
+ name: string;
6
+ message: string;
7
+ schema?: T;
8
+ default?: T extends ZodTypeAny ? z.infer<T> : string;
9
+ };
10
+
11
+ type MultiSelectProps<T extends "single" | "multiple"> = {
12
+ message: string;
13
+ options: string[];
14
+ mode?: T;
15
+ default?: T extends "single" ? string : string[];
16
+ includeAllOption?: boolean;
17
+ required?: boolean;
18
+ };
19
+
20
+ export class CommonInquirer {
21
+ static async getText<T extends ZodTypeAny | undefined>(
22
+ props: PromptProps<T>
23
+ ): Promise<T extends ZodTypeAny ? z.infer<T> : string> {
24
+ const { message, schema, default: defaultValue } = props;
25
+
26
+ let validDefault: T extends ZodTypeAny ? z.infer<T> : string;
27
+
28
+ if (schema && defaultValue !== undefined) {
29
+ const result = schema.safeParse(defaultValue);
30
+ if (result.success) {
31
+ validDefault = result.data as T extends ZodTypeAny ? z.infer<T> : string;
32
+ }
33
+ } else if (!schema && defaultValue !== undefined) {
34
+ validDefault = defaultValue;
35
+ }
36
+
37
+ if (schema && schema instanceof ZodEnum) {
38
+ const formattedChoices = schema.options.map(opt => ({
39
+ value: opt,
40
+ }));
41
+
42
+ const answer = await select({
43
+ message,
44
+ choices: formattedChoices,
45
+ default: validDefault! as string,
46
+ });
47
+
48
+ return answer as T extends ZodTypeAny ? z.infer<T> : string;
49
+ }
50
+
51
+ const answer = await input({
52
+ message,
53
+ default: validDefault! as string,
54
+ validate: (value: string) => {
55
+ if (!schema) return true;
56
+
57
+ let valToValidate: string | number = value;
58
+
59
+ if (schema instanceof ZodNumber) {
60
+ if (value.trim() === "") return "Input cannot be empty";
61
+
62
+ const parsed = Number(value);
63
+ if (Number.isNaN(parsed)) {
64
+ return "Please enter a valid number";
65
+ }
66
+
67
+ valToValidate = parsed;
68
+ }
69
+
70
+ const result = schema.safeParse(valToValidate);
71
+
72
+ if (!result.success) {
73
+ return result.error.issues[0]?.message ?? "Invalid input";
74
+ }
75
+
76
+ return true;
77
+ },
78
+ });
79
+
80
+ if (!schema) {
81
+ return answer as T extends ZodTypeAny ? z.infer<T> : string;
82
+ }
83
+
84
+ const finalValue = schema instanceof ZodNumber ? Number(answer) : answer;
85
+
86
+ return schema.parse(finalValue) as T extends ZodTypeAny ? z.infer<T> : string;
87
+ }
88
+
89
+ static async choose(props: MultiSelectProps<"single">): Promise<string>;
90
+ static async choose(props: MultiSelectProps<"multiple">): Promise<string[]>;
91
+ static async choose<T extends "single" | "multiple">(props: MultiSelectProps<T>) {
92
+ const {
93
+ message,
94
+ options,
95
+ mode = "single",
96
+ default: defaultValue,
97
+ includeAllOption = false,
98
+ required = false,
99
+ } = props;
100
+
101
+ const ALL = "__all__";
102
+
103
+ // const defaults = Array.isArray(defaultValue)
104
+ // ? defaultValue
105
+ // : defaultValue
106
+ // ? [defaultValue]
107
+ // : [] as string[];
108
+
109
+ const defaultValues = (
110
+ mode === "single" ? [defaultValue] : [...(defaultValue || [])]
111
+ ) as string[];
112
+
113
+ const choices = [
114
+ ...(mode === "multiple" && includeAllOption
115
+ ? [
116
+ {
117
+ name: "All",
118
+ value: ALL,
119
+ checked: defaultValues.includes(ALL),
120
+ },
121
+ ]
122
+ : []),
123
+ ...options.map(opt => ({
124
+ name: opt,
125
+ value: opt,
126
+ checked: defaultValues.includes(opt),
127
+ })),
128
+ ];
129
+
130
+ if (mode === "multiple") {
131
+ const answer = await checkbox({
132
+ message,
133
+ choices,
134
+ validate: input => {
135
+ if (required && input.length === 0) {
136
+ return "You must select at least one option.";
137
+ }
138
+ return true;
139
+ },
140
+ });
141
+
142
+ if (includeAllOption && answer.includes(ALL)) {
143
+ return options;
144
+ }
145
+
146
+ return answer;
147
+ }
148
+
149
+ const answer = await select({
150
+ message,
151
+ choices: options.map(opt => ({
152
+ name: opt,
153
+ value: opt,
154
+ })),
155
+ default: typeof defaultValue === "string" ? defaultValue : undefined,
156
+ });
157
+
158
+ return answer;
159
+ }
160
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "typescript-config/tsconfig.node.json",
3
+ "compilerOptions": {
4
+ // "baseUrl": "./src",
5
+ "moduleResolution": "bundler",
6
+ "module": "esnext",
7
+ "target": "es2022",
8
+ "resolveJsonModule": true
9
+ },
10
+
11
+ "include": ["src/**/*.ts"]
12
+ }
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from "tsdown";
2
+ import { baseConfig } from "tsdown-config";
3
+
4
+ export default defineConfig({
5
+ ...baseConfig,
6
+ platform: "node",
7
+ external: ["sharp"],
8
+ inlineOnly: false,
9
+ noExternal: [/(.*)/],
10
+ outputOptions: {
11
+ codeSplitting: false,
12
+ preserveModules: false,
13
+ legalComments: "none",
14
+ },
15
+ define: {
16
+ "process.env.NODE_ENV": JSON.stringify("production"),
17
+ },
18
+ });
@@ -44,9 +44,12 @@
44
44
  "vitest-config": "workspace:*"
45
45
  },
46
46
  "startx": {
47
- "tags": [
47
+ "gTags": [
48
48
  "eslint"
49
49
  ],
50
+ "iTags": [
51
+ "node"
52
+ ],
50
53
  "requiredDevDeps": [
51
54
  "typescript-config"
52
55
  ],
@@ -9,9 +9,13 @@
9
9
  "deep:clean": "rimraf node_modules dist"
10
10
  },
11
11
  "startx": {
12
- "tags": [
12
+ "gTags": [
13
13
  "tsdown"
14
14
  ],
15
+ "iTags": [
16
+ "node"
17
+ ],
18
+ "mode": "silent",
15
19
  "ignore": [
16
20
  "eslint-config",
17
21
  "typescript-config",
@@ -11,6 +11,10 @@
11
11
  "tags": [
12
12
  "common"
13
13
  ],
14
+ "iTags": [
15
+ "node"
16
+ ],
17
+ "mode": "silent",
14
18
  "ignore": [
15
19
  "eslint-config",
16
20
  "typescript-config",
@@ -2,11 +2,8 @@
2
2
  "name": "vitest-config",
3
3
  "version": "1.5.0",
4
4
  "type": "module",
5
- "peerDependencies": {
6
- "vite": "catalog:",
7
- "vitest": "catalog:"
8
- },
9
5
  "devDependencies": {
6
+ "vitest": "catalog:",
10
7
  "typescript-config": "workspace:*",
11
8
  "vite": "catalog:"
12
9
  },
@@ -24,9 +21,12 @@
24
21
  "format:check": "biome ci ."
25
22
  },
26
23
  "startx": {
27
- "tags": [
24
+ "gTags": [
28
25
  "vitest"
29
26
  ],
27
+ "iTags": [
28
+ "node"
29
+ ],
30
30
  "requiredDevDeps": [
31
31
  "typescript-config"
32
32
  ],
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "startx",
3
- "version": "0.3.1",
3
+ "description": "",
4
+ "version": "0.6.0",
4
5
  "repository": {
5
6
  "type": "git",
6
7
  "url": "git+https://github.com/avinashid/startx.git"
7
8
  },
8
9
  "bin": {
9
- "startx": "./packages/cli/dist/index.mjs"
10
+ "startx": "./apps/startx-cli/dist/index.mjs"
10
11
  },
11
12
  "engines": {
12
13
  "node": ">=22"
@@ -23,9 +24,9 @@
23
24
  "dev": "turbo dev",
24
25
  "build": "turbo build",
25
26
  "start": "turbo start",
26
- "startx": "node ./packages/cli/dist/index.mjs",
27
+ "startx": "node ./apps/startx-cli/dist/index.mjs",
27
28
  "backend": "turbo dev --filter=core-server -- ",
28
- "cli": "turbo dev --filter=cli -- ",
29
+ "cli": "turbo cli --filter=startx-cli -- ",
29
30
  "lint": "turbo lint",
30
31
  "typecheck": "turbo typecheck",
31
32
  "clean": "turbo clean",
@@ -19,8 +19,8 @@
19
19
  "eslint-config": "workspace:*"
20
20
  },
21
21
  "startx": {
22
- "tags": [
23
- "common"
22
+ "iTags": [
23
+ "node"
24
24
  ],
25
25
  "requiredDeps": [
26
26
  "@repo/env"
@@ -25,8 +25,13 @@
25
25
  "@repo/env": "workspace:*"
26
26
  },
27
27
  "startx": {
28
+ "iTags": [
29
+ "node",
30
+ "backend"
31
+ ],
28
32
  "tags": [
29
- "node"
33
+ "db",
34
+ "drizzle"
30
35
  ],
31
36
  "requiredDeps": [
32
37
  "@repo/env"
@@ -19,15 +19,15 @@
19
19
  "devDependencies": {
20
20
  "eslint-config": "workspace:*",
21
21
  "typescript-config": "workspace:*",
22
- "vitest": "catalog:",
23
22
  "vitest-config": "workspace:*"
24
23
  },
25
24
  "dependencies": {
26
25
  "dotenv": "catalog:"
27
26
  },
28
27
  "startx": {
29
- "tags": [
30
- "node"
28
+ "iTags": [
29
+ "node",
30
+ "backend"
31
31
  ],
32
32
  "requiredDeps": [
33
33
  "@repo/env"
@@ -40,7 +40,7 @@
40
40
  "yaml": "^2.8.2"
41
41
  },
42
42
  "startx": {
43
- "tags": [
43
+ "iTags": [
44
44
  "node",
45
45
  "backend"
46
46
  ],
@@ -27,8 +27,9 @@
27
27
  "@repo/env": "workspace:*"
28
28
  },
29
29
  "startx": {
30
- "tags": [
31
- "node"
30
+ "iTags": [
31
+ "node",
32
+ "backend"
32
33
  ],
33
34
  "requiredDeps": [
34
35
  "@repo/env"
@@ -26,8 +26,12 @@
26
26
  "typescript-config": "workspace:*"
27
27
  },
28
28
  "startx": {
29
+ "iTags": [
30
+ "node",
31
+ "backend"
32
+ ],
29
33
  "tags": [
30
- "node"
34
+ "mail"
31
35
  ],
32
36
  "requiredDevDeps": [
33
37
  "typescript-config"
@@ -1,5 +1,4 @@
1
1
  import { render } from "@react-email/render";
2
-
3
2
  import VerifyEmailOtp from "./emails/admin/OtpEmail.js";
4
3
  export class AdminEmailTemplate {
5
4
  static getOtpEmail = async (props: { otp: string }) => {
@@ -24,8 +24,9 @@
24
24
  "@repo/logger": "workspace:*"
25
25
  },
26
26
  "startx": {
27
- "tags": [
28
- "node"
27
+ "iTags": [
28
+ "node",
29
+ "backend"
29
30
  ],
30
31
  "requiredDevDeps": [
31
32
  "typescript-config"
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "@repo/ui",
2
+ "name": "ui",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
5
  "type": "module",
@@ -24,9 +24,7 @@
24
24
  "postcss": "^8.4.49",
25
25
  "postcss-load-config": "^6",
26
26
  "tailwindcss": "catalog:",
27
- "typescript": "catalog:",
28
- "typescript-config": "workspace:*",
29
- "vite": "catalog:"
27
+ "typescript-config": "workspace:*"
30
28
  },
31
29
  "dependencies": {
32
30
  "@hookform/resolvers": "^3.9.1",
@@ -66,7 +64,7 @@
66
64
  "./*/*": "./src/components/*/*"
67
65
  },
68
66
  "startx": {
69
- "tags": [
67
+ "iTags": [
70
68
  "react",
71
69
  "frontend"
72
70
  ],
package/startx.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "devDependencies": {
4
4
  "@biomejs/biome": "catalog:",
5
5
  "prettier": "catalog:",
6
+ "eslint": "catalog:",
6
7
  "rimraf": "catalog:",
7
8
  "turbo": "catalog:",
8
9
  "typescript": "catalog:",
9
10
  "tsdown": "catalog:",
10
11
  "unrun": "catalog:",
11
- "vitest": "catalog:",
12
12
  "tsx": "catalog:",
13
13
  "@types/node": "catalog:"
14
14
  },