diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eec3a8d..f5c0fb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -576,6 +576,9 @@ importers: packages/core-realtime: dependencies: + '@repo/core-shared': + specifier: workspace:* + version: link:../core-shared payload: specifier: ^3.0.0 version: 3.81.0(graphql@16.13.2)(typescript@5.9.3) @@ -957,6 +960,12 @@ importers: specifier: ^3.1.0 version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0) + turbo/generators: + devDependencies: + vitest: + specifier: ^3.1.0 + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0) + packages: '@adobe/css-tools@4.4.4': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ff5faa..6e4d6f7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - "apps/*" - "packages/*" + - "turbo/generators" diff --git a/turbo/generators/config.test.ts b/turbo/generators/config.test.ts new file mode 100644 index 0000000..e87ffd3 --- /dev/null +++ b/turbo/generators/config.test.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from "vitest"; +import type { PlopTypes } from "@turbo/gen"; +import generator from "./config"; + +describe("core-package generator", () => { + it("is registered with an empty choices list initially", () => { + const captured: Array<{ name: string; def: PlopTypes.PlopGeneratorConfig }> = []; + const plopMock = { + setHelper: () => {}, + setGenerator: (name: string, def: PlopTypes.PlopGeneratorConfig) => + captured.push({ name, def }), + } as unknown as PlopTypes.NodePlopAPI; + generator(plopMock); + const corePkg = captured.find((c) => c.name === "core-package"); + expect(corePkg).toBeDefined(); + const prompts = corePkg!.def.prompts as Array<{ name: string; choices: unknown[] }>; + expect(prompts[0]!.name).toBe("name"); + expect(prompts[0]!.choices).toEqual([]); + }); +}); diff --git a/turbo/generators/config.ts b/turbo/generators/config.ts index 677911c..3a4d8e3 100644 --- a/turbo/generators/config.ts +++ b/turbo/generators/config.ts @@ -491,6 +491,38 @@ export default function generator(plop: PlopTypes.NodePlopAPI): void { }, }); + /** + * Turbo generator: `core-package` + * + * Scaffolds an optional core package back into a slimmed template. Each + * name maps to a verbatim snapshot of the package captured at generator-add + * time. Phases 3-6 each register one entry in CORE_PACKAGE_GENERATORS. + */ + const CORE_PACKAGE_GENERATORS: Record PlopTypes.ActionType[]> = + { + // Phases 3-6 each insert one entry here. + }; + + plop.setGenerator("core-package", { + description: "Scaffold an optional core package (realtime, events, trpc, ui)", + prompts: [ + { + type: "list", + name: "name", + message: "Which optional core package?", + choices: [], + }, + ], + actions: (answers) => { + const a = answers as { name: string }; + const handler = CORE_PACKAGE_GENERATORS[a.name]; + if (!handler) { + throw new Error(`No generator for core-package '${a.name}'`); + } + return handler(); + }, + }); + /** * Turbo generator: `job` * diff --git a/turbo/generators/package.json b/turbo/generators/package.json index 9b4bb97..dfc8cd7 100644 --- a/turbo/generators/package.json +++ b/turbo/generators/package.json @@ -2,5 +2,11 @@ "name": "@repo/turbo-generators", "private": true, "version": "0.0.0", - "type": "module" + "type": "module", + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "vitest": "^3.1.0" + } } diff --git a/turbo/generators/vitest.config.ts b/turbo/generators/vitest.config.ts new file mode 100644 index 0000000..a5d041f --- /dev/null +++ b/turbo/generators/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: "node", + include: ["*.test.ts", "lib/*.test.ts"], + clearMocks: true, + restoreMocks: true, + }, +});