local-serverless-stack 0.6.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +261 -583
- package/bin/cli.js +31 -3
- package/dist/client/types.d.ts +4 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/server/engine/aoss-sidecar.d.ts +13 -0
- package/dist/server/engine/aoss-sidecar.d.ts.map +1 -0
- package/dist/server/engine/aoss-sidecar.js +93 -0
- package/dist/server/engine/aoss-sidecar.js.map +1 -0
- package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
- package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/localstack-backend.js +199 -0
- package/dist/server/engine/backends/localstack-backend.js.map +1 -0
- package/dist/server/engine/backends/self-backend.d.ts +32 -0
- package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/self-backend.js +207 -0
- package/dist/server/engine/backends/self-backend.js.map +1 -0
- package/dist/server/engine/bus.d.ts +10 -0
- package/dist/server/engine/bus.d.ts.map +1 -0
- package/dist/server/engine/bus.js +24 -0
- package/dist/server/engine/bus.js.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.js +312 -0
- package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
- package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
- package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
- package/dist/server/engine/dispatch/scheduler.js +328 -0
- package/dist/server/engine/dispatch/scheduler.js.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.js +242 -0
- package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.js +205 -0
- package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.js +572 -0
- package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.js +237 -0
- package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
- package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
- package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
- package/dist/server/engine/emulators/events/index.d.ts +53 -0
- package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/index.js +417 -0
- package/dist/server/engine/emulators/events/index.js.map +1 -0
- package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
- package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/pattern.js +125 -0
- package/dist/server/engine/emulators/events/pattern.js.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
- package/dist/server/engine/emulators/opensearch/index.d.ts +67 -0
- package/dist/server/engine/emulators/opensearch/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/opensearch/index.js +811 -0
- package/dist/server/engine/emulators/opensearch/index.js.map +1 -0
- package/dist/server/engine/emulators/opensearch/search.d.ts +17 -0
- package/dist/server/engine/emulators/opensearch/search.d.ts.map +1 -0
- package/dist/server/engine/emulators/opensearch/search.js +434 -0
- package/dist/server/engine/emulators/opensearch/search.js.map +1 -0
- package/dist/server/engine/emulators/s3/index.d.ts +45 -0
- package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/s3/index.js +591 -0
- package/dist/server/engine/emulators/s3/index.js.map +1 -0
- package/dist/server/engine/emulators/sns/index.d.ts +22 -0
- package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sns/index.js +135 -0
- package/dist/server/engine/emulators/sns/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
- package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/index.js +552 -0
- package/dist/server/engine/emulators/sqs/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.js +36 -0
- package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.js +371 -0
- package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
- package/dist/server/engine/emulators/sts.d.ts +8 -0
- package/dist/server/engine/emulators/sts.d.ts.map +1 -0
- package/dist/server/engine/emulators/sts.js +23 -0
- package/dist/server/engine/emulators/sts.js.map +1 -0
- package/dist/server/engine/engine-backend.d.ts +17 -0
- package/dist/server/engine/engine-backend.d.ts.map +1 -0
- package/dist/server/engine/engine-backend.js +7 -0
- package/dist/server/engine/engine-backend.js.map +1 -0
- package/dist/server/engine/engine-manager.d.ts +22 -0
- package/dist/server/engine/engine-manager.d.ts.map +1 -0
- package/dist/server/engine/engine-manager.js +74 -0
- package/dist/server/engine/engine-manager.js.map +1 -0
- package/dist/server/engine/http/aws-chunked.d.ts +3 -0
- package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
- package/dist/server/engine/http/aws-chunked.js +50 -0
- package/dist/server/engine/http/aws-chunked.js.map +1 -0
- package/dist/server/engine/http/errors.d.ts +20 -0
- package/dist/server/engine/http/errors.d.ts.map +1 -0
- package/dist/server/engine/http/errors.js +43 -0
- package/dist/server/engine/http/errors.js.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.js +42 -0
- package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.js +35 -0
- package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
- package/dist/server/engine/http/router.d.ts +8 -0
- package/dist/server/engine/http/router.d.ts.map +1 -0
- package/dist/server/engine/http/router.js +402 -0
- package/dist/server/engine/http/router.js.map +1 -0
- package/dist/server/engine/http/sigv4.d.ts +9 -0
- package/dist/server/engine/http/sigv4.d.ts.map +1 -0
- package/dist/server/engine/http/sigv4.js +33 -0
- package/dist/server/engine/http/sigv4.js.map +1 -0
- package/dist/server/engine/http/xml.d.ts +16 -0
- package/dist/server/engine/http/xml.d.ts.map +1 -0
- package/dist/server/engine/http/xml.js +92 -0
- package/dist/server/engine/http/xml.js.map +1 -0
- package/dist/server/engine/store/atomic.d.ts +4 -0
- package/dist/server/engine/store/atomic.d.ts.map +1 -0
- package/dist/server/engine/store/atomic.js +35 -0
- package/dist/server/engine/store/atomic.js.map +1 -0
- package/dist/server/engine/store/engine-store.d.ts +9 -0
- package/dist/server/engine/store/engine-store.d.ts.map +1 -0
- package/dist/server/engine/store/engine-store.js +218 -0
- package/dist/server/engine/store/engine-store.js.map +1 -0
- package/dist/server/engine/store/store-types.d.ts +37 -0
- package/dist/server/engine/store/store-types.d.ts.map +1 -0
- package/dist/server/engine/store/store-types.js +17 -0
- package/dist/server/engine/store/store-types.js.map +1 -0
- package/dist/server/engine/store/wal.d.ts +49 -0
- package/dist/server/engine/store/wal.d.ts.map +1 -0
- package/dist/server/engine/store/wal.js +328 -0
- package/dist/server/engine/store/wal.js.map +1 -0
- package/dist/server/engine/types.d.ts +137 -0
- package/dist/server/engine/types.d.ts.map +1 -0
- package/dist/server/engine/types.js +8 -0
- package/dist/server/engine/types.js.map +1 -0
- package/dist/server/index.js +43 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/config.d.ts.map +1 -1
- package/dist/server/routes/config.js +16 -0
- package/dist/server/routes/config.js.map +1 -1
- package/dist/server/routes/opensearch.d.ts +3 -0
- package/dist/server/routes/opensearch.d.ts.map +1 -0
- package/dist/server/routes/opensearch.js +69 -0
- package/dist/server/routes/opensearch.js.map +1 -0
- package/dist/server/routes/resources.d.ts.map +1 -1
- package/dist/server/routes/resources.js +4 -1
- package/dist/server/routes/resources.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +3 -0
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/services/cache-manager.d.ts +2 -1
- package/dist/server/services/cache-manager.d.ts.map +1 -1
- package/dist/server/services/cache-manager.js +22 -2
- package/dist/server/services/cache-manager.js.map +1 -1
- package/dist/server/services/cloudformation-parser.d.ts +35 -2
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +88 -3
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +82 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +151 -7
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/gateway-manager.d.ts +2 -0
- package/dist/server/services/gateway-manager.d.ts.map +1 -1
- package/dist/server/services/gateway-manager.js +44 -6
- package/dist/server/services/gateway-manager.js.map +1 -1
- package/dist/server/services/localstack-manager.d.ts +0 -7
- package/dist/server/services/localstack-manager.d.ts.map +1 -1
- package/dist/server/services/localstack-manager.js +11 -173
- package/dist/server/services/localstack-manager.js.map +1 -1
- package/dist/server/services/opensearch-explorer.d.ts +37 -0
- package/dist/server/services/opensearch-explorer.d.ts.map +1 -0
- package/dist/server/services/opensearch-explorer.js +124 -0
- package/dist/server/services/opensearch-explorer.js.map +1 -0
- package/dist/server/services/resource-provisioner.d.ts +13 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +257 -11
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/service-registrar.d.ts +1 -0
- package/dist/server/services/service-registrar.d.ts.map +1 -1
- package/dist/server/services/service-registrar.js +19 -4
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/ui/assets/ApisPage-C0xaNFQW.js +1 -0
- package/dist/ui/assets/BucketDetailPage-Bnny8S04.js +1 -0
- package/dist/ui/assets/BucketsPage-Dd3Y4-gU.js +1 -0
- package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-JzSF-4VI.js} +1 -1
- package/dist/ui/assets/DynamoTablePage-uM0DXGCo.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-CoR9ZXdb.js +4 -0
- package/dist/ui/assets/LambdasPage-CNMX_O5P.js +1 -0
- package/dist/ui/assets/OpenSearchCollectionPage-D5FaSCF1.js +1 -0
- package/dist/ui/assets/OpenSearchPage-FEzLxaej.js +1 -0
- package/dist/ui/assets/OverviewPage-0xvjT7Q0.js +1 -0
- package/dist/ui/assets/OverviewPage-qEl0a-0B.css +1 -0
- package/dist/ui/assets/QueueDetailPage-B2GaNLLe.js +1 -0
- package/dist/ui/assets/QueuesPage-Ch5kGwrp.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-DKiz21oo.js +2 -0
- package/dist/ui/assets/ServicesPage-Cmi3UIfM.js +2 -0
- package/dist/ui/assets/index-DH7RTkRh.css +1 -0
- package/dist/ui/assets/index-MF9fVrsr.js +37 -0
- package/dist/ui/index.html +2 -2
- package/package.json +3 -1
- package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
- package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
- package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
- package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
- package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
- package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
- package/dist/ui/assets/OverviewPage-6jDXV1jr.css +0 -1
- package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
- package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
- package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
- package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
- package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
- package/dist/ui/assets/index-BWlB542w.js +0 -36
- package/dist/ui/assets/index-EYnsoJOq.css +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Public API contract of the DynamoDB expression engine (lexer + parser +
|
|
2
|
+
// evaluators). ./index.ts implements and exports concrete functions matching
|
|
3
|
+
// `ExpressionEngine`; the DynamoDB emulator core imports them from there.
|
|
4
|
+
// All item data is wire-format AttributeValue JSON.
|
|
5
|
+
//
|
|
6
|
+
// Errors: every syntax/semantic problem must throw AwsError with code
|
|
7
|
+
// "ValidationException" and an AWS-worded message (unused
|
|
8
|
+
// ExpressionAttributeNames/Values, undefined placeholders; reserved-word
|
|
9
|
+
// misuse is NOT enforced in v1). ConditionalCheckFailedException is raised by
|
|
10
|
+
// the emulator core, not here — condition evaluation just returns boolean.
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=expression-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-types.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/expression-types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,sEAAsE;AACtE,0DAA0D;AAC1D,yEAAyE;AACzE,8EAA8E;AAC9E,2EAA2E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AttributeMap } from '../../../types.js';
|
|
2
|
+
import type { CompiledCondition, ExpressionContext, ExpressionEngine, ParsedKeyCondition } from './expression-types.js';
|
|
3
|
+
import { attributeValuesEqual, compareAttributeValues } from './evaluate.js';
|
|
4
|
+
export type { DocumentPath, PathSegment } from './evaluate.js';
|
|
5
|
+
export { compareDecimals, addDecimals, subtractDecimals, normalizeDecimal } from './decimal.js';
|
|
6
|
+
export { attributeValuesEqual, compareAttributeValues };
|
|
7
|
+
export declare function parseKeyCondition(expression: string, ctx: ExpressionContext): ParsedKeyCondition;
|
|
8
|
+
export declare function compileCondition(expression: string, ctx: ExpressionContext, label?: 'ConditionExpression' | 'FilterExpression'): CompiledCondition;
|
|
9
|
+
export declare function applyUpdate(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
10
|
+
export declare function applyProjection(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
11
|
+
export declare function assertPlaceholdersUsed(expressions: Array<string | null | undefined>, ctx: ExpressionContext): void;
|
|
12
|
+
export declare const expressionEngine: ExpressionEngine;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EACV,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAC3E,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,oBAAoB,EAAE,sBAAsB,EAE7C,MAAM,eAAe,CAAC;AAIvB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;AAKxD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,kBAAkB,CAEhG;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,iBAAiB,EACtB,KAAK,GAAE,qBAAqB,GAAG,kBAA0C,GACxE,iBAAiB,CAGnB;AAqED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAsDxG;AAuDD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAY5G;AAQD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAC7C,GAAG,EAAE,iBAAiB,GACrB,IAAI,CAaN;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAO9B,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// Public entry of the DynamoDB expression engine. Implements the
|
|
2
|
+
// ExpressionEngine contract (expression-types.ts) on top of the lexer/parser
|
|
3
|
+
// (parser.ts) and the value semantics (evaluate.ts). Input items are never
|
|
4
|
+
// mutated — updates and projections build fresh structures.
|
|
5
|
+
//
|
|
6
|
+
// Unused-placeholder validation is request-scoped on AWS (one names/values
|
|
7
|
+
// map serves KeyCondition + Filter + Projection of the same call), so it
|
|
8
|
+
// lives in `assertPlaceholdersUsed(expressions, ctx)` — the emulator core
|
|
9
|
+
// calls it once per request with every expression the request carried —
|
|
10
|
+
// instead of inside the per-expression functions, where a shared map would
|
|
11
|
+
// false-positive.
|
|
12
|
+
import { validationError } from '../../../http/errors.js';
|
|
13
|
+
import { parseConditionExpression, parseKeyConditionExpression, parseProjectionExpression, parseUpdateExpression, } from './parser.js';
|
|
14
|
+
import { attributeValuesEqual, compareAttributeValues, formatPath, pathsOverlap, resolvePath, setDifference, setUnion, typeOf, } from './evaluate.js';
|
|
15
|
+
import { addDecimals } from './decimal.js';
|
|
16
|
+
export { compareDecimals, addDecimals, subtractDecimals, normalizeDecimal } from './decimal.js';
|
|
17
|
+
export { attributeValuesEqual, compareAttributeValues };
|
|
18
|
+
const INVALID_DOCUMENT_PATH = 'The document path provided in the update expression is invalid for update';
|
|
19
|
+
const INCORRECT_OPERAND_TYPE = 'An operand in the update expression has an incorrect data type';
|
|
20
|
+
export function parseKeyCondition(expression, ctx) {
|
|
21
|
+
return parseKeyConditionExpression(expression, ctx);
|
|
22
|
+
}
|
|
23
|
+
export function compileCondition(expression, ctx, label = 'ConditionExpression') {
|
|
24
|
+
const predicate = parseConditionExpression(expression, ctx, label);
|
|
25
|
+
return { evaluate: predicate };
|
|
26
|
+
}
|
|
27
|
+
// -- update application --------------------------------------------------------
|
|
28
|
+
// Walks to the container holding the last path segment. Returns undefined
|
|
29
|
+
// when an intermediate step is missing or of the wrong shape.
|
|
30
|
+
function resolveContainer(root, path) {
|
|
31
|
+
let container = { M: root };
|
|
32
|
+
for (const seg of path.slice(0, -1)) {
|
|
33
|
+
if (container === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
container = 'attr' in seg ? container.M?.[seg.attr] : container.L?.[seg.index];
|
|
36
|
+
}
|
|
37
|
+
return container;
|
|
38
|
+
}
|
|
39
|
+
function setPath(root, path, value) {
|
|
40
|
+
const container = resolveContainer(root, path);
|
|
41
|
+
const last = path[path.length - 1];
|
|
42
|
+
if ('attr' in last) {
|
|
43
|
+
if (container?.M === undefined)
|
|
44
|
+
throw validationError(INVALID_DOCUMENT_PATH);
|
|
45
|
+
container.M[last.attr] = value;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (container?.L === undefined)
|
|
49
|
+
throw validationError(INVALID_DOCUMENT_PATH);
|
|
50
|
+
// A SET beyond the end of a list appends (AWS semantics).
|
|
51
|
+
if (last.index >= container.L.length)
|
|
52
|
+
container.L.push(value);
|
|
53
|
+
else
|
|
54
|
+
container.L[last.index] = value;
|
|
55
|
+
}
|
|
56
|
+
function removePath(root, path) {
|
|
57
|
+
const container = resolveContainer(root, path);
|
|
58
|
+
const last = path[path.length - 1];
|
|
59
|
+
if ('attr' in last) {
|
|
60
|
+
if (container?.M !== undefined)
|
|
61
|
+
delete container.M[last.attr];
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (container?.L !== undefined && last.index < container.L.length) {
|
|
65
|
+
container.L.splice(last.index, 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function assertNoOverlap(paths) {
|
|
69
|
+
for (let i = 0; i < paths.length; i++) {
|
|
70
|
+
for (let j = i + 1; j < paths.length; j++) {
|
|
71
|
+
if (pathsOverlap(paths[i], paths[j])) {
|
|
72
|
+
throw validationError('Invalid UpdateExpression: Two document paths overlap with each other; ' +
|
|
73
|
+
`must remove or rewrite one of these paths; path one: [${formatPath(paths[i])}], path two: [${formatPath(paths[j])}]`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Splice order matters when several indexes of the same list are removed in
|
|
79
|
+
// one expression: apply the highest index first so every splice still refers
|
|
80
|
+
// to the original element positions.
|
|
81
|
+
function sortRemovesForSplice(removes) {
|
|
82
|
+
return [...removes].sort((a, b) => {
|
|
83
|
+
const parentA = formatPath(a.slice(0, -1));
|
|
84
|
+
const parentB = formatPath(b.slice(0, -1));
|
|
85
|
+
if (parentA !== parentB)
|
|
86
|
+
return parentA < parentB ? -1 : 1;
|
|
87
|
+
const lastA = a[a.length - 1];
|
|
88
|
+
const lastB = b[b.length - 1];
|
|
89
|
+
if ('index' in lastA && 'index' in lastB)
|
|
90
|
+
return lastB.index - lastA.index;
|
|
91
|
+
return 0;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function applyUpdate(expression, item, ctx) {
|
|
95
|
+
const parsed = parseUpdateExpression(expression, ctx);
|
|
96
|
+
assertNoOverlap([
|
|
97
|
+
...parsed.sets.map((a) => a.path),
|
|
98
|
+
...parsed.removes,
|
|
99
|
+
...parsed.adds.map((a) => a.path),
|
|
100
|
+
...parsed.deletes.map((a) => a.path),
|
|
101
|
+
]);
|
|
102
|
+
const updated = structuredClone(item);
|
|
103
|
+
// SET operands read the original image; results are cloned so the new item
|
|
104
|
+
// never aliases values inside the input.
|
|
105
|
+
for (const action of parsed.sets) {
|
|
106
|
+
setPath(updated, action.path, structuredClone(action.value(item)));
|
|
107
|
+
}
|
|
108
|
+
for (const action of parsed.adds) {
|
|
109
|
+
const existing = resolvePath(updated, action.path);
|
|
110
|
+
const addition = structuredClone(action.value);
|
|
111
|
+
if (existing === undefined) {
|
|
112
|
+
setPath(updated, action.path, addition);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const type = typeOf(action.value);
|
|
116
|
+
if (typeOf(existing) !== type)
|
|
117
|
+
throw validationError(INCORRECT_OPERAND_TYPE);
|
|
118
|
+
if (type === 'N') {
|
|
119
|
+
setPath(updated, action.path, { N: addDecimals(existing.N, addition.N) });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const tag = type;
|
|
123
|
+
const merged = {};
|
|
124
|
+
merged[tag] = setUnion(tag, existing[tag], addition[tag]);
|
|
125
|
+
setPath(updated, action.path, merged);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const action of parsed.deletes) {
|
|
129
|
+
const existing = resolvePath(updated, action.path);
|
|
130
|
+
if (existing === undefined)
|
|
131
|
+
continue;
|
|
132
|
+
const tag = typeOf(action.value);
|
|
133
|
+
if (typeOf(existing) !== tag)
|
|
134
|
+
throw validationError(INCORRECT_OPERAND_TYPE);
|
|
135
|
+
const remaining = setDifference(tag, existing[tag], action.value[tag]);
|
|
136
|
+
if (remaining.length === 0) {
|
|
137
|
+
removePath(updated, action.path);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const reduced = {};
|
|
141
|
+
reduced[tag] = remaining;
|
|
142
|
+
setPath(updated, action.path, reduced);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const path of sortRemovesForSplice(parsed.removes)) {
|
|
146
|
+
removePath(updated, path);
|
|
147
|
+
}
|
|
148
|
+
return updated;
|
|
149
|
+
}
|
|
150
|
+
function newNode() {
|
|
151
|
+
return { take: false, attrs: new Map(), indexes: new Map() };
|
|
152
|
+
}
|
|
153
|
+
function insertPath(root, path) {
|
|
154
|
+
let node = root;
|
|
155
|
+
for (const seg of path) {
|
|
156
|
+
if (node.take)
|
|
157
|
+
return; // a shorter overlapping path already takes the subtree
|
|
158
|
+
if ('attr' in seg) {
|
|
159
|
+
if (!node.attrs.has(seg.attr))
|
|
160
|
+
node.attrs.set(seg.attr, newNode());
|
|
161
|
+
node = node.attrs.get(seg.attr);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
if (!node.indexes.has(seg.index))
|
|
165
|
+
node.indexes.set(seg.index, newNode());
|
|
166
|
+
node = node.indexes.get(seg.index);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
node.take = true;
|
|
170
|
+
}
|
|
171
|
+
function projectValue(value, node) {
|
|
172
|
+
if (node.take)
|
|
173
|
+
return structuredClone(value);
|
|
174
|
+
if (value.M !== undefined && node.attrs.size > 0) {
|
|
175
|
+
const out = {};
|
|
176
|
+
for (const [name, child] of node.attrs) {
|
|
177
|
+
const inner = value.M[name];
|
|
178
|
+
if (inner === undefined)
|
|
179
|
+
continue;
|
|
180
|
+
const projected = projectValue(inner, child);
|
|
181
|
+
if (projected !== undefined)
|
|
182
|
+
out[name] = projected;
|
|
183
|
+
}
|
|
184
|
+
return Object.keys(out).length > 0 ? { M: out } : undefined;
|
|
185
|
+
}
|
|
186
|
+
if (value.L !== undefined && node.indexes.size > 0) {
|
|
187
|
+
// Selected list elements are kept in ascending index order, compacted.
|
|
188
|
+
const out = [];
|
|
189
|
+
for (const index of [...node.indexes.keys()].sort((a, b) => a - b)) {
|
|
190
|
+
const inner = value.L[index];
|
|
191
|
+
if (inner === undefined)
|
|
192
|
+
continue;
|
|
193
|
+
const projected = projectValue(inner, node.indexes.get(index));
|
|
194
|
+
if (projected !== undefined)
|
|
195
|
+
out.push(projected);
|
|
196
|
+
}
|
|
197
|
+
return out.length > 0 ? { L: out } : undefined;
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
export function applyProjection(expression, item, ctx) {
|
|
202
|
+
const paths = parseProjectionExpression(expression, ctx);
|
|
203
|
+
const root = newNode();
|
|
204
|
+
for (const path of paths)
|
|
205
|
+
insertPath(root, path);
|
|
206
|
+
const result = {};
|
|
207
|
+
for (const [name, child] of root.attrs) {
|
|
208
|
+
const value = item[name];
|
|
209
|
+
if (value === undefined)
|
|
210
|
+
continue;
|
|
211
|
+
const projected = projectValue(value, child);
|
|
212
|
+
if (projected !== undefined)
|
|
213
|
+
result[name] = projected;
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
// -- request-level placeholder accounting ------------------------------------------
|
|
218
|
+
const PLACEHOLDER_PATTERN = /[#:][A-Za-z0-9_]+/g;
|
|
219
|
+
// Call once per request with every expression it carried (undefined entries
|
|
220
|
+
// are fine). Throws the AWS unused-names/values ValidationExceptions.
|
|
221
|
+
export function assertPlaceholdersUsed(expressions, ctx) {
|
|
222
|
+
const used = new Set();
|
|
223
|
+
for (const expression of expressions) {
|
|
224
|
+
for (const match of (expression ?? '').matchAll(PLACEHOLDER_PATTERN))
|
|
225
|
+
used.add(match[0]);
|
|
226
|
+
}
|
|
227
|
+
const unusedNames = Object.keys(ctx.names ?? {}).filter((key) => !used.has(key));
|
|
228
|
+
if (unusedNames.length > 0) {
|
|
229
|
+
throw validationError(`Value provided in ExpressionAttributeNames unused in expressions: keys: {${unusedNames.join(', ')}}`);
|
|
230
|
+
}
|
|
231
|
+
const unusedValues = Object.keys(ctx.values ?? {}).filter((key) => !used.has(key));
|
|
232
|
+
if (unusedValues.length > 0) {
|
|
233
|
+
throw validationError(`Value provided in ExpressionAttributeValues unused in expressions: keys: {${unusedValues.join(', ')}}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export const expressionEngine = {
|
|
237
|
+
parseKeyCondition,
|
|
238
|
+
compileCondition,
|
|
239
|
+
applyUpdate,
|
|
240
|
+
applyProjection,
|
|
241
|
+
compareAttributeValues,
|
|
242
|
+
attributeValuesEqual,
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TokenType = 'ident' | 'name' | 'value' | 'number' | 'lparen' | 'rparen' | 'lbracket' | 'rbracket' | 'comma' | 'dot' | 'plus' | 'minus' | 'eq' | 'ne' | 'lt' | 'le' | 'gt' | 'ge' | 'eof';
|
|
2
|
+
export interface Token {
|
|
3
|
+
type: TokenType;
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
export type ComparatorType = 'eq' | 'ne' | 'lt' | 'le' | 'gt' | 'ge';
|
|
7
|
+
export declare const COMPARATOR_SYMBOL: Record<ComparatorType, '=' | '<>' | '<' | '<=' | '>' | '>='>;
|
|
8
|
+
export declare function syntaxError(label: string, tokens: Token[], index: number): never;
|
|
9
|
+
export declare function tokenize(expression: string, label: string): Token[];
|
|
10
|
+
export declare function isKeyword(token: Token, keyword: string): boolean;
|
|
11
|
+
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/lexer.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAC7C,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAClC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GACvC,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAErE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAE1F,CAAC;AAIF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAQhF;AAWD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAqEnE;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Tokenizer for the (frozen) DynamoDB expression grammar. Shared by the key
|
|
2
|
+
// condition, condition/filter, update and projection parsers. Keywords stay
|
|
3
|
+
// `ident` tokens — the parsers match them case-insensitively where the
|
|
4
|
+
// grammar expects one, so attributes named e.g. "and" still work behind `#`
|
|
5
|
+
// placeholders while bare `AND`/`and` both parse as the operator.
|
|
6
|
+
import { validationError } from '../../../http/errors.js';
|
|
7
|
+
export const COMPARATOR_SYMBOL = {
|
|
8
|
+
eq: '=', ne: '<>', lt: '<', le: '<=', gt: '>', ge: '>=',
|
|
9
|
+
};
|
|
10
|
+
// AWS-shaped syntax error: token text plus a small window of surrounding
|
|
11
|
+
// tokens as the "near" context.
|
|
12
|
+
export function syntaxError(label, tokens, index) {
|
|
13
|
+
const token = tokens[Math.min(index, tokens.length - 1)];
|
|
14
|
+
const text = token.type === 'eof' ? '<EOF>' : token.text;
|
|
15
|
+
const near = tokens
|
|
16
|
+
.slice(Math.max(0, index - 1), index + 2)
|
|
17
|
+
.map((t) => (t.type === 'eof' ? '<EOF>' : t.text))
|
|
18
|
+
.join(' ');
|
|
19
|
+
throw validationError(`Invalid ${label}: Syntax error; token: "${text}", near: "${near || text}"`);
|
|
20
|
+
}
|
|
21
|
+
const IDENT_START = /[A-Za-z_]/;
|
|
22
|
+
const IDENT_PART = /[A-Za-z0-9_]/;
|
|
23
|
+
const DIGIT = /[0-9]/;
|
|
24
|
+
const SINGLE_CHAR = {
|
|
25
|
+
'(': 'lparen', ')': 'rparen', '[': 'lbracket', ']': 'rbracket',
|
|
26
|
+
',': 'comma', '.': 'dot', '+': 'plus', '-': 'minus', '=': 'eq',
|
|
27
|
+
};
|
|
28
|
+
export function tokenize(expression, label) {
|
|
29
|
+
const tokens = [];
|
|
30
|
+
let pos = 0;
|
|
31
|
+
while (pos < expression.length) {
|
|
32
|
+
const ch = expression[pos];
|
|
33
|
+
if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
|
|
34
|
+
pos += 1;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (ch === '#' || ch === ':') {
|
|
38
|
+
let end = pos + 1;
|
|
39
|
+
while (end < expression.length && IDENT_PART.test(expression[end]))
|
|
40
|
+
end += 1;
|
|
41
|
+
if (end === pos + 1) {
|
|
42
|
+
tokens.push({ type: 'ident', text: ch });
|
|
43
|
+
syntaxError(label, [...tokens, { type: 'eof', text: '' }], tokens.length - 1);
|
|
44
|
+
}
|
|
45
|
+
tokens.push({ type: ch === '#' ? 'name' : 'value', text: expression.slice(pos, end) });
|
|
46
|
+
pos = end;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (IDENT_START.test(ch)) {
|
|
50
|
+
let end = pos + 1;
|
|
51
|
+
while (end < expression.length && IDENT_PART.test(expression[end]))
|
|
52
|
+
end += 1;
|
|
53
|
+
tokens.push({ type: 'ident', text: expression.slice(pos, end) });
|
|
54
|
+
pos = end;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (DIGIT.test(ch)) {
|
|
58
|
+
let end = pos + 1;
|
|
59
|
+
while (end < expression.length && DIGIT.test(expression[end]))
|
|
60
|
+
end += 1;
|
|
61
|
+
tokens.push({ type: 'number', text: expression.slice(pos, end) });
|
|
62
|
+
pos = end;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (ch === '<') {
|
|
66
|
+
const next = expression[pos + 1];
|
|
67
|
+
if (next === '>') {
|
|
68
|
+
tokens.push({ type: 'ne', text: '<>' });
|
|
69
|
+
pos += 2;
|
|
70
|
+
}
|
|
71
|
+
else if (next === '=') {
|
|
72
|
+
tokens.push({ type: 'le', text: '<=' });
|
|
73
|
+
pos += 2;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
tokens.push({ type: 'lt', text: '<' });
|
|
77
|
+
pos += 1;
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (ch === '>') {
|
|
82
|
+
if (expression[pos + 1] === '=') {
|
|
83
|
+
tokens.push({ type: 'ge', text: '>=' });
|
|
84
|
+
pos += 2;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
tokens.push({ type: 'gt', text: '>' });
|
|
88
|
+
pos += 1;
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const single = SINGLE_CHAR[ch];
|
|
93
|
+
if (single) {
|
|
94
|
+
tokens.push({ type: single, text: ch });
|
|
95
|
+
pos += 1;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
tokens.push({ type: 'ident', text: ch });
|
|
99
|
+
syntaxError(label, [...tokens, { type: 'eof', text: '' }], tokens.length - 1);
|
|
100
|
+
}
|
|
101
|
+
tokens.push({ type: 'eof', text: '' });
|
|
102
|
+
return tokens;
|
|
103
|
+
}
|
|
104
|
+
// Case-insensitive keyword check on an ident token (AND/OR/NOT/BETWEEN/IN/
|
|
105
|
+
// SET/REMOVE/ADD/DELETE are keywords; function names are case-sensitive).
|
|
106
|
+
export function isKeyword(token, keyword) {
|
|
107
|
+
return token.type === 'ident' && token.text.toUpperCase() === keyword;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/lexer.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,uEAAuE;AACvE,4EAA4E;AAC5E,kEAAkE;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAmB1D,MAAM,CAAC,MAAM,iBAAiB,GAAiE;IAC7F,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI;CACxD,CAAC;AAEF,yEAAyE;AACzE,gCAAgC;AAChC,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAe,EAAE,KAAa;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM;SAChB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,eAAe,CAAC,WAAW,KAAK,2BAA2B,IAAI,aAAa,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,UAAU,GAAG,cAAc,CAAC;AAClC,MAAM,KAAK,GAAG,OAAO,CAAC;AAEtB,MAAM,WAAW,GAA8B;IAC7C,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU;IAC9D,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI;CAC/D,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,KAAa;IACxD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC5D,GAAG,IAAI,CAAC,CAAC;YACT,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAAE,GAAG,IAAI,CAAC,CAAC;YAC7E,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzC,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,GAAG,GAAG,GAAG,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAAE,GAAG,IAAI,CAAC,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjE,GAAG,GAAG,GAAG,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAAE,GAAG,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,GAAG,GAAG,GAAG,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACjC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvC,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvC,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG,IAAI,CAAC,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,OAAe;IACrD,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AttributeMap, AttributeValue } from '../../../types.js';
|
|
2
|
+
import type { ExpressionContext, ParsedKeyCondition } from './expression-types.js';
|
|
3
|
+
import type { DocumentPath } from './evaluate.js';
|
|
4
|
+
export type CompiledPredicate = (item: AttributeMap) => boolean;
|
|
5
|
+
export interface SetAction {
|
|
6
|
+
path: DocumentPath;
|
|
7
|
+
value: (original: AttributeMap) => AttributeValue;
|
|
8
|
+
}
|
|
9
|
+
export interface ValueAction {
|
|
10
|
+
path: DocumentPath;
|
|
11
|
+
value: AttributeValue;
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedUpdate {
|
|
14
|
+
sets: SetAction[];
|
|
15
|
+
removes: DocumentPath[];
|
|
16
|
+
adds: ValueAction[];
|
|
17
|
+
deletes: ValueAction[];
|
|
18
|
+
}
|
|
19
|
+
export declare function parseConditionExpression(expression: string, ctx: ExpressionContext, label: string): CompiledPredicate;
|
|
20
|
+
export declare function parseKeyConditionExpression(expression: string, ctx: ExpressionContext): ParsedKeyCondition;
|
|
21
|
+
export declare function parseUpdateExpression(expression: string, ctx: ExpressionContext): ParsedUpdate;
|
|
22
|
+
export declare function parseProjectionExpression(expression: string, ctx: ExpressionContext): DocumentPath[];
|
|
23
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAmB,MAAM,uBAAuB,CAAC;AAOpG,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,eAAe,CAAC;AAGrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,CAAC;IAEnB,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,cAAc,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AA+iBD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAErH;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,kBAAkB,CAE1G;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAE9F;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,EAAE,CAEpG"}
|