@goldstack/template-dynamodb 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +5 -0
  2. package/bin/template +11 -0
  3. package/dist/src/dynamoDBData.d.ts +6 -0
  4. package/dist/src/dynamoDBData.d.ts.map +1 -0
  5. package/dist/src/dynamoDBData.js +83 -0
  6. package/dist/src/dynamoDBData.js.map +1 -0
  7. package/dist/src/dynamoDBMigrations.d.ts +11 -0
  8. package/dist/src/dynamoDBMigrations.d.ts.map +1 -0
  9. package/dist/src/dynamoDBMigrations.js +34 -0
  10. package/dist/src/dynamoDBMigrations.js.map +1 -0
  11. package/dist/src/dynamoDBPackageUtils.d.ts +5 -0
  12. package/dist/src/dynamoDBPackageUtils.d.ts.map +1 -0
  13. package/dist/src/dynamoDBPackageUtils.js +25 -0
  14. package/dist/src/dynamoDBPackageUtils.js.map +1 -0
  15. package/dist/src/dynamoDBTableCli.d.ts +2 -0
  16. package/dist/src/dynamoDBTableCli.d.ts.map +1 -0
  17. package/dist/src/dynamoDBTableCli.js +41 -0
  18. package/dist/src/dynamoDBTableCli.js.map +1 -0
  19. package/dist/src/localDynamoDB.d.ts +10 -0
  20. package/dist/src/localDynamoDB.d.ts.map +1 -0
  21. package/dist/src/localDynamoDB.js +64 -0
  22. package/dist/src/localDynamoDB.js.map +1 -0
  23. package/dist/src/templateDynamoDB.d.ts +5 -0
  24. package/dist/src/templateDynamoDB.d.ts.map +1 -0
  25. package/dist/src/templateDynamoDB.js +86 -0
  26. package/dist/src/templateDynamoDB.js.map +1 -0
  27. package/dist/src/templateDynamoDBTable.d.ts +28 -0
  28. package/dist/src/templateDynamoDBTable.d.ts.map +1 -0
  29. package/dist/src/templateDynamoDBTable.js +103 -0
  30. package/dist/src/templateDynamoDBTable.js.map +1 -0
  31. package/dist/src/types/DynamoDBDeployment.d.ts +11 -0
  32. package/dist/src/types/DynamoDBDeployment.d.ts.map +1 -0
  33. package/dist/src/types/DynamoDBDeployment.js +3 -0
  34. package/dist/src/types/DynamoDBDeployment.js.map +1 -0
  35. package/dist/src/types/DynamoDBDeploymentConfiguration.d.ts +16 -0
  36. package/dist/src/types/DynamoDBDeploymentConfiguration.d.ts.map +1 -0
  37. package/dist/src/types/DynamoDBDeploymentConfiguration.js +3 -0
  38. package/dist/src/types/DynamoDBDeploymentConfiguration.js.map +1 -0
  39. package/dist/src/types/DynamoDBPackage.d.ts +22 -0
  40. package/dist/src/types/DynamoDBPackage.d.ts.map +1 -0
  41. package/dist/src/types/DynamoDBPackage.js +3 -0
  42. package/dist/src/types/DynamoDBPackage.js.map +1 -0
  43. package/dist/src/types/DynamoDBPackageConfiguration.d.ts +14 -0
  44. package/dist/src/types/DynamoDBPackageConfiguration.d.ts.map +1 -0
  45. package/dist/src/types/DynamoDBPackageConfiguration.js +3 -0
  46. package/dist/src/types/DynamoDBPackageConfiguration.js.map +1 -0
  47. package/dist/src/umzugDynamoDBStorage.d.ts +22 -0
  48. package/dist/src/umzugDynamoDBStorage.d.ts.map +1 -0
  49. package/dist/src/umzugDynamoDBStorage.js +76 -0
  50. package/dist/src/umzugDynamoDBStorage.js.map +1 -0
  51. package/package.json +81 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Goldstack DynamoDB Template Tools
