@helloleo/plugins 0.2.14 → 0.2.16
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/dist/index.js +14 -2
- package/dist/templates/tanstack-start-2026-07-30/drizzle/meta/_journal.json +1 -13
- package/dist/templates/tanstack-start-2026-07-30/src/db/schema.ts +25 -9
- package/dist/templates/tanstack-start-2026-07-30/src/lib/storage.ts +24 -23
- package/dist/templates/tanstack-start-2026-07-30/src/routes/api/health.ts +5 -3
- package/package.json +1 -1
- package/src/templates/tanstack-start-2026-07-30/drizzle/meta/_journal.json +1 -13
- package/src/templates/tanstack-start-2026-07-30/src/db/schema.ts +25 -9
- package/src/templates/tanstack-start-2026-07-30/src/lib/storage.ts +24 -23
- package/src/templates/tanstack-start-2026-07-30/src/routes/api/health.ts +5 -3
- package/src/tools/scaffold.ts +3 -2
- package/src/tools/setup-authentication/auth-files.ts +11 -0
- package/dist/templates/tanstack-start-2026-07-30/drizzle/0000_tidy_kang.sql +0 -5
- package/dist/templates/tanstack-start-2026-07-30/drizzle/meta/0000_snapshot.json +0 -50
- package/src/templates/tanstack-start-2026-07-30/drizzle/0000_tidy_kang.sql +0 -5
- package/src/templates/tanstack-start-2026-07-30/drizzle/meta/0000_snapshot.json +0 -50
package/dist/index.js
CHANGED
|
@@ -24955,8 +24955,9 @@ var scaffold = tool({
|
|
|
24955
24955
|
const typeNotes = isStart ? [
|
|
24956
24956
|
"- This is a TanStack Start project. The server entry is src/server.ts. There is no index.html or client entrypoint.",
|
|
24957
24957
|
"- For JSON/CRUD APIs, add server routes under src/routes/api/. Read src/routes/api/health.ts first, add routes as needed.",
|
|
24958
|
-
"- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.
|
|
24959
|
-
"-
|
|
24958
|
+
"- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.",
|
|
24959
|
+
"- Never rename existing tables or columns in schema.ts. Renames cannot be auto-migrated: no migration file is generated, the database keeps the old name, and every query against the new name fails at runtime with a 500. To reshape data, add a new column or table, write to it, and migrate old values in app code (e.g. fall back to the old column on read).",
|
|
24960
|
+
"- Persistence goes through @helloleo/runtime exclusively: database via #/db (see src/db/index.ts), key-value store via #/lib/kv (see src/lib/kv.ts), file storage via #/lib/storage (see src/lib/storage.ts -- uploads/downloads flow through your API routes; presigned URLs are NOT available), env/secrets via env from @helloleo/runtime. Read those files before server-side data work. Never install another DB/storage client, never import from cloudflare:workers, all of it is server-side only."
|
|
24960
24961
|
] : [
|
|
24961
24962
|
"- This is a TanStack Router SPA. The client entry is index.html -> src/main.tsx. There is no server: no API routes, no server functions, no database.",
|
|
24962
24963
|
"- Fetch data from external APIs only. If the app needs its own persistence or server-side code, it should have been scaffolded as tanstack-start."
|
|
@@ -25052,6 +25053,17 @@ function buildAuth() {
|
|
|
25052
25053
|
emailAndPassword: {
|
|
25053
25054
|
enabled: ${hasPassword},
|
|
25054
25055
|
},${socialProvidersBlock}
|
|
25056
|
+
// The preview runs inside an iframe on another site, so the session
|
|
25057
|
+
// cookie lives in a third-party context: it MUST be SameSite=None +
|
|
25058
|
+
// Secure + Partitioned (CHIPS) or Chrome/Safari silently drop it and
|
|
25059
|
+
// login never sticks.
|
|
25060
|
+
advanced: {
|
|
25061
|
+
defaultCookieAttributes: {
|
|
25062
|
+
sameSite: 'none',
|
|
25063
|
+
secure: true,
|
|
25064
|
+
partitioned: true,
|
|
25065
|
+
},
|
|
25066
|
+
},
|
|
25055
25067
|
plugins: [tanstackStartCookies()],
|
|
25056
25068
|
})
|
|
25057
25069
|
}
|
|
@@ -1,18 +1,34 @@
|
|
|
1
|
+
/* oxlint-disable no-unused-vars */
|
|
2
|
+
// ^ keeps the drizzle imports below from being stripped while unused.
|
|
3
|
+
// Remove this disable once your own tables use them.
|
|
4
|
+
// Single source of truth for the database schema. Define tables here — the
|
|
5
|
+
// SQL migration files under drizzle/ are generated and applied automatically
|
|
6
|
+
// (dev on server start, production on publish). Never hand-write SQL or touch
|
|
7
|
+
// drizzle/. Prefer ADDING columns/tables over renaming or deleting existing
|
|
8
|
+
// ones: renames cannot be migrated automatically.
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Important note (do not remove):
|
|
12
|
+
*
|
|
13
|
+
* Never rename existing tables or columns in schema.ts. Renames cannot be
|
|
14
|
+
* auto-migrated: no migration file is generated, the database keeps the old
|
|
15
|
+
* name, and every query against the new name fails at runtime with a 500.
|
|
16
|
+
* To reshape data, add a new column or table, write to it, and migrate old
|
|
17
|
+
* values in app code (e.g. fall back to the old column on read).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
// Example (change before deploying!) :
|
|
22
|
+
|
|
1
23
|
import { sql } from 'drizzle-orm'
|
|
2
24
|
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'
|
|
3
25
|
|
|
4
|
-
|
|
5
|
-
// definition runs on the dev cf-shim (libsql .dev.db, synced via `drizzle-kit
|
|
6
|
-
// push`) and prod D1 (migrations via `wrangler d1 migrations apply`).
|
|
7
|
-
//
|
|
8
|
-
// Add your own tables here, then `bun run db:push` (dev) or `bun run
|
|
9
|
-
// db:generate` + deploy (prod). Do NOT hand-write SQL — this file is the schema.
|
|
10
|
-
export const entries = sqliteTable('entries', {
|
|
26
|
+
export const notes = sqliteTable('notes', {
|
|
11
27
|
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
12
|
-
|
|
28
|
+
title: text('title').notNull(),
|
|
13
29
|
createdAt: integer('created_at')
|
|
14
30
|
.notNull()
|
|
15
31
|
.default(sql`(unixepoch())`),
|
|
16
32
|
})
|
|
17
33
|
|
|
18
|
-
export type
|
|
34
|
+
export type Note = typeof notes.$inferSelect
|
|
@@ -15,30 +15,31 @@ import { storage } from '@helloleo/runtime'
|
|
|
15
15
|
*
|
|
16
16
|
* Rules:
|
|
17
17
|
* - Server-side only (route handlers, loaders, server functions).
|
|
18
|
-
* -
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* - Files flow THROUGH YOUR API ROUTES: upload = POST route reads the body
|
|
19
|
+
* and `storage.put`s it; download = GET route streams `obj.body` back.
|
|
20
|
+
* Do NOT use presignGet/presignPut — presigned URLs are not available.
|
|
21
21
|
* - Key layout is up to the app — namespace with prefixes ('avatars/',
|
|
22
|
-
* 'exports/').
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
22
|
+
* 'exports/'). Store the key in a database row to reference the file.
|
|
23
|
+
*
|
|
24
|
+
* Upload route example (src/routes/api/images/upload.ts):
|
|
25
|
+
*
|
|
26
|
+
* POST: async ({ request }) => {
|
|
27
|
+
* const form = await request.formData()
|
|
28
|
+
* const file = form.get('file') as File
|
|
29
|
+
* const key = `images/${crypto.randomUUID()}-${file.name}`
|
|
30
|
+
* await storage.put(key, file.stream(), { contentType: file.type })
|
|
31
|
+
* return Response.json({ key }, { status: 201 })
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* Download/serve route example (src/routes/api/images/$key.ts):
|
|
35
|
+
*
|
|
36
|
+
* GET: async ({ params }) => {
|
|
37
|
+
* const obj = await storage.get(`images/${params.key}`)
|
|
38
|
+
* if (!obj) return new Response('Not found', { status: 404 })
|
|
39
|
+
* return new Response(obj.body, {
|
|
40
|
+
* headers: { 'content-type': obj.contentType ?? 'application/octet-stream' },
|
|
41
|
+
* })
|
|
42
|
+
* }
|
|
29
43
|
*/
|
|
30
|
-
export function getUploadUrl(
|
|
31
|
-
key: string,
|
|
32
|
-
opts?: { ttlSeconds?: number; contentType?: string },
|
|
33
|
-
): Promise<string> {
|
|
34
|
-
return storage.presignPut(key, opts?.ttlSeconds ?? 600, {
|
|
35
|
-
contentType: opts?.contentType,
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Presign a download — short-lived direct GET URL for the browser. */
|
|
40
|
-
export function getDownloadUrl(key: string, ttlSeconds = 600): Promise<string> {
|
|
41
|
-
return storage.presignGet(key, ttlSeconds)
|
|
42
|
-
}
|
|
43
44
|
|
|
44
45
|
export { storage }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import { sql } from 'drizzle-orm'
|
|
2
3
|
import { db } from '#/db'
|
|
3
|
-
import { entries } from '#/db/schema'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Server route example: GET /api/health. Use this file as the base for
|
|
@@ -39,7 +39,9 @@ export const Route = createFileRoute('/api/health')({
|
|
|
39
39
|
runtime: 'cloudflare-workers',
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// Database health:
|
|
42
|
+
// Database health: schema-agnostic connectivity ping. Deliberately
|
|
43
|
+
// NOT a query against an app table — the health probe must keep
|
|
44
|
+
// working no matter how src/db/schema.ts evolves.
|
|
43
45
|
let database: {
|
|
44
46
|
status: 'ok' | 'error'
|
|
45
47
|
latencyMs: number
|
|
@@ -47,7 +49,7 @@ export const Route = createFileRoute('/api/health')({
|
|
|
47
49
|
}
|
|
48
50
|
const dbStart = Date.now()
|
|
49
51
|
try {
|
|
50
|
-
await db.
|
|
52
|
+
await db.run(sql`SELECT 1`)
|
|
51
53
|
database = {
|
|
52
54
|
status: 'ok',
|
|
53
55
|
latencyMs: Date.now() - dbStart,
|
package/package.json
CHANGED
|
@@ -1,18 +1,34 @@
|
|
|
1
|
+
/* oxlint-disable no-unused-vars */
|
|
2
|
+
// ^ keeps the drizzle imports below from being stripped while unused.
|
|
3
|
+
// Remove this disable once your own tables use them.
|
|
4
|
+
// Single source of truth for the database schema. Define tables here — the
|
|
5
|
+
// SQL migration files under drizzle/ are generated and applied automatically
|
|
6
|
+
// (dev on server start, production on publish). Never hand-write SQL or touch
|
|
7
|
+
// drizzle/. Prefer ADDING columns/tables over renaming or deleting existing
|
|
8
|
+
// ones: renames cannot be migrated automatically.
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Important note (do not remove):
|
|
12
|
+
*
|
|
13
|
+
* Never rename existing tables or columns in schema.ts. Renames cannot be
|
|
14
|
+
* auto-migrated: no migration file is generated, the database keeps the old
|
|
15
|
+
* name, and every query against the new name fails at runtime with a 500.
|
|
16
|
+
* To reshape data, add a new column or table, write to it, and migrate old
|
|
17
|
+
* values in app code (e.g. fall back to the old column on read).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
// Example (change before deploying!) :
|
|
22
|
+
|
|
1
23
|
import { sql } from 'drizzle-orm'
|
|
2
24
|
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'
|
|
3
25
|
|
|
4
|
-
|
|
5
|
-
// definition runs on the dev cf-shim (libsql .dev.db, synced via `drizzle-kit
|
|
6
|
-
// push`) and prod D1 (migrations via `wrangler d1 migrations apply`).
|
|
7
|
-
//
|
|
8
|
-
// Add your own tables here, then `bun run db:push` (dev) or `bun run
|
|
9
|
-
// db:generate` + deploy (prod). Do NOT hand-write SQL — this file is the schema.
|
|
10
|
-
export const entries = sqliteTable('entries', {
|
|
26
|
+
export const notes = sqliteTable('notes', {
|
|
11
27
|
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
12
|
-
|
|
28
|
+
title: text('title').notNull(),
|
|
13
29
|
createdAt: integer('created_at')
|
|
14
30
|
.notNull()
|
|
15
31
|
.default(sql`(unixepoch())`),
|
|
16
32
|
})
|
|
17
33
|
|
|
18
|
-
export type
|
|
34
|
+
export type Note = typeof notes.$inferSelect
|
|
@@ -15,30 +15,31 @@ import { storage } from '@helloleo/runtime'
|
|
|
15
15
|
*
|
|
16
16
|
* Rules:
|
|
17
17
|
* - Server-side only (route handlers, loaders, server functions).
|
|
18
|
-
* -
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* - Files flow THROUGH YOUR API ROUTES: upload = POST route reads the body
|
|
19
|
+
* and `storage.put`s it; download = GET route streams `obj.body` back.
|
|
20
|
+
* Do NOT use presignGet/presignPut — presigned URLs are not available.
|
|
21
21
|
* - Key layout is up to the app — namespace with prefixes ('avatars/',
|
|
22
|
-
* 'exports/').
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
22
|
+
* 'exports/'). Store the key in a database row to reference the file.
|
|
23
|
+
*
|
|
24
|
+
* Upload route example (src/routes/api/images/upload.ts):
|
|
25
|
+
*
|
|
26
|
+
* POST: async ({ request }) => {
|
|
27
|
+
* const form = await request.formData()
|
|
28
|
+
* const file = form.get('file') as File
|
|
29
|
+
* const key = `images/${crypto.randomUUID()}-${file.name}`
|
|
30
|
+
* await storage.put(key, file.stream(), { contentType: file.type })
|
|
31
|
+
* return Response.json({ key }, { status: 201 })
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* Download/serve route example (src/routes/api/images/$key.ts):
|
|
35
|
+
*
|
|
36
|
+
* GET: async ({ params }) => {
|
|
37
|
+
* const obj = await storage.get(`images/${params.key}`)
|
|
38
|
+
* if (!obj) return new Response('Not found', { status: 404 })
|
|
39
|
+
* return new Response(obj.body, {
|
|
40
|
+
* headers: { 'content-type': obj.contentType ?? 'application/octet-stream' },
|
|
41
|
+
* })
|
|
42
|
+
* }
|
|
29
43
|
*/
|
|
30
|
-
export function getUploadUrl(
|
|
31
|
-
key: string,
|
|
32
|
-
opts?: { ttlSeconds?: number; contentType?: string },
|
|
33
|
-
): Promise<string> {
|
|
34
|
-
return storage.presignPut(key, opts?.ttlSeconds ?? 600, {
|
|
35
|
-
contentType: opts?.contentType,
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Presign a download — short-lived direct GET URL for the browser. */
|
|
40
|
-
export function getDownloadUrl(key: string, ttlSeconds = 600): Promise<string> {
|
|
41
|
-
return storage.presignGet(key, ttlSeconds)
|
|
42
|
-
}
|
|
43
44
|
|
|
44
45
|
export { storage }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import { sql } from 'drizzle-orm'
|
|
2
3
|
import { db } from '#/db'
|
|
3
|
-
import { entries } from '#/db/schema'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Server route example: GET /api/health. Use this file as the base for
|
|
@@ -39,7 +39,9 @@ export const Route = createFileRoute('/api/health')({
|
|
|
39
39
|
runtime: 'cloudflare-workers',
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// Database health:
|
|
42
|
+
// Database health: schema-agnostic connectivity ping. Deliberately
|
|
43
|
+
// NOT a query against an app table — the health probe must keep
|
|
44
|
+
// working no matter how src/db/schema.ts evolves.
|
|
43
45
|
let database: {
|
|
44
46
|
status: 'ok' | 'error'
|
|
45
47
|
latencyMs: number
|
|
@@ -47,7 +49,7 @@ export const Route = createFileRoute('/api/health')({
|
|
|
47
49
|
}
|
|
48
50
|
const dbStart = Date.now()
|
|
49
51
|
try {
|
|
50
|
-
await db.
|
|
52
|
+
await db.run(sql`SELECT 1`)
|
|
51
53
|
database = {
|
|
52
54
|
status: 'ok',
|
|
53
55
|
latencyMs: Date.now() - dbStart,
|
package/src/tools/scaffold.ts
CHANGED
|
@@ -152,8 +152,9 @@ export const scaffold = tool({
|
|
|
152
152
|
? [
|
|
153
153
|
"- This is a TanStack Start project. The server entry is src/server.ts. There is no index.html or client entrypoint.",
|
|
154
154
|
"- For JSON/CRUD APIs, add server routes under src/routes/api/. Read src/routes/api/health.ts first, add routes as needed.",
|
|
155
|
-
"- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.
|
|
156
|
-
"-
|
|
155
|
+
"- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.",
|
|
156
|
+
"- Never rename existing tables or columns in schema.ts. Renames cannot be auto-migrated: no migration file is generated, the database keeps the old name, and every query against the new name fails at runtime with a 500. To reshape data, add a new column or table, write to it, and migrate old values in app code (e.g. fall back to the old column on read).",
|
|
157
|
+
"- Persistence goes through @helloleo/runtime exclusively: database via #/db (see src/db/index.ts), key-value store via #/lib/kv (see src/lib/kv.ts), file storage via #/lib/storage (see src/lib/storage.ts -- uploads/downloads flow through your API routes; presigned URLs are NOT available), env/secrets via env from @helloleo/runtime. Read those files before server-side data work. Never install another DB/storage client, never import from cloudflare:workers, all of it is server-side only.",
|
|
157
158
|
]
|
|
158
159
|
: [
|
|
159
160
|
"- This is a TanStack Router SPA. The client entry is index.html -> src/main.tsx. There is no server: no API routes, no server functions, no database.",
|
|
@@ -78,6 +78,17 @@ function buildAuth() {
|
|
|
78
78
|
emailAndPassword: {
|
|
79
79
|
enabled: ${hasPassword},
|
|
80
80
|
},${socialProvidersBlock}
|
|
81
|
+
// The preview runs inside an iframe on another site, so the session
|
|
82
|
+
// cookie lives in a third-party context: it MUST be SameSite=None +
|
|
83
|
+
// Secure + Partitioned (CHIPS) or Chrome/Safari silently drop it and
|
|
84
|
+
// login never sticks.
|
|
85
|
+
advanced: {
|
|
86
|
+
defaultCookieAttributes: {
|
|
87
|
+
sameSite: 'none',
|
|
88
|
+
secure: true,
|
|
89
|
+
partitioned: true,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
81
92
|
plugins: [tanstackStartCookies()],
|
|
82
93
|
})
|
|
83
94
|
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "6",
|
|
3
|
-
"dialect": "sqlite",
|
|
4
|
-
"id": "ec5ce3c5-da3c-496c-942e-72a9a9579093",
|
|
5
|
-
"prevId": "00000000-0000-0000-0000-000000000000",
|
|
6
|
-
"tables": {
|
|
7
|
-
"entries": {
|
|
8
|
-
"name": "entries",
|
|
9
|
-
"columns": {
|
|
10
|
-
"id": {
|
|
11
|
-
"name": "id",
|
|
12
|
-
"type": "integer",
|
|
13
|
-
"primaryKey": true,
|
|
14
|
-
"notNull": true,
|
|
15
|
-
"autoincrement": true
|
|
16
|
-
},
|
|
17
|
-
"label": {
|
|
18
|
-
"name": "label",
|
|
19
|
-
"type": "text",
|
|
20
|
-
"primaryKey": false,
|
|
21
|
-
"notNull": true,
|
|
22
|
-
"autoincrement": false
|
|
23
|
-
},
|
|
24
|
-
"created_at": {
|
|
25
|
-
"name": "created_at",
|
|
26
|
-
"type": "integer",
|
|
27
|
-
"primaryKey": false,
|
|
28
|
-
"notNull": true,
|
|
29
|
-
"autoincrement": false,
|
|
30
|
-
"default": "(unixepoch())"
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"indexes": {},
|
|
34
|
-
"foreignKeys": {},
|
|
35
|
-
"compositePrimaryKeys": {},
|
|
36
|
-
"uniqueConstraints": {},
|
|
37
|
-
"checkConstraints": {}
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
"views": {},
|
|
41
|
-
"enums": {},
|
|
42
|
-
"_meta": {
|
|
43
|
-
"schemas": {},
|
|
44
|
-
"tables": {},
|
|
45
|
-
"columns": {}
|
|
46
|
-
},
|
|
47
|
-
"internal": {
|
|
48
|
-
"indexes": {}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "6",
|
|
3
|
-
"dialect": "sqlite",
|
|
4
|
-
"id": "ec5ce3c5-da3c-496c-942e-72a9a9579093",
|
|
5
|
-
"prevId": "00000000-0000-0000-0000-000000000000",
|
|
6
|
-
"tables": {
|
|
7
|
-
"entries": {
|
|
8
|
-
"name": "entries",
|
|
9
|
-
"columns": {
|
|
10
|
-
"id": {
|
|
11
|
-
"name": "id",
|
|
12
|
-
"type": "integer",
|
|
13
|
-
"primaryKey": true,
|
|
14
|
-
"notNull": true,
|
|
15
|
-
"autoincrement": true
|
|
16
|
-
},
|
|
17
|
-
"label": {
|
|
18
|
-
"name": "label",
|
|
19
|
-
"type": "text",
|
|
20
|
-
"primaryKey": false,
|
|
21
|
-
"notNull": true,
|
|
22
|
-
"autoincrement": false
|
|
23
|
-
},
|
|
24
|
-
"created_at": {
|
|
25
|
-
"name": "created_at",
|
|
26
|
-
"type": "integer",
|
|
27
|
-
"primaryKey": false,
|
|
28
|
-
"notNull": true,
|
|
29
|
-
"autoincrement": false,
|
|
30
|
-
"default": "(unixepoch())"
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"indexes": {},
|
|
34
|
-
"foreignKeys": {},
|
|
35
|
-
"compositePrimaryKeys": {},
|
|
36
|
-
"uniqueConstraints": {},
|
|
37
|
-
"checkConstraints": {}
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
"views": {},
|
|
41
|
-
"enums": {},
|
|
42
|
-
"_meta": {
|
|
43
|
-
"schemas": {},
|
|
44
|
-
"tables": {},
|
|
45
|
-
"columns": {}
|
|
46
|
-
},
|
|
47
|
-
"internal": {
|
|
48
|
-
"indexes": {}
|
|
49
|
-
}
|
|
50
|
-
}
|