Skip to content

Commit 10f9307

Browse files
committed
refactor(spec2cdk): use typewriter module and import system
1 parent d52a4a7 commit 10f9307

File tree

15 files changed

+144
-183
lines changed

15 files changed

+144
-183
lines changed

packages/@aws-cdk/custom-resource-handlers/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"@types/jest": "^29.5.14",
4949
"aws-sdk-client-mock": "4.1.0",
5050
"aws-sdk-client-mock-jest": "4.1.0",
51-
"@cdklabs/typewriter": "^0.0.12",
51+
"@cdklabs/typewriter": "^0.0.14",
5252
"jest": "^29.7.0",
5353
"sinon": "^9.2.4",
5454
"nock": "^13.5.6",

packages/@aws-cdk/mixins-preview/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@
661661
"@aws-cdk/service-spec-types": "^0.0.195",
662662
"@aws-cdk/spec2cdk": "0.0.0",
663663
"@cdklabs/tskb": "^0.0.4",
664-
"@cdklabs/typewriter": "^0.0.12",
664+
"@cdklabs/typewriter": "^0.0.14",
665665
"@types/jest": "^29.5.14",
666666
"aws-cdk-lib": "0.0.0",
667667
"constructs": "^10.0.0",

packages/@aws-cdk/mixins-preview/scripts/spec2logs/builder.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { Resource, Service, SpecDatabase } from '@aws-cdk/service-spec-types';
22
import { naming, util } from '@aws-cdk/spec2cdk';
3-
import { CDK_CORE, CONSTRUCTS } from '@aws-cdk/spec2cdk/lib/cdk/cdk';
3+
import { CDK_CORE, CDK_INTERFACES, CONSTRUCTS } from '@aws-cdk/spec2cdk/lib/cdk/cdk';
44
import type { Method } from '@cdklabs/typewriter';
55
import { Module, ExternalModule, ClassType, Stability, Type, expr, stmt, ThingSymbol, $this, CallableProxy, NewExpression, $E } from '@cdklabs/typewriter';
6-
import { CDK_AWS_LOGS, MIXINS_LOGS_DELIVERY, REF_INTERFACES } from './helpers';
7-
import type { ServiceSubmoduleProps, SelectiveImport, LocatedModule } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
6+
import { CDK_AWS_LOGS, MIXINS_LOGS_DELIVERY } from './helpers';
7+
import type { ServiceSubmoduleProps, LocatedModule } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
88
import { BaseServiceSubmodule, relativeImportPath } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
99
import type { AddServiceProps, LibraryBuilderProps } from '@aws-cdk/spec2cdk/lib/cdk/library-builder';
1010
import { LibraryBuilder } from '@aws-cdk/spec2cdk/lib/cdk/library-builder';
@@ -48,8 +48,6 @@ export class LogsDeliveryBuilder extends LibraryBuilder<LogsDeliveryBuilderServi
4848
submodule.registerResource(`${resource.cloudFormationType}VendedLogs`, vendedLogsMixin.mixin);
4949

5050
vendedLogsMixin.build();
51-
52-
submodule.registerSelectiveImports(...vendedLogsMixin.imports);
5351
}
5452
}
5553

@@ -72,7 +70,7 @@ export class LogsDeliveryBuilder extends LibraryBuilder<LogsDeliveryBuilderServi
7270
submodule.registerModule({ module, filePath });
7371

7472
CDK_CORE.import(module, 'cdk');
75-
REF_INTERFACES.import(module, 'interfaces');
73+
CDK_INTERFACES.import(module, 'interfaces');
7674
CONSTRUCTS.import(module, 'constructs');
7775
CDK_AWS_LOGS.import(module, 'logs');
7876
MIXINS_CORE.import(module, 'core', { fromLocation: relativeImportPath(filePath, '../core') });
@@ -85,7 +83,6 @@ export class LogsDeliveryBuilder extends LibraryBuilder<LogsDeliveryBuilderServi
8583

