@pasosdejesus/m 0.26.0 → 0.27.0
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/CHANGELOG.md +26 -0
- package/dist/base-model/forward/baseline_1_0_0.d.ts +3 -0
- package/dist/base-model/forward/baseline_1_0_0.d.ts.map +1 -0
- package/dist/base-model/forward/baseline_1_0_0.js +23 -0
- package/dist/base-model/forward/baseline_1_0_0.js.map +1 -0
- package/dist/base-model/forward/index.d.ts +28 -0
- package/dist/base-model/forward/index.d.ts.map +1 -0
- package/dist/base-model/forward/index.js +126 -0
- package/dist/base-model/forward/index.js.map +1 -0
- package/dist/base-model/forward/index.test.d.ts +2 -0
- package/dist/base-model/forward/index.test.d.ts.map +1 -0
- package/dist/base-model/forward/index.test.js +65 -0
- package/dist/base-model/forward/index.test.js.map +1 -0
- package/dist/base-model/forward/policy.d.ts +16 -0
- package/dist/base-model/forward/policy.d.ts.map +1 -0
- package/dist/base-model/forward/policy.js +37 -0
- package/dist/base-model/forward/policy.js.map +1 -0
- package/dist/base-model/forward/policy.test.d.ts +2 -0
- package/dist/base-model/forward/policy.test.d.ts.map +1 -0
- package/dist/base-model/forward/policy.test.js +40 -0
- package/dist/base-model/forward/policy.test.js.map +1 -0
- package/dist/base-model/forward/types.d.ts +21 -0
- package/dist/base-model/forward/types.d.ts.map +1 -0
- package/dist/base-model/forward/types.js +2 -0
- package/dist/base-model/forward/types.js.map +1 -0
- package/dist/base-model/index.d.ts +2 -0
- package/dist/base-model/index.d.ts.map +1 -1
- package/dist/base-model/index.js +3 -0
- package/dist/base-model/index.js.map +1 -1
- package/dist/e2e/siwe-optional.test.d.ts +2 -0
- package/dist/e2e/siwe-optional.test.d.ts.map +1 -0
- package/dist/e2e/siwe-optional.test.js +13 -0
- package/dist/e2e/siwe-optional.test.js.map +1 -0
- package/dist/e2e/siwe.d.ts.map +1 -1
- package/dist/e2e/siwe.js +1 -3
- package/dist/e2e/siwe.js.map +1 -1
- package/dist/i18n/locales/cli.d.ts.map +1 -1
- package/dist/i18n/locales/cli.js +2 -0
- package/dist/i18n/locales/cli.js.map +1 -1
- package/dist/m.js +3 -2
- package/dist/m.js.map +1 -1
- package/dist/tasks/base-model.d.ts +1 -0
- package/dist/tasks/base-model.d.ts.map +1 -1
- package/dist/tasks/base-model.js +54 -4
- package/dist/tasks/base-model.js.map +1 -1
- package/dist/test-utils/console.d.ts.map +1 -1
- package/dist/test-utils/console.js +14 -1
- package/dist/test-utils/console.js.map +1 -1
- package/dist/test-utils/console.test.js +13 -0
- package/dist/test-utils/console.test.js.map +1 -1
- package/dist/test-utils/kysely-mocks.d.ts +104 -93
- package/dist/test-utils/kysely-mocks.d.ts.map +1 -1
- package/dist/test-utils/kysely-mocks.js +14 -0
- package/dist/test-utils/kysely-mocks.js.map +1 -1
- package/dist/test-utils/kysely-mocks.test.js +16 -0
- package/dist/test-utils/kysely-mocks.test.js.map +1 -1
- package/package.json +1 -1
package/dist/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@pasosdejesus/m` are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.27.0] - 2026-10-09
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **`base-model:setup [--out db/migrations] [--check]` y pasos versionados del modelo base
|
|
10
|
+
(`m/REQ/46` D11).** El modelo base publica sus cambios como fuente en `base-model/forward/`
|
|
11
|
+
(`BASE_MODEL_MIGRATIONS`, con `upSql`/`downSql`); el comando escribe como migración Kysely del
|
|
12
|
+
consumidor los pasos que le faltan —el primero es el baseline 1.0.0, así que un proyecto nuevo ya
|
|
13
|
+
no escribe esa migración a mano— y `--check` sale con código distinto de cero en CI si está
|
|
14
|
+
atrasado. Aplicar sigue siendo del consumidor (`bin/m db:migrate`); `m` no abre conexión.
|
|
15
|
+
- **Guard de D12 en `base-model:verify` (`m/REQ/46` D12).** `checkMigrationPolicy` falla cuando un
|
|
16
|
+
paso del modelo base trae un cambio restrictivo (drop/rename/set not null…, heurístico sobre el
|
|
17
|
+
SQL, ignorando comentarios) sin subir de major o sin `downSql`.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **`test-utils/silenceConsole`** ya no revienta con un argumento que no se puede convertir a
|
|
22
|
+
primitivo (p. ej. un namespace de módulo): la conversión va protegida y el argumento simplemente
|
|
23
|
+
no coincide con ningún patrón (reportado por learn.tg).
|
|
24
|
+
- **`test-utils/kysely-mocks`**: el tag `sql` vuelve a delegar en `mockSqlExecute` (el patrón de
|
|
25
|
+
`0.25.0`), para que quien controla el SQL con ese mock reciba sus filas; `MockSqlTag` y
|
|
26
|
+
`MockExpressionBuilder` ahora extienden el `Mock` de vitest (sin casts `as any`). Reportado por
|
|
27
|
+
learn.tg.
|
|
28
|
+
- **`@pasosdejesus/m/e2e`**: `siwe` se importa **dinámicamente**, así que importar el barrel no
|
|
29
|
+
obliga a instalarlo (peer opcional; lo necesitaba sivel3, que firma EIP-191 y no usa SIWE).
|
|
30
|
+
|
|
5
31
|
## [0.26.0] - 2026-10-09
|
|
6
32
|
|
|
7
33
|
### Added
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/base-model/index.js
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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"}
|
package/dist/e2e/siwe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siwe.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"
|
|
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,
|
package/dist/e2e/siwe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siwe.js","sourceRoot":"","sources":["../../src/e2e/siwe.ts"],"names":[],"mappings":"
|
|
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,
|
|
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"}
|
package/dist/i18n/locales/cli.js
CHANGED
|
@@ -14,6 +14,7 @@ export const cliTranslations = {
|
|
|
14
14
|
'cmd.base_model_baseline_description': 'Prints the published base model baseline (--out <file> to save it)',
|
|
15
15
|
'cmd.base_model_dump_description': 'Generates the base model baseline from a reference database',
|
|
16
16
|
'cmd.base_model_verify_description': 'Checks the shipped baseline against a reference structure',
|
|
17
|
+
'cmd.base_model_setup_description': 'Writes the missing base-model migrations into the consumer (db/migrations); --check fails in CI when behind',
|
|
17
18
|
'cmd.db_console_description': 'Opens a database console',
|
|
18
19
|
'cmd.db_test_connection_description': 'Tests the database connection non-interactively',
|
|
19
20
|
'cmd.db_dump_description': 'Dumps the database (data + schema) to db/backups/',
|
|
@@ -112,6 +113,7 @@ export const cliTranslations = {
|
|
|
112
113
|
'cmd.base_model_baseline_description': 'Imprime el baseline publicado del modelo base (--out <archivo> para guardarlo)',
|
|
113
114
|
'cmd.base_model_dump_description': 'Genera el baseline del modelo base desde una base de referencia',
|
|
114
115
|
'cmd.base_model_verify_description': 'Verifica el baseline publicado contra una estructura de referencia',
|
|
116
|
+
'cmd.base_model_setup_description': 'Escribe en el consumidor las migraciones del modelo base que faltan (db/migrations); --check falla en CI si está atrasado',
|
|
115
117
|
'cmd.db_console_description': 'Abre una consola de base de datos',
|
|
116
118
|
'cmd.db_test_connection_description': 'Prueba la conexión a la base de datos de forma no interactiva',
|
|
117
119
|
'cmd.db_dump_description': 'Respaldar la base de datos (datos + esquema) en db/backups/',
|