Initial commit

This commit is contained in:
fraqtal
2026-07-12 08:15:46 +00:00
commit ee0fec0691
1397 changed files with 127242 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,24 @@
// 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,
{{pascalCase job}}Input,
} from "../../../jobs/{{kebabCase job}}.job";
export const {{camelCase job}}Task: TaskConfig<{
input: {{pascalCase job}}Input;
output: object;
}> = {
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);
return { output: {} };
},
};