Skip to content

Commit 03eb079

Browse files
committed
feat(trpc): add serve target to run a local trpc server
Add a new target 'serve' which uses the standalone tRPC adapter to run a local server. re #49
1 parent a2b4298 commit 03eb079

File tree

7 files changed

+88
-19
lines changed

7 files changed

+88
-19
lines changed

packages/nx-plugin/src/trpc/backend/__snapshots__/generator.spec.ts.snap

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3-
exports[`trpc backend generator > should generate backend and schema projects 1`] = `
3+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/index.ts 1`] = `
44
"export type { AppRouter } from './router.js';
55
export type { Context } from './init.js';
66
"
77
`;
88

9-
exports[`trpc backend generator > should generate backend and schema projects 2`] = `
9+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/init.ts 1`] = `
1010
"import { initTRPC } from '@trpc/server';
1111
import {
1212
createErrorPlugin,
@@ -28,7 +28,28 @@ export const publicProcedure = t.procedure
2828
"
2929
`;
3030
31-
exports[`trpc backend generator > should generate backend and schema projects 3`] = `
31+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/local-server.ts 1`] = `
32+
"import { createHTTPServer } from '@trpc/server/adapters/standalone';
33+
import { appRouter } from './router.js';
34+
35+
const PORT = 2022;
36+
37+
createHTTPServer({
38+
router: appRouter,
39+
createContext() {
40+
return {
41+
event: {} as any,
42+
context: {} as any,
43+
info: {} as any,
44+
};
45+
},
46+
}).listen(PORT);
47+
48+
console.log(\`Local TRPC server listening on port \${PORT}\`);
49+
"
50+
`;
51+
52+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/middleware/error.ts 1`] = `
3253
"import { initTRPC, TRPCError } from '@trpc/server';
3354
3455
export const createErrorPlugin = () => {
@@ -58,7 +79,7 @@ export const createErrorPlugin = () => {
5879
"
5980
`;
6081
61-
exports[`trpc backend generator > should generate backend and schema projects 4`] = `
82+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/middleware/index.ts 1`] = `
6283
"import { CreateAWSLambdaContextOptions } from '@trpc/server/adapters/aws-lambda';
6384
import type { APIGatewayProxyEventV2WithIAMAuthorizer } from 'aws-lambda';
6485
import { ILoggerContext } from './logger.js';
@@ -78,7 +99,7 @@ export type IMiddlewareContext =
7899
"
79100
`;
80101
81-
exports[`trpc backend generator > should generate backend and schema projects 5`] = `
102+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/middleware/logger.ts 1`] = `
82103
"import { initTRPC } from '@trpc/server';
83104
import { Logger } from '@aws-lambda-powertools/logger';
84105
@@ -108,7 +129,7 @@ export const createLoggerPlugin = () => {
108129
"
109130
`;
110131
111-
exports[`trpc backend generator > should generate backend and schema projects 6`] = `
132+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/middleware/metrics.ts 1`] = `
112133
"import { initTRPC } from '@trpc/server';
113134
import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
114135
@@ -148,7 +169,7 @@ export const createMetricsPlugin = () => {
148169
"
149170
`;
150171
151-
exports[`trpc backend generator > should generate backend and schema projects 7`] = `
172+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/middleware/tracer.ts 1`] = `
152173
"import { initTRPC } from '@trpc/server';
153174
import { Tracer } from '@aws-lambda-powertools/tracer';
154175
import { Subsegment } from 'aws-xray-sdk-core';
@@ -196,7 +217,7 @@ export const createTracerPlugin = () => {
196217
"
197218
`;
198219
199-
exports[`trpc backend generator > should generate backend and schema projects 8`] = `
220+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/procedures/echo.ts 1`] = `
200221
"import { publicProcedure } from '../init.js';
201222
import { EchoInputSchema, EchoOutputSchema } from ':proj/test-api-schema';
202223
@@ -207,7 +228,7 @@ export const echo = publicProcedure
207228
"
208229
`;
209230
210-
exports[`trpc backend generator > should generate backend and schema projects 9`] = `
231+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/backend/src/router.ts 1`] = `
211232
"import {
212233
awsLambdaRequestHandler,
213234
CreateAWSLambdaContextOptions,
@@ -218,7 +239,7 @@ import { APIGatewayProxyEventV2WithIAMAuthorizer } from 'aws-lambda';
218239
219240
export const router = t.router;
220241
221-
const appRouter = router({
242+
export const appRouter = router({
222243
echo,
223244
});
224245
@@ -233,12 +254,12 @@ export type AppRouter = typeof appRouter;
233254
"
234255
`;
235256
236-
exports[`trpc backend generator > should generate backend and schema projects 10`] = `
257+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/schema/src/index.ts 1`] = `
237258
"export * from './procedures/echo.js';
238259
"
239260
`;
240261
241-
exports[`trpc backend generator > should generate backend and schema projects 11`] = `
262+
exports[`trpc backend generator > should generate backend and schema projects > apps/test-api/schema/src/procedures/echo.ts 1`] = `
242263
"import { z } from 'zod';
243264
244265
export const EchoInputSchema = z.object({

packages/nx-plugin/src/trpc/backend/files/backend/README.md.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ You can also automatiaclly fix some lint errors by running the following command
2828

2929
## Useful links
3030

31-
- [Trpc reference docs](TODO)
31+
- [tRPC reference docs](https://trpc.io/docs/)
3232
- [Learn more about NX](https://nx.dev/getting-started/intro)
3333

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { createHTTPServer } from '@trpc/server/adapters/standalone';
2+
import { appRouter } from './router.js';
3+
4+
const PORT = 2022;
5+
6+
createHTTPServer({
7+
router: appRouter,
8+
createContext() {
9+
return {
10+
event: {} as any,
11+
context: {} as any,
12+
info: {} as any,
13+
};
14+
},
15+
}).listen(PORT);
16+
17+
console.log(`Local TRPC server listening on port ${PORT}`);

packages/nx-plugin/src/trpc/backend/files/backend/src/router.ts.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { APIGatewayProxyEventV2WithIAMAuthorizer } from 'aws-lambda';
88

99
export const router = t.router;
1010

11-
const appRouter = router({
11+
export const appRouter = router({
1212
echo,
1313
});
1414

packages/nx-plugin/src/trpc/backend/generator.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
import { Tree } from '@nx/devkit';
5+
import { getProjects, readProjectConfiguration, Tree } from '@nx/devkit';
66
import { trpcBackendGenerator } from './generator';
77
import {
88
createTreeUsingTsSolutionSetup,
@@ -114,4 +114,22 @@ describe('trpc backend generator', () => {
114114
tree.read('packages/common/constructs/src/core/index.ts', 'utf-8'),
115115
).toContain('./trpc-api.js');
116116
});
117+
118+
it('should add a task for starting a local server', async () => {
119+
await trpcBackendGenerator(tree, {
120+
apiName: 'TestApi',
121+
directory: 'apps',
122+
unitTestRunner: 'vitest',
123+
bundler: 'vite',
124+
});
125+
const projectConfig = readProjectConfiguration(
126+
tree,
127+
'@proj/test-api-backend',
128+
);
129+
expect(projectConfig.targets).toHaveProperty('serve');
130+
expect(projectConfig.targets!.serve!.executor).toBe('nx:run-commands');
131+
expect(projectConfig.targets!.serve!.options!.commands).toEqual([
132+
'tsx src/local-server.ts',
133+
]);
134+
});
117135
});

packages/nx-plugin/src/trpc/backend/generator.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,28 @@ export async function trpcBackendGenerator(
160160
);
161161
}
162162
}
163+
163164
updateJson(
164165
tree,
165166
joinPathFragments(backendRoot, 'project.json'),
166167
(config: ProjectConfiguration) => {
167168
config.metadata = {
168169
apiName: options.apiName,
169170
} as unknown;
171+
config.targets = {
172+
...config.targets,
173+
serve: {
174+
executor: 'nx:run-commands',
175+
options: {
176+
commands: ['tsx src/local-server.ts'],
177+
cwd: backendRoot,
178+
},
179+
},
180+
};
170181
return config;
171182
},
172183
);
184+
173185
generateFiles(
174186
tree,
175187
joinPathFragments(__dirname, 'files', 'backend'),
@@ -200,7 +212,7 @@ export async function trpcBackendGenerator(
200212
'@aws-lambda-powertools/tracer',
201213
'@trpc/server',
202214
]),
203-
withVersions(['@types/aws-lambda']),
215+
withVersions(['@types/aws-lambda', 'tsx']),
204216
);
205217
tree.delete(joinPathFragments(backendRoot, 'package.json'));
206218
tree.delete(joinPathFragments(schemaRoot, 'package.json'));

packages/nx-plugin/src/utils/test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ export const createTreeUsingTsSolutionSetup = (): Tree => {
1818
return tree;
1919
};
2020

21+
/**
22+
* Snapshot all files within a directory in the given tree
23+
*/
2124
export const snapshotTreeDir = (tree: Tree, dir: string) => {
2225
if (tree.isFile(dir)) {
23-
console.log('is file', dir);
24-
expect(tree.read(dir, 'utf-8')).toMatchSnapshot();
26+
expect(tree.read(dir, 'utf-8')).toMatchSnapshot(dir);
2527
} else {
26-
console.log('is dir', dir);
2728
tree
2829
.children(dir)
2930
.forEach((subDir) =>

0 commit comments

Comments
 (0)