startx 1.1.0 → 1.1.11
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/README.md +212 -0
- package/apps/cli/package.json +2 -2
- package/apps/startx-cli/dist/index.mjs +69 -61
- package/apps/startx-cli/package.json +5 -5
- package/apps/startx-cli/src/commands/package.ts +133 -12
- package/apps/startx-cli/src/configs/files.ts +3 -0
- package/apps/startx-cli/src/index.ts +2 -1
- package/apps/web-client/package.json +1 -1
- package/configs/eslint-config/package.json +19 -19
- package/configs/vitest-config/package.json +1 -1
- package/package.json +1 -1
- package/packages/@repo/lib/package.json +3 -3
- package/packages/aix/package.json +4 -4
- package/packages/ui/package.json +19 -19
- package/pnpm-workspace.yaml +57 -0
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"author": "",
|
|
21
21
|
"license": "ISC",
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"cross-env": "
|
|
23
|
+
"cross-env": "catalog:",
|
|
24
24
|
"eslint-config": "workspace:*",
|
|
25
25
|
"tsdown-config": "workspace:*",
|
|
26
26
|
"typescript-config": "workspace:*",
|
|
27
27
|
"vitest-config": "workspace:*"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@inquirer/prompts": "
|
|
30
|
+
"@inquirer/prompts": "catalog:",
|
|
31
31
|
"@repo/lib": "workspace:*",
|
|
32
32
|
"@repo/logger": "workspace:*",
|
|
33
33
|
"@repo/env": "workspace:*",
|
|
34
|
-
"chokidar": "
|
|
35
|
-
"commander": "
|
|
36
|
-
"type-fest": "
|
|
34
|
+
"chokidar": "catalog:",
|
|
35
|
+
"commander": "catalog:",
|
|
36
|
+
"type-fest": "catalog:"
|
|
37
37
|
},
|
|
38
38
|
"startx": {
|
|
39
39
|
"mode": "silent",
|
|
@@ -6,6 +6,7 @@ import fs from "fs/promises";
|
|
|
6
6
|
import path from "path";
|
|
7
7
|
import z from "zod";
|
|
8
8
|
|
|
9
|
+
import { DepCheck } from "../configs/deps";
|
|
9
10
|
import { FileCheck } from "../configs/files";
|
|
10
11
|
import type { StartXPackageJson, TAGS } from "../types";
|
|
11
12
|
import { CliUtils, type PackageItem } from "../utils/cli-utils";
|
|
@@ -15,6 +16,7 @@ import { CommonInquirer } from "../utils/inquirer";
|
|
|
15
16
|
type PackageOptions = {
|
|
16
17
|
eslint?: boolean;
|
|
17
18
|
install?: boolean;
|
|
19
|
+
name?: string;
|
|
18
20
|
};
|
|
19
21
|
|
|
20
22
|
type NewPackageOptions = PackageOptions & {
|
|
@@ -39,11 +41,12 @@ export class PackageCommand {
|
|
|
39
41
|
)
|
|
40
42
|
.addCommand(
|
|
41
43
|
new Command("add")
|
|
42
|
-
.description("Add an existing StartX package
|
|
44
|
+
.description("Add an existing StartX app or package, optionally with a new name.")
|
|
43
45
|
.argument("[packageName]")
|
|
46
|
+
.option("-n, --name <name>", "override the name for the added package")
|
|
44
47
|
.option("--eslint", "enable ESLint support for the added package")
|
|
45
48
|
.option("--no-eslint", "skip ESLint support for the added package")
|
|
46
|
-
.option("--no-install", "do not run the package manager after updating
|
|
49
|
+
.option("--no-install", "do not run the package manager after updating dependencies")
|
|
47
50
|
.action(PackageCommand.add.bind(PackageCommand))
|
|
48
51
|
)
|
|
49
52
|
.addCommand(
|
|
@@ -85,7 +88,7 @@ export class PackageCommand {
|
|
|
85
88
|
const selectedName =
|
|
86
89
|
packageName ??
|
|
87
90
|
(await CommonInquirer.choose({
|
|
88
|
-
message: "Select package to add",
|
|
91
|
+
message: "Select app or package to add",
|
|
89
92
|
options: availablePackages.map(pkg => pkg.name),
|
|
90
93
|
mode: "single",
|
|
91
94
|
required: true,
|
|
@@ -96,6 +99,16 @@ export class PackageCommand {
|
|
|
96
99
|
throw new Error(`Package "${selectedName}" was not found in the StartX template.`);
|
|
97
100
|
}
|
|
98
101
|
|
|
102
|
+
const templateName = selectedPackage.packageJson?.name ?? selectedPackage.name;
|
|
103
|
+
const overrideName =
|
|
104
|
+
options.name ??
|
|
105
|
+
(await CommonInquirer.getText({
|
|
106
|
+
message: "Name for the new package (leave unchanged to keep the original)",
|
|
107
|
+
name: "overrideName",
|
|
108
|
+
default: templateName,
|
|
109
|
+
schema: packageNameSchema,
|
|
110
|
+
}));
|
|
111
|
+
|
|
99
112
|
const directory = CliUtils.getDirectory();
|
|
100
113
|
const eslintEnabled = await this.resolveEslintPreference(options);
|
|
101
114
|
const packagesToInstall = this.resolvePackageClosure({
|
|
@@ -109,15 +122,24 @@ export class PackageCommand {
|
|
|
109
122
|
eslintEnabled,
|
|
110
123
|
});
|
|
111
124
|
|
|
125
|
+
await this.checkAndInstallMissingDeps({
|
|
126
|
+
workspace: directory.workspace,
|
|
127
|
+
tags,
|
|
128
|
+
install: options.install,
|
|
129
|
+
});
|
|
130
|
+
|
|
112
131
|
for (const pkg of packagesToInstall) {
|
|
132
|
+
const isMain = pkg.name === selectedPackage.name;
|
|
113
133
|
await this.installTemplatePackage({
|
|
114
134
|
pkg,
|
|
115
135
|
directory,
|
|
116
136
|
tags,
|
|
137
|
+
overrideName: isMain ? overrideName : undefined,
|
|
138
|
+
overrideRelativePath: isMain ? this.getDestinationPath(pkg.relativePath, overrideName) : undefined,
|
|
117
139
|
});
|
|
118
140
|
}
|
|
119
141
|
|
|
120
|
-
logger.info(`
|
|
142
|
+
logger.info(`Done! Run \`pnpm install\` to link the new package.`);
|
|
121
143
|
}
|
|
122
144
|
|
|
123
145
|
private static async create(packageName: string | undefined, options: NewPackageOptions) {
|
|
@@ -136,8 +158,11 @@ export class PackageCommand {
|
|
|
136
158
|
throw new Error(`Package directory already exists: ${packageDir}`);
|
|
137
159
|
}
|
|
138
160
|
|
|
161
|
+
const rootPackage = await this.readRootPackage(directory.workspace);
|
|
139
162
|
const eslintEnabled = await this.resolveEslintPreference(options);
|
|
163
|
+
const vitestEnabled = this.hasDependency(rootPackage, "vitest");
|
|
140
164
|
const packages = await CliUtils.getPackageList();
|
|
165
|
+
|
|
141
166
|
await this.ensureTemplatePackage({
|
|
142
167
|
packages,
|
|
143
168
|
name: "typescript-config",
|
|
@@ -154,8 +179,20 @@ export class PackageCommand {
|
|
|
154
179
|
});
|
|
155
180
|
}
|
|
156
181
|
|
|
182
|
+
if (vitestEnabled) {
|
|
183
|
+
await this.ensureTemplatePackage({
|
|
184
|
+
packages,
|
|
185
|
+
name: "vitest-config",
|
|
186
|
+
directory,
|
|
187
|
+
tags: ["common", "node", "vitest"],
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
157
191
|
await fs.mkdir(path.join(packageDir, "src"), { recursive: true });
|
|
158
|
-
await this.writeJson(
|
|
192
|
+
await this.writeJson(
|
|
193
|
+
path.join(packageDir, "package.json"),
|
|
194
|
+
this.createPackageJson({ name, eslintEnabled, vitestEnabled })
|
|
195
|
+
);
|
|
159
196
|
await fs.writeFile(
|
|
160
197
|
path.join(packageDir, "tsconfig.json"),
|
|
161
198
|
`${JSON.stringify(
|
|
@@ -181,7 +218,15 @@ export class PackageCommand {
|
|
|
181
218
|
);
|
|
182
219
|
}
|
|
183
220
|
|
|
221
|
+
if (vitestEnabled) {
|
|
222
|
+
await fs.writeFile(
|
|
223
|
+
path.join(packageDir, "vitest.config.ts"),
|
|
224
|
+
`import vitestConfig from "vitest-config/node";\n\nexport default vitestConfig;\n`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
184
228
|
logger.info(`Created package ${name} at ${path.relative(directory.workspace, packageDir)}`);
|
|
229
|
+
logger.info(`Run \`pnpm install\` to link the new package.`);
|
|
185
230
|
}
|
|
186
231
|
|
|
187
232
|
private static async resolveEslintPreference(options: PackageOptions) {
|
|
@@ -228,6 +273,7 @@ export class PackageCommand {
|
|
|
228
273
|
if (this.hasDependency(rootPackage, "@biomejs/biome")) tags.add("biome");
|
|
229
274
|
if (this.hasDependency(rootPackage, "prettier")) tags.add("prettier");
|
|
230
275
|
if (this.hasDependency(rootPackage, "vitest")) tags.add("vitest");
|
|
276
|
+
if (this.hasDependency(rootPackage, "tsdown")) tags.add("tsdown");
|
|
231
277
|
|
|
232
278
|
for (const pkg of props.packages) {
|
|
233
279
|
pkg.packageJson?.startx?.tags?.forEach(tag => tags.add(tag));
|
|
@@ -295,15 +341,25 @@ export class PackageCommand {
|
|
|
295
341
|
pkg: PackageItem;
|
|
296
342
|
directory: ReturnType<typeof CliUtils.getDirectory>;
|
|
297
343
|
tags: TAGS[];
|
|
344
|
+
overrideName?: string;
|
|
345
|
+
overrideRelativePath?: string;
|
|
298
346
|
}) {
|
|
299
347
|
if (!props.pkg.packageJson) {
|
|
300
348
|
throw new Error(`Missing package.json for ${props.pkg.name}`);
|
|
301
349
|
}
|
|
302
350
|
|
|
303
|
-
const
|
|
351
|
+
const relativePath = props.overrideRelativePath ?? props.pkg.relativePath;
|
|
352
|
+
const destination = path.join(props.directory.workspace, relativePath);
|
|
353
|
+
|
|
304
354
|
if (await this.pathExists(path.join(destination, "package.json"))) {
|
|
305
|
-
|
|
306
|
-
|
|
355
|
+
const overwrite = await CommonInquirer.confirm({
|
|
356
|
+
message: `"${relativePath}" already exists. Overwrite?`,
|
|
357
|
+
default: false,
|
|
358
|
+
});
|
|
359
|
+
if (!overwrite) {
|
|
360
|
+
logger.info(`Skipping ${props.pkg.name}.`);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
307
363
|
}
|
|
308
364
|
|
|
309
365
|
const tags = new Set<TAGS>([...props.tags, ...(props.pkg.packageJson.startx?.tags ?? [])]);
|
|
@@ -314,7 +370,7 @@ export class PackageCommand {
|
|
|
314
370
|
const { packageJson, isWorkspace } = FileHandler.handlePackageJson({
|
|
315
371
|
app: props.pkg.packageJson,
|
|
316
372
|
tags: Array.from(tags),
|
|
317
|
-
name: props.pkg.packageJson.name
|
|
373
|
+
name: props.overrideName ?? props.pkg.packageJson.name ?? props.pkg.name,
|
|
318
374
|
});
|
|
319
375
|
|
|
320
376
|
if (isWorkspace) {
|
|
@@ -329,7 +385,7 @@ export class PackageCommand {
|
|
|
329
385
|
exclude: !tags.has("vitest") ? /\.test\.tsx?$/ : undefined,
|
|
330
386
|
});
|
|
331
387
|
|
|
332
|
-
logger.info(`Installed ${props.pkg.name}`);
|
|
388
|
+
logger.info(`Installed ${props.overrideName ?? props.pkg.name} at ${relativePath}`);
|
|
333
389
|
}
|
|
334
390
|
|
|
335
391
|
private static async copyValidatedFilesFromFolder(source: string, destination: string, tags: Set<TAGS>) {
|
|
@@ -346,7 +402,7 @@ export class PackageCommand {
|
|
|
346
402
|
}
|
|
347
403
|
}
|
|
348
404
|
|
|
349
|
-
private static createPackageJson(props: { name: string; eslintEnabled: boolean }) {
|
|
405
|
+
private static createPackageJson(props: { name: string; eslintEnabled: boolean; vitestEnabled: boolean }) {
|
|
350
406
|
const scripts: Record<string, string> = {
|
|
351
407
|
typecheck: "tsc --noEmit",
|
|
352
408
|
clean: "rimraf dist .turbo",
|
|
@@ -354,11 +410,21 @@ export class PackageCommand {
|
|
|
354
410
|
const devDependencies: Record<string, string> = {
|
|
355
411
|
"typescript-config": "workspace:*",
|
|
356
412
|
};
|
|
413
|
+
const ignore: string[] = [];
|
|
357
414
|
|
|
358
415
|
if (props.eslintEnabled) {
|
|
359
416
|
scripts.lint = "eslint .";
|
|
360
417
|
scripts["lint:fix"] = "eslint . --fix";
|
|
361
418
|
devDependencies["eslint-config"] = "workspace:*";
|
|
419
|
+
} else {
|
|
420
|
+
ignore.push("eslint-config");
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (props.vitestEnabled) {
|
|
424
|
+
scripts.test = "vitest run";
|
|
425
|
+
devDependencies["vitest-config"] = "workspace:*";
|
|
426
|
+
} else {
|
|
427
|
+
ignore.push("vitest-config");
|
|
362
428
|
}
|
|
363
429
|
|
|
364
430
|
return {
|
|
@@ -371,11 +437,66 @@ export class PackageCommand {
|
|
|
371
437
|
startx: {
|
|
372
438
|
iTags: ["node"],
|
|
373
439
|
requiredDevDeps: ["typescript-config"],
|
|
374
|
-
...(
|
|
440
|
+
...(ignore.length > 0 ? { ignore } : {}),
|
|
375
441
|
},
|
|
376
442
|
};
|
|
377
443
|
}
|
|
378
444
|
|
|
445
|
+
private static async checkAndInstallMissingDeps(props: {
|
|
446
|
+
workspace: string;
|
|
447
|
+
tags: TAGS[];
|
|
448
|
+
install?: boolean;
|
|
449
|
+
}) {
|
|
450
|
+
const rootPackage = await this.readRootPackage(props.workspace);
|
|
451
|
+
const pnpmWorkspace = await CliUtils.parsePnpmWorkspace({ dir: props.workspace });
|
|
452
|
+
|
|
453
|
+
const missing: Array<{ name: string; version: string; isDev: boolean }> = [];
|
|
454
|
+
for (const [dep, config] of Object.entries(DepCheck)) {
|
|
455
|
+
if (!config.tags.every(tag => props.tags.includes(tag as TAGS))) continue;
|
|
456
|
+
if (config.tags.includes("root")) continue;
|
|
457
|
+
if (this.hasDependency(rootPackage, dep)) continue;
|
|
458
|
+
const version = pnpmWorkspace?.catalog?.[dep] ? "catalog:" : config.version;
|
|
459
|
+
missing.push({ name: dep, version, isDev: config.isDevDependency ?? true });
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (missing.length === 0) return;
|
|
463
|
+
|
|
464
|
+
logger.warn(`The following workspace dependencies are required but not installed:`);
|
|
465
|
+
for (const dep of missing) {
|
|
466
|
+
logger.warn(` - ${dep.name}`);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const shouldAdd = await CommonInquirer.confirm({
|
|
470
|
+
message: "Add them to the workspace root package.json?",
|
|
471
|
+
default: true,
|
|
472
|
+
});
|
|
473
|
+
if (!shouldAdd) {
|
|
474
|
+
logger.warn("Skipping. Some features may not work correctly without these dependencies.");
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
for (const dep of missing) {
|
|
479
|
+
if (dep.isDev) {
|
|
480
|
+
(rootPackage.devDependencies as Record<string, string>)[dep.name] = dep.version;
|
|
481
|
+
} else {
|
|
482
|
+
(rootPackage.dependencies as Record<string, string>)[dep.name] = dep.version;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
await this.writeJson(path.join(props.workspace, "package.json"), rootPackage);
|
|
487
|
+
logger.info("Added missing dependencies to root package.json.");
|
|
488
|
+
|
|
489
|
+
if (props.install !== false) {
|
|
490
|
+
await this.installRootDependencies(props.workspace);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
private static getDestinationPath(templateRelativePath: string, newName: string): string {
|
|
495
|
+
const parentDir = path.dirname(templateRelativePath);
|
|
496
|
+
const leafName = newName.includes("/") ? newName.split("/").pop()! : newName;
|
|
497
|
+
return path.join(parentDir, leafName);
|
|
498
|
+
}
|
|
499
|
+
|
|
379
500
|
private static getDefaultPackagePath(name: string) {
|
|
380
501
|
if (name.startsWith("@")) {
|
|
381
502
|
const [scope, packageName] = name.split("/");
|
|
@@ -3,6 +3,7 @@ import { logger } from "@repo/logger";
|
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
|
|
5
5
|
import { InitCommand } from "./commands/init";
|
|
6
|
+
import { PackageCommand } from "./commands/package";
|
|
6
7
|
import { version } from "../../../package.json";
|
|
7
8
|
|
|
8
9
|
const program = new Command();
|
|
@@ -14,6 +15,6 @@ program.command("ping").action(() => {
|
|
|
14
15
|
});
|
|
15
16
|
|
|
16
17
|
program.addCommand(InitCommand.command);
|
|
17
|
-
|
|
18
|
+
program.addCommand(PackageCommand.command);
|
|
18
19
|
|
|
19
20
|
program.parse(process.argv);
|
|
@@ -20,29 +20,29 @@
|
|
|
20
20
|
"test": "vitest run"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@eslint/compat": "
|
|
24
|
-
"@eslint/js": "
|
|
25
|
-
"@stylistic/eslint-plugin": "
|
|
26
|
-
"eslint-config-prettier": "
|
|
27
|
-
"eslint-import-resolver-typescript": "
|
|
28
|
-
"eslint-plugin-import-x": "
|
|
29
|
-
"eslint-plugin-jsx-a11y": "
|
|
30
|
-
"eslint-plugin-lodash": "
|
|
31
|
-
"eslint-plugin-react": "
|
|
32
|
-
"eslint-plugin-react-hooks": "
|
|
33
|
-
"eslint-plugin-unicorn": "
|
|
34
|
-
"eslint-plugin-unused-imports": "
|
|
35
|
-
"globals": "
|
|
23
|
+
"@eslint/compat": "catalog:",
|
|
24
|
+
"@eslint/js": "catalog:",
|
|
25
|
+
"@stylistic/eslint-plugin": "catalog:",
|
|
26
|
+
"eslint-config-prettier": "catalog:",
|
|
27
|
+
"eslint-import-resolver-typescript": "catalog:",
|
|
28
|
+
"eslint-plugin-import-x": "catalog:",
|
|
29
|
+
"eslint-plugin-jsx-a11y": "catalog:",
|
|
30
|
+
"eslint-plugin-lodash": "catalog:",
|
|
31
|
+
"eslint-plugin-react": "catalog:",
|
|
32
|
+
"eslint-plugin-react-hooks": "catalog:",
|
|
33
|
+
"eslint-plugin-unicorn": "catalog:",
|
|
34
|
+
"eslint-plugin-unused-imports": "catalog:",
|
|
35
|
+
"globals": "catalog:"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"
|
|
39
|
-
"@types/eslint-
|
|
40
|
-
"@
|
|
41
|
-
"@typescript-eslint/
|
|
42
|
-
"@typescript-eslint/
|
|
43
|
-
"@typescript-eslint/utils": "^8.0.0",
|
|
38
|
+
"@types/eslint-config-prettier": "catalog:",
|
|
39
|
+
"@types/eslint-plugin-jsx-a11y": "catalog:",
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "catalog:",
|
|
41
|
+
"@typescript-eslint/rule-tester": "catalog:",
|
|
42
|
+
"@typescript-eslint/utils": "catalog:",
|
|
44
43
|
"eslint": "catalog:",
|
|
45
44
|
"typescript-config": "workspace:*",
|
|
45
|
+
"typescript-eslint": "catalog:",
|
|
46
46
|
"vitest-config": "workspace:*"
|
|
47
47
|
},
|
|
48
48
|
"startx": {
|
package/package.json
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"./*": "./src/*/index.ts"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/jsonwebtoken": "
|
|
22
|
-
"@types/nodemailer": "
|
|
21
|
+
"@types/jsonwebtoken": "catalog:",
|
|
22
|
+
"@types/nodemailer": "catalog:",
|
|
23
23
|
"eslint-config": "workspace:*",
|
|
24
24
|
"typescript-config": "workspace:*",
|
|
25
25
|
"vine": "link:@types/vinejs/vine",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"firebase-admin": "catalog:",
|
|
39
39
|
"jsonwebtoken": "catalog:",
|
|
40
40
|
"nodemailer": "catalog:",
|
|
41
|
-
"yaml": "
|
|
41
|
+
"yaml": "catalog:"
|
|
42
42
|
},
|
|
43
43
|
"startx": {
|
|
44
44
|
"iTags": [
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"vitest-config": "workspace:*"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@aws-sdk/client-bedrock": "
|
|
25
|
-
"@aws-sdk/client-bedrock-runtime": "
|
|
24
|
+
"@aws-sdk/client-bedrock": "catalog:",
|
|
25
|
+
"@aws-sdk/client-bedrock-runtime": "catalog:",
|
|
26
26
|
"@repo/env": "workspace:*",
|
|
27
27
|
"@repo/lib": "workspace:*",
|
|
28
28
|
"@repo/logger": "workspace:*",
|
|
29
|
-
"@toon-format/toon": "
|
|
29
|
+
"@toon-format/toon": "catalog:",
|
|
30
30
|
"js-tiktoken": "catalog:",
|
|
31
|
-
"jsonrepair": "
|
|
31
|
+
"jsonrepair": "catalog:",
|
|
32
32
|
"openai": "catalog:",
|
|
33
33
|
"pg": "catalog:",
|
|
34
34
|
"quickjs-emscripten": "catalog:",
|
package/packages/ui/package.json
CHANGED
|
@@ -19,34 +19,34 @@
|
|
|
19
19
|
"@tailwindcss/vite": "catalog:",
|
|
20
20
|
"@types/react": "catalog:",
|
|
21
21
|
"@types/react-dom": "catalog:",
|
|
22
|
-
"autoprefixer": "
|
|
22
|
+
"autoprefixer": "catalog:",
|
|
23
23
|
"eslint-config": "workspace:*",
|
|
24
24
|
"tailwindcss": "catalog:",
|
|
25
25
|
"typescript-config": "workspace:*",
|
|
26
26
|
"vitest-config": "workspace:*"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@fontsource-variable/eb-garamond": "
|
|
30
|
-
"@fontsource-variable/inter": "
|
|
31
|
-
"@hookform/resolvers": "
|
|
32
|
-
"@phosphor-icons/react": "
|
|
33
|
-
"@tailwindcss/postcss": "
|
|
34
|
-
"@tailwindcss/typography": "
|
|
29
|
+
"@fontsource-variable/eb-garamond": "catalog:",
|
|
30
|
+
"@fontsource-variable/inter": "catalog:",
|
|
31
|
+
"@hookform/resolvers": "catalog:",
|
|
32
|
+
"@phosphor-icons/react": "catalog:",
|
|
33
|
+
"@tailwindcss/postcss": "catalog:",
|
|
34
|
+
"@tailwindcss/typography": "catalog:",
|
|
35
35
|
"@tanstack/react-query": "catalog:",
|
|
36
36
|
"@tanstack/react-query-devtools": "catalog:",
|
|
37
|
-
"class-variance-authority": "
|
|
38
|
-
"clsx": "
|
|
39
|
-
"cmdk": "
|
|
40
|
-
"embla-carousel-react": "
|
|
41
|
-
"input-otp": "
|
|
37
|
+
"class-variance-authority": "catalog:",
|
|
38
|
+
"clsx": "catalog:",
|
|
39
|
+
"cmdk": "catalog:",
|
|
40
|
+
"embla-carousel-react": "catalog:",
|
|
41
|
+
"input-otp": "catalog:",
|
|
42
42
|
"lucide-react": "catalog:",
|
|
43
|
-
"next-themes": "
|
|
44
|
-
"radix-ui": "
|
|
45
|
-
"react-hook-form": "
|
|
46
|
-
"react-icons": "
|
|
47
|
-
"sonner": "
|
|
48
|
-
"tailwind-merge": "
|
|
49
|
-
"tw-animate-css": "
|
|
43
|
+
"next-themes": "catalog:",
|
|
44
|
+
"radix-ui": "catalog:",
|
|
45
|
+
"react-hook-form": "catalog:",
|
|
46
|
+
"react-icons": "catalog:",
|
|
47
|
+
"sonner": "catalog:",
|
|
48
|
+
"tailwind-merge": "catalog:",
|
|
49
|
+
"tw-animate-css": "catalog:"
|
|
50
50
|
},
|
|
51
51
|
"exports": {
|
|
52
52
|
"./globals.css": "./src/styles/globals.css",
|
package/pnpm-workspace.yaml
CHANGED
|
@@ -14,6 +14,28 @@ catalog:
|
|
|
14
14
|
rimraf: "^6.1.2"
|
|
15
15
|
turbo: "^2.9.14"
|
|
16
16
|
tsx: "^4.21.0"
|
|
17
|
+
cross-env: "^10.1.0"
|
|
18
|
+
|
|
19
|
+
# eslint plugins
|
|
20
|
+
"@eslint/compat": "^2.0.2"
|
|
21
|
+
"@eslint/js": "^9.0.0"
|
|
22
|
+
"@stylistic/eslint-plugin": "^2.0.0"
|
|
23
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0"
|
|
24
|
+
"@typescript-eslint/rule-tester": "^8.54.0"
|
|
25
|
+
"@typescript-eslint/utils": "^8.0.0"
|
|
26
|
+
"@types/eslint-config-prettier": "^6.11.3"
|
|
27
|
+
"@types/eslint-plugin-jsx-a11y": "^6.10.1"
|
|
28
|
+
eslint-config-prettier: "^9.1.0"
|
|
29
|
+
eslint-import-resolver-typescript: "^3.6.1"
|
|
30
|
+
eslint-plugin-import-x: "^4.0.0"
|
|
31
|
+
eslint-plugin-jsx-a11y: "^6.9.0"
|
|
32
|
+
eslint-plugin-lodash: "^8.0.0"
|
|
33
|
+
eslint-plugin-react: "^7.35.0"
|
|
34
|
+
eslint-plugin-react-hooks: "^5.0.0"
|
|
35
|
+
eslint-plugin-unicorn: "^55.0.0"
|
|
36
|
+
eslint-plugin-unused-imports: "^4.0.0"
|
|
37
|
+
globals: "^15.9.0"
|
|
38
|
+
typescript-eslint: "^8.54.0"
|
|
17
39
|
|
|
18
40
|
# utils
|
|
19
41
|
"@biomejs/biome": "^2.3.13"
|
|
@@ -24,12 +46,22 @@ catalog:
|
|
|
24
46
|
date-fns: "^4.1.0"
|
|
25
47
|
nanoid: "^5.1.6"
|
|
26
48
|
xlsx: "^0.18.5"
|
|
49
|
+
|
|
50
|
+
# cli
|
|
51
|
+
"@inquirer/prompts": "^8.3.0"
|
|
52
|
+
commander: "^14.0.0"
|
|
53
|
+
chokidar: "^4.0.3"
|
|
54
|
+
type-fest: "^5.4.4"
|
|
55
|
+
|
|
27
56
|
# testing
|
|
28
57
|
vitest: "^4.0.18"
|
|
29
58
|
"@vitest/coverage-v8": "^4.0.18"
|
|
59
|
+
jsdom: "^29.0.1"
|
|
30
60
|
|
|
31
61
|
# types
|
|
32
62
|
"@types/node": "^25.1.0"
|
|
63
|
+
"@types/jsonwebtoken": "^9.0.7"
|
|
64
|
+
"@types/nodemailer": "^6.4.16"
|
|
33
65
|
|
|
34
66
|
# frontend
|
|
35
67
|
isbot: "^5.1.36"
|
|
@@ -42,6 +74,7 @@ catalog:
|
|
|
42
74
|
lucide-react: "^0.563.0"
|
|
43
75
|
tailwindcss: "^4.2.2"
|
|
44
76
|
"@tailwindcss/vite": "^4.2.2"
|
|
77
|
+
zustand: "^5.0.13"
|
|
45
78
|
|
|
46
79
|
# email
|
|
47
80
|
react-email: "^5.2.11"
|
|
@@ -53,6 +86,25 @@ catalog:
|
|
|
53
86
|
# ui
|
|
54
87
|
"@tanstack/react-query": "^5.100.9"
|
|
55
88
|
"@tanstack/react-query-devtools": "^5.100.9"
|
|
89
|
+
"@fontsource-variable/eb-garamond": "^5.2.7"
|
|
90
|
+
"@fontsource-variable/inter": "^5.2.8"
|
|
91
|
+
"@hookform/resolvers": "^3.9.1"
|
|
92
|
+
"@phosphor-icons/react": "^2.1.10"
|
|
93
|
+
"@tailwindcss/postcss": "^4"
|
|
94
|
+
"@tailwindcss/typography": "^0.5.19"
|
|
95
|
+
autoprefixer: "^10"
|
|
96
|
+
class-variance-authority: "^0.7.1"
|
|
97
|
+
clsx: "^2.1.1"
|
|
98
|
+
cmdk: "^1.1.1"
|
|
99
|
+
embla-carousel-react: "^8.6.0"
|
|
100
|
+
input-otp: "^1.4.2"
|
|
101
|
+
next-themes: "^0.4.6"
|
|
102
|
+
radix-ui: "^1.4.3"
|
|
103
|
+
react-hook-form: "^7.75.0"
|
|
104
|
+
react-icons: "^5.5.0"
|
|
105
|
+
sonner: "^2.0.7"
|
|
106
|
+
tailwind-merge: "^2.3.0"
|
|
107
|
+
tw-animate-css: "^1.4.0"
|
|
56
108
|
|
|
57
109
|
# frontend types
|
|
58
110
|
"@types/react": "^19.2.4"
|
|
@@ -93,12 +145,17 @@ catalog:
|
|
|
93
145
|
winston: "^3.19.0"
|
|
94
146
|
winston-daily-rotate-file: "^5.0.0"
|
|
95
147
|
jsonwebtoken: "^9.0.3"
|
|
148
|
+
yaml: "^2.8.2"
|
|
96
149
|
|
|
97
150
|
# aix
|
|
98
151
|
js-tiktoken: "^1.0.21"
|
|
99
152
|
quickjs-emscripten: "^0.32.0"
|
|
100
153
|
quicktype-core: "^23.2.6"
|
|
101
154
|
openai: "^6.34.0"
|
|
155
|
+
"@aws-sdk/client-bedrock": "^3.1047.0"
|
|
156
|
+
"@aws-sdk/client-bedrock-runtime": "^3.1047.0"
|
|
157
|
+
"@toon-format/toon": "^2.1.0"
|
|
158
|
+
jsonrepair: "^3.14.0"
|
|
102
159
|
|
|
103
160
|
# bullmq
|
|
104
161
|
bullmq: "^5.76.4"
|