Pular para o conteúdo

Jogo de Dungeons com IA

Vamos começar criando um novo monorepo. 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 monorepo 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 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

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

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.

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
    • moduleName: story_api
  6. Clique em Generate

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

Clique aqui para examinar esses arquivos em detalhes.

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.

Agora vamos configurar nosso 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/alterarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Agora vamos configurar nosso 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/alterarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

Agora vamos configurar nosso 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/alterarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

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/alterarem em sua árvore de arquivos.

Clique aqui para examinar esses arquivos em detalhes.

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 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.

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 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 Yes, sync the changes and run the tasks para prosseguir. Você deve notar que todos os erros de importação no IDE são resolvidos automaticamente, pois o gerador de sync adicionará as referências TypeScript faltantes!

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, 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. 🎉🎉🎉