@kensio/yulin 1.21.2 → 1.21.3
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/dist/service/cloudformation/resource/factory/sim-cfn-resource-factory.type.d.ts +9 -0
- package/dist/service/cloudformation/resource/sim-cfn-resource.type.d.ts +11 -0
- package/dist/service/cloudformation/resource/update/sim-cfn-resource-update-validator.d.ts +26 -0
- package/dist/service/cloudformation/resource/update/sim-cfn-resource-update-validator.js +55 -0
- package/dist/service/cloudformation/stack/sim-cfn-stack-resource-operations.d.ts +5 -0
- package/dist/service/cloudformation/stack/sim-cfn-stack-resource-operations.js +17 -0
- package/dist/service/cloudformation/stack/update/sim-cfn-stack-update-plan.d.ts +7 -1
- package/dist/service/cloudformation/stack/update/sim-cfn-stack-update-plan.js +13 -0
- package/dist/service/cloudformation/stack/update/sim-cfn-stack-updater.js +1 -0
- package/dist/service/dynamodb/cfn/sim-cfn-dynamodb-resource-factory.d.ts +5 -0
- package/dist/service/dynamodb/cfn/sim-cfn-dynamodb-resource-factory.js +15 -0
- package/dist/service/dynamodb/cfn/table/sim-cfn-dynamodb-table-update-validator.d.ts +24 -0
- package/dist/service/dynamodb/cfn/table/sim-cfn-dynamodb-table-update-validator.js +38 -0
- package/dist/service/dynamodb/table/sim-dynamodb-index-update.js +1 -2
- package/package.json +2 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SimCfnResource, SimCloudFormationResourceCreateContext, SimCloudFormationResourceDeleteContext } from "../sim-cfn-resource.js";
|
|
2
|
+
import type { SimCloudFormationResourceUpdateContext } from "../sim-cfn-resource.type.js";
|
|
2
3
|
export interface SimCfnServiceResourceFactory {
|
|
3
4
|
create(resourceTypeName: string, resource: SimCfnResource, context: SimCloudFormationResourceCreateContext): Promise<object | undefined>;
|
|
4
5
|
/**
|
|
@@ -15,6 +16,14 @@ export interface SimCfnServiceResourceFactory {
|
|
|
15
16
|
* the teardown records it and carries on.
|
|
16
17
|
*/
|
|
17
18
|
delete(resourceTypeName: string, resource: SimCfnResource, context: SimCloudFormationResourceDeleteContext): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Refuse an invalid replacement before CloudFormation deletes anything.
|
|
21
|
+
*
|
|
22
|
+
* Most simulated Resource types have no update-specific validation. A
|
|
23
|
+
* service can implement this hook when an update carries constraints that a
|
|
24
|
+
* create request cannot check.
|
|
25
|
+
*/
|
|
26
|
+
assertUpdateAllowed?(resourceTypeName: string, current: SimCfnResource, updated: SimCfnResource, context: SimCloudFormationResourceUpdateContext): Promise<void> | void;
|
|
18
27
|
}
|
|
19
28
|
export interface SimCloudFormationParsedResourceType {
|
|
20
29
|
readonly providerName: string;
|
|
@@ -86,3 +86,14 @@ export interface SimCloudFormationResourceDeleteContext {
|
|
|
86
86
|
/** The principal the teardown runs as, as creation carries it. */
|
|
87
87
|
readonly caller?: SimAwsCaller | undefined;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* The two resolved Resource definitions available to update validation.
|
|
91
|
+
*/
|
|
92
|
+
export interface SimCloudFormationResourceUpdateContext {
|
|
93
|
+
readonly simAws: SimAws;
|
|
94
|
+
readonly currentResources: ReadonlyMap<string, SimCfnResource>;
|
|
95
|
+
readonly updatedResources: ReadonlyMap<string, SimCfnResource>;
|
|
96
|
+
readonly currentResolvedProperties: SimCfnTemplateValueRecord;
|
|
97
|
+
readonly updatedResolvedProperties: SimCfnTemplateValueRecord;
|
|
98
|
+
readonly caller?: SimAwsCaller | undefined;
|
|
99
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SimAws } from "../../../aws/sim-aws.js";
|
|
2
|
+
import type { SimAwsCaller } from "../../../aws/caller/sim-aws-caller.js";
|
|
3
|
+
import type { SimCfnResource } from "../sim-cfn-resource.js";
|
|
4
|
+
interface SimCfnResourceUpdateValidatorProperties {
|
|
5
|
+
readonly current: SimCfnResource;
|
|
6
|
+
readonly updated: SimCfnResource;
|
|
7
|
+
}
|
|
8
|
+
interface AssertSimCfnResourceUpdateAllowedProperties {
|
|
9
|
+
readonly simAws: SimAws;
|
|
10
|
+
readonly currentResources: ReadonlyMap<string, SimCfnResource>;
|
|
11
|
+
readonly updatedResources: ReadonlyMap<string, SimCfnResource>;
|
|
12
|
+
readonly caller?: SimAwsCaller | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Runs service-specific validation for one Resource replacement.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SimCfnResourceUpdateValidator {
|
|
18
|
+
private readonly current;
|
|
19
|
+
private readonly updated;
|
|
20
|
+
constructor(properties: SimCfnResourceUpdateValidatorProperties);
|
|
21
|
+
/**
|
|
22
|
+
* Refuse an invalid update before its current Resource is deleted.
|
|
23
|
+
*/
|
|
24
|
+
assertAllowed(properties: AssertSimCfnResourceUpdateAllowedProperties): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { parseSimCloudFormationResourceType } from "../parser/sim-cfn-resource-parser.js";
|
|
2
|
+
import { resolveSimCloudFormationServiceResourceFactory } from "../resolve/service/sim-cfn-service-resolver.js";
|
|
3
|
+
import { isSimCfnUnsupportedResourceError } from "../unsupported/sim-cfn-unsupported-resource.js";
|
|
4
|
+
/**
|
|
5
|
+
* Runs service-specific validation for one Resource replacement.
|
|
6
|
+
*/
|
|
7
|
+
export class SimCfnResourceUpdateValidator {
|
|
8
|
+
current;
|
|
9
|
+
updated;
|
|
10
|
+
constructor(properties) {
|
|
11
|
+
this.current = properties.current;
|
|
12
|
+
this.updated = properties.updated;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Refuse an invalid update before its current Resource is deleted.
|
|
16
|
+
*/
|
|
17
|
+
async assertAllowed(properties) {
|
|
18
|
+
const { current, updated } = this;
|
|
19
|
+
const { simAws, currentResources, updatedResources, caller } = properties;
|
|
20
|
+
const { type } = updated;
|
|
21
|
+
if (type === undefined || current.type !== type) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const resourceType = parseSimCloudFormationResourceType(type);
|
|
25
|
+
let factory;
|
|
26
|
+
try {
|
|
27
|
+
factory = resolveSimCloudFormationServiceResourceFactory(simAws, updated.accountRegionScope, resourceType);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (isSimCfnUnsupportedResourceError(error)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
if (factory.assertUpdateAllowed === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await factory.assertUpdateAllowed(resourceType.resourceTypeName, current, updated, {
|
|
39
|
+
simAws,
|
|
40
|
+
currentResources,
|
|
41
|
+
updatedResources,
|
|
42
|
+
currentResolvedProperties: await current.resolvedProperties({
|
|
43
|
+
simAws,
|
|
44
|
+
resources: currentResources,
|
|
45
|
+
caller,
|
|
46
|
+
}),
|
|
47
|
+
updatedResolvedProperties: await updated.resolvedProperties({
|
|
48
|
+
simAws,
|
|
49
|
+
resources: updatedResources,
|
|
50
|
+
caller,
|
|
51
|
+
}),
|
|
52
|
+
caller,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -8,6 +8,7 @@ import type { SimCfnResource } from "../resource/sim-cfn-resource.js";
|
|
|
8
8
|
import type { SimCfnTemplate } from "../template/sim-cfn-template.js";
|
|
9
9
|
import type { SimCfnResourceOrder } from "./deploy/sim-cfn-resource-order.js";
|
|
10
10
|
import { SimCfnStackUpdater } from "./update/sim-cfn-stack-updater.js";
|
|
11
|
+
import type { SimCfnStackResourceReplacement } from "./update/sim-cfn-stack-update-plan.js";
|
|
11
12
|
import type { SimCloudFormationStackName } from "./sim-cfn-stack.js";
|
|
12
13
|
interface SimCfnStackUpdateProperties {
|
|
13
14
|
readonly background: BackgroundScheduler;
|
|
@@ -87,6 +88,10 @@ export declare class SimCfnStackResourceOperations {
|
|
|
87
88
|
* Stack.
|
|
88
89
|
*/
|
|
89
90
|
delete(resources: ReadonlyMap<string, SimCfnResource>, deleting: readonly SimCfnResource[]): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Validate every Resource replacement before the update changes the Stack.
|
|
93
|
+
*/
|
|
94
|
+
assertUpdatesAllowed(currentResources: ReadonlyMap<string, SimCfnResource>, updatedResources: ReadonlyMap<string, SimCfnResource>, replacements: readonly SimCfnStackResourceReplacement[]): Promise<void>;
|
|
90
95
|
/**
|
|
91
96
|
* An update of this Stack from a changed template, in the same scope.
|
|
92
97
|
*/
|
|
@@ -2,6 +2,7 @@ import { SimCdkAssetsPublisher } from "../cdk/assets/sim-cdk-assets-publisher.js
|
|
|
2
2
|
import { SimCfnStackResourceCreator } from "./deploy/sim-cfn-stack-resource-creator.js";
|
|
3
3
|
import { SimCfnStackResourceDeleter } from "./teardown/sim-cfn-stack-resource-deleter.js";
|
|
4
4
|
import { SimCfnStackUpdater } from "./update/sim-cfn-stack-updater.js";
|
|
5
|
+
import { SimCfnResourceUpdateValidator } from "../resource/update/sim-cfn-resource-update-validator.js";
|
|
5
6
|
/**
|
|
6
7
|
* What a Stack can ask simulated AWS to do with its Resources.
|
|
7
8
|
*
|
|
@@ -77,6 +78,22 @@ export class SimCfnStackResourceOperations {
|
|
|
77
78
|
async delete(resources, deleting) {
|
|
78
79
|
await this.deleter(resources).delete(deleting);
|
|
79
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate every Resource replacement before the update changes the Stack.
|
|
83
|
+
*/
|
|
84
|
+
async assertUpdatesAllowed(currentResources, updatedResources, replacements) {
|
|
85
|
+
await Promise.all(replacements.map(async ({ current, updated }) => {
|
|
86
|
+
await new SimCfnResourceUpdateValidator({
|
|
87
|
+
current,
|
|
88
|
+
updated,
|
|
89
|
+
}).assertAllowed({
|
|
90
|
+
simAws: this.simAws,
|
|
91
|
+
currentResources,
|
|
92
|
+
updatedResources,
|
|
93
|
+
caller: this.caller,
|
|
94
|
+
});
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
80
97
|
/**
|
|
81
98
|
* An update of this Stack from a changed template, in the same scope.
|
|
82
99
|
*/
|
|
@@ -3,6 +3,10 @@ interface SimCfnStackUpdatePlanProperties {
|
|
|
3
3
|
readonly current: ReadonlyMap<string, SimCfnResource>;
|
|
4
4
|
readonly updated: ReadonlyMap<string, SimCfnResource>;
|
|
5
5
|
}
|
|
6
|
+
export interface SimCfnStackResourceReplacement {
|
|
7
|
+
readonly current: SimCfnResource;
|
|
8
|
+
readonly updated: SimCfnResource;
|
|
9
|
+
}
|
|
6
10
|
/**
|
|
7
11
|
* What an update has to do to a Stack's Resources, worked out before any of it
|
|
8
12
|
* happens.
|
|
@@ -17,6 +21,8 @@ interface SimCfnStackUpdatePlanProperties {
|
|
|
17
21
|
* simCfnStackReplacedLogicalIds decides what changed.
|
|
18
22
|
*/
|
|
19
23
|
export declare class SimCfnStackUpdatePlan {
|
|
24
|
+
/** The current and updated halves of each Resource replacement. */
|
|
25
|
+
readonly replacements: readonly SimCfnStackResourceReplacement[];
|
|
20
26
|
/**
|
|
21
27
|
* The deployed Resources to delete: the ones the new template drops, and the
|
|
22
28
|
* deployed halves of the ones it replaces.
|
|
@@ -27,7 +33,7 @@ export declare class SimCfnStackUpdatePlan {
|
|
|
27
33
|
* halves of the ones it replaces.
|
|
28
34
|
*/
|
|
29
35
|
readonly creations: readonly SimCfnResource[];
|
|
30
|
-
|
|
36
|
+
readonly updated: ReadonlyMap<string, SimCfnResource>;
|
|
31
37
|
constructor(properties: SimCfnStackUpdatePlanProperties);
|
|
32
38
|
/**
|
|
33
39
|
* Whether the update changes any Resource at all.
|
|
@@ -13,6 +13,8 @@ import { simCfnStackReplacedLogicalIds } from "./sim-cfn-stack-replaced-resource
|
|
|
13
13
|
* simCfnStackReplacedLogicalIds decides what changed.
|
|
14
14
|
*/
|
|
15
15
|
export class SimCfnStackUpdatePlan {
|
|
16
|
+
/** The current and updated halves of each Resource replacement. */
|
|
17
|
+
replacements;
|
|
16
18
|
/**
|
|
17
19
|
* The deployed Resources to delete: the ones the new template drops, and the
|
|
18
20
|
* deployed halves of the ones it replaces.
|
|
@@ -28,6 +30,17 @@ export class SimCfnStackUpdatePlan {
|
|
|
28
30
|
const { current, updated } = properties;
|
|
29
31
|
const replaced = simCfnStackReplacedLogicalIds({ current, updated });
|
|
30
32
|
this.updated = updated;
|
|
33
|
+
this.replacements = replaced
|
|
34
|
+
.values()
|
|
35
|
+
.map((logicalId) => {
|
|
36
|
+
const currentResource = current.get(logicalId);
|
|
37
|
+
const updatedResource = updated.get(logicalId);
|
|
38
|
+
if (currentResource === undefined || updatedResource === undefined) {
|
|
39
|
+
throw new Error(`CloudFormation replacement ${logicalId} is missing one of its Resource definitions`);
|
|
40
|
+
}
|
|
41
|
+
return { current: currentResource, updated: updatedResource };
|
|
42
|
+
})
|
|
43
|
+
.toArray();
|
|
31
44
|
// Both lists are worked out now rather than on demand, because the Stack's
|
|
32
45
|
// Resource map is the current one and applying the plan changes it.
|
|
33
46
|
this.deletions = current
|
|
@@ -57,6 +57,7 @@ export class SimCfnStackUpdater {
|
|
|
57
57
|
async apply() {
|
|
58
58
|
const { resources, operations } = this.properties;
|
|
59
59
|
const { plan } = this;
|
|
60
|
+
await operations.assertUpdatesAllowed(resources, plan.updated, plan.replacements);
|
|
60
61
|
await operations.delete(resources, plan.deletions);
|
|
61
62
|
plan.applyTo(resources);
|
|
62
63
|
await operations.create(resources, plan.creations);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SimCfnServiceResourceFactory } from "../../cloudformation/resource/factory/sim-cfn-resource-factory.type.js";
|
|
2
2
|
import type { SimCfnResource, SimCloudFormationResourceCreateContext, SimCloudFormationResourceDeleteContext } from "../../cloudformation/resource/sim-cfn-resource.js";
|
|
3
|
+
import type { SimCloudFormationResourceUpdateContext } from "../../cloudformation/resource/sim-cfn-resource.type.js";
|
|
3
4
|
import type { SimDynamoDb } from "../sim-dynamodb.js";
|
|
4
5
|
interface SimDynamoDbCfnResourceFactoryProperties {
|
|
5
6
|
readonly dynamoDb: SimDynamoDb;
|
|
@@ -26,5 +27,9 @@ export declare class SimDynamoDbCfnResourceFactory implements SimCfnServiceResou
|
|
|
26
27
|
* Delete a simulated DynamoDB resource created from a CloudFormation Resource.
|
|
27
28
|
*/
|
|
28
29
|
delete(resourceTypeName: string, resource: SimCfnResource, context: SimCloudFormationResourceDeleteContext): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Validate a DynamoDB Resource replacement before its table is deleted.
|
|
32
|
+
*/
|
|
33
|
+
assertUpdateAllowed(resourceTypeName: string, current: SimCfnResource, updated: SimCfnResource, context: SimCloudFormationResourceUpdateContext): void;
|
|
29
34
|
}
|
|
30
35
|
export {};
|
|
@@ -2,6 +2,7 @@ import { simCfnResourceCallerOptions } from "../../cloudformation/resource/calle
|
|
|
2
2
|
import { SimCfnDynamoDbGlobalTableCreator } from "./global-table/sim-cfn-dynamodb-global-table-creator.js";
|
|
3
3
|
import { SimCfnDynamoDbTableCreator } from "./table/sim-cfn-dynamodb-table-creator.js";
|
|
4
4
|
import { SimCfnDynamoDbResourceDeleter } from "./sim-cfn-dynamodb-resource-deleter.js";
|
|
5
|
+
import { SimCfnDynamoDbTableUpdateValidator } from "./table/sim-cfn-dynamodb-table-update-validator.js";
|
|
5
6
|
/**
|
|
6
7
|
* CloudFormation Resource factory for simulated DynamoDB resources.
|
|
7
8
|
*/
|
|
@@ -50,4 +51,18 @@ export class SimDynamoDbCfnResourceFactory {
|
|
|
50
51
|
async delete(resourceTypeName, resource, context) {
|
|
51
52
|
await this.deleter.delete(resourceTypeName, resource, simCfnResourceCallerOptions(context.caller));
|
|
52
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Validate a DynamoDB Resource replacement before its table is deleted.
|
|
56
|
+
*/
|
|
57
|
+
assertUpdateAllowed(resourceTypeName, current, updated, context) {
|
|
58
|
+
if (resourceTypeName !== "Table") {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
new SimCfnDynamoDbTableUpdateValidator({
|
|
62
|
+
currentResource: current,
|
|
63
|
+
updatedResource: updated,
|
|
64
|
+
currentProperties: context.currentResolvedProperties,
|
|
65
|
+
updatedProperties: context.updatedResolvedProperties,
|
|
66
|
+
}).assertAllowed();
|
|
67
|
+
}
|
|
53
68
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SimCfnResource } from "../../../cloudformation/resource/sim-cfn-resource.js";
|
|
2
|
+
import type { SimCfnTemplateValueRecord } from "../../../cloudformation/template/value/sim-cfn-template-value.js";
|
|
3
|
+
interface SimCfnDynamoDbTableUpdateValidatorProperties {
|
|
4
|
+
readonly currentResource: SimCfnResource;
|
|
5
|
+
readonly updatedResource: SimCfnResource;
|
|
6
|
+
readonly currentProperties: SimCfnTemplateValueRecord;
|
|
7
|
+
readonly updatedProperties: SimCfnTemplateValueRecord;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Validates constraints that apply when CloudFormation updates a table.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SimCfnDynamoDbTableUpdateValidator {
|
|
13
|
+
private readonly properties;
|
|
14
|
+
constructor(properties: SimCfnDynamoDbTableUpdateValidatorProperties);
|
|
15
|
+
/**
|
|
16
|
+
* Refuse a template diff that asks DynamoDB for too many index operations.
|
|
17
|
+
*
|
|
18
|
+
* https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html
|
|
19
|
+
*/
|
|
20
|
+
assertAllowed(): void;
|
|
21
|
+
private tableProperties;
|
|
22
|
+
private indexUpdates;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readSimDynamoDbIndexName } from "../../secondary-index/sim-dynamodb-index-name.js";
|
|
2
|
+
import { SimDynamoDbIndexUpdate } from "../../table/sim-dynamodb-index-update.js";
|
|
3
|
+
import { SimCfnDynamoDbTableProperties } from "./sim-cfn-dynamodb-table-properties.js";
|
|
4
|
+
/**
|
|
5
|
+
* Validates constraints that apply when CloudFormation updates a table.
|
|
6
|
+
*/
|
|
7
|
+
export class SimCfnDynamoDbTableUpdateValidator {
|
|
8
|
+
properties;
|
|
9
|
+
constructor(properties) {
|
|
10
|
+
this.properties = properties;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Refuse a template diff that asks DynamoDB for too many index operations.
|
|
14
|
+
*
|
|
15
|
+
* https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html
|
|
16
|
+
*/
|
|
17
|
+
assertAllowed() {
|
|
18
|
+
const { currentResource, updatedResource } = this.properties;
|
|
19
|
+
const current = this.tableProperties(currentResource, this.properties.currentProperties).globalSecondaryIndexes();
|
|
20
|
+
const updated = this.tableProperties(updatedResource, this.properties.updatedProperties).globalSecondaryIndexes();
|
|
21
|
+
SimDynamoDbIndexUpdate.fromInput(this.indexUpdates(current, updated));
|
|
22
|
+
}
|
|
23
|
+
tableProperties(resource, properties) {
|
|
24
|
+
return new SimCfnDynamoDbTableProperties({ resource, properties });
|
|
25
|
+
}
|
|
26
|
+
indexUpdates(current, updated) {
|
|
27
|
+
const currentNames = new Set(current.map((index) => readSimDynamoDbIndexName(index.IndexName)));
|
|
28
|
+
const updatedNames = new Set(updated.map((index) => readSimDynamoDbIndexName(index.IndexName)));
|
|
29
|
+
return [
|
|
30
|
+
...updated
|
|
31
|
+
.filter((index) => !currentNames.has(readSimDynamoDbIndexName(index.IndexName)))
|
|
32
|
+
.map((index) => ({ Create: index })),
|
|
33
|
+
...current
|
|
34
|
+
.filter((index) => !updatedNames.has(readSimDynamoDbIndexName(index.IndexName)))
|
|
35
|
+
.map((index) => ({ Delete: { IndexName: index.IndexName } })),
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -73,8 +73,7 @@ export class SimDynamoDbIndexUpdate {
|
|
|
73
73
|
.map((entry) => deletedIndexName(entry))
|
|
74
74
|
.filter((name) => name !== undefined);
|
|
75
75
|
if (created.length + deleted.length > 1) {
|
|
76
|
-
throw new SimDynamoDbValidationException("
|
|
77
|
-
"UpdateTable operation");
|
|
76
|
+
throw new SimDynamoDbValidationException("Cannot perform more than one GSI creation or deletion in a single update");
|
|
78
77
|
}
|
|
79
78
|
return new this({ created: created.at(0), deletedName: deleted.at(0) });
|
|
80
79
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kensio/yulin",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.3",
|
|
4
4
|
"description": "AWS system behaviour simulation for isolated unit testing",
|
|
5
5
|
"repository": "https://github.com/KensioSoftware/yulin",
|
|
6
6
|
"homepage": "https://yulinsim.dev/",
|
|
@@ -297,7 +297,7 @@
|
|
|
297
297
|
"execa": "^10.0.0",
|
|
298
298
|
"fta-cli": "^3.0.0",
|
|
299
299
|
"node-sql-parser": "^5.4.0",
|
|
300
|
-
"oxfmt": "^0.
|
|
300
|
+
"oxfmt": "^0.65.0",
|
|
301
301
|
"oxlint": "^1.77.0",
|
|
302
302
|
"oxlint-tsgolint": "^7.0.2001",
|
|
303
303
|
"semantic-release": "25.0.9",
|