@pasosdejesus/m 0.26.0 → 0.27.1

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 (58) hide show
  1. package/dist/CHANGELOG.md +35 -0
  2. package/dist/base-model/forward/baseline_1_0_0.d.ts +3 -0
  3. package/dist/base-model/forward/baseline_1_0_0.d.ts.map +1 -0
  4. package/dist/base-model/forward/baseline_1_0_0.js +23 -0
  5. package/dist/base-model/forward/baseline_1_0_0.js.map +1 -0
  6. package/dist/base-model/forward/index.d.ts +28 -0
  7. package/dist/base-model/forward/index.d.ts.map +1 -0
  8. package/dist/base-model/forward/index.js +126 -0
  9. package/dist/base-model/forward/index.js.map +1 -0
  10. package/dist/base-model/forward/index.test.d.ts +2 -0
  11. package/dist/base-model/forward/index.test.d.ts.map +1 -0
  12. package/dist/base-model/forward/index.test.js +65 -0
  13. package/dist/base-model/forward/index.test.js.map +1 -0
  14. package/dist/base-model/forward/policy.d.ts +16 -0
  15. package/dist/base-model/forward/policy.d.ts.map +1 -0
  16. package/dist/base-model/forward/policy.js +37 -0
  17. package/dist/base-model/forward/policy.js.map +1 -0
  18. package/dist/base-model/forward/policy.test.d.ts +2 -0
  19. package/dist/base-model/forward/policy.test.d.ts.map +1 -0
  20. package/dist/base-model/forward/policy.test.js +40 -0
  21. package/dist/base-model/forward/policy.test.js.map +1 -0
  22. package/dist/base-model/forward/types.d.ts +21 -0
  23. package/dist/base-model/forward/types.d.ts.map +1 -0
  24. package/dist/base-model/forward/types.js +2 -0
  25. package/dist/base-model/forward/types.js.map +1 -0
  26. package/dist/base-model/index.d.ts +2 -0
  27. package/dist/base-model/index.d.ts.map +1 -1
  28. package/dist/base-model/index.js +3 -0
  29. package/dist/base-model/index.js.map +1 -1
  30. package/dist/e2e/siwe-optional.test.d.ts +2 -0
  31. package/dist/e2e/siwe-optional.test.d.ts.map +1 -0
  32. package/dist/e2e/siwe-optional.test.js +13 -0
  33. package/dist/e2e/siwe-optional.test.js.map +1 -0
  34. package/dist/e2e/siwe.d.ts.map +1 -1
  35. package/dist/e2e/siwe.js +1 -3
  36. package/dist/e2e/siwe.js.map +1 -1
  37. package/dist/i18n/locales/cli.d.ts.map +1 -1
  38. package/dist/i18n/locales/cli.js +2 -0
  39. package/dist/i18n/locales/cli.js.map +1 -1
  40. package/dist/m.js +3 -2
  41. package/dist/m.js.map +1 -1
  42. package/dist/tasks/base-model.d.ts +1 -0
  43. package/dist/tasks/base-model.d.ts.map +1 -1
  44. package/dist/tasks/base-model.js +54 -4
  45. package/dist/tasks/base-model.js.map +1 -1
  46. package/dist/test-utils/console.d.ts.map +1 -1
  47. package/dist/test-utils/console.js +14 -1
  48. package/dist/test-utils/console.js.map +1 -1
  49. package/dist/test-utils/console.test.js +13 -0
  50. package/dist/test-utils/console.test.js.map +1 -1
  51. package/dist/test-utils/kysely-mocks.d.ts +110 -94
  52. package/dist/test-utils/kysely-mocks.d.ts.map +1 -1
  53. package/dist/test-utils/kysely-mocks.js +19 -1
  54. package/dist/test-utils/kysely-mocks.js.map +1 -1
  55. package/dist/test-utils/kysely-mocks.test.js +32 -0
  56. package/dist/test-utils/kysely-mocks.test.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/test-utils/README.md +3 -1
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,41 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.27.1] - 2026-10-09
6
+
7
+ ### Fixed
8
+
9
+ - **`test-utils/kysely-mocks`**: el callback de `eb('col', 'in', cb)` (y `eb.exists(cb)`) ahora recibe
10
+ un builder con `selectFrom`/`selectNoFrom`/`insertInto`/`updateTable`/`deleteFrom`, como el `eb`
11
+ real de Kysely, para armar **subconsultas** (`eb2.selectFrom('t as a').select('a.id')…`). Antes
12
+ lanzaba `TypeError: eb2.selectFrom is not a function` (reportado por sivel3).
13
+
14
+ ## [0.27.0] - 2026-10-09
15
+
16
+ ### Added
17
+
18
+ - **`base-model:setup [--out db/migrations] [--check]` y pasos versionados del modelo base
19
+ (`m/REQ/46` D11).** El modelo base publica sus cambios como fuente en `base-model/forward/`
20
+ (`BASE_MODEL_MIGRATIONS`, con `upSql`/`downSql`); el comando escribe como migración Kysely del
21
+ consumidor los pasos que le faltan —el primero es el baseline 1.0.0, así que un proyecto nuevo ya
22
+ no escribe esa migración a mano— y `--check` sale con código distinto de cero en CI si está
23
+ atrasado. Aplicar sigue siendo del consumidor (`bin/m db:migrate`); `m` no abre conexión.
24
+ - **Guard de D12 en `base-model:verify` (`m/REQ/46` D12).** `checkMigrationPolicy` falla cuando un
25
+ paso del modelo base trae un cambio restrictivo (drop/rename/set not null…, heurístico sobre el
26
+ SQL, ignorando comentarios) sin subir de major o sin `downSql`.
27
+
28
+ ### Fixed
29
+
30
+ - **`test-utils/silenceConsole`** ya no revienta con un argumento que no se puede convertir a
31
+ primitivo (p. ej. un namespace de módulo): la conversión va protegida y el argumento simplemente
32
+ no coincide con ningún patrón (reportado por learn.tg).
33
+ - **`test-utils/kysely-mocks`**: el tag `sql` vuelve a delegar en `mockSqlExecute` (el patrón de
34
+ `0.25.0`), para que quien controla el SQL con ese mock reciba sus filas; `MockSqlTag` y
35
+ `MockExpressionBuilder` ahora extienden el `Mock` de vitest (sin casts `as any`). Reportado por
36
+ learn.tg.
37
+ - **`@pasosdejesus/m/e2e`**: `siwe` se importa **dinámicamente**, así que importar el barrel no
38
+ obliga a instalarlo (peer opcional; lo necesitaba sivel3, que firma EIP-191 y no usa SIWE).
39
+
5
40
  ## [0.26.0] - 2026-10-09
