@pikku/cli 0.12.29 → 0.12.30
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/console-app/assets/{index-ClGe-ul_.js → index-BkiCv5R3.js} +1 -1
- package/console-app/index.html +1 -1
- package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-channel.js +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
- package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.json +93 -93
- package/dist/.pikku/function/pikku-functions.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
- package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/pikku-services.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +5 -5
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +3 -3
- package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/bin/pikku-bin.mjs +2 -2
- package/dist/src/functions/commands/dev.js +1 -9
- package/dist/src/functions/db/db-codegen.d.ts +1 -0
- package/dist/src/functions/db/db-codegen.js +45 -0
- package/dist/src/functions/db/db-introspector.d.ts +12 -0
- package/dist/src/functions/db/local-db.d.ts +1 -0
- package/dist/src/functions/db/local-db.js +3 -0
- package/dist/src/functions/db/postgres/postgres-introspector.d.ts +3 -1
- package/dist/src/functions/db/postgres/postgres-introspector.js +43 -0
- package/dist/src/functions/db/sqlite/sqlite-introspector.d.ts +3 -1
- package/dist/src/functions/db/sqlite/sqlite-introspector.js +14 -0
- package/dist/src/functions/db/sqlite/sqlite-runtime-node.js +16 -3
- package/dist/src/functions/wirings/auth/serialize-auth-gen.js +4 -2
- package/dist/src/scaffold/rpc-remote.gen.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* This file was generated by @pikku/cli@0.12.
|
|
2
|
+
* This file was generated by @pikku/cli@0.12.30
|
|
3
3
|
*/
|
|
4
4
|
export { wireVariable } from '@pikku/core/variable';
|
|
5
5
|
export type { CoreVariable, VariableDefinitionMeta, VariableDefinitionsMeta } from '@pikku/core/variable';
|
package/dist/bin/pikku-bin.mjs
CHANGED
|
@@ -11,8 +11,8 @@ async function checkForUpdate() {
|
|
|
11
11
|
})
|
|
12
12
|
if (!res.ok) return
|
|
13
13
|
const { version: latest } = await res.json()
|
|
14
|
-
if (latest !== '0.12.
|
|
15
|
-
process.stderr.write(`\n Update available 0.12.
|
|
14
|
+
if (latest !== '0.12.30') {
|
|
15
|
+
process.stderr.write(`\n Update available 0.12.30 → ${latest}\n brew upgrade pikku or npm install -g @pikku/cli\n\n`)
|
|
16
16
|
}
|
|
17
17
|
} catch {}
|
|
18
18
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { existsSync } from 'fs';
|
|
2
1
|
import { join, resolve } from 'path';
|
|
3
2
|
import { pikkuSessionlessFunc } from '#pikku';
|
|
4
3
|
import chokidar from 'chokidar';
|
|
@@ -40,8 +39,6 @@ export const dev = pikkuSessionlessFunc({
|
|
|
40
39
|
const commandWorkflowRegistrations = new Map(pikkuState(null, 'workflows', 'registrations'));
|
|
41
40
|
const workflowService = new InMemoryWorkflowService();
|
|
42
41
|
const pikkuDir = resolve(config.rootDir, config.outDir);
|
|
43
|
-
const bootstrapExists = existsSync(resolve(pikkuDir, 'pikku-bootstrap.gen.ts')) ||
|
|
44
|
-
existsSync(resolve(pikkuDir, 'pikku-bootstrap.gen.js'));
|
|
45
42
|
const runAll = async () => {
|
|
46
43
|
await workflowService.runToCompletion('allWorkflow', {}, rpc);
|
|
47
44
|
};
|
|
@@ -97,9 +94,6 @@ export const dev = pikkuSessionlessFunc({
|
|
|
97
94
|
pikkuState(null, 'workflows', 'registrations', previousWorkflowRegistrations);
|
|
98
95
|
}
|
|
99
96
|
};
|
|
100
|
-
if (bootstrapExists) {
|
|
101
|
-
await loadUserBootstrap(pikkuDir);
|
|
102
|
-
}
|
|
103
97
|
await runAllWithCommandState();
|
|
104
98
|
const inspectorState = await getInspectorState(true);
|
|
105
99
|
const { pikkuConfigFactory, singletonServicesFactory } = inspectorState.filesAndMethods;
|
|
@@ -107,9 +101,7 @@ export const dev = pikkuSessionlessFunc({
|
|
|
107
101
|
logger.error('createConfig and createSingletonServices must be defined in your project');
|
|
108
102
|
return;
|
|
109
103
|
}
|
|
110
|
-
|
|
111
|
-
await loadUserBootstrap(pikkuDir);
|
|
112
|
-
}
|
|
104
|
+
await loadUserBootstrap(pikkuDir);
|
|
113
105
|
workflowService.rewireQueueWorkers();
|
|
114
106
|
const configModule = await loadUserModule(pikkuConfigFactory.file);
|
|
115
107
|
const servicesModule = await loadUserModule(singletonServicesFactory.file);
|
|
@@ -308,11 +308,43 @@ export async function generateSchemaTypes(introspector, options) {
|
|
|
308
308
|
const classificationMapBody = options.classificationMapFile
|
|
309
309
|
? emitClassificationMap(tables)
|
|
310
310
|
: null;
|
|
311
|
+
// ── pikku-db-schema.gen.json ─────────────────────────────────────────────────
|
|
312
|
+
let schemaJsonBody = null;
|
|
313
|
+
if (options.schemaJsonFile) {
|
|
314
|
+
const [fkResults, enums] = await Promise.all([
|
|
315
|
+
Promise.all(tableNames.map((name) => introspector.getForeignKeys(name))),
|
|
316
|
+
introspector.listEnums(),
|
|
317
|
+
]);
|
|
318
|
+
const fkMap = new Map(tableNames.map((name, i) => [name, fkResults[i]]));
|
|
319
|
+
const jsonTables = tables.map((t) => ({
|
|
320
|
+
name: t.name,
|
|
321
|
+
columns: t.columns.map((c) => {
|
|
322
|
+
const fk = fkMap.get(t.name)?.find((f) => f.column === c.name);
|
|
323
|
+
return {
|
|
324
|
+
name: c.name,
|
|
325
|
+
type: c.type,
|
|
326
|
+
nullable: !c.notNull && !c.pk,
|
|
327
|
+
isPrimaryKey: c.pk,
|
|
328
|
+
...(fk
|
|
329
|
+
? {
|
|
330
|
+
foreignKey: {
|
|
331
|
+
table: fk.foreignTable,
|
|
332
|
+
column: fk.foreignColumn,
|
|
333
|
+
},
|
|
334
|
+
}
|
|
335
|
+
: {}),
|
|
336
|
+
};
|
|
337
|
+
}),
|
|
338
|
+
}));
|
|
339
|
+
schemaJsonBody =
|
|
340
|
+
JSON.stringify({ tables: jsonTables, enums }, null, 2) + '\n';
|
|
341
|
+
}
|
|
311
342
|
// ── write files ───────────────────────────────────────────────────────────────
|
|
312
343
|
let existingSchema = null;
|
|
313
344
|
let existingCoercion = null;
|
|
314
345
|
let existingManifest = null;
|
|
315
346
|
let existingClassificationMap = null;
|
|
347
|
+
let existingSchemaJson = null;
|
|
316
348
|
try {
|
|
317
349
|
existingSchema = readFileSync(options.outFile, 'utf8');
|
|
318
350
|
}
|
|
@@ -341,11 +373,20 @@ export async function generateSchemaTypes(introspector, options) {
|
|
|
341
373
|
/* ok */
|
|
342
374
|
}
|
|
343
375
|
}
|
|
376
|
+
if (options.schemaJsonFile) {
|
|
377
|
+
try {
|
|
378
|
+
existingSchemaJson = readFileSync(options.schemaJsonFile, 'utf8');
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
/* ok */
|
|
382
|
+
}
|
|
383
|
+
}
|
|
344
384
|
const schemaChanged = existingSchema !== schemaBody;
|
|
345
385
|
const coercionChanged = existingCoercion !== coercionBody;
|
|
346
386
|
const manifestChanged = manifestBody !== null && existingManifest !== manifestBody;
|
|
347
387
|
const classificationMapChanged = classificationMapBody !== null &&
|
|
348
388
|
existingClassificationMap !== classificationMapBody;
|
|
389
|
+
const schemaJsonChanged = schemaJsonBody !== null && existingSchemaJson !== schemaJsonBody;
|
|
349
390
|
if (schemaChanged) {
|
|
350
391
|
mkdirSync(dirname(options.outFile), { recursive: true });
|
|
351
392
|
writeFileSync(options.outFile, schemaBody, 'utf8');
|
|
@@ -364,6 +405,10 @@ export async function generateSchemaTypes(introspector, options) {
|
|
|
364
405
|
mkdirSync(dirname(options.classificationMapFile), { recursive: true });
|
|
365
406
|
writeFileSync(options.classificationMapFile, classificationMapBody, 'utf8');
|
|
366
407
|
}
|
|
408
|
+
if (schemaJsonChanged && options.schemaJsonFile && schemaJsonBody) {
|
|
409
|
+
mkdirSync(dirname(options.schemaJsonFile), { recursive: true });
|
|
410
|
+
writeFileSync(options.schemaJsonFile, schemaJsonBody, 'utf8');
|
|
411
|
+
}
|
|
367
412
|
return {
|
|
368
413
|
outFile: options.outFile,
|
|
369
414
|
coercionFile: options.coercionFile,
|
|
@@ -8,8 +8,20 @@ export interface ColumnInfo {
|
|
|
8
8
|
/** True for virtual or stored generated columns — these are read-only and never inserted. */
|
|
9
9
|
generated?: boolean;
|
|
10
10
|
}
|
|
11
|
+
export interface ForeignKeyInfo {
|
|
12
|
+
column: string;
|
|
13
|
+
foreignTable: string;
|
|
14
|
+
foreignColumn: string;
|
|
15
|
+
}
|
|
16
|
+
export interface EnumInfo {
|
|
17
|
+
name: string;
|
|
18
|
+
schema: string;
|
|
19
|
+
values: string[];
|
|
20
|
+
}
|
|
11
21
|
export interface DbIntrospector {
|
|
12
22
|
listTables(): Promise<string[]>;
|
|
13
23
|
getColumns(table: string): Promise<ColumnInfo[]>;
|
|
24
|
+
getForeignKeys(table: string): Promise<ForeignKeyInfo[]>;
|
|
25
|
+
listEnums(): Promise<EnumInfo[]>;
|
|
14
26
|
close(): Promise<void>;
|
|
15
27
|
}
|
|
@@ -40,6 +40,7 @@ export function resolveDb(userConfig, rootDir, outDir, runtimeDir) {
|
|
|
40
40
|
coercionFile: join(outDir, 'db', 'coercion.gen.ts'),
|
|
41
41
|
manifestFile: join(outDir, 'db', 'classification.gen.ts'),
|
|
42
42
|
classificationMapFile: join(outDir, 'db', 'classification-map.gen.d.ts'),
|
|
43
|
+
schemaJsonFile: join(outDir, 'db', 'pikku-db-schema.gen.json'),
|
|
43
44
|
classificationsFile: join(rootDir, 'db', 'annotations.ts'),
|
|
44
45
|
classificationsGenJsonFile: join(outDir, 'db', 'annotations.gen.json'),
|
|
45
46
|
zodFile: join(outDir, 'db', 'zod.gen.ts'),
|
|
@@ -95,6 +96,7 @@ export async function migrateAndCodegen(resolved) {
|
|
|
95
96
|
coercionFile: resolved.coercionFile,
|
|
96
97
|
manifestFile: resolved.manifestFile,
|
|
97
98
|
classificationMapFile: resolved.classificationMapFile,
|
|
99
|
+
schemaJsonFile: resolved.schemaJsonFile,
|
|
98
100
|
camelCase: resolved.camelCase,
|
|
99
101
|
rootDir: resolved.rootDir,
|
|
100
102
|
migrationsDir: resolved.migrationsDir,
|
|
@@ -120,6 +122,7 @@ export async function migrateAndCodegen(resolved) {
|
|
|
120
122
|
coercionFile: resolved.coercionFile,
|
|
121
123
|
manifestFile: resolved.manifestFile,
|
|
122
124
|
classificationMapFile: resolved.classificationMapFile,
|
|
125
|
+
schemaJsonFile: resolved.schemaJsonFile,
|
|
123
126
|
camelCase: resolved.camelCase,
|
|
124
127
|
rootDir: resolved.rootDir,
|
|
125
128
|
migrationsDir: resolved.migrationsDir,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DbIntrospector, ColumnInfo } from '../db-introspector.js';
|
|
1
|
+
import type { DbIntrospector, ColumnInfo, ForeignKeyInfo, EnumInfo } from '../db-introspector.js';
|
|
2
2
|
interface QueryClient {
|
|
3
3
|
query<T = unknown>(sql: string, params?: unknown[]): Promise<{
|
|
4
4
|
rows: T[];
|
|
@@ -11,6 +11,8 @@ export declare class PostgresIntrospector implements DbIntrospector {
|
|
|
11
11
|
connect(): Promise<void>;
|
|
12
12
|
listTables(): Promise<string[]>;
|
|
13
13
|
getColumns(table: string): Promise<ColumnInfo[]>;
|
|
14
|
+
getForeignKeys(table: string): Promise<ForeignKeyInfo[]>;
|
|
15
|
+
listEnums(): Promise<EnumInfo[]>;
|
|
14
16
|
close(): Promise<void>;
|
|
15
17
|
}
|
|
16
18
|
export {};
|
|
@@ -60,6 +60,49 @@ export class PostgresIntrospector {
|
|
|
60
60
|
generated: r.is_generated === 'ALWAYS',
|
|
61
61
|
}));
|
|
62
62
|
}
|
|
63
|
+
async getForeignKeys(table) {
|
|
64
|
+
const dotIdx = table.indexOf('.');
|
|
65
|
+
const schema = dotIdx >= 0 ? table.slice(0, dotIdx) : 'public';
|
|
66
|
+
const tableName = dotIdx >= 0 ? table.slice(dotIdx + 1) : table;
|
|
67
|
+
const result = await this.client.query(`SELECT kcu.column_name,
|
|
68
|
+
kcu2.table_schema AS foreign_table_schema,
|
|
69
|
+
kcu2.table_name AS foreign_table_name,
|
|
70
|
+
kcu2.column_name AS foreign_column_name
|
|
71
|
+
FROM information_schema.referential_constraints rc
|
|
72
|
+
JOIN information_schema.key_column_usage kcu
|
|
73
|
+
ON kcu.constraint_catalog = rc.constraint_catalog
|
|
74
|
+
AND kcu.constraint_schema = rc.constraint_schema
|
|
75
|
+
AND kcu.constraint_name = rc.constraint_name
|
|
76
|
+
JOIN information_schema.key_column_usage kcu2
|
|
77
|
+
ON kcu2.constraint_catalog = rc.unique_constraint_catalog
|
|
78
|
+
AND kcu2.constraint_schema = rc.unique_constraint_schema
|
|
79
|
+
AND kcu2.constraint_name = rc.unique_constraint_name
|
|
80
|
+
AND kcu2.ordinal_position = kcu.ordinal_position
|
|
81
|
+
WHERE kcu.table_schema = $2 AND kcu.table_name = $1
|
|
82
|
+
ORDER BY kcu.ordinal_position`, [tableName, schema]);
|
|
83
|
+
return result.rows.map((r) => ({
|
|
84
|
+
column: r.column_name,
|
|
85
|
+
foreignTable: r.foreign_table_schema === 'public'
|
|
86
|
+
? r.foreign_table_name
|
|
87
|
+
: `${r.foreign_table_schema}.${r.foreign_table_name}`,
|
|
88
|
+
foreignColumn: r.foreign_column_name,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
async listEnums() {
|
|
92
|
+
const result = await this.client.query(`SELECT t.typname AS enum_name,
|
|
93
|
+
t.typnamespace::regnamespace::text AS schema_name,
|
|
94
|
+
json_agg(e.enumlabel ORDER BY e.enumsortorder) AS values
|
|
95
|
+
FROM pg_type t
|
|
96
|
+
JOIN pg_enum e ON e.enumtypid = t.oid
|
|
97
|
+
WHERE t.typtype = 'e'
|
|
98
|
+
GROUP BY t.typname, t.typnamespace
|
|
99
|
+
ORDER BY schema_name, enum_name`);
|
|
100
|
+
return result.rows.map((r) => ({
|
|
101
|
+
name: r.enum_name,
|
|
102
|
+
schema: r.schema_name,
|
|
103
|
+
values: r.values,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
63
106
|
async close() {
|
|
64
107
|
await this.client.end();
|
|
65
108
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type { DbIntrospector, ColumnInfo } from '../db-introspector.js';
|
|
1
|
+
import type { DbIntrospector, ColumnInfo, ForeignKeyInfo, EnumInfo } from '../db-introspector.js';
|
|
2
2
|
import type { SyncSqliteDatabase } from './sqlite-runtime.js';
|
|
3
3
|
export declare class SqliteIntrospector implements DbIntrospector {
|
|
4
4
|
private readonly db;
|
|
5
5
|
constructor(db: SyncSqliteDatabase);
|
|
6
6
|
listTables(): Promise<string[]>;
|
|
7
7
|
getColumns(table: string): Promise<ColumnInfo[]>;
|
|
8
|
+
getForeignKeys(table: string): Promise<ForeignKeyInfo[]>;
|
|
9
|
+
listEnums(): Promise<EnumInfo[]>;
|
|
8
10
|
close(): Promise<void>;
|
|
9
11
|
}
|
|
@@ -29,6 +29,20 @@ export class SqliteIntrospector {
|
|
|
29
29
|
generated: c.hidden === 2 || c.hidden === 3,
|
|
30
30
|
}));
|
|
31
31
|
}
|
|
32
|
+
async getForeignKeys(table) {
|
|
33
|
+
const escaped = `"${table.replace(/"/g, '""')}"`;
|
|
34
|
+
const rows = this.db
|
|
35
|
+
.prepare(`PRAGMA foreign_key_list(${escaped})`)
|
|
36
|
+
.all();
|
|
37
|
+
return rows.map((r) => ({
|
|
38
|
+
column: r.from,
|
|
39
|
+
foreignTable: r.table,
|
|
40
|
+
foreignColumn: r.to,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
async listEnums() {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
32
46
|
async close() {
|
|
33
47
|
this.db.close();
|
|
34
48
|
}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
class NodeSqliteStatement {
|
|
2
2
|
stmt;
|
|
3
3
|
reader;
|
|
4
|
-
constructor(stmt) {
|
|
4
|
+
constructor(stmt, sql) {
|
|
5
5
|
this.stmt = stmt;
|
|
6
|
-
|
|
6
|
+
// node:sqlite StatementSync does not have a .reader property
|
|
7
|
+
// (that's a better-sqlite3 API). Fall back to SQL inspection when absent.
|
|
8
|
+
if (stmt.reader !== undefined) {
|
|
9
|
+
this.reader = Boolean(stmt.reader);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
const upper = sql.trimStart().toUpperCase();
|
|
13
|
+
this.reader =
|
|
14
|
+
upper.startsWith('SELECT') ||
|
|
15
|
+
upper.startsWith('WITH') ||
|
|
16
|
+
upper.startsWith('PRAGMA') ||
|
|
17
|
+
upper.startsWith('EXPLAIN') ||
|
|
18
|
+
upper.startsWith('VALUES');
|
|
19
|
+
}
|
|
7
20
|
}
|
|
8
21
|
all(...parameters) {
|
|
9
22
|
return this.stmt.all(...parameters);
|
|
@@ -31,7 +44,7 @@ class NodeSqliteDatabase {
|
|
|
31
44
|
this.db.exec(sql);
|
|
32
45
|
}
|
|
33
46
|
prepare(sql) {
|
|
34
|
-
return new NodeSqliteStatement(this.db.prepare(sql));
|
|
47
|
+
return new NodeSqliteStatement(this.db.prepare(sql), sql);
|
|
35
48
|
}
|
|
36
49
|
close() {
|
|
37
50
|
this.db.close();
|
|
@@ -33,18 +33,20 @@ export const serializeAuthGen = (providers) => {
|
|
|
33
33
|
const def = PROVIDER_REGISTRY[name];
|
|
34
34
|
const schemaName = providerSchemaName(name);
|
|
35
35
|
const fieldLines = Object.entries(def.fields).map(([field, zodExpr]) => ` ${field}: ${zodExpr},`);
|
|
36
|
-
lines.push(`const ${schemaName} = z.object({`);
|
|
36
|
+
lines.push(`export const ${schemaName} = z.object({`);
|
|
37
37
|
lines.push(...fieldLines);
|
|
38
38
|
lines.push(`})`);
|
|
39
39
|
lines.push('');
|
|
40
40
|
}
|
|
41
41
|
// wireSecret for AUTH_SECRET
|
|
42
|
+
lines.push(`export const AuthSecretSchema = z.string()`);
|
|
43
|
+
lines.push('');
|
|
42
44
|
lines.push(`wireSecret({`);
|
|
43
45
|
lines.push(` name: 'authSecret',`);
|
|
44
46
|
lines.push(` displayName: 'Auth Secret',`);
|
|
45
47
|
lines.push(` description: 'JWT signing secret for Auth.js sessions',`);
|
|
46
48
|
lines.push(` secretId: 'AUTH_SECRET',`);
|
|
47
|
-
lines.push(` schema:
|
|
49
|
+
lines.push(` schema: AuthSecretSchema,`);
|
|
48
50
|
lines.push(`})`);
|
|
49
51
|
lines.push('');
|
|
50
52
|
// wireSecret for each provider
|