@nodefony/drizzle 10.0.0-alpha.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.
- package/LICENSE +544 -0
- package/README.md +162 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js +9 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateMetadata.js +6 -0
- package/dist/index.js +105 -0
- package/dist/nodefony/command/migrateShared.js +247 -0
- package/dist/nodefony/command/orm-generate.js +356 -0
- package/dist/nodefony/command/orm-migrate-baseline.js +208 -0
- package/dist/nodefony/command/orm-migrate-repair.js +114 -0
- package/dist/nodefony/command/orm-migrate-status.js +67 -0
- package/dist/nodefony/command/orm-migrate.js +141 -0
- package/dist/nodefony/command/orm-reset.js +166 -0
- package/dist/nodefony/config/config.js +107 -0
- package/dist/nodefony/config/defineModuleConfig.js +63 -0
- package/dist/nodefony/entity/auditEventEntity.js +93 -0
- package/dist/nodefony/entity/colKit.js +260 -0
- package/dist/nodefony/entity/idempotencyEntity.js +74 -0
- package/dist/nodefony/entity/sessionEntity.js +75 -0
- package/dist/nodefony/entity/tokenEntity.js +198 -0
- package/dist/nodefony/entity/totpSecretEntity.js +98 -0
- package/dist/nodefony/entity/userTable.js +141 -0
- package/dist/nodefony/entity/webAuthnCredentialEntity.js +114 -0
- package/dist/nodefony/entity/webhookEndpointEntity.js +106 -0
- package/dist/nodefony/interfaces/IDrizzleConfig.js +1 -0
- package/dist/nodefony/interfaces/index.js +1 -0
- package/dist/nodefony/migrations-schema/mysql.js +48 -0
- package/dist/nodefony/migrations-schema/postgres.js +48 -0
- package/dist/nodefony/migrations-schema/sqlite.js +48 -0
- package/dist/nodefony/registerStores.js +218 -0
- package/dist/nodefony/service/DrizzleService.js +282 -0
- package/dist/nodefony/src/DrizzleAuditStore.js +203 -0
- package/dist/nodefony/src/DrizzleIdempotencyStore.js +278 -0
- package/dist/nodefony/src/DrizzleTokenStore.js +244 -0
- package/dist/nodefony/src/DrizzleTotpSecretStore.js +151 -0
- package/dist/nodefony/src/DrizzleUserRepository.js +217 -0
- package/dist/nodefony/src/DrizzleWebAuthnCredentialStore.js +159 -0
- package/dist/nodefony/src/DrizzleWebhookStore.js +169 -0
- package/dist/nodefony/src/SessionStorage.js +259 -0
- package/dist/nodefony/src/connectorTarget.js +59 -0
- package/dist/nodefony/src/likeSql.js +50 -0
- package/dist/nodefony/src/migrator/DrizzleMigrator.js +775 -0
- package/dist/nodefony/src/migrator/adopt.js +553 -0
- package/dist/nodefony/src/migrator/appSchema.js +414 -0
- package/dist/nodefony/src/migrator/catalog.js +76 -0
- package/dist/nodefony/src/migrator/destructive.js +213 -0
- package/dist/nodefony/src/migrator/divergence.js +84 -0
- package/dist/nodefony/src/migrator/drivers/index.js +39 -0
- package/dist/nodefony/src/migrator/drivers/mysqlDriver.js +147 -0
- package/dist/nodefony/src/migrator/drivers/postgresDriver.js +151 -0
- package/dist/nodefony/src/migrator/drivers/sqliteDriver.js +121 -0
- package/dist/nodefony/src/migrator/explain.js +565 -0
- package/dist/nodefony/src/migrator/hash.js +47 -0
- package/dist/nodefony/src/migrator/history.js +219 -0
- package/dist/nodefony/src/migrator/index.js +16 -0
- package/dist/nodefony/src/migrator/kit.js +296 -0
- package/dist/nodefony/src/migrator/name.js +68 -0
- package/dist/nodefony/src/migrator/paths.js +88 -0
- package/dist/nodefony/src/migrator/refusals.js +143 -0
- package/dist/nodefony/src/migrator/resolve.js +281 -0
- package/dist/nodefony/src/migrator/schemaDiff.js +86 -0
- package/dist/nodefony/src/migrator/sources.js +419 -0
- package/dist/nodefony/src/migrator/status.js +231 -0
- package/dist/nodefony/src/migrator/types.js +91 -0
- package/dist/nodefony/src/orm-core/DrizzleOrm.js +1154 -0
- package/dist/nodefony/src/orm-core/DrizzleRepository.js +610 -0
- package/dist/nodefony/src/orm-core/DrizzleTransaction.js +106 -0
- package/dist/nodefony/src/orm-core/index.js +4 -0
- package/dist/nodefony/src/queryKit.js +318 -0
- package/dist/nodefony/src/safeTarget.js +55 -0
- package/dist/types/index.d.ts +76 -0
- package/dist/types/nodefony/command/migrateShared.d.ts +137 -0
- package/dist/types/nodefony/command/orm-generate.d.ts +53 -0
- package/dist/types/nodefony/command/orm-migrate-baseline.d.ts +87 -0
- package/dist/types/nodefony/command/orm-migrate-repair.d.ts +66 -0
- package/dist/types/nodefony/command/orm-migrate-status.d.ts +38 -0
- package/dist/types/nodefony/command/orm-migrate.d.ts +65 -0
- package/dist/types/nodefony/command/orm-reset.d.ts +55 -0
- package/dist/types/nodefony/config/config.d.ts +110 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +24 -0
- package/dist/types/nodefony/entity/auditEventEntity.d.ts +56 -0
- package/dist/types/nodefony/entity/colKit.d.ts +130 -0
- package/dist/types/nodefony/entity/idempotencyEntity.d.ts +52 -0
- package/dist/types/nodefony/entity/sessionEntity.d.ts +50 -0
- package/dist/types/nodefony/entity/tokenEntity.d.ts +53 -0
- package/dist/types/nodefony/entity/totpSecretEntity.d.ts +61 -0
- package/dist/types/nodefony/entity/userTable.d.ts +65 -0
- package/dist/types/nodefony/entity/webAuthnCredentialEntity.d.ts +57 -0
- package/dist/types/nodefony/entity/webhookEndpointEntity.d.ts +58 -0
- package/dist/types/nodefony/interfaces/IDrizzleConfig.d.ts +17 -0
- package/dist/types/nodefony/interfaces/index.d.ts +1 -0
- package/dist/types/nodefony/migrations-schema/mysql.d.ts +9 -0
- package/dist/types/nodefony/migrations-schema/postgres.d.ts +9 -0
- package/dist/types/nodefony/migrations-schema/sqlite.d.ts +9 -0
- package/dist/types/nodefony/registerStores.d.ts +52 -0
- package/dist/types/nodefony/service/DrizzleService.d.ts +27 -0
- package/dist/types/nodefony/src/DrizzleAuditStore.d.ts +65 -0
- package/dist/types/nodefony/src/DrizzleIdempotencyStore.d.ts +129 -0
- package/dist/types/nodefony/src/DrizzleTokenStore.d.ts +146 -0
- package/dist/types/nodefony/src/DrizzleTotpSecretStore.d.ts +60 -0
- package/dist/types/nodefony/src/DrizzleUserRepository.d.ts +67 -0
- package/dist/types/nodefony/src/DrizzleWebAuthnCredentialStore.d.ts +62 -0
- package/dist/types/nodefony/src/DrizzleWebhookStore.d.ts +79 -0
- package/dist/types/nodefony/src/SessionStorage.d.ts +72 -0
- package/dist/types/nodefony/src/connectorTarget.d.ts +48 -0
- package/dist/types/nodefony/src/likeSql.d.ts +29 -0
- package/dist/types/nodefony/src/migrator/DrizzleMigrator.d.ts +94 -0
- package/dist/types/nodefony/src/migrator/adopt.d.ts +280 -0
- package/dist/types/nodefony/src/migrator/appSchema.d.ts +223 -0
- package/dist/types/nodefony/src/migrator/catalog.d.ts +100 -0
- package/dist/types/nodefony/src/migrator/destructive.d.ts +123 -0
- package/dist/types/nodefony/src/migrator/divergence.d.ts +61 -0
- package/dist/types/nodefony/src/migrator/drivers/index.d.ts +26 -0
- package/dist/types/nodefony/src/migrator/drivers/mysqlDriver.d.ts +83 -0
- package/dist/types/nodefony/src/migrator/drivers/postgresDriver.d.ts +81 -0
- package/dist/types/nodefony/src/migrator/drivers/sqliteDriver.d.ts +53 -0
- package/dist/types/nodefony/src/migrator/explain.d.ts +424 -0
- package/dist/types/nodefony/src/migrator/hash.d.ts +39 -0
- package/dist/types/nodefony/src/migrator/history.d.ts +139 -0
- package/dist/types/nodefony/src/migrator/index.d.ts +20 -0
- package/dist/types/nodefony/src/migrator/kit.d.ts +141 -0
- package/dist/types/nodefony/src/migrator/name.d.ts +52 -0
- package/dist/types/nodefony/src/migrator/paths.d.ts +54 -0
- package/dist/types/nodefony/src/migrator/refusals.d.ts +170 -0
- package/dist/types/nodefony/src/migrator/resolve.d.ts +201 -0
- package/dist/types/nodefony/src/migrator/schemaDiff.d.ts +112 -0
- package/dist/types/nodefony/src/migrator/sources.d.ts +119 -0
- package/dist/types/nodefony/src/migrator/status.d.ts +132 -0
- package/dist/types/nodefony/src/migrator/types.d.ts +273 -0
- package/dist/types/nodefony/src/orm-core/DrizzleOrm.d.ts +241 -0
- package/dist/types/nodefony/src/orm-core/DrizzleRepository.d.ts +98 -0
- package/dist/types/nodefony/src/orm-core/DrizzleTransaction.d.ts +71 -0
- package/dist/types/nodefony/src/orm-core/index.d.ts +11 -0
- package/dist/types/nodefony/src/queryKit.d.ts +136 -0
- package/dist/types/nodefony/src/safeTarget.d.ts +42 -0
- package/docs/index.md +954 -0
- package/docs/migrations.md +691 -0
- package/migrations/mysql/0000_framework_init.sql +137 -0
- package/migrations/mysql/meta/_journal.json +13 -0
- package/migrations/postgres/0000_framework_init.sql +128 -0
- package/migrations/postgres/meta/_journal.json +13 -0
- package/migrations/sqlite/0000_framework_init.sql +127 -0
- package/migrations/sqlite/meta/_journal.json +13 -0
- package/package.json +126 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { SqlDialect } from "../../config/config.js";
|
|
2
|
+
import { type IAppliedMigration, type IMigrationDriver } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Table d'historique : sa création, son amorçage, et sa lecture.
|
|
5
|
+
*
|
|
6
|
+
* 🔴 **La table qui sert à migrer doit savoir se migrer ELLE-MÊME.** Un
|
|
7
|
+
* `CREATE TABLE IF NOT EXISTS` seul ne fait pas évoluer un schéma, et le jour
|
|
8
|
+
* où une version ultérieure veut une colonne de plus, elle ne peut pas passer
|
|
9
|
+
* par une migration ordinaire : l'applicateur LIT cette table avant d'appliquer
|
|
10
|
+
* quoi que ce soit — il planterait sur une base ancienne avant d'avoir pu se
|
|
11
|
+
* réparer. Œuf et poule.
|
|
12
|
+
*
|
|
13
|
+
* D'où un amorçage interne versionné, HORS du flux des migrations : la table
|
|
14
|
+
* est créée au format d'origine, puis une liste d'`ALTER` ordonnés est
|
|
15
|
+
* appliquée selon ce que l'introspection trouve. **Pas de colonne de version** :
|
|
16
|
+
* la PRÉSENCE des colonnes EST la version — deux mécanismes pour une seule
|
|
17
|
+
* question, ce serait zéro mécanisme.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Étape d'amorçage : une colonne ajoutée après le format d'origine.
|
|
21
|
+
*
|
|
22
|
+
* L'ordre du tableau fait foi et ne se réarrange pas : c'est lui qui garantit
|
|
23
|
+
* qu'une base restée trois versions en arrière rattrape le même état qu'une
|
|
24
|
+
* base neuve.
|
|
25
|
+
*/
|
|
26
|
+
export interface IHistoryStep {
|
|
27
|
+
/** Colonne dont la présence atteste que l'étape est faite. */
|
|
28
|
+
column: string;
|
|
29
|
+
/** DDL à exécuter, par dialecte. */
|
|
30
|
+
ddl: Record<SqlDialect, string>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Étapes d'amorçage postérieures au format d'origine.
|
|
34
|
+
*
|
|
35
|
+
* **Vide dans cette version** — l'étape 0 est le `CREATE` lui-même. Ce tableau
|
|
36
|
+
* est le point d'extension : ajouter une colonne à l'historique, aujourd'hui ou
|
|
37
|
+
* dans cinq versions, se fait ICI et nulle part ailleurs.
|
|
38
|
+
*/
|
|
39
|
+
export declare const HISTORY_STEPS: readonly IHistoryStep[];
|
|
40
|
+
/**
|
|
41
|
+
* Le moteur se plaint-il d'une COLONNE d'historique qu'il ne trouve pas ?
|
|
42
|
+
*
|
|
43
|
+
* Reconnaît la table d'historique d'une AUTRE provenance : la table porte le
|
|
44
|
+
* bon nom, elle n'a pas les bonnes colonnes. `CREATE TABLE IF NOT EXISTS` ne
|
|
45
|
+
* la répare pas — elle existe —, et la première lecture échoue sur un message
|
|
46
|
+
* de moteur brut, que le fourre-tout des pannes habille alors de deux causes
|
|
47
|
+
* FAUSSES : « la base n'a pas répondu » et « les droits manquent ». Mesuré au
|
|
48
|
+
* banc : c'est ce message qui a renvoyé un agent détruire une base de
|
|
49
|
+
* production après qu'il eut pourtant suivi le conseil de travailler sur une
|
|
50
|
+
* copie — copie qu'il avait dû fabriquer à la main, avec un historique inventé.
|
|
51
|
+
*
|
|
52
|
+
* PURE, et une grammaire par moteur : les trois formulent la même panne dans
|
|
53
|
+
* trois langues, et un motif écrit pour l'une est muet pour les deux autres.
|
|
54
|
+
* Bornée aux colonnes que ce fichier déclare : une colonne APPLICATIVE
|
|
55
|
+
* manquante est un tout autre incident, qui a déjà sa voie.
|
|
56
|
+
*
|
|
57
|
+
* @param message - message d'erreur rendu par le pilote.
|
|
58
|
+
* @returns la colonne d'historique introuvable, ou `null`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function missingHistoryColumn(message: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Crée la table d'historique si besoin, puis l'amène au format courant.
|
|
63
|
+
*
|
|
64
|
+
* À appeler **juste après le verrou et AVANT la moindre lecture** : c'est
|
|
65
|
+
* l'ordre qui rend l'évolution de la table possible sans outil de conversion
|
|
66
|
+
* chez l'utilisateur.
|
|
67
|
+
*
|
|
68
|
+
* @param driver - pilote à connexion unique, verrou déjà tenu.
|
|
69
|
+
* @returns les colonnes ajoutées par l'amorçage (vide dans le cas courant).
|
|
70
|
+
*/
|
|
71
|
+
export declare function ensureHistorySchema(driver: IMigrationDriver): Promise<string[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Lit l'historique complet, **colonnes nommées une par une**.
|
|
74
|
+
*
|
|
75
|
+
* Jamais `SELECT *` : c'est ce qui rend l'ajout d'une colonne inoffensif pour
|
|
76
|
+
* un applicateur plus ancien, qui continue de lire exactement ce qu'il connaît.
|
|
77
|
+
*
|
|
78
|
+
* @param driver - pilote à connexion unique.
|
|
79
|
+
* @returns les lignes, dans leur ordre d'insertion.
|
|
80
|
+
*/
|
|
81
|
+
export declare function readHistory(driver: IMigrationDriver): Promise<IAppliedMigration[]>;
|
|
82
|
+
/**
|
|
83
|
+
* `INSERT` d'une ligne d'historique — **jamais positionnel**.
|
|
84
|
+
*
|
|
85
|
+
* @param driver - pilote à connexion unique.
|
|
86
|
+
* @param row - ligne à écrire.
|
|
87
|
+
*/
|
|
88
|
+
export declare function insertHistory(driver: IMigrationDriver, row: IAppliedMigration): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Marque une ligne d'historique terminée (chemin MySQL, DDL non transactionnel).
|
|
91
|
+
*
|
|
92
|
+
* @param driver - pilote à connexion unique.
|
|
93
|
+
* @param row - ligne dont le résultat est connu.
|
|
94
|
+
*/
|
|
95
|
+
export declare function finishHistory(driver: IMigrationDriver, row: IAppliedMigration): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Supprime les marqueurs d'échec d'une source, ou de toutes.
|
|
98
|
+
*
|
|
99
|
+
* @param driver - pilote à connexion unique.
|
|
100
|
+
* @param source - source à réparer ; toutes si omise.
|
|
101
|
+
* @returns les migrations dont le marqueur a été levé.
|
|
102
|
+
*/
|
|
103
|
+
export declare function deleteFailed(driver: IMigrationDriver, source?: string): Promise<{
|
|
104
|
+
source: string;
|
|
105
|
+
tag: string;
|
|
106
|
+
}[]>;
|
|
107
|
+
/**
|
|
108
|
+
* Désinscrit UNE entrée nommée de l'historique, quel que soit son état.
|
|
109
|
+
*
|
|
110
|
+
* ## Pourquoi ce geste existe, alors qu'un interdit dit de ne pas y toucher
|
|
111
|
+
*
|
|
112
|
+
* L'interdit porte sur la modification À LA MAIN, dans un client SQL, sans
|
|
113
|
+
* trace. Il existait pourtant un état dont AUCUNE commande ne sortait : une
|
|
114
|
+
* migration inscrite `success` que personne n'a jamais exécutée — une adoption
|
|
115
|
+
* mal bornée, une base héritée d'une version antérieure aux gardes. Le
|
|
116
|
+
* générateur disait « c'est l'historique qu'il faut reprendre » et renvoyait
|
|
117
|
+
* vers la réparation, qui ne sait lever que des marqueurs d'ÉCHEC : elle
|
|
118
|
+
* répondait « rien à réparer », et l'on revenait au point de départ. Trois
|
|
119
|
+
* messages vrais, aucun geste — et le seul chemin restant était de détruire la
|
|
120
|
+
* base.
|
|
121
|
+
*
|
|
122
|
+
* Le geste est donc rendu au produit, où il laisse une trace et où il est
|
|
123
|
+
* BORNÉ : une entrée précisément nommée, jamais un lot, jamais un motif.
|
|
124
|
+
*
|
|
125
|
+
* ⚠️ Ne touche pas la base : après cet oubli, la migration sera REJOUÉE au
|
|
126
|
+
* prochain passage. Si elle avait réellement été appliquée, ce rejeu échouera
|
|
127
|
+
* — bruyamment, ce qui est le comportement voulu.
|
|
128
|
+
*
|
|
129
|
+
* @param driver - pilote sous verrou.
|
|
130
|
+
* @param entries - entrées à désinscrire, chacune nommée `source` et `tag`.
|
|
131
|
+
* @returns celles qui existaient et ont été retirées.
|
|
132
|
+
*/
|
|
133
|
+
export declare function forgetEntries(driver: IMigrationDriver, entries: readonly {
|
|
134
|
+
source: string;
|
|
135
|
+
tag: string;
|
|
136
|
+
}[]): Promise<{
|
|
137
|
+
source: string;
|
|
138
|
+
tag: string;
|
|
139
|
+
}[]>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applicateur de migrations de schéma du module drizzle.
|
|
3
|
+
*
|
|
4
|
+
* Il **planifie, valide, applique, adopte et répare** — avec sa table
|
|
5
|
+
* d'historique et son verrou natif par dialecte. Les fichiers, eux, sont
|
|
6
|
+
* produits par `npm run generate:migrations` (drizzle-kit) et livrés dans le
|
|
7
|
+
* paquet.
|
|
8
|
+
*/
|
|
9
|
+
export { DrizzleMigrator, DEFAULT_LOCK_TIMEOUT_MS, type IDrizzleMigratorOptions, type IMigrateOptions, } from "./DrizzleMigrator.js";
|
|
10
|
+
export { openMigrationDriver, SqliteMigrationDriver, PostgresMigrationDriver, MysqlMigrationDriver, PG_LOCK_KEY, MYSQL_LOCK_NAME_SQL, MYSQL_LOCK_PREFIX, type IMigrationTarget, } from "./drivers/index.js";
|
|
11
|
+
export { ensureHistorySchema, readHistory, HISTORY_STEPS, type IHistoryStep, } from "./history.js";
|
|
12
|
+
export { migrationHash, normalizeSql } from "./hash.js";
|
|
13
|
+
export { checkMigrationName, suggestMigrationName, MIGRATION_NAME_MAX, type MigrationNameCheck, } from "./name.js";
|
|
14
|
+
export { schemaReader, sameColumnName, type ISchemaReader, type SqlQuery, } from "./catalog.js";
|
|
15
|
+
export { comparisonAgainstDeclared, describeDivergence, gapAgainstDeclared, } from "./divergence.js";
|
|
16
|
+
export { adoptFromDatabase, introspectionUrl, readJournal, snapshotTables, tablesPresentIn, uncommentIntrospection, type IAdoptedBaseline, } from "./adopt.js";
|
|
17
|
+
export { compareSchema, additiveSql, hasGap, type ISchemaComparison, type ISchemaGap, type IExpectedTable, } from "./schemaDiff.js";
|
|
18
|
+
export { frameworkMigrationsDir, defaultMigrationSources, FRAMEWORK_SOURCE, APP_SOURCE, FRAMEWORK_RANK, APP_RANK, } from "./paths.js";
|
|
19
|
+
export { loadSources, orderSources, splitStatements, createdTables, SUPPORTED_JOURNAL_VERSIONS, type ILoadedSources, frameworkTables, } from "./sources.js";
|
|
20
|
+
export { HISTORY_TABLE, FORMAT_MARKER, STATEMENT_BREAKPOINT, MigrationVerdictError, type IAppliedMigration, type IMigrationAction, type IMigrationApplied, type IMigrationDrift, type IMigrationDriver, type IMigrationFile, type IMigrationPlan, type IMigrationRun, type IMigrationSource, type IMigrationVerdict, type MigrationVerdictCode, } from "./types.js";
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { SqlDialect } from "../../interfaces/IDrizzleConfig.js";
|
|
2
|
+
/** Ce qu'une règle d'audit rend quand elle reconnaît une instruction. */
|
|
3
|
+
export interface IAuditRule {
|
|
4
|
+
/** Identifiant stable de la règle (cité dans les messages et les tests). */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Ce que l'instruction fait à la base. */
|
|
7
|
+
what: string;
|
|
8
|
+
/** La manœuvre sûre — un refus qui ne dit pas quoi faire ne sert à rien. */
|
|
9
|
+
todo: string;
|
|
10
|
+
}
|
|
11
|
+
/** Verdict d'une relecture de migration. */
|
|
12
|
+
export interface IMigrationAudit {
|
|
13
|
+
/** Ce qui détruit des données : refusé sans consentement explicite. */
|
|
14
|
+
destructive: IAuditRule[];
|
|
15
|
+
/** Ce qui verrouille en production : signalé, jamais bloquant. */
|
|
16
|
+
blocking: IAuditRule[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Marqueur de format, RÉ-EXPORTÉ depuis sa seule définition.
|
|
20
|
+
*
|
|
21
|
+
* Il était défini deux fois dans ce même dossier : ici pour l'ÉCRIRE, dans
|
|
22
|
+
* `types.ts` pour le LIRE. Le jour d'un `format=2`, celui qui édite l'une des
|
|
23
|
+
* deux copies fabrique un générateur qui estampille un format que le lecteur
|
|
24
|
+
* refuse — chaque copie restant verte dans ses propres tests.
|
|
25
|
+
*/
|
|
26
|
+
export { FORMAT_MARKER } from "./types.js";
|
|
27
|
+
/**
|
|
28
|
+
* Résout le binaire de `drizzle-kit` sans passer par un lanceur de shell.
|
|
29
|
+
*
|
|
30
|
+
* `npx` est un `.cmd` sous Windows, inexécutable sans `shell: true` — qui
|
|
31
|
+
* rouvrirait une injection par le nom de migration. Le paquet n'exporte pas son
|
|
32
|
+
* binaire (`exports` ne couvre que `.` et `./api`), donc on remonte les dossiers
|
|
33
|
+
* `node_modules` comme le ferait Node.
|
|
34
|
+
*
|
|
35
|
+
* @param from - dossier de départ de la remontée (racine du paquet qui génère,
|
|
36
|
+
* ou racine de l'application).
|
|
37
|
+
* @returns chemin absolu de `bin.cjs`.
|
|
38
|
+
* @throws Error si `drizzle-kit` n'est pas installé au-dessus de `from`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveDrizzleKitBin(from: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Lance `drizzle-kit generate` et EXIGE la preuve qu'il a tourné.
|
|
43
|
+
*
|
|
44
|
+
* @param options - `cwd` (dossier depuis lequel l'outil est lancé — les chemins
|
|
45
|
+
* de la configuration lui sont relatifs), `configRel` (configuration, chemin
|
|
46
|
+
* relatif à `cwd`), `name` (nom imposé de la migration), `label` (ce qui est
|
|
47
|
+
* cité dans l'erreur).
|
|
48
|
+
* @returns la sortie complète de l'outil (sortie standard puis sortie d'erreur).
|
|
49
|
+
* @throws Error si le code est non nul, ou si rien ne prouve que la génération a
|
|
50
|
+
* eu lieu — l'absence de preuve n'est JAMAIS lue comme « rien à faire ».
|
|
51
|
+
*/
|
|
52
|
+
export declare function runGenerate({ cwd, configRel, name, label, regenerateCommand, }: {
|
|
53
|
+
cwd: string;
|
|
54
|
+
configRel: string;
|
|
55
|
+
name: string;
|
|
56
|
+
label: string;
|
|
57
|
+
/** La commande à rejouer dans un terminal, citée quand l'outil pose une question. */
|
|
58
|
+
regenerateCommand?: string;
|
|
59
|
+
}): string;
|
|
60
|
+
/**
|
|
61
|
+
* Lance `drizzle-kit introspect` et EXIGE la preuve qu'il a travaillé.
|
|
62
|
+
*
|
|
63
|
+
* C'est la seule commande de la chaîne qui LIT la base pour en tirer des
|
|
64
|
+
* fichiers. Elle sert l'adoption d'une base qui existait avant les migrations :
|
|
65
|
+
* l'instantané qu'elle dépose décrit l'état RÉEL, celui à partir duquel la
|
|
66
|
+
* génération suivante produira un `ALTER` au lieu d'un `CREATE TABLE`.
|
|
67
|
+
*
|
|
68
|
+
* La preuve n'est pas cherchée dans le texte de l'outil mais dans ce qu'il
|
|
69
|
+
* LAISSE : l'appelant relit le journal des fichiers. Ici on ne garde que le
|
|
70
|
+
* refus le plus grossier — un code de sortie non nul —, parce que l'outil rend
|
|
71
|
+
* `0` même en échec et qu'un marqueur de texte a déjà menti une fois (il change
|
|
72
|
+
* avec la couleur du terminal).
|
|
73
|
+
*
|
|
74
|
+
* @param options - `cwd` (dossier depuis lequel l'outil est lancé), `configRel`
|
|
75
|
+
* (configuration, chemin relatif à `cwd`), `label` (ce qui est cité en cas
|
|
76
|
+
* d'échec).
|
|
77
|
+
* @returns la sortie complète de l'outil.
|
|
78
|
+
* @throws Error si le code est non nul.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runIntrospect({ cwd, configRel, label, }: {
|
|
81
|
+
cwd: string;
|
|
82
|
+
configRel: string;
|
|
83
|
+
label: string;
|
|
84
|
+
}): string;
|
|
85
|
+
/**
|
|
86
|
+
* La génération a-t-elle EU LIEU ? — lue sur une sortie DÉCOLORÉE.
|
|
87
|
+
*
|
|
88
|
+
* L'outil ne rend pas de code d'échec (il sort 0 même quand il rate) : la seule
|
|
89
|
+
* preuve disponible est un marqueur dans son texte. Encore faut-il le chercher
|
|
90
|
+
* dans le texte, et non dans sa mise en forme.
|
|
91
|
+
*
|
|
92
|
+
* 🔴 **Le piège, payé en intégration continue** : la forge pose `FORCE_COLOR`,
|
|
93
|
+
* l'outil colore alors sa coche — `[`, une séquence d'échappement, `✓`, une
|
|
94
|
+
* autre séquence, `]` — et `"[✓]"` n'est plus une sous-chaîne. La génération
|
|
95
|
+
* réussissait, le fichier était écrit, et l'appelant annonçait qu'elle n'avait
|
|
96
|
+
* pas eu lieu. Vert sur un poste sans terminal, rouge à la forge : la sonde
|
|
97
|
+
* mesurait la présentation.
|
|
98
|
+
*
|
|
99
|
+
* Fonction PURE, pour qu'elle s'éprouve sans lancer un process — une règle qui
|
|
100
|
+
* exige un sous-processus pour être vue rouge n'est jamais vue rouge.
|
|
101
|
+
*
|
|
102
|
+
* @param output - sortie complète de l'outil, telle qu'elle a été capturée.
|
|
103
|
+
* @returns `true` si l'outil dit avoir écrit, ou n'avoir rien eu à écrire.
|
|
104
|
+
*/
|
|
105
|
+
export declare function generationHappened(output: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Analyse le SQL d'une migration et rend ce qui mérite un refus ou un regard.
|
|
108
|
+
*
|
|
109
|
+
* Volontairement **textuelle** : il ne s'agit pas d'analyser du SQL, mais de
|
|
110
|
+
* refuser de laisser passer sans un mot ce qui détruit des données. Un motif de
|
|
111
|
+
* trop fait poser une question ; un motif de moins fait perdre une table.
|
|
112
|
+
*
|
|
113
|
+
* @param sql - contenu d'un fichier de migration.
|
|
114
|
+
* @param dialect - dialecte concerné (certains risques lui sont propres).
|
|
115
|
+
* @returns `{ destructive, blocking }`, chacun décrivant ce qui a été reconnu.
|
|
116
|
+
*/
|
|
117
|
+
export declare function auditMigrationSql(sql: string, dialect: SqlDialect): IMigrationAudit;
|
|
118
|
+
/**
|
|
119
|
+
* Reconnaît l'échec de `drizzle-kit` faute de terminal interactif.
|
|
120
|
+
*
|
|
121
|
+
* L'outil pose une question — « cette colonne a-t-elle été renommée, ou
|
|
122
|
+
* supprimée puis ajoutée ? » — à laquelle lui seul ne peut pas répondre. Sans
|
|
123
|
+
* terminal, il échoue, et **rend 0**. Sans reconnaissance explicite, l'utilisateur
|
|
124
|
+
* reçoit une pile d'appels de l'outil au lieu de la seule chose qui compte : la
|
|
125
|
+
* question qu'on lui pose, et où y répondre.
|
|
126
|
+
*
|
|
127
|
+
* @param output - sortie complète de l'outil.
|
|
128
|
+
* @returns `true` si l'échec vient d'une question restée sans terminal.
|
|
129
|
+
*/
|
|
130
|
+
export declare function isInteractivePromptFailure(output: string): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Pose le marqueur de format en tête des `.sql` d'un dossier qui ne l'ont pas.
|
|
133
|
+
*
|
|
134
|
+
* Écrit en fins de ligne `\n` quel que soit le système : le dépôt et le gabarit
|
|
135
|
+
* d'application déclarent `* text=auto eol=lf`, sans quoi une copie de travail
|
|
136
|
+
* Windows produirait une fausse dérive à chaque lecture.
|
|
137
|
+
*
|
|
138
|
+
* @param dir - dossier `<sortie>/<dialecte>` dont on marque les fichiers.
|
|
139
|
+
* @returns le nombre de fichiers marqués.
|
|
140
|
+
*/
|
|
141
|
+
export declare function stampFormatMarker(dir: string): number;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ce qu'un nom de migration a le droit d'être — et ce qu'on propose sinon.
|
|
3
|
+
*
|
|
4
|
+
* **Pourquoi une fonction pure, à part de la commande** : ce nom entre dans le
|
|
5
|
+
* tag du fichier, et un tag ne se renomme plus une fois la migration appliquée
|
|
6
|
+
* quelque part — c'est lui qui dit à chaque base ce qu'elle a déjà reçu. La
|
|
7
|
+
* règle qui le garde mérite donc d'être exerçable sans démarrer une
|
|
8
|
+
* application : un contrôle qui coûte trois minutes est un contrôle qu'on
|
|
9
|
+
* saute.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Longueur maximale d'un nom de migration.
|
|
13
|
+
*
|
|
14
|
+
* Le tag complet vaut `NNNN_<nom>` et le fichier `<tag>.sql` : à 120
|
|
15
|
+
* caractères, on reste très en deçà des 255 octets qu'un système de fichiers
|
|
16
|
+
* accepte pour un nom, et loin des 260 caractères qu'un chemin Windows tolère
|
|
17
|
+
* par défaut. La borne n'est pas là pour économiser des octets — elle est là
|
|
18
|
+
* pour qu'un nom trop long échoue AVANT d'avoir écrit un fichier, avec une
|
|
19
|
+
* phrase, plutôt qu'au moment de l'écriture avec un code d'erreur système.
|
|
20
|
+
*/
|
|
21
|
+
export declare const MIGRATION_NAME_MAX = 120;
|
|
22
|
+
/** Verdict d'une vérification de nom. */
|
|
23
|
+
export type MigrationNameCheck = {
|
|
24
|
+
ok: true;
|
|
25
|
+
name: string;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
/** Ce qui ne va pas, en une phrase française. */
|
|
29
|
+
reason: string;
|
|
30
|
+
/**
|
|
31
|
+
* Un nom valide à proposer, quand on peut en dériver un qui a du sens.
|
|
32
|
+
*
|
|
33
|
+
* **Jamais un nom que la commande refuserait ensuite** : proposer un
|
|
34
|
+
* geste qui échoue est pire que ne rien proposer, parce qu'il fait perdre
|
|
35
|
+
* un aller-retour ET la confiance dans les autres suggestions.
|
|
36
|
+
*/
|
|
37
|
+
suggestion?: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Dérive un nom acceptable d'une saisie qui ne l'est pas.
|
|
41
|
+
*
|
|
42
|
+
* @param input - ce que l'utilisateur a tapé.
|
|
43
|
+
* @returns un nom conforme, ou `undefined` s'il n'en reste rien de sensé.
|
|
44
|
+
*/
|
|
45
|
+
export declare function suggestMigrationName(input: string): string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Vérifie un nom de migration, et dit ce qu'il faudrait taper à la place.
|
|
48
|
+
*
|
|
49
|
+
* @param input - nom reçu de la ligne de commande, éventuellement absent.
|
|
50
|
+
* @returns le verdict, avec sa raison et sa suggestion.
|
|
51
|
+
*/
|
|
52
|
+
export declare function checkMigrationName(input: string | undefined): MigrationNameCheck;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { IMigrationSource } from "./types.js";
|
|
2
|
+
/** Nom logique RÉSERVÉ de la source livrée par le framework. */
|
|
3
|
+
export declare const FRAMEWORK_SOURCE = "framework";
|
|
4
|
+
/** Nom logique RÉSERVÉ de la source livrée par l'application. */
|
|
5
|
+
export declare const APP_SOURCE = "app";
|
|
6
|
+
/** Rang de la source framework : première appliquée, toujours. */
|
|
7
|
+
export declare const FRAMEWORK_RANK = 0;
|
|
8
|
+
/**
|
|
9
|
+
* Rang de la source application : dernière appliquée, toujours.
|
|
10
|
+
*
|
|
11
|
+
* Les entités d'une application peuvent référencer les tables du framework et
|
|
12
|
+
* celles des modules ; l'inverse n'arrive jamais.
|
|
13
|
+
*/
|
|
14
|
+
export declare const APP_RANK = 1000000;
|
|
15
|
+
/**
|
|
16
|
+
* Dossier des migrations livrées par ce paquet.
|
|
17
|
+
*
|
|
18
|
+
* **Trouvé en remontant jusqu'au `package.json` du paquet**, jamais par un
|
|
19
|
+
* nombre de niveaux codé en dur : la profondeur diffère entre les sources
|
|
20
|
+
* (`nodefony/src/migrator/`) et le paquet bâti (`dist/nodefony/src/migrator/`),
|
|
21
|
+
* et un compte figé serait juste d'un côté, faux de l'autre — sans que rien ne
|
|
22
|
+
* le signale avant l'exécution chez un utilisateur.
|
|
23
|
+
*
|
|
24
|
+
* @returns le chemin absolu du dossier `migrations` du paquet.
|
|
25
|
+
* @throws Error si la racine du paquet est introuvable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function frameworkMigrationsDir(): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Registre de sources standard : le framework, puis l'application.
|
|
30
|
+
*
|
|
31
|
+
* L'espace de noms reste OUVERT — un module tiers ajoute la sienne au même
|
|
32
|
+
* registre, avec son propre rang. `framework` et `app` sont deux valeurs
|
|
33
|
+
* réservées, pas une énumération.
|
|
34
|
+
*
|
|
35
|
+
* **Le framework ne fournit ses migrations que s'il déclare ses entités.** Un
|
|
36
|
+
* module réglé `frameworkEntities: false` est data-only : il n'enregistre ni
|
|
37
|
+
* entité ni fabrique, et le démarrage en mode dérivé ne crée donc aucune table
|
|
38
|
+
* de session, de jeton, d'audit ni de webhook. Les inclure ici quand même
|
|
39
|
+
* faisait fabriquer DEUX bases différentes à la même application selon qu'elle
|
|
40
|
+
* démarrait en développement ou qu'on la migrait en production — et rien ne le
|
|
41
|
+
* disait, le verdict de divergence ignorant par construction ce que la base a
|
|
42
|
+
* en TROP.
|
|
43
|
+
*
|
|
44
|
+
* La règle vit ICI, à l'endroit unique où les sources se composent : ses deux
|
|
45
|
+
* appelants (le service au démarrage, les commandes) la recopieraient sinon, et
|
|
46
|
+
* deux copies divergent en silence.
|
|
47
|
+
*
|
|
48
|
+
* @param appDir - dossier de migrations de l'application, s'il y en a un.
|
|
49
|
+
* @param options.framework - `false` quand le module est data-only.
|
|
50
|
+
* @returns le registre, prêt pour l'applicateur.
|
|
51
|
+
*/
|
|
52
|
+
export declare function defaultMigrationSources(appDir?: string, options?: {
|
|
53
|
+
framework?: boolean;
|
|
54
|
+
}): Promise<IMigrationSource[]>;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type { IDrizzleConfig } from "../../interfaces/IDrizzleConfig.js";
|
|
2
|
+
import { MIGRATION_FORMAT_VERSION } from "./explain.js";
|
|
3
|
+
import type { IMigrationAction } from "./types.js";
|
|
4
|
+
import type { MigrationVerdictError } from "./types.js";
|
|
5
|
+
import type { IConnectorResolution } from "./resolve.js";
|
|
6
|
+
/** Codes d'arrêt propres à la ligne de commande (l'applicateur a les siens). */
|
|
7
|
+
export type CommandFailureCode =
|
|
8
|
+
/** Aucun connecteur de ce nom, nulle part. */
|
|
9
|
+
"NF_MIGRATE_UNKNOWN_CONNECTOR"
|
|
10
|
+
/** Le connecteur existe, mais sa base ne se migre pas par fichiers. */
|
|
11
|
+
| "NF_MIGRATE_NO_MIGRATIONS" | "NF_MIGRATE_URL_MISMATCH"
|
|
12
|
+
/** Connecteur SQL enregistré, mais absent de la configuration du module. */
|
|
13
|
+
| "NF_MIGRATE_NOT_CONFIGURED"
|
|
14
|
+
/** Geste réservé au développement, demandé ailleurs. */
|
|
15
|
+
| "NF_MIGRATE_NOT_DEVELOPMENT"
|
|
16
|
+
/** La commande n'a pas pu joindre la base, ou a échoué à l'exécution. */
|
|
17
|
+
| "NF_MIGRATE_UNAVAILABLE"
|
|
18
|
+
/** Confirmation requise et non donnée. */
|
|
19
|
+
| "NF_MIGRATE_CONFIRM_REQUIRED"
|
|
20
|
+
/** Des migrations en attente SUPPRIMENT des données, hors développement. */
|
|
21
|
+
| "NF_MIGRATE_DESTRUCTIVE"
|
|
22
|
+
/** Adopter TOUT graverait une affirmation fausse : la base ne suit pas. */
|
|
23
|
+
| "NF_MIGRATE_BASELINE_AMBIGUOUS"
|
|
24
|
+
/** Le nom de la migration manque, ou ne voyage pas sur les trois systèmes. */
|
|
25
|
+
| "NF_GENERATE_NAME"
|
|
26
|
+
/** Une entité enregistrée qu'aucun fichier découvert ne fournit. */
|
|
27
|
+
| "NF_GENERATE_MISSING_ENTITY"
|
|
28
|
+
/** Un fichier de l'application fournit une table qui appartient au framework. */
|
|
29
|
+
| "NF_GENERATE_FRAMEWORK_TABLE"
|
|
30
|
+
/** La migration produite DÉTRUIT des données, et personne ne l'a dit. */
|
|
31
|
+
| "NF_GENERATE_DESTRUCTIVE"
|
|
32
|
+
/** Rien à écrire, et pourtant la base ne porte pas le schéma déclaré. */
|
|
33
|
+
| "NF_GENERATE_DATABASE_BEHIND"
|
|
34
|
+
/** L'outil qui ÉCRIT les migrations n'est pas installé. */
|
|
35
|
+
| "NF_GENERATE_TOOL_MISSING"
|
|
36
|
+
/** Le schéma initial serait écrit sur une base qui porte DÉJÀ ces tables. */
|
|
37
|
+
| "NF_GENERATE_DATABASE_NOT_ADOPTED"
|
|
38
|
+
/** L'adoption par lecture de la base, demandée alors qu'il existe déjà des migrations. */
|
|
39
|
+
| "NF_MIGRATE_BASELINE_NOT_EMPTY"
|
|
40
|
+
/** La table d'historique existe, mais ce n'est pas celle du framework. */
|
|
41
|
+
| "NF_MIGRATE_HISTORY_FOREIGN";
|
|
42
|
+
/**
|
|
43
|
+
* Ce que la découverte des entités a VU, au moment où la commande a refusé.
|
|
44
|
+
*
|
|
45
|
+
* **Pourquoi ce bloc existe.** Une migration se produit à partir des FICHIERS.
|
|
46
|
+
* Quand l'un d'eux manque à l'appel — illisible, écrit pour un autre moteur, ou
|
|
47
|
+
* n'exportant rien sous la configuration courante —, la table qu'il fournissait
|
|
48
|
+
* disparaît du schéma déclaré, et l'outil de diff ne voit pas une découverte
|
|
49
|
+
* amputée : il voit une table SUPPRIMÉE, et propose de la détruire. Le refus
|
|
50
|
+
* qui s'ensuit nomme alors la base, qui n'y est pour rien.
|
|
51
|
+
*
|
|
52
|
+
* Sans ces faits, la correction naturelle — accepter la destruction, ou repartir
|
|
53
|
+
* d'une base vide — détruit des données pour un défaut qui est dans le dossier
|
|
54
|
+
* d'entités. C'est le seul endroit d'où l'on peut le voir.
|
|
55
|
+
*/
|
|
56
|
+
export interface IDiscoveryFacts {
|
|
57
|
+
/** Fichiers d'entités examinés, toutes cibles confondues. */
|
|
58
|
+
filesScanned: number;
|
|
59
|
+
/** Tables de l'APPLICATION retenues pour le dialecte de ce connecteur. */
|
|
60
|
+
tables: string[];
|
|
61
|
+
/** Tables écartées : elles sont écrites pour un AUTRE moteur. */
|
|
62
|
+
otherDialect: {
|
|
63
|
+
table: string;
|
|
64
|
+
dialect: string;
|
|
65
|
+
file: string;
|
|
66
|
+
}[];
|
|
67
|
+
/** Fichiers qui n'ont pas pu être importés, avec leur cause. */
|
|
68
|
+
unreadable: {
|
|
69
|
+
file: string;
|
|
70
|
+
cause: string;
|
|
71
|
+
}[];
|
|
72
|
+
}
|
|
73
|
+
/** Ce qu'une commande écrit quand elle n'a PAS pu rendre un état. */
|
|
74
|
+
export interface ICommandFailure {
|
|
75
|
+
formatVersion: typeof MIGRATION_FORMAT_VERSION;
|
|
76
|
+
connector: string;
|
|
77
|
+
exitCode: 1 | 2;
|
|
78
|
+
/**
|
|
79
|
+
* Présent ⇔ la commande n'a pas pu faire son travail. C'est le discriminant :
|
|
80
|
+
* une sortie qui porte `verdict` est un état lu, une sortie qui porte `error`
|
|
81
|
+
* est un arrêt. Aucune n'a jamais les deux.
|
|
82
|
+
*/
|
|
83
|
+
error: {
|
|
84
|
+
code: CommandFailureCode | MigrationVerdictError["verdict"]["code"];
|
|
85
|
+
summary: string;
|
|
86
|
+
meaning: string;
|
|
87
|
+
nextActions: IMigrationAction[];
|
|
88
|
+
/**
|
|
89
|
+
* Ce que la découverte des entités a vu — présent sur les refus dont la
|
|
90
|
+
* cause PEUT être un schéma déclaré amputé. Optionnel : un refus de
|
|
91
|
+
* résolution n'a jamais découvert quoi que ce soit.
|
|
92
|
+
*/
|
|
93
|
+
discovery?: IDiscoveryFacts;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Ce qu'il y a à dire d'un connecteur sur lequel on ne peut pas travailler. */
|
|
97
|
+
export interface IResolutionRefusal {
|
|
98
|
+
code: CommandFailureCode;
|
|
99
|
+
/** Le fait constaté, en une phrase. */
|
|
100
|
+
summary: string;
|
|
101
|
+
/** Pourquoi c'est ainsi — la phrase qui évite la mauvaise correction. */
|
|
102
|
+
meaning: string;
|
|
103
|
+
/** Ce qu'il faut faire, du plus direct au plus assumé. */
|
|
104
|
+
nextActions: IMigrationAction[];
|
|
105
|
+
/**
|
|
106
|
+
* Code de sortie que ce refus produit sur la ligne de commande.
|
|
107
|
+
*
|
|
108
|
+
* Il vit ICI et pas dans l'appelant : un refus de résolution qui vaudrait
|
|
109
|
+
* `1` d'un côté et `2` de l'autre casserait les contrôles d'intégration
|
|
110
|
+
* continue qui lisent ce chiffre, sans qu'aucun test ne le voie.
|
|
111
|
+
*/
|
|
112
|
+
exitCode: 1 | 2;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* L'outil qui ÉCRIT les migrations n'est pas installé.
|
|
116
|
+
*
|
|
117
|
+
* Refus À PART, et c'est tout son intérêt : sans lui, cette cause tombait dans
|
|
118
|
+
* le fourre-tout des commandes de migration, qui habille toute exception non
|
|
119
|
+
* typée d'un `meaning` écrit pour la base injoignable. La charge utile portait
|
|
120
|
+
* alors DEUX explications qui se contredisent — le fait disait « l'outil
|
|
121
|
+
* manque », l'explication disait « vérifie que la base est démarrée » — et ses
|
|
122
|
+
* deux gestes interrogeaient une base qui n'y était pour rien.
|
|
123
|
+
*
|
|
124
|
+
* @returns le refus, avec le geste qui répare.
|
|
125
|
+
*/
|
|
126
|
+
export declare function generationToolMissing(): IResolutionRefusal;
|
|
127
|
+
/**
|
|
128
|
+
* Erreur portant un {@link IResolutionRefusal} déjà composé.
|
|
129
|
+
*
|
|
130
|
+
* Elle existe pour que la CAUSE porte son propre remède jusqu'à la sortie de la
|
|
131
|
+
* commande : reconnaître une cause au texte de son message serait une garde qui
|
|
132
|
+
* se casse au premier reformulage.
|
|
133
|
+
*/
|
|
134
|
+
export declare class MigrationToolError extends Error {
|
|
135
|
+
readonly refusal: IResolutionRefusal;
|
|
136
|
+
/**
|
|
137
|
+
* @param refusal - refus complet, seule source de la décision.
|
|
138
|
+
*/
|
|
139
|
+
constructor(refusal: IResolutionRefusal);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Le module qui porte les connecteurs n'est pas chargé par l'application.
|
|
143
|
+
*
|
|
144
|
+
* @returns le refus, prêt pour la ligne de commande comme pour l'écran.
|
|
145
|
+
*/
|
|
146
|
+
export declare function moduleAbsent(): IResolutionRefusal;
|
|
147
|
+
/**
|
|
148
|
+
* Le connecteur est une base SQL, mais la configuration du module ne le déclare
|
|
149
|
+
* pas — cas d'un ORM construit directement dans du code.
|
|
150
|
+
*
|
|
151
|
+
* ⚠️ Ne JAMAIS lui répondre « ne porte pas de migrations » : c'est faux d'un
|
|
152
|
+
* connecteur SQL, et un message faux publié est appris par les scripts qui le
|
|
153
|
+
* lisent.
|
|
154
|
+
*
|
|
155
|
+
* @param connector - nom du connecteur.
|
|
156
|
+
* @param driver - base sous-jacente, telle que l'ORM la nomme.
|
|
157
|
+
* @returns le refus, prêt pour la ligne de commande comme pour l'écran.
|
|
158
|
+
*/
|
|
159
|
+
export declare function notConfigured(connector: string, driver: string): IResolutionRefusal;
|
|
160
|
+
/**
|
|
161
|
+
* Traduit une résolution qui n'est PAS `ready` en refus lisible.
|
|
162
|
+
*
|
|
163
|
+
* @param wanted - nom demandé par l'appelant.
|
|
164
|
+
* @param resolution - ce que la résolution a rendu.
|
|
165
|
+
* @param config - configuration validée du module (nomme les connecteurs réels).
|
|
166
|
+
* @returns le refus correspondant, jamais `null` : chaque cas a sa prose.
|
|
167
|
+
*/
|
|
168
|
+
export declare function describeResolutionRefusal(wanted: string, resolution: Exclude<IConnectorResolution, {
|
|
169
|
+
kind: "ready";
|
|
170
|
+
}>, config: IDrizzleConfig): IResolutionRefusal;
|