@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.
Files changed (143) hide show
  1. package/LICENSE +544 -0
  2. package/README.md +162 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js +9 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateMetadata.js +6 -0
  5. package/dist/index.js +105 -0
  6. package/dist/nodefony/command/migrateShared.js +247 -0
  7. package/dist/nodefony/command/orm-generate.js +356 -0
  8. package/dist/nodefony/command/orm-migrate-baseline.js +208 -0
  9. package/dist/nodefony/command/orm-migrate-repair.js +114 -0
  10. package/dist/nodefony/command/orm-migrate-status.js +67 -0
  11. package/dist/nodefony/command/orm-migrate.js +141 -0
  12. package/dist/nodefony/command/orm-reset.js +166 -0
  13. package/dist/nodefony/config/config.js +107 -0
  14. package/dist/nodefony/config/defineModuleConfig.js +63 -0
  15. package/dist/nodefony/entity/auditEventEntity.js +93 -0
  16. package/dist/nodefony/entity/colKit.js +260 -0
  17. package/dist/nodefony/entity/idempotencyEntity.js +74 -0
  18. package/dist/nodefony/entity/sessionEntity.js +75 -0
  19. package/dist/nodefony/entity/tokenEntity.js +198 -0
  20. package/dist/nodefony/entity/totpSecretEntity.js +98 -0
  21. package/dist/nodefony/entity/userTable.js +141 -0
  22. package/dist/nodefony/entity/webAuthnCredentialEntity.js +114 -0
  23. package/dist/nodefony/entity/webhookEndpointEntity.js +106 -0
  24. package/dist/nodefony/interfaces/IDrizzleConfig.js +1 -0
  25. package/dist/nodefony/interfaces/index.js +1 -0
  26. package/dist/nodefony/migrations-schema/mysql.js +48 -0
  27. package/dist/nodefony/migrations-schema/postgres.js +48 -0
  28. package/dist/nodefony/migrations-schema/sqlite.js +48 -0
  29. package/dist/nodefony/registerStores.js +218 -0
  30. package/dist/nodefony/service/DrizzleService.js +282 -0
  31. package/dist/nodefony/src/DrizzleAuditStore.js +203 -0
  32. package/dist/nodefony/src/DrizzleIdempotencyStore.js +278 -0
  33. package/dist/nodefony/src/DrizzleTokenStore.js +244 -0
  34. package/dist/nodefony/src/DrizzleTotpSecretStore.js +151 -0
  35. package/dist/nodefony/src/DrizzleUserRepository.js +217 -0
  36. package/dist/nodefony/src/DrizzleWebAuthnCredentialStore.js +159 -0
  37. package/dist/nodefony/src/DrizzleWebhookStore.js +169 -0
  38. package/dist/nodefony/src/SessionStorage.js +259 -0
  39. package/dist/nodefony/src/connectorTarget.js +59 -0
  40. package/dist/nodefony/src/likeSql.js +50 -0
  41. package/dist/nodefony/src/migrator/DrizzleMigrator.js +775 -0
  42. package/dist/nodefony/src/migrator/adopt.js +553 -0
  43. package/dist/nodefony/src/migrator/appSchema.js +414 -0
  44. package/dist/nodefony/src/migrator/catalog.js +76 -0
  45. package/dist/nodefony/src/migrator/destructive.js +213 -0
  46. package/dist/nodefony/src/migrator/divergence.js +84 -0
  47. package/dist/nodefony/src/migrator/drivers/index.js +39 -0
  48. package/dist/nodefony/src/migrator/drivers/mysqlDriver.js +147 -0
  49. package/dist/nodefony/src/migrator/drivers/postgresDriver.js +151 -0
  50. package/dist/nodefony/src/migrator/drivers/sqliteDriver.js +121 -0
  51. package/dist/nodefony/src/migrator/explain.js +565 -0
  52. package/dist/nodefony/src/migrator/hash.js +47 -0
  53. package/dist/nodefony/src/migrator/history.js +219 -0
  54. package/dist/nodefony/src/migrator/index.js +16 -0
  55. package/dist/nodefony/src/migrator/kit.js +296 -0
  56. package/dist/nodefony/src/migrator/name.js +68 -0
  57. package/dist/nodefony/src/migrator/paths.js +88 -0
  58. package/dist/nodefony/src/migrator/refusals.js +143 -0
  59. package/dist/nodefony/src/migrator/resolve.js +281 -0
  60. package/dist/nodefony/src/migrator/schemaDiff.js +86 -0
  61. package/dist/nodefony/src/migrator/sources.js +419 -0
  62. package/dist/nodefony/src/migrator/status.js +231 -0
  63. package/dist/nodefony/src/migrator/types.js +91 -0
  64. package/dist/nodefony/src/orm-core/DrizzleOrm.js +1154 -0
  65. package/dist/nodefony/src/orm-core/DrizzleRepository.js +610 -0
  66. package/dist/nodefony/src/orm-core/DrizzleTransaction.js +106 -0
  67. package/dist/nodefony/src/orm-core/index.js +4 -0
  68. package/dist/nodefony/src/queryKit.js +318 -0
  69. package/dist/nodefony/src/safeTarget.js +55 -0
  70. package/dist/types/index.d.ts +76 -0
  71. package/dist/types/nodefony/command/migrateShared.d.ts +137 -0
  72. package/dist/types/nodefony/command/orm-generate.d.ts +53 -0
  73. package/dist/types/nodefony/command/orm-migrate-baseline.d.ts +87 -0
  74. package/dist/types/nodefony/command/orm-migrate-repair.d.ts +66 -0
  75. package/dist/types/nodefony/command/orm-migrate-status.d.ts +38 -0
  76. package/dist/types/nodefony/command/orm-migrate.d.ts +65 -0
  77. package/dist/types/nodefony/command/orm-reset.d.ts +55 -0
  78. package/dist/types/nodefony/config/config.d.ts +110 -0
  79. package/dist/types/nodefony/config/defineModuleConfig.d.ts +24 -0
  80. package/dist/types/nodefony/entity/auditEventEntity.d.ts +56 -0
  81. package/dist/types/nodefony/entity/colKit.d.ts +130 -0
  82. package/dist/types/nodefony/entity/idempotencyEntity.d.ts +52 -0
  83. package/dist/types/nodefony/entity/sessionEntity.d.ts +50 -0
  84. package/dist/types/nodefony/entity/tokenEntity.d.ts +53 -0
  85. package/dist/types/nodefony/entity/totpSecretEntity.d.ts +61 -0
  86. package/dist/types/nodefony/entity/userTable.d.ts +65 -0
  87. package/dist/types/nodefony/entity/webAuthnCredentialEntity.d.ts +57 -0
  88. package/dist/types/nodefony/entity/webhookEndpointEntity.d.ts +58 -0
  89. package/dist/types/nodefony/interfaces/IDrizzleConfig.d.ts +17 -0
  90. package/dist/types/nodefony/interfaces/index.d.ts +1 -0
  91. package/dist/types/nodefony/migrations-schema/mysql.d.ts +9 -0
  92. package/dist/types/nodefony/migrations-schema/postgres.d.ts +9 -0
  93. package/dist/types/nodefony/migrations-schema/sqlite.d.ts +9 -0
  94. package/dist/types/nodefony/registerStores.d.ts +52 -0
  95. package/dist/types/nodefony/service/DrizzleService.d.ts +27 -0
  96. package/dist/types/nodefony/src/DrizzleAuditStore.d.ts +65 -0
  97. package/dist/types/nodefony/src/DrizzleIdempotencyStore.d.ts +129 -0
  98. package/dist/types/nodefony/src/DrizzleTokenStore.d.ts +146 -0
  99. package/dist/types/nodefony/src/DrizzleTotpSecretStore.d.ts +60 -0
  100. package/dist/types/nodefony/src/DrizzleUserRepository.d.ts +67 -0
  101. package/dist/types/nodefony/src/DrizzleWebAuthnCredentialStore.d.ts +62 -0
  102. package/dist/types/nodefony/src/DrizzleWebhookStore.d.ts +79 -0
  103. package/dist/types/nodefony/src/SessionStorage.d.ts +72 -0
  104. package/dist/types/nodefony/src/connectorTarget.d.ts +48 -0
  105. package/dist/types/nodefony/src/likeSql.d.ts +29 -0
  106. package/dist/types/nodefony/src/migrator/DrizzleMigrator.d.ts +94 -0
  107. package/dist/types/nodefony/src/migrator/adopt.d.ts +280 -0
  108. package/dist/types/nodefony/src/migrator/appSchema.d.ts +223 -0
  109. package/dist/types/nodefony/src/migrator/catalog.d.ts +100 -0
  110. package/dist/types/nodefony/src/migrator/destructive.d.ts +123 -0
  111. package/dist/types/nodefony/src/migrator/divergence.d.ts +61 -0
  112. package/dist/types/nodefony/src/migrator/drivers/index.d.ts +26 -0
  113. package/dist/types/nodefony/src/migrator/drivers/mysqlDriver.d.ts +83 -0
  114. package/dist/types/nodefony/src/migrator/drivers/postgresDriver.d.ts +81 -0
  115. package/dist/types/nodefony/src/migrator/drivers/sqliteDriver.d.ts +53 -0
  116. package/dist/types/nodefony/src/migrator/explain.d.ts +424 -0
  117. package/dist/types/nodefony/src/migrator/hash.d.ts +39 -0
  118. package/dist/types/nodefony/src/migrator/history.d.ts +139 -0
  119. package/dist/types/nodefony/src/migrator/index.d.ts +20 -0
  120. package/dist/types/nodefony/src/migrator/kit.d.ts +141 -0
  121. package/dist/types/nodefony/src/migrator/name.d.ts +52 -0
  122. package/dist/types/nodefony/src/migrator/paths.d.ts +54 -0
  123. package/dist/types/nodefony/src/migrator/refusals.d.ts +170 -0
  124. package/dist/types/nodefony/src/migrator/resolve.d.ts +201 -0
  125. package/dist/types/nodefony/src/migrator/schemaDiff.d.ts +112 -0
  126. package/dist/types/nodefony/src/migrator/sources.d.ts +119 -0
  127. package/dist/types/nodefony/src/migrator/status.d.ts +132 -0
  128. package/dist/types/nodefony/src/migrator/types.d.ts +273 -0
  129. package/dist/types/nodefony/src/orm-core/DrizzleOrm.d.ts +241 -0
  130. package/dist/types/nodefony/src/orm-core/DrizzleRepository.d.ts +98 -0
  131. package/dist/types/nodefony/src/orm-core/DrizzleTransaction.d.ts +71 -0
  132. package/dist/types/nodefony/src/orm-core/index.d.ts +11 -0
  133. package/dist/types/nodefony/src/queryKit.d.ts +136 -0
  134. package/dist/types/nodefony/src/safeTarget.d.ts +42 -0
  135. package/docs/index.md +954 -0
  136. package/docs/migrations.md +691 -0
  137. package/migrations/mysql/0000_framework_init.sql +137 -0
  138. package/migrations/mysql/meta/_journal.json +13 -0
  139. package/migrations/postgres/0000_framework_init.sql +128 -0
  140. package/migrations/postgres/meta/_journal.json +13 -0
  141. package/migrations/sqlite/0000_framework_init.sql +127 -0
  142. package/migrations/sqlite/meta/_journal.json +13 -0
  143. 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;