@kurdel/pirx 0.1.0-beta.3 → 0.1.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,11 +15,18 @@ npm install --save-dev @kurdel/pirx@beta
15
15
  npx pirx migrate run
16
16
  npx pirx migrate rollback
17
17
  npx pirx migrate refresh
18
+ npx pirx migrate status
18
19
  ```
19
20
 
20
21
  The commands use the database and migration configuration of the current
21
22
  Kurdel application.
22
23
 
24
+ Mutating commands acquire a database-backed lease before discovering or
25
+ executing migrations, preventing concurrent deploys from applying the same
26
+ migration. The lease is released after success or failure. `status` is
27
+ read-only and lists applied migrations with their batch, pending files, and
28
+ applied records whose migration file is missing.
29
+
23
30
  ## Requirements
24
31
 
25
32
  Node.js 20.19+, 22.12+, or 24+.
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import zod from 'zod';
3
- export declare const args: zod.ZodTuple<[zod.ZodEnum<["run", "rollback", "refresh"]>], null>;
3
+ export declare const args: zod.ZodTuple<[zod.ZodEnum<["run", "rollback", "refresh", "status"]>], null>;
4
4
  type Props = {
5
5
  args: zod.infer<typeof args>;
6
6
  };
@@ -5,10 +5,11 @@ import { Box, Text } from 'ink';
5
5
  import MigrateRun from '../components/migrate-run.js';
6
6
  import MigrateRollback from '../components/migrate-rollback.js';
7
7
  import MigrateRefresh from '../components/migrate-refresh.js';
8
+ import MigrateStatus from '../components/migrate-status.js';
8
9
  import Checkmark from '../components/checkmark.js';
9
10
  import useMigrationManager from '../hooks/use-migration-manager.js';
10
11
  export const args = zod.tuple([
11
- zod.enum(['run', 'rollback', 'refresh']).describe(argument({
12
+ zod.enum(['run', 'rollback', 'refresh', 'status']).describe(argument({
12
13
  name: 'command',
13
14
  description: 'Command name',
14
15
  })),
@@ -21,6 +22,7 @@ export default function MigrateCommand({ args: [command] }) {
21
22
  React.createElement(Text, null, "Connecting database")),
22
23
  !!manager && command === 'run' && React.createElement(MigrateRun, { manager: manager }),
23
24
  !!manager && command === 'rollback' && React.createElement(MigrateRollback, { manager: manager }),
24
- !!manager && command === 'refresh' && React.createElement(MigrateRefresh, { manager: manager })));
25
+ !!manager && command === 'refresh' && React.createElement(MigrateRefresh, { manager: manager }),
26
+ !!manager && command === 'status' && React.createElement(MigrateStatus, { manager: manager })));
25
27
  }
26
28
  //# sourceMappingURL=migrate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,UAAU,MAAM,8BAA8B,CAAC;AACtD,OAAO,eAAe,MAAM,mCAAmC,CAAC;AAChE,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,mBAAmB,MAAM,mCAAmC,CAAC;AAEpE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAC/C,QAAQ,CAAC;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,cAAc;KAC5B,CAAC,CACH;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAS;IAC/D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEtC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC;QACxC,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,SAAS,IAAC,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI;YAC9B,oBAAC,IAAI,8BAA2B,CAC5B;QACL,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,oBAAC,UAAU,IAAC,OAAO,EAAE,OAAO,GAAG;QACjE,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,UAAU,IAAI,oBAAC,eAAe,IAAC,OAAO,EAAE,OAAO,GAAG;QAC3E,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,oBAAC,cAAc,IAAC,OAAO,EAAE,OAAO,GAAG,CACtE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,UAAU,MAAM,8BAA8B,CAAC;AACtD,OAAO,eAAe,MAAM,mCAAmC,CAAC;AAChE,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,mBAAmB,MAAM,mCAAmC,CAAC;AAEpE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CACzD,QAAQ,CAAC;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,cAAc;KAC5B,CAAC,CACH;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAS;IAC/D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEtC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC;QACxC,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,SAAS,IAAC,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI;YAC9B,oBAAC,IAAI,8BAA2B,CAC5B;QACL,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,oBAAC,UAAU,IAAC,OAAO,EAAE,OAAO,GAAG;QACjE,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,UAAU,IAAI,oBAAC,eAAe,IAAC,OAAO,EAAE,OAAO,GAAG;QAC3E,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,oBAAC,cAAc,IAAC,OAAO,EAAE,OAAO,GAAG;QACzE,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,oBAAC,aAAa,IAAC,OAAO,EAAE,OAAO,GAAG,CACpE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { MigrationManager } from '@kurdel/migrations';
3
+ type Props = {
4
+ manager: MigrationManager;
5
+ };
6
+ export default function MigrateStatus({ manager }: Props): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,25 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Box, Text, useApp } from 'ink';
3
+ export default function MigrateStatus({ manager }) {
4
+ const { exit } = useApp();
5
+ const [status, setStatus] = useState([]);
6
+ const [error, setError] = useState();
7
+ useEffect(() => {
8
+ manager.status()
9
+ .then(setStatus)
10
+ .catch(reason => setError(reason instanceof Error ? reason.message : String(reason)))
11
+ .finally(() => manager.close().then(() => exit()));
12
+ }, []);
13
+ return (React.createElement(Box, { flexDirection: "column" },
14
+ status.map(migration => (React.createElement(Text, { key: migration.name, color: migration.state === 'applied'
15
+ ? 'green'
16
+ : migration.state === 'pending' ? 'yellow' : 'red' },
17
+ migration.state.padEnd(7),
18
+ " ",
19
+ migration.name,
20
+ migration.batch === undefined ? '' : ` (batch ${migration.batch})`))),
21
+ error && React.createElement(Text, { color: "red" },
22
+ "Failure with message: ",
23
+ error)));
24
+ }
25
+ //# sourceMappingURL=migrate-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-status.js","sourceRoot":"","sources":["../../src/components/migrate-status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAIxC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,OAAO,EAAS;IACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,MAAM,EAAE;aACb,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;aACpF,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACxB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CACvB,oBAAC,IAAI,IACH,GAAG,EAAE,SAAS,CAAC,IAAI,EACnB,KAAK,EAAE,SAAS,CAAC,KAAK,KAAK,SAAS;gBAClC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;YAEnD,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;;YAAG,SAAS,CAAC,IAAI;YAC1C,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,KAAK,GAAG,CAC9D,CACR,CAAC;QACD,KAAK,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;YAAwB,KAAK,CAAQ,CAC5D,CACP,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kurdel/pirx",
3
- "version": "0.1.0-beta.3",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "Command-line tooling for Kurdel applications",
5
5
  "type": "module",
6
6
  "files": [
@@ -41,7 +41,7 @@
41
41
  "tag": "beta"
42
42
  },
43
43
  "dependencies": {
44
- "@kurdel/migrations": "0.1.0-beta.3",
44
+ "@kurdel/migrations": "0.1.0-beta.4",
45
45
  "ink": "^4.4.1",
46
46
  "ink-spinner": "^5.0.0",
47
47
  "pastel": "^2.0.2",