chkit 0.1.0-beta.9 → 0.1.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.
Files changed (299) hide show
  1. package/README.md +38 -2
  2. package/dist/bin/chkit.js +230 -203
  3. package/dist/bin/chkit.js.map +1 -1
  4. package/dist/bin/clickhouse-resource.d.ts +4 -0
  5. package/dist/bin/clickhouse-resource.d.ts.map +1 -0
  6. package/dist/bin/clickhouse-resource.js +11 -0
  7. package/dist/bin/clickhouse-resource.js.map +1 -0
  8. package/dist/bin/command-dispatch.d.ts +13 -0
  9. package/dist/bin/command-dispatch.d.ts.map +1 -0
  10. package/dist/bin/command-dispatch.js +186 -0
  11. package/dist/bin/command-dispatch.js.map +1 -0
  12. package/dist/bin/commands/check.d.ts +1 -1
  13. package/dist/bin/commands/check.d.ts.map +1 -1
  14. package/dist/bin/commands/check.js +157 -107
  15. package/dist/bin/commands/check.js.map +1 -1
  16. package/dist/bin/commands/drift.d.ts +6 -2
  17. package/dist/bin/commands/drift.d.ts.map +1 -1
  18. package/dist/bin/commands/drift.js +49 -8
  19. package/dist/bin/commands/drift.js.map +1 -1
  20. package/dist/bin/commands/generate.d.ts.map +1 -1
  21. package/dist/bin/commands/generate.js +4 -0
  22. package/dist/bin/commands/generate.js.map +1 -1
  23. package/dist/bin/commands/migrate.d.ts.map +1 -1
  24. package/dist/bin/commands/migrate.js +189 -171
  25. package/dist/bin/commands/migrate.js.map +1 -1
  26. package/dist/bin/commands/status.d.ts.map +1 -1
  27. package/dist/bin/commands/status.js +15 -5
  28. package/dist/bin/commands/status.js.map +1 -1
  29. package/dist/bin/config.d.ts.map +1 -1
  30. package/dist/bin/config.js +14 -5
  31. package/dist/bin/config.js.map +1 -1
  32. package/dist/bin/debug.d.ts +3 -0
  33. package/dist/bin/debug.d.ts.map +1 -0
  34. package/dist/bin/debug.js +14 -0
  35. package/dist/bin/debug.js.map +1 -0
  36. package/dist/bin/help.d.ts.map +1 -1
  37. package/dist/bin/help.js +1 -0
  38. package/dist/bin/help.js.map +1 -1
  39. package/dist/bin/internal-plugins/index.d.ts +3 -0
  40. package/dist/bin/internal-plugins/index.d.ts.map +1 -0
  41. package/dist/bin/internal-plugins/index.js +5 -0
  42. package/dist/bin/internal-plugins/index.js.map +1 -0
  43. package/dist/bin/internal-plugins/skill-hint.d.ts +31 -0
  44. package/dist/bin/internal-plugins/skill-hint.d.ts.map +1 -0
  45. package/dist/bin/internal-plugins/skill-hint.js +172 -0
  46. package/dist/bin/internal-plugins/skill-hint.js.map +1 -0
  47. package/dist/bin/journal-store.d.ts +3 -6
  48. package/dist/bin/journal-store.d.ts.map +1 -1
  49. package/dist/bin/journal-store.js +87 -16
  50. package/dist/bin/journal-store.js.map +1 -1
  51. package/dist/bin/json-output.d.ts +2 -5
  52. package/dist/bin/json-output.d.ts.map +1 -1
  53. package/dist/bin/json-output.js +1 -1
  54. package/dist/bin/json-output.js.map +1 -1
  55. package/dist/bin/lib.d.ts +2 -5
  56. package/dist/bin/lib.d.ts.map +1 -1
  57. package/dist/bin/lib.js +2 -5
  58. package/dist/bin/lib.js.map +1 -1
  59. package/dist/bin/logging.d.ts +3 -0
  60. package/dist/bin/logging.d.ts.map +1 -0
  61. package/dist/bin/logging.js +31 -0
  62. package/dist/bin/logging.js.map +1 -0
  63. package/dist/bin/migration-store.d.ts +2 -2
  64. package/dist/bin/migration-store.d.ts.map +1 -1
  65. package/dist/bin/migration-store.js +1 -1
  66. package/dist/bin/migration-store.js.map +1 -1
  67. package/dist/bin/plugin-runtime.d.ts +9 -1
  68. package/dist/bin/plugin-runtime.d.ts.map +1 -1
  69. package/dist/bin/plugin-runtime.js +251 -2
  70. package/dist/bin/plugin-runtime.js.map +1 -1
  71. package/dist/bin/safety-markers.d.ts +3 -4
  72. package/dist/bin/safety-markers.d.ts.map +1 -1
  73. package/dist/bin/safety-markers.js +4 -13
  74. package/dist/bin/safety-markers.js.map +1 -1
  75. package/dist/bin/schema-loader.d.ts +1 -1
  76. package/dist/bin/schema-loader.d.ts.map +1 -1
  77. package/dist/bin/schema-loader.js +7 -2
  78. package/dist/bin/schema-loader.js.map +1 -1
  79. package/dist/bin/table-scope.d.ts +1 -2
  80. package/dist/bin/table-scope.d.ts.map +1 -1
  81. package/dist/bin/table-scope.js +1 -1
  82. package/dist/bin/table-scope.js.map +1 -1
  83. package/dist/commands/check/command.d.ts +3 -0
  84. package/dist/commands/check/command.d.ts.map +1 -0
  85. package/dist/commands/check/command.js +106 -0
  86. package/dist/commands/check/command.js.map +1 -0
  87. package/dist/commands/check/output.d.ts +35 -0
  88. package/dist/commands/check/output.d.ts.map +1 -0
  89. package/dist/commands/check/output.js +105 -0
  90. package/dist/commands/check/output.js.map +1 -0
  91. package/dist/commands/drift/command.d.ts +3 -0
  92. package/dist/commands/drift/command.d.ts.map +1 -0
  93. package/dist/commands/drift/command.js +128 -0
  94. package/dist/commands/drift/command.js.map +1 -0
  95. package/dist/commands/drift/compare.d.ts +66 -0
  96. package/dist/commands/drift/compare.d.ts.map +1 -0
  97. package/dist/commands/drift/compare.js +220 -0
  98. package/dist/commands/drift/compare.js.map +1 -0
  99. package/dist/commands/drift/diff.d.ts +8 -0
  100. package/dist/commands/drift/diff.d.ts.map +1 -0
  101. package/dist/commands/drift/diff.js +46 -0
  102. package/dist/commands/drift/diff.js.map +1 -0
  103. package/dist/commands/drift/payload.d.ts +38 -0
  104. package/dist/commands/drift/payload.d.ts.map +1 -0
  105. package/dist/commands/drift/payload.js +111 -0
  106. package/dist/commands/drift/payload.js.map +1 -0
  107. package/dist/commands/generate/command.d.ts +3 -0
  108. package/dist/commands/generate/command.d.ts.map +1 -0
  109. package/dist/commands/generate/command.js +163 -0
  110. package/dist/commands/generate/command.js.map +1 -0
  111. package/dist/commands/generate/output.d.ts +8 -0
  112. package/dist/commands/generate/output.d.ts.map +1 -0
  113. package/dist/commands/generate/output.js +59 -0
  114. package/dist/commands/generate/output.js.map +1 -0
  115. package/dist/commands/generate/plan-pipeline.d.ts +7 -0
  116. package/dist/commands/generate/plan-pipeline.d.ts.map +1 -0
  117. package/dist/commands/generate/plan-pipeline.js +143 -0
  118. package/dist/commands/generate/plan-pipeline.js.map +1 -0
  119. package/dist/commands/generate/rename-mappings.d.ts +29 -0
  120. package/dist/commands/generate/rename-mappings.d.ts.map +1 -0
  121. package/dist/commands/generate/rename-mappings.js +195 -0
  122. package/dist/commands/generate/rename-mappings.js.map +1 -0
  123. package/dist/commands/init.d.ts +2 -0
  124. package/dist/commands/init.d.ts.map +1 -0
  125. package/dist/commands/init.js +101 -0
  126. package/dist/commands/init.js.map +1 -0
  127. package/dist/commands/migrate/apply.d.ts +33 -0
  128. package/dist/commands/migrate/apply.d.ts.map +1 -0
  129. package/dist/commands/migrate/apply.js +143 -0
  130. package/dist/commands/migrate/apply.js.map +1 -0
  131. package/dist/commands/migrate/async-apply.d.ts +30 -0
  132. package/dist/commands/migrate/async-apply.d.ts.map +1 -0
  133. package/dist/commands/migrate/async-apply.js +258 -0
  134. package/dist/commands/migrate/async-apply.js.map +1 -0
  135. package/dist/commands/migrate/command.d.ts +3 -0
  136. package/dist/commands/migrate/command.d.ts.map +1 -0
  137. package/dist/commands/migrate/command.js +207 -0
  138. package/dist/commands/migrate/command.js.map +1 -0
  139. package/dist/commands/migrate/destructive.d.ts +7 -0
  140. package/dist/commands/migrate/destructive.d.ts.map +1 -0
  141. package/dist/commands/migrate/destructive.js +24 -0
  142. package/dist/commands/migrate/destructive.js.map +1 -0
  143. package/dist/commands/migrate/prompts.d.ts +6 -0
  144. package/dist/commands/migrate/prompts.d.ts.map +1 -0
  145. package/dist/commands/migrate/prompts.js +40 -0
  146. package/dist/commands/migrate/prompts.js.map +1 -0
  147. package/dist/commands/migrate/scope.d.ts +12 -0
  148. package/dist/commands/migrate/scope.d.ts.map +1 -0
  149. package/dist/commands/migrate/scope.js +35 -0
  150. package/dist/commands/migrate/scope.js.map +1 -0
  151. package/dist/commands/plugin.d.ts +3 -0
  152. package/dist/commands/plugin.d.ts.map +1 -0
  153. package/dist/commands/plugin.js +129 -0
  154. package/dist/commands/plugin.js.map +1 -0
  155. package/dist/commands/query.d.ts +17 -0
  156. package/dist/commands/query.d.ts.map +1 -0
  157. package/dist/commands/query.js +155 -0
  158. package/dist/commands/query.js.map +1 -0
  159. package/dist/commands/skills.d.ts +13 -0
  160. package/dist/commands/skills.d.ts.map +1 -0
  161. package/dist/commands/skills.js +25 -0
  162. package/dist/commands/skills.js.map +1 -0
  163. package/dist/commands/status.d.ts +3 -0
  164. package/dist/commands/status.d.ts.map +1 -0
  165. package/dist/commands/status.js +69 -0
  166. package/dist/commands/status.js.map +1 -0
  167. package/dist/drift.d.ts +7 -6
  168. package/dist/drift.d.ts.map +1 -1
  169. package/dist/drift.js +19 -8
  170. package/dist/drift.js.map +1 -1
  171. package/dist/internal-plugins/core/plugin.d.ts +2 -0
  172. package/dist/internal-plugins/core/plugin.d.ts.map +1 -0
  173. package/dist/internal-plugins/core/plugin.js +21 -0
  174. package/dist/internal-plugins/core/plugin.js.map +1 -0
  175. package/dist/internal-plugins/index.d.ts +3 -0
  176. package/dist/internal-plugins/index.d.ts.map +1 -0
  177. package/dist/internal-plugins/index.js +6 -0
  178. package/dist/internal-plugins/index.js.map +1 -0
  179. package/dist/internal-plugins/skill-hint/agent-detect.d.ts +20 -0
  180. package/dist/internal-plugins/skill-hint/agent-detect.d.ts.map +1 -0
  181. package/dist/internal-plugins/skill-hint/agent-detect.js +68 -0
  182. package/dist/internal-plugins/skill-hint/agent-detect.js.map +1 -0
  183. package/dist/internal-plugins/skill-hint/plugin.d.ts +16 -0
  184. package/dist/internal-plugins/skill-hint/plugin.d.ts.map +1 -0
  185. package/dist/internal-plugins/skill-hint/plugin.js +60 -0
  186. package/dist/internal-plugins/skill-hint/plugin.js.map +1 -0
  187. package/dist/internal-plugins/skill-hint/prompt.d.ts +5 -0
  188. package/dist/internal-plugins/skill-hint/prompt.d.ts.map +1 -0
  189. package/dist/internal-plugins/skill-hint/prompt.js +37 -0
  190. package/dist/internal-plugins/skill-hint/prompt.js.map +1 -0
  191. package/dist/internal-plugins/skill-hint/state.d.ts +7 -0
  192. package/dist/internal-plugins/skill-hint/state.d.ts.map +1 -0
  193. package/dist/internal-plugins/skill-hint/state.js +23 -0
  194. package/dist/internal-plugins/skill-hint/state.js.map +1 -0
  195. package/dist/plugins.d.ts +109 -27
  196. package/dist/plugins.d.ts.map +1 -1
  197. package/dist/plugins.js +0 -6
  198. package/dist/plugins.js.map +1 -1
  199. package/dist/runtime/command-dispatch.d.ts +18 -0
  200. package/dist/runtime/command-dispatch.d.ts.map +1 -0
  201. package/dist/runtime/command-dispatch.js +227 -0
  202. package/dist/runtime/command-dispatch.js.map +1 -0
  203. package/dist/runtime/command-registry.d.ts +31 -0
  204. package/dist/runtime/command-registry.d.ts.map +1 -0
  205. package/dist/runtime/command-registry.js +74 -0
  206. package/dist/runtime/command-registry.js.map +1 -0
  207. package/dist/runtime/config-merge.d.ts +4 -0
  208. package/dist/runtime/config-merge.d.ts.map +1 -0
  209. package/dist/runtime/config-merge.js +72 -0
  210. package/dist/runtime/config-merge.js.map +1 -0
  211. package/dist/runtime/config.d.ts +30 -0
  212. package/dist/runtime/config.d.ts.map +1 -0
  213. package/dist/runtime/config.js +173 -0
  214. package/dist/runtime/config.js.map +1 -0
  215. package/dist/runtime/debug.d.ts +3 -0
  216. package/dist/runtime/debug.d.ts.map +1 -0
  217. package/dist/runtime/debug.js +14 -0
  218. package/dist/runtime/debug.js.map +1 -0
  219. package/dist/runtime/deps.d.ts +28 -0
  220. package/dist/runtime/deps.d.ts.map +1 -0
  221. package/dist/runtime/deps.js +91 -0
  222. package/dist/runtime/deps.js.map +1 -0
  223. package/dist/runtime/extract-config-path.d.ts +2 -0
  224. package/dist/runtime/extract-config-path.d.ts.map +1 -0
  225. package/dist/runtime/extract-config-path.js +13 -0
  226. package/dist/runtime/extract-config-path.js.map +1 -0
  227. package/dist/runtime/global-flags.d.ts +16 -0
  228. package/dist/runtime/global-flags.d.ts.map +1 -0
  229. package/dist/runtime/global-flags.js +7 -0
  230. package/dist/runtime/global-flags.js.map +1 -0
  231. package/dist/runtime/help.d.ts +5 -0
  232. package/dist/runtime/help.d.ts.map +1 -0
  233. package/dist/runtime/help.js +94 -0
  234. package/dist/runtime/help.js.map +1 -0
  235. package/dist/runtime/journal-store.d.ts +31 -0
  236. package/dist/runtime/journal-store.d.ts.map +1 -0
  237. package/dist/runtime/journal-store.js +235 -0
  238. package/dist/runtime/journal-store.js.map +1 -0
  239. package/dist/runtime/json-output.d.ts +25 -0
  240. package/dist/runtime/json-output.d.ts.map +1 -0
  241. package/dist/runtime/json-output.js +50 -0
  242. package/dist/runtime/json-output.js.map +1 -0
  243. package/dist/runtime/logging.d.ts +3 -0
  244. package/dist/runtime/logging.d.ts.map +1 -0
  245. package/dist/runtime/logging.js +31 -0
  246. package/dist/runtime/logging.js.map +1 -0
  247. package/dist/runtime/migration-metadata.d.ts +5 -0
  248. package/dist/runtime/migration-metadata.d.ts.map +1 -0
  249. package/dist/runtime/migration-metadata.js +29 -0
  250. package/dist/runtime/migration-metadata.js.map +1 -0
  251. package/dist/runtime/migration-store.d.ts +22 -0
  252. package/dist/runtime/migration-store.d.ts.map +1 -0
  253. package/dist/runtime/migration-store.js +60 -0
  254. package/dist/runtime/migration-store.js.map +1 -0
  255. package/dist/runtime/plugin-runtime/errors.d.ts +3 -0
  256. package/dist/runtime/plugin-runtime/errors.d.ts.map +1 -0
  257. package/dist/runtime/plugin-runtime/errors.js +13 -0
  258. package/dist/runtime/plugin-runtime/errors.js.map +1 -0
  259. package/dist/runtime/plugin-runtime/executor-debug.d.ts +3 -0
  260. package/dist/runtime/plugin-runtime/executor-debug.d.ts.map +1 -0
  261. package/dist/runtime/plugin-runtime/executor-debug.js +65 -0
  262. package/dist/runtime/plugin-runtime/executor-debug.js.map +1 -0
  263. package/dist/runtime/plugin-runtime/hooks.d.ts +23 -0
  264. package/dist/runtime/plugin-runtime/hooks.d.ts.map +1 -0
  265. package/dist/runtime/plugin-runtime/hooks.js +148 -0
  266. package/dist/runtime/plugin-runtime/hooks.js.map +1 -0
  267. package/dist/runtime/plugin-runtime/index.d.ts +9 -0
  268. package/dist/runtime/plugin-runtime/index.d.ts.map +1 -0
  269. package/dist/runtime/plugin-runtime/index.js +184 -0
  270. package/dist/runtime/plugin-runtime/index.js.map +1 -0
  271. package/dist/runtime/plugin-runtime/loader.d.ts +11 -0
  272. package/dist/runtime/plugin-runtime/loader.d.ts.map +1 -0
  273. package/dist/runtime/plugin-runtime/loader.js +37 -0
  274. package/dist/runtime/plugin-runtime/loader.js.map +1 -0
  275. package/dist/runtime/plugin-runtime/null-executor.d.ts +3 -0
  276. package/dist/runtime/plugin-runtime/null-executor.d.ts.map +1 -0
  277. package/dist/runtime/plugin-runtime/null-executor.js +17 -0
  278. package/dist/runtime/plugin-runtime/null-executor.js.map +1 -0
  279. package/dist/runtime/safety-markers.d.ts +56 -0
  280. package/dist/runtime/safety-markers.d.ts.map +1 -0
  281. package/dist/runtime/safety-markers.js +211 -0
  282. package/dist/runtime/safety-markers.js.map +1 -0
  283. package/dist/runtime/schema-loader.d.ts +3 -0
  284. package/dist/runtime/schema-loader.d.ts.map +1 -0
  285. package/dist/runtime/schema-loader.js +11 -0
  286. package/dist/runtime/schema-loader.js.map +1 -0
  287. package/dist/runtime/table-scope.d.ts +33 -0
  288. package/dist/runtime/table-scope.d.ts.map +1 -0
  289. package/dist/runtime/table-scope.js +167 -0
  290. package/dist/runtime/table-scope.js.map +1 -0
  291. package/dist/runtime/user-config.d.ts +4 -0
  292. package/dist/runtime/user-config.d.ts.map +1 -0
  293. package/dist/runtime/user-config.js +11 -0
  294. package/dist/runtime/user-config.js.map +1 -0
  295. package/dist/runtime/version.d.ts +2 -0
  296. package/dist/runtime/version.d.ts.map +1 -0
  297. package/dist/runtime/version.js +5 -0
  298. package/dist/runtime/version.js.map +1 -0
  299. package/package.json +24 -6
