Saltearse al contenido

Juego de Mazmorra con IA

Comenzaremos creando un nuevo monorepo. Desde el directorio deseado, ejecuta el siguiente comando:

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

Esto configurará un monorepo NX dentro del directorio dungeon-adventure que podrás abrir en vscode. Debería verse así:

  • Directory.nx/
  • Directory.vscode/
  • Directorynode_modules/
  • Directorypackages/ aquí residirán tus subproyectos
  • .gitignore
  • .npmrc
  • .prettierignore
  • .prettierrc
  • nx.json configura el CLI de Nx y los valores predeterminados del monorepo
  • package.json todas las dependencias de node se definen aquí
  • pnpm-lock.yaml o bun.lock, yarn.lock, package-lock.json según el gestor de paquetes
  • pnpm-workspace.yaml si usas pnpm
  • README.md
  • tsconfig.base.json todos los subproyectos basados en node extienden este
  • tsconfig.json

Ahora estamos listos para comenzar a crear nuestros diferentes subproyectos usando el @aws/nx-plugin.

Primero creemos nuestra API del Juego. Para esto, creemos una API tRPC llamada GameApi siguiendo estos pasos:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - ts#trpc-api
  5. Complete los parámetros requeridos
    • name: GameApi
  6. Haga clic en Generate

Deberías ver que han aparecido nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Ahora creemos nuestra API de Historia. Para esto, creemos una API Fast llamada StoryApi siguiendo estos pasos:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - py#fast-api
  5. Complete los parámetros requeridos
    • name: StoryApi
    • moduleName: story_api
  6. Haga clic en Generate

Deberías ver que han aparecido nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Ahora creemos la interfaz de usuario que permitirá interactuar con el juego. Para esto, creemos un sitio web llamado GameUI siguiendo estos pasos:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - ts#react-website
  5. Complete los parámetros requeridos
    • name: GameUI
  6. Haga clic en Generate

Deberías ver que han aparecido nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Interfaz de Usuario del Juego: Autenticación

Sección titulada «Interfaz de Usuario del Juego: Autenticación»

Ahora configuremos nuestra Game UI para requerir acceso autenticado mediante Amazon Cognito siguiendo estos pasos:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - ts#react-website#auth
  5. Complete los parámetros requeridos
    • cognitoDomain: game-ui
    • project: @dungeon-adventure/game-ui
    • allowSignup: true
  6. Haga clic en Generate

Deberías ver que han aparecido/cambiado nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Interfaz de Usuario del Juego: Conectar a Story API

Sección titulada «Interfaz de Usuario del Juego: Conectar a Story API»

Ahora configuremos nuestra Game UI para conectarnos a nuestra Story API creada previamente:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - api-connection
  5. Complete los parámetros requeridos
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: dungeon_adventure.story_api
  6. Haga clic en Generate

Deberías ver que han aparecido/cambiado nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Interfaz de Usuario del Juego: Conectar a Game API

Sección titulada «Interfaz de Usuario del Juego: Conectar a Game API»

Ahora configuremos nuestra Game UI para conectarnos a nuestra Game API creada previamente:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - api-connection
  5. Complete los parámetros requeridos
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: @dungeon-adventure/game-api
  6. Haga clic en Generate

Deberías ver que han aparecido/cambiado nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Interfaz de Usuario del Juego: Infraestructura

Sección titulada «Interfaz de Usuario del Juego: Infraestructura»

Ahora el último subproyecto que necesitamos crear es para la infraestructura CDK. Para crearlo, sigue estos pasos:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - ts#infra
  5. Complete los parámetros requeridos
    • name: infra
  6. Haga clic en Generate

Deberías ver que han aparecido/cambiado nuevos archivos en tu árbol de directorios.

Haz clic aquí para examinar estos archivos en detalle.

Hagamos una actualización en nuestro packages/infra/src/stacks/application-stack.ts para instanciar algunos de nuestros constructs ya generados:

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');
}
}

Nota que aquí proveemos integraciones predeterminadas para nuestras dos APIs. Por defecto, cada operación en nuestra API está mapeada a una función lambda individual para manejar esa operación.

Ahora es momento de construir nuestro código por primera vez
Terminal window
pnpm nx run-many --target build --all

Deberías recibir el siguiente prompt:

Ventana de terminal
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

Este mensaje indica que NX ha detectado algunos archivos que pueden actualizarse automáticamente. En este caso, se refiere a los archivos tsconfig.json que no tienen referencias de Typescript configuradas en proyectos referenciados. Selecciona la opción Yes, sync the changes and run the tasks para proceder. ¡Deberías notar que todos los errores de importación relacionados con tu IDE se resuelven automáticamente ya que el generador de sync añadirá las referencias de typescript faltantes automáticamente!

Todos los artefactos construidos están ahora disponibles dentro de la carpeta dist/ ubicada en la raíz del monorepo. Esta es una práctica estándar cuando se usan proyectos generados por el @aws/nx-plugin ya que no contamina tu árbol de archivos con archivos generados. En caso de que quieras limpiar tus archivos, simplemente puedes borrar la carpeta dist/ sin preocuparte de archivos generados esparcidos por el árbol de directorios.

¡Felicidades! Has creado todos los subproyectos requeridos para comenzar a implementar el núcleo de nuestro juego Dunegeon Adventure. 🎉🎉🎉