8684
class LogsDelivery {
8785
public scope: Module;
88-
public readonly imports = new Array<SelectiveImport>();
8986
public readonly mixin: LogsMixin;
9087
private readonly helpers: LogsHelper[] = [];
9188

@@ -157,7 +154,7 @@ class LogsHelper extends ClassType {
157154

158155
const paramS3 = toS3.addParameter({
159156
name: 'bucket',
160-
type: REF_INTERFACES.IBucketRef,
157+
type: CDK_INTERFACES.IBucketRef,
161158
});
162159

163160
const permissions = this.resource.vendedLogs!.permissionsVersion === 'V2' ? MIXINS_LOGS_DELIVERY.S3LogsDeliveryPermissionsVersion.V2 : MIXINS_LOGS_DELIVERY.S3LogsDeliveryPermissionsVersion.V1;
@@ -179,7 +176,7 @@ class LogsHelper extends ClassType {
179176

180177
const paramCWL = toCWL.addParameter({
181178
name: 'logGroup',
182-
type: REF_INTERFACES.ILogGroupRef,
179+
type: CDK_INTERFACES.ILogGroupRef,
183180
});
184181

185182
toCWL.addBody(stmt.block(
@@ -199,7 +196,7 @@ class LogsHelper extends ClassType {
199196

200197
const paramFH = toFH.addParameter({
201198
name: 'deliveryStream',
202-
type: REF_INTERFACES.IDeliveryStreamRef,
199+
type: CDK_INTERFACES.IDeliveryStreamRef,
203200
});
204201

205202
toFH.addBody(stmt.block(
@@ -238,7 +235,6 @@ class LogsHelper extends ClassType {
238235
}
239236

240237
class LogsMixin extends ClassType {
241-
public readonly imports = new Array<SelectiveImport>();
242238
private readonly resourceType: Type;
243239

244240
constructor(

packages/@aws-cdk/mixins-preview/scripts/spec2logs/helpers.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,9 @@ class MixinsLogsDelivery extends ExternalModule {
99
public readonly S3LogsDeliveryPermissionsVersion = $T(Type.fromName(this, 'S3LogsDeliveryPermissionsVersion'));
1010
}
1111

12-
class CdkRefInterfaces extends ExternalModule {
13-
public readonly IBucketRef = Type.fromName(this, 'aws_s3.IBucketRef');
14-
public readonly ILogGroupRef = Type.fromName(this, 'aws_logs.ILogGroupRef');
15-
public readonly IDeliveryStreamRef = Type.fromName(this, 'aws_kinesisfirehose.IDeliveryStreamRef');
16-
}
17-
1812
class CdkAwsLogs extends ExternalModule {
1913
public readonly CfnDeliverySource = Type.fromName(this, 'CfnDeliverySource');
2014
}
2115

2216
export const MIXINS_LOGS_DELIVERY = new MixinsLogsDelivery('@aws-cdk/mixins-preview/services/aws-logs');
23-
export const REF_INTERFACES = new CdkRefInterfaces('aws-cdk-lib/interfaces');
2417
export const CDK_AWS_LOGS = new CdkAwsLogs('aws-cdk-lib/aws-logs');

packages/@aws-cdk/mixins-preview/scripts/spec2mixins/builder.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { ExternalModule, Module, ClassType, Stability, StructType, Type, expr, s
99
import { MIXINS_COMMON, MIXINS_CORE, MIXINS_UTILS } from './helpers';
1010
import type { AddServiceProps, LibraryBuilderProps } from '@aws-cdk/spec2cdk/lib/cdk/library-builder';
1111
import { LibraryBuilder } from '@aws-cdk/spec2cdk/lib/cdk/library-builder';
12-
import type { LocatedModule, SelectiveImport, ServiceSubmoduleProps } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
12+
import type { LocatedModule, ServiceSubmoduleProps } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
1313
import { BaseServiceSubmodule, relativeImportPath } from '@aws-cdk/spec2cdk/lib/cdk/service-submodule';
1414

1515
class MixinsServiceModule extends BaseServiceSubmodule {
@@ -47,8 +47,6 @@ export class MixinsBuilder extends LibraryBuilder<MixinsServiceModule> {
4747
submodule.registerResource(resource.cloudFormationType, l1PropsMixin);
4848

4949
l1PropsMixin.build();
50-
51-
submodule.registerSelectiveImports(...l1PropsMixin.imports);
5250
}
5351

5452
private createMixinsModule(submodule: MixinsServiceModule, service: Service): LocatedModule<Module> {
@@ -86,7 +84,6 @@ class L1PropsMixin extends ClassType {
8684
private readonly decider: ResourceDecider;
8785
private readonly relationshipDecider: RelationshipDecider;
8886
private readonly converter: TypeConverter;
89-
public readonly imports = new Array<SelectiveImport>();
9087

9188
constructor(
9289
scope: Module,
@@ -126,14 +123,17 @@ class L1PropsMixin extends ClassType {
126123
},
127124
});
128125

129-
this.relationshipDecider = new RelationshipDecider(this.resource, db, false);
126+
this.relationshipDecider = new RelationshipDecider(this.resource, db, {
127+
enableRelationships: false,
128+
enableNestedRelationships: false,
129+
refsImportLocation: 'aws-cdk-lib/interfaces',
130+
});
130131
this.converter = TypeConverter.forMixin({
131132
db: db,
132133
resource: this.resource,
133134
resourceClass: this,
134135
relationshipDecider: this.relationshipDecider,
135136
});
136-
this.imports = this.relationshipDecider.imports;
137137
this.decider = new ResourceDecider(this.resource, this.converter, this.relationshipDecider);
138138
}
139139

tools/@aws-cdk/spec2cdk/lib/cdk/aws-cdk-lib.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -175,16 +175,16 @@ export class AwsCdkLibBuilder extends LibraryBuilder<AwsCdkLibServiceSubmodule>
175175
const resourceClass = new ResourceClass(resourceModule, this.db, resource, {
176176
suffix: props?.nameSuffix,
177177
deprecated: props?.deprecated,
178-
interfacesModule: submodule.interfaces ? {
179-
module: submodule.interfaces?.module,
178+
importPaths: this.resolveImportPaths(submodule.resourcesMod.filePath),
179+
interfacesModule: {
180+
module: submodule.interfaces.module,
180181
importLocation: relativeImportPath(submodule.resourcesMod, submodule.interfaces),
181-
} : undefined,
182+
},
182183
});
183184

184185
resourceClass.build();
185186

186187
submodule.registerResource(resource.cloudFormationType, resourceClass);
187-
submodule.registerSelectiveImports(...resourceClass.imports);
188188
submodule.augmentations?.module.augmentResource(resource, resourceClass);
189189
}
190190

@@ -259,18 +259,8 @@ export class AwsCdkLibBuilder extends LibraryBuilder<AwsCdkLibServiceSubmodule>
259259
grantModule.build(Object.fromEntries(submodule.resources), props?.nameSuffix);
260260
}
261261

262-
// Apply selective imports only to resources module
263-
for (const selectiveImport of submodule.imports) {
264-
const sourceModule = new Module(selectiveImport.moduleName);
265-
sourceModule.importSelective(
266-
submodule.resourcesMod.module,
267-
selectiveImport.types.map((t) => `${t.originalType} as ${t.aliasedType}`),
268-
{ fromLocation: relativeImportPath(submodule.resourcesMod, sourceModule.name) },
269-
);
270-
}
271-
272262
// Add an import for the interfaces file to the entry point file (make sure not to do it twice)
273-
if (!submodule.interfaces?.module.isEmpty() && this.interfacesEntry && submodule.didCreateInterfaceModule) {
263+
if (!submodule.interfaces.module.isEmpty() && this.interfacesEntry && submodule.didCreateInterfaceModule) {
274264
const exportName = submoduleSymbolFromName(submodule.service.name);
275265
const importLocation = relativeImportPath(this.interfacesEntry, submodule.interfaces);
276266

@@ -284,7 +274,8 @@ export class AwsCdkLibBuilder extends LibraryBuilder<AwsCdkLibServiceSubmodule>
284274
if (!this.inCdkLib) {
285275
return {
286276
core: 'aws-cdk-lib/core',
287-
interfacesEnvironmentAware: 'aws-cdk-lib/interfaces',
277+
interfaces: 'aws-cdk-lib/interfaces',
278+
interfacesEnvironmentAware: 'aws-cdk-lib/interfaces/environment-aware',
288279
coreHelpers: 'aws-cdk-lib/core/lib/helpers-internal',
289280
coreErrors: 'aws-cdk-lib/core/lib/errors',
290281
cloudwatch: 'aws-cdk-lib/aws-cloudwatch',
@@ -294,6 +285,7 @@ export class AwsCdkLibBuilder extends LibraryBuilder<AwsCdkLibServiceSubmodule>
294285

295286
return {
296287
core: relativeImportPath(sourceModule, 'core/lib'),
288+
interfaces: relativeImportPath(sourceModule, 'interfaces'),
297289
interfacesEnvironmentAware: relativeImportPath(sourceModule, 'interfaces/environment-aware'),
298290
coreHelpers: relativeImportPath(sourceModule, 'core/lib/helpers-internal'),
299291
coreErrors: relativeImportPath(sourceModule, 'core/lib/errors'),
@@ -321,6 +313,11 @@ export interface ImportPaths {
321313
*/
322314
readonly core: string;
323315

316+
/**
317+
* The import name used import the `interfaces` module
318+
*/
319+
readonly interfaces: string;
320+
324321
/**
325322
* The import name used import a specific interface from the `interfaces` module
326323
*

tools/@aws-cdk/spec2cdk/lib/cdk/cdk.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ export class CdkCore extends ExternalModule {
8686

8787
export class Interfaces extends ExternalModule {
8888
public readonly IEnvironmentAware = Type.fromName(this, 'IEnvironmentAware');
89+
90+
public readonly IBucketRef = Type.fromName(this, 'aws_s3.IBucketRef');
91+
public readonly ILogGroupRef = Type.fromName(this, 'aws_logs.ILogGroupRef');
92+
public readonly IDeliveryStreamRef = Type.fromName(this, 'aws_kinesisfirehose.IDeliveryStreamRef');
8993
}
9094

9195
export class CdkInternalHelpers extends ExternalModule {
@@ -122,6 +126,7 @@ export class CdkCloudWatch extends ExternalModule {
122126
public readonly MetricOptions = Type.fromName(this, 'MetricOptions');
123127
}
124128

129+
export const CDK_INTERFACES = new Interfaces('aws-cdk-lib/interfaces');
125130
export const CDK_INTERFACES_ENVIRONMENT_AWARE = new Interfaces('aws-cdk-lib/interfaces/environment-aware');
126131
export const CDK_CORE = new CdkCore('aws-cdk-lib/core');
127132
export const CDK_CLOUDWATCH = new CdkCloudWatch('aws-cdk-lib/aws-cloudwatch');

tools/@aws-cdk/spec2cdk/lib/cdk/library-builder.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as path from 'path';
33
import { SpecDatabase, Resource, Service } from '@aws-cdk/service-spec-types';
44
import { Module } from '@cdklabs/typewriter';
55
import { IWriter, substituteFilePattern } from '../util';
6-
import { BaseServiceSubmodule, LocatedModule, relativeImportPath } from './service-submodule';
6+
import { BaseServiceSubmodule, LocatedModule } from './service-submodule';
77

88
export interface AddServiceProps {
99
/**
@@ -142,16 +142,8 @@ export abstract class LibraryBuilder<ServiceSubmodule extends BaseServiceSubmodu
142142
/**
143143
* Do whatever we need to do after a service has been rendered to a submodule
144144
*/
145-
protected postprocessSubmodule(submodule: ServiceSubmodule, _props?: AddServiceProps) {
146-
// Selective imports from constructor
147-
for (const selectiveImport of submodule.imports) {
148-
const sourceModule = new Module(selectiveImport.moduleName);
149-
for (const mod of submodule.locatedModules) {
150-
sourceModule.importSelective(mod.module, selectiveImport.types.map((t) => `${t.originalType} as ${t.aliasedType}`), {
151-
fromLocation: relativeImportPath(mod.filePath, sourceModule.name),
152-
});
153-
}
154-
}
145+
protected postprocessSubmodule(_submodule: ServiceSubmodule, _props?: AddServiceProps): void {
146+
// does nothing, this is a hook for implementations
155147
}
156148

157149
private obtainServiceSubmodule(service: Service, targetSubmodule?: string, grantsConfig?: string): ServiceSubmodule {

0 commit comments

Comments
 (0)