diff --git a/packages/settings/package.json b/packages/settings/package.json new file mode 100644 index 00000000..ec2a5744 --- /dev/null +++ b/packages/settings/package.json @@ -0,0 +1,16 @@ +{ + "name": "@atomcms/settings", + "version": "0.0.0", + "private": true, + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "scripts": { + "test": "vitest run", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "^5.7.0", + "vitest": "^2.1.0" + } +} diff --git a/packages/settings/src/currency-type.test.ts b/packages/settings/src/currency-type.test.ts new file mode 100644 index 00000000..1f6edef6 --- /dev/null +++ b/packages/settings/src/currency-type.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from "vitest"; +import { CurrencyType, currencyLabel } from "./currency-type.js"; + +describe("CurrencyType", () => { + it("uses the emulator-fixed numeric values", () => { + expect(CurrencyType.Credits).toBe(-1); + expect(CurrencyType.Duckets).toBe(0); + expect(CurrencyType.Diamonds).toBe(5); + expect(CurrencyType.Points).toBe(101); + }); + + it("maps each type to a human label", () => { + expect(currencyLabel(CurrencyType.Credits)).toBe("Credits"); + expect(currencyLabel(CurrencyType.Diamonds)).toBe("Diamonds"); + }); +}); diff --git a/packages/settings/src/currency-type.ts b/packages/settings/src/currency-type.ts new file mode 100644 index 00000000..065174bd --- /dev/null +++ b/packages/settings/src/currency-type.ts @@ -0,0 +1,18 @@ +// Numeric values are dictated by the game emulator and MUST NOT change. +export enum CurrencyType { + Credits = -1, + Duckets = 0, + Diamonds = 5, + Points = 101, +} + +const LABELS: Record = { + [CurrencyType.Credits]: "Credits", + [CurrencyType.Duckets]: "Duckets", + [CurrencyType.Diamonds]: "Diamonds", + [CurrencyType.Points]: "Points", +}; + +export function currencyLabel(type: CurrencyType): string { + return LABELS[type]; +} diff --git a/packages/settings/tsconfig.json b/packages/settings/tsconfig.json new file mode 100644 index 00000000..6fcd57f7 --- /dev/null +++ b/packages/settings/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { "rootDir": "src", "outDir": "dist" }, + "include": ["src"] +} diff --git a/packages/settings/vitest.config.ts b/packages/settings/vitest.config.ts new file mode 100644 index 00000000..96d8a086 --- /dev/null +++ b/packages/settings/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config"; + +// Local config so Vitest does not walk up into the parent Laravel repo's +// vite.config.js (this monorepo is nested inside the Laravel project). +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25f53987..7faffdff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,15 @@ importers: specifier: ^2.1.0 version: 2.1.9(@types/node@22.20.0) + packages/settings: + devDependencies: + typescript: + specifier: ^5.7.0 + version: 5.9.3 + vitest: + specifier: ^2.1.0 + version: 2.1.9(@types/node@22.20.0) + packages: '@esbuild/aix-ppc64@0.21.5':