2
+
3
+ This library provides an API and CLI for building Node.js modules that wrap a DynamoDB Table. These tools allow deploying the infrastructure for the table as well as a way to connect with the table across multiple environments (such as dev, staging and production).
4
+
5
+ For more information, see [DynamoDB Template](https://docs.goldstack.party/docs/templates/dynamodb).
package/bin/template ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+
3
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
4
+ require('source-map-support').install();
5
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
6
+ require('./../dist/src/templateS3')
7
+ .run(process.argv)
8
+ .catch((e) => {
9
+ console.log(e);
10
+ process.exit(1);
11
+ });
@@ -0,0 +1,6 @@
1
+ import { PackageConfig } from '@goldstack/utils-package-config';
2
+ import DynamoDB from 'aws-sdk/clients/dynamodb';
3
+ import { DynamoDBDeployment, DynamoDBPackage } from './templateDynamoDB';
4
+ export declare const assertTable: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName: string, client: DynamoDB) => Promise<void>;
5
+ export declare const deleteTable: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName: string, client: DynamoDB) => Promise<void>;
6
+ //# sourceMappingURL=dynamoDBData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBData.d.ts","sourceRoot":"","sources":["../../src/dynamoDBData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEzE,eAAO,MAAM,WAAW,kBACP,cAAc,eAAe,EAAE,kBAAkB,CAAC,kBACjD,MAAM,UACd,QAAQ,KACf,QAAQ,IAAI,CAqDd,CAAC;AAEF,eAAO,MAAM,WAAW,kBACP,cAAc,eAAe,EAAE,kBAAkB,CAAC,kBACjD,MAAM,UACd,QAAQ,KACf,QAAQ,IAAI,CAqBd,CAAC"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteTable = exports.assertTable = void 0;
4
+ const dynamoDBPackageUtils_1 = require("./dynamoDBPackageUtils");
5
+ const assertTable = async (packageConfig, deploymentName, client) => {
6
+ const tableName = await (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
7
+ const res = client
8
+ .createTable({
9
+ TableName: tableName,
10
+ AttributeDefinitions: [
11
+ {
12
+ AttributeName: 'pk',
13
+ AttributeType: 'S',
14
+ },
15
+ {
16
+ AttributeName: 'sk',
17
+ AttributeType: 'S',
18
+ },
19
+ ],
20
+ KeySchema: [
21
+ {
22
+ AttributeName: 'pk',
23
+ KeyType: 'HASH',
24
+ },
25
+ {
26
+ AttributeName: 'sk',
27
+ KeyType: 'RANGE',
28
+ },
29
+ ],
30
+ BillingMode: 'PAY_PER_REQUEST',
31
+ })
32
+ .promise();
33
+ await new Promise((resolve, reject) => {
34
+ res
35
+ .then(async () => {
36
+ var _a;
37
+ let retries = 0;
38
+ let tableStatus = undefined;
39
+ // ensure that able is ACTIVE before proceeding
40
+ while (tableStatus !== 'ACTIVE' && retries < 20) {
41
+ const tableInfo = await client
42
+ .describeTable({ TableName: tableName })
43
+ .promise();
44
+ tableStatus = (_a = tableInfo.Table) === null || _a === void 0 ? void 0 : _a.TableStatus;
45
+ retries++;
46
+ }
47
+ resolve();
48
+ })
49
+ .catch((e) => {
50
+ if (e.code === 'ResourceInUseException') {
51
+ // all good if table exists already
52
+ resolve();
53
+ return;
54
+ }
55
+ reject(e);
56
+ });
57
+ });
58
+ };
59
+ exports.assertTable = assertTable;
60
+ const deleteTable = async (packageConfig, deploymentName, client) => {
61
+ const tableName = await (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
62
+ const res = client
63
+ .deleteTable({
64
+ TableName: tableName,
65
+ })
66
+ .promise();
67
+ await new Promise((resolve, reject) => {
68
+ res
69
+ .then(async () => {
70
+ resolve();
71
+ })
72
+ .catch((e) => {
73
+ if (e.code === 'ResourceNotFoundException') {
74
+ // all good if table already deleted
75
+ resolve();
76
+ return;
77
+ }
78
+ reject(e);
79
+ });
80
+ });
81
+ };
82
+ exports.deleteTable = deleteTable;
83
+ //# sourceMappingURL=dynamoDBData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBData.js","sourceRoot":"","sources":["../../src/dynamoDBData.ts"],"names":[],"mappings":";;;AAGA,iEAAsD;AAG/C,MAAM,WAAW,GAAG,KAAK,EAC9B,aAAiE,EACjE,cAAsB,EACtB,MAAgB,EACD,EAAE;IACjB,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAY,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM;SACf,WAAW,CAAC;QACX,SAAS,EAAE,SAAS;QACpB,oBAAoB,EAAE;YACpB;gBACE,aAAa,EAAE,IAAI;gBACnB,aAAa,EAAE,GAAG;aACnB;YACD;gBACE,aAAa,EAAE,IAAI;gBACnB,aAAa,EAAE,GAAG;aACnB;SACF;QACD,SAAS,EAAE;YACT;gBACE,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,MAAM;aAChB;YACD;gBACE,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,OAAO;aACjB;SACF;QACD,WAAW,EAAE,iBAAiB;KAC/B,CAAC;SACD,OAAO,EAAE,CAAC;IAEb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,GAAG;aACA,IAAI,CAAC,KAAK,IAAI,EAAE;;YACf,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,WAAW,GAAuB,SAAS,CAAC;YAChD,+CAA+C;YAC/C,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,GAAG,EAAE,EAAE;gBAC/C,MAAM,SAAS,GAAG,MAAM,MAAM;qBAC3B,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;qBACvC,OAAO,EAAE,CAAC;gBACb,WAAW,GAAG,MAAA,SAAS,CAAC,KAAK,0CAAE,WAAW,CAAC;gBAC3C,OAAO,EAAE,CAAC;aACX;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAW,EAAE,EAAE;YACrB,IAAI,CAAC,CAAC,IAAI,KAAK,wBAAwB,EAAE;gBACvC,mCAAmC;gBACnC,OAAO,EAAE,CAAC;gBACV,OAAO;aACR;YACD,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAzDW,QAAA,WAAW,eAyDtB;AAEK,MAAM,WAAW,GAAG,KAAK,EAC9B,aAAiE,EACjE,cAAsB,EACtB,MAAgB,EACD,EAAE;IACjB,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAY,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM;SACf,WAAW,CAAC;QACX,SAAS,EAAE,SAAS;KACrB,CAAC;SACD,OAAO,EAAE,CAAC;IACb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,GAAG;aACA,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAW,EAAE,EAAE;YACrB,IAAI,CAAC,CAAC,IAAI,KAAK,2BAA2B,EAAE;gBAC1C,oCAAoC;gBACpC,OAAO,EAAE,CAAC;gBACV,OAAO;aACR;YACD,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAzBW,QAAA,WAAW,eAyBtB"}
@@ -0,0 +1,11 @@
1
+ import { PackageConfig } from '@goldstack/utils-package-config';
2
+ import DynamoDB from 'aws-sdk/clients/dynamodb';
3
+ import DynamoDBPackage, { DynamoDBDeployment } from './types/DynamoDBPackage';
4
+ import { InputMigrations } from 'umzug/lib/types';
5
+ export interface DynamoDBContext {
6
+ client: DynamoDB;
7
+ tableName: string;
8
+ }
9
+ export declare const performMigrations: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName: string, migrations: InputMigrations<DynamoDBContext>, client: DynamoDB) => Promise<void>;
10
+ export declare const migrateDownTo: (migrationName: string, packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName: string, migrations: InputMigrations<DynamoDBContext>, client: DynamoDB) => Promise<void>;
11
+ //# sourceMappingURL=dynamoDBMigrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBMigrations.d.ts","sourceRoot":"","sources":["../../src/dynamoDBMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAEhD,OAAO,eAAe,EAAE,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,kBACb,cAAc,eAAe,EAAE,kBAAkB,CAAC,kBACjD,MAAM,cACV,gBAAgB,eAAe,CAAC,UACpC,QAAQ,KACf,QAAQ,IAAI,CASd,CAAC;AAEF,eAAO,MAAM,aAAa,kBACT,MAAM,iBACN,cAAc,eAAe,EAAE,kBAAkB,CAAC,kBACjD,MAAM,cACV,gBAAgB,eAAe,CAAC,UACpC,QAAQ,KACf,QAAQ,IAAI,CASd,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrateDownTo = exports.performMigrations = void 0;
4
+ const dynamoDBPackageUtils_1 = require("./dynamoDBPackageUtils");
5
+ const umzugDynamoDBStorage_1 = require("./umzugDynamoDBStorage");
6
+ const umzug_1 = require("umzug");
7
+ const performMigrations = async (packageConfig, deploymentName, migrations, client) => {
8
+ const umzug = await initUmzug(packageConfig, deploymentName, client, migrations);
9
+ await umzug.up();
10
+ };
11
+ exports.performMigrations = performMigrations;
12
+ const migrateDownTo = async (migrationName, packageConfig, deploymentName, migrations, client) => {
13
+ const umzug = await initUmzug(packageConfig, deploymentName, client, migrations);
14
+ await umzug.down({ to: migrationName });
15
+ };
16
+ exports.migrateDownTo = migrateDownTo;
17
+ async function initUmzug(packageConfig, deploymentName, client, migrations) {
18
+ const tableName = await (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
19
+ const storage = new umzugDynamoDBStorage_1.DynamoDBStorage({
20
+ dynamoDB: client,
21
+ tableName,
22
+ });
23
+ const umzug = new umzug_1.Umzug({
24
+ migrations: migrations,
25
+ context: {
26
+ client,
27
+ tableName,
28
+ },
29
+ logger: console,
30
+ storage: storage,
31
+ });
32
+ return umzug;
33
+ }
34
+ //# sourceMappingURL=dynamoDBMigrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBMigrations.js","sourceRoot":"","sources":["../../src/dynamoDBMigrations.ts"],"names":[],"mappings":";;;AAEA,iEAAsD;AAEtD,iEAAyD;AAGzD,iCAA8B;AAOvB,MAAM,iBAAiB,GAAG,KAAK,EACpC,aAAiE,EACjE,cAAsB,EACtB,UAA4C,EAC5C,MAAgB,EACD,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,SAAS,CAC3B,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,CACX,CAAC;IAEF,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC;AACnB,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,aAAqB,EACrB,aAAiE,EACjE,cAAsB,EACtB,UAA4C,EAC5C,MAAgB,EACD,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,SAAS,CAC3B,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,CACX,CAAC;IAEF,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC;AAfW,QAAA,aAAa,iBAexB;AAEF,KAAK,UAAU,SAAS,CACtB,aAAiE,EACjE,cAAsB,EACtB,MAAgB,EAChB,UAA4C;IAE5C,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAY,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,sCAAe,CAAC;QAClC,QAAQ,EAAE,MAAM;QAChB,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,aAAK,CAAkB;QACvC,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE;YACP,MAAM;YACN,SAAS;SACV;QACD,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { PackageConfig } from '@goldstack/utils-package-config';
2
+ import DynamoDBPackage, { DynamoDBDeployment } from './types/DynamoDBPackage';
3
+ export declare const getTableName: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName?: string | undefined) => Promise<string>;
4
+ export declare const getDeploymentName: (deploymentName?: string | undefined) => string;
5
+ //# sourceMappingURL=dynamoDBPackageUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBPackageUtils.d.ts","sourceRoot":"","sources":["../../src/dynamoDBPackageUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,eAAe,EAAE,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,eAAO,MAAM,YAAY,kBACR,cAAc,eAAe,EAAE,kBAAkB,CAAC,0CAEhE,QAAQ,MAAM,CAOhB,CAAC;AAEF,eAAO,MAAM,iBAAiB,2CAA8B,MAS3D,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDeploymentName = exports.getTableName = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const getTableName = async (packageConfig, deploymentName) => {
9
+ deploymentName = (0, exports.getDeploymentName)(deploymentName);
10
+ if (deploymentName === 'local') {
11
+ return `local-${packageConfig.getConfig().name}`;
12
+ }
13
+ const deployment = packageConfig.getDeployment(deploymentName);
14
+ return deployment.configuration.tableName;
15
+ };
16
+ exports.getTableName = getTableName;
17
+ const getDeploymentName = (deploymentName) => {
18
+ if (!deploymentName) {
19
+ (0, assert_1.default)(process.env.GOLDSTACK_DEPLOYMENT, 'Cannot connect to DynamoDB table. Either specify a deploymentName or ensure environment variable GOLDSTACK_DEPLOYMENT is defined.');
20
+ return process.env.GOLDSTACK_DEPLOYMENT;
21
+ }
22
+ return deploymentName;
23
+ };
24
+ exports.getDeploymentName = getDeploymentName;
25
+ //# sourceMappingURL=dynamoDBPackageUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBPackageUtils.js","sourceRoot":"","sources":["../../src/dynamoDBPackageUtils.ts"],"names":[],"mappings":";;;;;;AAEA,oDAA4B;AAGrB,MAAM,YAAY,GAAG,KAAK,EAC/B,aAAiE,EACjE,cAAuB,EACN,EAAE;IACnB,cAAc,GAAG,IAAA,yBAAiB,EAAC,cAAc,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,OAAO,EAAE;QAC9B,OAAO,SAAS,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;KAClD;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;AAC5C,CAAC,CAAC;AAVW,QAAA,YAAY,gBAUvB;AAEK,MAAM,iBAAiB,GAAG,CAAC,cAAuB,EAAU,EAAE;IACnE,IAAI,CAAC,cAAc,EAAE;QACnB,IAAA,gBAAM,EACJ,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAChC,mIAAmI,CACpI,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;KACzC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AATW,QAAA,iBAAiB,qBAS5B"}
@@ -0,0 +1,2 @@
1
+ export declare const dynamoDBCli: (args: string[]) => Promise<void>;
2
+ //# sourceMappingURL=dynamoDBTableCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBTableCli.d.ts","sourceRoot":"","sources":["../../src/dynamoDBTableCli.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,SAAgB,MAAM,EAAE,KAAG,QAAQ,IAAI,CAmC9D,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dynamoDBCli = void 0;
4
+ const utils_sh_1 = require("@goldstack/utils-sh");
5
+ const templateDynamoDBTable_1 = require("./templateDynamoDBTable");
6
+ const dynamoDBCli = async (args) => {
7
+ const goldstackConfig = JSON.parse((0, utils_sh_1.read)(`${process.cwd()}/goldstack.json`));
8
+ const packageSchema = JSON.parse((0, utils_sh_1.read)(`${process.cwd()}/schemas/package.schema.json`));
9
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
10
+ const migrations = require(`${process.cwd()}/src/migrations`).createMigrations();
11
+ if (args[0] === 'init') {
12
+ await (0, templateDynamoDBTable_1.connect)({
13
+ goldstackConfig,
14
+ packageSchema,
15
+ migrations,
16
+ deploymentName: args[1],
17
+ });
18
+ return;
19
+ }
20
+ if (args[0] === 'delete') {
21
+ await (0, templateDynamoDBTable_1.deleteTable)({
22
+ goldstackConfig,
23
+ packageSchema,
24
+ deploymentName: args[1],
25
+ });
26
+ return;
27
+ }
28
+ if (args[0] === 'migrate-to') {
29
+ await (0, templateDynamoDBTable_1.migrateDownTo)({
30
+ goldstackConfig,
31
+ packageSchema,
32
+ migrations,
33
+ migrationName: args[2],
34
+ deploymentName: args[1],
35
+ });
36
+ return;
37
+ }
38
+ throw new Error(`Unknown DynamoDB table command: ${args[0]}`);
39
+ };
40
+ exports.dynamoDBCli = dynamoDBCli;
41
+ //# sourceMappingURL=dynamoDBTableCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDBTableCli.js","sourceRoot":"","sources":["../../src/dynamoDBTableCli.ts"],"names":[],"mappings":";;;AAAA,kDAA2C;AAC3C,mEAA8E;AAEvE,MAAM,WAAW,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACjE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,eAAI,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,IAAA,eAAI,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,8BAA8B,CAAC,CACrD,CAAC;IACF,8DAA8D;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACjF,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;QACtB,MAAM,IAAA,+BAAO,EAAC;YACZ,eAAe;YACf,aAAa;YACb,UAAU;YACV,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;SACxB,CAAC,CAAC;QACH,OAAO;KACR;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACxB,MAAM,IAAA,mCAAW,EAAC;YAChB,eAAe;YACf,aAAa;YACb,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;SACxB,CAAC,CAAC;QACH,OAAO;KACR;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;QAC5B,MAAM,IAAA,qCAAa,EAAC;YAClB,eAAe;YACf,aAAa;YACb,UAAU;YACV,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;YACtB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;SACxB,CAAC,CAAC;QACH,OAAO;KACR;IACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC,CAAC;AAnCW,QAAA,WAAW,eAmCtB"}
@@ -0,0 +1,10 @@
1
+ import { PackageConfig } from '@goldstack/utils-package-config';
2
+ import { DynamoDB } from 'aws-sdk';
3
+ import { StartedTestContainer } from 'testcontainers';
4
+ import { DynamoDBDeployment, DynamoDBPackage } from './templateDynamoDB';
5
+ export declare const localConnect: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName?: string | undefined) => Promise<DynamoDB>;
6
+ export declare const endpointUrl: (startedContainer: StartedTestContainer) => string;
7
+ export declare const createClient: (startedContainer: StartedTestContainer) => DynamoDB;
8
+ export declare const startContainer: () => Promise<StartedTestContainer>;
9
+ export declare const stopLocalDynamoDB: (packageConfig: PackageConfig<DynamoDBPackage, DynamoDBDeployment>, deploymentName?: string | undefined) => Promise<void>;
10
+ //# sourceMappingURL=localDynamoDB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localDynamoDB.d.ts","sourceRoot":"","sources":["../../src/localDynamoDB.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAoB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAYzE,eAAO,MAAM,YAAY,kBACR,cAAc,eAAe,EAAE,kBAAkB,CAAC,0CAEhE,QAAQ,QAAQ,CAmBlB,CAAC;AAEF,eAAO,MAAM,WAAW,qBAAsB,oBAAoB,KAAG,MAIpE,CAAC;AAEF,eAAO,MAAM,YAAY,qBACL,oBAAoB,KACrC,QAUF,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,QAAQ,oBAAoB,CAK7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,kBACb,cAAc,eAAe,EAAE,kBAAkB,CAAC,0CAEhE,QAAQ,IAAI,CAad,CAAC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stopLocalDynamoDB = exports.startContainer = exports.createClient = exports.endpointUrl = exports.localConnect = void 0;
4
+ const aws_sdk_1 = require("aws-sdk");
5
+ const testcontainers_1 = require("testcontainers");
6
+ const dynamoDBPackageUtils_1 = require("./dynamoDBPackageUtils");
7
+ const MAPPED_PORT = 8000;
8
+ const IMAGE_NAME = 'amazon/dynamodb-local:1.18.0';
9
+ const startedContainers = new Map();
10
+ const localConnect = async (packageConfig, deploymentName) => {
11
+ const tableName = await (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
12
+ // TODO the key in this map may need to be extended to include the region as well, since dynamodb table names are unique per region.
13
+ let startedContainer = startedContainers.get(tableName);
14
+ if (startedContainer && startedContainer !== 'stopped') {
15
+ return (0, exports.createClient)(startedContainer);
16
+ }
17
+ startedContainer = await (0, exports.startContainer)();
18
+ // Check if another container for this table has already been started in the meanwhile
19
+ const startedContainerTest = startedContainers.get(tableName);
20
+ if (startedContainerTest && startedContainerTest !== 'stopped') {
21
+ await startedContainer.stop();
22
+ return (0, exports.createClient)(startedContainerTest);
23
+ }
24
+ startedContainers.set(tableName, startedContainer);
25
+ return (0, exports.createClient)(startedContainer);
26
+ };
27
+ exports.localConnect = localConnect;
28
+ const endpointUrl = (startedContainer) => {
29
+ return `http://${startedContainer.getHost()}:${startedContainer.getMappedPort(MAPPED_PORT)}`;
30
+ };
31
+ exports.endpointUrl = endpointUrl;
32
+ const createClient = (startedContainer) => {
33
+ const endpoint = (0, exports.endpointUrl)(startedContainer);
34
+ return new aws_sdk_1.DynamoDB({
35
+ endpoint,
36
+ region: 'eu-central-1',
37
+ credentials: {
38
+ accessKeyId: 'dummy',
39
+ secretAccessKey: 'dummy',
40
+ },
41
+ });
42
+ };
43
+ exports.createClient = createClient;
44
+ const startContainer = () => {
45
+ const startedContainer = new testcontainers_1.GenericContainer(IMAGE_NAME)
46
+ .withExposedPorts(MAPPED_PORT)
47
+ .start();
48
+ return startedContainer;
49
+ };
50
+ exports.startContainer = startContainer;
51
+ const stopLocalDynamoDB = async (packageConfig, deploymentName) => {
52
+ const tableName = await (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
53
+ const startedContainer = startedContainers.get(tableName);
54
+ if (!startedContainer) {
55
+ throw new Error(`Attempting to stop container that has not been started for DynamoDB table ${tableName}`);
56
+ }
57
+ if (startedContainer === 'stopped') {
58
+ return;
59
+ }
60
+ startedContainers.set(tableName, 'stopped');
61
+ await startedContainer.stop();
62
+ };
63
+ exports.stopLocalDynamoDB = stopLocalDynamoDB;
64
+ //# sourceMappingURL=localDynamoDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localDynamoDB.js","sourceRoot":"","sources":["../../src/localDynamoDB.ts"],"names":[],"mappings":";;;AAEA,qCAAmC;AACnC,mDAAwE;AAExE,iEAAsD;AAGtD,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAIlD,MAAM,iBAAiB,GAGnB,IAAI,GAAG,EAAE,CAAC;AAEP,MAAM,YAAY,GAAG,KAAK,EAC/B,aAAiE,EACjE,cAAuB,EACJ,EAAE;IACrB,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAY,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAEpE,oIAAoI;IACpI,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,gBAAgB,IAAI,gBAAgB,KAAK,SAAS,EAAE;QACtD,OAAO,IAAA,oBAAY,EAAC,gBAAgB,CAAC,CAAC;KACvC;IACD,gBAAgB,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;IAE1C,sFAAsF;IACtF,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,oBAAoB,IAAI,oBAAoB,KAAK,SAAS,EAAE;QAC9D,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAA,oBAAY,EAAC,oBAAoB,CAAC,CAAC;KAC3C;IAED,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACnD,OAAO,IAAA,oBAAY,EAAC,gBAAgB,CAAC,CAAC;AACxC,CAAC,CAAC;AAtBW,QAAA,YAAY,gBAsBvB;AAEK,MAAM,WAAW,GAAG,CAAC,gBAAsC,EAAU,EAAE;IAC5E,OAAO,UAAU,gBAAgB,CAAC,OAAO,EAAE,IAAI,gBAAgB,CAAC,aAAa,CAC3E,WAAW,CACZ,EAAE,CAAC;AACN,CAAC,CAAC;AAJW,QAAA,WAAW,eAItB;AAEK,MAAM,YAAY,GAAG,CAC1B,gBAAsC,EAC5B,EAAE;IACZ,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,IAAI,kBAAQ,CAAC;QAClB,QAAQ;QACR,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE;YACX,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,OAAO;SACzB;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAEK,MAAM,cAAc,GAAG,GAAkC,EAAE;IAChE,MAAM,gBAAgB,GAAG,IAAI,iCAAgB,CAAC,UAAU,CAAC;SACtD,gBAAgB,CAAC,WAAW,CAAC;SAC7B,KAAK,EAAE,CAAC;IACX,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB;AAEK,MAAM,iBAAiB,GAAG,KAAK,EACpC,aAAiE,EACjE,cAAuB,EACR,EAAE;IACjB,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAY,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CACb,6EAA6E,SAAS,EAAE,CACzF,CAAC;KACH;IACD,IAAI,gBAAgB,KAAK,SAAS,EAAE;QAClC,OAAO;KACR;IACD,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAhBW,QAAA,iBAAiB,qBAgB5B"}
@@ -0,0 +1,5 @@
1
+ export * from './types/DynamoDBPackage';
2
+ export * from './templateDynamoDBTable';
3
+ export type { DynamoDBContext } from './dynamoDBMigrations';
4
+ export declare const run: (args: string[]) => Promise<void>;
5
+ //# sourceMappingURL=templateDynamoDB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateDynamoDB.d.ts","sourceRoot":"","sources":["../../src/templateDynamoDB.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO5D,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,KAAG,QAAQ,IAAI,CA4EtD,CAAC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.run = void 0;
21
+ const utils_package_1 = require("@goldstack/utils-package");
22
+ const utils_cli_1 = require("@goldstack/utils-cli");
23
+ const utils_terraform_1 = require("@goldstack/utils-terraform");
24
+ const utils_terraform_aws_1 = require("@goldstack/utils-terraform-aws");
25
+ __exportStar(require("./types/DynamoDBPackage"), exports);
26
+ __exportStar(require("./templateDynamoDBTable"), exports);
27
+ const utils_package_config_1 = require("@goldstack/utils-package-config");
28
+ const yargs_1 = __importDefault(require("yargs"));
29
+ const assert_1 = __importDefault(require("assert"));
30
+ const dynamoDBTableCli_1 = require("./dynamoDBTableCli");
31
+ const run = async (args) => {
32
+ await (0, utils_cli_1.wrapCli)(async () => {
33
+ const deploymentPositional = (yargs) => {
34
+ return yargs.positional('deployment', {
35
+ type: 'string',
36
+ describe: 'Name of the deployment of the table',
37
+ demandOption: true,
38
+ });
39
+ };
40
+ const argv = (0, utils_package_1.buildCli)({
41
+ yargs: yargs_1.default,
42
+ deployCommands: (0, utils_package_1.buildDeployCommands)(),
43
+ infraCommands: (0, utils_terraform_1.infraCommands)(),
44
+ })
45
+ .usage('$0 <table>')
46
+ .command('table <init|delete|migrate-to> <deployment>', 'Utility commands for DynamoDB table', (yargs) => {
47
+ yargs
48
+ .command('init', 'Initialise DynamoDB table and run all applicable migrations', deploymentPositional)
49
+ .command('delete', 'Deletes DynamoDB table and all its data', deploymentPositional)
50
+ .command('migrate-to', 'Migrate DynamoDB table', (yargs) => deploymentPositional(yargs).positional('migration-name', {
51
+ type: 'string',
52
+ describe: 'The name of the migration that the table should be migrated to.',
53
+ demandOption: true,
54
+ }));
55
+ })
56
+ .help().argv;
57
+ const packageConfig = new utils_package_config_1.PackageConfig({
58
+ packagePath: './',
59
+ });
60
+ const config = packageConfig.getConfig();
61
+ (0, assert_1.default)(config, 'DynamoDB package config could not be loaded.');
62
+ const command = argv._[0];
63
+ const [, , , ...opArgs] = args;
64
+ if (command === 'infra') {
65
+ if (opArgs[0] === 'up') {
66
+ await (0, dynamoDBTableCli_1.dynamoDBCli)(['init', opArgs[1]]);
67
+ }
68
+ await (0, utils_terraform_aws_1.terraformAwsCli)(opArgs);
69
+ if (opArgs[0] === 'destroy') {
70
+ await (0, dynamoDBTableCli_1.dynamoDBCli)(['delete', opArgs[1]]);
71
+ }
72
+ return;
73
+ }
74
+ if (command === 'deploy') {
75
+ await (0, dynamoDBTableCli_1.dynamoDBCli)(['init', opArgs[0]]);
76
+ return;
77
+ }
78
+ if (command === 'table') {
79
+ await (0, dynamoDBTableCli_1.dynamoDBCli)(opArgs);
80
+ return;
81
+ }
82
+ throw new Error('Unknown command: ' + command);
83
+ });
84
+ };
85
+ exports.run = run;
86
+ //# sourceMappingURL=templateDynamoDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateDynamoDB.js","sourceRoot":"","sources":["../../src/templateDynamoDB.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,4DAAyE;AACzE,oDAA+C;AAC/C,gEAA2D;AAC3D,wEAAiE;AACjE,0DAAwC;AACxC,0DAAwC;AAExC,0EAAgE;AAEhE,kDAAoC;AACpC,oDAA4B;AAC5B,yDAAiD;AAE1C,MAAM,GAAG,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACzD,MAAM,IAAA,mBAAO,EAAC,KAAK,IAAI,EAAE;QACvB,MAAM,oBAAoB,GAAG,CAAC,KAAgB,EAAa,EAAE;YAC3D,OAAO,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE;gBACpC,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,qCAAqC;gBAC/C,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC;YACpB,KAAK,EAAL,eAAK;YACL,cAAc,EAAE,IAAA,mCAAmB,GAAE;YACrC,aAAa,EAAE,IAAA,+BAAa,GAAE;SAC/B,CAAC;aACC,KAAK,CAAC,YAAY,CAAC;aACnB,OAAO,CACN,6CAA6C,EAC7C,qCAAqC,EACrC,CAAC,KAAK,EAAE,EAAE;YACR,KAAK;iBACF,OAAO,CACN,MAAM,EACN,6DAA6D,EAC7D,oBAAoB,CACrB;iBACA,OAAO,CACN,QAAQ,EACR,yCAAyC,EACzC,oBAAoB,CACrB;iBACA,OAAO,CAAC,YAAY,EAAE,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,CACzD,oBAAoB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE;gBACvD,IAAI,EAAE,QAAQ;gBACd,QAAQ,EACN,iEAAiE;gBACnE,YAAY,EAAE,IAAI;aACnB,CAAC,CACH,CAAC;QACN,CAAC,CACF;aACA,IAAI,EAAE,CAAC,IAAI,CAAC;QAEf,MAAM,aAAa,GAAG,IAAI,oCAAa,CAGrC;YACA,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QACzC,IAAA,gBAAM,EAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC;QAE/B,IAAI,OAAO,KAAK,OAAO,EAAE;YACvB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,IAAA,8BAAW,EAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxC;YACD,MAAM,IAAA,qCAAe,EAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBAC3B,MAAM,IAAA,8BAAW,EAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1C;YACD,OAAO;SACR;QAED,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,MAAM,IAAA,8BAAW,EAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO;SACR;QAED,IAAI,OAAO,KAAK,OAAO,EAAE;YACvB,MAAM,IAAA,8BAAW,EAAC,MAAM,CAAC,CAAC;YAC1B,OAAO;SACR;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA5EW,QAAA,GAAG,OA4Ed"}
@@ -0,0 +1,28 @@
1
+ import DynamoDB from 'aws-sdk/clients/dynamodb';
2
+ import { DynamoDBPackage } from './types/DynamoDBPackage';
3
+ import { InputMigrations } from 'umzug/lib/types';
4
+ import { DynamoDBContext } from './dynamoDBMigrations';
5
+ export declare const getTableName: (goldstackConfig: DynamoDBPackage | any, packageSchema: any, deploymentName?: string | undefined) => Promise<string>;
6
+ export declare const stopLocalDynamoDB: (goldstackConfig: DynamoDBPackage | any, packageSchema: any, deploymentName?: string | undefined) => Promise<void>;
7
+ export declare const connect: ({ goldstackConfig, packageSchema, migrations, deploymentName, }: {
8
+ goldstackConfig: DynamoDBPackage | any;
9
+ packageSchema: any;
10
+ migrations: InputMigrations<DynamoDBContext>;
11
+ deploymentName?: string | undefined;
12
+ }) => Promise<DynamoDB>;
13
+ /**
14
+ * Deletes the DynamoDB table with all its data.
15
+ */
16
+ export declare const deleteTable: ({ goldstackConfig, packageSchema, deploymentName, }: {
17
+ goldstackConfig: DynamoDBPackage | any;
18
+ packageSchema: any;
19
+ deploymentName?: string | undefined;
20
+ }) => Promise<DynamoDB>;
21
+ export declare const migrateDownTo: ({ migrationName, goldstackConfig, packageSchema, migrations, deploymentName, }: {
22
+ migrationName: string;
23
+ goldstackConfig: DynamoDBPackage | any;
24
+ packageSchema: any;
25
+ migrations: InputMigrations<DynamoDBContext>;
26
+ deploymentName?: string | undefined;
27
+ }) => Promise<DynamoDB>;
28
+ //# sourceMappingURL=templateDynamoDBTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateDynamoDBTable.d.ts","sourceRoot":"","sources":["../../src/templateDynamoDBTable.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAY9E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,eAAe,EAGhB,MAAM,sBAAsB,CAAC;AAO9B,eAAO,MAAM,YAAY,oBACN,eAAe,GAAG,GAAG,iBACvB,GAAG,0CAEjB,QAAQ,MAAM,CAQhB,CAAC;AAEF,eAAO,MAAM,iBAAiB,oBACX,eAAe,GAAG,GAAG,iBACvB,GAAG,0CAEjB,QAAQ,IAAI,CAWd,CAAC;AAsBF,eAAO,MAAM,OAAO;qBAMD,eAAe,GAAG,GAAG;mBACvB,GAAG;gBACN,gBAAgB,eAAe,CAAC;;MAE1C,QAAQ,QAAQ,CAkBnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;qBAKL,eAAe,GAAG,GAAG;mBACvB,GAAG;;MAEhB,QAAQ,QAAQ,CAWnB,CAAC;AAEF,eAAO,MAAM,aAAa;mBAOT,MAAM;qBACJ,eAAe,GAAG,GAAG;mBACvB,GAAG;gBACN,gBAAgB,eAAe,CAAC;;MAE1C,QAAQ,QAAQ,CAmBnB,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.migrateDownTo = exports.deleteTable = exports.connect = exports.stopLocalDynamoDB = exports.getTableName = void 0;
7
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
8
+ const infra_aws_1 = require("@goldstack/infra-aws");
9
+ const dynamodb_1 = __importDefault(require("aws-sdk/clients/dynamodb"));
10
+ const dynamoDBPackageUtils_1 = require("./dynamoDBPackageUtils");
11
+ const utils_package_config_1 = require("@goldstack/utils-package-config");
12
+ const localDynamoDB_1 = require("./localDynamoDB");
13
+ const dynamoDBData_1 = require("./dynamoDBData");
14
+ const dynamoDBMigrations_1 = require("./dynamoDBMigrations");
15
+ /**
16
+ * Map to keep track for which deployment and tables initialisation and migrations have already been performed
17
+ */
18
+ const coldStart = new Map();
19
+ const getTableName = async (goldstackConfig, packageSchema, deploymentName) => {
20
+ deploymentName = (0, dynamoDBPackageUtils_1.getDeploymentName)(deploymentName);
21
+ const packageConfig = new utils_package_config_1.PackageConfig({
22
+ goldstackJson: goldstackConfig,
23
+ packageSchema,
24
+ });
25
+ return (0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName);
26
+ };
27
+ exports.getTableName = getTableName;
28
+ const stopLocalDynamoDB = async (goldstackConfig, packageSchema, deploymentName) => {
29
+ deploymentName = (0, dynamoDBPackageUtils_1.getDeploymentName)(deploymentName);
30
+ const packageConfig = new utils_package_config_1.PackageConfig({
31
+ goldstackJson: goldstackConfig,
32
+ packageSchema,
33
+ });
34
+ await (0, localDynamoDB_1.stopLocalDynamoDB)(packageConfig, deploymentName);
35
+ const coldStartKey = getColdStartKey(packageConfig, deploymentName);
36
+ coldStart.delete(coldStartKey);
37
+ };
38
+ exports.stopLocalDynamoDB = stopLocalDynamoDB;
39
+ const createClient = async (packageConfig, deploymentName) => {
40
+ if (deploymentName === 'local') {
41
+ return (0, localDynamoDB_1.localConnect)(packageConfig, deploymentName);
42
+ }
43
+ const deployment = packageConfig.getDeployment(deploymentName);
44
+ const awsUser = await (0, infra_aws_1.getAWSUser)(deployment.awsUser);
45
+ const dynamoDB = new dynamodb_1.default({
46
+ apiVersion: '2012-08-10',
47
+ credentials: awsUser,
48
+ region: deployment.awsRegion,
49
+ });
50
+ return dynamoDB;
51
+ };
52
+ const connect = async ({ goldstackConfig, packageSchema, migrations, deploymentName, }) => {
53
+ deploymentName = (0, dynamoDBPackageUtils_1.getDeploymentName)(deploymentName);
54
+ const packageConfig = new utils_package_config_1.PackageConfig({
55
+ goldstackJson: goldstackConfig,
56
+ packageSchema,
57
+ });
58
+ const client = await createClient(packageConfig, deploymentName);
59
+ // ensure table initialisation and migrations are only performed once per cold start
60
+ const coldStartKey = getColdStartKey(packageConfig, deploymentName);
61
+ if (!coldStart.has(coldStartKey)) {
62
+ await (0, dynamoDBData_1.assertTable)(packageConfig, deploymentName, client);
63
+ await (0, dynamoDBMigrations_1.performMigrations)(packageConfig, deploymentName, migrations, client);
64
+ coldStart.set(coldStartKey, true);
65
+ }
66
+ return client;
67
+ };
68
+ exports.connect = connect;
69
+ /**
70
+ * Deletes the DynamoDB table with all its data.
71
+ */
72
+ const deleteTable = async ({ goldstackConfig, packageSchema, deploymentName, }) => {
73
+ deploymentName = (0, dynamoDBPackageUtils_1.getDeploymentName)(deploymentName);
74
+ const packageConfig = new utils_package_config_1.PackageConfig({
75
+ goldstackJson: goldstackConfig,
76
+ packageSchema,
77
+ });
78
+ const client = await createClient(packageConfig, deploymentName);
79
+ await (0, dynamoDBData_1.deleteTable)(packageConfig, deploymentName, client);
80
+ return client;
81
+ };
82
+ exports.deleteTable = deleteTable;
83
+ const migrateDownTo = async ({ migrationName, goldstackConfig, packageSchema, migrations, deploymentName, }) => {
84
+ deploymentName = (0, dynamoDBPackageUtils_1.getDeploymentName)(deploymentName);
85
+ const packageConfig = new utils_package_config_1.PackageConfig({
86
+ goldstackJson: goldstackConfig,
87
+ packageSchema,
88
+ });
89
+ const client = await createClient(packageConfig, deploymentName);
90
+ await (0, dynamoDBData_1.assertTable)(packageConfig, deploymentName, client);
91
+ await (0, dynamoDBMigrations_1.migrateDownTo)(migrationName, packageConfig, deploymentName, migrations, client);
92
+ return client;
93
+ };
94
+ exports.migrateDownTo = migrateDownTo;
95
+ function getColdStartKey(packageConfig, deploymentName) {
96
+ if (deploymentName === 'local') {
97
+ return `local-${(0, dynamoDBPackageUtils_1.getTableName)(packageConfig, deploymentName)}`;
98
+ }
99
+ const deployment = packageConfig.getDeployment(deploymentName);
100
+ const coldStartKey = `${deployment.awsRegion}-${deploymentName}-${deployment.tableName}`;
101
+ return coldStartKey;
102
+ }
103
+ //# sourceMappingURL=templateDynamoDBTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateDynamoDBTable.js","sourceRoot":"","sources":["../../src/templateDynamoDBTable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { AWSDeployment } from '@goldstack/infra-aws';
2
+ import { TerraformDeployment } from '@goldstack/utils-terraform';
3
+ import { Deployment } from '@goldstack/infra';
4
+ import { DynamoDBDeploymentConfiguration } from './DynamoDBDeploymentConfiguration';
5
+ export type { AWSDeployment, TerraformDeployment, Deployment, DynamoDBDeploymentConfiguration, };
6
+ export interface ThisDeployment extends Deployment, AWSDeployment, TerraformDeployment {
7
+ configuration: DynamoDBDeploymentConfiguration;
8
+ }
9
+ export type { ThisDeployment as DynamoDBDeployment };
10
+ export default ThisDeployment;
11
+ //# sourceMappingURL=DynamoDBDeployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBDeployment.d.ts","sourceRoot":"","sources":["../../../src/types/DynamoDBDeployment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,+BAA+B,GAChC,CAAC;AAEF,MAAM,WAAW,cACf,SAAQ,UAAU,EAChB,aAAa,EACb,mBAAmB;IACrB,aAAa,EAAE,+BAA+B,CAAC;CAChD;AAED,YAAY,EAAE,cAAc,IAAI,kBAAkB,EAAE,CAAC;AAErD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=DynamoDBDeployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBDeployment.js","sourceRoot":"","sources":["../../../src/types/DynamoDBDeployment.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { DeploymentConfiguration } from '@goldstack/infra';
2
+ export type { DeploymentConfiguration };
3
+ /**
4
+ * The name of the DynamoDB table. No spaces, numbers or special characters other than '-', '.' and '_' allowed.
5
+ *
6
+ * See https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html
7
+ *
8
+ * @title DynamoDB table name
9
+ * @pattern ^[A-Za-z0-9-\._]*$
10
+ */
11
+ declare type TableName = string;
12
+ export interface ThisDeploymentConfiguration extends DeploymentConfiguration {
13
+ tableName: TableName;
14
+ }
15
+ export type { ThisDeploymentConfiguration as DynamoDBDeploymentConfiguration };
16
+ //# sourceMappingURL=DynamoDBDeploymentConfiguration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBDeploymentConfiguration.d.ts","sourceRoot":"","sources":["../../../src/types/DynamoDBDeploymentConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAExC;;;;;;;GAOG;AACH,aAAK,SAAS,GAAG,MAAM,CAAC;AAExB,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,YAAY,EAAE,2BAA2B,IAAI,+BAA+B,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=DynamoDBDeploymentConfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBDeploymentConfiguration.js","sourceRoot":"","sources":["../../../src/types/DynamoDBDeploymentConfiguration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { Package } from '@goldstack/utils-package';
2
+ import { DynamoDBConfiguration } from './DynamoDBPackageConfiguration';
3
+ import { DynamoDBDeployment } from './DynamoDBDeployment';
4
+ export type { DynamoDBConfiguration, DynamoDBDeployment };
5
+ /**
6
+ * Places where the DynamoDB table should be deployed to.
7
+ *
8
+ * @title Deployments
9
+ */
10
+ export declare type DynamoDBDeployments = DynamoDBDeployment[];
11
+ /**
12
+ * A DynamoDB table.
13
+ *
14
+ * @title DynamoDB Package
15
+ */
16
+ export interface ThisPackage extends Package {
17
+ configuration: DynamoDBConfiguration;
18
+ deployments: DynamoDBDeployments;
19
+ }
20
+ export type { ThisPackage as DynamoDBPackage };
21
+ export default ThisPackage;
22
+ //# sourceMappingURL=DynamoDBPackage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBPackage.d.ts","sourceRoot":"","sources":["../../../src/types/DynamoDBPackage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;AAE1D;;;;GAIG;AACH,oBAAY,mBAAmB,GAAG,kBAAkB,EAAE,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,aAAa,EAAE,qBAAqB,CAAC;IACrC,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,CAAC;AAE/C,eAAe,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=DynamoDBPackage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBPackage.js","sourceRoot":"","sources":["../../../src/types/DynamoDBPackage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { Configuration } from '@goldstack/utils-package';
2
+ export type { Configuration };
3
+ /**
4
+ * DynamoDB Configuration
5
+ *
6
+ * @title DynamoDB Configuration
7
+ *
8
+ */
9
+ export interface ThisPackageConfiguration extends Configuration {
10
+ [propName: string]: any;
11
+ }
12
+ export type { ThisPackageConfiguration as DynamoDBConfiguration };
13
+ export default ThisPackageConfiguration;
14
+ //# sourceMappingURL=DynamoDBPackageConfiguration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBPackageConfiguration.d.ts","sourceRoot":"","sources":["../../../src/types/DynamoDBPackageConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;CACzB;AAED,YAAY,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,CAAC;AAElE,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=DynamoDBPackageConfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBPackageConfiguration.js","sourceRoot":"","sources":["../../../src/types/DynamoDBPackageConfiguration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import DynamoDB from 'aws-sdk/clients/dynamodb';
2
+ import { UmzugStorage } from 'umzug';
3
+ import { MigrationParams } from 'umzug/lib/types';
4
+ import { DynamoDBContext } from './dynamoDBMigrations';
5
+ export declare class DynamoDBStorage implements UmzugStorage<DynamoDBContext> {
6
+ dynamoClient: DynamoDB;
7
+ tableName: string;
8
+ migrationsKey: string;
9
+ partitionKey: string;
10
+ sortKey: string;
11
+ constructor({ dynamoDB, tableName, migrationsKey, partitionKey, sortKey, }: {
12
+ dynamoDB: DynamoDB;
13
+ tableName: string;
14
+ migrationsKey?: string;
15
+ partitionKey?: string;
16
+ sortKey?: string;
17
+ });
18
+ logMigration(params: MigrationParams<DynamoDBContext>): Promise<void>;
19
+ unlogMigration(params: MigrationParams<DynamoDBContext>): Promise<void>;
20
+ executed(): Promise<string[]>;
21
+ }
22
+ //# sourceMappingURL=umzugDynamoDBStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"umzugDynamoDBStorage.d.ts","sourceRoot":"","sources":["../../src/umzugDynamoDBStorage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,YAAY,CAAC,eAAe,CAAC;IACnE,YAAY,EAAE,QAAQ,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;gBAEJ,EACV,QAAQ,EACR,SAAS,EACT,aAA6B,EAC7B,YAAmB,EACnB,OAAc,GACf,EAAE;QACD,QAAQ,EAAE,QAAQ,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;IAQK,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrE,cAAc,CAClB,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC;IAgBV,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAiCpC"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DynamoDBStorage = void 0;
4
+ const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
5
+ class DynamoDBStorage {
6
+ constructor({ dynamoDB, tableName, migrationsKey = '#MIGRATIONS', partitionKey = 'pk', sortKey = 'sk', }) {
7
+ this.dynamoClient = dynamoDB;
8
+ this.tableName = tableName;
9
+ this.migrationsKey = migrationsKey;
10
+ this.partitionKey = partitionKey;
11
+ this.sortKey = sortKey;
12
+ }
13
+ async logMigration(params) {
14
+ try {
15
+ await params.context.client
16
+ .putItem({
17
+ TableName: params.context.tableName,
18
+ Item: (0, util_dynamodb_1.marshall)({
19
+ [this.partitionKey]: this.migrationsKey,
20
+ [this.sortKey]: params.name,
21
+ }),
22
+ })
23
+ .promise();
24
+ }
25
+ catch (e) {
26
+ throw new Error(`Failed to log migration ${params.name}. ` + e);
27
+ }
28
+ }
29
+ async unlogMigration(params) {
30
+ try {
31
+ await params.context.client
32
+ .deleteItem({
33
+ TableName: this.tableName,
34
+ Key: (0, util_dynamodb_1.marshall)({
35
+ [this.partitionKey]: this.migrationsKey,
36
+ [this.sortKey]: params.name,
37
+ }),
38
+ })
39
+ .promise();
40
+ }
41
+ catch (e) {
42
+ throw new Error(`Failed to unlog migration ${params.name}. ` + e);
43
+ }
44
+ }
45
+ async executed() {
46
+ var _a, _b;
47
+ const migrations = [];
48
+ let res = undefined;
49
+ let lastEvaluatedKey = undefined;
50
+ do {
51
+ res = await this.dynamoClient
52
+ .query({
53
+ TableName: this.tableName,
54
+ KeyConditionExpression: '#pk = :pk',
55
+ ExpressionAttributeNames: {
56
+ '#pk': this.partitionKey,
57
+ },
58
+ ExpressionAttributeValues: (0, util_dynamodb_1.marshall)({
59
+ ':pk': this.migrationsKey,
60
+ }),
61
+ ExclusiveStartKey: lastEvaluatedKey,
62
+ })
63
+ .promise();
64
+ lastEvaluatedKey = res.LastEvaluatedKey;
65
+ const items = (_a = res === null || res === void 0 ? void 0 : res.Items) === null || _a === void 0 ? void 0 : _a.map((entry) => {
66
+ return (0, util_dynamodb_1.unmarshall)(entry);
67
+ });
68
+ if (items) {
69
+ migrations.push(...items);
70
+ }
71
+ } while (((_b = res === null || res === void 0 ? void 0 : res.Items) === null || _b === void 0 ? void 0 : _b.length) && lastEvaluatedKey);
72
+ return migrations.map((m) => m[this.sortKey]);
73
+ }
74
+ }
75
+ exports.DynamoDBStorage = DynamoDBStorage;
76
+ //# sourceMappingURL=umzugDynamoDBStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"umzugDynamoDBStorage.js","sourceRoot":"","sources":["../../src/umzugDynamoDBStorage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@goldstack/template-dynamodb",
3
+ "version": "0.1.1",
4
+ "description": "Utilities for building modules for DynamoDB access.",
5
+ "keywords": [
6
+ "goldstack",
7
+ "utility",
8
+ "infrastructure",
9
+ "dynamodb",
10
+ "aws",
11
+ "IaC",
12
+ "configuration"
13
+ ],
14
+ "homepage": "https://goldstack.party",
15
+ "bugs": {
16
+ "url": "https://github.com/goldstack/goldstack/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/goldstack/goldstack.git"
21
+ },
22
+ "license": "MIT",
23
+ "author": "Max Rohde",
24
+ "sideEffects": false,
25
+ "main": "dist/src/templateDynamoDB.js",
26
+ "bin": {
27
+ "template": "./bin/template",
28
+ "template-s3": "./bin/template"
29
+ },
30
+ "scripts": {
31
+ "build": "yarn clean && yarn compile",
32
+ "build:watch": "yarn clean && yarn compile-watch",
33
+ "clean": "rimraf ./dist",
34
+ "compile": "tsc -p tsconfig.json",
35
+ "compile-watch": "tsc -p tsconfig.json --watch",
36
+ "compile-watch:light": "nodemon --watch ./src/ -e '*' --exec 'yarn compile'",
37
+ "coverage": "jest --collect-coverage --passWithNoTests --config=./jest.config.js --runInBand",
38
+ "generate-schema": "ts-node scripts/generateSchemas.ts && cp schemas/* ../../../templates/packages/dynamodb/schemas",
39
+ "prepublishOnly": "yarn run build",
40
+ "publish": "utils-git changed --exec \"yarn npm publish $@\"",
41
+ "test-ci": "jest --passWithNoTests --config=./jest.config.js --runInBand",
42
+ "version:apply": "utils-git changed --exec \"yarn version $@ && yarn version apply\"",
43
+ "version:apply:force": "yarn version $@ && yarn version apply"
44
+ },
45
+ "dependencies": {
46
+ "@aws-sdk/util-dynamodb": "^3.87.0",
47
+ "@goldstack/infra": "0.3.35",
48
+ "@goldstack/infra-aws": "0.3.43",
49
+ "@goldstack/utils-cli": "0.2.12",
50
+ "@goldstack/utils-config": "0.3.32",
51
+ "@goldstack/utils-docker": "0.3.37",
52
+ "@goldstack/utils-log": "0.2.13",
53
+ "@goldstack/utils-package": "0.3.37",
54
+ "@goldstack/utils-package-config": "0.3.37",
55
+ "@goldstack/utils-sh": "0.4.30",
56
+ "@goldstack/utils-template": "0.3.34",
57
+ "@goldstack/utils-terraform": "0.3.67",
58
+ "@goldstack/utils-terraform-aws": "0.3.66",
59
+ "aws-sdk": "2.1055.0",
60
+ "source-map-support": "^0.5.21",
61
+ "testcontainers": "^8.10.0",
62
+ "umzug": "^3.1.1",
63
+ "yargs": "^15.4.1"
64
+ },
65
+ "devDependencies": {
66
+ "@goldstack/utils-docs-cli": "0.3.11",
67
+ "@goldstack/utils-git": "0.1.33",
68
+ "@goldstack/utils-package-config-generate": "0.2.13",
69
+ "@types/jest": "^27.5.1",
70
+ "@types/node": "^17.0.33",
71
+ "@types/yargs": "^15.0.5",
72
+ "jest": "^28.1.0",
73
+ "rimraf": "^3.0.2",
74
+ "ts-jest": "^28.0.2",
75
+ "ts-node": "^10.7.0",
76
+ "typescript": "^4.6.4"
77
+ },
78
+ "publishConfig": {
79
+ "main": "dist/src/templateDynamoDB.js"
80
+ }
81
+ }