feat(turbo-gen): templates for gen job

This commit is contained in:
2026-05-08 16:18:50 +02:00
parent 31f825a5d7
commit 8e081c2e97
3 changed files with 61 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
// packages/{{kebabCase feature}}/src/jobs/{{kebabCase job}}.job.test.ts
import { describe, it, expect } from "vitest";
import { {{camelCase job}}Job, {{camelCase job}}InputSchema } from "@/jobs/{{kebabCase job}}.job";
describe("{{camelCase job}}Job", () => {
it("validates input via the schema", async () => {
const job = {{camelCase job}}Job();
await expect(job({ unexpectedField: 1 } as never)).rejects.toThrow();
});
it("accepts valid input", async () => {
const job = {{camelCase job}}Job();
{{#if (eq inputShape "typed")}}
await expect(job({ exampleField: "x" })).resolves.toBeUndefined();
{{else}}
await expect(job({})).resolves.toBeUndefined();
{{/if}}
});
it("references its input schema", () => {
expect({{camelCase job}}InputSchema).toBeDefined();
});
});

View File

@@ -0,0 +1,20 @@
// packages/{{kebabCase feature}}/src/jobs/{{kebabCase job}}.job.ts
import { z } from "zod";
{{#if (eq inputShape "typed")}}
export const {{camelCase job}}InputSchema = z
.object({ exampleField: z.string() })
.strict();
{{else}}
export const {{camelCase job}}InputSchema = z.object({}).strict();
{{/if}}
export type {{pascalCase job}}Input = z.infer<typeof {{camelCase job}}InputSchema>;
export type I{{pascalCase job}}Job = ReturnType<typeof {{camelCase job}}Job>;
export const {{camelCase job}}Job =
() =>
async (input: {{pascalCase job}}Input): Promise<void> => {
{{camelCase job}}InputSchema.parse(input);
// TODO: implement the job. Inject dependencies via the factory's constructor.
};

View File

@@ -0,0 +1,18 @@
// packages/{{kebabCase feature}}/src/integrations/cms/jobs/{{kebabCase job}}.task.ts
import type { TaskConfig } from "payload";
import { {{camelCase feature}}Container } from "../../../di/container";
import { {{constantCase feature}}_SYMBOLS } from "../../../di/symbols";
import type { I{{pascalCase job}}Job } from "../../../jobs/{{kebabCase job}}.job";
export const {{camelCase job}}Task: TaskConfig<"{{kebabCase feature}}.{{kebabCase job}}"> = {
slug: "{{kebabCase feature}}.{{kebabCase job}}",
inputSchema: [],
retries: { attempts: 3, backoff: { type: "exponential", delay: 1000 } },
handler: async ({ input }) => {
const job = {{camelCase feature}}Container.get<I{{pascalCase job}}Job>(
{{constantCase feature}}_SYMBOLS.I{{pascalCase job}}Job,
);
await job(input as never);
return { output: {} };
},
};