@oyolincc/create 0.0.0-dev-20260918103756 → 0.0.0-dev-20261006065712

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 (135) hide show
  1. package/package.json +1 -1
  2. package/templates/hono-fullstack/.vscode/launch.json +14 -3
  3. package/templates/hono-fullstack/.vscode/settings.json +3 -1
  4. package/templates/hono-fullstack/AGENTS.md +7 -0
  5. package/templates/hono-fullstack/README.md +28 -14
  6. package/templates/hono-fullstack/_gitignore +4 -0
  7. package/templates/hono-fullstack/apps/server/.dev.vars.example +9 -0
  8. package/templates/hono-fullstack/apps/server/package.json +17 -10
  9. package/templates/hono-fullstack/apps/server/src/adapters/cloudflare/entry.ts +36 -0
  10. package/templates/hono-fullstack/apps/server/src/adapters/nodejs/bootstrap.ts +3 -6
  11. package/templates/hono-fullstack/apps/server/src/adapters/nodejs/entry.ts +21 -6
  12. package/templates/hono-fullstack/apps/server/src/app.ts +4 -6
  13. package/templates/hono-fullstack/apps/server/src/config.ts +47 -0
  14. package/templates/hono-fullstack/apps/server/src/infra/logger/pino.ts +4 -0
  15. package/templates/hono-fullstack/apps/server/src/infra/work-runner/example/worker-entry.ts +4 -25
  16. package/templates/hono-fullstack/apps/server/src/infra/work-runner/pass-through/runner.ts +42 -0
  17. package/templates/{hono-server/apps/server/src/infra/work-runner/example → hono-fullstack/apps/server/src/infra/work-runner/piscina}/runner.ts +9 -9
  18. package/templates/hono-fullstack/apps/server/src/infra/work-runner/types.ts +7 -2
  19. package/templates/hono-fullstack/apps/server/src/infra/work-runner/utils/message.ts +7 -4
  20. package/templates/hono-fullstack/apps/server/src/modules/example/routes.ts +3 -5
  21. package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.test.ts +17 -5
  22. package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.ts +38 -15
  23. package/templates/hono-fullstack/apps/server/src/shared/app/types.ts +8 -4
  24. package/templates/hono-fullstack/apps/server/src/shared/network/validator.ts +10 -3
  25. package/templates/hono-fullstack/apps/server/tsconfig.json +1 -0
  26. package/templates/hono-fullstack/apps/server/vite.config.ts +8 -3
  27. package/templates/hono-fullstack/apps/server/wrangler.jsonc +29 -0
  28. package/templates/hono-fullstack/apps/stack/backend/cloudflare.ts +5 -0
  29. package/templates/hono-fullstack/apps/stack/backend/node.ts +3 -0
  30. package/templates/hono-fullstack/apps/stack/frontend/components/general/ErrorMessage.tsx +4 -0
  31. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/AppLayout.tsx +11 -0
  32. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Header.tsx +7 -0
  33. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Page.tsx +5 -0
  34. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/PageContainer.tsx +5 -0
  35. package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleForm.tsx +45 -0
  36. package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleList.tsx +13 -0
  37. package/templates/hono-fullstack/apps/stack/frontend/modules/example/{hooks.ts → hooks/api-hooks.ts} +2 -1
  38. package/templates/hono-fullstack/apps/stack/frontend/modules/example/stores/index.ts +3 -0
  39. package/templates/hono-fullstack/apps/stack/frontend/routeTree.gen.ts +21 -4
  40. package/templates/hono-fullstack/apps/stack/frontend/routes/api/$.ts +18 -0
  41. package/templates/hono-fullstack/apps/stack/frontend/routes/index.tsx +48 -2
  42. package/templates/hono-fullstack/apps/stack/frontend/vite-env.d.ts +5 -0
  43. package/templates/hono-fullstack/apps/stack/package.json +20 -4
  44. package/templates/hono-fullstack/apps/stack/tsconfig.json +7 -4
  45. package/templates/hono-fullstack/apps/stack/tsr.config.json +2 -2
  46. package/templates/hono-fullstack/apps/stack/vite.config.ts +75 -26
  47. package/templates/hono-fullstack/apps/stack/wrangler.jsonc +20 -0
  48. package/templates/hono-fullstack/envs/.env.example.server +1 -1
  49. package/templates/hono-fullstack/envs/.env.example.sqlite +1 -2
  50. package/templates/hono-fullstack/envs/.env.example.sqlite-d1 +3 -0
  51. package/templates/hono-fullstack/libs/db/drizzle-kit/sqlite-d1.config.ts +22 -0
  52. package/templates/hono-fullstack/libs/db/package.json +9 -6
  53. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/d1-client.ts +12 -0
  54. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/columns.ts +5 -0
  55. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +2 -2
  56. package/templates/hono-fullstack/libs/db/vite.config.ts +1 -0
  57. package/templates/hono-fullstack/libs/definition/src/configs/defs/runtime.ts +1 -0
  58. package/templates/hono-fullstack/libs/definition/src/configs/defs/sqlite.ts +16 -3
  59. package/templates/hono-fullstack/oyo.config.json +2 -1
  60. package/templates/hono-fullstack/package.json +1 -5
  61. package/templates/hono-fullstack/pnpm-workspace.yaml +8 -6
  62. package/templates/hono-fullstack/turbo.json +26 -3
  63. package/templates/hono-fullstack/vite.config.ts +1 -0
  64. package/templates/hono-server/.vscode/launch.json +7 -3
  65. package/templates/hono-server/.vscode/settings.json +3 -1
  66. package/templates/hono-server/AGENTS.md +7 -0
  67. package/templates/hono-server/README.md +25 -12
  68. package/templates/hono-server/_gitignore +4 -0
  69. package/templates/hono-server/apps/server/.dev.vars.example +9 -0
  70. package/templates/hono-server/apps/server/package.json +18 -9
  71. package/templates/hono-server/apps/server/src/adapters/cloudflare/entry.ts +36 -0
  72. package/templates/hono-server/apps/server/src/adapters/nodejs/bootstrap.ts +3 -3
  73. package/templates/hono-server/apps/server/src/adapters/nodejs/entry.ts +28 -6
  74. package/templates/hono-server/apps/server/src/app.ts +4 -6
  75. package/templates/hono-server/apps/server/src/config.ts +47 -0
  76. package/templates/hono-server/apps/server/src/infra/logger/pino.ts +4 -0
  77. package/templates/hono-server/apps/server/src/infra/work-runner/example/worker-entry.ts +4 -25
  78. package/templates/hono-server/apps/server/src/infra/work-runner/pass-through/runner.ts +42 -0
  79. package/templates/{hono-fullstack/apps/server/src/infra/work-runner/example → hono-server/apps/server/src/infra/work-runner/piscina}/runner.ts +9 -9
  80. package/templates/hono-server/apps/server/src/infra/work-runner/types.ts +7 -2
  81. package/templates/hono-server/apps/server/src/infra/work-runner/utils/message.ts +7 -4
  82. package/templates/hono-server/apps/server/src/modules/example/contracts.ts +4 -0
  83. package/templates/hono-server/apps/server/src/modules/example/routes.ts +32 -5
  84. package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.test.ts +17 -5
  85. package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.ts +38 -15
  86. package/templates/hono-server/apps/server/src/shared/app/types.ts +8 -4
  87. package/templates/hono-server/apps/server/src/shared/network/validator.ts +10 -3
  88. package/templates/hono-server/apps/server/tsconfig.json +1 -0
  89. package/templates/hono-server/apps/server/vite.config.ts +8 -3
  90. package/templates/hono-server/apps/server/wrangler.jsonc +29 -0
  91. package/templates/hono-server/docker/server.Dockerfile +3 -5
  92. package/templates/hono-server/envs/.env.example.server +1 -1
  93. package/templates/hono-server/envs/.env.example.sqlite +1 -0
  94. package/templates/hono-server/envs/.env.example.sqlite-d1 +3 -0
  95. package/templates/hono-server/libs/db/drizzle-kit/sqlite-d1.config.ts +22 -0
  96. package/templates/hono-server/libs/db/drizzle-kit/sqlite.config.ts +22 -0
  97. package/templates/hono-server/libs/db/package.json +42 -0
  98. package/templates/hono-server/libs/db/src/dialects/sqlite/client.ts +35 -0
  99. package/templates/hono-server/libs/db/src/dialects/sqlite/d1-client.ts +12 -0
  100. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/columns.ts +37 -0
  101. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/index.ts +7 -0
  102. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +22 -0
  103. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/relations.ts +5 -0
  104. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/tables.ts +5 -0
  105. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/types.ts +7 -0
  106. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/vo.ts +1 -0
  107. package/templates/hono-server/libs/db/src/dialects/sqlite/utils.ts +8 -0
  108. package/templates/hono-server/libs/db/src/shared/types.ts +26 -0
  109. package/templates/hono-server/libs/db/tsconfig.json +10 -0
  110. package/templates/hono-server/libs/db/vite.config.ts +22 -0
  111. package/templates/hono-server/libs/definition/src/configs/defs/runtime.ts +1 -0
  112. package/templates/hono-server/libs/definition/src/configs/defs/sqlite.ts +26 -0
  113. package/templates/hono-server/libs/definition/src/configs/index.ts +1 -0
  114. package/templates/hono-server/libs/definition/vite.config.ts +1 -1
  115. package/templates/hono-server/oyo.config.json +3 -1
  116. package/templates/hono-server/package.json +2 -3
  117. package/templates/hono-server/pnpm-workspace.yaml +13 -4
  118. package/templates/hono-server/turbo.json +26 -3
  119. package/templates/hono-server/vite.config.ts +1 -0
  120. package/templates/monorepo/.vscode/launch.json +0 -3
  121. package/templates/monorepo/.vscode/settings.json +3 -1
  122. package/templates/monorepo/AGENTS.md +7 -0
  123. package/templates/monorepo/_gitignore +4 -0
  124. package/templates/monorepo/pnpm-workspace.yaml +6 -3
  125. package/templates/monorepo/turbo.json +26 -3
  126. package/templates/monorepo/vite.config.ts +1 -0
  127. package/templates/hono-fullstack/apps/server/src/adapters/nodejs/config.ts +0 -53
  128. package/templates/hono-fullstack/apps/server/src/app.test.ts +0 -52
  129. package/templates/hono-fullstack/apps/server/src/infra/work-runner/example/runner.test.ts +0 -56
  130. package/templates/hono-fullstack/apps/stack/frontend/modules/example/ExamplePage.tsx +0 -57
  131. package/templates/hono-fullstack/apps/stack/nitro/handlers/hono.ts +0 -1
  132. package/templates/hono-fullstack/apps/stack/nitro/plugins/hono.ts +0 -9
  133. package/templates/hono-server/apps/server/src/adapters/nodejs/config.ts +0 -53
  134. package/templates/hono-server/apps/server/src/app.test.ts +0 -52
  135. package/templates/hono-server/apps/server/src/infra/work-runner/example/runner.test.ts +0 -56
