Contribua com um Gerador
Vamos criar um novo gerador para contribuir com o @aws/nx-plugin. Nosso objetivo será gerar um novo procedimento para uma API tRPC.
Clonar o Plugin
Seção intitulada “Clonar o Plugin”Primeiro, vamos clonar o plugin:
git clone git@github.com:awslabs/nx-plugin-for-aws.gitEm seguida, instalar e construir:
cd nx-plugin-for-awspnpm ipnpm nx run-many --target build --allCriar um Gerador Vazio
Seção intitulada “Criar um Gerador Vazio”Vamos criar o novo gerador em packages/nx-plugin/src/trpc/procedure.
Fornecemos um gerador para criar novos geradores, permitindo que você scaffold seu novo gerador rapidamente! Execute este gerador com:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#nx-generator - Preencha os parâmetros obrigatórios
- pluginProject: @aws/nx-plugin
- name: ts#trpc-api#procedure
- directory: trpc/procedure
- description: Adds a procedure to a tRPC API
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC APIyarn nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC APInpx nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC APIbunx nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC APIVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC API --dry-runyarn nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC API --dry-runnpx nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC API --dry-runbunx nx g @aws/nx-plugin:ts#nx-generator --pluginProject=@aws/nx-plugin --name=ts#trpc-api#procedure --directory=trpc/procedure --description=Adds a procedure to a tRPC API --dry-runOs seguintes arquivos serão gerados para você:
Directorypackages/nx-plugin/src/trpc/procedure
- schema.json Define as entradas do gerador
- schema.d.ts Interface TypeScript correspondente ao schema
- generator.ts Função executada pelo Nx como gerador
- generator.spec.ts Testes para o gerador
Directorydocs/src/content/docs/guides/
- trpc-procedure.mdx Documentação do gerador
- packages/nx-plugin/generators.json Atualizado para incluir o gerador
Vamos atualizar o schema para adicionar as propriedades necessárias:
{ "$schema": "https://json-schema.org/schema", "$id": "tRPCProcedure", "title": "Adds a procedure to a tRPC API", "type": "object", "properties": { "project": { "type": "string", "description": "tRPC API project", "x-prompt": "Select the tRPC API project to add the procedure to", "x-dropdown": "projects", "x-priority": "important" }, "procedure": { "description": "The name of the new procedure", "type": "string", "x-prompt": "What would you like to call your new procedure?", "x-priority": "important", }, "type": { "description": "The type of procedure to generate", "type": "string", "x-prompt": "What type of procedure would you like to generate?", "x-priority": "important", "default": "query", "enum": ["query", "mutation"] } }, "required": ["project", "procedure"]}export interface TrpcProcedureSchema { project: string; procedure: string; type: 'query' | 'mutation';}O gerador já está configurado em packages/nx-plugin/generators.json:
... "generators": { ... "ts#trpc-api#procedure": { "factory": "./src/trpc/procedure/generator", "schema": "./src/trpc/procedure/schema.json", "description": "Adds a procedure to a tRPC API" } },...Implementar o Gerador
Seção intitulada “Implementar o Gerador”Para adicionar um procedimento a uma API tRPC, precisamos:
- Criar um arquivo TypeScript para o novo procedimento
- Adicionar o procedimento ao router
Criar o Novo Procedimento
Seção intitulada “Criar o Novo Procedimento”Usaremos o utilitário generateFiles com um template EJS para gerar o arquivo:
import { publicProcedure } from '../init.js';import { z } from 'zod';
export const <%- procedureNameCamelCase %> = publicProcedure .input(z.object({ // TODO: define input })) .output(z.object({ // TODO: define output })) .<%- procedureType %>(async ({ input, ctx }) => { // TODO: implement! return {}; });Atualizamos o gerador para passar as variáveis necessárias:
import { generateFiles, joinPathFragments, readProjectConfiguration, Tree,} from '@nx/devkit';import { TrpcProcedureSchema } from './schema';import { formatFilesInSubtree } from '../../utils/format';import camelCase from 'lodash.camelcase';import kebabCase from 'lodash.kebabcase';
export const trpcProcedureGenerator = async ( tree: Tree, options: TrpcProcedureSchema,) => { const projectConfig = readProjectConfiguration(tree, options.project);
const procedureNameCamelCase = camelCase(options.procedure); const procedureNameKebabCase = kebabCase(options.procedure);
generateFiles( tree, joinPathFragments(__dirname, 'files'), projectConfig.sourceRoot, { procedureNameCamelCase, procedureNameKebabCase, procedureType: options.type, }, );
await formatFilesInSubtree(tree);};
export default trpcProcedureGenerator;Adicionar o Procedimento ao Router
Seção intitulada “Adicionar o Procedimento ao Router”Em seguida, queremos que o gerador conecte o novo procedimento ao router. Isso significa ler e atualizar o código-fonte do usuário!
Usamos GritQL para buscar e transformar código-fonte de forma declarativa. O helper addDestructuredImport adiciona imports nomeados, e applyGritQL aplica um padrão GritQL para adicionar o procedimento ao objeto literal do router.
import { generateFiles, joinPathFragments, readProjectConfiguration, Tree,} from '@nx/devkit';import { TrpcProcedureSchema } from './schema';import { formatFilesInSubtree } from '../../utils/format';import camelCase from 'lodash.camelcase';import kebabCase from 'lodash.kebabcase';import { addDestructuredImport, applyGritQL } from '../../utils/ast';
export const trpcProcedureGenerator = async ( tree: Tree, options: TrpcProcedureSchema,) => { const projectConfig = readProjectConfiguration(tree, options.project);
const procedureNameCamelCase = camelCase(options.procedure); const procedureNameKebabCase = kebabCase(options.procedure);
generateFiles( tree, joinPathFragments(__dirname, 'files'), projectConfig.sourceRoot, { procedureNameCamelCase, procedureNameKebabCase, procedureType: options.type, }, );
const routerPath = joinPathFragments(projectConfig.sourceRoot, 'router.ts');
await addDestructuredImport( tree, routerPath, [procedureNameCamelCase], `./procedures/${procedureNameKebabCase}.js`, );
await applyGritQL( tree, routerPath, `\`router({ $props })\` => \`router({ $props, ${procedureNameCamelCase} })\` where { $props <: not contains \`${procedureNameCamelCase}\` }`, );
await formatFilesInSubtree(tree);};
export default trpcProcedureGenerator;Agora que implementamos o gerador, vamos compilá-lo para garantir que esteja disponível para testarmos em nosso projeto:
pnpm nx compile @aws/nx-pluginTestar o Gerador
Seção intitulada “Testar o Gerador”Para testar o gerador, vamos vincular nosso Nx Plugin for AWS local a uma base de código existente.
Criar um Projeto de Teste com uma API tRPC
Seção intitulada “Criar um Projeto de Teste com uma API tRPC”Em um diretório separado, crie um novo workspace de teste:
npx create-nx-workspace@22.6.1 trpc-generator-test --pm=pnpm --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsnpx create-nx-workspace@22.6.1 trpc-generator-test --pm=yarn --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsnpx create-nx-workspace@22.6.1 trpc-generator-test --pm=npm --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsnpx create-nx-workspace@22.6.1 trpc-generator-test --pm=bun --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsEm seguida, vamos gerar uma API tRPC para adicionar o procedimento:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#trpc-api - Preencha os parâmetros obrigatórios
- apiName: test-api
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactiveyarn nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactivenpx nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactivebunx nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactiveVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactive --dry-runyarn nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactive --dry-runnpx nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactive --dry-runbunx nx g @aws/nx-plugin:ts#trpc-api --apiName=test-api --no-interactive --dry-runVincular nosso Nx Plugin for AWS local
Seção intitulada “Vincular nosso Nx Plugin for AWS local”Em sua base de código, vamos vincular nosso @aws/nx-plugin local:
cd path/to/trpc-generator-testpnpm link path/to/nx-plugin-for-aws/dist/packages/nx-plugincd path/to/trpc-generator-testyarn link path/to/nx-plugin-for-aws/dist/packages/nx-plugincd path/to/trpc-generator-testnpm link path/to/nx-plugin-for-aws/dist/packages/nx-plugincd path/to/nx-plugin-for-aws/dist/packages/nx-pluginbun linkcd path/to/trpc-generator-testbun link @aws/nx-pluginExecutar o novo Gerador
Seção intitulada “Executar o novo Gerador”Vamos testar o novo gerador:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#trpc-api#procedure - Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#trpc-api#procedureyarn nx g @aws/nx-plugin:ts#trpc-api#procedurenpx nx g @aws/nx-plugin:ts#trpc-api#procedurebunx nx g @aws/nx-plugin:ts#trpc-api#procedureVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#trpc-api#procedure --dry-runyarn nx g @aws/nx-plugin:ts#trpc-api#procedure --dry-runnpx nx g @aws/nx-plugin:ts#trpc-api#procedure --dry-runbunx nx g @aws/nx-plugin:ts#trpc-api#procedure --dry-runSe bem-sucedido, devemos ter gerado um novo procedimento e adicionado o procedimento ao nosso router em router.ts.
Exercícios
Seção intitulada “Exercícios”Se você chegou até aqui e ainda tem algum tempo para experimentar com geradores Nx, aqui estão algumas sugestões de recursos para adicionar ao gerador de procedimentos:
1. Operações Aninhadas
Seção intitulada “1. Operações Aninhadas”Tente atualizar o gerador para suportar routers aninhados:
- Aceitando notação com pontos para a entrada
procedure(ex:games.query) - Gerando um procedimento com um nome baseado na notação invertida (ex:
queryGames) - Adicionando o router aninhado apropriado (ou atualizando-o se já existir!)
2. Validação
Seção intitulada “2. Validação”Nosso gerador deve se defender contra possíveis problemas, como um usuário selecionando um project que não é uma API tRPC. Dê uma olhada no gerador connection para um exemplo disso.
3. Testes Unitários
Seção intitulada “3. Testes Unitários”Escreva alguns testes unitários para o gerador. Eles são bastante diretos de implementar, e a maioria segue o fluxo geral:
- Criar um workspace tree vazio usando
createTreeUsingTsSolutionSetup() - Adicionar quaisquer arquivos que já devem existir na tree (ex:
project.jsonesrc/router.tspara um backend tRPC) - Executar o gerador em teste
- Validar que as alterações esperadas foram feitas na tree
4. Testes End to End
Seção intitulada “4. Testes End to End”Atualmente, temos um único “smoke test” que executa todos os geradores e garante que a build seja bem-sucedida. Isso deve ser atualizado para incluir o novo gerador.
Orientação Geral para Acelerar Contribuições
Seção intitulada “Orientação Geral para Acelerar Contribuições”Esta seção contém algumas orientações gerais que podem ajudar ao trabalhar no Nx Plugin for AWS.
Trabalhe de trás para frente a partir de um projeto real
Seção intitulada “Trabalhe de trás para frente a partir de um projeto real”Uma forma útil de construir novos geradores ou adicionar recursos/correções a um gerador existente é construí-lo de verdade primeiro. Dessa forma, você pode validar suas ideias e iterar rapidamente para alcançar a funcionalidade necessária. Depois de definir o resultado desejado, você pode então atualizar o gerador.
Na prática, este processo pode ser assim:
-
Crie um novo workspace
Terminal window npx create-nx-workspace@22.6.1 my-project --pm=pnpm --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsTerminal window npx create-nx-workspace@22.6.1 my-project --pm=yarn --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsTerminal window npx create-nx-workspace@22.6.1 my-project --pm=npm --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgentsTerminal window npx create-nx-workspace@22.6.1 my-project --pm=bun --preset=@aws/nx-plugin --ci=skip --analytics=false --aiAgents -
Execute quaisquer geradores que possam ser pré-requisitos para seu novo gerador/recurso/correção
-
Faça commit das suas alterações (
git commit) -
Faça as alterações desejadas e teste-as conforme necessário
-
Use o
git diffdas suas alterações para informar quais mudanças devem ser feitas no Nx Plugin for AWS -
Execute um teste final end-to-end (vinculando seu
@aws/nx-plugin) para garantir que seu gerador gera as alterações necessárias