diff --git a/packages/cms/keystatic/README.md b/packages/cms/keystatic/README.md index e41f9c766..01b7b7aca 100644 --- a/packages/cms/keystatic/README.md +++ b/packages/cms/keystatic/README.md @@ -6,4 +6,30 @@ This implementation is used when the host app's environment variable is set as: ``` CMS_CLIENT=keystatic -``` \ No newline at end of file +KEYSTATIC_PATH=content +``` + +Additionally, the following environment variables may be required: + +``` +KEYSTATIC_PATH=local # local, cloud, github +``` + +You can also use Keystatic Cloud or GitHub as the storage kind as remote storage. + +If `KEYSTATIC_PATH_STORAGE_KIND` is set to `cloud`, the following environment variables are required: + +``` +KEYSTATIC_PATH_STORAGE_PROJECT=project-id +``` + +If `KEYSTATIC_PATH_STORAGE_KIND` is set to `github`, the following environment variables are required: + +``` +KEYSTATIC_PATH_STORAGE_REPO=repo-name +KEYSTATIC_PATH_STORAGE_BRANCH_PREFIX=branch-prefix +``` + +GitHub mode requires the installation of a GitHub app. + +Please refer to the [Keystatic documentation](https://keystatic.com/docs/github-model) for more information. \ No newline at end of file diff --git a/packages/cms/keystatic/src/keystatic.config.ts b/packages/cms/keystatic/src/keystatic.config.ts index 55ac0fb2a..e18518ae1 100644 --- a/packages/cms/keystatic/src/keystatic.config.ts +++ b/packages/cms/keystatic/src/keystatic.config.ts @@ -1,15 +1,36 @@ import { collection, config, fields } from '@keystatic/core'; import { z } from 'zod'; -const path = z.string().parse(process.env.NEXT_PUBLIC_KEYSTATIC_CONTENT_PATH); +const local = z.object({ + kind: z.literal('local'), +}); + +const cloud = z.object({ + kind: z.literal('cloud'), + project: z.string(), +}); + +const github = z.object({ + kind: z.literal('github'), + repo: z.custom<`${string}/${string}`>(), + branchPrefix: z.string().optional(), +}); + +const storage = z.union([local, cloud, github]).parse({ + kind: process.env.KEYSTATIC_STORAGE_KIND ?? 'local', + project: process.env.KEYSTATIC_STORAGE_PROJECT, + repo: process.env.KEYSTATIC_STORAGE_REPO, + branchPrefix: process.env.KEYSTATIC_STORAGE_BRANCH_PREFIX, + githubToken: process.env.KEYSTATIC_GITHUB_TOKEN, +}); + +const path = process.env.KEY_STATIC_PATH ?? 'content'; export default createKeyStaticConfig(path); function createKeyStaticConfig(path: string) { return config({ - storage: { - kind: 'local', - }, + storage, collections: { posts: collection({ label: 'Posts',