Skip to content

Commit 1a38862

Browse files
committed
feat(idempotency): add esmodule support (#1743)
* feat(idempotency): add esmodule support
1 parent 6838cc2 commit 1a38862

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+219
-148
lines changed

Diff for: packages/idempotency/jest.config.js renamed to packages/idempotency/jest.config.cjs

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ module.exports = {
55
},
66
runner: 'groups',
77
preset: 'ts-jest',
8+
moduleNameMapper: {
9+
'^(\\.{1,2}/.*)\\.js$': '$1',
10+
},
811
transform: {
912
'^.+\\.ts?$': 'ts-jest',
1013
},

Diff for: packages/idempotency/package.json

+39-18
Original file line numberDiff line numberDiff line change
@@ -19,57 +19,78 @@
1919
"test:e2e:nodejs20x": "RUNTIME=nodejs20x jest --group=e2e",
2020
"test:e2e": "jest --group=e2e",
2121
"watch": "jest --watch",
22-
"build": "tsc --build --force",
22+
"build:cjs": "tsc --build --force && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json",
23+
"build:esm": "tsc --project tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json",
24+
"build": "npm run build:esm & npm run build:cjs",
2325
"lint": "eslint --ext .ts,.js --no-error-on-unmatched-pattern .",
2426
"lint-fix": "eslint --fix --ext .ts,.js --no-error-on-unmatched-pattern .",
2527
"prebuild": "rimraf ./lib",
26-
"prepack": "node ../../.github/scripts/release_patch_package_json.js ."
28+
"prepack": "rimraf ./lib/*.tsbuildinfo && node ../../.github/scripts/release_patch_package_json.js ."
2729
},
2830
"lint-staged": {
2931
"*.{js,ts}": "npm run lint-fix"
3032
},
3133
"homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/idempotency#readme",
3234
"license": "MIT-0",
35+
"type": "module",
3336
"exports": {
3437
".": {
35-
"import": "./lib/index.js",
36-
"require": "./lib/index.js"
38+
"require": {
39+
"types": "./lib/cjs/index.d.ts",
40+
"default": "./lib/cjs/index.js"
41+
},
42+
"import": {
43+
"types": "./lib/esm/index.d.ts",
44+
"default": "./lib/esm/index.js"
45+
}
3746
},
3847
"./persistence": {
39-
"import": "./lib/persistence/index.js",
40-
"require": "./lib/persistence/index.js"
48+
"import": "./lib/esm/persistence/index.js",
49+
"require": "./lib/cjs/persistence/index.js"
4150
},
4251
"./dynamodb": {
43-
"import": "./lib/persistence/DynamoDBPersistenceLayer.js",
44-
"require": "./lib/persistence/DynamoDBPersistenceLayer.js"
52+
"import": "./lib/esm/persistence/DynamoDBPersistenceLayer.js",
53+
"require": "./lib/cjs/persistence/DynamoDBPersistenceLayer.js"
54+
},
55+
"./dynamodb/types": {
56+
"import": "./lib/esm/types/DynamoDBPersistence.js",
57+
"require": "./lib/cjs/types/DynamoDBPersistence.js"
4558
},
4659
"./middleware": {
47-
"import": "./lib/middleware/index.js",
48-
"require": "./lib/middleware/index.js"
60+
"import": "./lib/esm/middleware/makeHandlerIdempotent.js",
61+
"require": "./lib/cjs/middleware/makeHandlerIdempotent.js"
4962
},
5063
"./types": {
51-
"import": "./lib/types/index.d.ts",
52-
"require": "./lib/types/index.d.ts"
64+
"import": "./lib/esm/types/index.d.ts",
65+
"require": "./lib/esm/types/index.d.ts"
5366
}
5467
},
5568
"typesVersions": {
5669
"*": {
5770
"persistence": [
58-
"lib/persistence/index.d.ts"
71+
"lib/esm/persistence/index.d.ts",
72+
"lib/cjs/persistence/index.d.ts"
5973
],
6074
"dynamodb": [
61-
"lib/persistence/DynamoDBPersistenceLayer.d.ts"
75+
"lib/esm/persistence/DynamoDBPersistenceLayer.d.ts",
76+
"lib/cjs/persistence/DynamoDBPersistenceLayer.d.ts"
77+
],
78+
"dynamodb/types": [
79+
"lib/esm/types/DynamoDBPersistence.d.ts",
80+
"lib/cjs/types/DynamoDBPersistence.d.ts"
6281
],
6382
"middleware": [
64-
"lib/middleware/index.d.ts"
83+
"lib/esm/middleware/makeHandlerIdempotent.d.ts",
84+
"lib/cjs/middleware/makeHandlerIdempotent.d.ts"
6585
],
6686
"types": [
67-
"lib/types/index.d.ts"
87+
"lib/esm/types/index.d.ts",
88+
"lib/cjs/types/index.d.ts"
6889
]
6990
}
7091
},
71-
"main": "./lib/index.js",
72-
"types": "./lib/index.d.ts",
92+
"types": "./lib/cjs/index.d.ts",
93+
"main": "./lib/cjs/index.js",
7394
"files": [
7495
"lib"
7596
],

