@webiny/data-migration 0.0.0-unstable.de38392959 → 0.0.0-unstable.e0bfc55d5a

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 (49) hide show
  1. package/MigrationRunner.d.ts +6 -4
  2. package/MigrationRunner.js +58 -5
  3. package/MigrationRunner.js.map +1 -1
  4. package/cli/CliMigrationRunReporter.d.ts +3 -3
  5. package/cli/CliMigrationRunReporter.js.map +1 -1
  6. package/cli/InteractiveCliStatusReporter.d.ts +3 -3
  7. package/cli/InteractiveCliStatusReporter.js.map +1 -1
  8. package/cli/LogReporter.js.map +1 -1
  9. package/cli/LogStream.js.map +1 -1
  10. package/cli/MigrationRunReporter.d.ts +1 -1
  11. package/cli/MigrationRunReporter.js.map +1 -1
  12. package/cli/MigrationRunner.d.ts +4 -3
  13. package/cli/MigrationRunner.js.map +1 -1
  14. package/cli/MigrationStatusReporter.d.ts +1 -1
  15. package/cli/MigrationStatusReporter.js.map +1 -1
  16. package/cli/NonInteractiveCliStatusReporter.d.ts +3 -3
  17. package/cli/NonInteractiveCliStatusReporter.js.map +1 -1
  18. package/cli/VoidStatusReporter.d.ts +1 -1
  19. package/cli/VoidStatusReporter.js.map +1 -1
  20. package/cli/getDuration.js.map +1 -1
  21. package/cli/index.d.ts +1 -0
  22. package/cli/index.js +11 -0
  23. package/cli/index.js.map +1 -1
  24. package/createPinoLogger.d.ts +4 -60
  25. package/createPinoLogger.js.map +1 -1
  26. package/createTable.d.ts +2 -2
  27. package/createTable.js +0 -1
  28. package/createTable.js.map +1 -1
  29. package/handlers/createDdbEsProjectMigration.d.ts +5 -5
  30. package/handlers/createDdbEsProjectMigration.js +2 -1
  31. package/handlers/createDdbEsProjectMigration.js.map +1 -1
  32. package/handlers/createDdbProjectMigration.d.ts +4 -4
  33. package/handlers/createDdbProjectMigration.js +2 -1
  34. package/handlers/createDdbProjectMigration.js.map +1 -1
  35. package/handlers/createPatternMatcher.d.ts +1 -1
  36. package/handlers/createPatternMatcher.js.map +1 -1
  37. package/handlers/devVersionErrorResponse.js.map +1 -1
  38. package/index.d.ts +0 -1
  39. package/index.js +0 -11
  40. package/index.js.map +1 -1
  41. package/package.json +17 -29
  42. package/repository/createStandardEntity.d.ts +2 -1
  43. package/repository/createStandardEntity.js.map +1 -1
  44. package/repository/migrations.repository.d.ts +2 -2
  45. package/repository/migrations.repository.js.map +1 -1
  46. package/symbols.js +7 -14
  47. package/symbols.js.map +1 -1
  48. package/types.d.ts +4 -3
  49. package/types.js.map +1 -1
