@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.
Files changed (142) hide show
  1. package/README.md +63 -0
  2. package/generators.json +52 -0
  3. package/package.json +27 -0
  4. package/src/cloudscape-website/app/README.md +253 -0
  5. package/src/cloudscape-website/app/__snapshots__/generator.spec.ts.snap +539 -0
  6. package/src/cloudscape-website/app/files/app/src/config.ts.template +4 -0
  7. package/src/cloudscape-website/app/files/app/src/layouts/App/index.tsx.template +132 -0
  8. package/src/cloudscape-website/app/files/app/src/layouts/App/navitems.ts.template +8 -0
  9. package/src/cloudscape-website/app/files/app/src/layouts/Routes/index.tsx.template +18 -0
  10. package/src/cloudscape-website/app/files/app/src/main.tsx.template +22 -0
  11. package/src/cloudscape-website/app/files/app/src/pages/Home/index.tsx.template +25 -0
  12. package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/cloudfront-web-acl.ts.template +317 -0
  13. package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/index.ts.template +4 -0
  14. package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/static-website.ts.template +237 -0
  15. package/src/cloudscape-website/app/files/common/constructs/src/__websiteNameKebabCase__/webacl_event_handler/index.ts.template +301 -0
  16. package/src/cloudscape-website/app/files/e2e/cypress/src/e2e/app.cy.ts.template +13 -0
  17. package/src/cloudscape-website/app/files/e2e/cypress/src/support/app.po.ts.template +1 -0
  18. package/src/cloudscape-website/app/files/e2e/playwright/src/example.spec.ts.template +6 -0
  19. package/src/cloudscape-website/app/generator.d.ts +4 -0
  20. package/src/cloudscape-website/app/generator.js +177 -0
  21. package/src/cloudscape-website/app/generator.js.map +1 -0
  22. package/src/cloudscape-website/app/schema.d.js +6 -0
  23. package/src/cloudscape-website/app/schema.d.js.map +1 -0
  24. package/src/cloudscape-website/app/schema.d.ts +35 -0
  25. package/src/cloudscape-website/app/schema.json +189 -0
  26. package/src/cloudscape-website/cognito-auth/README.md +172 -0
  27. package/src/cloudscape-website/cognito-auth/__snapshots__/generator.spec.ts.snap +238 -0
  28. package/src/cloudscape-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +50 -0
  29. package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/index.ts.template +4 -0
  30. package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/user-identity.ts.template +69 -0
  31. package/src/cloudscape-website/cognito-auth/files/common/constructs/src/identity/userpool-with-mfa.ts.template +70 -0
  32. package/src/cloudscape-website/cognito-auth/generator.d.ts +4 -0
  33. package/src/cloudscape-website/cognito-auth/generator.js +100 -0
  34. package/src/cloudscape-website/cognito-auth/generator.js.map +1 -0
  35. package/src/cloudscape-website/cognito-auth/schema.d.js +6 -0
  36. package/src/cloudscape-website/cognito-auth/schema.d.js.map +1 -0
  37. package/src/cloudscape-website/cognito-auth/schema.d.ts +4 -0
  38. package/src/cloudscape-website/cognito-auth/schema.json +36 -0
  39. package/src/cloudscape-website/runtime-config/__snapshots__/generator.spec.ts.snap +112 -0
  40. package/src/cloudscape-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +46 -0
  41. package/src/cloudscape-website/runtime-config/generator.d.ts +4 -0
  42. package/src/cloudscape-website/runtime-config/generator.js +74 -0
  43. package/src/cloudscape-website/runtime-config/generator.js.map +1 -0
  44. package/src/cloudscape-website/runtime-config/schema.d.js +6 -0
  45. package/src/cloudscape-website/runtime-config/schema.d.js.map +1 -0
  46. package/src/cloudscape-website/runtime-config/schema.d.ts +3 -0
  47. package/src/cloudscape-website/runtime-config/schema.json +19 -0
  48. package/src/gitlab/files/.gitlab-ci.yml.template +26 -0
  49. package/src/gitlab/generator.d.ts +4 -0
  50. package/src/gitlab/generator.js +26 -0
  51. package/src/gitlab/generator.js.map +1 -0
  52. package/src/gitlab/schema.d.js +6 -0
  53. package/src/gitlab/schema.d.js.map +1 -0
  54. package/src/gitlab/schema.d.ts +5 -0
  55. package/src/gitlab/schema.json +52 -0
  56. package/src/index.d.ts +0 -0
  57. package/src/index.js +3 -0
  58. package/src/index.js.map +1 -0
  59. package/src/infra/app/README.md +175 -0
  60. package/src/infra/app/__snapshots__/generator.spec.ts.snap +864 -0
  61. package/src/infra/app/files/cdk.json +67 -0
  62. package/src/infra/app/files/src/main.ts.template +37 -0
  63. package/src/infra/app/files/src/stacks/application-stack.ts.template +10 -0
  64. package/src/infra/app/generator.d.ts +4 -0
  65. package/src/infra/app/generator.js +75 -0
  66. package/src/infra/app/generator.js.map +1 -0
  67. package/src/infra/app/schema.d.js +6 -0
  68. package/src/infra/app/schema.d.js.map +1 -0
  69. package/src/infra/app/schema.d.ts +6 -0
  70. package/src/infra/app/schema.json +35 -0
  71. package/src/trpc/backend/README.md +549 -0
  72. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +110 -0
  73. package/src/trpc/backend/files/backend/src/index.ts.template +1 -0
  74. package/src/trpc/backend/files/backend/src/lambdas/index.ts.template +1 -0
  75. package/src/trpc/backend/files/backend/src/lambdas/middleware.ts.template +146 -0
  76. package/src/trpc/backend/files/backend/src/lambdas/router.ts.template +36 -0
  77. package/src/trpc/backend/files/common/constructs/src/__apiNameKebabCase__/index.ts.template +64 -0
  78. package/src/trpc/backend/files/schema/src/index.ts.template +7 -0
  79. package/src/trpc/backend/generator.d.ts +4 -0
  80. package/src/trpc/backend/generator.js +128 -0
  81. package/src/trpc/backend/generator.js.map +1 -0
  82. package/src/trpc/backend/schema.d.js +6 -0
  83. package/src/trpc/backend/schema.d.js.map +1 -0
  84. package/src/trpc/backend/schema.d.ts +8 -0
  85. package/src/trpc/backend/schema.json +44 -0
  86. package/src/trpc/react/README.md +320 -0
  87. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +98 -0
  88. package/src/trpc/react/files/src/components/TRPCClientProvider/index.tsx.template +34 -0
  89. package/src/trpc/react/files/src/hooks/useTrpc.tsx.template +5 -0
  90. package/src/trpc/react/generator.d.ts +4 -0
  91. package/src/trpc/react/generator.js +81 -0
  92. package/src/trpc/react/generator.js.map +1 -0
  93. package/src/trpc/react/schema.d.js +6 -0
  94. package/src/trpc/react/schema.d.js.map +1 -0
  95. package/src/trpc/react/schema.d.ts +5 -0
  96. package/src/trpc/react/schema.json +32 -0
  97. package/src/ts/cjs-to-esm/generator.d.ts +8 -0
  98. package/src/ts/cjs-to-esm/generator.js +201 -0
  99. package/src/ts/cjs-to-esm/generator.js.map +1 -0
  100. package/src/ts/cjs-to-esm/schema.d.js +6 -0
  101. package/src/ts/cjs-to-esm/schema.d.js.map +1 -0
  102. package/src/ts/cjs-to-esm/schema.d.ts +5 -0
  103. package/src/ts/cjs-to-esm/schema.json +28 -0
  104. package/src/ts/lib/README.md +149 -0
  105. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +260 -0
  106. package/src/ts/lib/eslint.d.ts +3 -0
  107. package/src/ts/lib/eslint.js +41 -0
  108. package/src/ts/lib/eslint.js.map +1 -0
  109. package/src/ts/lib/files/src/index.ts.template +3 -0
  110. package/src/ts/lib/generator.d.ts +21 -0
  111. package/src/ts/lib/generator.js +61 -0
  112. package/src/ts/lib/generator.js.map +1 -0
  113. package/src/ts/lib/schema.d.js +6 -0
  114. package/src/ts/lib/schema.d.js.map +1 -0
  115. package/src/ts/lib/schema.d.ts +13 -0
  116. package/src/ts/lib/schema.json +46 -0
  117. package/src/ts/lib/ts-project-utils.d.ts +6 -0
  118. package/src/ts/lib/ts-project-utils.js +107 -0
  119. package/src/ts/lib/ts-project-utils.js.map +1 -0
  120. package/src/ts/lib/types.d.ts +10 -0
  121. package/src/ts/lib/types.js +6 -0
  122. package/src/ts/lib/types.js.map +1 -0
  123. package/src/ts/lib/vitest.d.ts +3 -0
  124. package/src/ts/lib/vitest.js +67 -0
  125. package/src/ts/lib/vitest.js.map +1 -0
  126. package/src/utils/files/common/constructs/src/index.ts.template +1 -0
  127. package/src/utils/files/common/constructs/src/runtime-config/index.ts.template +1 -0
  128. package/src/utils/files/common/constructs/src/runtime-config/runtime-config.ts.template +33 -0
  129. package/src/utils/files/common/types/src/index.ts.template +1 -0
  130. package/src/utils/files/common/types/src/runtime-config.ts.template +13 -0
  131. package/src/utils/npm-scope.d.ts +7 -0
  132. package/src/utils/npm-scope.js +37 -0
  133. package/src/utils/npm-scope.js.map +1 -0
  134. package/src/utils/paths.d.ts +3 -0
  135. package/src/utils/paths.js +32 -0
  136. package/src/utils/paths.js.map +1 -0
  137. package/src/utils/shared-constructs.d.ts +7 -0
  138. package/src/utils/shared-constructs.js +72 -0
  139. package/src/utils/shared-constructs.js.map +1 -0
  140. package/src/utils/versions.d.ts +31 -0
  141. package/src/utils/versions.js +49 -0
  142. 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,7 @@
1
+ import { z } from 'zod';
2
+
3
+ export const EchoSchema = z.object({
4
+ result: z.string(),
5
+ });
6
+
7
+ export type IEcho = z.TypeOf<typeof EchoSchema>;
@@ -0,0 +1,4 @@
1
+ import { Tree } from '@nx/devkit';
2
+ import { TrpcBackendGeneratorSchema } from './schema';
3
+ export declare function trpcBackendGenerator(tree: Tree, options: TrpcBackendGeneratorSchema): Promise<() => void>;
4
+ export default trpcBackendGenerator;
@@ -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,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+
6
+ //# sourceMappingURL=schema.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/trpc/backend/schema.d.ts"],"names":[],"rangeMappings":"","mappings":""}
@@ -0,0 +1,8 @@
1
+
2
+ export interface TrpcBackendGeneratorSchema {
3
+ apiName: string;
4
+ apiNamespace: string;
5
+ bundler: TsLibGeneratorSchema['bundler'];
6
+ directory?: TsLibGeneratorSchema['directory'];
7
+ unitTestRunner: TsLibGeneratorSchema['unitTestRunner'];
8
+ }
@@ -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
+ }