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.
- package/apps/cli/package.json +43 -0
- package/apps/cli/src/commands/ping.ts +10 -0
- package/apps/cli/src/index.ts +12 -0
- package/apps/cli/src/types.ts +0 -0
- package/apps/cli/src/utils/inquirer.ts +160 -0
- package/apps/core-server/package.json +4 -1
- package/apps/startx-cli/eslint.config.ts +4 -0
- package/{packages/cli → apps/startx-cli}/package.json +7 -3
- package/apps/startx-cli/src/commands/init.ts +415 -0
- package/apps/startx-cli/src/configs/deps.ts +45 -0
- package/apps/startx-cli/src/configs/files.ts +51 -0
- package/apps/startx-cli/src/configs/scripts.ts +158 -0
- package/apps/startx-cli/src/constants.ts +4 -0
- package/apps/startx-cli/src/index.ts +21 -0
- package/apps/startx-cli/src/types.ts +64 -0
- package/apps/startx-cli/src/utils/cli-utils.ts +104 -0
- package/apps/startx-cli/src/utils/config.ts +104 -0
- package/apps/startx-cli/src/utils/file-handler.ts +130 -0
- package/apps/startx-cli/src/utils/inquirer.ts +160 -0
- package/apps/startx-cli/tsconfig.json +12 -0
- package/apps/startx-cli/tsdown.config.ts +18 -0
- package/configs/eslint-config/package.json +4 -1
- package/configs/tsdown-config/package.json +5 -1
- package/configs/typescript-config/package.json +4 -0
- package/configs/vitest-config/package.json +5 -5
- package/package.json +5 -4
- package/packages/@repo/constants/package.json +2 -2
- package/packages/@repo/db/package.json +6 -1
- package/packages/@repo/env/package.json +3 -3
- package/packages/@repo/lib/package.json +1 -1
- package/packages/@repo/logger/package.json +3 -2
- package/packages/@repo/mail/package.json +5 -1
- package/packages/@repo/mail/src/index.ts +0 -1
- package/packages/@repo/redis/package.json +3 -2
- package/packages/ui/package.json +3 -5
- package/startx.json +1 -1
- package/packages/cli/dist/index.mjs +0 -203
- /package/{packages → apps}/cli/eslint.config.ts +0 -0
- /package/{packages → apps}/cli/tsconfig.json +0 -0
- /package/{packages → apps}/cli/tsdown.config.ts +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { WHITELIST_DEPS } from "../types";
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
4
|
+
export const DepCheck: WHITELIST_DEPS = {
|
|
5
|
+
"@biomejs/biome": {
|
|
6
|
+
tags: ["node", "biome", "root"],
|
|
7
|
+
version: "catalog:",
|
|
8
|
+
},
|
|
9
|
+
"prettier": {
|
|
10
|
+
tags: ["node", "prettier", "root"],
|
|
11
|
+
version: "catalog:",
|
|
12
|
+
},
|
|
13
|
+
"eslint": {
|
|
14
|
+
tags: ["node", "eslint", "root"],
|
|
15
|
+
version: "catalog:",
|
|
16
|
+
},
|
|
17
|
+
"vitest": {
|
|
18
|
+
tags: ["node", "vitest", "root"],
|
|
19
|
+
version: "catalog:",
|
|
20
|
+
},
|
|
21
|
+
"tsdown": {
|
|
22
|
+
tags: ["node", "tsdown", "root"],
|
|
23
|
+
version: "catalog:",
|
|
24
|
+
},
|
|
25
|
+
"@types/node": {
|
|
26
|
+
tags: ["node", "root"],
|
|
27
|
+
version: "catalog:",
|
|
28
|
+
isDevDependency: true,
|
|
29
|
+
},
|
|
30
|
+
"typescript-config": {
|
|
31
|
+
tags: ["node"],
|
|
32
|
+
version: "workspace:^",
|
|
33
|
+
isDevDependency: true,
|
|
34
|
+
},
|
|
35
|
+
"eslint-config": {
|
|
36
|
+
tags: ["node", "eslint"],
|
|
37
|
+
version: "workspace:^",
|
|
38
|
+
isDevDependency: true,
|
|
39
|
+
},
|
|
40
|
+
"vitest-config": {
|
|
41
|
+
tags: ["node", "vitest"],
|
|
42
|
+
version: "workspace:^",
|
|
43
|
+
isDevDependency: true,
|
|
44
|
+
},
|
|
45
|
+
} as const;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
import type { WHITELIST_FILES } from "../types";
|
|
3
|
+
|
|
4
|
+
export const FileCheck: WHITELIST_FILES = {
|
|
5
|
+
"startx.json": {
|
|
6
|
+
tags: ["never"],
|
|
7
|
+
},
|
|
8
|
+
".npmignore": {
|
|
9
|
+
tags: ["never"],
|
|
10
|
+
},
|
|
11
|
+
".npmrc": {
|
|
12
|
+
tags: ["never"],
|
|
13
|
+
},
|
|
14
|
+
".prettierignore": {
|
|
15
|
+
tags: ["prettier"],
|
|
16
|
+
},
|
|
17
|
+
".prettier.js": {
|
|
18
|
+
tags: ["prettier"],
|
|
19
|
+
},
|
|
20
|
+
"biome.json": {
|
|
21
|
+
tags: ["biome"],
|
|
22
|
+
},
|
|
23
|
+
"pnpm-lock.yaml": {
|
|
24
|
+
tags: ["never"],
|
|
25
|
+
},
|
|
26
|
+
"pnpm-workspace.yaml": {
|
|
27
|
+
tags: ["root"],
|
|
28
|
+
},
|
|
29
|
+
"turbo.json": {
|
|
30
|
+
tags: ["root"],
|
|
31
|
+
},
|
|
32
|
+
"LICENSE": {
|
|
33
|
+
tags: ["never"],
|
|
34
|
+
},
|
|
35
|
+
".env": {
|
|
36
|
+
tags: ["never"],
|
|
37
|
+
},
|
|
38
|
+
"tsdown.config.ts": {
|
|
39
|
+
tags: ["tsdown"],
|
|
40
|
+
},
|
|
41
|
+
// Handled manually
|
|
42
|
+
"eslint.config.ts": {
|
|
43
|
+
tags: ["never"],
|
|
44
|
+
},
|
|
45
|
+
"vitest.config.ts": {
|
|
46
|
+
tags: ["never"],
|
|
47
|
+
},
|
|
48
|
+
"package.json": {
|
|
49
|
+
tags: ["never"],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
|
|
3
|
+
import type { SCRIPT } from "../types";
|
|
4
|
+
|
|
5
|
+
export const scripts: SCRIPT = {
|
|
6
|
+
"dev": [
|
|
7
|
+
{
|
|
8
|
+
script: "turbo run dev",
|
|
9
|
+
tags: ["runnable", "root"],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
script: "tsx watch src/index.ts",
|
|
13
|
+
tags: ["runnable", "node", "backend", "dev"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
script: "email dev --port 3014 --dir ./src",
|
|
17
|
+
tags: ["node", "mail"],
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
"dev:debug": [
|
|
21
|
+
{
|
|
22
|
+
script: "turbo run dev:debug",
|
|
23
|
+
tags: ["node", "runnable", "root"],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
script: "tsx watch --inspect src/index.ts",
|
|
27
|
+
tags: ["backend", "node", "runnable", "dev"],
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
"bun:dev": [
|
|
31
|
+
{
|
|
32
|
+
script: "turbo run bun:dev",
|
|
33
|
+
tags: ["node", "runnable", "root"],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
script: "bun --watch src/index.ts",
|
|
37
|
+
tags: ["backend", "node", "runnable", "dev"],
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
"build": [
|
|
41
|
+
{
|
|
42
|
+
script: "turbo run build",
|
|
43
|
+
tags: ["runnable", "root"],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
script: "tsdown --config-loader unrun",
|
|
47
|
+
tags: ["runnable", "node"],
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
"cli": [
|
|
51
|
+
{
|
|
52
|
+
script: "turbo run cli",
|
|
53
|
+
tags: ["runnable", "node", "cli", "root"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
script: "tsx src/index.ts",
|
|
57
|
+
tags: ["runnable", "node", "cli", "commander"],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
"start": [
|
|
61
|
+
{
|
|
62
|
+
script: "turbo run start",
|
|
63
|
+
tags: ["backend", "runnable", "node", "root"],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
script: "node dist/index.mjs",
|
|
67
|
+
tags: ["node", "runnable"],
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
"lint": [
|
|
71
|
+
{
|
|
72
|
+
script: "turbo run eslint",
|
|
73
|
+
tags: ["node", "eslint", "root"],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
script: "eslint .",
|
|
77
|
+
tags: ["node", "eslint"],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
"lint:fix": [
|
|
81
|
+
{
|
|
82
|
+
script: "turbo run lint:fix",
|
|
83
|
+
tags: ["node", "eslint", "root"],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
script: "eslint . src/**/*.ts --fix",
|
|
87
|
+
tags: ["node", "eslint"],
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
"clean": [
|
|
91
|
+
{
|
|
92
|
+
script: "turbo run clean",
|
|
93
|
+
tags: ["root"],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
script: "rimraf dist .turbo dist",
|
|
97
|
+
tags: [],
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
"deep:clean": [
|
|
101
|
+
{
|
|
102
|
+
script: "turbo run deep:clean",
|
|
103
|
+
tags: ["root"],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
script: "rimraf node_modules dist .turbo",
|
|
107
|
+
tags: ["node"],
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
"typecheck": [
|
|
111
|
+
{
|
|
112
|
+
script: "turbo run typecheck",
|
|
113
|
+
tags: ["node", "root"],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
script: "tsc --noEmit",
|
|
117
|
+
tags: ["node"],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
"format": [
|
|
121
|
+
{
|
|
122
|
+
script: "turbo run format",
|
|
123
|
+
tags: ["node", "root"],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
script: "biome format --write .",
|
|
127
|
+
tags: ["node", "biome", "prettier"],
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"script": "prettier --write .",
|
|
131
|
+
"tags": ["node", "prettier"],
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
"format:check": [
|
|
135
|
+
{
|
|
136
|
+
script: "turbo run format:check",
|
|
137
|
+
tags: ["node", "root"],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
script: "biome ci .",
|
|
141
|
+
tags: ["node", "biome", "prettier"],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"script": "prettier --check .",
|
|
145
|
+
"tags": ["node", "prettier"],
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
"test": [
|
|
149
|
+
{
|
|
150
|
+
script: "turbo run test",
|
|
151
|
+
tags: ["node", "vitest", "root"],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
script: "vitest run",
|
|
155
|
+
tags: ["node", "vitest"],
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
} as const;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { logger } from "@repo/logger";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
|
|
5
|
+
import { InitCommand } from "./commands/init";
|
|
6
|
+
import { version } from "../../../package.json";
|
|
7
|
+
|
|
8
|
+
const program = new Command();
|
|
9
|
+
|
|
10
|
+
program
|
|
11
|
+
.name("startx")
|
|
12
|
+
.description("StartX CLI - Your all in one monorepo startup tool.")
|
|
13
|
+
.version(version);
|
|
14
|
+
|
|
15
|
+
program.command("ping").action(() => {
|
|
16
|
+
logger.info("pong");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
program.addCommand(InitCommand.command);
|
|
20
|
+
|
|
21
|
+
program.parse(process.argv);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
import type { PackageJson } from "type-fest";
|
|
3
|
+
|
|
4
|
+
export type TAGS =
|
|
5
|
+
| "required"
|
|
6
|
+
| "common"
|
|
7
|
+
| "runnable"
|
|
8
|
+
| "biome"
|
|
9
|
+
| "prettier"
|
|
10
|
+
| "vitest"
|
|
11
|
+
| "eslint"
|
|
12
|
+
| "tsdown"
|
|
13
|
+
| "node"
|
|
14
|
+
| "backend"
|
|
15
|
+
| "dev"
|
|
16
|
+
| "frontend"
|
|
17
|
+
| "cli"
|
|
18
|
+
| "commander"
|
|
19
|
+
| "react"
|
|
20
|
+
| "extra"
|
|
21
|
+
| "mail"
|
|
22
|
+
| "never"
|
|
23
|
+
| "root";
|
|
24
|
+
|
|
25
|
+
export type SCRIPT = Record<string, Array<{ script: string; tags: TAGS[] }>>;
|
|
26
|
+
|
|
27
|
+
export type WHITELIST_DEPS = Record<
|
|
28
|
+
string,
|
|
29
|
+
{ tags: TAGS[]; version: string; isDevDependency?: boolean }
|
|
30
|
+
>;
|
|
31
|
+
export type WHITELIST_FILES = Record<string, { tags: TAGS[] }>;
|
|
32
|
+
|
|
33
|
+
export type PackageDef<T extends string> = {
|
|
34
|
+
source: string;
|
|
35
|
+
dependencies?: T[];
|
|
36
|
+
devDependencies?: T[];
|
|
37
|
+
optional?: T[];
|
|
38
|
+
dir?: string[];
|
|
39
|
+
file?: string[];
|
|
40
|
+
files?: string[];
|
|
41
|
+
tags: TAGS[];
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
type NoInfer<T> = [T][T extends unknown ? 0 : never];
|
|
45
|
+
|
|
46
|
+
export const Packages = <T extends string>(config: Record<T, PackageDef<NoInfer<T>>>) => config;
|
|
47
|
+
|
|
48
|
+
export type PnpmWorkspace = {
|
|
49
|
+
packages: string[];
|
|
50
|
+
catalog?: Record<string, string>;
|
|
51
|
+
catalogs?: Record<string, Record<string, string>>;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type StartXPackageJson = PackageJson & {
|
|
55
|
+
startx?: {
|
|
56
|
+
mode?: "silent" | "standalone";
|
|
57
|
+
tags?: TAGS[]; // self tags (can be used to identify this package)
|
|
58
|
+
iTags?: TAGS[]; // install tags (must be available to install packages)
|
|
59
|
+
gTags?: TAGS[]; // global tags (to be pushed globally if installed)
|
|
60
|
+
requiredDeps?: string[];
|
|
61
|
+
requiredDevDeps?: string[];
|
|
62
|
+
ignore?: string[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { defineEnv } from "@repo/env";
|
|
2
|
+
import { fsTool } from "@repo/lib/file-system-module";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import z from "zod";
|
|
6
|
+
|
|
7
|
+
import type { PnpmWorkspace, StartXPackageJson } from "../types";
|
|
8
|
+
|
|
9
|
+
export type RawPackageItem = {
|
|
10
|
+
type: "apps" | "configs" | "packages";
|
|
11
|
+
path: string;
|
|
12
|
+
name: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const ENV = defineEnv({
|
|
16
|
+
STARTX_ENV: z.enum(["development", "production", "test", "staging"]).default("production"),
|
|
17
|
+
});
|
|
18
|
+
export class CliUtils {
|
|
19
|
+
static getDirectory() {
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
let template = path.dirname(__filename);
|
|
22
|
+
const workspace = process.cwd();
|
|
23
|
+
if (ENV.STARTX_ENV === "development") {
|
|
24
|
+
template = path.resolve(template, "../../../../");
|
|
25
|
+
} else template = path.resolve(template, "../../../");
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
template,
|
|
29
|
+
workspace,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
static async getPackageList() {
|
|
33
|
+
const packages: RawPackageItem[] = [];
|
|
34
|
+
const cliDirectory = this.getDirectory().template;
|
|
35
|
+
const safeListDir = async (dir: string): Promise<string[]> => {
|
|
36
|
+
try {
|
|
37
|
+
return await fsTool.listDirectories({ dir });
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error("Error listing directory:", error);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const [availableApps, availableConfigs, availablePackages, availableRepoPackages] =
|
|
45
|
+
await Promise.all([
|
|
46
|
+
safeListDir(path.join(cliDirectory, "apps")),
|
|
47
|
+
safeListDir(path.join(cliDirectory, "configs")),
|
|
48
|
+
safeListDir(path.join(cliDirectory, "packages")),
|
|
49
|
+
safeListDir(path.join(cliDirectory, "packages", "@repo")),
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
// 2. Map Apps
|
|
53
|
+
availableApps.forEach(name => {
|
|
54
|
+
packages.push({
|
|
55
|
+
type: "apps",
|
|
56
|
+
path: path.join(cliDirectory, "apps", name),
|
|
57
|
+
name,
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
availableConfigs.forEach(name => {
|
|
62
|
+
packages.push({
|
|
63
|
+
type: "configs",
|
|
64
|
+
path: path.join(cliDirectory, "configs", name),
|
|
65
|
+
name,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
availablePackages.forEach(name => {
|
|
70
|
+
if (name === "@repo") return;
|
|
71
|
+
packages.push({
|
|
72
|
+
type: "packages",
|
|
73
|
+
path: path.join(cliDirectory, "packages", name),
|
|
74
|
+
name,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
availableRepoPackages.forEach(name => {
|
|
79
|
+
packages.push({
|
|
80
|
+
type: "packages",
|
|
81
|
+
path: path.join(cliDirectory, "packages", "@repo", name),
|
|
82
|
+
name: `@repo/${name}`,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return packages;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static async parsePackageJson({ dir, file = "package" }: { dir: string; file?: string }) {
|
|
90
|
+
const packageJson = await fsTool.readJSONFile<StartXPackageJson>({
|
|
91
|
+
dir,
|
|
92
|
+
file,
|
|
93
|
+
});
|
|
94
|
+
return packageJson;
|
|
95
|
+
}
|
|
96
|
+
static async parsePnpmWorkspace({ dir }: { dir: string }) {
|
|
97
|
+
const yaml = await fsTool.readYamlFile({
|
|
98
|
+
file: "pnpm-workspace",
|
|
99
|
+
dir,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return yaml?.toJSON() as PnpmWorkspace;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
+
|
|
3
|
+
import { Packages } from "../types";
|
|
4
|
+
|
|
5
|
+
export const packages = Packages({
|
|
6
|
+
"eslint-config": {
|
|
7
|
+
source: "./configs/eslint-config",
|
|
8
|
+
dependencies: [],
|
|
9
|
+
devDependencies: ["typescript-config"],
|
|
10
|
+
optional: ["vitest-config"],
|
|
11
|
+
dir: ["src"],
|
|
12
|
+
file: ["plugins.d.ts"],
|
|
13
|
+
tags: ["common"],
|
|
14
|
+
},
|
|
15
|
+
"typescript-config": {
|
|
16
|
+
source: "./configs/typescript-config",
|
|
17
|
+
dependencies: [],
|
|
18
|
+
devDependencies: [],
|
|
19
|
+
dir: [],
|
|
20
|
+
files: ["tsconfig.common.json", "tsconfig.frontend.json", "tsconfig.node.json"],
|
|
21
|
+
tags: ["required"],
|
|
22
|
+
},
|
|
23
|
+
"vitest-config": {
|
|
24
|
+
source: "./configs/vitest-config",
|
|
25
|
+
dependencies: ["typescript-config"],
|
|
26
|
+
devDependencies: ["eslint-config"],
|
|
27
|
+
dir: [],
|
|
28
|
+
tags: ["required"],
|
|
29
|
+
},
|
|
30
|
+
"@repo/ui": {
|
|
31
|
+
source: "./packages/ui",
|
|
32
|
+
dependencies: [],
|
|
33
|
+
devDependencies: ["typescript-config"],
|
|
34
|
+
optional: ["eslint-config"],
|
|
35
|
+
dir: [
|
|
36
|
+
"src/components/lib",
|
|
37
|
+
"src/components/util",
|
|
38
|
+
"src/components/ilb",
|
|
39
|
+
"src/components/util",
|
|
40
|
+
"src/components/custom",
|
|
41
|
+
"src/components/extensions",
|
|
42
|
+
"src/components/hooks",
|
|
43
|
+
"src/components/ui",
|
|
44
|
+
],
|
|
45
|
+
files: [
|
|
46
|
+
"components.json",
|
|
47
|
+
"tailwind.config.ts",
|
|
48
|
+
"postcss.config.ts",
|
|
49
|
+
"src/globals.css",
|
|
50
|
+
"src/lucide.ts",
|
|
51
|
+
],
|
|
52
|
+
tags: ["common", "react"],
|
|
53
|
+
},
|
|
54
|
+
"@repo/constants": {
|
|
55
|
+
source: "./packages/@repo/constants",
|
|
56
|
+
dependencies: [],
|
|
57
|
+
devDependencies: ["typescript-config"],
|
|
58
|
+
optional: ["eslint-config"],
|
|
59
|
+
dir: ["src"],
|
|
60
|
+
tags: ["common"],
|
|
61
|
+
},
|
|
62
|
+
"@repo/env": {
|
|
63
|
+
source: "./packages/@repo/env",
|
|
64
|
+
dependencies: [],
|
|
65
|
+
devDependencies: ["typescript-config"],
|
|
66
|
+
optional: ["eslint-config", "vitest-config"],
|
|
67
|
+
dir: ["src"],
|
|
68
|
+
tags: ["common", "node"],
|
|
69
|
+
},
|
|
70
|
+
"@repo/db": {
|
|
71
|
+
source: "./packages/@repo/db",
|
|
72
|
+
dependencies: ["@repo/env"],
|
|
73
|
+
devDependencies: ["typescript-config"],
|
|
74
|
+
optional: ["eslint-config"],
|
|
75
|
+
dir: ["src"],
|
|
76
|
+
tags: ["common", "node"],
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
"@repo/lib": {
|
|
80
|
+
source: "./packages/@repo/lib",
|
|
81
|
+
dependencies: ["@repo/env", "@repo/mail", "@repo/db"],
|
|
82
|
+
devDependencies: ["typescript-config"],
|
|
83
|
+
optional: ["eslint-config", "vitest-config"],
|
|
84
|
+
dir: ["src"],
|
|
85
|
+
tags: ["common", "node"],
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
"@repo/mail": {
|
|
89
|
+
source: "./packages/@repo/mail",
|
|
90
|
+
dependencies: [],
|
|
91
|
+
devDependencies: ["typescript-config"],
|
|
92
|
+
optional: ["eslint-config"],
|
|
93
|
+
dir: ["src"],
|
|
94
|
+
tags: ["common", "node"],
|
|
95
|
+
},
|
|
96
|
+
"@repo/redis": {
|
|
97
|
+
source: "./packages/@repo/redis",
|
|
98
|
+
dependencies: [],
|
|
99
|
+
devDependencies: ["typescript-config"],
|
|
100
|
+
optional: ["eslint-config"],
|
|
101
|
+
dir: ["src"],
|
|
102
|
+
tags: ["common", "node", "extra"],
|
|
103
|
+
},
|
|
104
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { DepCheck } from "../configs/deps";
|
|
2
|
+
import { scripts } from "../configs/scripts";
|
|
3
|
+
import { Constants } from "../constants";
|
|
4
|
+
import type { StartXPackageJson, TAGS } from "../types";
|
|
5
|
+
|
|
6
|
+
export class FileHandler {
|
|
7
|
+
private static objSorter(obj: Record<string, unknown>, sorter: string[] = []) {
|
|
8
|
+
const cleaned = Object.fromEntries(
|
|
9
|
+
Object.entries(obj).filter(([, v]) => v !== null && v !== undefined)
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const sortedEntries: Array<[string, unknown]> = [];
|
|
13
|
+
|
|
14
|
+
for (const key of sorter) {
|
|
15
|
+
if (key in cleaned) {
|
|
16
|
+
sortedEntries.push([key, cleaned[key]]);
|
|
17
|
+
delete cleaned[key];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
for (const entry of Object.entries(cleaned)) {
|
|
22
|
+
sortedEntries.push(entry);
|
|
23
|
+
}
|
|
24
|
+
return Object.fromEntries(sortedEntries);
|
|
25
|
+
}
|
|
26
|
+
static handlePackageJson(props: {
|
|
27
|
+
name?: string;
|
|
28
|
+
app: StartXPackageJson;
|
|
29
|
+
tags: TAGS[];
|
|
30
|
+
dependencies?: Record<string, string>;
|
|
31
|
+
}) {
|
|
32
|
+
const isWorkspace = !!props.app.devDependencies?.turbo;
|
|
33
|
+
|
|
34
|
+
const tags = isWorkspace ? [...props.tags, "root"] : [...props.tags];
|
|
35
|
+
const workspaceAttr: Record<string, unknown> = isWorkspace
|
|
36
|
+
? {
|
|
37
|
+
version: "1.0.0",
|
|
38
|
+
packageManager: Constants.packageManager,
|
|
39
|
+
engines: {
|
|
40
|
+
node: Constants.node,
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
: {};
|
|
44
|
+
|
|
45
|
+
const packageScript = Object.fromEntries(
|
|
46
|
+
Object.entries(scripts)
|
|
47
|
+
.map(([key, value]) => {
|
|
48
|
+
const script = value.find(e => e.tags.every(tag => tags.includes(tag)));
|
|
49
|
+
return script ? [key, script.script] : null;
|
|
50
|
+
})
|
|
51
|
+
.filter((v): v is [string, string] => v !== null)
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const filterDeps = (deps?: Record<string, string>) =>
|
|
55
|
+
Object.fromEntries(
|
|
56
|
+
Object.entries(deps ?? {}).filter(([key]) => {
|
|
57
|
+
const selected = DepCheck[key];
|
|
58
|
+
return !selected || selected.tags.every(tag => tags.includes(tag));
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const dependencies = filterDeps(props.app.dependencies as Record<string, string>);
|
|
63
|
+
const devDependencies = filterDeps(props.app.devDependencies as Record<string, string>);
|
|
64
|
+
|
|
65
|
+
// Removing all workspace dependencies
|
|
66
|
+
for (const [key, value] of Object.entries(devDependencies)) {
|
|
67
|
+
if (value.includes("workspace:")) {
|
|
68
|
+
delete devDependencies[key];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Adding required
|
|
73
|
+
if (props.dependencies) {
|
|
74
|
+
for (const [key, value] of Object.entries(props.dependencies)) {
|
|
75
|
+
if (!dependencies[key]) {
|
|
76
|
+
dependencies[key] = value;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Adding rest
|
|
82
|
+
for (const [key, value] of Object.entries(DepCheck)) {
|
|
83
|
+
if (!value.tags.every(tag => tags.includes(tag))) continue;
|
|
84
|
+
if (isWorkspace && !value.tags.includes("root")) continue;
|
|
85
|
+
const isDev = value.isDevDependency;
|
|
86
|
+
if (isDev && !devDependencies[key]) {
|
|
87
|
+
devDependencies[key] = value.version;
|
|
88
|
+
} else if (!dependencies[key]) {
|
|
89
|
+
dependencies[key] = value.version;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Removing ignore
|
|
94
|
+
for (const value of props.app.startx?.ignore ?? []) {
|
|
95
|
+
delete dependencies[value];
|
|
96
|
+
delete devDependencies[value];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const packageJson = {
|
|
100
|
+
name: props.name || props.app.name,
|
|
101
|
+
description: props.app.description,
|
|
102
|
+
type: "module",
|
|
103
|
+
exports: props.app.exports,
|
|
104
|
+
files: props.app.files,
|
|
105
|
+
scripts: packageScript,
|
|
106
|
+
dependencies,
|
|
107
|
+
devDependencies,
|
|
108
|
+
...workspaceAttr,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const sorter = [
|
|
112
|
+
"name",
|
|
113
|
+
"description",
|
|
114
|
+
"version",
|
|
115
|
+
"type",
|
|
116
|
+
"scripts",
|
|
117
|
+
"files",
|
|
118
|
+
"exports",
|
|
119
|
+
"dependencies",
|
|
120
|
+
"devDependencies",
|
|
121
|
+
"packageManager",
|
|
122
|
+
"engines",
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
packageJson: this.objSorter(packageJson, sorter),
|
|
127
|
+
isWorkspace,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|