@@ -1,6 +1,6 @@
1
- import { Logger } from "@webiny/logger";
2
- import { MigrationRepository, DataMigration, ExecutionTimeLimiter, MigrationStatus } from "./types";
3
- export declare type IsMigrationApplicable = (migration: DataMigration) => boolean;
1
+ import type { Logger } from "@webiny/logger";
2
+ import type { MigrationRepository, DataMigration, ExecutionTimeLimiter, MigrationStatus } from "./types";
3
+ export type IsMigrationApplicable = (migration: DataMigration) => boolean;
4
4
  export declare class MigrationRunner {
5
5
  private readonly logger;
6
6
  private readonly migrations;
@@ -9,7 +9,7 @@ export declare class MigrationRunner {
9
9
  private context;
10
10
  constructor(repository: MigrationRepository, timeLimiter: ExecutionTimeLimiter, migrations: DataMigration[], logger: Logger | undefined);
11
11
  setContext(context: Record<string, any>): void;
12
- execute(projectVersion: string, isApplicable?: IsMigrationApplicable): Promise<void>;
12
+ execute(projectVersion: string, isApplicable?: IsMigrationApplicable, forceExecute?: boolean): Promise<void>;
13
13
  getStatus(): Promise<MigrationStatus>;
14
14
  private validateIds;
15
15
  private createCheckpoint;
@@ -17,4 +17,6 @@ export declare class MigrationRunner {
17
17
  private getOrCreateRunItem;
18
18
  private setRunItem;
19
19
  private setRunItemAndSave;
20
+ private printForceExecuteEnvVars;
21
+ private printSkipExecuteEnvVars;
20
22
  }
@@ -18,10 +18,24 @@ const getRunItemDuration = runItem => {
18
18
  }
19
19
  return new Date(runItem.finishedOn).getTime() - new Date(runItem.startedOn).getTime();
20
20
  };
21
+
22
+ /**
23
+ * This allows us to force-execute a migration, even if it's not in the list of the applicable migrations.
24
+ * Example: WEBINY_MIGRATION_FORCE_EXECUTE_5_35_0_006=true
25
+ */
21
26
  const shouldForceExecute = mig => {
22
27
  const key = `WEBINY_MIGRATION_FORCE_EXECUTE_${mig.getId().replace(/[\.\-]/g, "_")}`;
23
28
  return process.env[key] === "true";
24
29
  };
30
+
31
+ /**
32
+ * This allows us to always skip a migration.
33
+ * Example: WEBINY_MIGRATION_SKIP_5_35_0_006=true
34
+ */
35
+ const shouldSkip = mig => {
36
+ const key = `WEBINY_MIGRATION_SKIP_${mig.getId().replace(/[\.\-]/g, "_")}`;
37
+ return process.env[key] === "true";
38
+ };
25
39
  class MigrationNotFinished extends Error {}
26
40
  class MigrationInProgress extends Error {}
27
41
  class MigrationRunner {
@@ -38,7 +52,9 @@ class MigrationRunner {
38
52
  setContext(context) {
39
53
  this.context = context;
40
54
  }
41
- async execute(projectVersion, isApplicable) {
55
+ async execute(projectVersion, isApplicable,
56
+ // Force execute applicable migrations.
57
+ forceExecute = false) {
42
58
  const lastRun = await this.getOrCreateRun();
43
59
  try {
44
60
  this.validateIds(this.migrations);
@@ -83,7 +99,19 @@ class MigrationRunner {
83
99
  return mig.getId() > startingId && mig.getId() <= lastId;
84
100
  };
85
101
  const isMigrationApplicable = isApplicable || defaultIsApplicable;
102
+ this.printForceExecuteEnvVars();
103
+ this.printSkipExecuteEnvVars();
104
+ if (forceExecute) {
105
+ this.logger.info(`ALL APPLICABLE MIGRATIONS WILL BE FORCE-EXECUTED! (via --force flag)`);
106
+ }
86
107
  const executableMigrations = this.migrations.filter(mig => {
108
+ if (shouldSkip(mig)) {
109
+ this.setRunItem(lastRun, {
110
+ id: mig.getId(),
111
+ status: "skipped"
112
+ });
113
+ return false;
114
+ }
87
115
  if (shouldForceExecute(mig)) {
88
116
  return true;
89
117
  }
@@ -115,7 +143,7 @@ class MigrationRunner {
115
143
  projectVersion,
116
144
  logger,
117
145
  checkpoint,
118
- forceExecute: shouldForceExecute(migration),
146
+ forceExecute: forceExecute || shouldForceExecute(migration),
119
147
  runningOutOfTime: shouldCreateCheckpoint,
120
148
  createCheckpoint: async data => {
121
149
  await this.createCheckpoint(migration, data);
@@ -127,7 +155,7 @@ class MigrationRunner {
127
155
  }
128
156
  };
129
157
  try {
130
- const shouldExecute = checkpoint || shouldForceExecute(migration) ? true : await migration.shouldExecute(context);
158
+ const shouldExecute = checkpoint || context.forceExecute ? true : await migration.shouldExecute(context);
131
159
  if (!shouldExecute) {
132
160
  this.logger.info(`Skipping migration %s.`, migration.getId());
133
161
  runItem.status = "skipped";
@@ -167,12 +195,15 @@ class MigrationRunner {
167
195
  this.logger.error(err, err.message);
168
196
  return;
169
197
  } finally {
170
- // We sum duration from the previous run with the current run.
171
198
  runItem.finishedOn = getCurrentISOTime();
172
199
 
173
200
  // Update run stats.
174
201
  await this.setRunItemAndSave(lastRun, runItem);
175
- this.logger.info(`Finished executing migration %s in %sms.`, migration.getId(), getRunItemDuration(runItem));
202
+ if (runItem.status === "pending") {
203
+ this.logger.info(`Pausing migration %s, awaiting continuation.`, migration.getId());
204
+ } else {
205
+ this.logger.info(`Finished executing migration %s in %sms.`, migration.getId(), getRunItemDuration(runItem));
206
+ }
176
207
  }
177
208
  await this.repository.logMigration({
178
209
  id: migration.getId(),
@@ -276,6 +307,28 @@ class MigrationRunner {
276
307
  this.setRunItem(run, item);
277
308
  await this.repository.saveRun(run);
278
309
  }
310
+ printForceExecuteEnvVars() {
311
+ const forceKeys = Object.keys(process.env).filter(key => key.startsWith("WEBINY_MIGRATION_FORCE_EXECUTE_"));
312
+ if (!forceKeys.length) {
313
+ this.logger.info(`No migrations are enforced via WEBINY_MIGRATION_FORCE_EXECUTE environment variable.`);
314
+ return;
315
+ }
316
+ this.logger.info(`FORCED MIGRATIONS DETECTED!`);
317
+ for (const key of forceKeys) {
318
+ this.logger.info(`${key}=${process.env[key]}`);
319
+ }
320
+ }
321
+ printSkipExecuteEnvVars() {
322
+ const skipKeys = Object.keys(process.env).filter(key => key.startsWith("WEBINY_MIGRATION_SKIP_"));
323
+ if (!skipKeys.length) {
324
+ this.logger.info(`No migrations are skipped via WEBINY_MIGRATION_SKIP environment variable.`);
325
+ return;
326
+ }
327
+ this.logger.info(`SKIPPED MIGRATIONS DETECTED!`);
328
+ for (const key of skipKeys) {
329
+ this.logger.info(`${key}=${process.env[key]}`);
330
+ }
331
+ }
279
332
  }
280
333
  exports.MigrationRunner = MigrationRunner;
281
334
  (0, _ioc.makeInjectable)(MigrationRunner, [(0, _ioc.inject)(_symbols.MigrationRepositorySymbol), (0, _ioc.inject)(_symbols.ExecutionTimeLimiterSymbol), (0, _ioc.inject)(_symbols.MigrationSymbol, {
@@ -1 +1 @@
1
- {"version":3,"names":["_semver","require","_ioc","_utils","_symbols","_createPinoLogger","getCurrentISOTime","Date","toISOString","getRunItemDuration","runItem","startedOn","finishedOn","getTime","shouldForceExecute","mig","key","getId","replace","process","env","MigrationNotFinished","Error","MigrationInProgress","MigrationRunner","context","constructor","repository","timeLimiter","migrations","logger","createPinoLogger","setContext","execute","projectVersion","isApplicable","lastRun","getOrCreateRun","validateIds","err","status","error","message","saveRun","latestMigration","listMigrations","limit","info","currentVersion","coerce","startingId","id","lastId","logMigration","description","reason","defaultIsApplicable","isMigrationApplicable","executableMigrations","filter","setRunItem","sort","a","b","length","shouldCreateCheckpoint","migration","getOrCreateRunItem","checkpoint","getCheckpoint","getChildLogger","forceExecute","runningOutOfTime","createCheckpoint","data","createCheckpointAndExit","shouldExecute","setRunItemAndSave","getDescription","name","stack","code","deleteCheckpoint","getStatus","getLastRun","withDescriptions","map","dataMigration","find","dm","ids","Set","endsWith","has","add","executeWithRetry","resolvedStatus","unresolvedStatus","includes","mdbid","run","existingItem","item","index","findIndex","push","slice","exports","makeInjectable","inject","MigrationRepositorySymbol","ExecutionTimeLimiterSymbol","MigrationSymbol","multi","optional","LoggerSymbol"],"sources":["MigrationRunner.ts"],"sourcesContent":["import { coerce } from \"semver\";\nimport { Logger } from \"@webiny/logger\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { executeWithRetry, mdbid } from \"@webiny/utils\";\nimport {\n MigrationRepositorySymbol,\n LoggerSymbol,\n MigrationSymbol,\n ExecutionTimeLimiterSymbol\n} from \"./symbols\";\nimport { createPinoLogger, getChildLogger } from \"./createPinoLogger\";\nimport {\n MigrationRepository,\n DataMigration,\n DataMigrationContext,\n ExecutionTimeLimiter,\n MigrationRun,\n MigrationStatus,\n MigrationRunItem\n} from \"~/types\";\n\nexport type IsMigrationApplicable = (migration: DataMigration) => boolean;\n\nconst getCurrentISOTime = () => {\n return new Date().toISOString();\n};\n\nconst getRunItemDuration = (runItem: MigrationRunItem) => {\n if (!runItem.startedOn || !runItem.finishedOn) {\n return \"N/A\";\n }\n\n return new Date(runItem.finishedOn).getTime() - new Date(runItem.startedOn).getTime();\n};\n\nconst shouldForceExecute = (mig: DataMigration) => {\n const key = `WEBINY_MIGRATION_FORCE_EXECUTE_${mig.getId().replace(/[\\.\\-]/g, \"_\")}`;\n\n return process.env[key] === \"true\";\n};\n\nclass MigrationNotFinished extends Error {}\nclass MigrationInProgress extends Error {}\n\nexport class MigrationRunner {\n private readonly logger: Logger;\n private readonly migrations: DataMigration[];\n private readonly repository: MigrationRepository;\n private readonly timeLimiter: ExecutionTimeLimiter;\n private context: Record<string, any> = {};\n\n constructor(\n repository: MigrationRepository,\n timeLimiter: ExecutionTimeLimiter,\n migrations: DataMigration[],\n logger: Logger | undefined\n ) {\n this.repository = repository;\n this.timeLimiter = timeLimiter;\n this.migrations = migrations || [];\n\n if (!logger) {\n logger = createPinoLogger();\n }\n this.logger = logger;\n }\n\n setContext(context: Record<string, any>) {\n this.context = context;\n }\n\n async execute(projectVersion: string, isApplicable?: IsMigrationApplicable) {\n const lastRun = await this.getOrCreateRun();\n\n try {\n this.validateIds(this.migrations);\n } catch (err) {\n lastRun.status = \"error\";\n lastRun.error = {\n message: err.message\n };\n await this.repository.saveRun(lastRun);\n return;\n }\n\n const [latestMigration] = await this.repository.listMigrations({ limit: 1 });\n\n this.logger.info(`Project version is %s.`, projectVersion);\n\n // Get current version, and coerce it to a valid SemVer.\n // With this, we can run migrations targeted for stable versions, released under a preid tag (e.g., `beta`).\n const currentVersion = coerce(projectVersion) + \"\";\n const startingId = latestMigration ? latestMigration.id : `${currentVersion}-000`;\n const lastId = `${currentVersion}-999`;\n\n // Create initial migration record.\n if (!latestMigration) {\n this.logger.info(\n `No migrations were ever executed. Creating initial migration record %s.`,\n startingId\n );\n await this.repository.logMigration({\n id: startingId,\n description: \"starting point for applicable migrations detection\",\n startedOn: getCurrentISOTime(),\n finishedOn: getCurrentISOTime(),\n reason: \"initial migration\"\n });\n } else {\n this.logger.info(`Latest migration ID is %s.`, latestMigration.id);\n }\n\n if (isApplicable) {\n this.logger.info(`Using custom \"isApplicable\" function.`);\n } else {\n this.logger.info(`Using migrations in the range of %s to %s.`, startingId, lastId);\n }\n\n const defaultIsApplicable: IsMigrationApplicable = mig => {\n return mig.getId() > startingId && mig.getId() <= lastId;\n };\n\n const isMigrationApplicable = isApplicable || defaultIsApplicable;\n\n const executableMigrations = this.migrations\n .filter(mig => {\n if (shouldForceExecute(mig)) {\n return true;\n }\n\n if (!isMigrationApplicable(mig)) {\n this.setRunItem(lastRun, {\n id: mig.getId(),\n status: \"not-applicable\"\n });\n\n return false;\n }\n return true;\n })\n .sort((a, b) => (a.getId() > b.getId() ? 1 : -1));\n\n this.logger.info(\n `Found %s applicable out of %s available migration(s).`,\n executableMigrations.length,\n this.migrations.length\n );\n\n // Are we're within the last 2 minutes of the execution time limit?\n const shouldCreateCheckpoint = () => {\n return this.timeLimiter() < 120000;\n };\n\n //\n for (const migration of executableMigrations) {\n const runItem = this.getOrCreateRunItem(lastRun, migration);\n const checkpoint = await this.repository.getCheckpoint(migration.getId());\n const logger = getChildLogger(this.logger, migration);\n\n if (checkpoint) {\n this.logger.info(checkpoint, `Found checkpoint ${migration.getId()}.`);\n }\n\n const context: DataMigrationContext = {\n projectVersion,\n logger,\n checkpoint,\n forceExecute: shouldForceExecute(migration),\n runningOutOfTime: shouldCreateCheckpoint,\n createCheckpoint: async (data: unknown) => {\n await this.createCheckpoint(migration, data);\n },\n createCheckpointAndExit: async (data: unknown) => {\n await this.createCheckpoint(migration, data);\n // We throw an error to break out of the migration execution completely.\n throw new MigrationNotFinished();\n }\n };\n try {\n const shouldExecute =\n checkpoint || shouldForceExecute(migration)\n ? true\n : await migration.shouldExecute(context);\n\n if (!shouldExecute) {\n this.logger.info(`Skipping migration %s.`, migration.getId());\n runItem.status = \"skipped\";\n\n await this.setRunItemAndSave(lastRun, runItem);\n\n await this.repository.logMigration({\n id: migration.getId(),\n description: migration.getDescription(),\n reason: \"skipped\"\n });\n\n continue;\n }\n\n lastRun.status = \"running\";\n runItem.status = \"running\";\n if (!runItem.startedOn) {\n runItem.startedOn = getCurrentISOTime();\n }\n await this.setRunItemAndSave(lastRun, runItem);\n this.logger.info(\n `Executing migration %s: %s`,\n migration.getId(),\n migration.getDescription()\n );\n await migration.execute(context);\n runItem.status = \"done\";\n } catch (err) {\n // If `MigrationNotFinished` was thrown, we will need to resume the migration.\n if (err instanceof MigrationNotFinished) {\n lastRun.status = \"pending\";\n runItem.status = \"pending\";\n return;\n }\n\n runItem.status = \"error\";\n lastRun.status = \"error\";\n lastRun.error = {\n name: err.name || \"Migration error\",\n message: err.message,\n stack: err.stack,\n data: err.data,\n code: err.code\n };\n this.logger.error(err, err.message);\n return;\n } finally {\n // We sum duration from the previous run with the current run.\n runItem.finishedOn = getCurrentISOTime();\n\n // Update run stats.\n await this.setRunItemAndSave(lastRun, runItem);\n\n this.logger.info(\n `Finished executing migration %s in %sms.`,\n migration.getId(),\n getRunItemDuration(runItem)\n );\n }\n\n await this.repository.logMigration({\n id: migration.getId(),\n description: migration.getDescription(),\n startedOn: runItem.startedOn,\n finishedOn: runItem.finishedOn,\n reason: \"executed\"\n });\n\n this.logger.info(`Deleting checkpoint ${migration.getId()}.`);\n await this.repository.deleteCheckpoint(migration.getId());\n }\n\n lastRun.status = \"done\";\n lastRun.finishedOn = getCurrentISOTime();\n await this.repository.saveRun(lastRun);\n\n this.logger.info(`Finished processing applicable migrations.`);\n }\n\n async getStatus(): Promise<MigrationStatus> {\n const lastRun = await this.repository.getLastRun();\n if (!lastRun) {\n throw new Error(`No migrations were ever executed!`);\n }\n\n // Since we don't store migration descriptions to DB, we need to fetch them from actual migration objects.\n const withDescriptions = lastRun.migrations.map(mig => {\n const dataMigration = this.migrations.find(dm => dm.getId() === mig.id);\n return {\n ...mig,\n description: dataMigration ? dataMigration.getDescription() : \"N/A\"\n };\n });\n\n return { ...lastRun, migrations: withDescriptions };\n }\n\n private validateIds(migrations: DataMigration[]) {\n const ids = new Set();\n for (const mig of migrations) {\n const id = mig.getId();\n if (id.endsWith(\"-000\")) {\n const error = new Error(`Migration ID must not end with \"000\": ${id}`);\n this.logger.error(error);\n throw error;\n }\n\n if (ids.has(id)) {\n const error = new Error(`Duplicate migration ID found: ${id}`);\n this.logger.error(error);\n throw error;\n }\n ids.add(id);\n }\n }\n\n private async createCheckpoint(migration: DataMigration, checkpoint: unknown) {\n this.logger.info(checkpoint, `Saving checkpoint ${migration.getId()}`);\n const execute = () => this.repository.createCheckpoint(migration.getId(), checkpoint);\n await executeWithRetry(execute);\n }\n\n private async getOrCreateRun() {\n const resolvedStatus: Array<MigrationRun[\"status\"]> = [\"done\", \"error\"];\n const unresolvedStatus: Array<MigrationRun[\"status\"]> = [\"init\", \"running\"];\n\n let lastRun = await this.repository.getLastRun();\n\n if (lastRun && unresolvedStatus.includes(lastRun.status)) {\n throw new MigrationInProgress(`Migration is already in progress (ID: ${lastRun.id})!`);\n }\n\n if (!lastRun || resolvedStatus.includes(lastRun.status)) {\n lastRun = {\n id: mdbid(),\n status: \"init\",\n startedOn: getCurrentISOTime(),\n finishedOn: \"\",\n migrations: [],\n context: this.context\n };\n\n await this.repository.saveRun(lastRun);\n }\n\n return lastRun;\n }\n\n private getOrCreateRunItem(run: MigrationRun, migration: DataMigration): MigrationRunItem {\n const existingItem = run.migrations.find(item => item.id === migration.getId());\n if (existingItem) {\n return {\n ...existingItem,\n status: \"running\"\n };\n }\n\n return {\n id: migration.getId(),\n status: \"running\"\n };\n }\n\n private setRunItem(run: MigrationRun, item: MigrationRunItem) {\n const index = run.migrations.findIndex(runItem => runItem.id === item.id);\n if (index < 0) {\n run.migrations.push(item);\n } else {\n run.migrations = [\n ...run.migrations.slice(0, index),\n item,\n ...run.migrations.slice(index + 1)\n ];\n }\n\n run.migrations = run.migrations.sort((a, b) => (a.id > b.id ? 1 : -1));\n }\n\n private async setRunItemAndSave(run: MigrationRun, item: MigrationRunItem) {\n this.setRunItem(run, item);\n await this.repository.saveRun(run);\n }\n}\n\nmakeInjectable(MigrationRunner, [\n inject(MigrationRepositorySymbol),\n inject(ExecutionTimeLimiterSymbol),\n inject(MigrationSymbol, { multi: true, optional: true }),\n inject(LoggerSymbol, { optional: true })\n]);\n"],"mappings":"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"}
1
+ {"version":3,"names":["_semver","require","_ioc","_utils","_symbols","_createPinoLogger","getCurrentISOTime","Date","toISOString","getRunItemDuration","runItem","startedOn","finishedOn","getTime","shouldForceExecute","mig","key","getId","replace","process","env","shouldSkip","MigrationNotFinished","Error","MigrationInProgress","MigrationRunner","context","constructor","repository","timeLimiter","migrations","logger","createPinoLogger","setContext","execute","projectVersion","isApplicable","forceExecute","lastRun","getOrCreateRun","validateIds","err","status","error","message","saveRun","latestMigration","listMigrations","limit","info","currentVersion","coerce","startingId","id","lastId","logMigration","description","reason","defaultIsApplicable","isMigrationApplicable","printForceExecuteEnvVars","printSkipExecuteEnvVars","executableMigrations","filter","setRunItem","sort","a","b","length","shouldCreateCheckpoint","migration","getOrCreateRunItem","checkpoint","getCheckpoint","getChildLogger","runningOutOfTime","createCheckpoint","data","createCheckpointAndExit","shouldExecute","setRunItemAndSave","getDescription","name","stack","code","deleteCheckpoint","getStatus","getLastRun","withDescriptions","map","dataMigration","find","dm","ids","Set","endsWith","has","add","executeWithRetry","resolvedStatus","unresolvedStatus","includes","mdbid","run","existingItem","item","index","findIndex","push","slice","forceKeys","Object","keys","startsWith","skipKeys","exports","makeInjectable","inject","MigrationRepositorySymbol","ExecutionTimeLimiterSymbol","MigrationSymbol","multi","optional","LoggerSymbol"],"sources":["MigrationRunner.ts"],"sourcesContent":["import { coerce } from \"semver\";\nimport type { Logger } from \"@webiny/logger\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { executeWithRetry, mdbid } from \"@webiny/utils\";\nimport {\n MigrationRepositorySymbol,\n LoggerSymbol,\n MigrationSymbol,\n ExecutionTimeLimiterSymbol\n} from \"./symbols\";\nimport { createPinoLogger, getChildLogger } from \"./createPinoLogger\";\nimport type {\n MigrationRepository,\n DataMigration,\n DataMigrationContext,\n ExecutionTimeLimiter,\n MigrationRun,\n MigrationStatus,\n MigrationRunItem\n} from \"~/types\";\n\nexport type IsMigrationApplicable = (migration: DataMigration) => boolean;\n\nconst getCurrentISOTime = () => {\n return new Date().toISOString();\n};\n\nconst getRunItemDuration = (runItem: MigrationRunItem) => {\n if (!runItem.startedOn || !runItem.finishedOn) {\n return \"N/A\";\n }\n\n return new Date(runItem.finishedOn).getTime() - new Date(runItem.startedOn).getTime();\n};\n\n/**\n * This allows us to force-execute a migration, even if it's not in the list of the applicable migrations.\n * Example: WEBINY_MIGRATION_FORCE_EXECUTE_5_35_0_006=true\n */\nconst shouldForceExecute = (mig: DataMigration) => {\n const key = `WEBINY_MIGRATION_FORCE_EXECUTE_${mig.getId().replace(/[\\.\\-]/g, \"_\")}`;\n\n return process.env[key] === \"true\";\n};\n\n/**\n * This allows us to always skip a migration.\n * Example: WEBINY_MIGRATION_SKIP_5_35_0_006=true\n */\nconst shouldSkip = (mig: DataMigration) => {\n const key = `WEBINY_MIGRATION_SKIP_${mig.getId().replace(/[\\.\\-]/g, \"_\")}`;\n\n return process.env[key] === \"true\";\n};\n\nclass MigrationNotFinished extends Error {}\nclass MigrationInProgress extends Error {}\n\nexport class MigrationRunner {\n private readonly logger: Logger;\n private readonly migrations: DataMigration[];\n private readonly repository: MigrationRepository;\n private readonly timeLimiter: ExecutionTimeLimiter;\n private context: Record<string, any> = {};\n\n constructor(\n repository: MigrationRepository,\n timeLimiter: ExecutionTimeLimiter,\n migrations: DataMigration[],\n logger: Logger | undefined\n ) {\n this.repository = repository;\n this.timeLimiter = timeLimiter;\n this.migrations = migrations || [];\n\n if (!logger) {\n logger = createPinoLogger();\n }\n this.logger = logger;\n }\n\n setContext(context: Record<string, any>) {\n this.context = context;\n }\n\n async execute(\n projectVersion: string,\n isApplicable?: IsMigrationApplicable,\n // Force execute applicable migrations.\n forceExecute = false\n ) {\n const lastRun = await this.getOrCreateRun();\n\n try {\n this.validateIds(this.migrations);\n } catch (err) {\n lastRun.status = \"error\";\n lastRun.error = {\n message: err.message\n };\n await this.repository.saveRun(lastRun);\n return;\n }\n\n const [latestMigration] = await this.repository.listMigrations({ limit: 1 });\n\n this.logger.info(`Project version is %s.`, projectVersion);\n\n // Get current version, and coerce it to a valid SemVer.\n // With this, we can run migrations targeted for stable versions, released under a preid tag (e.g., `beta`).\n const currentVersion = coerce(projectVersion) + \"\";\n const startingId = latestMigration ? latestMigration.id : `${currentVersion}-000`;\n const lastId = `${currentVersion}-999`;\n\n // Create initial migration record.\n if (!latestMigration) {\n this.logger.info(\n `No migrations were ever executed. Creating initial migration record %s.`,\n startingId\n );\n await this.repository.logMigration({\n id: startingId,\n description: \"starting point for applicable migrations detection\",\n startedOn: getCurrentISOTime(),\n finishedOn: getCurrentISOTime(),\n reason: \"initial migration\"\n });\n } else {\n this.logger.info(`Latest migration ID is %s.`, latestMigration.id);\n }\n\n if (isApplicable) {\n this.logger.info(`Using custom \"isApplicable\" function.`);\n } else {\n this.logger.info(`Using migrations in the range of %s to %s.`, startingId, lastId);\n }\n\n const defaultIsApplicable: IsMigrationApplicable = mig => {\n return mig.getId() > startingId && mig.getId() <= lastId;\n };\n\n const isMigrationApplicable = isApplicable || defaultIsApplicable;\n\n this.printForceExecuteEnvVars();\n this.printSkipExecuteEnvVars();\n\n if (forceExecute) {\n this.logger.info(\n `ALL APPLICABLE MIGRATIONS WILL BE FORCE-EXECUTED! (via --force flag)`\n );\n }\n\n const executableMigrations = this.migrations\n .filter(mig => {\n if (shouldSkip(mig)) {\n this.setRunItem(lastRun, {\n id: mig.getId(),\n status: \"skipped\"\n });\n\n return false;\n }\n\n if (shouldForceExecute(mig)) {\n return true;\n }\n\n if (!isMigrationApplicable(mig)) {\n this.setRunItem(lastRun, {\n id: mig.getId(),\n status: \"not-applicable\"\n });\n\n return false;\n }\n return true;\n })\n .sort((a, b) => (a.getId() > b.getId() ? 1 : -1));\n\n this.logger.info(\n `Found %s applicable out of %s available migration(s).`,\n executableMigrations.length,\n this.migrations.length\n );\n\n // Are we're within the last 2 minutes of the execution time limit?\n const shouldCreateCheckpoint = () => {\n return this.timeLimiter() < 120000;\n };\n\n //\n for (const migration of executableMigrations) {\n const runItem = this.getOrCreateRunItem(lastRun, migration);\n const checkpoint = await this.repository.getCheckpoint(migration.getId());\n const logger = getChildLogger(this.logger, migration);\n\n if (checkpoint) {\n this.logger.info(checkpoint, `Found checkpoint ${migration.getId()}.`);\n }\n\n const context: DataMigrationContext = {\n projectVersion,\n logger,\n checkpoint,\n forceExecute: forceExecute || shouldForceExecute(migration),\n runningOutOfTime: shouldCreateCheckpoint,\n createCheckpoint: async (data: unknown) => {\n await this.createCheckpoint(migration, data);\n },\n createCheckpointAndExit: async (data: unknown) => {\n await this.createCheckpoint(migration, data);\n // We throw an error to break out of the migration execution completely.\n throw new MigrationNotFinished();\n }\n };\n try {\n const shouldExecute =\n checkpoint || context.forceExecute\n ? true\n : await migration.shouldExecute(context);\n\n if (!shouldExecute) {\n this.logger.info(`Skipping migration %s.`, migration.getId());\n runItem.status = \"skipped\";\n\n await this.setRunItemAndSave(lastRun, runItem);\n\n await this.repository.logMigration({\n id: migration.getId(),\n description: migration.getDescription(),\n reason: \"skipped\"\n });\n\n continue;\n }\n\n lastRun.status = \"running\";\n runItem.status = \"running\";\n if (!runItem.startedOn) {\n runItem.startedOn = getCurrentISOTime();\n }\n await this.setRunItemAndSave(lastRun, runItem);\n this.logger.info(\n `Executing migration %s: %s`,\n migration.getId(),\n migration.getDescription()\n );\n await migration.execute(context);\n runItem.status = \"done\";\n } catch (err) {\n // If `MigrationNotFinished` was thrown, we will need to resume the migration.\n if (err instanceof MigrationNotFinished) {\n lastRun.status = \"pending\";\n runItem.status = \"pending\";\n return;\n }\n\n runItem.status = \"error\";\n lastRun.status = \"error\";\n lastRun.error = {\n name: err.name || \"Migration error\",\n message: err.message,\n stack: err.stack,\n data: err.data,\n code: err.code\n };\n this.logger.error(err, err.message);\n return;\n } finally {\n runItem.finishedOn = getCurrentISOTime();\n\n // Update run stats.\n await this.setRunItemAndSave(lastRun, runItem);\n\n if (runItem.status === \"pending\") {\n this.logger.info(\n `Pausing migration %s, awaiting continuation.`,\n migration.getId()\n );\n } else {\n this.logger.info(\n `Finished executing migration %s in %sms.`,\n migration.getId(),\n getRunItemDuration(runItem)\n );\n }\n }\n\n await this.repository.logMigration({\n id: migration.getId(),\n description: migration.getDescription(),\n startedOn: runItem.startedOn,\n finishedOn: runItem.finishedOn,\n reason: \"executed\"\n });\n\n this.logger.info(`Deleting checkpoint ${migration.getId()}.`);\n await this.repository.deleteCheckpoint(migration.getId());\n }\n\n lastRun.status = \"done\";\n lastRun.finishedOn = getCurrentISOTime();\n await this.repository.saveRun(lastRun);\n\n this.logger.info(`Finished processing applicable migrations.`);\n }\n\n async getStatus(): Promise<MigrationStatus> {\n const lastRun = await this.repository.getLastRun();\n if (!lastRun) {\n throw new Error(`No migrations were ever executed!`);\n }\n\n // Since we don't store migration descriptions to DB, we need to fetch them from actual migration objects.\n const withDescriptions = lastRun.migrations.map(mig => {\n const dataMigration = this.migrations.find(dm => dm.getId() === mig.id);\n return {\n ...mig,\n description: dataMigration ? dataMigration.getDescription() : \"N/A\"\n };\n });\n\n return { ...lastRun, migrations: withDescriptions };\n }\n\n private validateIds(migrations: DataMigration[]) {\n const ids = new Set();\n for (const mig of migrations) {\n const id = mig.getId();\n if (id.endsWith(\"-000\")) {\n const error = new Error(`Migration ID must not end with \"000\": ${id}`);\n this.logger.error(error);\n throw error;\n }\n\n if (ids.has(id)) {\n const error = new Error(`Duplicate migration ID found: ${id}`);\n this.logger.error(error);\n throw error;\n }\n ids.add(id);\n }\n }\n\n private async createCheckpoint(migration: DataMigration, checkpoint: unknown) {\n this.logger.info(checkpoint, `Saving checkpoint ${migration.getId()}`);\n const execute = () => this.repository.createCheckpoint(migration.getId(), checkpoint);\n await executeWithRetry(execute);\n }\n\n private async getOrCreateRun() {\n const resolvedStatus: Array<MigrationRun[\"status\"]> = [\"done\", \"error\"];\n const unresolvedStatus: Array<MigrationRun[\"status\"]> = [\"init\", \"running\"];\n\n let lastRun = await this.repository.getLastRun();\n\n if (lastRun && unresolvedStatus.includes(lastRun.status)) {\n throw new MigrationInProgress(`Migration is already in progress (ID: ${lastRun.id})!`);\n }\n\n if (!lastRun || resolvedStatus.includes(lastRun.status)) {\n lastRun = {\n id: mdbid(),\n status: \"init\",\n startedOn: getCurrentISOTime(),\n finishedOn: \"\",\n migrations: [],\n context: this.context\n };\n\n await this.repository.saveRun(lastRun);\n }\n\n return lastRun;\n }\n\n private getOrCreateRunItem(run: MigrationRun, migration: DataMigration): MigrationRunItem {\n const existingItem = run.migrations.find(item => item.id === migration.getId());\n if (existingItem) {\n return {\n ...existingItem,\n status: \"running\"\n };\n }\n\n return {\n id: migration.getId(),\n status: \"running\"\n };\n }\n\n private setRunItem(run: MigrationRun, item: MigrationRunItem) {\n const index = run.migrations.findIndex(runItem => runItem.id === item.id);\n if (index < 0) {\n run.migrations.push(item);\n } else {\n run.migrations = [\n ...run.migrations.slice(0, index),\n item,\n ...run.migrations.slice(index + 1)\n ];\n }\n\n run.migrations = run.migrations.sort((a, b) => (a.id > b.id ? 1 : -1));\n }\n\n private async setRunItemAndSave(run: MigrationRun, item: MigrationRunItem) {\n this.setRunItem(run, item);\n await this.repository.saveRun(run);\n }\n\n private printForceExecuteEnvVars() {\n const forceKeys = Object.keys(process.env).filter(key =>\n key.startsWith(\"WEBINY_MIGRATION_FORCE_EXECUTE_\")\n );\n\n if (!forceKeys.length) {\n this.logger.info(\n `No migrations are enforced via WEBINY_MIGRATION_FORCE_EXECUTE environment variable.`\n );\n\n return;\n }\n\n this.logger.info(`FORCED MIGRATIONS DETECTED!`);\n for (const key of forceKeys) {\n this.logger.info(`${key}=${process.env[key]}`);\n }\n }\n\n private printSkipExecuteEnvVars() {\n const skipKeys = Object.keys(process.env).filter(key =>\n key.startsWith(\"WEBINY_MIGRATION_SKIP_\")\n );\n\n if (!skipKeys.length) {\n this.logger.info(\n `No migrations are skipped via WEBINY_MIGRATION_SKIP environment variable.`\n );\n\n return;\n }\n\n this.logger.info(`SKIPPED MIGRATIONS DETECTED!`);\n for (const key of skipKeys) {\n this.logger.info(`${key}=${process.env[key]}`);\n }\n }\n}\n\nmakeInjectable(MigrationRunner, [\n inject(MigrationRepositorySymbol),\n inject(ExecutionTimeLimiterSymbol),\n inject(MigrationSymbol, { multi: true, optional: true }),\n inject(LoggerSymbol, { optional: true })\n]);\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,6 @@
1
- import { MigrationRunnerResult, MigrationRunReporter } from ".";
2
- import { CliContext } from "@webiny/cli/types";
3
- import { LogReporter } from ".";
1
+ import type { MigrationRunnerResult, MigrationRunReporter } from "./";
2
+ import type { CliContext } from "@webiny/cli/types";
3
+ import type { LogReporter } from "./";
4
4
  export declare class CliMigrationRunReporter implements MigrationRunReporter {
5
5
  private context;
6
6
  private logReporter;
@@ -1 +1 @@
1
- {"version":3,"names":["_centerAlign","_interopRequireDefault","require","CliMigrationRunReporter","constructor","logReporter","context","report","result","onSuccess","data","functionName","getFunctionName","split","pop","process","stdout","write","success","migrations","run","length","info","maxLength","Math","max","map","mig","status","id","startedOn","finishedOn","migration","description","center","makeEven","printLogStreamLinks","onError","error","message","str","exports"],"sources":["CliMigrationRunReporter.ts"],"sourcesContent":["import { MigrationRunnerResult, MigrationRunReporter } from \"~/cli\";\nimport center from \"center-align\";\nimport { CliContext } from \"@webiny/cli/types\";\nimport { LogReporter } from \"~/cli\";\n\nexport class CliMigrationRunReporter implements MigrationRunReporter {\n private context: CliContext;\n private logReporter: LogReporter;\n\n constructor(logReporter: LogReporter, context: CliContext) {\n this.logReporter = logReporter;\n this.context = context;\n }\n\n report(result: MigrationRunnerResult): Promise<void> {\n result.onSuccess(data => {\n const functionName = result.getFunctionName().split(\":\").pop();\n process.stdout.write(\"\\n\");\n this.context.success(`Data migration Lambda %s executed successfully!`, functionName);\n\n const { migrations, ...run } = data;\n if (!migrations.length) {\n this.context.info(`No applicable migrations were found!`);\n return;\n }\n\n const maxLength = Math.max(...migrations.map(mig => mig.status.length)) + 2;\n this.context.info(`Migration run: %s`, run.id);\n this.context.info(`Status: %s`, run.status);\n this.context.info(`Started on: %s`, run.startedOn);\n if (run.status === \"done\") {\n this.context.info(`Finished on: %s`, run.finishedOn);\n }\n for (const migration of migrations) {\n this.context.info(\n ...[\n `[%s] %s: ${migration.description}`,\n center(this.makeEven(migration.status), maxLength),\n migration.id\n ]\n );\n }\n\n this.logReporter.printLogStreamLinks();\n });\n\n result.onError(error => {\n this.context.error(error.message);\n });\n\n // Process the result!\n return result.process();\n }\n\n private makeEven(str: string) {\n if (str.length % 2 > 0) {\n return str + \" \";\n }\n return str;\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIO,MAAMC,uBAAuB,CAAiC;EAIjEC,WAAWA,CAACC,WAAwB,EAAEC,OAAmB,EAAE;IACvD,IAAI,CAACD,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACC,OAAO,GAAGA,OAAO;EAC1B;EAEAC,MAAMA,CAACC,MAA6B,EAAiB;IACjDA,MAAM,CAACC,SAAS,CAACC,IAAI,IAAI;MACrB,MAAMC,YAAY,GAAGH,MAAM,CAACI,eAAe,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;MAC9DC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAI,CAAC;MAC1B,IAAI,CAACX,OAAO,CAACY,OAAO,CAAE,iDAAgD,EAAEP,YAAY,CAAC;MAErF,MAAM;QAAEQ,UAAU;QAAE,GAAGC;MAAI,CAAC,GAAGV,IAAI;MACnC,IAAI,CAACS,UAAU,CAACE,MAAM,EAAE;QACpB,IAAI,CAACf,OAAO,CAACgB,IAAI,CAAE,sCAAqC,CAAC;QACzD;MACJ;MAEA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGN,UAAU,CAACO,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACC,MAAM,CAACP,MAAM,CAAC,CAAC,GAAG,CAAC;MAC3E,IAAI,CAACf,OAAO,CAACgB,IAAI,CAAE,mBAAkB,EAAEF,GAAG,CAACS,EAAE,CAAC;MAC9C,IAAI,CAACvB,OAAO,CAACgB,IAAI,CAAE,YAAW,EAAEF,GAAG,CAACQ,MAAM,CAAC;MAC3C,IAAI,CAACtB,OAAO,CAACgB,IAAI,CAAE,gBAAe,EAAEF,GAAG,CAACU,SAAS,CAAC;MAClD,IAAIV,GAAG,CAACQ,MAAM,KAAK,MAAM,EAAE;QACvB,IAAI,CAACtB,OAAO,CAACgB,IAAI,CAAE,iBAAgB,EAAEF,GAAG,CAACW,UAAU,CAAC;MACxD;MACA,KAAK,MAAMC,SAAS,IAAIb,UAAU,EAAE;QAChC,IAAI,CAACb,OAAO,CAACgB,IAAI,CACb,GAAG,CACE,YAAWU,SAAS,CAACC,WAAY,EAAC,EACnC,IAAAC,oBAAM,EAAC,IAAI,CAACC,QAAQ,CAACH,SAAS,CAACJ,MAAM,CAAC,EAAEL,SAAS,CAAC,EAClDS,SAAS,CAACH,EAAE,CAEpB,CAAC;MACL;MAEA,IAAI,CAACxB,WAAW,CAAC+B,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF5B,MAAM,CAAC6B,OAAO,CAACC,KAAK,IAAI;MACpB,IAAI,CAAChC,OAAO,CAACgC,KAAK,CAACA,KAAK,CAACC,OAAO,CAAC;IACrC,CAAC,CAAC;;IAEF;IACA,OAAO/B,MAAM,CAACO,OAAO,CAAC,CAAC;EAC3B;EAEQoB,QAAQA,CAACK,GAAW,EAAE;IAC1B,IAAIA,GAAG,CAACnB,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE;MACpB,OAAOmB,GAAG,GAAG,GAAG;IACpB;IACA,OAAOA,GAAG;EACd;AACJ;AAACC,OAAA,CAAAtC,uBAAA,GAAAA,uBAAA"}
1
+ {"version":3,"names":["_centerAlign","_interopRequireDefault","require","CliMigrationRunReporter","constructor","logReporter","context","report","result","onSuccess","data","functionName","getFunctionName","split","pop","process","stdout","write","success","migrations","run","length","info","maxLength","Math","max","map","mig","status","id","startedOn","finishedOn","migration","description","center","makeEven","printLogStreamLinks","onError","error","message","str","exports"],"sources":["CliMigrationRunReporter.ts"],"sourcesContent":["import type { MigrationRunnerResult, MigrationRunReporter } from \"~/cli\";\nimport center from \"center-align\";\nimport type { CliContext } from \"@webiny/cli/types\";\nimport type { LogReporter } from \"~/cli\";\n\nexport class CliMigrationRunReporter implements MigrationRunReporter {\n private context: CliContext;\n private logReporter: LogReporter;\n\n constructor(logReporter: LogReporter, context: CliContext) {\n this.logReporter = logReporter;\n this.context = context;\n }\n\n report(result: MigrationRunnerResult): Promise<void> {\n result.onSuccess(data => {\n const functionName = result.getFunctionName().split(\":\").pop();\n process.stdout.write(\"\\n\");\n this.context.success(`Data migration Lambda %s executed successfully!`, functionName);\n\n const { migrations, ...run } = data;\n if (!migrations.length) {\n this.context.info(`No applicable migrations were found!`);\n return;\n }\n\n const maxLength = Math.max(...migrations.map(mig => mig.status.length)) + 2;\n this.context.info(`Migration run: %s`, run.id);\n this.context.info(`Status: %s`, run.status);\n this.context.info(`Started on: %s`, run.startedOn);\n if (run.status === \"done\") {\n this.context.info(`Finished on: %s`, run.finishedOn);\n }\n for (const migration of migrations) {\n this.context.info(\n ...[\n `[%s] %s: ${migration.description}`,\n center(this.makeEven(migration.status), maxLength),\n migration.id\n ]\n );\n }\n\n this.logReporter.printLogStreamLinks();\n });\n\n result.onError(error => {\n this.context.error(error.message);\n });\n\n // Process the result!\n return result.process();\n }\n\n private makeEven(str: string) {\n if (str.length % 2 > 0) {\n return str + \" \";\n }\n return str;\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIO,MAAMC,uBAAuB,CAAiC;EAIjEC,WAAWA,CAACC,WAAwB,EAAEC,OAAmB,EAAE;IACvD,IAAI,CAACD,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACC,OAAO,GAAGA,OAAO;EAC1B;EAEAC,MAAMA,CAACC,MAA6B,EAAiB;IACjDA,MAAM,CAACC,SAAS,CAACC,IAAI,IAAI;MACrB,MAAMC,YAAY,GAAGH,MAAM,CAACI,eAAe,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;MAC9DC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAI,CAAC;MAC1B,IAAI,CAACX,OAAO,CAACY,OAAO,CAAC,iDAAiD,EAAEP,YAAY,CAAC;MAErF,MAAM;QAAEQ,UAAU;QAAE,GAAGC;MAAI,CAAC,GAAGV,IAAI;MACnC,IAAI,CAACS,UAAU,CAACE,MAAM,EAAE;QACpB,IAAI,CAACf,OAAO,CAACgB,IAAI,CAAC,sCAAsC,CAAC;QACzD;MACJ;MAEA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGN,UAAU,CAACO,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACC,MAAM,CAACP,MAAM,CAAC,CAAC,GAAG,CAAC;MAC3E,IAAI,CAACf,OAAO,CAACgB,IAAI,CAAC,mBAAmB,EAAEF,GAAG,CAACS,EAAE,CAAC;MAC9C,IAAI,CAACvB,OAAO,CAACgB,IAAI,CAAC,YAAY,EAAEF,GAAG,CAACQ,MAAM,CAAC;MAC3C,IAAI,CAACtB,OAAO,CAACgB,IAAI,CAAC,gBAAgB,EAAEF,GAAG,CAACU,SAAS,CAAC;MAClD,IAAIV,GAAG,CAACQ,MAAM,KAAK,MAAM,EAAE;QACvB,IAAI,CAACtB,OAAO,CAACgB,IAAI,CAAC,iBAAiB,EAAEF,GAAG,CAACW,UAAU,CAAC;MACxD;MACA,KAAK,MAAMC,SAAS,IAAIb,UAAU,EAAE;QAChC,IAAI,CAACb,OAAO,CAACgB,IAAI,CACb,GAAG,CACC,YAAYU,SAAS,CAACC,WAAW,EAAE,EACnC,IAAAC,oBAAM,EAAC,IAAI,CAACC,QAAQ,CAACH,SAAS,CAACJ,MAAM,CAAC,EAAEL,SAAS,CAAC,EAClDS,SAAS,CAACH,EAAE,CAEpB,CAAC;MACL;MAEA,IAAI,CAACxB,WAAW,CAAC+B,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF5B,MAAM,CAAC6B,OAAO,CAACC,KAAK,IAAI;MACpB,IAAI,CAAChC,OAAO,CAACgC,KAAK,CAACA,KAAK,CAACC,OAAO,CAAC;IACrC,CAAC,CAAC;;IAEF;IACA,OAAO/B,MAAM,CAACO,OAAO,CAAC,CAAC;EAC3B;EAEQoB,QAAQA,CAACK,GAAW,EAAE;IAC1B,IAAIA,GAAG,CAACnB,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE;MACpB,OAAOmB,GAAG,GAAG,GAAG;IACpB;IACA,OAAOA,GAAG;EACd;AACJ;AAACC,OAAA,CAAAtC,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -1,6 +1,6 @@
1
- import { MigrationStatusReporter } from "./MigrationStatusReporter";
2
- import { MigrationStatus } from "../types";
3
- import { LogReporter } from "./LogReporter";
1
+ import type { MigrationStatusReporter } from "./MigrationStatusReporter";
2
+ import type { MigrationStatus } from "../types";
3
+ import type { LogReporter } from "./LogReporter";
4
4
  export declare class InteractiveCliStatusReporter implements MigrationStatusReporter {
5
5
  private logReporter;
6
6
  private firstCall;
@@ -1 +1 @@
1
- {"version":3,"names":["_readline","_interopRequireDefault","require","InteractiveCliStatusReporter","firstCall","constructor","logReporter","console","log","report","migrationStatus","status","migrations","context","clearLine","currentLogStreamName","logStreamName","initializeStream","printLogStreamLinks","process","stdout","write","printLogs","currentMigration","find","mig","duration","getDuration","String","startedOn","id","includes","Promise","resolve","setTimeout","readline","cursorTo","since","ms","Date","getTime","seconds","Math","floor","minutes","undefined","exports"],"sources":["InteractiveCliStatusReporter.ts"],"sourcesContent":["import readline from \"readline\";\nimport { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport { MigrationStatus } from \"~/types\";\nimport { LogReporter } from \"~/cli/LogReporter\";\n\nexport class InteractiveCliStatusReporter implements MigrationStatusReporter {\n private logReporter: LogReporter;\n private firstCall = true;\n\n constructor(logReporter: LogReporter) {\n this.logReporter = logReporter;\n console.log(`Using \"InteractiveCliStatusReporter\".`);\n }\n\n async report(migrationStatus: MigrationStatus) {\n const { status, migrations, context } = migrationStatus;\n this.clearLine();\n\n const currentLogStreamName = context?.logStreamName;\n if (currentLogStreamName) {\n this.logReporter.initializeStream(currentLogStreamName);\n if (this.firstCall) {\n this.logReporter.printLogStreamLinks();\n process.stdout.write(`\\n---------- MIGRATION LOGS START ----------\\n\\n`);\n }\n await this.logReporter.printLogs(currentLogStreamName);\n }\n\n if (status === \"running\") {\n const currentMigration = migrations.find(mig => mig.status === \"running\");\n if (currentMigration) {\n const duration = this.getDuration(String(currentMigration.startedOn));\n process.stdout.write(\n `Running data migration ${currentMigration.id} (${duration})...`\n );\n }\n }\n\n if (status === \"init\") {\n process.stdout.write(`Checking data migrations...`);\n }\n\n if ([\"done\", \"error\"].includes(status)) {\n this.clearLine();\n process.stdout.write(`Migration run finished, waiting for latest logs...`);\n\n // We want to give AWS some time for the latest log events to become available.\n await new Promise(resolve => {\n setTimeout(resolve, 8000);\n });\n\n if (currentLogStreamName) {\n this.clearLine();\n await this.logReporter.printLogs(currentLogStreamName);\n process.stdout.write(`\\n---------- MIGRATION LOGS END ----------\\n`);\n }\n }\n\n this.firstCall = false;\n }\n\n private clearLine() {\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n }\n\n private getDuration(since: string) {\n const ms = new Date().getTime() - new Date(since).getTime();\n let seconds = Math.floor(ms / 1000);\n let minutes = undefined;\n if (seconds > 60) {\n minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds % 60);\n }\n\n return minutes ? `${minutes}m ${seconds}s` : `${seconds}s`;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_readline","_interopRequireDefault","require","InteractiveCliStatusReporter","firstCall","constructor","logReporter","console","log","report","migrationStatus","status","migrations","context","clearLine","currentLogStreamName","logStreamName","initializeStream","printLogStreamLinks","process","stdout","write","printLogs","currentMigration","find","mig","duration","getDuration","String","startedOn","id","includes","Promise","resolve","setTimeout","readline","cursorTo","since","ms","Date","getTime","seconds","Math","floor","minutes","undefined","exports"],"sources":["InteractiveCliStatusReporter.ts"],"sourcesContent":["import readline from \"readline\";\nimport type { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport type { MigrationStatus } from \"~/types\";\nimport type { LogReporter } from \"~/cli/LogReporter\";\n\nexport class InteractiveCliStatusReporter implements MigrationStatusReporter {\n private logReporter: LogReporter;\n private firstCall = true;\n\n constructor(logReporter: LogReporter) {\n this.logReporter = logReporter;\n console.log(`Using \"InteractiveCliStatusReporter\".`);\n }\n\n async report(migrationStatus: MigrationStatus) {\n const { status, migrations, context } = migrationStatus;\n this.clearLine();\n\n const currentLogStreamName = context?.logStreamName;\n if (currentLogStreamName) {\n this.logReporter.initializeStream(currentLogStreamName);\n if (this.firstCall) {\n this.logReporter.printLogStreamLinks();\n process.stdout.write(`\\n---------- MIGRATION LOGS START ----------\\n\\n`);\n }\n await this.logReporter.printLogs(currentLogStreamName);\n }\n\n if (status === \"running\") {\n const currentMigration = migrations.find(mig => mig.status === \"running\");\n if (currentMigration) {\n const duration = this.getDuration(String(currentMigration.startedOn));\n process.stdout.write(\n `Running data migration ${currentMigration.id} (${duration})...`\n );\n }\n }\n\n if (status === \"init\") {\n process.stdout.write(`Checking data migrations...`);\n }\n\n if ([\"done\", \"error\"].includes(status)) {\n this.clearLine();\n process.stdout.write(`Migration run finished, waiting for latest logs...`);\n\n // We want to give AWS some time for the latest log events to become available.\n await new Promise(resolve => {\n setTimeout(resolve, 8000);\n });\n\n if (currentLogStreamName) {\n this.clearLine();\n await this.logReporter.printLogs(currentLogStreamName);\n process.stdout.write(`\\n---------- MIGRATION LOGS END ----------\\n`);\n }\n }\n\n this.firstCall = false;\n }\n\n private clearLine() {\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n }\n\n private getDuration(since: string) {\n const ms = new Date().getTime() - new Date(since).getTime();\n let seconds = Math.floor(ms / 1000);\n let minutes = undefined;\n if (seconds > 60) {\n minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds % 60);\n }\n\n return minutes ? `${minutes}m ${seconds}s` : `${seconds}s`;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_LogStream","require","LogReporter","logStreams","Set","constructor","functionName","baseName","split","pop","logGroupName","logsCreatedSince","Date","now","printLogs","logStreamName","logStream","initializeStream","printLogsSince","printLogStreamLinks","size","Array","from","process","stdout","write","getLogStreamLink","name","LogStream","create","add","exports"],"sources":["LogReporter.ts"],"sourcesContent":["import { LogStream } from \"./LogStream\";\n\nexport class LogReporter {\n private readonly logGroupName: string;\n private readonly logsCreatedSince: number;\n private readonly logStreams = new Set<LogStream>();\n\n constructor(functionName: string) {\n const baseName = functionName.split(\":\").pop();\n this.logGroupName = `/aws/lambda/${baseName}`;\n this.logsCreatedSince = Date.now();\n }\n\n public async printLogs(logStreamName: string) {\n const logStream = this.initializeStream(logStreamName);\n await logStream.printLogsSince(this.logsCreatedSince);\n }\n\n public printLogStreamLinks() {\n if (this.logStreams.size === 0) {\n return;\n }\n\n const logStreams = Array.from(this.logStreams);\n\n if (this.logStreams.size === 1) {\n process.stdout.write(\n `\\nTo view detailed logs, visit the following AWS CloudWatch log stream:\\n`\n );\n process.stdout.write(logStreams[0].getLogStreamLink());\n } else {\n process.stdout.write(\n `\\nTo view detailed logs, visit the following AWS CloudWatch log streams:\\n`\n );\n\n for (const logStream of logStreams) {\n process.stdout.write(`- ${logStream.getLogStreamLink()}`);\n }\n }\n\n process.stdout.write(\"\\n\");\n }\n\n public initializeStream(name: string) {\n const logStream = LogStream.create(this.logGroupName, name);\n this.logStreams.add(logStream);\n return logStream;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,WAAW,CAAC;EAGJC,UAAU,GAAG,IAAIC,GAAG,CAAY,CAAC;EAElDC,WAAWA,CAACC,YAAoB,EAAE;IAC9B,MAAMC,QAAQ,GAAGD,YAAY,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAACC,YAAY,GAAI,eAAcH,QAAS,EAAC;IAC7C,IAAI,CAACI,gBAAgB,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACtC;EAEA,MAAaC,SAASA,CAACC,aAAqB,EAAE;IAC1C,MAAMC,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACF,aAAa,CAAC;IACtD,MAAMC,SAAS,CAACE,cAAc,CAAC,IAAI,CAACP,gBAAgB,CAAC;EACzD;EAEOQ,mBAAmBA,CAAA,EAAG;IACzB,IAAI,IAAI,CAAChB,UAAU,CAACiB,IAAI,KAAK,CAAC,EAAE;MAC5B;IACJ;IAEA,MAAMjB,UAAU,GAAGkB,KAAK,CAACC,IAAI,CAAC,IAAI,CAACnB,UAAU,CAAC;IAE9C,IAAI,IAAI,CAACA,UAAU,CAACiB,IAAI,KAAK,CAAC,EAAE;MAC5BG,OAAO,CAACC,MAAM,CAACC,KAAK,CACf,2EACL,CAAC;MACDF,OAAO,CAACC,MAAM,CAACC,KAAK,CAACtB,UAAU,CAAC,CAAC,CAAC,CAACuB,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,MAAM;MACHH,OAAO,CAACC,MAAM,CAACC,KAAK,CACf,4EACL,CAAC;MAED,KAAK,MAAMT,SAAS,IAAIb,UAAU,EAAE;QAChCoB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAE,KAAIT,SAAS,CAACU,gBAAgB,CAAC,CAAE,EAAC,CAAC;MAC7D;IACJ;IAEAH,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAI,CAAC;EAC9B;EAEOR,gBAAgBA,CAACU,IAAY,EAAE;IAClC,MAAMX,SAAS,GAAGY,oBAAS,CAACC,MAAM,CAAC,IAAI,CAACnB,YAAY,EAAEiB,IAAI,CAAC;IAC3D,IAAI,CAACxB,UAAU,CAAC2B,GAAG,CAACd,SAAS,CAAC;IAC9B,OAAOA,SAAS;EACpB;AACJ;AAACe,OAAA,CAAA7B,WAAA,GAAAA,WAAA"}
1
+ {"version":3,"names":["_LogStream","require","LogReporter","logStreams","Set","constructor","functionName","baseName","split","pop","logGroupName","logsCreatedSince","Date","now","printLogs","logStreamName","logStream","initializeStream","printLogsSince","printLogStreamLinks","size","Array","from","process","stdout","write","getLogStreamLink","name","LogStream","create","add","exports"],"sources":["LogReporter.ts"],"sourcesContent":["import { LogStream } from \"./LogStream\";\n\nexport class LogReporter {\n private readonly logGroupName: string;\n private readonly logsCreatedSince: number;\n private readonly logStreams = new Set<LogStream>();\n\n constructor(functionName: string) {\n const baseName = functionName.split(\":\").pop();\n this.logGroupName = `/aws/lambda/${baseName}`;\n this.logsCreatedSince = Date.now();\n }\n\n public async printLogs(logStreamName: string) {\n const logStream = this.initializeStream(logStreamName);\n await logStream.printLogsSince(this.logsCreatedSince);\n }\n\n public printLogStreamLinks() {\n if (this.logStreams.size === 0) {\n return;\n }\n\n const logStreams = Array.from(this.logStreams);\n\n if (this.logStreams.size === 1) {\n process.stdout.write(\n `\\nTo view detailed logs, visit the following AWS CloudWatch log stream:\\n`\n );\n process.stdout.write(logStreams[0].getLogStreamLink());\n } else {\n process.stdout.write(\n `\\nTo view detailed logs, visit the following AWS CloudWatch log streams:\\n`\n );\n\n for (const logStream of logStreams) {\n process.stdout.write(`- ${logStream.getLogStreamLink()}`);\n }\n }\n\n process.stdout.write(\"\\n\");\n }\n\n public initializeStream(name: string) {\n const logStream = LogStream.create(this.logGroupName, name);\n this.logStreams.add(logStream);\n return logStream;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,WAAW,CAAC;EAGJC,UAAU,GAAG,IAAIC,GAAG,CAAY,CAAC;EAElDC,WAAWA,CAACC,YAAoB,EAAE;IAC9B,MAAMC,QAAQ,GAAGD,YAAY,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAACC,YAAY,GAAG,eAAeH,QAAQ,EAAE;IAC7C,IAAI,CAACI,gBAAgB,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACtC;EAEA,MAAaC,SAASA,CAACC,aAAqB,EAAE;IAC1C,MAAMC,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACF,aAAa,CAAC;IACtD,MAAMC,SAAS,CAACE,cAAc,CAAC,IAAI,CAACP,gBAAgB,CAAC;EACzD;EAEOQ,mBAAmBA,CAAA,EAAG;IACzB,IAAI,IAAI,CAAChB,UAAU,CAACiB,IAAI,KAAK,CAAC,EAAE;MAC5B;IACJ;IAEA,MAAMjB,UAAU,GAAGkB,KAAK,CAACC,IAAI,CAAC,IAAI,CAACnB,UAAU,CAAC;IAE9C,IAAI,IAAI,CAACA,UAAU,CAACiB,IAAI,KAAK,CAAC,EAAE;MAC5BG,OAAO,CAACC,MAAM,CAACC,KAAK,CAChB,2EACJ,CAAC;MACDF,OAAO,CAACC,MAAM,CAACC,KAAK,CAACtB,UAAU,CAAC,CAAC,CAAC,CAACuB,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,MAAM;MACHH,OAAO,CAACC,MAAM,CAACC,KAAK,CAChB,4EACJ,CAAC;MAED,KAAK,MAAMT,SAAS,IAAIb,UAAU,EAAE;QAChCoB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,KAAKT,SAAS,CAACU,gBAAgB,CAAC,CAAC,EAAE,CAAC;MAC7D;IACJ;IAEAH,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAI,CAAC;EAC9B;EAEOR,gBAAgBA,CAACU,IAAY,EAAE;IAClC,MAAMX,SAAS,GAAGY,oBAAS,CAACC,MAAM,CAAC,IAAI,CAACnB,YAAY,EAAEiB,IAAI,CAAC;IAC3D,IAAI,CAACxB,UAAU,CAAC2B,GAAG,CAACd,SAAS,CAAC;IAC9B,OAAOA,SAAS;EACpB;AACJ;AAACe,OAAA,CAAA7B,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_clientCloudwatch","require","cache","Map","LogStream","constructor","logGroupName","logStreamName","cloudWatchLogs","CloudWatchLogs","getLogStreamLink","replacements","replacer","value","replacement","replace","process","env","AWS_REGION","reduce","join","printLogsSince","startTime","params","nextToken","nextPage","startFromHead","unmask","events","nextForwardToken","getLogEvents","forEach","event","stdout","write","String","message","err","console","log","create","cacheId","has","get","logStream","set","exports"],"sources":["LogStream.ts"],"sourcesContent":["import { CloudWatchLogs, GetLogEventsRequest } from \"@webiny/aws-sdk/client-cloudwatch\";\n\nconst cache = new Map<string, LogStream>();\n\nexport class LogStream {\n private readonly logGroupName: string;\n private readonly logStreamName: string;\n private readonly cloudWatchLogs: CloudWatchLogs;\n private nextPage: string | undefined;\n\n private constructor(logGroupName: string, logStreamName: string) {\n this.logGroupName = logGroupName;\n this.logStreamName = logStreamName;\n this.cloudWatchLogs = new CloudWatchLogs();\n }\n\n getLogStreamLink() {\n const replacements = [\n [/\\$/g, \"$2524\"],\n [/\\//g, \"$252F\"],\n [/\\[/g, \"$255B\"],\n [/]/g, \"$255D\"]\n ];\n\n const replacer = (value: string, replacement: (string | RegExp)[]) => {\n return value.replace(replacement[0], replacement[1] as string);\n };\n\n return [\n `https://${process.env.AWS_REGION}.console.aws.amazon.com/cloudwatch/home?region=${process.env.AWS_REGION}#logsV2:log-groups/log-group/`,\n replacements.reduce(replacer, this.logGroupName),\n \"/log-events/\",\n replacements.reduce(replacer, this.logStreamName)\n ].join(\"\");\n }\n\n async printLogsSince(startTime: number): Promise<void> {\n const params: GetLogEventsRequest = {\n logStreamName: this.logStreamName,\n logGroupName: this.logGroupName,\n nextToken: this.nextPage,\n startFromHead: true,\n startTime,\n unmask: true\n };\n\n try {\n const { events, nextForwardToken } = await this.cloudWatchLogs.getLogEvents(params);\n\n this.nextPage = nextForwardToken;\n\n if (events) {\n events.forEach(event => {\n process.stdout.write(String(event.message));\n });\n }\n } catch (err) {\n console.log(`Couldn't fetch logs: ${err.message}`);\n }\n }\n\n public static create(logGroupName: string, logStreamName: string) {\n const cacheId = `${logGroupName}:${logStreamName}`;\n\n if (cache.has(cacheId)) {\n return cache.get(cacheId) as LogStream;\n }\n\n const logStream = new LogStream(logGroupName, logStreamName);\n cache.set(cacheId, logStream);\n\n return logStream;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAEA,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAoB,CAAC;AAEnC,MAAMC,SAAS,CAAC;EAMXC,WAAWA,CAACC,YAAoB,EAAEC,aAAqB,EAAE;IAC7D,IAAI,CAACD,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACC,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACC,cAAc,GAAG,IAAIC,gCAAc,CAAC,CAAC;EAC9C;EAEAC,gBAAgBA,CAAA,EAAG;IACf,MAAMC,YAAY,GAAG,CACjB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,IAAI,EAAE,OAAO,CAAC,CAClB;IAED,MAAMC,QAAQ,GAAGA,CAACC,KAAa,EAAEC,WAAgC,KAAK;MAClE,OAAOD,KAAK,CAACE,OAAO,CAACD,WAAW,CAAC,CAAC,CAAC,EAAEA,WAAW,CAAC,CAAC,CAAW,CAAC;IAClE,CAAC;IAED,OAAO,CACF,WAAUE,OAAO,CAACC,GAAG,CAACC,UAAW,kDAAiDF,OAAO,CAACC,GAAG,CAACC,UAAW,+BAA8B,EACxIP,YAAY,CAACQ,MAAM,CAACP,QAAQ,EAAE,IAAI,CAACN,YAAY,CAAC,EAChD,cAAc,EACdK,YAAY,CAACQ,MAAM,CAACP,QAAQ,EAAE,IAAI,CAACL,aAAa,CAAC,CACpD,CAACa,IAAI,CAAC,EAAE,CAAC;EACd;EAEA,MAAMC,cAAcA,CAACC,SAAiB,EAAiB;IACnD,MAAMC,MAA2B,GAAG;MAChChB,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCD,YAAY,EAAE,IAAI,CAACA,YAAY;MAC/BkB,SAAS,EAAE,IAAI,CAACC,QAAQ;MACxBC,aAAa,EAAE,IAAI;MACnBJ,SAAS;MACTK,MAAM,EAAE;IACZ,CAAC;IAED,IAAI;MACA,MAAM;QAAEC,MAAM;QAAEC;MAAiB,CAAC,GAAG,MAAM,IAAI,CAACrB,cAAc,CAACsB,YAAY,CAACP,MAAM,CAAC;MAEnF,IAAI,CAACE,QAAQ,GAAGI,gBAAgB;MAEhC,IAAID,MAAM,EAAE;QACRA,MAAM,CAACG,OAAO,CAACC,KAAK,IAAI;UACpBhB,OAAO,CAACiB,MAAM,CAACC,KAAK,CAACC,MAAM,CAACH,KAAK,CAACI,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC;MACN;IACJ,CAAC,CAAC,OAAOC,GAAG,EAAE;MACVC,OAAO,CAACC,GAAG,CAAE,wBAAuBF,GAAG,CAACD,OAAQ,EAAC,CAAC;IACtD;EACJ;EAEA,OAAcI,MAAMA,CAAClC,YAAoB,EAAEC,aAAqB,EAAE;IAC9D,MAAMkC,OAAO,GAAI,GAAEnC,YAAa,IAAGC,aAAc,EAAC;IAElD,IAAIL,KAAK,CAACwC,GAAG,CAACD,OAAO,CAAC,EAAE;MACpB,OAAOvC,KAAK,CAACyC,GAAG,CAACF,OAAO,CAAC;IAC7B;IAEA,MAAMG,SAAS,GAAG,IAAIxC,SAAS,CAACE,YAAY,EAAEC,aAAa,CAAC;IAC5DL,KAAK,CAAC2C,GAAG,CAACJ,OAAO,EAAEG,SAAS,CAAC;IAE7B,OAAOA,SAAS;EACpB;AACJ;AAACE,OAAA,CAAA1C,SAAA,GAAAA,SAAA"}
1
+ {"version":3,"names":["_clientCloudwatch","require","cache","Map","LogStream","constructor","logGroupName","logStreamName","cloudWatchLogs","CloudWatchLogs","getLogStreamLink","replacements","replacer","value","replacement","replace","process","env","AWS_REGION","reduce","join","printLogsSince","startTime","params","nextToken","nextPage","startFromHead","unmask","events","nextForwardToken","getLogEvents","forEach","event","stdout","write","String","message","err","console","log","create","cacheId","has","get","logStream","set","exports"],"sources":["LogStream.ts"],"sourcesContent":["import type { GetLogEventsRequest } from \"@webiny/aws-sdk/client-cloudwatch\";\nimport { CloudWatchLogs } from \"@webiny/aws-sdk/client-cloudwatch\";\n\nconst cache = new Map<string, LogStream>();\n\nexport class LogStream {\n private readonly logGroupName: string;\n private readonly logStreamName: string;\n private readonly cloudWatchLogs: CloudWatchLogs;\n private nextPage: string | undefined;\n\n private constructor(logGroupName: string, logStreamName: string) {\n this.logGroupName = logGroupName;\n this.logStreamName = logStreamName;\n this.cloudWatchLogs = new CloudWatchLogs();\n }\n\n getLogStreamLink() {\n const replacements = [\n [/\\$/g, \"$2524\"],\n [/\\//g, \"$252F\"],\n [/\\[/g, \"$255B\"],\n [/]/g, \"$255D\"]\n ];\n\n const replacer = (value: string, replacement: (string | RegExp)[]) => {\n return value.replace(replacement[0], replacement[1] as string);\n };\n\n return [\n `https://${process.env.AWS_REGION}.console.aws.amazon.com/cloudwatch/home?region=${process.env.AWS_REGION}#logsV2:log-groups/log-group/`,\n replacements.reduce(replacer, this.logGroupName),\n \"/log-events/\",\n replacements.reduce(replacer, this.logStreamName)\n ].join(\"\");\n }\n\n async printLogsSince(startTime: number): Promise<void> {\n const params: GetLogEventsRequest = {\n logStreamName: this.logStreamName,\n logGroupName: this.logGroupName,\n nextToken: this.nextPage,\n startFromHead: true,\n startTime,\n unmask: true\n };\n\n try {\n const { events, nextForwardToken } = await this.cloudWatchLogs.getLogEvents(params);\n\n this.nextPage = nextForwardToken;\n\n if (events) {\n events.forEach(event => {\n process.stdout.write(String(event.message));\n });\n }\n } catch (err) {\n console.log(`Couldn't fetch logs: ${err.message}`);\n }\n }\n\n public static create(logGroupName: string, logStreamName: string) {\n const cacheId = `${logGroupName}:${logStreamName}`;\n\n if (cache.has(cacheId)) {\n return cache.get(cacheId) as LogStream;\n }\n\n const logStream = new LogStream(logGroupName, logStreamName);\n cache.set(cacheId, logStream);\n\n return logStream;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,OAAA;AAEA,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAoB,CAAC;AAEnC,MAAMC,SAAS,CAAC;EAMXC,WAAWA,CAACC,YAAoB,EAAEC,aAAqB,EAAE;IAC7D,IAAI,CAACD,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACC,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACC,cAAc,GAAG,IAAIC,gCAAc,CAAC,CAAC;EAC9C;EAEAC,gBAAgBA,CAAA,EAAG;IACf,MAAMC,YAAY,GAAG,CACjB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,CAAC,IAAI,EAAE,OAAO,CAAC,CAClB;IAED,MAAMC,QAAQ,GAAGA,CAACC,KAAa,EAAEC,WAAgC,KAAK;MAClE,OAAOD,KAAK,CAACE,OAAO,CAACD,WAAW,CAAC,CAAC,CAAC,EAAEA,WAAW,CAAC,CAAC,CAAW,CAAC;IAClE,CAAC;IAED,OAAO,CACH,WAAWE,OAAO,CAACC,GAAG,CAACC,UAAU,kDAAkDF,OAAO,CAACC,GAAG,CAACC,UAAU,+BAA+B,EACxIP,YAAY,CAACQ,MAAM,CAACP,QAAQ,EAAE,IAAI,CAACN,YAAY,CAAC,EAChD,cAAc,EACdK,YAAY,CAACQ,MAAM,CAACP,QAAQ,EAAE,IAAI,CAACL,aAAa,CAAC,CACpD,CAACa,IAAI,CAAC,EAAE,CAAC;EACd;EAEA,MAAMC,cAAcA,CAACC,SAAiB,EAAiB;IACnD,MAAMC,MAA2B,GAAG;MAChChB,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCD,YAAY,EAAE,IAAI,CAACA,YAAY;MAC/BkB,SAAS,EAAE,IAAI,CAACC,QAAQ;MACxBC,aAAa,EAAE,IAAI;MACnBJ,SAAS;MACTK,MAAM,EAAE;IACZ,CAAC;IAED,IAAI;MACA,MAAM;QAAEC,MAAM;QAAEC;MAAiB,CAAC,GAAG,MAAM,IAAI,CAACrB,cAAc,CAACsB,YAAY,CAACP,MAAM,CAAC;MAEnF,IAAI,CAACE,QAAQ,GAAGI,gBAAgB;MAEhC,IAAID,MAAM,EAAE;QACRA,MAAM,CAACG,OAAO,CAACC,KAAK,IAAI;UACpBhB,OAAO,CAACiB,MAAM,CAACC,KAAK,CAACC,MAAM,CAACH,KAAK,CAACI,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC;MACN;IACJ,CAAC,CAAC,OAAOC,GAAG,EAAE;MACVC,OAAO,CAACC,GAAG,CAAC,wBAAwBF,GAAG,CAACD,OAAO,EAAE,CAAC;IACtD;EACJ;EAEA,OAAcI,MAAMA,CAAClC,YAAoB,EAAEC,aAAqB,EAAE;IAC9D,MAAMkC,OAAO,GAAG,GAAGnC,YAAY,IAAIC,aAAa,EAAE;IAElD,IAAIL,KAAK,CAACwC,GAAG,CAACD,OAAO,CAAC,EAAE;MACpB,OAAOvC,KAAK,CAACyC,GAAG,CAACF,OAAO,CAAC;IAC7B;IAEA,MAAMG,SAAS,GAAG,IAAIxC,SAAS,CAACE,YAAY,EAAEC,aAAa,CAAC;IAC5DL,KAAK,CAAC2C,GAAG,CAACJ,OAAO,EAAEG,SAAS,CAAC;IAE7B,OAAOA,SAAS;EACpB;AACJ;AAACE,OAAA,CAAA1C,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { MigrationRunnerResult } from "./MigrationRunner";
1
+ import type { MigrationRunnerResult } from "./MigrationRunner";
2
2
  export interface MigrationRunReporter {
3
3
  report(result: MigrationRunnerResult): void | Promise<void>;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["MigrationRunReporter.ts"],"sourcesContent":["import { MigrationRunnerResult } from \"~/cli/MigrationRunner\";\n\nexport interface MigrationRunReporter {\n report(result: MigrationRunnerResult): void | Promise<void>;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["MigrationRunReporter.ts"],"sourcesContent":["import type { MigrationRunnerResult } from \"~/cli/MigrationRunner\";\n\nexport interface MigrationRunReporter {\n report(result: MigrationRunnerResult): void | Promise<void>;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,6 +1,6 @@
1
- import { LambdaClient } from "@webiny/aws-sdk/client-lambda";
2
- import { MigrationStatusReporter } from "./MigrationStatusReporter";
3
- import { MigrationInvocationErrorResponse, MigrationStatusResponse } from "../types";
1
+ import type { LambdaClient } from "@webiny/aws-sdk/client-lambda";
2
+ import type { MigrationStatusReporter } from "./MigrationStatusReporter";
3
+ import type { MigrationInvocationErrorResponse, MigrationStatusResponse } from "../types";
4
4
  interface MigrationRunnerConfig {
5
5
  lambdaClient: LambdaClient;
6
6
  functionName: string;
@@ -9,6 +9,7 @@ interface MigrationRunnerConfig {
9
9
  interface MigrationPayload {
10
10
  version: string;
11
11
  pattern?: string;
12
+ force?: boolean;
12
13
  }
13
14
  interface SuccessResultHandler {
14
15
  (result: MigrationStatusResponse["data"]): void | Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"names":["_clientLambda","require","_utils","_VoidStatusReporter","MigrationRunnerResult","successBranch","errorBranch","constructor","functionName","result","getFunctionName","onSuccess","cb","push","onError","process","error","handler","data","exports","MigrationRunner","statusReporter","VoidStatusReporter","create","params","runner","lambdaClient","setStatusReporter","reporter","runMigration","payload","invokeMigration","response","Promise","resolve","setTimeout","getMigrationStatusReportInterval","getStatus","getResult","status","reportStatus","report","send","InvokeCommand","FunctionName","InvocationType","Payload","JSON","stringify","command","StatusCode","executeWithRetry","decoder","TextDecoder","parse","decode","envKey","env","parseInt","String"],"sources":["MigrationRunner.ts"],"sourcesContent":["import { InvokeCommand, LambdaClient } from \"@webiny/aws-sdk/client-lambda\";\nimport { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport {\n MigrationEventHandlerResponse,\n MigrationInvocationErrorResponse,\n MigrationStatus,\n MigrationStatusResponse\n} from \"~/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { VoidStatusReporter } from \"./VoidStatusReporter\";\n\ninterface MigrationRunnerConfig {\n lambdaClient: LambdaClient;\n functionName: string;\n statusReporter?: MigrationStatusReporter;\n}\n\ninterface MigrationPayload {\n version: string;\n pattern?: string;\n}\n\ninterface SuccessResultHandler {\n (result: MigrationStatusResponse[\"data\"]): void | Promise<void>;\n}\n\ninterface ErrorResultHandler {\n (error: MigrationInvocationErrorResponse[\"error\"]): void | Promise<void>;\n}\n\nexport class MigrationRunnerResult {\n private readonly functionName: string;\n private readonly result: MigrationStatusResponse | MigrationInvocationErrorResponse;\n private readonly successBranch: SuccessResultHandler[] = [];\n private readonly errorBranch: ErrorResultHandler[] = [];\n\n constructor(\n functionName: string,\n result: MigrationStatusResponse | MigrationInvocationErrorResponse\n ) {\n this.functionName = functionName;\n this.result = result;\n }\n\n getFunctionName() {\n return this.functionName;\n }\n\n onSuccess(cb: SuccessResultHandler) {\n this.successBranch.push(cb);\n }\n\n onError(cb: ErrorResultHandler) {\n this.errorBranch.push(cb);\n }\n\n async process(): Promise<void> {\n if (this.result.error) {\n for (const handler of this.errorBranch) {\n await handler(this.result.error);\n }\n return;\n }\n\n for (const handler of this.successBranch) {\n await handler(this.result.data);\n }\n }\n}\n\nexport class MigrationRunner {\n private readonly lambdaClient: LambdaClient;\n private readonly functionName: string;\n private statusReporter: MigrationStatusReporter = new VoidStatusReporter();\n\n public static create(params: MigrationRunnerConfig) {\n const runner = new MigrationRunner(params.lambdaClient, params.functionName);\n if (params.statusReporter) {\n runner.setStatusReporter(params.statusReporter);\n }\n return runner;\n }\n\n private constructor(lambdaClient: LambdaClient, functionName: string) {\n this.lambdaClient = lambdaClient;\n this.functionName = functionName;\n }\n\n public setStatusReporter(reporter: MigrationStatusReporter) {\n this.statusReporter = reporter;\n }\n\n async runMigration(payload: MigrationPayload): Promise<MigrationRunnerResult> {\n // Execute migration function.\n await this.invokeMigration(payload);\n\n // Poll for status and re-execute when migration is in \"pending\" state.\n let response: MigrationEventHandlerResponse;\n\n while (true) {\n await new Promise(resolve =>\n setTimeout(resolve, this.getMigrationStatusReportInterval())\n );\n\n response = await this.getStatus(payload);\n\n if (!response) {\n continue;\n }\n\n const { data, error } = response;\n\n // If we received an error, it must be an unrecoverable error, and we don't retry.\n if (error) {\n return this.getResult(response);\n }\n\n switch (data.status) {\n case \"init\":\n await this.reportStatus(data);\n continue;\n case \"pending\":\n await this.invokeMigration(payload);\n break;\n case \"running\":\n await this.reportStatus(data);\n break;\n case \"done\":\n await this.reportStatus(data);\n return this.getResult(response);\n default:\n return this.getResult(response);\n }\n }\n }\n\n private async reportStatus(data: MigrationStatus) {\n await this.statusReporter.report(data);\n }\n\n private async invokeMigration(payload: MigrationPayload) {\n const response = await this.lambdaClient.send(\n new InvokeCommand({\n FunctionName: this.functionName,\n InvocationType: \"Event\",\n Payload: JSON.stringify({ ...payload, command: \"execute\" })\n })\n );\n\n return response.StatusCode;\n }\n\n private getResult(response: MigrationStatusResponse | MigrationInvocationErrorResponse) {\n return new MigrationRunnerResult(this.functionName, response);\n }\n\n private async getStatus(payload: Record<string, any>) {\n const getStatus = () => {\n return this.lambdaClient.send(\n new InvokeCommand({\n FunctionName: this.functionName,\n InvocationType: \"RequestResponse\",\n Payload: JSON.stringify({ ...payload, command: \"status\" })\n })\n );\n };\n\n const response = await executeWithRetry(getStatus);\n\n const decoder = new TextDecoder(\"utf-8\");\n return JSON.parse(decoder.decode(response.Payload)) as MigrationEventHandlerResponse;\n }\n\n private getMigrationStatusReportInterval() {\n const envKey = \"MIGRATION_STATUS_REPORT_INTERVAL\";\n if (envKey in process.env) {\n return parseInt(String(process.env[envKey]));\n }\n return 2000;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_clientLambda","require","_utils","_VoidStatusReporter","MigrationRunnerResult","successBranch","errorBranch","constructor","functionName","result","getFunctionName","onSuccess","cb","push","onError","process","error","handler","data","exports","MigrationRunner","statusReporter","VoidStatusReporter","create","params","runner","lambdaClient","setStatusReporter","reporter","runMigration","payload","invokeMigration","response","Promise","resolve","setTimeout","getMigrationStatusReportInterval","getStatus","getResult","status","reportStatus","report","send","InvokeCommand","FunctionName","InvocationType","Payload","JSON","stringify","command","StatusCode","executeWithRetry","decoder","TextDecoder","parse","decode","envKey","env","parseInt","String"],"sources":["MigrationRunner.ts"],"sourcesContent":["import type { LambdaClient } from \"@webiny/aws-sdk/client-lambda\";\nimport { InvokeCommand } from \"@webiny/aws-sdk/client-lambda\";\nimport type { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport type {\n MigrationEventHandlerResponse,\n MigrationInvocationErrorResponse,\n MigrationStatus,\n MigrationStatusResponse\n} from \"~/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { VoidStatusReporter } from \"./VoidStatusReporter\";\n\ninterface MigrationRunnerConfig {\n lambdaClient: LambdaClient;\n functionName: string;\n statusReporter?: MigrationStatusReporter;\n}\n\ninterface MigrationPayload {\n version: string;\n pattern?: string;\n force?: boolean;\n}\n\ninterface SuccessResultHandler {\n (result: MigrationStatusResponse[\"data\"]): void | Promise<void>;\n}\n\ninterface ErrorResultHandler {\n (error: MigrationInvocationErrorResponse[\"error\"]): void | Promise<void>;\n}\n\nexport class MigrationRunnerResult {\n private readonly functionName: string;\n private readonly result: MigrationStatusResponse | MigrationInvocationErrorResponse;\n private readonly successBranch: SuccessResultHandler[] = [];\n private readonly errorBranch: ErrorResultHandler[] = [];\n\n constructor(\n functionName: string,\n result: MigrationStatusResponse | MigrationInvocationErrorResponse\n ) {\n this.functionName = functionName;\n this.result = result;\n }\n\n getFunctionName() {\n return this.functionName;\n }\n\n onSuccess(cb: SuccessResultHandler) {\n this.successBranch.push(cb);\n }\n\n onError(cb: ErrorResultHandler) {\n this.errorBranch.push(cb);\n }\n\n async process(): Promise<void> {\n if (this.result.error) {\n for (const handler of this.errorBranch) {\n await handler(this.result.error);\n }\n return;\n }\n\n for (const handler of this.successBranch) {\n await handler(this.result.data);\n }\n }\n}\n\nexport class MigrationRunner {\n private readonly lambdaClient: LambdaClient;\n private readonly functionName: string;\n private statusReporter: MigrationStatusReporter = new VoidStatusReporter();\n\n public static create(params: MigrationRunnerConfig) {\n const runner = new MigrationRunner(params.lambdaClient, params.functionName);\n if (params.statusReporter) {\n runner.setStatusReporter(params.statusReporter);\n }\n return runner;\n }\n\n private constructor(lambdaClient: LambdaClient, functionName: string) {\n this.lambdaClient = lambdaClient;\n this.functionName = functionName;\n }\n\n public setStatusReporter(reporter: MigrationStatusReporter) {\n this.statusReporter = reporter;\n }\n\n async runMigration(payload: MigrationPayload): Promise<MigrationRunnerResult> {\n // Execute migration function.\n await this.invokeMigration(payload);\n\n // Poll for status and re-execute when migration is in \"pending\" state.\n let response: MigrationEventHandlerResponse;\n\n while (true) {\n await new Promise(resolve =>\n setTimeout(resolve, this.getMigrationStatusReportInterval())\n );\n\n response = await this.getStatus(payload);\n\n if (!response) {\n continue;\n }\n\n const { data, error } = response;\n\n // If we received an error, it must be an unrecoverable error, and we don't retry.\n if (error) {\n return this.getResult(response);\n }\n\n switch (data.status) {\n case \"init\":\n await this.reportStatus(data);\n continue;\n case \"pending\":\n await this.invokeMigration(payload);\n break;\n case \"running\":\n await this.reportStatus(data);\n break;\n case \"done\":\n await this.reportStatus(data);\n return this.getResult(response);\n default:\n return this.getResult(response);\n }\n }\n }\n\n private async reportStatus(data: MigrationStatus) {\n await this.statusReporter.report(data);\n }\n\n private async invokeMigration(payload: MigrationPayload) {\n const response = await this.lambdaClient.send(\n new InvokeCommand({\n FunctionName: this.functionName,\n InvocationType: \"Event\",\n Payload: JSON.stringify({ ...payload, command: \"execute\" })\n })\n );\n\n return response.StatusCode;\n }\n\n private getResult(response: MigrationStatusResponse | MigrationInvocationErrorResponse) {\n return new MigrationRunnerResult(this.functionName, response);\n }\n\n private async getStatus(payload: Record<string, any>) {\n const getStatus = () => {\n return this.lambdaClient.send(\n new InvokeCommand({\n FunctionName: this.functionName,\n InvocationType: \"RequestResponse\",\n Payload: JSON.stringify({ ...payload, command: \"status\" })\n })\n );\n };\n\n const response = await executeWithRetry(getStatus);\n\n const decoder = new TextDecoder(\"utf-8\");\n return JSON.parse(decoder.decode(response.Payload)) as MigrationEventHandlerResponse;\n }\n\n private getMigrationStatusReportInterval() {\n const envKey = \"MIGRATION_STATUS_REPORT_INTERVAL\";\n if (envKey in process.env) {\n return parseInt(String(process.env[envKey]));\n }\n return 2000;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AAQA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AAsBO,MAAMG,qBAAqB,CAAC;EAGdC,aAAa,GAA2B,EAAE;EAC1CC,WAAW,GAAyB,EAAE;EAEvDC,WAAWA,CACPC,YAAoB,EACpBC,MAAkE,EACpE;IACE,IAAI,CAACD,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACC,MAAM,GAAGA,MAAM;EACxB;EAEAC,eAAeA,CAAA,EAAG;IACd,OAAO,IAAI,CAACF,YAAY;EAC5B;EAEAG,SAASA,CAACC,EAAwB,EAAE;IAChC,IAAI,CAACP,aAAa,CAACQ,IAAI,CAACD,EAAE,CAAC;EAC/B;EAEAE,OAAOA,CAACF,EAAsB,EAAE;IAC5B,IAAI,CAACN,WAAW,CAACO,IAAI,CAACD,EAAE,CAAC;EAC7B;EAEA,MAAMG,OAAOA,CAAA,EAAkB;IAC3B,IAAI,IAAI,CAACN,MAAM,CAACO,KAAK,EAAE;MACnB,KAAK,MAAMC,OAAO,IAAI,IAAI,CAACX,WAAW,EAAE;QACpC,MAAMW,OAAO,CAAC,IAAI,CAACR,MAAM,CAACO,KAAK,CAAC;MACpC;MACA;IACJ;IAEA,KAAK,MAAMC,OAAO,IAAI,IAAI,CAACZ,aAAa,EAAE;MACtC,MAAMY,OAAO,CAAC,IAAI,CAACR,MAAM,CAACS,IAAI,CAAC;IACnC;EACJ;AACJ;AAACC,OAAA,CAAAf,qBAAA,GAAAA,qBAAA;AAEM,MAAMgB,eAAe,CAAC;EAGjBC,cAAc,GAA4B,IAAIC,sCAAkB,CAAC,CAAC;EAE1E,OAAcC,MAAMA,CAACC,MAA6B,EAAE;IAChD,MAAMC,MAAM,GAAG,IAAIL,eAAe,CAACI,MAAM,CAACE,YAAY,EAAEF,MAAM,CAAChB,YAAY,CAAC;IAC5E,IAAIgB,MAAM,CAACH,cAAc,EAAE;MACvBI,MAAM,CAACE,iBAAiB,CAACH,MAAM,CAACH,cAAc,CAAC;IACnD;IACA,OAAOI,MAAM;EACjB;EAEQlB,WAAWA,CAACmB,YAA0B,EAAElB,YAAoB,EAAE;IAClE,IAAI,CAACkB,YAAY,GAAGA,YAAY;IAChC,IAAI,CAAClB,YAAY,GAAGA,YAAY;EACpC;EAEOmB,iBAAiBA,CAACC,QAAiC,EAAE;IACxD,IAAI,CAACP,cAAc,GAAGO,QAAQ;EAClC;EAEA,MAAMC,YAAYA,CAACC,OAAyB,EAAkC;IAC1E;IACA,MAAM,IAAI,CAACC,eAAe,CAACD,OAAO,CAAC;;IAEnC;IACA,IAAIE,QAAuC;IAE3C,OAAO,IAAI,EAAE;MACT,MAAM,IAAIC,OAAO,CAACC,OAAO,IACrBC,UAAU,CAACD,OAAO,EAAE,IAAI,CAACE,gCAAgC,CAAC,CAAC,CAC/D,CAAC;MAEDJ,QAAQ,GAAG,MAAM,IAAI,CAACK,SAAS,CAACP,OAAO,CAAC;MAExC,IAAI,CAACE,QAAQ,EAAE;QACX;MACJ;MAEA,MAAM;QAAEd,IAAI;QAAEF;MAAM,CAAC,GAAGgB,QAAQ;;MAEhC;MACA,IAAIhB,KAAK,EAAE;QACP,OAAO,IAAI,CAACsB,SAAS,CAACN,QAAQ,CAAC;MACnC;MAEA,QAAQd,IAAI,CAACqB,MAAM;QACf,KAAK,MAAM;UACP,MAAM,IAAI,CAACC,YAAY,CAACtB,IAAI,CAAC;UAC7B;QACJ,KAAK,SAAS;UACV,MAAM,IAAI,CAACa,eAAe,CAACD,OAAO,CAAC;UACnC;QACJ,KAAK,SAAS;UACV,MAAM,IAAI,CAACU,YAAY,CAACtB,IAAI,CAAC;UAC7B;QACJ,KAAK,MAAM;UACP,MAAM,IAAI,CAACsB,YAAY,CAACtB,IAAI,CAAC;UAC7B,OAAO,IAAI,CAACoB,SAAS,CAACN,QAAQ,CAAC;QACnC;UACI,OAAO,IAAI,CAACM,SAAS,CAACN,QAAQ,CAAC;MACvC;IACJ;EACJ;EAEA,MAAcQ,YAAYA,CAACtB,IAAqB,EAAE;IAC9C,MAAM,IAAI,CAACG,cAAc,CAACoB,MAAM,CAACvB,IAAI,CAAC;EAC1C;EAEA,MAAca,eAAeA,CAACD,OAAyB,EAAE;IACrD,MAAME,QAAQ,GAAG,MAAM,IAAI,CAACN,YAAY,CAACgB,IAAI,CACzC,IAAIC,2BAAa,CAAC;MACdC,YAAY,EAAE,IAAI,CAACpC,YAAY;MAC/BqC,cAAc,EAAE,OAAO;MACvBC,OAAO,EAAEC,IAAI,CAACC,SAAS,CAAC;QAAE,GAAGlB,OAAO;QAAEmB,OAAO,EAAE;MAAU,CAAC;IAC9D,CAAC,CACL,CAAC;IAED,OAAOjB,QAAQ,CAACkB,UAAU;EAC9B;EAEQZ,SAASA,CAACN,QAAoE,EAAE;IACpF,OAAO,IAAI5B,qBAAqB,CAAC,IAAI,CAACI,YAAY,EAAEwB,QAAQ,CAAC;EACjE;EAEA,MAAcK,SAASA,CAACP,OAA4B,EAAE;IAClD,MAAMO,SAAS,GAAGA,CAAA,KAAM;MACpB,OAAO,IAAI,CAACX,YAAY,CAACgB,IAAI,CACzB,IAAIC,2BAAa,CAAC;QACdC,YAAY,EAAE,IAAI,CAACpC,YAAY;QAC/BqC,cAAc,EAAE,iBAAiB;QACjCC,OAAO,EAAEC,IAAI,CAACC,SAAS,CAAC;UAAE,GAAGlB,OAAO;UAAEmB,OAAO,EAAE;QAAS,CAAC;MAC7D,CAAC,CACL,CAAC;IACL,CAAC;IAED,MAAMjB,QAAQ,GAAG,MAAM,IAAAmB,uBAAgB,EAACd,SAAS,CAAC;IAElD,MAAMe,OAAO,GAAG,IAAIC,WAAW,CAAC,OAAO,CAAC;IACxC,OAAON,IAAI,CAACO,KAAK,CAACF,OAAO,CAACG,MAAM,CAACvB,QAAQ,CAACc,OAAO,CAAC,CAAC;EACvD;EAEQV,gCAAgCA,CAAA,EAAG;IACvC,MAAMoB,MAAM,GAAG,kCAAkC;IACjD,IAAIA,MAAM,IAAIzC,OAAO,CAAC0C,GAAG,EAAE;MACvB,OAAOC,QAAQ,CAACC,MAAM,CAAC5C,OAAO,CAAC0C,GAAG,CAACD,MAAM,CAAC,CAAC,CAAC;IAChD;IACA,OAAO,IAAI;EACf;AACJ;AAACrC,OAAA,CAAAC,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { MigrationStatus } from "../types";
1
+ import type { MigrationStatus } from "../types";
2
2
  export interface MigrationStatusReporter {
3
3
  report(status: MigrationStatus): void;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["MigrationStatusReporter.ts"],"sourcesContent":["import { MigrationStatus } from \"~/types\";\n\nexport interface MigrationStatusReporter {\n report(status: MigrationStatus): void;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["MigrationStatusReporter.ts"],"sourcesContent":["import type { MigrationStatus } from \"~/types\";\n\nexport interface MigrationStatusReporter {\n report(status: MigrationStatus): void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,6 +1,6 @@
1
- import { MigrationStatusReporter } from "./MigrationStatusReporter";
2
- import { MigrationStatus } from "../types";
3
- import { LogReporter } from "./LogReporter";
1
+ import type { MigrationStatusReporter } from "./MigrationStatusReporter";
2
+ import type { MigrationStatus } from "../types";
3
+ import type { LogReporter } from "./LogReporter";
4
4
  export declare class NonInteractiveCliStatusReporter implements MigrationStatusReporter {
5
5
  private logReporter;
6
6
  private firstCall;
@@ -1 +1 @@
1
- {"version":3,"names":["NonInteractiveCliStatusReporter","firstCall","constructor","logReporter","console","log","report","migrationStatus","status","context","currentLogStreamName","logStreamName","initializeStream","printLogStreamLinks","process","stdout","write","printLogs","includes","Promise","resolve","setTimeout","exports"],"sources":["NonInteractiveCliStatusReporter.ts"],"sourcesContent":["import { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport { MigrationStatus } from \"~/types\";\nimport { LogReporter } from \"~/cli/LogReporter\";\n\nexport class NonInteractiveCliStatusReporter implements MigrationStatusReporter {\n private logReporter: LogReporter;\n private firstCall = true;\n\n constructor(logReporter: LogReporter) {\n this.logReporter = logReporter;\n console.log(`Using \"NonInteractiveCliStatusReporter\".`);\n }\n\n async report(migrationStatus: MigrationStatus) {\n const { status, context } = migrationStatus;\n\n const currentLogStreamName = context?.logStreamName;\n\n if (currentLogStreamName) {\n this.logReporter.initializeStream(currentLogStreamName);\n if (this.firstCall) {\n this.logReporter.printLogStreamLinks();\n process.stdout.write(`\\n---------- MIGRATION LOGS START ----------\\n\\n`);\n }\n await this.logReporter.printLogs(currentLogStreamName);\n }\n\n if ([\"done\", \"error\"].includes(status)) {\n // We want to give AWS some time for the latest log events to become available.\n await new Promise(resolve => {\n setTimeout(resolve, 10000);\n });\n\n if (currentLogStreamName) {\n await this.logReporter.printLogs(currentLogStreamName);\n process.stdout.write(`\\n---------- MIGRATION LOGS END ----------\\n`);\n }\n }\n\n this.firstCall = false;\n }\n}\n"],"mappings":";;;;;;AAIO,MAAMA,+BAA+B,CAAoC;EAEpEC,SAAS,GAAG,IAAI;EAExBC,WAAWA,CAACC,WAAwB,EAAE;IAClC,IAAI,CAACA,WAAW,GAAGA,WAAW;IAC9BC,OAAO,CAACC,GAAG,CAAE,0CAAyC,CAAC;EAC3D;EAEA,MAAMC,MAAMA,CAACC,eAAgC,EAAE;IAC3C,MAAM;MAAEC,MAAM;MAAEC;IAAQ,CAAC,GAAGF,eAAe;IAE3C,MAAMG,oBAAoB,GAAGD,OAAO,EAAEE,aAAa;IAEnD,IAAID,oBAAoB,EAAE;MACtB,IAAI,CAACP,WAAW,CAACS,gBAAgB,CAACF,oBAAoB,CAAC;MACvD,IAAI,IAAI,CAACT,SAAS,EAAE;QAChB,IAAI,CAACE,WAAW,CAACU,mBAAmB,CAAC,CAAC;QACtCC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAE,kDAAiD,CAAC;MAC5E;MACA,MAAM,IAAI,CAACb,WAAW,CAACc,SAAS,CAACP,oBAAoB,CAAC;IAC1D;IAEA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAACQ,QAAQ,CAACV,MAAM,CAAC,EAAE;MACpC;MACA,MAAM,IAAIW,OAAO,CAACC,OAAO,IAAI;QACzBC,UAAU,CAACD,OAAO,EAAE,KAAK,CAAC;MAC9B,CAAC,CAAC;MAEF,IAAIV,oBAAoB,EAAE;QACtB,MAAM,IAAI,CAACP,WAAW,CAACc,SAAS,CAACP,oBAAoB,CAAC;QACtDI,OAAO,CAACC,MAAM,CAACC,KAAK,CAAE,8CAA6C,CAAC;MACxE;IACJ;IAEA,IAAI,CAACf,SAAS,GAAG,KAAK;EAC1B;AACJ;AAACqB,OAAA,CAAAtB,+BAAA,GAAAA,+BAAA"}
1
+ {"version":3,"names":["NonInteractiveCliStatusReporter","firstCall","constructor","logReporter","console","log","report","migrationStatus","status","context","currentLogStreamName","logStreamName","initializeStream","printLogStreamLinks","process","stdout","write","printLogs","includes","Promise","resolve","setTimeout","exports"],"sources":["NonInteractiveCliStatusReporter.ts"],"sourcesContent":["import type { MigrationStatusReporter } from \"~/cli/MigrationStatusReporter\";\nimport type { MigrationStatus } from \"~/types\";\nimport type { LogReporter } from \"~/cli/LogReporter\";\n\nexport class NonInteractiveCliStatusReporter implements MigrationStatusReporter {\n private logReporter: LogReporter;\n private firstCall = true;\n\n constructor(logReporter: LogReporter) {\n this.logReporter = logReporter;\n console.log(`Using \"NonInteractiveCliStatusReporter\".`);\n }\n\n async report(migrationStatus: MigrationStatus) {\n const { status, context } = migrationStatus;\n\n const currentLogStreamName = context?.logStreamName;\n\n if (currentLogStreamName) {\n this.logReporter.initializeStream(currentLogStreamName);\n if (this.firstCall) {\n this.logReporter.printLogStreamLinks();\n process.stdout.write(`\\n---------- MIGRATION LOGS START ----------\\n\\n`);\n }\n await this.logReporter.printLogs(currentLogStreamName);\n }\n\n if ([\"done\", \"error\"].includes(status)) {\n // We want to give AWS some time for the latest log events to become available.\n await new Promise(resolve => {\n setTimeout(resolve, 10000);\n });\n\n if (currentLogStreamName) {\n await this.logReporter.printLogs(currentLogStreamName);\n process.stdout.write(`\\n---------- MIGRATION LOGS END ----------\\n`);\n }\n }\n\n this.firstCall = false;\n }\n}\n"],"mappings":";;;;;;AAIO,MAAMA,+BAA+B,CAAoC;EAEpEC,SAAS,GAAG,IAAI;EAExBC,WAAWA,CAACC,WAAwB,EAAE;IAClC,IAAI,CAACA,WAAW,GAAGA,WAAW;IAC9BC,OAAO,CAACC,GAAG,CAAC,0CAA0C,CAAC;EAC3D;EAEA,MAAMC,MAAMA,CAACC,eAAgC,EAAE;IAC3C,MAAM;MAAEC,MAAM;MAAEC;IAAQ,CAAC,GAAGF,eAAe;IAE3C,MAAMG,oBAAoB,GAAGD,OAAO,EAAEE,aAAa;IAEnD,IAAID,oBAAoB,EAAE;MACtB,IAAI,CAACP,WAAW,CAACS,gBAAgB,CAACF,oBAAoB,CAAC;MACvD,IAAI,IAAI,CAACT,SAAS,EAAE;QAChB,IAAI,CAACE,WAAW,CAACU,mBAAmB,CAAC,CAAC;QACtCC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,kDAAkD,CAAC;MAC5E;MACA,MAAM,IAAI,CAACb,WAAW,CAACc,SAAS,CAACP,oBAAoB,CAAC;IAC1D;IAEA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAACQ,QAAQ,CAACV,MAAM,CAAC,EAAE;MACpC;MACA,MAAM,IAAIW,OAAO,CAACC,OAAO,IAAI;QACzBC,UAAU,CAACD,OAAO,EAAE,KAAK,CAAC;MAC9B,CAAC,CAAC;MAEF,IAAIV,oBAAoB,EAAE;QACtB,MAAM,IAAI,CAACP,WAAW,CAACc,SAAS,CAACP,oBAAoB,CAAC;QACtDI,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,8CAA8C,CAAC;MACxE;IACJ;IAEA,IAAI,CAACf,SAAS,GAAG,KAAK;EAC1B;AACJ;AAACqB,OAAA,CAAAtB,+BAAA,GAAAA,+BAAA","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { MigrationStatusReporter } from "./MigrationStatusReporter";
1
+ import type { MigrationStatusReporter } from "./MigrationStatusReporter";
2
2
  export declare class VoidStatusReporter implements MigrationStatusReporter {
3
3
  report(): void;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"names":["VoidStatusReporter","report","exports"],"sources":["VoidStatusReporter.ts"],"sourcesContent":["import { MigrationStatusReporter } from \"./MigrationStatusReporter\";\n\nexport class VoidStatusReporter implements MigrationStatusReporter {\n report(): void {\n // This is a void reporter.\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,CAAoC;EAC/DC,MAAMA,CAAA,EAAS;IACX;EAAA;AAER;AAACC,OAAA,CAAAF,kBAAA,GAAAA,kBAAA"}
1
+ {"version":3,"names":["VoidStatusReporter","report","exports"],"sources":["VoidStatusReporter.ts"],"sourcesContent":["import type { MigrationStatusReporter } from \"./MigrationStatusReporter\";\n\nexport class VoidStatusReporter implements MigrationStatusReporter {\n report(): void {\n // This is a void reporter.\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,CAAoC;EAC/DC,MAAMA,CAAA,EAAS;IACX;EAAA;AAER;AAACC,OAAA,CAAAF,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["getDuration","since","ms","Date","getTime","seconds","Math","floor","minutes","undefined","exports"],"sources":["getDuration.ts"],"sourcesContent":["/**\n * Get duration since the given ISO timestamp.\n * @param string since\n */\nexport const getDuration = (since: string) => {\n const ms = new Date().getTime() - new Date(since).getTime();\n let seconds = Math.floor(ms / 1000);\n let minutes = undefined;\n if (seconds > 60) {\n minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds % 60);\n }\n\n return minutes ? `${minutes}m ${seconds}s` : `${seconds}s`;\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACO,MAAMA,WAAW,GAAIC,KAAa,IAAK;EAC1C,MAAMC,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,GAAG,IAAID,IAAI,CAACF,KAAK,CAAC,CAACG,OAAO,CAAC,CAAC;EAC3D,IAAIC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACL,EAAE,GAAG,IAAI,CAAC;EACnC,IAAIM,OAAO,GAAGC,SAAS;EACvB,IAAIJ,OAAO,GAAG,EAAE,EAAE;IACdG,OAAO,GAAGF,IAAI,CAACC,KAAK,CAACF,OAAO,GAAG,EAAE,CAAC;IAClCA,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACF,OAAO,GAAG,EAAE,CAAC;EACtC;EAEA,OAAOG,OAAO,GAAI,GAAEA,OAAQ,KAAIH,OAAQ,GAAE,GAAI,GAAEA,OAAQ,GAAE;AAC9D,CAAC;AAACK,OAAA,CAAAV,WAAA,GAAAA,WAAA"}
1
+ {"version":3,"names":["getDuration","since","ms","Date","getTime","seconds","Math","floor","minutes","undefined","exports"],"sources":["getDuration.ts"],"sourcesContent":["/**\n * Get duration since the given ISO timestamp.\n * @param string since\n */\nexport const getDuration = (since: string) => {\n const ms = new Date().getTime() - new Date(since).getTime();\n let seconds = Math.floor(ms / 1000);\n let minutes = undefined;\n if (seconds > 60) {\n minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds % 60);\n }\n\n return minutes ? `${minutes}m ${seconds}s` : `${seconds}s`;\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACO,MAAMA,WAAW,GAAIC,KAAa,IAAK;EAC1C,MAAMC,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,GAAG,IAAID,IAAI,CAACF,KAAK,CAAC,CAACG,OAAO,CAAC,CAAC;EAC3D,IAAIC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACL,EAAE,GAAG,IAAI,CAAC;EACnC,IAAIM,OAAO,GAAGC,SAAS;EACvB,IAAIJ,OAAO,GAAG,EAAE,EAAE;IACdG,OAAO,GAAGF,IAAI,CAACC,KAAK,CAACF,OAAO,GAAG,EAAE,CAAC;IAClCA,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACF,OAAO,GAAG,EAAE,CAAC;EACtC;EAEA,OAAOG,OAAO,GAAG,GAAGA,OAAO,KAAKH,OAAO,GAAG,GAAG,GAAGA,OAAO,GAAG;AAC9D,CAAC;AAACK,OAAA,CAAAV,WAAA,GAAAA,WAAA","ignoreList":[]}
package/cli/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from "./MigrationStatusReporter";
4
4
  export * from "./MigrationRunReporter";
5
5
  export * from "./InteractiveCliStatusReporter";
6
6
  export * from "./NonInteractiveCliStatusReporter";
7
+ export * from "./VoidStatusReporter";
7
8
  export * from "./CliMigrationRunReporter";
8
9
  export * from "./LogStream";
9
10
  export * from "./LogReporter";
package/cli/index.js CHANGED
@@ -69,6 +69,17 @@ Object.keys(_NonInteractiveCliStatusReporter).forEach(function (key) {
69
69
  }
70
70
  });
71
71
  });
72
+ var _VoidStatusReporter = require("./VoidStatusReporter");
73
+ Object.keys(_VoidStatusReporter).forEach(function (key) {
74
+ if (key === "default" || key === "__esModule") return;
75
+ if (key in exports && exports[key] === _VoidStatusReporter[key]) return;
76
+ Object.defineProperty(exports, key, {
77
+ enumerable: true,
78
+ get: function () {
79
+ return _VoidStatusReporter[key];
80
+ }
81
+ });
82
+ });
72
83
  var _CliMigrationRunReporter = require("./CliMigrationRunReporter");
73
84
  Object.keys(_CliMigrationRunReporter).forEach(function (key) {
74
85
  if (key === "default" || key === "__esModule") return;