feat(turbo-gen): templates for gen job
This commit is contained in:
23
turbo/generators/templates/job/job.test.ts.hbs
Normal file
23
turbo/generators/templates/job/job.test.ts.hbs
Normal 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();
|
||||||
|
});
|
||||||
|
});
|
||||||
20
turbo/generators/templates/job/job.ts.hbs
Normal file
20
turbo/generators/templates/job/job.ts.hbs
Normal 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.
|
||||||
|
};
|
||||||
18
turbo/generators/templates/job/task.ts.hbs
Normal file
18
turbo/generators/templates/job/task.ts.hbs
Normal 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: {} };
|
||||||
|
},
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user