@@ -0,0 +1,207 @@
1
+ import { mkdir, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { defineFlags, typedFlags } from '../../plugins.js';
4
+ import { resolveDirs } from '../../runtime/config.js';
5
+ import { GLOBAL_FLAGS } from '../../runtime/global-flags.js';
6
+ import { emitJson } from '../../runtime/json-output.js';
7
+ import { createJournalStore, resolveJournalTableName } from '../../runtime/journal-store.js';
8
+ import { extractMigrationMetadata } from '../../runtime/migration-metadata.js';
9
+ import { findChecksumMismatches, listMigrations, readSnapshot, } from '../../runtime/migration-store.js';
10
+ import { resolveTableScope, tableKeysFromDefinitions, } from '../../runtime/table-scope.js';
11
+ import { debug } from '../../runtime/debug.js';
12
+ import { applyMigration } from './apply.js';
13
+ import { scanDestructive } from './destructive.js';
14
+ import { confirmApply, confirmDestructiveExecution, isBackgroundOrCI, printDestructiveOperationDetails, } from './prompts.js';
15
+ import { filterPendingByScope } from './scope.js';
16
+ const MIGRATE_FLAGS = defineFlags([
17
+ { name: '--apply', type: 'boolean', description: 'Apply pending migrations on ClickHouse (no prompt)' },
18
+ { name: '--execute', type: 'boolean', description: 'Alias for --apply' },
19
+ { name: '--allow-destructive', type: 'boolean', description: 'Allow destructive migrations tagged with risk=danger' },
20
+ ]);
21
+ export const migrateCommand = {
22
+ name: 'migrate',
23
+ description: 'Review or execute pending migrations',
24
+ flags: MIGRATE_FLAGS,
25
+ run: cmdMigrate,
26
+ };
27
+ async function cmdMigrate(runCtx) {
28
+ const { flags, config, configPath, pluginRuntime, pluginContext } = runCtx;
29
+ const f = typedFlags(flags, [...GLOBAL_FLAGS, ...MIGRATE_FLAGS]);
30
+ const executeRequested = f['--apply'] === true || f['--execute'] === true;
31
+ const allowDestructive = f['--allow-destructive'] === true;
32
+ const tableSelector = f['--table'];
33
+ const jsonMode = f['--json'] === true;
34
+ const { migrationsDir, metaDir } = resolveDirs(config);
35
+ debug('migrate', `flags: execute=${executeRequested}, allowDestructive=${allowDestructive}, json=${jsonMode}`);
36
+ if (!pluginContext.hasExecutor) {
37
+ throw new Error('clickhouse config is required for migrate (journal is stored in ClickHouse)');
38
+ }
39
+ const db = pluginContext.executor;
40
+ const journalStore = createJournalStore(db);
41
+ const snapshot = await readSnapshot(metaDir);
42
+ const tableScope = resolveTableScope(tableSelector, tableKeysFromDefinitions(snapshot?.definitions ?? []));
43
+ const mode = executeRequested ? 'execute' : 'plan';
44
+ await pluginRuntime.runOnConfigLoaded({
45
+ command: 'migrate',
46
+ config,
47
+ configPath,
48
+ tableScope,
49
+ flags,
50
+ });
51
+ await mkdir(migrationsDir, { recursive: true });
52
+ const files = await listMigrations(migrationsDir);
53
+ const journal = await journalStore.readJournal();
54
+ const appliedNames = new Set(journal.applied.map((entry) => entry.name));
55
+ const pendingAll = files.filter((file) => !appliedNames.has(file));
56
+ debug('migrate', `migrations: total=${files.length}, applied=${journal.applied.length}, pending=${pendingAll.length}`);
57
+ const checksumMismatches = await findChecksumMismatches(migrationsDir, journal);
58
+ if (checksumMismatches.length > 0) {
59
+ debug('migrate', `checksum mismatches: ${checksumMismatches.map((m) => m.name).join(', ')}`);
60
+ if (jsonMode) {
61
+ emitJson('migrate', {
62
+ mode,
63
+ scope: tableScope,
64
+ error: 'Checksum mismatch detected on applied migrations',
65
+ checksumMismatches,
66
+ });
67
+ return 1;
68
+ }
69
+ throw new Error(`Checksum mismatch detected on applied migrations: ${checksumMismatches.map((item) => item.name).join(', ')}`);
70
+ }
71
+ if (tableScope.enabled && tableScope.matchCount === 0) {
72
+ if (jsonMode) {
73
+ emitJson('migrate', {
74
+ mode,
75
+ scope: tableScope,
76
+ pending: [],
77
+ applied: [],
78
+ warning: `No tables matched selector "${tableScope.selector ?? ''}".`,
79
+ });
80
+ }
81
+ else {
82
+ console.log(`No tables matched selector "${tableScope.selector ?? ''}". No migrations selected.`);
83
+ }
84
+ return 0;
85
+ }
86
+ let pending = pendingAll;
87
+ let undeterminedScope = [];
88
+ if (tableScope.enabled) {
89
+ const scoped = await filterPendingByScope(migrationsDir, pendingAll, new Set(tableScope.matchedTables));
90
+ pending = scoped.inScope;
91
+ undeterminedScope = scoped.undetermined;
92
+ }
93
+ if (pending.length === 0) {
94
+ if (jsonMode) {
95
+ emitJson('migrate', { mode, scope: tableScope, pending: [], applied: [] });
96
+ }
97
+ else {
98
+ console.log('No pending migrations.');
99
+ }
100
+ return 0;
101
+ }
102
+ if (jsonMode && !executeRequested) {
103
+ emitJson('migrate', {
104
+ mode,
105
+ scope: tableScope,
106
+ pending,
107
+ ...(undeterminedScope.length > 0 ? { undeterminedMigrations: undeterminedScope } : {}),
108
+ });
109
+ return 0;
110
+ }
111
+ if (!jsonMode) {
112
+ if (tableScope.enabled) {
113
+ console.log(`Table scope: ${tableScope.selector ?? ''} (${tableScope.matchCount} matched)`);
114
+ for (const table of tableScope.matchedTables)
115
+ console.log(`- ${table}`);
116
+ }
117
+ if (undeterminedScope.length > 0) {
118
+ console.log(`⚠ ${undeterminedScope.length} pending migration(s) have no table markers; ` +
119
+ "including them because their target tables can't be determined under --table:");
120
+ for (const file of undeterminedScope)
121
+ console.log(` - ${file}`);
122
+ }
123
+ console.log(`Pending migrations: ${pending.length}`);
124
+ for (const file of pending) {
125
+ console.log(`- ${file}`);
126
+ const sql = await readFile(join(migrationsDir, file), 'utf8');
127
+ const meta = extractMigrationMetadata(sql);
128
+ if (meta.log)
129
+ console.log(` ${meta.log}`);
130
+ }
131
+ }
132
+ if (!executeRequested) {
133
+ if (isBackgroundOrCI() || jsonMode) {
134
+ if (!jsonMode) {
135
+ console.log('\nPlan only. Re-run with --apply to apply and journal these migrations.');
136
+ }
137
+ return 0;
138
+ }
139
+ const confirmed = await confirmApply();
140
+ if (!confirmed) {
141
+ console.log('Migration apply cancelled by user.');
142
+ return 0;
143
+ }
144
+ }
145
+ const destructive = await scanDestructive(migrationsDir, pending);
146
+ let destructiveAllowed = allowDestructive || config.safety?.allowDestructive === true;
147
+ if (destructive.migrations.length > 0 && !destructiveAllowed) {
148
+ const error = 'Blocked destructive migration execution. Re-run with --allow-destructive or set safety.allowDestructive=true after review.';
149
+ if (jsonMode) {
150
+ emitJson('migrate', {
151
+ mode: 'execute',
152
+ scope: tableScope,
153
+ error,
154
+ destructiveMigrations: destructive.migrations,
155
+ destructiveOperations: destructive.operations,
156
+ });
157
+ return 3;
158
+ }
159
+ if (isBackgroundOrCI()) {
160
+ printDestructiveOperationDetails(destructive.operations);
161
+ throw new Error(`${error}\nDestructive migrations: ${destructive.migrations.join(', ')}\n` +
162
+ 'Non-interactive run detected. Pass --allow-destructive to proceed.');
163
+ }
164
+ const confirmed = await confirmDestructiveExecution(destructive.operations);
165
+ if (!confirmed) {
166
+ throw new Error(`Destructive migration cancelled by user.\nDestructive migrations: ${destructive.migrations.join(', ')}`);
167
+ }
168
+ destructiveAllowed = true;
169
+ }
170
+ if (destructive.migrations.length > 0 && !destructiveAllowed) {
171
+ throw new Error('Blocked destructive migration execution.');
172
+ }
173
+ const appliedNow = [];
174
+ for (const file of pending) {
175
+ if (!jsonMode) {
176
+ const sql = await readFile(join(migrationsDir, file), 'utf8');
177
+ const meta = extractMigrationMetadata(sql);
178
+ if (meta.log)
179
+ console.log(` ${meta.log}`);
180
+ }
181
+ const entry = await applyMigration({
182
+ db,
183
+ journalStore,
184
+ pluginRuntime,
185
+ config,
186
+ tableScope,
187
+ flags,
188
+ migrationsDir,
189
+ file,
190
+ });
191
+ appliedNow.push(entry);
192
+ if (!jsonMode)
193
+ console.log(`Applied: ${file}`);
194
+ }
195
+ if (jsonMode) {
196
+ emitJson('migrate', {
197
+ mode: 'execute',
198
+ scope: tableScope,
199
+ applied: appliedNow,
200
+ ...(undeterminedScope.length > 0 ? { undeterminedMigrations: undeterminedScope } : {}),
201
+ });
202
+ return 0;
203
+ }
204
+ console.log(`\nMigrations recorded in ClickHouse ${resolveJournalTableName()} table.`);
205
+ return 0;
206
+ }
207
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/migrate/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,YAAY,GAEb,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EACL,YAAY,EACZ,2BAA2B,EAC3B,gBAAgB,EAChB,gCAAgC,GACjC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,aAAa,GAAG,WAAW,CAAC;IAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oDAAoD,EAAE;IACvG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACxE,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sDAAsD,EAAE;CAC7G,CAAC,CAAA;AAEX,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,sCAAsC;IACnD,KAAK,EAAE,aAAa;IACpB,GAAG,EAAE,UAAU;CAChB,CAAA;AAED,KAAK,UAAU,UAAU,CACvB,MAA0D;IAE1D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAC1E,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAU,CAAC,CAAA;IACzE,MAAM,gBAAgB,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAA;IACzE,MAAM,gBAAgB,GAAG,CAAC,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAA;IAC1D,MAAM,aAAa,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAErC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IACtD,KAAK,CAAC,SAAS,EAAE,kBAAkB,gBAAgB,sBAAsB,gBAAgB,UAAU,QAAQ,EAAE,CAAC,CAAA;IAE9G,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAA;IACjC,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,EAAE,wBAAwB,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,CAAA;IAC1G,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;IAElD,MAAM,aAAa,CAAC,iBAAiB,CAAC;QACpC,OAAO,EAAE,SAAS;QAClB,MAAM;QACN,UAAU;QACV,UAAU;QACV,KAAK;KACN,CAAC,CAAA;IAEF,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,CAAA;IAChD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,KAAK,CAAC,SAAS,EAAE,qBAAqB,KAAK,CAAC,MAAM,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAEtH,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IAC/E,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,SAAS,EAAE,wBAAwB,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5F,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,EAAE;gBAClB,IAAI;gBACJ,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,kDAAkD;gBACzD,kBAAkB;aACnB,CAAC,CAAA;YACF,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,IAAI,KAAK,CACb,qDAAqD,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9G,CAAA;IACH,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,EAAE;gBAClB,IAAI;gBACJ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,+BAA+B,UAAU,CAAC,QAAQ,IAAI,EAAE,IAAI;aACtE,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,CAAC,QAAQ,IAAI,EAAE,4BAA4B,CAAC,CAAA;QACnG,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,OAAO,GAAG,UAAU,CAAA;IACxB,IAAI,iBAAiB,GAAa,EAAE,CAAA;IACpC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,aAAa,EACb,UAAU,EACV,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAClC,CAAA;QACD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QACxB,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAA;IACzC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,QAAQ,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE;YAClB,IAAI;YACJ,KAAK,EAAE,UAAU;YACjB,OAAO;YACP,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,CAAC,CAAA;QACF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,QAAQ,IAAI,EAAE,KAAK,UAAU,CAAC,UAAU,WAAW,CAAC,CAAA;YAC3F,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CACT,KAAK,iBAAiB,CAAC,MAAM,+CAA+C;gBAC1E,+EAA+E,CAClF,CAAA;YACD,KAAK,MAAM,IAAI,IAAI,iBAAiB;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACpD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACxB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YAC7D,MAAM,IAAI,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,IAAI,gBAAgB,EAAE,IAAI,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAA;YACxF,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAA;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;YACjD,OAAO,CAAC,CAAA;QACV,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACjE,IAAI,kBAAkB,GAAG,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACrF,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC7D,MAAM,KAAK,GACT,4HAA4H,CAAA;QAC9H,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,EAAE;gBAClB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,UAAU;gBACjB,KAAK;gBACL,qBAAqB,EAAE,WAAW,CAAC,UAAU;gBAC7C,qBAAqB,EAAE,WAAW,CAAC,UAAU;aAC9C,CAAC,CAAA;YACF,OAAO,CAAC,CAAA;QACV,CAAC;QAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;YACvB,gCAAgC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;YACxD,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,6BAA6B,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACxE,oEAAoE,CACvE,CAAA;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,qEAAqE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzG,CAAA;QACH,CAAC;QACD,kBAAkB,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,UAAU,GAA4B,EAAE,CAAA;IAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YAC7D,MAAM,IAAI,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC;YACjC,EAAE;YACF,YAAY;YACZ,aAAa;YACb,MAAM;YACN,UAAU;YACV,KAAK;YACL,aAAa;YACb,IAAI;SACL,CAAC,CAAA;QACF,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,SAAS,EAAE;YAClB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,UAAU;YACnB,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,CAAC,CAAA;QACF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,uBAAuB,EAAE,SAAS,CAAC,CAAA;IACtF,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type DestructiveOperationMarker } from '../../runtime/safety-markers.js';
2
+ export interface DestructiveScan {
3
+ migrations: string[];
4
+ operations: DestructiveOperationMarker[];
5
+ }
6
+ export declare function scanDestructive(migrationsDir: string, pending: string[]): Promise<DestructiveScan>;
7
+ //# sourceMappingURL=destructive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/destructive.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,0BAA0B,EAChC,MAAM,iCAAiC,CAAA;AAExC,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,UAAU,EAAE,0BAA0B,EAAE,CAAA;CACzC;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,eAAe,CAAC,CAkB1B"}
@@ -0,0 +1,24 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { collectDestructiveOperationMarkers, collectUnmarkedDestructiveStatements, migrationContainsDangerOperation, migrationContainsDestructiveSql, } from '../../runtime/safety-markers.js';
4
+ export async function scanDestructive(migrationsDir, pending) {
5
+ const migrations = [];
6
+ const operations = [];
7
+ for (const file of pending) {
8
+ const sql = await readFile(join(migrationsDir, file), 'utf8');
9
+ if (migrationContainsDangerOperation(sql)) {
10
+ // Generated migration with planner risk markers (unchanged behavior).
11
+ migrations.push(file);
12
+ operations.push(...collectDestructiveOperationMarkers(file, sql));
13
+ }
14
+ else if (migrationContainsDestructiveSql(sql)) {
15
+ // Destructive SQL at a marker-less position: a fully hand-written
16
+ // migration, or a statement hand-appended to a generated one. Planner-
17
+ // marked statements (incl. non-danger drops) are trusted and not re-scanned.
18
+ migrations.push(file);
19
+ operations.push(...collectUnmarkedDestructiveStatements(file, sql));
20
+ }
21
+ }
22
+ return { migrations, operations };
23
+ }
24
+ //# sourceMappingURL=destructive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive.js","sourceRoot":"","sources":["../../../src/commands/migrate/destructive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EACL,kCAAkC,EAClC,oCAAoC,EACpC,gCAAgC,EAChC,+BAA+B,GAEhC,MAAM,iCAAiC,CAAA;AAOxC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,OAAiB;IAEjB,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAiC,EAAE,CAAA;IACnD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;QAC7D,IAAI,gCAAgC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,sEAAsE;YACtE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,UAAU,CAAC,IAAI,CAAC,GAAG,kCAAkC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACnE,CAAC;aAAM,IAAI,+BAA+B,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,kEAAkE;YAClE,uEAAuE;YACvE,6EAA6E;YAC7E,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,UAAU,CAAC,IAAI,CAAC,GAAG,oCAAoC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA;AACnC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DestructiveOperationMarker } from '../../runtime/safety-markers.js';
2
+ export declare function isBackgroundOrCI(): boolean;
3
+ export declare function printDestructiveOperationDetails(markers: DestructiveOperationMarker[]): void;
4
+ export declare function confirmApply(): Promise<boolean>;
5
+ export declare function confirmDestructiveExecution(markers: DestructiveOperationMarker[]): Promise<boolean>;
6
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAEjF,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAW5F;AAcD,wBAAgB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/C;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,0BAA0B,EAAE,GACpC,OAAO,CAAC,OAAO,CAAC,CAGlB"}
@@ -0,0 +1,40 @@
1
+ import process from 'node:process';
2
+ import { createInterface } from 'node:readline/promises';
3
+ export function isBackgroundOrCI() {
4
+ return (process.env.CI === '1' ||
5
+ process.env.CI === 'true' ||
6
+ !process.stdin.isTTY ||
7
+ !process.stdout.isTTY);
8
+ }
9
+ export function printDestructiveOperationDetails(markers) {
10
+ console.log('Destructive operations detected:');
11
+ for (const [index, marker] of markers.entries()) {
12
+ console.log(`${index + 1}. ${marker.migration}`);
13
+ console.log(` operation: ${marker.type}`);
14
+ console.log(` key: ${marker.key}`);
15
+ console.log(` warning: ${marker.warningCode}`);
16
+ console.log(` reason: ${marker.reason}`);
17
+ console.log(` impact: ${marker.impact}`);
18
+ console.log(` recommendation: ${marker.recommendation}`);
19
+ }
20
+ }
21
+ async function promptYes(message) {
22
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
23
+ try {
24
+ console.log('');
25
+ console.log('Type "yes" to continue. Any other input cancels.');
26
+ const response = await rl.question(message);
27
+ return response.trim().toLowerCase() === 'yes';
28
+ }
29
+ finally {
30
+ rl.close();
31
+ }
32
+ }
33
+ export function confirmApply() {
34
+ return promptYes('Apply pending migrations now? [no/yes]: ');
35
+ }
36
+ export async function confirmDestructiveExecution(markers) {
37
+ printDestructiveOperationDetails(markers);
38
+ return promptYes('Apply destructive operations? [no/yes]: ');
39
+ }
40
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;QACzB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAqC;IACpF,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5E,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC3C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;IAChD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqC;IAErC,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACzC,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ScopeFilterResult {
2
+ /** Migrations to apply under the scope (matched + fail-safe-included). */
3
+ inScope: string[];
4
+ /**
5
+ * Migrations included because their target tables could NOT be determined
6
+ * (no parseable `-- operation:` markers — e.g. hand-written migrations).
7
+ * Surfaced to the caller so it can warn instead of silently skipping them.
8
+ */
9
+ undetermined: string[];
10
+ }
11
+ export declare function filterPendingByScope(migrationsDir: string, pending: string[], selectedTables: ReadonlySet<string>): Promise<ScopeFilterResult>;
12
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/scope.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;;;OAIG;IACH,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EAAE,EACjB,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAmC5B"}
@@ -0,0 +1,35 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { extractMigrationOperationSummaries } from '../../runtime/safety-markers.js';
4
+ import { databaseKeyFromOperationKey, tableKeyFromOperationKey, } from '../../runtime/table-scope.js';
5
+ export async function filterPendingByScope(migrationsDir, pending, selectedTables) {
6
+ const selectedDatabases = new Set([...selectedTables].map((table) => table.split('.')[0] ?? ''));
7
+ const inScope = [];
8
+ const undetermined = [];
9
+ for (const file of pending) {
10
+ const sql = await readFile(join(migrationsDir, file), 'utf8');
11
+ const operations = extractMigrationOperationSummaries(sql);
12
+ // A migration with no parseable operation markers (a hand-written one) has
13
+ // undeterminable target tables. Silently skipping it under --table is a
14
+ // quiet correctness gap (#36): the user believes all pending work applied.
15
+ // Fail-safe by including it, and report it so the caller can warn.
16
+ if (operations.length === 0) {
17
+ inScope.push(file);
18
+ undetermined.push(file);
19
+ continue;
20
+ }
21
+ const matches = operations.some((operation) => {
22
+ const tableKey = tableKeyFromOperationKey(operation.key);
23
+ if (tableKey)
24
+ return selectedTables.has(tableKey);
25
+ const database = databaseKeyFromOperationKey(operation.key);
26
+ if (database)
27
+ return selectedDatabases.has(database);
28
+ return false;
29
+ });
30
+ if (matches)
31
+ inScope.push(file);
32
+ }
33
+ return { inScope, undetermined };
34
+ }
35
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/commands/migrate/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAA;AACpF,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,8BAA8B,CAAA;AAarC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,aAAqB,EACrB,OAAiB,EACjB,cAAmC;IAEnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAC9D,CAAA;IAED,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;QAC7D,MAAM,UAAU,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAA;QAE1D,2EAA2E;QAC3E,wEAAwE;QACxE,2EAA2E;QAC3E,mEAAmE;QACnE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvB,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACxD,IAAI,QAAQ;gBAAE,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAEjD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAC3D,IAAI,QAAQ;gBAAE,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAEpD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ChxPluginCommand } from '../plugins.js';
2
+ export declare const pluginCommand: ChxPluginCommand;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,gBAAgB,EAAoB,MAAM,eAAe,CAAA;AAOnF,eAAO,MAAM,aAAa,EAAE,gBAK3B,CAAA"}
@@ -0,0 +1,129 @@
1
+ import { typedFlags } from '../plugins.js';
2
+ import { GLOBAL_FLAGS } from '../runtime/global-flags.js';
3
+ import { emitJson, printOutput } from '../runtime/json-output.js';
4
+ import { parseFlags, UnknownFlagError, MissingFlagValueError } from '@chkit/core';
5
+ import { resolveTableScope, tableKeysFromDefinitions } from '../runtime/table-scope.js';
6
+ import { loadSchemaDefinitions } from '../runtime/schema-loader.js';
7
+ export const pluginCommand = {
8
+ name: 'plugin',
9
+ description: 'List plugins and run plugin namespace commands',
10
+ flags: [],
11
+ run: cmdPlugin,
12
+ };
13
+ async function cmdPlugin(ctx) {
14
+ const { flags, args, config, configPath, pluginRuntime } = ctx;
15
+ const jsonMode = flags['--json'] === true;
16
+ const pluginName = args[0];
17
+ const commandName = args[1];
18
+ const commandArgs = args.slice(2);
19
+ if (pluginRuntime.plugins.length === 0) {
20
+ if (jsonMode) {
21
+ emitJson('plugin', {
22
+ error: 'No plugins configured. Add entries to config.plugins first.',
23
+ plugins: [],
24
+ });
25
+ return 1;
26
+ }
27
+ throw new Error('No plugins configured. Add entries to config.plugins first.');
28
+ }
29
+ if (!pluginName) {
30
+ const payload = {
31
+ plugins: pluginRuntime.plugins.map((entry) => ({
32
+ name: entry.plugin.manifest.name,
33
+ version: entry.plugin.manifest.version ?? null,
34
+ commands: (entry.plugin.commands ?? []).map((command) => ({
35
+ name: command.name,
36
+ description: command.description ?? '',
37
+ })),
38
+ })),
39
+ };
40
+ if (jsonMode) {
41
+ emitJson('plugin', payload);
42
+ return 0;
43
+ }
44
+ console.log('Configured plugins:');
45
+ for (const plugin of payload.plugins) {
46
+ console.log(`- ${plugin.name}${plugin.version ? ` (v${plugin.version})` : ''}`);
47
+ if (plugin.commands.length === 0) {
48
+ console.log(' (no commands)');
49
+ continue;
50
+ }
51
+ for (const command of plugin.commands) {
52
+ console.log(` - ${command.name}${command.description ? `: ${command.description}` : ''}`);
53
+ }
54
+ }
55
+ return 0;
56
+ }
57
+ const selectedPlugin = pluginRuntime.plugins.find((entry) => entry.plugin.manifest.name === pluginName);
58
+ if (!selectedPlugin) {
59
+ const known = pluginRuntime.plugins.map((entry) => entry.plugin.manifest.name).sort();
60
+ throw new Error(`Unknown plugin "${pluginName}". Available: ${known.length > 0 ? known.join(', ') : '(none)'}.`);
61
+ }
62
+ if (!commandName) {
63
+ const commands = (selectedPlugin.plugin.commands ?? []).map((command) => ({
64
+ name: command.name,
65
+ description: command.description ?? '',
66
+ }));
67
+ const payload = {
68
+ plugin: selectedPlugin.plugin.manifest.name,
69
+ commands,
70
+ };
71
+ if (jsonMode) {
72
+ emitJson('plugin', payload);
73
+ return 0;
74
+ }
75
+ if (commands.length === 0) {
76
+ console.log(`Plugin "${selectedPlugin.plugin.manifest.name}" has no registered commands.`);
77
+ return 0;
78
+ }
79
+ console.log(`Plugin commands for "${selectedPlugin.plugin.manifest.name}":`);
80
+ for (const command of commands) {
81
+ console.log(`- ${command.name}${command.description ? `: ${command.description}` : ''}`);
82
+ }
83
+ return 0;
84
+ }
85
+ const gf = typedFlags(flags, GLOBAL_FLAGS);
86
+ const tableSelector = gf['--table'];
87
+ let tableScope;
88
+ try {
89
+ const definitions = await loadSchemaDefinitions(ctx.config.schema);
90
+ tableScope = resolveTableScope(tableSelector, tableKeysFromDefinitions(definitions));
91
+ }
92
+ catch {
93
+ tableScope = resolveTableScope(tableSelector, []);
94
+ }
95
+ // Parse plugin-specific flags when the command declares them
96
+ const targetCommand = (selectedPlugin.plugin.commands ?? []).find((cmd) => cmd.name === commandName);
97
+ let mergedFlags = { ...flags };
98
+ if (targetCommand?.flags && targetCommand.flags.length > 0) {
99
+ try {
100
+ const parsed = parseFlags(commandArgs, targetCommand.flags);
101
+ mergedFlags = { ...flags, ...parsed };
102
+ }
103
+ catch (error) {
104
+ if (error instanceof UnknownFlagError || error instanceof MissingFlagValueError) {
105
+ if (jsonMode) {
106
+ emitJson('plugin', { ok: false, error: error.message });
107
+ }
108
+ else {
109
+ console.error(error.message);
110
+ }
111
+ return 1;
112
+ }
113
+ throw error;
114
+ }
115
+ }
116
+ const exitCode = await pluginRuntime.runPluginCommand(pluginName, commandName, {
117
+ config,
118
+ configPath,
119
+ jsonMode,
120
+ tableScope,
121
+ args: commandArgs,
122
+ flags: mergedFlags,
123
+ print(value) {
124
+ printOutput(value, jsonMode);
125
+ },
126
+ });
127
+ return exitCode;
128
+ }
129
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ClickHouseJsonQueryResult } from '@chkit/clickhouse';
2
+ import type { ChxPluginCommand } from '../plugins.js';
3
+ export declare const queryCommand: ChxPluginCommand;
4
+ /**
5
+ * ClickHouse syntax errors echo back the query — including the `FORMAT JSON`
6
+ * clause chkit injects, which the user never typed — and can append a ~40-item
7
+ * "Expected one of" token dump. Strip the injected FORMAT clause and cap the
8
+ * token list so the message reflects the SQL the user actually wrote. Returns
9
+ * the original error untouched when there is nothing to clean (e.g. connection
10
+ * errors already formatted upstream).
11
+ */
12
+ export declare function cleanQueryError(error: unknown): unknown;
13
+ export declare function formatQueryJson(payload: ClickHouseJsonQueryResult): string;
14
+ export declare function formatRows(rows: Record<string, unknown>[], options?: {
15
+ limit?: number;
16
+ }): string;
17
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAIrD,eAAO,MAAM,YAAY,EAAE,gBA8C1B,CAAA;AAKD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAiBvD;AAUD,wBAAgB,eAAe,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CAE1E;AAoCD,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,MAAM,CA0CR"}