@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.
Files changed (72) hide show
  1. package/console-app/assets/{index-ClGe-ul_.js → index-BkiCv5R3.js} +1 -1
  2. package/console-app/index.html +1 -1
  3. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  4. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
  5. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  6. package/dist/.pikku/cli/pikku-cli-channel.js +1 -1
  7. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  8. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  9. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  10. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  11. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  12. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  13. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  14. package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
  15. package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
  16. package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
  17. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  18. package/dist/.pikku/function/pikku-functions-meta.gen.json +93 -93
  19. package/dist/.pikku/function/pikku-functions.gen.js +1 -1
  20. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  21. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  22. package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
  23. package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
  24. package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
  25. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  26. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  27. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
  28. package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
  29. package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
  30. package/dist/.pikku/pikku-meta-service.gen.js +1 -1
  31. package/dist/.pikku/pikku-services.gen.d.ts +1 -1
  32. package/dist/.pikku/pikku-types.gen.d.ts +1 -1
  33. package/dist/.pikku/pikku-types.gen.js +1 -1
  34. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  35. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  36. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
  37. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  38. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  39. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  40. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +5 -5
  41. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  42. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  43. package/dist/.pikku/schemas/register.gen.js +3 -3
  44. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  45. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  46. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  47. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  48. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  49. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  50. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  51. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  52. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  53. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  54. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  55. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  56. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  57. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  58. package/dist/bin/pikku-bin.mjs +2 -2
  59. package/dist/src/functions/commands/dev.js +1 -9
  60. package/dist/src/functions/db/db-codegen.d.ts +1 -0
  61. package/dist/src/functions/db/db-codegen.js +45 -0
  62. package/dist/src/functions/db/db-introspector.d.ts +12 -0
  63. package/dist/src/functions/db/local-db.d.ts +1 -0
  64. package/dist/src/functions/db/local-db.js +3 -0
  65. package/dist/src/functions/db/postgres/postgres-introspector.d.ts +3 -1
  66. package/dist/src/functions/db/postgres/postgres-introspector.js +43 -0
  67. package/dist/src/functions/db/sqlite/sqlite-introspector.d.ts +3 -1
  68. package/dist/src/functions/db/sqlite/sqlite-introspector.js +14 -0
  69. package/dist/src/functions/db/sqlite/sqlite-runtime-node.js +16 -3
  70. package/dist/src/functions/wirings/auth/serialize-auth-gen.js +4 -2
  71. package/dist/src/scaffold/rpc-remote.gen.js +1 -1
  72. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { TypedSecretService as CoreTypedSecretService } from '@pikku/core/services';
5
5
  const CREDENTIALS_META = {};
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  /**
5
5
  * Trigger-specific type definitions for tree-shaking optimization
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  /**
5
5
  * Trigger-specific type definitions for tree-shaking optimization
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
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';
@@ -1,4 +1,4 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  export { wireVariable } from '@pikku/core/variable';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { TypedVariablesService as CoreTypedVariablesService } from '@pikku/core/services';
5
5
  import type { VariablesService } from '@pikku/core/services';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { TypedVariablesService as CoreTypedVariablesService } from '@pikku/core/services';
5
5
  const VARIABLES_META = {};
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { WorkflowCancelledException } from '@pikku/core/workflow';
5
5
  import { template } from '@pikku/core/workflow';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { WorkflowCancelledException } from '@pikku/core/workflow';
5
5
  import { template } from '@pikku/core/workflow';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { pikkuState } from '@pikku/core/internal';
5
5
  import allWorkflowMeta from './meta/allWorkflow.gen.json' with { type: 'json' };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  import { addWorkflow } from '@pikku/core/workflow';
5
5
  import './pikku-workflow-wirings-meta.gen.js';
@@ -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.29') {
15
- process.stderr.write(`\n Update available 0.12.29 → ${latest}\n brew upgrade pikku or npm install -g @pikku/cli\n\n`)
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
- if (!bootstrapExists) {
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);
@@ -4,6 +4,7 @@ export interface CodegenOptions {
4
4
  coercionFile: string;
5
5
  manifestFile?: string;
6
6
  classificationMapFile?: string;
7
+ schemaJsonFile?: string;
7
8
  camelCase?: boolean;
8
9
  rootDir?: string;
9
10
  migrationsDir?: string;
@@ -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
  }
@@ -11,6 +11,7 @@ interface ResolvedDbBase {
11
11
  coercionFile: string;
12
12
  manifestFile: string;
13
13
  classificationMapFile: string;
14
+ schemaJsonFile: string;
14
15
  classificationsFile: string;
15
16
  classificationsGenJsonFile: string;
16
17
  zodFile: string;
@@ -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
- this.reader = Boolean(stmt.reader);
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: z.string(),`);
49
+ lines.push(` schema: AuthSecretSchema,`);
48
50
  lines.push(`})`);
49
51
  lines.push('');
50
52
  // wireSecret for each provider
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.29
2
+ * This file was generated by @pikku/cli@0.12.30
3
3
  */
4
4
  /**
5
5
  * Auto-generated remote internal RPC queue worker and HTTP endpoint
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pikku/cli",
3
- "version": "0.12.29",
3
+ "version": "0.12.30",
4
4
  "author": "yasser.fadl@gmail.com",
5
5
  "license": "BUSL-1.1",
6
6
  "imports": {