From 1ae432a2660deb5c28ddc16ef8083abf8865300a Mon Sep 17 00:00:00 2001 From: consultoria-as Date: Sun, 22 Feb 2026 03:16:02 +0000 Subject: [PATCH] feat: add shared TypeScript types for Game, Documentary, Chapter Create @afterlife/shared package with type definitions for the core domain models (Game, Documentary, Chapter) and Strapi API interfaces (StrapiMedia, StrapiResponse, StrapiListResponse). Co-Authored-By: Claude Opus 4.6 --- package-lock.json | 23 +++++++++++++++++ packages/shared/package.json | 13 ++++++++++ packages/shared/src/index.ts | 1 + packages/shared/src/types/api.ts | 33 ++++++++++++++++++++++++ packages/shared/src/types/chapter.ts | 12 +++++++++ packages/shared/src/types/documentary.ts | 12 +++++++++ packages/shared/src/types/game.ts | 25 ++++++++++++++++++ packages/shared/src/types/index.ts | 4 +++ packages/shared/tsconfig.json | 14 ++++++++++ 9 files changed, 137 insertions(+) create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/types/api.ts create mode 100644 packages/shared/src/types/chapter.ts create mode 100644 packages/shared/src/types/documentary.ts create mode 100644 packages/shared/src/types/game.ts create mode 100644 packages/shared/src/types/index.ts create mode 100644 packages/shared/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 31dd7db..80de96e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,10 @@ "turbo": "^2" } }, + "node_modules/@afterlife/shared": { + "resolved": "packages/shared", + "link": true + }, "node_modules/turbo": { "version": "2.8.10", "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.10.tgz", @@ -107,6 +111,25 @@ "os": [ "win32" ] + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/shared": { + "version": "0.1.0", + "devDependencies": { + "typescript": "^5" + } } } } diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 0000000..ec515f5 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,13 @@ +{ + "name": "@afterlife/shared", + "version": "0.1.0", + "private": true, + "main": "./src/index.ts", + "types": "./src/index.ts", + "scripts": { + "lint": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "^5" + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 0000000..eea524d --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1 @@ +export * from "./types"; diff --git a/packages/shared/src/types/api.ts b/packages/shared/src/types/api.ts new file mode 100644 index 0000000..2f3d65e --- /dev/null +++ b/packages/shared/src/types/api.ts @@ -0,0 +1,33 @@ +export interface StrapiMedia { + id: number; + url: string; + alternativeText: string | null; + width: number | null; + height: number | null; + mime: string; + name: string; +} + +export interface StrapiResponse { + data: T; + meta: { + pagination?: { + page: number; + pageSize: number; + pageCount: number; + total: number; + }; + }; +} + +export interface StrapiListResponse { + data: T[]; + meta: { + pagination: { + page: number; + pageSize: number; + pageCount: number; + total: number; + }; + }; +} diff --git a/packages/shared/src/types/chapter.ts b/packages/shared/src/types/chapter.ts new file mode 100644 index 0000000..7f567f1 --- /dev/null +++ b/packages/shared/src/types/chapter.ts @@ -0,0 +1,12 @@ +import type { StrapiMedia } from "./api"; + +export interface Chapter { + id: number; + title: string; + content: string; + audioFile: StrapiMedia | null; + audioDuration: number | null; + order: number; + coverImage: StrapiMedia | null; + locale: string; +} diff --git a/packages/shared/src/types/documentary.ts b/packages/shared/src/types/documentary.ts new file mode 100644 index 0000000..d623e1d --- /dev/null +++ b/packages/shared/src/types/documentary.ts @@ -0,0 +1,12 @@ +import type { Chapter } from "./chapter"; + +export interface Documentary { + id: number; + title: string; + description: string; + chapters: Chapter[]; + publishedAt: string | null; + createdAt: string; + updatedAt: string; + locale: string; +} diff --git a/packages/shared/src/types/game.ts b/packages/shared/src/types/game.ts new file mode 100644 index 0000000..99fadc7 --- /dev/null +++ b/packages/shared/src/types/game.ts @@ -0,0 +1,25 @@ +import type { Documentary } from "./documentary"; +import type { StrapiMedia } from "./api"; + +export type Genre = "MMORPG" | "FPS" | "Casual" | "Strategy" | "Sports" | "Other"; +export type ServerStatus = "online" | "maintenance" | "coming_soon"; + +export interface Game { + id: number; + title: string; + slug: string; + description: string; + genre: Genre; + releaseYear: number; + shutdownYear: number; + developer: string; + publisher: string; + screenshots: StrapiMedia[]; + coverImage: StrapiMedia; + serverStatus: ServerStatus; + serverLink: string | null; + documentary: Documentary | null; + createdAt: string; + updatedAt: string; + locale: string; +} diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts new file mode 100644 index 0000000..08aca98 --- /dev/null +++ b/packages/shared/src/types/index.ts @@ -0,0 +1,4 @@ +export * from "./game"; +export * from "./documentary"; +export * from "./chapter"; +export * from "./api"; diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 0000000..033d771 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "declaration": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +}