create-m5kdev 0.32.7 → 0.33.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 (25) hide show
  1. package/dist/src/catalog.cjs +55 -10
  2. package/dist/src/catalog.cjs.map +1 -1
  3. package/dist/src/catalog.d.cts +11 -1
  4. package/dist/src/doctor.cjs +13 -7
  5. package/dist/src/doctor.cjs.map +1 -1
  6. package/package.json +1 -1
  7. package/templates/minimal-app/apps/e2e/package.json.tpl +7 -7
  8. package/templates/minimal-app/apps/email/package.json.tpl +13 -13
  9. package/templates/minimal-app/apps/expo/package.json.tpl +59 -59
  10. package/templates/minimal-app/apps/server/AGENTS.md.tpl +2 -2
  11. package/templates/minimal-app/apps/server/drizzle/0002_concerned_proudstar.sql +3 -0
  12. package/templates/minimal-app/apps/server/drizzle/meta/0002_snapshot.json.tpl +1932 -0
  13. package/templates/minimal-app/apps/server/drizzle/meta/_journal.json.tpl +7 -0
  14. package/templates/minimal-app/apps/server/package.json.tpl +55 -56
  15. package/templates/minimal-app/apps/server/src/app.ts.tpl +113 -141
  16. package/templates/minimal-app/apps/server/src/index.ts.tpl +12 -65
  17. package/templates/minimal-app/apps/server/src/modules/posts/posts.grants.ts.tpl +5 -7
  18. package/templates/minimal-app/apps/server/src/modules/posts/posts.service.ts.tpl +6 -5
  19. package/templates/minimal-app/apps/server/src/modules/posts/posts.trpc.ts.tpl +1 -1
  20. package/templates/minimal-app/apps/server/src/types.ts.tpl +12 -1
  21. package/templates/minimal-app/apps/shared/package.json.tpl +5 -5
  22. package/templates/minimal-app/apps/webapp/package.json.tpl +33 -33
  23. package/templates/minimal-app/package.json.tpl +3 -3
  24. package/templates/minimal-app/pnpm-workspace.yaml.tpl +60 -58
  25. package/templates/minimal-app/apps/server/src/lib/auth.ts.tpl +0 -12
@@ -15,6 +15,13 @@
15
15
  "when": 1785171166863,
16
16
  "tag": "0001_third_ink",
17
17
  "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "6",
22
+ "when": 1786951360347,
23
+ "tag": "0002_concerned_proudstar",
24
+ "breakpoints": true
18
25
  }
19
26
  ]
20
27
  }
