Pular para o conteúdo

Jogo de Dungeons com IA

Módulo 1: Configuração do monorepo

Vamos começar criando um novo monorepo. A partir do diretório desejado, execute o seguinte comando:

Terminal window
npx create-nx-workspace@~20.6.3 dungeon-adventure --pm=pnpm --preset=ts --ci=skip --formatter=prettier

Isso configurará um monorepo NX dentro do diretório dungeon-adventure que você poderá 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 monorepo
  • package.json todas as dependências do 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 baseados em node estendem este
  • tsconfig.json

Para começar a adicionar componentes do @aws/nx-plugin ao monorepo, precisamos instalá-lo como uma dependência de desenvolvimento executando o seguinte comando da raiz do monorepo dungeon-adventure:

Terminal window
pnpm add -Dw @aws/nx-plugin

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
    • apiName: GameApi
  6. Clique em Generate

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

Clique aqui para examinar esses arquivos em mais detalhes.

Story API

Agora vamos criar nossa Story API. Para isso, vamos criar uma API Fast 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 na sua árvore de arquivos.

Clique aqui para examinar esses arquivos em mais 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 na sua árvore de arquivos.

Clique aqui para examinar esses arquivos em mais 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 arquivos novos/alterados em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em mais detalhes.

Game UI: Conectar à Story API

Agora vamos configurar nossa Game UI para se 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 arquivos novos/alterados em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em mais detalhes.

Game UI: Conectar à Game API

Agora vamos configurar nossa Game UI para se 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-backend
  6. Clique em Generate

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

Clique aqui para examinar esses arquivos em mais detalhes.

Game UI: Infraestrutura

Agora o último subprojeto que precisamos criar é para a infraestrutura CDK. Para criá-lo, 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 arquivos novos/alterados em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em mais 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);
// O código que define sua stack vai aqui
const userIdentity = new UserIdentity(this, 'UserIdentity');
const gameApi = new GameApi(this, 'GameApi');
const storyApi = new StoryApi(this, 'StoryApi');
// concede à nossa função autenticada acesso para invocar nossas APIs
[storyApi, gameApi].forEach((api) =>
api.grantInvokeAccess(userIdentity.identityPool.authenticatedRole),
);
// Garante que isto seja instanciado por último para que nosso runtime-config.json possa ser configurado automaticamente
new GameUI(this, 'GameUI');
}
}

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 à sua IDE são resolvidos automaticamente, pois o generator sync adicionará as referências TypeScript faltantes automaticamente!

Todos os artefatos construídos estão agora disponíveis na pasta dist/ na raiz do monorepo. 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, você pode simplesmente 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. 🎉🎉🎉