Diff for: packages/idempotency/src/IdempotencyConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { EnvironmentVariablesService } from './config';
1+
import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js';
22
import type { Context } from 'aws-lambda';
3-
import type { IdempotencyConfigOptions } from './types';
3+
import type { IdempotencyConfigOptions } from './types/IdempotencyOptions.js';
44

55
/**
66
* Configuration for the idempotency feature.

Diff for: packages/idempotency/src/IdempotencyHandler.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@ import type {
22
JSONValue,
33
MiddyLikeRequest,
44
} from '@aws-lambda-powertools/commons/types';
5-
import type { AnyFunction, IdempotencyHandlerOptions } from './types';
5+
import type {
6+
AnyFunction,
7+
IdempotencyHandlerOptions,
8+
} from './types/IdempotencyOptions.js';
69
import {
710
IdempotencyAlreadyInProgressError,
811
IdempotencyInconsistentStateError,
912
IdempotencyItemAlreadyExistsError,
1013
IdempotencyPersistenceLayerError,
11-
} from './errors';
12-
import { BasePersistenceLayer, IdempotencyRecord } from './persistence';
13-
import { IdempotencyConfig } from './IdempotencyConfig';
14-
import { MAX_RETRIES, IdempotencyRecordStatus } from './constants';
14+
} from './errors.js';
15+
import { BasePersistenceLayer } from './persistence/BasePersistenceLayer.js';
16+
import { IdempotencyRecord } from './persistence/IdempotencyRecord.js';
17+
import { IdempotencyConfig } from './IdempotencyConfig.js';
18+
import { MAX_RETRIES, IdempotencyRecordStatus } from './constants.js';
1519
import { search } from 'jmespath';
1620

1721
/**

Diff for: packages/idempotency/src/config/EnvironmentVariablesService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ConfigServiceInterface } from './ConfigServiceInterface';
1+
import type { ConfigServiceInterface } from '../types/ConfigServiceInterface.js';
22
import { EnvironmentVariablesService as CommonEnvironmentVariablesService } from '@aws-lambda-powertools/commons';
33

44
/**

Diff for: packages/idempotency/src/config/index.ts

-1
This file was deleted.

Diff for: packages/idempotency/src/idempotencyDecorator.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import { AnyFunction, ItempotentFunctionOptions } from './types';
2-
import { makeIdempotent } from './makeIdempotent';
1+
import {
2+
AnyFunction,
3+
ItempotentFunctionOptions,
4+
} from './types/IdempotencyOptions.js';
5+
import { makeIdempotent } from './makeIdempotent.js';
36

47
/**
58
* Use this decorator to make your lambda handler itempotent.

Diff for: packages/idempotency/src/index.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1-
export * from './errors';
2-
export * from './IdempotencyConfig';
3-
export * from './makeIdempotent';
4-
export * from './idempotencyDecorator';
5-
export { IdempotencyRecordStatus } from './constants';
1+
export {
2+
IdempotencyItemAlreadyExistsError,
3+
IdempotencyItemNotFoundError,
4+
IdempotencyAlreadyInProgressError,
5+
IdempotencyInvalidStatusError,
6+
IdempotencyValidationError,
7+
IdempotencyInconsistentStateError,
8+
IdempotencyPersistenceLayerError,
9+
IdempotencyKeyError,
10+
} from './errors.js';
11+
export { IdempotencyConfig } from './IdempotencyConfig.js';
12+
export { makeIdempotent } from './makeIdempotent.js';
13+
export { idempotent } from './idempotencyDecorator.js';
14+
export { IdempotencyRecordStatus } from './constants.js';

Diff for: packages/idempotency/src/makeIdempotent.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import type {
33
AnyFunction,
44
ItempotentFunctionOptions,
55
IdempotencyLambdaHandlerOptions,
6-
} from './types';
7-
import { IdempotencyHandler } from './IdempotencyHandler';
8-
import { IdempotencyConfig } from './IdempotencyConfig';
6+
} from './types/IdempotencyOptions.js';
7+
import { IdempotencyHandler } from './IdempotencyHandler.js';
8+
import { IdempotencyConfig } from './IdempotencyConfig.js';
99

1010
const isContext = (arg: unknown): arg is Context => {
1111
return (

Diff for: packages/idempotency/src/middleware/index.ts

-1
This file was deleted.

Diff for: packages/idempotency/src/middleware/makeHandlerIdempotent.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { IdempotencyHandler } from '../IdempotencyHandler';
2-
import { IdempotencyConfig } from '../IdempotencyConfig';
1+
import { IdempotencyHandler } from '../IdempotencyHandler.js';
2+
import { IdempotencyConfig } from '../IdempotencyConfig.js';
33
import {
44
cleanupMiddlewares,
55
IDEMPOTENCY_KEY,
66
} from '@aws-lambda-powertools/commons';
7-
import type { AnyFunction, IdempotencyLambdaHandlerOptions } from '../types';
7+
import type {
8+
AnyFunction,
9+
IdempotencyLambdaHandlerOptions,
10+
} from '../types/IdempotencyOptions.js';
811
import type {
912
MiddlewareLikeObj,
1013
MiddyLikeRequest,

Diff for: packages/idempotency/src/persistence/BasePersistenceLayer.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import { createHash, Hash } from 'node:crypto';
22
import { search } from 'jmespath';
3-
import type { BasePersistenceLayerOptions } from '../types';
4-
import { IdempotencyRecordStatus } from '../constants';
5-
import { EnvironmentVariablesService } from '../config';
6-
import { IdempotencyRecord } from './IdempotencyRecord';
7-
import { BasePersistenceLayerInterface } from './BasePersistenceLayerInterface';
3+
import type {
4+
BasePersistenceLayerOptions,
5+
BasePersistenceLayerInterface,
6+
} from '../types/BasePersistenceLayer.js';
7+
import { IdempotencyRecordStatus } from '../constants.js';
8+
import { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js';
9+
import { IdempotencyRecord } from './IdempotencyRecord.js';
810
import {
911
IdempotencyItemAlreadyExistsError,
12+
IdempotencyKeyError,
1013
IdempotencyValidationError,
11-
} from '../errors';
12-
import { LRUCache } from './LRUCache';
14+
} from '../errors.js';
15+
import { LRUCache } from './LRUCache.js';
1316
import type { JSONValue } from '@aws-lambda-powertools/commons/types';
1417

1518
/**
@@ -258,7 +261,9 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface {
258261

259262
if (BasePersistenceLayer.isMissingIdempotencyKey(data)) {
260263
if (this.throwOnNoIdempotencyKey) {
261-
throw new Error('No data found to create a hashed idempotency_key');
264+
throw new IdempotencyKeyError(
265+
'No data found to create a hashed idempotency_key'
266+
);
262267
}
263268
console.warn(
264269
`No value found for idempotency_key. jmespath: ${this.eventKeyJmesPath}`

Diff for: packages/idempotency/src/persistence/BasePersistenceLayerInterface.ts

-14
This file was deleted.

Diff for: packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {
22
IdempotencyItemAlreadyExistsError,
33
IdempotencyItemNotFoundError,
4-
} from '../errors';
5-
import { IdempotencyRecordStatus } from '../constants';
6-
import type { DynamoDBPersistenceOptions } from '../types';
4+
} from '../errors.js';
5+
import { IdempotencyRecordStatus } from '../constants.js';
6+
import type { DynamoDBPersistenceOptions } from '../types/DynamoDBPersistence.js';
77
import {
88
AttributeValue,
99
ConditionalCheckFailedException,
@@ -15,8 +15,8 @@ import {
1515
UpdateItemCommand,
1616
} from '@aws-sdk/client-dynamodb';
1717
import { marshall, unmarshall } from '@aws-sdk/util-dynamodb';
18-
import { IdempotencyRecord } from './IdempotencyRecord';
19-
import { BasePersistenceLayer } from './BasePersistenceLayer';
18+
import { IdempotencyRecord } from './IdempotencyRecord.js';
19+
import { BasePersistenceLayer } from './BasePersistenceLayer.js';
2020
import {
2121
addUserAgentMiddleware,
2222
isSdkClient,

Diff for: packages/idempotency/src/persistence/IdempotencyRecord.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types';
22
import type {
33
IdempotencyRecordOptions,
44
IdempotencyRecordStatusValue,
5-
} from '../types';
6-
import { IdempotencyRecordStatus } from '../constants';
7-
import { IdempotencyInvalidStatusError } from '../errors';
5+
} from '../types/IdempotencyRecord.js';
6+
import { IdempotencyRecordStatus } from '../constants.js';
7+
import { IdempotencyInvalidStatusError } from '../errors.js';
88

99
/**
1010
* Class representing an idempotency record.

Diff for: packages/idempotency/src/persistence/LRUCache.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { LRUCacheOptions } from '../types';
1+
import type { LRUCacheOptions } from '../types/LRUCache.js';
22

33
const DEFAULT_MAX_SIZE = 100;
44
const NEWER = Symbol('newer');

Diff for: packages/idempotency/src/persistence/index.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
export * from './BasePersistenceLayer';
2-
export * from './BasePersistenceLayerInterface';
3-
export * from './IdempotencyRecord';
1+
export { BasePersistenceLayer } from './BasePersistenceLayer.js';
2+
export { IdempotencyRecord } from './IdempotencyRecord.js';
+12-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
1-
import { IdempotencyConfig } from '../IdempotencyConfig';
1+
import { IdempotencyRecord } from '../persistence/IdempotencyRecord.js';
2+
import { IdempotencyConfig } from '../IdempotencyConfig.js';
23

34
type BasePersistenceLayerOptions = {
45
config: IdempotencyConfig;
56
functionName?: string;
67
};
78

8-
export { BasePersistenceLayerOptions };
9+
interface BasePersistenceLayerInterface {
10+
configure(options?: BasePersistenceLayerOptions): void;
11+
isPayloadValidationEnabled(): boolean;
12+
saveInProgress(data: unknown, remainingTimeInMillis?: number): Promise<void>;
13+
saveSuccess(data: unknown, result: unknown): Promise<void>;
14+
deleteRecord(data: unknown): Promise<void>;
15+
getRecord(data: unknown): Promise<IdempotencyRecord>;
16+
}
17+
18+
export { BasePersistenceLayerOptions, BasePersistenceLayerInterface };

Diff for: packages/idempotency/src/types/IdempotencyOptions.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Context } from 'aws-lambda';
2-
import { BasePersistenceLayer } from '../persistence/BasePersistenceLayer';
3-
import { IdempotencyConfig } from '../IdempotencyConfig';
2+
import { BasePersistenceLayer } from '../persistence/BasePersistenceLayer.js';
3+
import { IdempotencyConfig } from '../IdempotencyConfig.js';
44
import type { JSONValue } from '@aws-lambda-powertools/commons/types';
55

66
/**

Diff for: packages/idempotency/src/types/IdempotencyRecord.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { JSONValue } from '@aws-lambda-powertools/commons/types';
2-
import { IdempotencyRecordStatus } from '../constants';
2+
import { IdempotencyRecordStatus } from '../constants.js';
33

44
type IdempotencyRecordStatusValue =
55
(typeof IdempotencyRecordStatus)[keyof typeof IdempotencyRecordStatus];

Diff for: packages/idempotency/src/types/index.ts

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
export * from './IdempotencyRecord';
2-
export * from './BasePersistenceLayer';
3-
export * from './IdempotencyOptions';
4-
export * from './DynamoDBPersistence';
5-
export * from './LRUCache';
1+
export {
2+
IdempotencyRecordOptions,
3+
IdempotencyRecordStatusValue,
4+
} from './IdempotencyRecord.js';
5+
export {
6+
BasePersistenceLayerInterface,
7+
BasePersistenceLayerOptions,
8+
} from './BasePersistenceLayer.js';
9+
export {
10+
IdempotencyConfigOptions,
11+
IdempotencyLambdaHandlerOptions,
12+
IdempotencyHandlerOptions,
13+
} from './IdempotencyOptions.js';

Diff for: packages/idempotency/tests/e2e/idempotentDecorator.test.FunctionCode.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { Context } from 'aws-lambda';
22
import type { LambdaInterface } from '@aws-lambda-powertools/commons/types';
3-
import { idempotent } from '../../src';
4-
import { Logger } from '../../../logger';
5-
import { DynamoDBPersistenceLayer } from '../../src/persistence/DynamoDBPersistenceLayer';
6-
import { IdempotencyConfig } from '../../src/';
3+
import { idempotent } from '../../src/idempotencyDecorator';
4+
import { Logger } from '@aws-lambda-powertools/logger';
5+
import { DynamoDBPersistenceLayer } from '../../src/persistence/DynamoDBPersistenceLayer.js';
6+
import { IdempotencyConfig } from '../../src/IdempotencyConfig.js';
77

88
const IDEMPOTENCY_TABLE_NAME =
99
process.env.IDEMPOTENCY_TABLE_NAME || 'table_name';

0 commit comments

Comments
 (0)