@aws/nx-plugin 0.0.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/README.md +63 -0
- package/generators.json +52 -0
- package/package.json +27 -0
- package/src/cloudscape-website/app/README.md +253 -0
- package/src/cloudscape-website/app/__snapshots__/generator.spec.ts.snap +539 -0
- package/src/cloudscape-website/app/files/app/src/config.ts.template +4 -0
- package/src/cloudscape-website/app/files/app/src/layouts/App/index.tsx.template +132 -0
- package/src/cloudscape-website/app/files/app/src/layouts/App/navitems.ts.template +8 -0
- package/src/cloudscape-website/app/files/app/src/layouts/Routes/index.tsx.template +18 -0
- package/src/cloudscape-website/app/files/app/src/main.tsx.template +22 -0
- package/src/cloudscape-website/app/files/app/src/pages/Home/index.tsx.template +25 -0
- package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/cloudfront-web-acl.ts.template +317 -0
- package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/index.ts.template +4 -0
- package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/static-website.ts.template +237 -0
- package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/webacl_event_handler/index.ts.template +301 -0
- package/src/cloudscape-website/app/files/e2e/cypress/src/e2e/app.cy.ts.template +13 -0
- package/src/cloudscape-website/app/files/e2e/cypress/src/support/app.po.ts.template +1 -0
- package/src/cloudscape-website/app/files/e2e/playwright/src/example.spec.ts.template +6 -0
- package/src/cloudscape-website/app/generator.d.ts +4 -0
- package/src/cloudscape-website/app/generator.js +177 -0
- package/src/cloudscape-website/app/generator.js.map +1 -0
- package/src/cloudscape-website/app/schema.d.js +6 -0
- package/src/cloudscape-website/app/schema.d.js.map +1 -0
- package/src/cloudscape-website/app/schema.d.ts +35 -0
- package/src/cloudscape-website/app/schema.json +189 -0
- package/src/cloudscape-website/cognito-auth/README.md +172 -0
- package/src/cloudscape-website/cognito-auth/__snapshots__/generator.spec.ts.snap +238 -0
- package/src/cloudscape-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +50 -0
- package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/index.ts.template +4 -0
- package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/user-identity.ts.template +69 -0
- package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/userpool-with-mfa.ts.template +70 -0
- package/src/cloudscape-website/cognito-auth/generator.d.ts +4 -0
- package/src/cloudscape-website/cognito-auth/generator.js +100 -0
- package/src/cloudscape-website/cognito-auth/generator.js.map +1 -0
- package/src/cloudscape-website/cognito-auth/schema.d.js +6 -0
- package/src/cloudscape-website/cognito-auth/schema.d.js.map +1 -0
- package/src/cloudscape-website/cognito-auth/schema.d.ts +4 -0
- package/src/cloudscape-website/cognito-auth/schema.json +36 -0
- package/src/cloudscape-website/runtime-config/__snapshots__/generator.spec.ts.snap +112 -0
- package/src/cloudscape-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +46 -0
- package/src/cloudscape-website/runtime-config/generator.d.ts +4 -0
- package/src/cloudscape-website/runtime-config/generator.js +74 -0
- package/src/cloudscape-website/runtime-config/generator.js.map +1 -0
- package/src/cloudscape-website/runtime-config/schema.d.js +6 -0
- package/src/cloudscape-website/runtime-config/schema.d.js.map +1 -0
- package/src/cloudscape-website/runtime-config/schema.d.ts +3 -0
- package/src/cloudscape-website/runtime-config/schema.json +19 -0
- package/src/gitlab/files/.gitlab-ci.yml.template +26 -0
- package/src/gitlab/generator.d.ts +4 -0
- package/src/gitlab/generator.js +26 -0
- package/src/gitlab/generator.js.map +1 -0
- package/src/gitlab/schema.d.js +6 -0
- package/src/gitlab/schema.d.js.map +1 -0
- package/src/gitlab/schema.d.ts +5 -0
- package/src/gitlab/schema.json +52 -0
- package/src/index.d.ts +0 -0
- package/src/index.js +3 -0
- package/src/index.js.map +1 -0
- package/src/infra/app/README.md +175 -0
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +864 -0
- package/src/infra/app/files/cdk.json +67 -0
- package/src/infra/app/files/src/main.ts.template +37 -0
- package/src/infra/app/files/src/stacks/application-stack.ts.template +10 -0
- package/src/infra/app/generator.d.ts +4 -0
- package/src/infra/app/generator.js +75 -0
- package/src/infra/app/generator.js.map +1 -0
- package/src/infra/app/schema.d.js +6 -0
- package/src/infra/app/schema.d.js.map +1 -0
- package/src/infra/app/schema.d.ts +6 -0
- package/src/infra/app/schema.json +35 -0
- package/src/trpc/backend/README.md +549 -0
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +110 -0
- package/src/trpc/backend/files/backend/src/index.ts.template +1 -0
- package/src/trpc/backend/files/backend/src/lambdas/index.ts.template +1 -0
- package/src/trpc/backend/files/backend/src/lambdas/middleware.ts.template +146 -0
- package/src/trpc/backend/files/backend/src/lambdas/router.ts.template +36 -0
- package/src/trpc/backend/files/common/constructs/src/__apiNameKebabCase__/index.ts.template +64 -0
- package/src/trpc/backend/files/schema/src/index.ts.template +7 -0
- package/src/trpc/backend/generator.d.ts +4 -0
- package/src/trpc/backend/generator.js +128 -0
- package/src/trpc/backend/generator.js.map +1 -0
- package/src/trpc/backend/schema.d.js +6 -0
- package/src/trpc/backend/schema.d.js.map +1 -0
- package/src/trpc/backend/schema.d.ts +8 -0
- package/src/trpc/backend/schema.json +44 -0
- package/src/trpc/react/README.md +320 -0
- package/src/trpc/react/__snapshots__/generator.spec.ts.snap +98 -0
- package/src/trpc/react/files/src/components/TRPCClientProvider/index.tsx.template +34 -0
- package/src/trpc/react/files/src/hooks/useTrpc.tsx.template +5 -0
- package/src/trpc/react/generator.d.ts +4 -0
- package/src/trpc/react/generator.js +81 -0
- package/src/trpc/react/generator.js.map +1 -0
- package/src/trpc/react/schema.d.js +6 -0
- package/src/trpc/react/schema.d.js.map +1 -0
- package/src/trpc/react/schema.d.ts +5 -0
- package/src/trpc/react/schema.json +32 -0
- package/src/ts/cjs-to-esm/generator.d.ts +8 -0
- package/src/ts/cjs-to-esm/generator.js +201 -0
- package/src/ts/cjs-to-esm/generator.js.map +1 -0
- package/src/ts/cjs-to-esm/schema.d.js +6 -0
- package/src/ts/cjs-to-esm/schema.d.js.map +1 -0
- package/src/ts/cjs-to-esm/schema.d.ts +5 -0
- package/src/ts/cjs-to-esm/schema.json +28 -0
- package/src/ts/lib/README.md +149 -0
- package/src/ts/lib/__snapshots__/generator.spec.ts.snap +260 -0
- package/src/ts/lib/eslint.d.ts +3 -0
- package/src/ts/lib/eslint.js +41 -0
- package/src/ts/lib/eslint.js.map +1 -0
- package/src/ts/lib/files/src/index.ts.template +3 -0
- package/src/ts/lib/generator.d.ts +21 -0
- package/src/ts/lib/generator.js +61 -0
- package/src/ts/lib/generator.js.map +1 -0
- package/src/ts/lib/schema.d.js +6 -0
- package/src/ts/lib/schema.d.js.map +1 -0
- package/src/ts/lib/schema.d.ts +13 -0
- package/src/ts/lib/schema.json +46 -0
- package/src/ts/lib/ts-project-utils.d.ts +6 -0
- package/src/ts/lib/ts-project-utils.js +107 -0
- package/src/ts/lib/ts-project-utils.js.map +1 -0
- package/src/ts/lib/types.d.ts +10 -0
- package/src/ts/lib/types.js +6 -0
- package/src/ts/lib/types.js.map +1 -0
- package/src/ts/lib/vitest.d.ts +3 -0
- package/src/ts/lib/vitest.js +67 -0
- package/src/ts/lib/vitest.js.map +1 -0
- package/src/utils/files/common/constructs/src/index.ts.template +1 -0
- package/src/utils/files/common/constructs/src/runtime-config/index.ts.template +1 -0
- package/src/utils/files/common/constructs/src/runtime-config/runtime-config.ts.template +33 -0
- package/src/utils/files/common/types/src/index.ts.template +1 -0
- package/src/utils/files/common/types/src/runtime-config.ts.template +13 -0
- package/src/utils/npm-scope.d.ts +7 -0
- package/src/utils/npm-scope.js +37 -0
- package/src/utils/npm-scope.js.map +1 -0
- package/src/utils/paths.d.ts +3 -0
- package/src/utils/paths.js +32 -0
- package/src/utils/paths.js.map +1 -0
- package/src/utils/shared-constructs.d.ts +7 -0
- package/src/utils/shared-constructs.js +72 -0
- package/src/utils/shared-constructs.js.map +1 -0
- package/src/utils/versions.d.ts +31 -0
- package/src/utils/versions.js +49 -0
- package/src/utils/versions.js.map +1 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Logger } from '@aws-lambda-powertools/logger';
|
|
2
|
+
import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
|
|
3
|
+
import { Tracer } from '@aws-lambda-powertools/tracer';
|
|
4
|
+
import { initTRPC, TRPCError } from '@trpc/server';
|
|
5
|
+
import { Context as APIGWContext } from 'aws-lambda';
|
|
6
|
+
import { Subsegment } from 'aws-xray-sdk-core';
|
|
7
|
+
|
|
8
|
+
export type IMiddlewareContext = ILoggerContext &
|
|
9
|
+
IMetricsContext &
|
|
10
|
+
ITracerContext;
|
|
11
|
+
|
|
12
|
+
interface ILoggerContext extends APIGWContext {
|
|
13
|
+
logger: Logger;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface IMetricsContext extends APIGWContext {
|
|
17
|
+
metrics: Metrics;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface ITracerContext extends APIGWContext {
|
|
21
|
+
tracer: Tracer;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const createLoggerPlugin = () => {
|
|
25
|
+
const t = initTRPC.context<ILoggerContext>().create();
|
|
26
|
+
return {
|
|
27
|
+
loggerPlugin: t.procedure.use(async (opts) => {
|
|
28
|
+
const logger = new Logger();
|
|
29
|
+
|
|
30
|
+
const response = await opts.next({
|
|
31
|
+
ctx: {
|
|
32
|
+
...opts.ctx,
|
|
33
|
+
logger,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
logger.error('Unexpected error occured', response.error.cause ?? '');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return response;
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const createMetricsPlugin = () => {
|
|
47
|
+
const t = initTRPC.context<IMetricsContext>().create();
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
metricsPlugin: t.procedure.use(async (opts) => {
|
|
51
|
+
const metrics = new Metrics();
|
|
52
|
+
metrics.captureColdStartMetric();
|
|
53
|
+
|
|
54
|
+
metrics.addMetric('requestCount', MetricUnit.Count, 1);
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const response = await opts.next({
|
|
58
|
+
ctx: {
|
|
59
|
+
...opts.ctx,
|
|
60
|
+
metrics,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
metrics.addMetric('errorCount', MetricUnit.Count, 1);
|
|
66
|
+
} else {
|
|
67
|
+
metrics.addMetric('successCount', MetricUnit.Count, 1);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return response;
|
|
71
|
+
} finally {
|
|
72
|
+
metrics.publishStoredMetrics();
|
|
73
|
+
}
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const createTracerPlugin = () => {
|
|
79
|
+
const t = initTRPC.context<ITracerContext>().create();
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
tracerPlugin: t.procedure.use(async (opts) => {
|
|
83
|
+
const tracer = new Tracer();
|
|
84
|
+
const segment = tracer.getSegment();
|
|
85
|
+
let handlerSegment: Subsegment | undefined;
|
|
86
|
+
|
|
87
|
+
if (segment) {
|
|
88
|
+
handlerSegment = segment.addNewSubsegment(`## ${opts.path}`);
|
|
89
|
+
tracer.setSegment(handlerSegment);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
tracer.annotateColdStart();
|
|
93
|
+
tracer.addServiceNameAnnotation();
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
const response = await opts.next({
|
|
97
|
+
ctx: {
|
|
98
|
+
...opts.ctx,
|
|
99
|
+
tracer,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
if (!response.ok && response.error.cause instanceof Error) {
|
|
104
|
+
tracer.addErrorAsMetadata(response.error.cause);
|
|
105
|
+
}
|
|
106
|
+
return response;
|
|
107
|
+
} finally {
|
|
108
|
+
if (segment && handlerSegment) {
|
|
109
|
+
handlerSegment.close();
|
|
110
|
+
tracer.setSegment(segment);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const createErrorPlugin = () => {
|
|
118
|
+
const t = initTRPC.context().create();
|
|
119
|
+
return {
|
|
120
|
+
errorPlugin: t.procedure.use(async (opts) => {
|
|
121
|
+
const response = await opts.next({
|
|
122
|
+
ctx: {
|
|
123
|
+
...opts.ctx,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
let trpcError: TRPCError;
|
|
129
|
+
|
|
130
|
+
if (response.error.cause instanceof TRPCError) {
|
|
131
|
+
trpcError = response.error.cause;
|
|
132
|
+
} else {
|
|
133
|
+
trpcError = new TRPCError({
|
|
134
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
135
|
+
message: 'An unexpected error occurred, please try again later.',
|
|
136
|
+
cause: response.error.cause,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
throw trpcError;
|
|
141
|
+
} else {
|
|
142
|
+
return response;
|
|
143
|
+
}
|
|
144
|
+
}),
|
|
145
|
+
};
|
|
146
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { initTRPC } from '@trpc/server';
|
|
2
|
+
import {
|
|
3
|
+
awsLambdaRequestHandler,
|
|
4
|
+
} from '@trpc/server/adapters/aws-lambda';
|
|
5
|
+
import { EchoSchema } from '<%= schemaProjectAlias %>';
|
|
6
|
+
import {
|
|
7
|
+
createErrorPlugin,
|
|
8
|
+
createLoggerPlugin,
|
|
9
|
+
createMetricsPlugin,
|
|
10
|
+
createTracerPlugin,
|
|
11
|
+
IMiddlewareContext,
|
|
12
|
+
} from './middleware.js';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
|
|
15
|
+
export type Context = IMiddlewareContext;
|
|
16
|
+
|
|
17
|
+
const t = initTRPC.context<Context>().create();
|
|
18
|
+
export const router = t.router;
|
|
19
|
+
export const publicProcedure = t.procedure
|
|
20
|
+
.unstable_concat(createLoggerPlugin().loggerPlugin)
|
|
21
|
+
.unstable_concat(createTracerPlugin().tracerPlugin)
|
|
22
|
+
.unstable_concat(createMetricsPlugin().metricsPlugin)
|
|
23
|
+
.unstable_concat(createErrorPlugin().errorPlugin);;
|
|
24
|
+
|
|
25
|
+
const appRouter = router({
|
|
26
|
+
echo: publicProcedure
|
|
27
|
+
.input(z.string())
|
|
28
|
+
.output(EchoSchema)
|
|
29
|
+
.query((opts) => ({ result: opts.input })),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const handler = awsLambdaRequestHandler({
|
|
33
|
+
router: appRouter
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export type AppRouter = typeof appRouter;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { Runtime, RuntimeFamily } from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import { CfnOutput, Duration } from 'aws-cdk-lib';
|
|
4
|
+
import * as url from 'url';
|
|
5
|
+
import { CorsHttpMethod, HttpApi, HttpMethod, IHttpRouteAuthorizer } from 'aws-cdk-lib/aws-apigatewayv2';
|
|
6
|
+
import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
|
|
7
|
+
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
8
|
+
import { Effect, IRole, PolicyStatement } from 'aws-cdk-lib/aws-iam';
|
|
9
|
+
import { RuntimeConfig } from '../runtime-config/index.js';
|
|
10
|
+
|
|
11
|
+
export interface <%= apiNameClassName %>Props {
|
|
12
|
+
readonly defaultAuthorizer: IHttpRouteAuthorizer;
|
|
13
|
+
readonly allowedOrigins?: string[];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
export class <%= apiNameClassName %> extends Construct {
|
|
18
|
+
public readonly api: HttpApi;
|
|
19
|
+
|
|
20
|
+
constructor(scope: Construct, id: string, props: <%= apiNameClassName %>Props) {
|
|
21
|
+
super(scope, id);
|
|
22
|
+
|
|
23
|
+
const routerFunction = new NodejsFunction(this, '<%= apiNameClassName %>Handler', {
|
|
24
|
+
timeout: Duration.seconds(30),
|
|
25
|
+
runtime: new Runtime('nodejs20.x', RuntimeFamily.NODEJS),
|
|
26
|
+
handler: 'handler',
|
|
27
|
+
entry: url.fileURLToPath(new URL('../../<%= relativePathToProjectRoot %>/backend/src/lambdas/router.ts', import.meta.url)),
|
|
28
|
+
environment: {
|
|
29
|
+
'AWS_CONNECTION_REUSE_ENABLED': '1'
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
this.api = new HttpApi(this, '<%= apiNameClassName %>', {
|
|
34
|
+
corsPreflight: {
|
|
35
|
+
allowOrigins: props.allowedOrigins ?? ['*'],
|
|
36
|
+
allowMethods: [CorsHttpMethod.ANY],
|
|
37
|
+
allowHeaders: ['authorization', 'content-type', 'x-amz-content-sha256', 'x-amz-date', 'x-amz-security-token'],
|
|
38
|
+
},
|
|
39
|
+
defaultAuthorizer: props.defaultAuthorizer,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
this.api.addRoutes({
|
|
43
|
+
path: '/{proxy+}',
|
|
44
|
+
methods: [HttpMethod.GET, HttpMethod.DELETE, HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH, HttpMethod.HEAD],
|
|
45
|
+
integration: new HttpLambdaIntegration('RouterIntegration', routerFunction),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
new CfnOutput(this, '<%= apiNameClassName %>Url', { value: this.api.url! });
|
|
49
|
+
|
|
50
|
+
RuntimeConfig.ensure(this).config.trpcApis = {
|
|
51
|
+
'<%= apiName %>': this.api.url!
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public grantInvokeAccess(role: IRole) {
|
|
56
|
+
role.addToPrincipalPolicy(
|
|
57
|
+
new PolicyStatement({
|
|
58
|
+
effect: Effect.ALLOW,
|
|
59
|
+
actions: ['execute-api:Invoke'],
|
|
60
|
+
resources: [this.api.arnForExecuteApi('*', '/*', '*')],
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
default: function() {
|
|
13
|
+
return _default;
|
|
14
|
+
},
|
|
15
|
+
trpcBackendGenerator: function() {
|
|
16
|
+
return trpcBackendGenerator;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const _extends = require("@swc/helpers/_/_extends");
|
|
20
|
+
const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
|
|
21
|
+
const _devkit = require("@nx/devkit");
|
|
22
|
+
const _lodashkebabcase = /*#__PURE__*/ _interop_require_default._(require("lodash.kebabcase"));
|
|
23
|
+
const _sharedconstructs = require("../../utils/shared-constructs");
|
|
24
|
+
const _typescript = require("typescript");
|
|
25
|
+
const _tsquery = require("@phenomnomnominal/tsquery");
|
|
26
|
+
const _generator = /*#__PURE__*/ _interop_require_default._(require("../../ts/lib/generator"));
|
|
27
|
+
const _npmscope = require("../../utils/npm-scope");
|
|
28
|
+
const _versions = require("../../utils/versions");
|
|
29
|
+
const _paths = require("../../utils/paths");
|
|
30
|
+
const toClassName = (str)=>{
|
|
31
|
+
const words = str.replace(/[^a-zA-Z0-9]/g, ' ').split(/\s+/);
|
|
32
|
+
return words.map((word, index)=>{
|
|
33
|
+
if (index === 0 && /^\d/.test(word)) {
|
|
34
|
+
return '_' + word;
|
|
35
|
+
}
|
|
36
|
+
return word.charAt(0).toUpperCase() + word.slice(1);
|
|
37
|
+
}).join('');
|
|
38
|
+
};
|
|
39
|
+
async function trpcBackendGenerator(tree, options) {
|
|
40
|
+
await (0, _sharedconstructs.sharedConstructsGenerator)(tree);
|
|
41
|
+
const apiNameKebabCase = (0, _lodashkebabcase.default)(options.apiName);
|
|
42
|
+
const apiNameClassName = toClassName(options.apiName);
|
|
43
|
+
var _options_directory;
|
|
44
|
+
const projectRoot = (0, _devkit.joinPathFragments)((_options_directory = options.directory) != null ? _options_directory : '.', apiNameKebabCase);
|
|
45
|
+
const relativePathToProjectRoot = `${(0, _devkit.joinPathFragments)((0, _paths.getRelativePathToRoot)(tree, `${(0, _npmscope.getNpmScopePrefix)(tree)}common-constructs`), projectRoot)}`;
|
|
46
|
+
const schemaRoot = (0, _devkit.joinPathFragments)(projectRoot, 'schema');
|
|
47
|
+
const backendRoot = (0, _devkit.joinPathFragments)(projectRoot, 'backend');
|
|
48
|
+
const backendName = `${apiNameKebabCase}-backend`;
|
|
49
|
+
const schemaName = `${apiNameKebabCase}-schema`;
|
|
50
|
+
const backendProjectName = `${options.apiNamespace}/${backendName}`;
|
|
51
|
+
const schemaProjectName = `${options.apiNamespace}/${schemaName}`;
|
|
52
|
+
const enhancedOptions = _extends._({
|
|
53
|
+
backendProjectName,
|
|
54
|
+
backendProjectAlias: (0, _npmscope.toScopeAlias)(backendProjectName),
|
|
55
|
+
schemaProjectName,
|
|
56
|
+
schemaProjectAlias: (0, _npmscope.toScopeAlias)(schemaProjectName),
|
|
57
|
+
apiNameKebabCase,
|
|
58
|
+
apiNameClassName,
|
|
59
|
+
relativePathToProjectRoot
|
|
60
|
+
}, options);
|
|
61
|
+
await (0, _generator.default)(tree, {
|
|
62
|
+
scope: options.apiNamespace,
|
|
63
|
+
name: backendName,
|
|
64
|
+
directory: projectRoot,
|
|
65
|
+
subDirectory: 'backend',
|
|
66
|
+
unitTestRunner: options.unitTestRunner
|
|
67
|
+
});
|
|
68
|
+
await (0, _generator.default)(tree, {
|
|
69
|
+
scope: options.apiNamespace,
|
|
70
|
+
name: schemaName,
|
|
71
|
+
directory: projectRoot,
|
|
72
|
+
subDirectory: 'schema',
|
|
73
|
+
unitTestRunner: options.unitTestRunner
|
|
74
|
+
});
|
|
75
|
+
const constructsPath = (0, _devkit.joinPathFragments)(_sharedconstructs.PACKAGES_DIR, _sharedconstructs.SHARED_CONSTRUCTS_DIR, 'src', apiNameKebabCase, 'index.ts');
|
|
76
|
+
if (!tree.exists(constructsPath)) {
|
|
77
|
+
(0, _devkit.generateFiles)(tree, (0, _devkit.joinPathFragments)(__dirname, 'files', _sharedconstructs.SHARED_CONSTRUCTS_DIR), (0, _devkit.joinPathFragments)(_sharedconstructs.PACKAGES_DIR, _sharedconstructs.SHARED_CONSTRUCTS_DIR), enhancedOptions);
|
|
78
|
+
(0, _devkit.addDependenciesToPackageJson)(tree, (0, _versions.withVersions)([
|
|
79
|
+
'constructs',
|
|
80
|
+
'aws-cdk-lib'
|
|
81
|
+
]), {});
|
|
82
|
+
const sharedConstructsIndexTsPath = (0, _devkit.joinPathFragments)(_sharedconstructs.PACKAGES_DIR, _sharedconstructs.SHARED_CONSTRUCTS_DIR, 'src', 'index.ts');
|
|
83
|
+
const sharedConstructsIndexContents = tree.read(sharedConstructsIndexTsPath).toString();
|
|
84
|
+
const apiExportDeclaration = _typescript.factory.createExportDeclaration(undefined, undefined, undefined, _typescript.factory.createStringLiteral(`./${apiNameKebabCase}/index.js`));
|
|
85
|
+
const updatedIndex = _tsquery.tsquery.map((0, _tsquery.ast)(sharedConstructsIndexContents), 'SourceFile', (node)=>{
|
|
86
|
+
return _extends._({}, node, {
|
|
87
|
+
statements: [
|
|
88
|
+
apiExportDeclaration,
|
|
89
|
+
...node.statements
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
}).getFullText();
|
|
93
|
+
if (sharedConstructsIndexContents !== updatedIndex) {
|
|
94
|
+
tree.write(sharedConstructsIndexTsPath, updatedIndex);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
(0, _devkit.updateJson)(tree, (0, _devkit.joinPathFragments)(backendRoot, 'project.json'), (config)=>{
|
|
98
|
+
config.metadata = {
|
|
99
|
+
apiName: options.apiName
|
|
100
|
+
};
|
|
101
|
+
return config;
|
|
102
|
+
});
|
|
103
|
+
(0, _devkit.generateFiles)(tree, (0, _devkit.joinPathFragments)(__dirname, 'files', 'backend'), backendRoot, enhancedOptions);
|
|
104
|
+
(0, _devkit.generateFiles)(tree, (0, _devkit.joinPathFragments)(__dirname, 'files', 'schema'), schemaRoot, enhancedOptions);
|
|
105
|
+
tree.delete((0, _devkit.joinPathFragments)(backendRoot, 'src', 'lib'));
|
|
106
|
+
tree.delete((0, _devkit.joinPathFragments)(schemaRoot, 'src', 'lib'));
|
|
107
|
+
(0, _devkit.addDependenciesToPackageJson)(tree, (0, _versions.withVersions)([
|
|
108
|
+
'zod',
|
|
109
|
+
'@trpc/server',
|
|
110
|
+
'aws-xray-sdk-core',
|
|
111
|
+
'aws-cdk-lib',
|
|
112
|
+
'constructs',
|
|
113
|
+
'@aws-lambda-powertools/logger',
|
|
114
|
+
'@aws-lambda-powertools/metrics',
|
|
115
|
+
'@aws-lambda-powertools/tracer'
|
|
116
|
+
]), (0, _versions.withVersions)([
|
|
117
|
+
'@types/aws-lambda'
|
|
118
|
+
]));
|
|
119
|
+
tree.delete((0, _devkit.joinPathFragments)(backendRoot, 'package.json'));
|
|
120
|
+
tree.delete((0, _devkit.joinPathFragments)(schemaRoot, 'package.json'));
|
|
121
|
+
await (0, _devkit.formatFiles)(tree);
|
|
122
|
+
return ()=>{
|
|
123
|
+
(0, _devkit.installPackagesTask)(tree);
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const _default = trpcBackendGenerator;
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/trpc/backend/generator.ts"],"sourcesContent":["import {\n addDependenciesToPackageJson,\n formatFiles,\n generateFiles,\n installPackagesTask,\n joinPathFragments,\n ProjectConfiguration,\n Tree,\n updateJson,\n} from '@nx/devkit';\nimport { TrpcBackendGeneratorSchema } from './schema';\nimport kebabCase from 'lodash.kebabcase';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs';\nimport { factory, SourceFile } from 'typescript';\nimport { ast, tsquery } from '@phenomnomnominal/tsquery';\nimport tsLibGenerator from '../../ts/lib/generator';\nimport { getNpmScopePrefix, toScopeAlias } from '../../utils/npm-scope';\nimport { withVersions } from '../../utils/versions';\nimport { getRelativePathToRoot } from '../../utils/paths';\n\nconst toClassName = (str: string): string => {\n const words = str.replace(/[^a-zA-Z0-9]/g, ' ').split(/\\s+/);\n\n return words\n .map((word, index) => {\n if (index === 0 && /^\\d/.test(word)) {\n return '_' + word;\n }\n return word.charAt(0).toUpperCase() + word.slice(1);\n })\n .join('');\n};\n\nexport async function trpcBackendGenerator(\n tree: Tree,\n options: TrpcBackendGeneratorSchema\n) {\n await sharedConstructsGenerator(tree);\n\n const apiNameKebabCase = kebabCase(options.apiName);\n const apiNameClassName = toClassName(options.apiName);\n const projectRoot = joinPathFragments(options.directory ?? '.', apiNameKebabCase);\n const relativePathToProjectRoot = `${joinPathFragments(getRelativePathToRoot(tree, `${getNpmScopePrefix(tree)}common-constructs`), projectRoot)}`;\n const schemaRoot = joinPathFragments(projectRoot, 'schema');\n const backendRoot = joinPathFragments(projectRoot, 'backend');\n\n const backendName = `${apiNameKebabCase}-backend`;\n const schemaName = `${apiNameKebabCase}-schema`;\n\n const backendProjectName = `${options.apiNamespace}/${backendName}`;\n const schemaProjectName = `${options.apiNamespace}/${schemaName}`;\n const enhancedOptions = {\n backendProjectName,\n backendProjectAlias: toScopeAlias(backendProjectName),\n schemaProjectName,\n schemaProjectAlias: toScopeAlias(schemaProjectName),\n apiNameKebabCase,\n apiNameClassName,\n relativePathToProjectRoot,\n ...options,\n };\n\n await tsLibGenerator(tree, {\n scope: options.apiNamespace,\n name: backendName,\n directory: projectRoot,\n subDirectory: 'backend',\n unitTestRunner: options.unitTestRunner,\n });\n\n await tsLibGenerator(tree, {\n scope: options.apiNamespace,\n name: schemaName,\n directory: projectRoot,\n subDirectory: 'schema',\n unitTestRunner: options.unitTestRunner,\n });\n\n const constructsPath = joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src', apiNameKebabCase, 'index.ts');\n \n if (!tree.exists(constructsPath)) {\n generateFiles(\n tree,\n joinPathFragments(__dirname, 'files', SHARED_CONSTRUCTS_DIR),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n enhancedOptions\n );\n\n addDependenciesToPackageJson(\n tree,\n withVersions(['constructs', 'aws-cdk-lib']),\n {}\n );\n\n const sharedConstructsIndexTsPath = joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'index.ts'\n );\n const sharedConstructsIndexContents = tree\n .read(sharedConstructsIndexTsPath)\n .toString();\n\n const apiExportDeclaration = factory.createExportDeclaration(\n undefined,\n undefined,\n undefined,\n factory.createStringLiteral(`./${apiNameKebabCase}/index.js`)\n );\n const updatedIndex = tsquery\n .map(\n ast(sharedConstructsIndexContents),\n 'SourceFile',\n (node: SourceFile) => {\n return {\n ...node,\n statements: [apiExportDeclaration, ...node.statements],\n };\n }\n )\n .getFullText();\n\n if (sharedConstructsIndexContents !== updatedIndex) {\n tree.write(sharedConstructsIndexTsPath, updatedIndex);\n }\n }\n\n updateJson(\n tree,\n joinPathFragments(backendRoot, 'project.json'),\n (config: ProjectConfiguration) => {\n config.metadata = {\n apiName: options.apiName,\n } as unknown;\n\n return config;\n }\n );\n\n generateFiles(\n tree,\n joinPathFragments(__dirname, 'files', 'backend'),\n backendRoot,\n enhancedOptions\n );\n generateFiles(\n tree,\n joinPathFragments(__dirname, 'files', 'schema'),\n schemaRoot,\n enhancedOptions\n );\n\n tree.delete(joinPathFragments(backendRoot, 'src', 'lib'));\n tree.delete(joinPathFragments(schemaRoot, 'src', 'lib'));\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n 'zod',\n '@trpc/server',\n 'aws-xray-sdk-core',\n 'aws-cdk-lib',\n 'constructs',\n '@aws-lambda-powertools/logger',\n '@aws-lambda-powertools/metrics',\n '@aws-lambda-powertools/tracer',\n ]),\n withVersions(['@types/aws-lambda'])\n );\n\n tree.delete(joinPathFragments(backendRoot, 'package.json'));\n tree.delete(joinPathFragments(schemaRoot, 'package.json'));\n\n await formatFiles(tree);\n\n return () => {\n installPackagesTask(tree);\n };\n}\n\nexport default trpcBackendGenerator;\n"],"names":["trpcBackendGenerator","toClassName","str","words","replace","split","map","word","index","test","charAt","toUpperCase","slice","join","tree","options","sharedConstructsGenerator","apiNameKebabCase","kebabCase","apiName","apiNameClassName","projectRoot","joinPathFragments","directory","relativePathToProjectRoot","getRelativePathToRoot","getNpmScopePrefix","schemaRoot","backendRoot","backendName","schemaName","backendProjectName","apiNamespace","schemaProjectName","enhancedOptions","backendProjectAlias","toScopeAlias","schemaProjectAlias","tsLibGenerator","scope","name","subDirectory","unitTestRunner","constructsPath","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","exists","generateFiles","__dirname","addDependenciesToPackageJson","withVersions","sharedConstructsIndexTsPath","sharedConstructsIndexContents","read","toString","apiExportDeclaration","factory","createExportDeclaration","undefined","createStringLiteral","updatedIndex","tsquery","ast","node","statements","getFullText","write","updateJson","config","metadata","delete","formatFiles","installPackagesTask"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/trpc/backend/schema.d.ts"],"names":[],"rangeMappings":"","mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/schema",
|
|
3
|
+
"$id": "TrpcBackend",
|
|
4
|
+
"title": "",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"apiName": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "",
|
|
10
|
+
"$default": {
|
|
11
|
+
"$source": "argv",
|
|
12
|
+
"index": 0
|
|
13
|
+
},
|
|
14
|
+
"x-prompt": "What name would your API to be? i.e: MyApi"
|
|
15
|
+
},
|
|
16
|
+
"apiNamespace": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "",
|
|
19
|
+
"$default": {
|
|
20
|
+
"$source": "argv",
|
|
21
|
+
"index": 0
|
|
22
|
+
},
|
|
23
|
+
"pattern": "^@[a-z0-9-]+(?:/[a-z0-9-]+)?$",
|
|
24
|
+
"x-prompt": "What namespace would you like your API to have? i.e: @myapi"
|
|
25
|
+
},
|
|
26
|
+
"directory": {
|
|
27
|
+
"description": "The directory of the new application.",
|
|
28
|
+
"type": "string",
|
|
29
|
+
"alias": "dir",
|
|
30
|
+
"x-priority": "important",
|
|
31
|
+
"default": "packages",
|
|
32
|
+
"x-prompt": "What directory would you like to store your application in?"
|
|
33
|
+
},
|
|
34
|
+
"unitTestRunner": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"enum": ["jest", "vitest", "none"],
|
|
37
|
+
"description": "Test runner to use for unit tests.",
|
|
38
|
+
"x-prompt": "Which unit test runner would you like to use?",
|
|
39
|
+
"default": "vitest",
|
|
40
|
+
"x-priority": "important"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"required": ["apiName", "apiNamespace"]
|
|
44
|
+
}
|