@@ -1,33 +1,82 @@
1
- import { defineConfig } from 'vite-plus'
1
+ import { defineConfig, lazyPlugins, type PluginOption } from 'vite-plus'
2
2
  import { tanstackStart } from '@tanstack/react-start/plugin/vite'
3
3
  import tailwindcss from '@tailwindcss/vite'
4
4
  import viteReact from '@vitejs/plugin-react'
5
- import { nitro } from 'nitro/vite'
5
+ import path from 'node:path'
6
6
 
7
- export default defineConfig({
8
- server: {
9
- port: 3000,
10
- warmup: {
11
- clientFiles: ['./frontend/router.tsx'],
12
- ssrFiles: ['./frontend/router.tsx'],
7
+ export default defineConfig(() => {
8
+ const deployTarget = process.env.DEPLOY_TARGET || 'node'
9
+ if (deployTarget !== 'node' && deployTarget !== 'cloudflare') {
10
+ throw new Error(`DEPLOY_TARGET must be "node" or "cloudflare", received: ${deployTarget}`)
11
+ }
12
+ const serverExternal = /^@repo\/server(?:\/|$)/
13
+
14
+ return {
15
+ ...(deployTarget === 'node'
16
+ ? {
17
+ environments: {
18
+ ssr: {
19
+ resolve: {
20
+ // 拦住第一次:Vite/TanStack SSR bundle
21
+ external: ['@repo/server/nodejs'],
22
+ },
23
+ },
24
+ },
25
+ }
26
+ : {
27
+ environments: {
28
+ ssr: {
29
+ resolve: {
30
+ mainFields: ['browser', 'module', 'jsnext:main', 'jsnext'],
31
+ },
32
+ },
33
+ },
34
+ }),
35
+ server: {
36
+ port: 3000,
37
+ warmup: {
38
+ clientFiles: ['./frontend/router.tsx'],
39
+ ssrFiles: ['./frontend/router.tsx'],
40
+ },
41
+ },
42
+ preview: {
43
+ port: 3000,
44
+ strictPort: true,
13
45
  },
14
- },
15
- resolve: { tsconfigPaths: true },
16
- optimizeDeps: { include: ['@repo/definition/frontend'] },
17
- plugins: [
18
- nitro({
19
- serverDir: './nitro',
20
- handlers: [
21
- {
22
- route: '/api/**',
23
- handler: './nitro/handlers/hono.ts',
24
- middleware: false,
25
- lazy: false,
26
- },
27
- ],
46
+ resolve: {
47
+ tsconfigPaths: true,
48
+ alias: {
49
+ '#server-runtime': path.resolve(import.meta.dirname, `./backend/${deployTarget}.ts`),
50
+ },
51
+ },
52
+ optimizeDeps: { include: ['@repo/definition/frontend'] },
53
+ plugins: lazyPlugins(async () => {
54
+ const runtimePlugins =
55
+ deployTarget === 'cloudflare'
56
+ ? [
57
+ (await import('@cloudflare/vite-plugin')).cloudflare({
58
+ viteEnvironment: { name: 'ssr' },
59
+ persistState: {
60
+ path: path.resolve(import.meta.dirname, '../../.wrangler/state'),
61
+ },
62
+ }),
63
+ ]
64
+ : (await import('nitro/vite')).nitro({
65
+ preset: 'node_server',
66
+ serverDir: './nitro',
67
+ // 拦住第二次:Nitro 最终 server bundle
68
+ rollupConfig: {
69
+ external: [serverExternal],
70
+ },
71
+ })
72
+
73
+ const pluginOptions = [
74
+ ...runtimePlugins,
75
+ ...tanstackStart({ srcDirectory: './frontend' }),
76
+ ...tailwindcss(),
77
+ ...viteReact(),
78
+ ] as PluginOption[]
79
+ return pluginOptions
28
80
  }),
29
- tanstackStart({ srcDirectory: './frontend' }),
30
- tailwindcss(),
31
- viteReact(),
32
- ],
81
+ }
33
82
  })
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "./node_modules/wrangler/config-schema.json",
3
+ "name": "repo-stack",
4
+ "main": "@tanstack/react-start/server-entry",
5
+ "compatibility_date": "2026-09-23",
6
+ "compatibility_flags": ["nodejs_compat"],
7
+ "observability": {
8
+ "logs": { "enabled": true, "invocation_logs": true },
9
+ "traces": { "enabled": false },
10
+ },
11
+ "d1_databases": [
12
+ {
13
+ "binding": "DB",
14
+ "database_name": "repo-db",
15
+ "database_id": "00000000-0000-0000-0000-000000000000",
16
+ "migrations_dir": "../../libs/db/migrations/sqlite-d1",
17
+ "migrations_pattern": "../../libs/db/migrations/sqlite-d1/*/migration.sql",
18
+ },
19
+ ],
20
+ }
@@ -1,4 +1,5 @@
1
1
  NODE_PORT=6464
2
+ SERVER_BASE_PATH=/api
2
3
  SERVER_ENV=local
3
4
  LOGGER_DIR=./logs
4
5
  LOGGER_FILE_BASE=app
@@ -9,4 +10,3 @@ CORS_DOMAINS='*'
9
10
  # CONCURRENT_TASKS_PER_WORKER=1
10
11
  # MAX_QUEUE=12
11
12
  # WORKER_TASK_TIMEOUT_MS=30000
12
-
@@ -1,2 +1 @@
1
- DB_PATH=./db-data/repo.sqlite
2
-
1
+ DB_PATH=/absolute/path/to/repo.sqlite
@@ -0,0 +1,3 @@
1
+ CLOUDFLARE_ACCOUNT_ID=
2
+ CLOUDFLARE_DATABASE_ID=
3
+ CLOUDFLARE_TOKEN=
@@ -0,0 +1,22 @@
1
+ import path from 'node:path'
2
+ import { defineConfig } from 'drizzle-kit'
3
+ import { d1SchemaConfig } from '@repo/definition/backend'
4
+
5
+ const configDir = import.meta.dirname
6
+
7
+ const { cloudflareAccountId, cloudflareDatabaseId, cloudflareToken } = d1SchemaConfig.resolve({
8
+ context: process.env,
9
+ matchContextKey: 'constantCase',
10
+ })
11
+
12
+ export default defineConfig({
13
+ dialect: 'sqlite',
14
+ driver: 'd1-http',
15
+ schema: path.join(configDir, '../src/dialects/sqlite/schema/tables.ts'),
16
+ out: path.join(configDir, '../migrations/sqlite-d1'),
17
+ dbCredentials: {
18
+ accountId: cloudflareAccountId,
19
+ databaseId: cloudflareDatabaseId,
20
+ token: cloudflareToken,
21
+ },
22
+ })
@@ -7,6 +7,7 @@
7
7
  ],
8
8
  "type": "module",
9
9
  "exports": {
10
+ "./sqlite/d1-client": "./dist/sqlite/d1-client.mjs",
10
11
  "./sqlite/schema": "./dist/sqlite/schema.mjs",
11
12
  "./sqlite/sqlite": "./dist/sqlite/sqlite.mjs",
12
13
  "./package.json": "./package.json"
@@ -16,22 +17,24 @@
16
17
  "dev": "vp pack --watch",
17
18
  "test": "vp test",
18
19
  "check": "vp check",
20
+ "sqlite:export": "oyo env sqlite -- drizzle-kit export --config=drizzle-kit/sqlite.config.ts",
19
21
  "dev:sqlite:push": "oyo env sqlite -- drizzle-kit push --config=drizzle-kit/sqlite.config.ts",
20
22
  "dev:sqlite:gen": "oyo env sqlite -- drizzle-kit generate --config=drizzle-kit/sqlite.config.ts",
21
- "dev:sqlite:migrate": "oyo env sqlite -- drizzle-kit migrate --config=drizzle-kit/sqlite.config.ts"
23
+ "dev:sqlite:migrate": "oyo env sqlite -- drizzle-kit migrate --config=drizzle-kit/sqlite.config.ts",
24
+ "dev:d1:gen": "oyo env sqlite-d1 -- drizzle-kit generate --config=drizzle-kit/sqlite-d1.config.ts",
25
+ "dev:d1:migrate": "oyo env sqlite-d1 -- drizzle-kit migrate --config=drizzle-kit/sqlite-d1.config.ts"
22
26
  },
23
27
  "dependencies": {
24
28
  "@repo/definition": "workspace:*",
25
- "better-sqlite3": "catalog:drizzle",
26
- "drizzle-orm": "catalog:drizzle"
29
+ "better-sqlite3": "catalog:db",
30
+ "drizzle-orm": "catalog:db"
27
31
  },
28
32
  "devDependencies": {
29
- "@cloudflare/workers-types": "catalog:drizzle",
30
33
  "@oyolincc/cli": "catalog:",
31
34
  "@oyolincc/dev-config": "catalog:",
32
- "@types/better-sqlite3": "catalog:drizzle",
35
+ "@types/better-sqlite3": "catalog:db",
33
36
  "@types/node": "catalog:",
34
- "drizzle-kit": "catalog:drizzle",
37
+ "drizzle-kit": "catalog:db",
35
38
  "tsx": "catalog:",
36
39
  "typescript": "catalog:",
37
40
  "vite-plus": "catalog:"
@@ -0,0 +1,12 @@
1
+ import { drizzle, type AnyD1Database } from 'drizzle-orm/d1'
2
+ import { relations } from './schema'
3
+
4
+ export type D1Binding = AnyD1Database
5
+
6
+ export function createD1Client(database: D1Binding) {
7
+ if (!database) throw new Error('database must not be empty')
8
+
9
+ const db = drizzle(database, { relations })
10
+
11
+ return { db }
12
+ }
@@ -10,6 +10,11 @@ export const idType = customType<{ data: string; driverData: number | bigint }>(
10
10
  },
11
11
  })
12
12
 
13
+ export const autoIncrementId = (name: string) =>
14
+ idType(name)
15
+ .primaryKey({ autoIncrement: true })
16
+ .$defaultFn(() => sql`null`)
17
+
13
18
  export function timestampMsColumn(name: string) {
14
19
  return integer(name, { mode: 'timestamp_ms' })
15
20
  .notNull()
@@ -1,10 +1,10 @@
1
1
  import { sqliteTable, text } from 'drizzle-orm/sqlite-core'
2
- import { idType, modifiedTimeCols } from '../../columns'
2
+ import { autoIncrementId, modifiedTimeCols } from '../../columns'
3
3
  import type { SelectVOResults } from '@/shared/types'
4
4
  import { defineVO } from '@/shared/types'
5
5
 
6
6
  export const examples = sqliteTable('examples', {
7
- id: idType('id').primaryKey({ autoIncrement: true }),
7
+ id: autoIncrementId('id'),
8
8
  message: text('message').notNull(),
9
9
  ...modifiedTimeCols(),
10
10
  })
@@ -10,6 +10,7 @@ export default defineConfig({
10
10
  entry: {
11
11
  'sqlite/schema': 'src/dialects/sqlite/schema/index.ts',
12
12
  'sqlite/sqlite': 'src/dialects/sqlite/client.ts',
13
+ 'sqlite/d1-client': 'src/dialects/sqlite/d1-client.ts',
13
14
  },
14
15
  exports: true,
15
16
  },
@@ -2,6 +2,7 @@ import * as v from 'valibot'
2
2
  import { defineSchemaConfig } from '../proto'
3
3
 
4
4
  export const $S_RuntimeConfig = v.object({
5
+ serverBasePath: v.optional(v.string(), '/'),
5
6
  serverEnv: v.optional(
6
7
  v.union([v.literal('local'), v.literal('test'), v.literal('staging'), v.literal('main')]),
7
8
  'local',
@@ -3,11 +3,24 @@ import * as v from 'valibot'
3
3
  import { defineSchemaConfig } from '../proto'
4
4
  import { $S_NonEmptyString } from '../schema'
5
5
 
6
- const workspaceRoot = path.join(import.meta.dirname, '../../..')
7
- const defaultDbPath = path.join(workspaceRoot, 'db-data', 'repo.sqlite')
6
+ function defaultSqliteDbPath(): string {
7
+ const workspaceRoot = path.join(import.meta.dirname, '../../..')
8
+ return path.join(workspaceRoot, 'db-data', 'repo.sqlite')
9
+ }
8
10
 
9
11
  export const $S_SqliteSchemaConfig = v.object({
10
- dbPath: v.optional($S_NonEmptyString, defaultDbPath),
12
+ dbPath: v.pipe(
13
+ v.optional($S_NonEmptyString),
14
+ v.transform((dbPath) => dbPath || defaultSqliteDbPath()),
15
+ ) as v.GenericSchema<string | undefined, string>,
11
16
  })
12
17
  export type SqliteSchemaConfig = v.InferOutput<typeof $S_SqliteSchemaConfig>
13
18
  export const sqliteSchemaConfig = defineSchemaConfig($S_SqliteSchemaConfig)
19
+
20
+ export const $S_D1SchemaConfig = v.object({
21
+ cloudflareAccountId: $S_NonEmptyString,
22
+ cloudflareDatabaseId: $S_NonEmptyString,
23
+ cloudflareToken: $S_NonEmptyString,
24
+ })
25
+ export type D1SchemaConfig = v.InferOutput<typeof $S_D1SchemaConfig>
26
+ export const d1SchemaConfig = defineSchemaConfig($S_D1SchemaConfig)
@@ -3,7 +3,8 @@
3
3
  "dir": "./envs/",
4
4
  "presets": {
5
5
  "server": [".env.server", ".env.sqlite"],
6
- "sqlite": [".env.sqlite"]
6
+ "sqlite": [".env.sqlite"],
7
+ "sqlite-d1": [".env.sqlite-d1"]
7
8
  }
8
9
  },
9
10
  "codeGenerator": {
@@ -6,10 +6,7 @@
6
6
  "prepare": "vp config",
7
7
  "changeset": "vp exec changeset",
8
8
  "build": "turbo build",
9
- "dev": "turbo build --filter=@repo/definition --filter=@repo/db --filter=@repo/server && concurrently -k -n definition,db,server,stack -c blue,magenta,green,yellow \"pnpm --filter @repo/definition dev\" \"pnpm --filter @repo/db dev\" \"pnpm --filter @repo/server dev:pack\" \"pnpm --filter @repo/stack dev\"",
10
- "dev:sqlite:push": "pnpm --filter @repo/db dev:sqlite:push",
11
- "dev:sqlite:gen": "pnpm --filter @repo/db dev:sqlite:gen",
12
- "dev:sqlite:migrate": "pnpm --filter @repo/db dev:sqlite:migrate"
9
+ "build:libs": "turbo build --filter=!@repo/stack --filter=!@repo/server"
13
10
  },
14
11
  "devDependencies": {
15
12
  "@changesets/changelog-github": "catalog:",
@@ -17,7 +14,6 @@
17
14
  "@oyolincc/cli": "catalog:",
18
15
  "@oyolincc/dev-config": "catalog:",
19
16
  "@types/node": "catalog:",
20
- "concurrently": "catalog:",
21
17
  "tsx": "catalog:",
22
18
  "turbo": "catalog:",
23
19
  "vite-plus": "catalog:"
@@ -8,6 +8,7 @@ catalogPrune: true
8
8
  catalog:
9
9
  '@changesets/changelog-github': '0.5.0'
10
10
  '@changesets/cli': '2.27.12'
11
+ '@cloudflare/vite-plugin': '1.62.5'
11
12
  '@oyolincc/cli': '2.1.3'
12
13
  '@oyolincc/dev-config': '0.1.1'
13
14
  '@oyolincc/env-loader': '^0.2.0'
@@ -21,8 +22,9 @@ catalog:
21
22
  'tsx': '4.21.0'
22
23
  'turbo': '^2.9.14'
23
24
  'typescript': '7.0.2'
24
- 'vite': 'npm:@voidzero-dev/vite-plus-core@0.2.8'
25
- 'vite-plus': '0.2.8'
25
+ 'vite': 'npm:@voidzero-dev/vite-plus-core@0.3.1'
26
+ 'vite-plus': '0.3.1'
27
+ 'wrangler': '4.147.0'
26
28
 
27
29
  catalogs:
28
30
  shared:
@@ -40,7 +42,7 @@ catalogs:
40
42
  '@hono/vite-dev-server': '^0.26.1'
41
43
  '@valibot/to-json-schema': '^1.7.1'
42
44
  'hono': '^4.13.1'
43
- 'hono-openapi': '^1.3.1'
45
+ 'hono-openapi': '^1.3.3'
44
46
  'hono-pino': '^0.10.3'
45
47
  'hono-problem-details': '^0.11.0'
46
48
  'pino': '^10.3.1'
@@ -61,15 +63,14 @@ catalogs:
61
63
  'react': '19.2.7'
62
64
  'react-dom': '19.2.7'
63
65
  'tailwindcss': '^4.3.3'
64
- drizzle:
65
- '@cloudflare/workers-types': '5.20260823.1'
66
+ db:
66
67
  '@types/better-sqlite3': '^7.6.13'
67
68
  'better-sqlite3': '^12.11.1'
68
69
  'drizzle-kit': '1.0.0-rc.4'
69
70
  'drizzle-orm': '1.0.0-rc.4'
70
71
 
71
72
  overrides:
72
- 'vite': 'catalog:'
73
+ 'vite@*': 'catalog:'
73
74
 
74
75
  peerDependencyRules:
75
76
  allowAny:
@@ -80,3 +81,4 @@ peerDependencyRules:
80
81
  allowBuilds:
81
82
  'better-sqlite3': true
82
83
  'esbuild': true
84
+ 'workerd': true
@@ -1,13 +1,36 @@
1
1
  {
2
2
  "$schema": "https://turbo.build/schema.json",
3
3
  "tasks": {
4
- "build": {
4
+ "dev": {
5
5
  "dependsOn": ["^build"],
6
- "outputs": ["dist/**", ".output/**"]
6
+ "cache": false,
7
+ "persistent": true
7
8
  },
8
- "dev": {
9
+ "dev:node": {
10
+ "dependsOn": ["^build"],
11
+ "env": ["DEPLOY_TARGET"],
12
+ "cache": false,
13
+ "persistent": true
14
+ },
15
+ "dev:cloudflare": {
16
+ "dependsOn": ["^build"],
17
+ "env": ["DEPLOY_TARGET"],
9
18
  "cache": false,
10
19
  "persistent": true
20
+ },
21
+ "build": {
22
+ "dependsOn": ["^build"],
23
+ "outputs": ["dist/**", ".output/**"]
24
+ },
25
+ "build:node": {
26
+ "dependsOn": ["^build"],
27
+ "env": ["DEPLOY_TARGET"],
28
+ "outputs": ["dist/**", ".output/**"]
29
+ },
30
+ "build:cloudflare": {
31
+ "dependsOn": ["^build"],
32
+ "env": ["DEPLOY_TARGET"],
33
+ "outputs": ["dist/**", ".output/**"]
11
34
  }
12
35
  }
13
36
  }
@@ -2,6 +2,7 @@ import { defineConfig } from 'vite-plus'
2
2
  import { lintConfig, fmtConfig } from '@oyolincc/dev-config'
3
3
 
4
4
  export default defineConfig({
5
+ create: { defaultTemplate: '@oyolincc' },
5
6
  staged: {
6
7
  '*': 'vp check --fix',
7
8
  },
@@ -10,6 +10,13 @@
10
10
  "sourceMaps": true,
11
11
  "type": "node-terminal"
12
12
  },
13
+ {
14
+ "command": "pnpm -C apps/server dev:node-chain",
15
+ "name": "repo-server",
16
+ "request": "launch",
17
+ "sourceMaps": true,
18
+ "type": "node-terminal"
19
+ },
13
20
  {
14
21
  "name": "Attach to process",
15
22
  "port": 19230,
@@ -18,8 +25,5 @@
18
25
  "type": "node"
19
26
  }
20
27
  ],
21
- // Use IntelliSense to learn about possible attributes.
22
- // Hover to view descriptions of existing attributes.
23
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
24
28
  "version": "0.2.0"
25
29
  }
@@ -20,5 +20,7 @@
20
20
  "editor.codeActionsOnSave": {
21
21
  "source.fixAll.oxc": "explicit"
22
22
  },
23
- "oxc.enable.oxlint": false
23
+ "oxc.enable.oxlint": false,
24
+ "oxc.disableNestedConfig": true,
25
+ "oxc.fmt.disableNestedConfig": true
24
26
  }
@@ -10,6 +10,13 @@ Docs are local at `node_modules/vite-plus/docs` or online at https://viteplus.de
10
10
 
11
11
  `vp <name>` runs a built-in command. `vp run <name>` runs a `package.json` script or a `vite.config.ts` task. Scripts cannot overwrite built-ins, so `vp dev` and `vp run dev` may do different things. Check `package.json` and `vite.config.ts` first, and run `vp run <name>` when the project defines a script or task with that name.
12
12
 
13
+ ## Tool Versions
14
+
15
+ Run `vp toolchain` to show versions and relationships in the active Vite+
16
+ release. Add a tool name to select part of the graph. For example, run
17
+ `vp toolchain vite`. Use `--global` to ignore the local `vite-plus` package. Use
18
+ `vp why <package>` to show the package-manager dependency graph.
19
+
13
20
  ## Review Checklist
14
21
 
15
22
  - [ ] Run `vp install` after pulling remote changes and before getting started.
@@ -1,31 +1,44 @@
1
1
  # Hono server monorepo
2
2
 
3
- This template contains a standalone Node.js/Hono application, shared definitions, a complete Piscina worker protocol, and Docker deployment files.
3
+ This template contains Node.js and Cloudflare Hono adapters, SQLite/D1 persistence, shared definitions, the complete optional Piscina worker infrastructure, and standalone Docker deployment files.
4
4
 
5
5
  ## Layout
6
6
 
7
- - `apps/server`: standalone Hono server, Node adapter, logging, errors, and worker runtime.
7
+ - `apps/server`: Hono application, Node.js and Cloudflare adapters, logging, errors, and worker runtime.
8
8
  - `libs/definition`: backend contracts and environment definitions.
9
- - `envs`: committed server environment example.
10
- - `docker` and `scripts`: local and production standalone container workflows.
9
+ - `libs/db`: SQLite/Drizzle and D1 clients, schema, relations, and manual migration commands.
10
+ - `envs`: committed environment examples.
11
+ - `docker` and `scripts`: local and production standalone Node container workflows.
11
12
 
12
13
  ## Setup
13
14
 
14
15
  ```bash
15
16
  pnpm install
17
+ pnpm --filter @repo/server cf:typegen
18
+ cp apps/server/.dev.vars.example apps/server/.dev.vars
16
19
  cp envs/.env.example.server envs/.env.server
20
+ cp envs/.env.example.sqlite envs/.env.sqlite
21
+ cp envs/.env.example.sqlite-d1 envs/.env.sqlite-d1
17
22
  pnpm prepare
18
- pnpm dev
23
+ pnpm --filter @repo/db dev:sqlite:push
24
+ pnpm -C apps/server dev:node-chain
19
25
  ```
20
26
 
21
- The server defaults to `http://localhost:6464`. Health is available at `/health`, OpenAPI YAML at `/docs/openapi.yaml`, Swagger at `/swagger`, and the worker example at `POST /examples/process` with `{ "message": "hello" }`.
27
+ Database schema changes remain manual. Production Worker variables are configured in the Cloudflare dashboard; `.dev.vars` is only for local development.
28
+
29
+ Before deploying, replace the placeholder D1 `database_id` and `database_name` in `apps/server/wrangler.jsonc`.
30
+
31
+ Example tasks run in-process through `PassThroughWorkRunner` by default. To use worker threads, enable `PiscinaWorkRunner` in the Node.js adapter and the adjacent worker pack entry in `apps/server/vite.config.ts`.
22
32
 
23
33
  ## Commands
24
34
 
25
- - `pnpm dev`: start standalone Hono development.
26
- - `pnpm build`: build all packages.
27
- - `pnpm --filter @repo/server test`: run server contract and worker tests.
28
- - `pnpm --filter @repo/server dev:pack`: watch only package artifacts.
29
- - `pnpm --filter @repo/server docker:build`: build the standalone image.
35
+ - `pnpm -C apps/server dev:node-chain`: build upstream dependencies, then watch the Node.js server and its dependencies.
36
+ - `pnpm -C apps/server dev:cloudflare-chain`: build upstream dependencies, then watch the Cloudflare server and its dependencies.
37
+ - `pnpm build`: build all workspace packages.
38
+ - `pnpm --filter @repo/db dev:sqlite:push`: push the local SQLite schema manually.
39
+ - `pnpm --filter @repo/db dev:d1:gen` / `pnpm --filter @repo/db dev:d1:migrate`: generate or apply D1 migrations manually.
40
+ - `pnpm --filter @repo/server cf:typegen`: generate Cloudflare runtime and binding types.
41
+ - `pnpm --filter @repo/server docker:build`: build the standalone Node.js image.
42
+ - `pnpm --filter @repo/server test`: run the retained server tests.
30
43
 
31
- Docker supports local Compose under `docker/local` and production Compose under `docker/prod`. This template does not contain CI configuration.
44
+ The server base path is configured by `SERVER_BASE_PATH`. Health, OpenAPI YAML, Swagger, CRUD, and worker processing are available below that base path. Docker supports local Compose under `docker/local` and production Compose under `docker/prod`. CI is intentionally not included.
@@ -10,6 +10,7 @@ lerna-debug.log*
10
10
  node_modules
11
11
  dist
12
12
  dist-ssr
13
+ .output
13
14
  *.local
14
15
 
15
16
  # Editor directories and files
@@ -28,3 +29,6 @@ dist-ssr
28
29
  .worktrees/
29
30
  **/temp/
30
31
  .turbo
32
+ .wrangler
33
+ .dev.vars
34
+ db-data
@@ -0,0 +1,9 @@
1
+ SERVER_BASE_PATH=/api
2
+ SERVER_ENV=local
3
+ LOGGER_LEVEL=debug
4
+ CORS_DOMAINS='*'
5
+ # MIN_THREADS=1
6
+ # MAX_THREADS=4
7
+ # CONCURRENT_TASKS_PER_WORKER=1
8
+ # MAX_QUEUE=12
9
+ # WORKER_TASK_TIMEOUT_MS=30000
@@ -2,19 +2,25 @@
2
2
  "name": "@repo/server",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
- "files": [
6
- "dist"
7
- ],
5
+ "files": ["dist"],
8
6
  "type": "module",
9
7
  "exports": {
10
- "./node": "./dist/nodeEntry.mjs",
8
+ "./nodejs": "./dist/nodejsEntry.mjs",
9
+ "./cloudflare": "./dist/cloudflareEntry.mjs",
11
10
  "./package.json": "./package.json"
12
11
  },
13
12
  "scripts": {
14
- "dev": "concurrently -k -n dev,pack -c blue,green \"vp dev\" \"VITE_PUBLIC_DEV_SERVE=1 vp pack --watch\"",
15
- "dev:pack": "VITE_PUBLIC_DEV_SERVE=1 vp pack --watch",
16
- "start": "oyo env server -- node dist/nodeMain.mjs",
17
- "build": "vp pack",
13
+ "dev": "pnpm dev:node",
14
+ "build": "pnpm build:node",
15
+ "dev:node-chain": "turbo watch dev:node --filter=@repo/server",
16
+ "dev:node": "concurrently -k -n dev,pack -c blue,green \"vp dev\" \"VITE_PUBLIC_DEV_SERVE=1 vp pack --watch\"",
17
+ "dev:cloudflare-chain": "turbo watch dev:cloudflare --filter=@repo/server",
18
+ "dev:cloudflare": "wrangler dev --config wrangler.jsonc --persist-to ../../.wrangler/state",
19
+ "db:migrate:cloudflare:local": "wrangler d1 migrations apply DB --local --config wrangler.jsonc --persist-to ../../.wrangler/state",
20
+ "build:node-chain": "turbo build:node --filter=@repo/server",
21
+ "build:node": "vp pack",
22
+ "cf:typegen": "wrangler types --config wrangler.jsonc",
23
+ "cf:typecheck": "wrangler types --config wrangler.jsonc --check",
18
24
  "test": "vp test",
19
25
  "check": "vp check",
20
26
  "docker:build": "bash ../../scripts/build-docker-server.sh"
@@ -23,11 +29,13 @@
23
29
  "@hono/node-server": "catalog:server",
24
30
  "@hono/standard-validator": "catalog:server",
25
31
  "@hono/swagger-ui": "catalog:server",
32
+ "@repo/db": "workspace:*",
26
33
  "@repo/definition": "workspace:*",
27
34
  "@valibot/to-json-schema": "catalog:server",
28
35
  "change-case": "catalog:shared",
29
36
  "defu": "catalog:shared",
30
37
  "dotenv": "catalog:",
38
+ "drizzle-orm": "catalog:db",
31
39
  "hono": "catalog:server",
32
40
  "hono-openapi": "catalog:server",
33
41
  "hono-pino": "catalog:server",
@@ -50,6 +58,7 @@
50
58
  "pino-pretty": "catalog:server",
51
59
  "tsx": "catalog:",
52
60
  "typescript": "catalog:",
53
- "vite-plus": "catalog:"
61
+ "vite-plus": "catalog:",
62
+ "wrangler": "catalog:"
54
63
  }
55
64
  }