@@ -1,56 +1,55 @@
1
- {
2
- "name": "{{PACKAGE_SCOPE}}/server",
3
- "version": "0.0.0",
4
- "private": true,
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "dev": "tsx watch --env-file=../shared/.env src/index.ts",
8
- "build": "tsup",
9
- "start": "node dist/index.js",
10
- "lint": "biome check .",
11
- "lint:fix": "biome check . --write",
12
- "check-types": "tsc --noEmit",
13
- "drizzle:generate": "drizzle-kit generate",
14
- "drizzle:migrate": "drizzle-kit migrate",
15
- "drizzle:studio": "drizzle-kit studio",
16
- "drizzle:sync": "tsx --env-file=../shared/.env drizzle/sync.ts",
17
- "drizzle:seed": "tsx --env-file=../shared/.env drizzle/seed.ts",
18
- "drizzle:reset": "tsx --env-file=../shared/.env drizzle/reset.ts"
19
- },
20
- "dependencies": {
21
- "{{PACKAGE_SCOPE}}/email": "workspace:*",
22
- "{{PACKAGE_SCOPE}}/shared": "workspace:*",
23
- "@libsql/client": "catalog:",
24
- "@m5kdev/backend": "catalog:",
25
- "@m5kdev/commons": "catalog:",
26
- "@trpc/server": "catalog:",
27
- "better-auth": "catalog:",
28
- "cors": "catalog:",
29
- "dotenv": "catalog:",
30
- "drizzle-orm": "catalog:",
31
- "drizzle-zod": "catalog:",
32
- "express": "catalog:",
33
- "ioredis": "catalog:",
34
- "neverthrow": "catalog:",
35
- "react": "catalog:",
36
- "react-dom": "catalog:",
37
- "uuid": "catalog:",
38
- "zod": "catalog:"
39
- },
40
- "devDependencies": {
41
- "@m5kdev/config": "catalog:",
42
- "@types/cors": "catalog:",
43
- "@types/express": "catalog:",
44
- "@types/node": "catalog:",
45
- "@types/react": "catalog:",
46
- "@types/react-dom": "catalog:",
47
- "drizzle-kit": "catalog:",
48
- "tslib": "catalog:",
49
- "tsup": "catalog:",
50
- "tsx": "catalog:",
51
- "typescript": "catalog:"
52
- },
53
- "exports": {
54
- "./types": "./src/types.ts"
55
- }
56
- }
1
+ {
2
+ "name": "{{PACKAGE_SCOPE}}/server",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "dev": "tsx watch --env-file=../shared/.env src/index.ts",
8
+ "build": "tsup",
9
+ "start": "node dist/index.js",
10
+ "lint": "biome check .",
11
+ "lint:fix": "biome check . --write",
12
+ "check-types": "tsc --noEmit",
13
+ "drizzle:generate": "drizzle-kit generate",
14
+ "drizzle:migrate": "drizzle-kit migrate",
15
+ "drizzle:studio": "drizzle-kit studio",
16
+ "drizzle:sync": "tsx --env-file=../shared/.env drizzle/sync.ts",
17
+ "drizzle:seed": "tsx --env-file=../shared/.env drizzle/seed.ts",
18
+ "drizzle:reset": "tsx --env-file=../shared/.env drizzle/reset.ts"
19
+ },
20
+ "dependencies": {
21
+ "{{PACKAGE_SCOPE}}/email": "workspace:*",
22
+ "{{PACKAGE_SCOPE}}/shared": "workspace:*",
23
+ "@libsql/client": "catalog:m5kdev",
24
+ "@m5kdev/backend": "catalog:m5kdev",
25
+ "@m5kdev/commons": "catalog:m5kdev",
26
+ "@opentelemetry/api": "catalog:m5kdev",
27
+ "@trpc/server": "catalog:m5kdev",
28
+ "better-auth": "catalog:m5kdev",
29
+ "dotenv": "catalog:m5kdev",
30
+ "drizzle-orm": "catalog:m5kdev",
31
+ "drizzle-zod": "catalog:m5kdev",
32
+ "express": "catalog:m5kdev",
33
+ "ioredis": "catalog:m5kdev",
34
+ "neverthrow": "catalog:m5kdev",
35
+ "react": "catalog:m5kdev",
36
+ "react-dom": "catalog:m5kdev",
37
+ "uuid": "catalog:m5kdev",
38
+ "zod": "catalog:m5kdev"
39
+ },
40
+ "devDependencies": {
41
+ "@m5kdev/config": "catalog:m5kdev",
42
+ "@types/express": "catalog:m5kdev",
43
+ "@types/node": "catalog:m5kdev",
44
+ "@types/react": "catalog:m5kdev",
45
+ "@types/react-dom": "catalog:m5kdev",
46
+ "drizzle-kit": "catalog:m5kdev",
47
+ "tslib": "catalog:m5kdev",
48
+ "tsup": "catalog:m5kdev",
49
+ "tsx": "catalog:m5kdev",
50
+ "typescript": "catalog:m5kdev"
51
+ },
52
+ "exports": {
53
+ "./types": "./src/types.ts"
54
+ }
55
+ }
@@ -1,141 +1,113 @@
1
- import { createBackendApp } from "@m5kdev/backend/app";
2
- import { createBetterAuth } from "@m5kdev/backend/modules/auth/auth.lib";
3
- import { AuthModule } from "@m5kdev/backend/modules/auth/auth.module";
4
- import { EmailModule } from "@m5kdev/backend/modules/email/email.module";
5
- import { EmailPreviewModule } from "@m5kdev/backend/modules/email/email.preview.module";
6
- import { WorkflowModule } from "@m5kdev/backend/modules/workflow/workflow.module";
7
- import { USER_LOCALE_HEADER } from "@m5kdev/commons/modules/auth/auth.constants";
8
- import { templates } from "{{PACKAGE_SCOPE}}/email";
9
- import { emailResources } from "{{PACKAGE_SCOPE}}/email/resources";
10
- import {
11
- APP_LOCALE_CONFIG,
12
- APP_NAME,
13
- APP_ROLES_CONFIG,
14
- } from "{{PACKAGE_SCOPE}}/shared/modules/app/app.constants";
15
- import type { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
16
- import cors from "cors";
17
- import express from "express";
18
- import { PostsModule } from "./modules/posts/posts.module";
19
- // m5k:test-harness:start
20
- import { TestHarnessModule } from "./modules/test-harness/test-harness.module";
21
- // m5k:test-harness:end
22
- import * as schema from "./schema";
23
-
24
- const app = express();
25
- const appUrl = process.env.VITE_APP_URL ?? "http://localhost:5173";
26
- const serverUrl = process.env.VITE_SERVER_URL ?? "http://localhost:8080";
27
- const databaseUrl = process.env.DATABASE_URL ?? "file:./local.db";
28
- const syncUrl = process.env.TURSO_DATABASE_URL;
29
- const authToken = process.env.TURSO_AUTH_TOKEN;
30
- const redisUrl = process.env.REDIS_URL ?? "redis://127.0.0.1:6379";
31
- const resendApiKey = process.env.RESEND_API_KEY;
32
- const enableWaitlist = process.env.VITE_ENABLE_WAITLIST === "true";
33
-
34
- const connection =
35
- syncUrl && authToken
36
- ? {
37
- url: databaseUrl,
38
- syncUrl,
39
- authToken,
40
- syncInterval: 60,
41
- readYourWrites: true,
42
- }
43
- : {
44
- url: databaseUrl,
45
- };
46
-
47
- app.use(express.json());
48
- app.use(
49
- cors({
50
- origin: [appUrl],
51
- credentials: true,
52
- methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
53
- allowedHeaders: [
54
- "Content-Type",
55
- "Authorization",
56
- "Waitlist-Invitation-Code",
57
- "Organization-Invitation-Code",
58
- "Admin-Create-Verified-User",
59
- USER_LOCALE_HEADER,
60
- ],
61
- })
62
- );
63
-
64
- export const builtBackendApp = createBackendApp(
65
- {
66
- db: connection,
67
- express: app,
68
- schema,
69
- app: {
70
- name: APP_NAME,
71
- urls: {
72
- web: appUrl,
73
- api: serverUrl,
74
- },
75
- locales: APP_LOCALE_CONFIG,
76
- roles: APP_ROLES_CONFIG,
77
- },
78
- i18n: {
79
- resources: emailResources,
80
- },
81
- redis: {
82
- url: redisUrl,
83
- options: { maxRetriesPerRequest: null },
84
- },
85
- resend: resendApiKey ? { apiKey: resendApiKey } : undefined,
86
- email: {
87
- mode: resendApiKey ? "send" : "store",
88
- from: process.env.EMAIL_FROM ?? "no-reply@local.m5kdev.test",
89
- systemNotificationEmail: process.env.SYSTEM_NOTIFICATION_EMAIL ?? "ops@local.m5kdev.test",
90
- outputDirectory: process.env.EMAIL_OUTPUT_DIRECTORY ?? ".emails",
91
- },
92
- auth: {
93
- factory({ db, services, appConfig, i18n }) {
94
- return createBetterAuth({
95
- orm: db.orm,
96
- schema: db.schema,
97
- services: {
98
- email: services.email.email,
99
- },
100
- app: appConfig,
101
- i18n,
102
- config: {
103
- waitlist: enableWaitlist,
104
- provisionedAccountEmailDomain:
105
- process.env.PROVISIONED_EMAIL_DOMAIN ?? "provisioned.{{APP_SLUG}}.local",
106
- },
107
- options: {
108
- secret: process.env.BETTER_AUTH_SECRET ?? "QJvCmK9UBuHAWbNr2vV3ROVt8XrBYV5d",
109
- },
110
- });
111
- },
112
- },
113
- },
114
- [
115
- new EmailModule(templates as never),
116
- new AuthModule(),
117
- new WorkflowModule({
118
- queues: {
119
- fast: { concurrency: 5 },
120
- },
121
- defaultQueue: "fast",
122
- defaults: {
123
- timeout: 60_000,
124
- jobOptions: { removeOnComplete: { age: 3600 } },
125
- },
126
- reconcile: { enabled: true },
127
- }),
128
- new PostsModule(),
129
- new EmailPreviewModule({ allowDelete: process.env.NODE_ENV !== "production" }),
130
- // m5k:test-harness:start
131
- new TestHarnessModule(),
132
- // m5k:test-harness:end
133
- ] as const
134
- );
135
-
136
- export type AppRouter = typeof builtBackendApp.trpc.router;
137
- export type RouterInputs = inferRouterInputs<AppRouter>;
138
- export type RouterOutputs = inferRouterOutputs<AppRouter>;
139
-
140
- export type Orm = typeof builtBackendApp.db.orm;
141
- export type Schema = typeof builtBackendApp.db.schema;
1
+ import { createBackendApp } from "@m5kdev/backend/app";
2
+ import { shutdownTelemetry } from "@m5kdev/backend/lib/otel";
3
+ import { createBetterAuth } from "@m5kdev/backend/modules/auth/auth.lib";
4
+ import { AuthModule } from "@m5kdev/backend/modules/auth/auth.module";
5
+ import { EmailModule } from "@m5kdev/backend/modules/email/email.module";
6
+ import { EmailPreviewModule } from "@m5kdev/backend/modules/email/email.preview.module";
7
+ import { WorkflowModule } from "@m5kdev/backend/modules/workflow/workflow.module";
8
+ import { templates } from "{{PACKAGE_SCOPE}}/email";
9
+ import { emailResources } from "{{PACKAGE_SCOPE}}/email/resources";
10
+ import {
11
+ APP_LOCALE_CONFIG,
12
+ APP_NAME,
13
+ APP_ROLES_CONFIG,
14
+ } from "{{PACKAGE_SCOPE}}/shared/modules/app/app.constants";
15
+ import { PostsModule } from "./modules/posts/posts.module";
16
+ // m5k:test-harness:start
17
+ import { TestHarnessModule } from "./modules/test-harness/test-harness.module";
18
+ // m5k:test-harness:end
19
+ import * as schema from "./schema";
20
+
21
+ const appUrl = process.env.VITE_APP_URL ?? "http://localhost:5173";
22
+ const serverUrl = process.env.VITE_SERVER_URL ?? "http://localhost:8080";
23
+ const databaseUrl = process.env.DATABASE_URL ?? "file:./local.db";
24
+ const syncUrl = process.env.TURSO_DATABASE_URL;
25
+ const authToken = process.env.TURSO_AUTH_TOKEN;
26
+ const redisUrl = process.env.REDIS_URL ?? "redis://127.0.0.1:6379";
27
+ const resendApiKey = process.env.RESEND_API_KEY;
28
+ const enableWaitlist = process.env.VITE_ENABLE_WAITLIST === "true";
29
+
30
+ const connection =
31
+ syncUrl && authToken
32
+ ? {
33
+ url: databaseUrl,
34
+ syncUrl,
35
+ authToken,
36
+ syncInterval: 60,
37
+ readYourWrites: true,
38
+ }
39
+ : {
40
+ url: databaseUrl,
41
+ };
42
+
43
+ export const builtBackendApp = createBackendApp(
44
+ {
45
+ db: connection,
46
+ schema,
47
+ onShutdown: shutdownTelemetry,
48
+ app: {
49
+ name: APP_NAME,
50
+ urls: {
51
+ web: appUrl,
52
+ api: serverUrl,
53
+ },
54
+ locales: APP_LOCALE_CONFIG,
55
+ roles: APP_ROLES_CONFIG,
56
+ },
57
+ i18n: {
58
+ resources: emailResources,
59
+ },
60
+ redis: {
61
+ url: redisUrl,
62
+ options: { maxRetriesPerRequest: null },
63
+ },
64
+ resend: resendApiKey ? { apiKey: resendApiKey } : undefined,
65
+ email: {
66
+ mode: resendApiKey ? "send" : "store",
67
+ from: process.env.EMAIL_FROM ?? "no-reply@local.m5kdev.test",
68
+ systemNotificationEmail: process.env.SYSTEM_NOTIFICATION_EMAIL ?? "ops@local.m5kdev.test",
69
+ outputDirectory: process.env.EMAIL_OUTPUT_DIRECTORY ?? ".emails",
70
+ },
71
+ auth: {
72
+ factory({ db, services, appConfig, i18n }) {
73
+ return createBetterAuth({
74
+ orm: db.orm,
75
+ schema: db.schema,
76
+ services: {
77
+ email: services.email.email,
78
+ },
79
+ app: appConfig,
80
+ i18n,
81
+ config: {
82
+ waitlist: enableWaitlist,
83
+ provisionedAccountEmailDomain:
84
+ process.env.PROVISIONED_EMAIL_DOMAIN ?? "provisioned.{{APP_SLUG}}.local",
85
+ },
86
+ options: {
87
+ secret: process.env.BETTER_AUTH_SECRET ?? "QJvCmK9UBuHAWbNr2vV3ROVt8XrBYV5d",
88
+ },
89
+ });
90
+ },
91
+ },
92
+ },
93
+ [
94
+ new EmailModule(templates as never),
95
+ new AuthModule(),
96
+ new WorkflowModule({
97
+ queues: {
98
+ fast: { concurrency: 5 },
99
+ },
100
+ defaultQueue: "fast",
101
+ defaults: {
102
+ timeout: 60_000,
103
+ jobOptions: { removeOnComplete: { age: 3600 } },
104
+ },
105
+ reconcile: { enabled: true },
106
+ }),
107
+ new PostsModule(),
108
+ new EmailPreviewModule({ allowDelete: process.env.NODE_ENV !== "production" }),
109
+ // m5k:test-harness:start
110
+ new TestHarnessModule(),
111
+ // m5k:test-harness:end
112
+ ] as const
113
+ );
@@ -1,65 +1,12 @@
1
- import "./instrumentation";
2
- import type { Server } from "node:http";
3
- import { shutdownTelemetry } from "@m5kdev/backend/lib/otel";
4
- import { builtBackendApp } from "./app";
5
-
6
- const port = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : 8080;
7
-
8
- let httpServer: Server | undefined;
9
-
10
- function logError(context: string, error: unknown): void {
11
- console.error(`[server] ${context}`, error);
12
- }
13
-
14
- async function shutdown(): Promise<void> {
15
- try {
16
- await builtBackendApp.shutdown();
17
- } catch (e) {
18
- logError("builtBackendApp.shutdown() failed", e);
19
- }
20
- try {
21
- await shutdownTelemetry();
22
- } catch (e) {
23
- logError("shutdownTelemetry() failed", e);
24
- }
25
- if (httpServer) {
26
- await new Promise<void>((resolve) => {
27
- httpServer?.close((err) => {
28
- if (err) {
29
- logError("HTTP server close failed", err);
30
- }
31
- resolve();
32
- });
33
- });
34
- }
35
- process.exit(0);
36
- }
37
-
38
- process.once("SIGINT", () => {
39
- void shutdown();
40
- });
41
- process.once("SIGTERM", () => {
42
- void shutdown();
43
- });
44
-
45
- async function start(): Promise<void> {
46
- await builtBackendApp.start();
47
- await new Promise<void>((resolve, reject) => {
48
- httpServer = builtBackendApp.express.app.listen(port, () => {
49
- console.info(
50
- `Server running at ${process.env.VITE_SERVER_URL ?? `http://localhost:${port}`}`
51
- );
52
- resolve();
53
- });
54
- httpServer.on("error", reject);
55
- });
56
- }
57
-
58
- void (async () => {
59
- try {
60
- await start();
61
- } catch (e) {
62
- logError("Fatal: builtBackendApp.start() or HTTP listen failed", e);
63
- process.exit(1);
64
- }
65
- })();
1
+ import "./instrumentation";
2
+ import { builtBackendApp } from "./app";
3
+
4
+ void (async () => {
5
+ try {
6
+ await builtBackendApp.start();
7
+ console.info(`Server running at ${process.env.VITE_SERVER_URL}`);
8
+ } catch (e) {
9
+ console.error("[server] Fatal: builtBackendApp.start() failed", e);
10
+ process.exit(1);
11
+ }
12
+ })();
@@ -12,14 +12,12 @@ export const postsGrants = flattenNestedGrants({
12
12
  },
13
13
  organization: {
14
14
  owner: {
15
- read: "own",
16
- write: "own",
17
- delete: "own",
18
- publish: "own",
15
+ read: "org",
16
+ write: "org",
17
+ delete: "org",
18
+ publish: "org",
19
19
  },
20
- },
21
- team: {
22
- owner: {
20
+ member: {
23
21
  read: "own",
24
22
  write: "own",
25
23
  delete: "own",
@@ -14,7 +14,8 @@ export class PostsService extends BasePermissionService<
14
14
  readonly list = this.procedure("list")
15
15
  .input(postSchemas.input.list)
16
16
  .output(postSchemas.output.list)
17
- .requireAuth()
17
+ .requireAuth("organization")
18
+ .addContextFilter(["organization"])
18
19
  .handle(async ({ input }) => {
19
20
  return withSpan(
20
21
  {
@@ -31,7 +32,7 @@ export class PostsService extends BasePermissionService<
31
32
  });
32
33
 
33
34
  readonly create = this.procedure("create")
34
- .requireAuth()
35
+ .requireAuth("organization")
35
36
  .input(postSchemas.input.create)
36
37
  .output(postSchemas.output.single)
37
38
  .access({
@@ -59,7 +60,7 @@ export class PostsService extends BasePermissionService<
59
60
  });
60
61
 
61
62
  readonly update = this.procedure("update")
62
- .requireAuth()
63
+ .requireAuth("organization")
63
64
  .input(postSchemas.input.update)
64
65
  .output(postSchemas.output.single)
65
66
  .loadResource("post", ({ input }) => this.repository.posts.findById(input.id))
@@ -81,7 +82,7 @@ export class PostsService extends BasePermissionService<
81
82
  readonly publish = this.procedure("publish")
82
83
  .input(postSchemas.input.publish)
83
84
  .output(postSchemas.output.single)
84
- .requireAuth()
85
+ .requireAuth("organization")
85
86
  .loadResource("post", ({ input }) => this.repository.posts.findById(input.id))
86
87
  .access({
87
88
  action: "publish",
@@ -98,7 +99,7 @@ export class PostsService extends BasePermissionService<
98
99
  readonly softDelete = this.procedure("softDelete")
99
100
  .input(postSchemas.input.delete)
100
101
  .output(postSchemas.output.uuid)
101
- .requireAuth()
102
+ .requireAuth("organization")
102
103
  .loadResource("post", ({ input }) => this.repository.posts.findById(input.id))
103
104
  .access({
104
105
  action: "delete",
@@ -3,7 +3,7 @@ import { postSchemas } from "./posts.dto";
3
3
  import type { PostsService } from "./posts.service";
4
4
 
5
5
  export function createPostsTRPC(
6
- { router, privateProcedure: procedure }: TRPCMethods,
6
+ { router, organizationProcedure: procedure }: TRPCMethods,
7
7
  postsService: PostsService
8
8
  ) {
9
9
  return router({
@@ -1 +1,12 @@
1
- export type { AppRouter } from "./app";
1
+ import type { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
2
+ import type { builtBackendApp } from "./app";
3
+
4
+ export type AppRouter = typeof builtBackendApp.trpc.router;
5
+ export type RouterInputs = inferRouterInputs<AppRouter>;
6
+ export type RouterOutputs = inferRouterOutputs<AppRouter>;
7
+
8
+ export type Orm = typeof builtBackendApp.db.orm;
9
+ export type Schema = typeof builtBackendApp.db.schema;
10
+
11
+ export type Session = NonNullable<typeof builtBackendApp.auth>["instance"]["$Infer"]["Session"];
12
+ export type User = Session["user"];
@@ -9,13 +9,13 @@
9
9
  "check-types": "tsc --noEmit"
10
10
  },
11
11
  "dependencies": {
12
- "@m5kdev/commons": "catalog:",
13
- "zod": "catalog:"
12
+ "@m5kdev/commons": "catalog:m5kdev",
13
+ "zod": "catalog:m5kdev"
14
14
  },
15
15
  "devDependencies": {
16
- "@m5kdev/config": "catalog:",
17
- "tslib": "catalog:",
18
- "typescript": "catalog:"
16
+ "@m5kdev/config": "catalog:m5kdev",
17
+ "tslib": "catalog:m5kdev",
18
+ "typescript": "catalog:m5kdev"
19
19
  },
20
20
  "exports": {
21
21
  "./modules/app/*": "./src/modules/app/*.ts",
@@ -13,41 +13,41 @@
13
13
  },
14
14
  "dependencies": {
15
15
  "{{PACKAGE_SCOPE}}/shared": "workspace:*",
16
- "@heroui/react": "catalog:",
17
- "@heroui/styles": "catalog:",
18
- "@m5kdev/commons": "catalog:",
19
- "@m5kdev/frontend": "catalog:",
20
- "@m5kdev/web-ui": "catalog:",
21
- "@tanstack/react-query": "catalog:",
22
- "@trpc/client": "catalog:",
23
- "@trpc/tanstack-react-query": "catalog:",
24
- "better-auth": "catalog:",
25
- "i18next": "catalog:",
26
- "lucide-react": "catalog:",
27
- "nuqs": "catalog:",
28
- "posthog-js": "catalog:",
29
- "react": "catalog:",
30
- "react-dom": "catalog:",
31
- "react-hook-form": "catalog:",
32
- "react-i18next": "catalog:",
33
- "react-router": "catalog:",
34
- "sonner": "catalog:",
35
- "tailwindcss": "catalog:",
36
- "tw-animate-css": "catalog:",
37
- "zod": "catalog:"
16
+ "@heroui/react": "catalog:m5kdev",
17
+ "@heroui/styles": "catalog:m5kdev",
18
+ "@m5kdev/commons": "catalog:m5kdev",
19
+ "@m5kdev/frontend": "catalog:m5kdev",
20
+ "@m5kdev/web-ui": "catalog:m5kdev",
21
+ "@tanstack/react-query": "catalog:m5kdev",
22
+ "@trpc/client": "catalog:m5kdev",
23
+ "@trpc/tanstack-react-query": "catalog:m5kdev",
24
+ "better-auth": "catalog:m5kdev",
25
+ "i18next": "catalog:m5kdev",
26
+ "lucide-react": "catalog:m5kdev",
27
+ "nuqs": "catalog:m5kdev",
28
+ "posthog-js": "catalog:m5kdev",
29
+ "react": "catalog:m5kdev",
30
+ "react-dom": "catalog:m5kdev",
31
+ "react-hook-form": "catalog:m5kdev",
32
+ "react-i18next": "catalog:m5kdev",
33
+ "react-router": "catalog:m5kdev",
34
+ "sonner": "catalog:m5kdev",
35
+ "tailwindcss": "catalog:m5kdev",
36
+ "tw-animate-css": "catalog:m5kdev",
37
+ "zod": "catalog:m5kdev"
38
38
  },
39
39
  "devDependencies": {
40
40
  "{{PACKAGE_SCOPE}}/server": "workspace:*",
41
- "@m5kdev/config": "catalog:",
42
- "@tailwindcss/vite": "catalog:",
43
- "@types/react": "catalog:",
44
- "@types/react-dom": "catalog:",
45
- "@vitejs/plugin-react": "catalog:",
46
- "babel-plugin-react-compiler": "catalog:",
47
- "typescript": "catalog:",
48
- "vite": "catalog:",
49
- "vite-plugin-i18next-loader": "catalog:",
50
- "vite-tsconfig-paths": "catalog:",
51
- "@trpc/server": "catalog:"
41
+ "@m5kdev/config": "catalog:m5kdev",
42
+ "@tailwindcss/vite": "catalog:m5kdev",
43
+ "@types/react": "catalog:m5kdev",
44
+ "@types/react-dom": "catalog:m5kdev",
45
+ "@vitejs/plugin-react": "catalog:m5kdev",
46
+ "babel-plugin-react-compiler": "catalog:m5kdev",
47
+ "typescript": "catalog:m5kdev",
48
+ "vite": "catalog:m5kdev",
49
+ "vite-plugin-i18next-loader": "catalog:m5kdev",
50
+ "vite-tsconfig-paths": "catalog:m5kdev",
51
+ "@trpc/server": "catalog:m5kdev"
52
52
  }
53
53
  }