Pular para o conteúdo

Jogo de Dungeons com IA

Módulo 1: Configuração do monorepositório

Vamos começar criando um novo monorepositório. Dentro do diretório desejado, execute o seguinte comando:

Terminal window
npx create-nx-workspace@~21.0.3 dungeon-adventure --pm=pnpm --preset=@aws/nx-plugin --ci=skip

Isso configurará um monorepositório NX dentro do diretório dungeon-adventure que você pode abrir no VSCode. Deve parecer com o seguinte:

  • Directory.nx/
  • Directory.vscode/
  • Directorynode_modules/
  • Directorypackages/ aqui é onde seus subprojetos residirão
  • .gitignore
  • .npmrc
  • .prettierignore
  • .prettierrc
  • nx.json configura o CLI do NX e padrões do monorepositório
  • package.json todas as dependências Node são definidas aqui
  • pnpm-lock.yaml ou bun.lock, yarn.lock, package-lock.json dependendo do gerenciador de pacotes
  • pnpm-workspace.yaml se usar pnpm
  • README.md
  • tsconfig.base.json todos os subprojetos Node estendem este
  • tsconfig.json

Agora estamos prontos para começar a criar nossos diferentes subprojetos usando o @aws/nx-plugin.

Game API

Primeiro vamos criar nossa Game API. Para isso, vamos criar uma API tRPC chamada GameApi seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#trpc-api
  5. Preencha os parâmetros obrigatórios
    • name: GameApi
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Story API

Agora vamos criar nossa Story API. Para isso, vamos criar uma API FastAPI chamada StoryApi seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#fast-api
  5. Preencha os parâmetros obrigatórios
    • name: StoryApi
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Game UI: Website

Agora vamos criar a UI que permitirá interagir com o jogo. Para isso, vamos criar um website chamado GameUI seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#cloudscape-website
  5. Preencha os parâmetros obrigatórios
    • name: GameUI
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Game UI: Auth

Agora vamos configurar nossa Game UI para exigir acesso autenticado via Amazon Cognito seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#cloudscape-website#auth
  5. Preencha os parâmetros obrigatórios
    • cognitoDomain: game-ui
    • project: @dungeon-adventure/game-ui
    • allowSignup: true
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem/mudarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Game UI: Conectar à Story API

Agora vamos configurar nossa Game UI para conectar à Story API criada anteriormente:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - api-connection
  5. Preencha os parâmetros obrigatórios
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: dungeon_adventure.story_api
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem/mudarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Game UI: Conectar à Game API

Agora vamos configurar nossa Game UI para conectar à Game API criada anteriormente:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - api-connection
  5. Preencha os parâmetros obrigatórios
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: @dungeon-adventure/game-api
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem/mudarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Game UI: Infraestrutura

Agora o último subprojeto que precisamos criar é para a infraestrutura CDK. Para criar isso, siga os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#infra
  5. Preencha os parâmetros obrigatórios
    • name: infra
  6. Clique em Generate

Você deve ver alguns novos arquivos aparecerem/mudarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Atualizar nossa infraestrutura

Vamos atualizar nosso packages/infra/src/stacks/application-stack.ts para instanciar alguns de nossos constructs já gerados:

import {
GameApi,
GameUI,
StoryApi,
UserIdentity,
} from ':dungeon-adventure/common-constructs';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class ApplicationStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
const userIdentity = new UserIdentity(this, 'UserIdentity');
const gameApi = new GameApi(this, 'GameApi', {
integrations: GameApi.defaultIntegrations(this).build(),
});
const storyApi = new StoryApi(this, 'StoryApi', {
integrations: StoryApi.defaultIntegrations(this).build(),
});
// grant our authenticated role access to invoke our APIs
[storyApi, gameApi].forEach((api) =>
api.grantInvokeAccess(userIdentity.identityPool.authenticatedRole),
);
// Ensure this is instantiated last so our runtime-config.json can be automatically configured
new GameUI(this, 'GameUI');
}
}

Note que aqui fornecemos integrações padrão para nossas duas APIs. Por padrão, cada operação em nossa API é mapeada para uma função lambda individual para lidar com essa operação.

Construindo nosso código

Agora é hora de construir nosso código pela primeira vez
Terminal window
pnpm nx run-many --target build --all

Você deve ser questionado com o seguinte:

Terminal window
NX The workspace is out of sync
[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references.
This will result in an error in CI.
? Would you like to sync the identified changes to get your workspace up to date?
Yes, sync the changes and run the tasks
No, run the tasks without syncing the changes

Esta mensagem indica que o NX detectou alguns arquivos que podem ser atualizados automaticamente. Neste caso, refere-se aos arquivos tsconfig.json que não têm referências TypeScript configuradas para projetos dependentes. Selecione a opção Yes, sync the changes and run the tasks para prosseguir. Você deve notar que todos os erros de importação relacionados ao IDE são resolvidos automaticamente, pois o gerador de sync adicionará as referências TypeScript faltantes!

Todos os artefatos construídos agora estão disponíveis na pasta dist/ na raiz do monorepositório. Esta é uma prática padrão ao usar projetos gerados pelo @aws/nx-plugin, pois não polui sua árvore de arquivos com arquivos gerados. Caso queira limpar seus arquivos, basta deletar a pasta dist/ sem se preocupar com arquivos gerados espalhados.

Parabéns! Você criou todos os subprojetos necessários para começar a implementar o núcleo do nosso jogo Dunegeon Adventure. 🎉🎉🎉