6
41
 
7
42
  ### Added
@@ -0,0 +1,3 @@
1
+ import type { BaseModelMigration } from './types.js';
2
+ export declare const BASELINE_1_0_0: BaseModelMigration;
3
+ //# sourceMappingURL=baseline_1_0_0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline_1_0_0.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/baseline_1_0_0.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOrD,eAAO,MAAM,cAAc,EAAE,kBAO5B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Paso 0.0.0 → 1.0.0: el baseline del modelo base.
3
+ *
4
+ * Es el primer paso que recibe un proyecto nuevo: en vez de que el consumidor
5
+ * escriba a mano la migración del baseline (lo que los tutoriales tenían que
6
+ * explicar), `base-model:setup` la genera. `down` revierte el esquema base a
7
+ * vacío (drop de las tablas y la secuencia).
8
+ */
9
+ import { BASELINE_SQL } from '../baseline.generated.js';
10
+ import { BASE_MODEL_TABLES } from '../version.js';
11
+ const DOWN_SQL = [
12
+ ...[...BASE_MODEL_TABLES].reverse().map((table) => `DROP TABLE IF EXISTS public.${table} CASCADE;`),
13
+ 'DROP SEQUENCE IF EXISTS public.usuario_id_seq;',
14
+ ].join('\n');
15
+ export const BASELINE_1_0_0 = {
16
+ from: '0.0.0',
17
+ to: '1.0.0',
18
+ slug: 'baseline',
19
+ description: `Base model 1.0.0 baseline: ${BASE_MODEL_TABLES.join(', ')}`,
20
+ upSql: BASELINE_SQL,
21
+ downSql: DOWN_SQL,
22
+ };
23
+ //# sourceMappingURL=baseline_1_0_0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline_1_0_0.js","sourceRoot":"","sources":["../../../src/base-model/forward/baseline_1_0_0.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,QAAQ,GAAG;IACf,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,+BAA+B,KAAK,WAAW,CAAC;IACnG,gDAAgD;CACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,IAAI,EAAE,OAAO;IACb,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,8BAA8B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IACzE,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,QAAQ;CAClB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { BaseModelMigration } from './types.js';
2
+ export type { BaseModelMigration } from './types.js';
3
+ export { BASELINE_1_0_0 } from './baseline_1_0_0.js';
4
+ export { checkMigrationPolicy } from './policy.js';
5
+ export type { MigrationPolicyViolation } from './policy.js';
6
+ /** Pasos del modelo base, en orden. */
7
+ export declare const BASE_MODEL_MIGRATIONS: readonly BaseModelMigration[];
8
+ /** Marcador que identifica el paso en el nombre del archivo generado. */
9
+ export declare function migrationMarker(migration: BaseModelMigration): string;
10
+ export interface SetupPlan {
11
+ missing: BaseModelMigration[];
12
+ present: BaseModelMigration[];
13
+ }
14
+ /**
15
+ * Decide qué pasos faltan a partir de los nombres de archivo ya presentes en
16
+ * `db/migrations/` (un paso está tomado si hay un archivo que lleva su marcador).
17
+ */
18
+ export declare function planSetup(migrations: readonly BaseModelMigration[], existingFiles: readonly string[]): SetupPlan;
19
+ /**
20
+ * Trocea un guion SQL en sentencias (sin `;` final), respetando cadenas con
21
+ * comillas simples, cadenas con *dollar-quoting* (`$$`/`$tag$`) y comentarios
22
+ * de línea (`--`) y de bloque. Postgres por el protocolo extendido no acepta
23
+ * varias sentencias juntas, así que el paso las ejecuta una por una.
24
+ */
25
+ export declare function splitSqlStatements(sql: string): string[];
26
+ /** Contenido de la migración Kysely que el consumidor aplica con `db:migrate`. */
27
+ export declare function renderMigrationFile(migration: BaseModelMigration): string;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,uCAAuC;AACvC,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAAqB,CAAC;AAErF,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,SAAS,kBAAkB,EAAE,EACzC,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,SAAS,CAQX;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDxD;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAuBzE"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Pasos de migración del modelo base (m/REQ/46 D11).
3
+ *
4
+ * `BASE_MODEL_MIGRATIONS` está en orden (el más antiguo primero). Los helpers
5
+ * `migrationMarker`/`planSetup`/`renderMigrationFile`/`splitSqlStatements` son
6
+ * puros y los usa `base-model:setup`.
7
+ */
8
+ import { BASELINE_1_0_0 } from './baseline_1_0_0.js';
9
+ export { BASELINE_1_0_0 } from './baseline_1_0_0.js';
10
+ export { checkMigrationPolicy } from './policy.js';
11
+ /** Pasos del modelo base, en orden. */
12
+ export const BASE_MODEL_MIGRATIONS = [BASELINE_1_0_0];
13
+ /** Marcador que identifica el paso en el nombre del archivo generado. */
14
+ export function migrationMarker(migration) {
15
+ return `base_model_${migration.from}_${migration.to}_${migration.slug}`;
16
+ }
17
+ /**
18
+ * Decide qué pasos faltan a partir de los nombres de archivo ya presentes en
19
+ * `db/migrations/` (un paso está tomado si hay un archivo que lleva su marcador).
20
+ */
21
+ export function planSetup(migrations, existingFiles) {
22
+ const missing = [];
23
+ const present = [];
24
+ for (const migration of migrations) {
25
+ const marker = migrationMarker(migration);
26
+ (existingFiles.some((file) => file.includes(marker)) ? present : missing).push(migration);
27
+ }
28
+ return { missing, present };
29
+ }
30
+ /**
31
+ * Trocea un guion SQL en sentencias (sin `;` final), respetando cadenas con
32
+ * comillas simples, cadenas con *dollar-quoting* (`$$`/`$tag$`) y comentarios
33
+ * de línea (`--`) y de bloque. Postgres por el protocolo extendido no acepta
34
+ * varias sentencias juntas, así que el paso las ejecuta una por una.
35
+ */
36
+ export function splitSqlStatements(sql) {
37
+ const statements = [];
38
+ let current = '';
39
+ let i = 0;
40
+ const n = sql.length;
41
+ while (i < n) {
42
+ const ch = sql[i];
43
+ if (ch === '-' && sql[i + 1] === '-') {
44
+ const end = sql.indexOf('\n', i);
45
+ const stop = end === -1 ? n : end;
46
+ current += sql.slice(i, stop);
47
+ i = stop;
48
+ continue;
49
+ }
50
+ if (ch === '/' && sql[i + 1] === '*') {
51
+ const end = sql.indexOf('*/', i + 2);
52
+ const stop = end === -1 ? n : end + 2;
53
+ current += sql.slice(i, stop);
54
+ i = stop;
55
+ continue;
56
+ }
57
+ if (ch === "'") {
58
+ let j = i + 1;
59
+ while (j < n) {
60
+ if (sql[j] === "'" && sql[j + 1] === "'") {
61
+ j += 2;
62
+ continue;
63
+ }
64
+ if (sql[j] === "'") {
65
+ j += 1;
66
+ break;
67
+ }
68
+ j += 1;
69
+ }
70
+ current += sql.slice(i, j);
71
+ i = j;
72
+ continue;
73
+ }
74
+ if (ch === '$') {
75
+ const match = /^\$[A-Za-z_]*\$/.exec(sql.slice(i));
76
+ if (match) {
77
+ const tag = match[0];
78
+ const end = sql.indexOf(tag, i + tag.length);
79
+ const stop = end === -1 ? n : end + tag.length;
80
+ current += sql.slice(i, stop);
81
+ i = stop;
82
+ continue;
83
+ }
84
+ }
85
+ if (ch === ';') {
86
+ const statement = current.trim();
87
+ if (statement)
88
+ statements.push(statement);
89
+ current = '';
90
+ i += 1;
91
+ continue;
92
+ }
93
+ current += ch;
94
+ i += 1;
95
+ }
96
+ const last = current.trim();
97
+ if (last)
98
+ statements.push(last);
99
+ return statements;
100
+ }
101
+ /** Contenido de la migración Kysely que el consumidor aplica con `db:migrate`. */
102
+ export function renderMigrationFile(migration) {
103
+ const up = splitSqlStatements(migration.upSql);
104
+ const down = splitSqlStatements(migration.downSql);
105
+ return `// Migración del modelo base ${migration.from} → ${migration.to} (${migration.slug}).
106
+ // Generada por \`m base-model:setup\` (m/REQ/46 D11). No editar a mano.
107
+ import { Kysely, sql } from 'kysely';
108
+
109
+ const UP = ${JSON.stringify(up, null, 2)};
110
+
111
+ const DOWN = ${JSON.stringify(down, null, 2)};
112
+
113
+ export async function up(db: Kysely<any>): Promise<void> {
114
+ for (const statement of UP) {
115
+ await sql.raw(statement).execute(db);
116
+ }
117
+ }
118
+
119
+ export async function down(db: Kysely<any>): Promise<void> {
120
+ for (const statement of DOWN) {
121
+ await sql.raw(statement).execute(db);
122
+ }
123
+ }
124
+ `;
125
+ }
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/base-model/forward/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { BASE_MODEL_MIGRATIONS, migrationMarker, planSetup, renderMigrationFile, splitSqlStatements, } from './index.js';
3
+ // m/REQ/46 D11: pasos de migración del modelo base.
4
+ describe('splitSqlStatements (D11)', () => {
5
+ it('splits at top-level semicolons and drops empties', () => {
6
+ expect(splitSqlStatements('SELECT 1;\nSELECT 2;')).toEqual(['SELECT 1', 'SELECT 2']);
7
+ expect(splitSqlStatements('SELECT 1;\n\n')).toEqual(['SELECT 1']);
8
+ expect(splitSqlStatements('')).toEqual([]);
9
+ });
10
+ it('keeps semicolons inside single-quoted strings', () => {
11
+ expect(splitSqlStatements("INSERT INTO t VALUES ('a;b'); SELECT 1;")).toEqual([
12
+ "INSERT INTO t VALUES ('a;b')", 'SELECT 1',
13
+ ]);
14
+ });
15
+ it('handles the doubled single-quote escape', () => {
16
+ expect(splitSqlStatements("SELECT 'it''s; fine';")).toEqual(["SELECT 'it''s; fine'"]);
17
+ });
18
+ it('keeps a dollar-quoted block as one statement', () => {
19
+ const sql = "DO $$ BEGIN RAISE EXCEPTION 'x; y'; END $$;\nSELECT 1;";
20
+ expect(splitSqlStatements(sql)).toEqual(["DO $$ BEGIN RAISE EXCEPTION 'x; y'; END $$", 'SELECT 1']);
21
+ });
22
+ it('ignores semicolons in line comments', () => {
23
+ expect(splitSqlStatements('SELECT 1 -- no; here\n; SELECT 2;')).toEqual(['SELECT 1 -- no; here', 'SELECT 2']);
24
+ });
25
+ });
26
+ describe('migrationMarker / planSetup (D11)', () => {
27
+ it('builds the file marker', () => {
28
+ expect(migrationMarker(BASE_MODEL_MIGRATIONS[0])).toBe('base_model_0.0.0_1.0.0_baseline');
29
+ });
30
+ it('detects a step already present by its file name', () => {
31
+ const plan = planSetup(BASE_MODEL_MIGRATIONS, ['20260101000000_base_model_0.0.0_1.0.0_baseline.ts']);
32
+ expect(plan.present).toHaveLength(1);
33
+ expect(plan.missing).toHaveLength(0);
34
+ });
35
+ it('reports the step as missing when there is no file', () => {
36
+ expect(planSetup(BASE_MODEL_MIGRATIONS, []).missing).toHaveLength(1);
37
+ });
38
+ });
39
+ describe('BASE_MODEL_MIGRATIONS (D11/D12)', () => {
40
+ it('ships the 0.0.0 → 1.0.0 baseline step', () => {
41
+ expect(BASE_MODEL_MIGRATIONS).toHaveLength(1);
42
+ const [step] = BASE_MODEL_MIGRATIONS;
43
+ expect(step.from).toBe('0.0.0');
44
+ expect(step.to).toBe('1.0.0');
45
+ expect(step.upSql).toContain('CREATE TABLE');
46
+ expect(step.downSql).toContain('DROP TABLE');
47
+ });
48
+ it('every step has a non-empty downSql (D12)', () => {
49
+ for (const step of BASE_MODEL_MIGRATIONS) {
50
+ expect(step.downSql.trim().length).toBeGreaterThan(0);
51
+ }
52
+ });
53
+ });
54
+ describe('renderMigrationFile (D11)', () => {
55
+ it('emits a Kysely migration that runs each statement', () => {
56
+ const code = renderMigrationFile(BASE_MODEL_MIGRATIONS[0]);
57
+ expect(code).toContain("import { Kysely, sql } from 'kysely'");
58
+ expect(code).toContain('export async function up(db: Kysely<any>)');
59
+ expect(code).toContain('export async function down(db: Kysely<any>)');
60
+ expect(code).toContain('await sql.raw(statement).execute(db)');
61
+ expect(code).toContain('const UP = [');
62
+ expect(code).toContain('const DOWN = [');
63
+ });
64
+ });
65
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/base-model/forward/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Guard de la política de compatibilidad del modelo base (m/REQ/46 D12).
3
+ *
4
+ * Los cambios **restrictivos** —los que obligan al consumidor a actuar— solo se
5
+ * permiten en un salto de **major**; además todo paso debe traer un `downSql`
6
+ * explícito. La detección es heurística sobre el SQL (los casos inequívocos); un
7
+ * cambio restrictivo que se escape debe seguir declarándose a mano.
8
+ */
9
+ import type { BaseModelMigration } from './types.js';
10
+ export interface MigrationPolicyViolation {
11
+ migration: BaseModelMigration;
12
+ reason: string;
13
+ }
14
+ /** Devuelve las violaciones de D12 (lista vacía si todo está permitido). */
15
+ export declare function checkMigrationPolicy(migrations: readonly BaseModelMigration[]): MigrationPolicyViolation[];
16
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,kBAAkB,EAAE,GACxC,wBAAwB,EAAE,CAkB5B"}
@@ -0,0 +1,37 @@
1
+ /** Patrones que en D12 solo se permiten con un salto de major. */
2
+ const RESTRICTIVE_PATTERNS = [
3
+ { re: /\bDROP\s+TABLE\b/i, label: 'DROP TABLE' },
4
+ { re: /\bDROP\s+COLUMN\b/i, label: 'DROP COLUMN' },
5
+ { re: /\bRENAME\b/i, label: 'RENAME' },
6
+ { re: /\bSET\s+NOT\s+NULL\b/i, label: 'SET NOT NULL' },
7
+ { re: /\bALTER\s+COLUMN\b[^;]*\b(?:TYPE|SET\s+DATA\s+TYPE)\b/i, label: 'ALTER COLUMN … TYPE' },
8
+ { re: /\bDROP\s+CONSTRAINT\b/i, label: 'DROP CONSTRAINT' },
9
+ ];
10
+ function major(version) {
11
+ return Number.parseInt(version.split('.')[0] ?? '0', 10) || 0;
12
+ }
13
+ /** Quita comentarios (`-- …` y de bloque) para no confundirlos con SQL. */
14
+ function stripComments(sql) {
15
+ return sql.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/--[^\n]*/g, ' ');
16
+ }
17
+ /** Devuelve las violaciones de D12 (lista vacía si todo está permitido). */
18
+ export function checkMigrationPolicy(migrations) {
19
+ const violations = [];
20
+ for (const migration of migrations) {
21
+ if (migration.downSql.trim() === '') {
22
+ violations.push({ migration, reason: 'downSql vacío: D12 exige un downSql explícito' });
23
+ }
24
+ const upSql = stripComments(migration.upSql);
25
+ const restrictive = RESTRICTIVE_PATTERNS
26
+ .filter(({ re }) => re.test(upSql))
27
+ .map(({ label }) => label);
28
+ if (restrictive.length > 0 && major(migration.to) <= major(migration.from)) {
29
+ violations.push({
30
+ migration,
31
+ reason: `cambio restrictivo (${restrictive.join(', ')}) sin subir de major: ${migration.from} → ${migration.to}`,
32
+ });
33
+ }
34
+ }
35
+ return violations;
36
+ }
37
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/base-model/forward/policy.ts"],"names":[],"mappings":"AAeA,kEAAkE;AAClE,MAAM,oBAAoB,GAAiD;IACzE,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE;IAChD,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE;IAClD,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;IACtC,EAAE,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,cAAc,EAAE;IACtD,EAAE,EAAE,EAAE,wDAAwD,EAAE,KAAK,EAAE,qBAAqB,EAAE;IAC9F,EAAE,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,iBAAiB,EAAE;CAC3D,CAAC;AAEF,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAClC,UAAyC;IAEzC,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,oBAAoB;aACrC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,UAAU,CAAC,IAAI,CAAC;gBACd,SAAS;gBACT,MAAM,EAAE,uBAAuB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,IAAI,MAAM,SAAS,CAAC,EAAE,EAAE;aACjH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.test.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/policy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { BASE_MODEL_MIGRATIONS, checkMigrationPolicy } from './index.js';
3
+ // m/REQ/46 D12: los cambios restrictivos exigen un salto de major y todo paso un `downSql`.
4
+ const step = (over = {}) => ({
5
+ from: '1.0.0', to: '1.1.0', slug: 'x', description: 'x',
6
+ upSql: 'CREATE TABLE public.x (id integer);', downSql: 'DROP TABLE public.x;',
7
+ ...over,
8
+ });
9
+ describe('checkMigrationPolicy (D12)', () => {
10
+ it('acepta un paso aditivo de un minor', () => {
11
+ expect(checkMigrationPolicy([step()])).toEqual([]);
12
+ });
13
+ it('rechaza un cambio restrictivo sin subir de major', () => {
14
+ const violations = checkMigrationPolicy([step({ upSql: 'DROP TABLE public.x;' })]);
15
+ expect(violations).toHaveLength(1);
16
+ expect(violations[0].reason).toContain('DROP TABLE');
17
+ expect(violations[0].reason).toContain('major');
18
+ });
19
+ it('detecta SET NOT NULL, RENAME y DROP COLUMN sin major', () => {
20
+ expect(checkMigrationPolicy([step({ upSql: 'ALTER TABLE public.x ALTER COLUMN c SET NOT NULL;' })])).toHaveLength(1);
21
+ expect(checkMigrationPolicy([step({ upSql: 'ALTER TABLE public.x RENAME COLUMN a TO b;' })])).toHaveLength(1);
22
+ expect(checkMigrationPolicy([step({ upSql: 'ALTER TABLE public.x DROP COLUMN a;' })])).toHaveLength(1);
23
+ });
24
+ it('permite un cambio restrictivo en un salto de major', () => {
25
+ expect(checkMigrationPolicy([step({ from: '1.1.0', to: '2.0.0', upSql: 'DROP TABLE public.x;' })])).toEqual([]);
26
+ });
27
+ it('exige un downSql no vacío', () => {
28
+ const violations = checkMigrationPolicy([step({ downSql: ' ' })]);
29
+ expect(violations).toHaveLength(1);
30
+ expect(violations[0].reason).toContain('downSql');
31
+ });
32
+ it('ignora los comentarios al buscar cambios restrictivos', () => {
33
+ const upSql = '-- esto RENAME y DROP TABLE no cuentan\nCREATE TABLE public.x (id integer);';
34
+ expect(checkMigrationPolicy([step({ upSql })])).toEqual([]);
35
+ });
36
+ it('el baseline publicado (0.0.0 → 1.0.0) no viola D12', () => {
37
+ expect(checkMigrationPolicy(BASE_MODEL_MIGRATIONS)).toEqual([]);
38
+ });
39
+ });
40
+ //# sourceMappingURL=policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/base-model/forward/policy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGxE,4FAA4F;AAE5F,MAAM,IAAI,GAAG,CAAC,OAAoC,EAAE,EAAsB,EAAE,CAAC,CAAC;IAC5E,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;IACvD,KAAK,EAAE,qCAAqC,EAAE,OAAO,EAAE,sBAAsB;IAC7E,GAAG,IAAI;CACR,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAA;QAClF,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACpH,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7G,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,6EAA6E,CAAA;QAC3F,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Un paso de migración del modelo base (m/REQ/46 D11).
3
+ *
4
+ * El modelo base publica sus cambios como **fuente** en `base-model/forward/`;
5
+ * `base-model:setup` los escribe como migraciones Kysely del consumidor y el
6
+ * consumidor las aplica con `bin/m db:migrate`. `m` nunca abre una conexión.
7
+ */
8
+ export interface BaseModelMigration {
9
+ /** Versión de la que parte (`'0.0.0'` para el baseline inicial). */
10
+ from: string;
11
+ /** Versión a la que llega. */
12
+ to: string;
13
+ /** Slug corto usado en el nombre del archivo generado. */
14
+ slug: string;
15
+ description: string;
16
+ /** SQL de `up` (se ejecuta sentencia por sentencia). */
17
+ upSql: string;
18
+ /** SQL de `down`; debe revertir `upSql` (falla ruidosamente si es irreversible, D12). */
19
+ downSql: string;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/base-model/forward/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/base-model/forward/types.ts"],"names":[],"mappings":""}
@@ -10,6 +10,8 @@ export { LEARN_TG_EXTENSIONS } from './references/learn-tg.js';
10
10
  export { MSIP_ADDITIONS } from './references/msip.js';
11
11
  export { normalizeWallet, getUserByWallet, listWallets, ensureWalletLink, linkWallet, unlinkWallet, upsertUserByWallet, inviteWallet, listInvitations, cancelInvitation, findPendingInvitation, acceptInvitation, WALLET_LINK_DDL, WALLET_LINK_SEQUENCE_DDL, WALLET_INVITE_DDL, WALLET_INVITE_SEQUENCE_DDL, } from './wallet-link.js';
12
12
  export type { WalletLink, WalletInvitation } from './wallet-link.js';
13
+ export { BASE_MODEL_MIGRATIONS, migrationMarker, planSetup, renderMigrationFile, splitSqlStatements, checkMigrationPolicy, } from './forward/index.js';
14
+ export type { BaseModelMigration, SetupPlan, MigrationPolicyViolation } from './forward/index.js';
13
15
  import { BASELINE_INVENTORY, BASELINE_SQL, BASELINE_GENERATED_MANIFEST } from './baseline.generated.js';
14
16
  import type { CheckReport, SqlExecutor } from './types.js';
15
17
  export { BASELINE_INVENTORY, BASELINE_SQL, BASELINE_GENERATED_MANIFEST };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base-model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,GAC5E,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EACtE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EACtD,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAC9E,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EACL,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAC3E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EACjF,qBAAqB,EAAE,gBAAgB,EACvC,eAAe,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,0BAA0B,GACzF,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAExG,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAEzE;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAG1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base-model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,GAC5E,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EACtE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EACtD,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAC9E,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EACL,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAC3E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EACjF,qBAAqB,EAAE,gBAAgB,EACvC,eAAe,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,0BAA0B,GACzF,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,EACL,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAC1F,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGlG,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAExG,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAEzE;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAG1E"}
@@ -10,6 +10,9 @@ export { MSIP_ADDITIONS } from './references/msip.js';
10
10
  // Extensión opcional: requiere la tabla `billetera_usuario`, que NO es del modelo
11
11
  // base (msip-2.2 no la tiene). Ver `wallet-link.ts`.
12
12
  export { normalizeWallet, getUserByWallet, listWallets, ensureWalletLink, linkWallet, unlinkWallet, upsertUserByWallet, inviteWallet, listInvitations, cancelInvitation, findPendingInvitation, acceptInvitation, WALLET_LINK_DDL, WALLET_LINK_SEQUENCE_DDL, WALLET_INVITE_DDL, WALLET_INVITE_SEQUENCE_DDL, } from './wallet-link.js';
13
+ // Migraciones hacia adelante (D11): pasos versionados que `base-model:setup` escribe
14
+ // como migraciones Kysely del consumidor.
15
+ export { BASE_MODEL_MIGRATIONS, migrationMarker, planSetup, renderMigrationFile, splitSqlStatements, checkMigrationPolicy, } from './forward/index.js';
13
16
  import { BASE_MODEL_VERSION } from './version.js';
14
17
  import { BASELINE_INVENTORY, BASELINE_SQL, BASELINE_GENERATED_MANIFEST } from './baseline.generated.js';
15
18
  import { compareInventories, inventoryFromDb } from './check.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base-model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvF,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,GAC5E,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EACtE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EACtD,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAC9E,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,kFAAkF;AAClF,qDAAqD;AACrD,OAAO,EACL,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAC3E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EACjF,qBAAqB,EAAE,gBAAgB,EACvC,eAAe,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,0BAA0B,GACzF,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAqB,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAe;IAClD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACrG,OAAO,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base-model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvF,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,GAC5E,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EACtE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EACtD,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAC9E,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,kFAAkF;AAClF,qDAAqD;AACrD,OAAO,EACL,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAC3E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EACjF,qBAAqB,EAAE,gBAAgB,EACvC,eAAe,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,0BAA0B,GACzF,MAAM,kBAAkB,CAAC;AAE1B,qFAAqF;AACrF,0CAA0C;AAC1C,OAAO,EACL,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAC1F,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAqB,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAe;IAClD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACrG,OAAO,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=siwe-optional.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siwe-optional.test.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe-optional.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ // Reported by sivel3: importing the `@pasosdejesus/m/e2e` barrel must not force
5
+ // installing `siwe` (an optional peer). Guard: `siwe.ts` imports it dynamically.
6
+ describe('siwe is optional in the e2e barrel', () => {
7
+ it('siwe.ts has no static import of siwe', () => {
8
+ const source = readFileSync(fileURLToPath(new URL('./siwe.ts', import.meta.url)), 'utf-8');
9
+ expect(source).not.toMatch(/^\s*import[^\n]*from 'siwe'/m);
10
+ expect(source).toContain("await import('siwe')");
11
+ });
12
+ });
13
+ //# sourceMappingURL=siwe-optional.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siwe-optional.test.js","sourceRoot":"","sources":["../../src/e2e/siwe-optional.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,gFAAgF;AAChF,iFAAiF;AAEjF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"siwe.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEtC,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAcD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAItE;AAMD,wBAAsB,YAAY,CAChC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CA6DlB;AAGD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE"}
1
+ {"version":3,"file":"siwe.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEtC,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAcD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAItE;AAMD,wBAAsB,YAAY,CAChC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CA8DlB;AAGD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE"}
package/dist/e2e/siwe.js CHANGED
@@ -1,6 +1,3 @@
1
- // SIWE simulation for E2E tests — authenticate without a real wallet
2
- // Uses siwe + viem (already devDependencies of m).
3
- import { SiweMessage } from 'siwe';
4
1
  // Check if NextAuth session cookie is present
5
2
  function checkSessionCookie(cookies) {
6
3
  return cookies.some(c => c.name.includes('next-auth.session-token'));
@@ -31,6 +28,7 @@ export async function simulateSIWE(page, params) {
31
28
  throw new Error('Could not get CSRF token (nonce)');
32
29
  // Step 2: Build and sign SIWE message
33
30
  const domain = `${host}${domainPort}`;
31
+ const { SiweMessage } = await import('siwe');
34
32
  const msg = new SiweMessage({
35
33
  domain,
36
34
  address: account.address,
@@ -1 +1 @@
1
- {"version":3,"file":"siwe.js","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"siwe.js","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,cAqM7B,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,cAuM7B,CAAC"}