octocms 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/admin/actions/files.d.ts.map +1 -1
  2. package/dist/admin/actions/files.js +1 -0
  3. package/dist/admin/actions/files.js.map +1 -1
  4. package/dist/agent/index.cjs +1 -0
  5. package/dist/agent/index.cjs.map +1 -1
  6. package/dist/chunk-L27J3XWV.js +7 -0
  7. package/dist/{chunk-5MC45AYI.js.map → chunk-L27J3XWV.js.map} +1 -1
  8. package/dist/cli/index.js +2 -2
  9. package/dist/components/FormImageField.d.ts +9 -1
  10. package/dist/components/FormImageField.d.ts.map +1 -1
  11. package/dist/components/FormImageField.js +20 -12
  12. package/dist/components/FormImageField.js.map +1 -1
  13. package/dist/components/FormMarkdownField.d.ts.map +1 -1
  14. package/dist/components/FormMarkdownField.js +36 -0
  15. package/dist/components/FormMarkdownField.js.map +1 -1
  16. package/dist/components/MediaManager/MarkdownImageEditToolbar.d.ts +13 -0
  17. package/dist/components/MediaManager/MarkdownImageEditToolbar.d.ts.map +1 -0
  18. package/dist/components/MediaManager/MarkdownImageEditToolbar.js +83 -0
  19. package/dist/components/MediaManager/MarkdownImageEditToolbar.js.map +1 -0
  20. package/dist/components/MediaManager/MarkdownInsertImageDialog.d.ts +3 -0
  21. package/dist/components/MediaManager/MarkdownInsertImageDialog.d.ts.map +1 -0
  22. package/dist/components/MediaManager/MarkdownInsertImageDialog.js +120 -0
  23. package/dist/components/MediaManager/MarkdownInsertImageDialog.js.map +1 -0
  24. package/dist/globals.css +124 -0
  25. package/dist/{init-LMBF6CMC.js → init-N6K464EZ.js} +2 -2
  26. package/dist/lib/stageMediaFiles.d.ts +16 -0
  27. package/dist/lib/stageMediaFiles.d.ts.map +1 -0
  28. package/dist/lib/stageMediaFiles.js +20 -0
  29. package/dist/lib/stageMediaFiles.js.map +1 -0
  30. package/docs/overview.md +1 -0
  31. package/docs/schema.md +31 -1
  32. package/globals.css +124 -0
  33. package/package.json +1 -1
  34. package/dist/chunk-5MC45AYI.js +0 -7
  35. /package/dist/{init-LMBF6CMC.js.map → init-N6K464EZ.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AA+B1B,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAgM9C;;GAEG;AACH,eAAO,MAAM,sCAAsC,QAAa,OAAO,CAAC,IAAI,CAQ3E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,UAAU,MAAM,kBAyB7G,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,aAAY,MAAa,sBAgC9D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAkB7D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAQ,MAAa,sBAqBxD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,iBAkF7C,CAAC;AAuBF,eAAO,MAAM,QAAQ,GACnB,UAAU,GAAG,EACb,UAAU,MAAM,EAChB,UAAU;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,OAAO,CAAC,cAAc,CAoJxB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAmDjE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,YAAY,CA2DvE,CAAC"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AA+B1B,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAgM9C;;GAEG;AACH,eAAO,MAAM,sCAAsC,QAAa,OAAO,CAAC,IAAI,CAQ3E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,UAAU,MAAM,kBAyB7G,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,aAAY,MAAa,sBAgC9D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAkB7D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAQ,MAAa,sBAqBxD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,iBAkF7C,CAAC;AAuBF,eAAO,MAAM,QAAQ,GACnB,UAAU,GAAG,EACb,UAAU,MAAM,EAChB,UAAU;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,OAAO,CAAC,cAAc,CAoJxB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAoDjE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,YAAY,CA2DvE,CAAC"}
@@ -551,6 +551,7 @@ const newFile = async (type) => {
551
551
  process.cwd(),
552
552
  file
553
553
  );
554
+ await fsPromises.mkdir(path.dirname(filePath), { recursive: true });
554
555
  await fsPromises.writeFile(filePath, normalizedData, "utf8");
555
556
  await persistBranchHistoryEntryIfNeeded(activeBranchDev, file);
556
557
  await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranchDev, false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/files.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { cookies } from 'next/headers';\n\nimport { getConfig } from '../../lib/configStore';\nimport { getAgentConfig } from '../../agent/configStore';\nimport { syncEmbeddingsAfterRemove, syncEmbeddingsAfterUpsert } from '../../agent/embeddingsHook';\nimport { BRANCH_HISTORY_FILE_PATH, mergeHistoryContentWithAppendedEntry } from '../../lib/branchHistory';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { initialFieldsForNewEntry } from '../../lib/initialEntryFields';\nimport { persistedFieldsFromFormStrings } from '../../lib/persistedFormFields';\nimport { normalizeStoredSlug } from '../../lib/slugField';\nimport { validateEntryFields } from '../../lib/validateEntryFields';\nimport type { Config } from '../types';\n\nimport {\n deleteGitHubFile,\n getGitHubFile,\n isProductionMode,\n listGitHubFiles,\n listGitHubFilesRecursive,\n readGitHubFilePublic,\n saveGitHubFile,\n} from '../github';\nimport { applyMutation, getStoredContentFiles, getStoredFile, getStoredFileSha } from '../store/contentStore';\nimport { mediaContentFolder, mediaEntryPath } from '../../lib/mediaPath';\nimport { buildJsons } from './build';\nimport {\n actionErr,\n actionOk,\n getErrorMessage,\n type ActionResult,\n type NewFileResult,\n type SaveFileResult,\n} from './utils';\n\nexport type { SaveFileResult } from './utils';\n\nconst CMS_ACTIVE_BRANCH_COOKIE = 'cms-active-branch';\n\nfunction normalizeContentPath(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\n/** Best-effort embedding store sync after content writes. No-op when the agent isn't configured. */\nasync function syncEmbeddingsForUpsertIfEnabled(\n entryPath: string,\n payload: { sys?: { type?: string }; fields?: Record<string, unknown> },\n companions: Record<string, string>,\n branch: string | undefined,\n isProduction: boolean,\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const config = getConfig();\n await syncEmbeddingsAfterUpsert({ agentConfig, config, entryPath, payload, companions, branch, isProduction });\n}\n\nasync function syncEmbeddingsForRemoveIfEnabled(\n entryPath: string,\n branch: string | undefined,\n isProduction: boolean,\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n await syncEmbeddingsAfterRemove({ agentConfig, entryPath, branch, isProduction });\n}\n\n/** Records the entry path under the active branch in `cms/branch-history.json` (GitHub or local). Best-effort. */\nasync function persistBranchHistoryEntryIfNeeded(activeBranch: string | undefined, entryPath: string): Promise<void> {\n if (!activeBranch) {\n return;\n }\n\n const normalized = normalizeContentPath(entryPath);\n\n if (isProductionMode()) {\n try {\n const historyFile = await getGitHubFile(BRANCH_HISTORY_FILE_PATH, activeBranch);\n const next = mergeHistoryContentWithAppendedEntry(historyFile?.content ?? '', activeBranch, normalized);\n if (next == null) {\n return;\n }\n\n await saveGitHubFile(BRANCH_HISTORY_FILE_PATH, next, 'CMS: track entry in branch history', activeBranch);\n } catch {\n /* best-effort sidecar — primary save must still succeed */\n }\n\n return;\n }\n\n try {\n const abs = path.join(/*turbopackIgnore: true*/ process.cwd(), BRANCH_HISTORY_FILE_PATH);\n let raw = '';\n try {\n raw = await fsPromises.readFile(abs, { encoding: 'utf8' });\n } catch {\n raw = '';\n }\n\n const next = mergeHistoryContentWithAppendedEntry(raw, activeBranch, normalized);\n if (next == null) {\n return;\n }\n\n await fsPromises.mkdir(path.dirname(abs), { recursive: true });\n await fsPromises.writeFile(abs, next, 'utf8');\n } catch {\n /* best-effort sidecar */\n }\n}\n\nasync function assertSlugFieldsUnique(\n entryType: string,\n fileName: string,\n persistedFields: Record<string, unknown>,\n): Promise<{ ok: true } | { ok: false; fieldKey: string; message: string }> {\n const config = getConfig();\n const col = config.collections[entryType as keyof Config['collections']];\n if (!col) {\n return { ok: true };\n }\n\n const slugFieldEntries = Object.entries(col.fields).filter(([, def]) => def.format === 'slug');\n if (slugFieldEntries.length === 0) {\n return { ok: true };\n }\n\n const selfPath = normalizeContentPath(fileName);\n const siblings = await getContentFiles(entryType);\n if (!Array.isArray(siblings)) {\n return { ok: true };\n }\n\n for (const [slugKey] of slugFieldEntries) {\n const candidate = persistedFields[slugKey];\n if (typeof candidate !== 'string' || !candidate.trim()) {\n continue;\n }\n const normCandidate = normalizeStoredSlug(candidate);\n if (!normCandidate) {\n continue;\n }\n\n for (const siblingPath of siblings) {\n if (normalizeContentPath(siblingPath) === selfPath) {\n continue;\n }\n let data: unknown;\n try {\n data = await getFile(siblingPath);\n } catch {\n continue;\n }\n if (!data || typeof data !== 'object') {\n continue;\n }\n const fields = (data as { fields?: Record<string, unknown> }).fields;\n if (!fields) {\n continue;\n }\n const other = fields[slugKey];\n if (typeof other !== 'string' || !other.trim()) {\n continue;\n }\n if (normalizeStoredSlug(other) === normCandidate) {\n return {\n ok: false,\n fieldKey: slugKey,\n message: `Another ${col.label} already uses this slug. Choose a different value.`,\n };\n }\n }\n }\n\n return { ok: true };\n}\n\nconst MEDIA_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nasync function assertImageFieldsReferenceMediaWithTitle(\n entryType: string,\n strFields: Record<string, string>,\n): Promise<{ ok: true } | { ok: false; fieldKey: string; message: string }> {\n const config = getConfig();\n const col = config.collections[entryType as keyof Config['collections']];\n if (!col) {\n return { ok: true };\n }\n\n for (const [key, def] of Object.entries(col.fields)) {\n if (def.format !== 'image') {\n continue;\n }\n const raw = (strFields[key] ?? '').trim();\n if (!raw || raw.startsWith('/')) {\n continue;\n }\n if (!MEDIA_UUID_RE.test(raw)) {\n continue;\n }\n\n const mediaPath = mediaEntryPath(raw);\n let media: unknown;\n try {\n media = await getFile(mediaPath);\n } catch {\n return {\n ok: false,\n fieldKey: key,\n message: `Media not found for ${def.label}. Choose a valid image in the Media library.`,\n };\n }\n\n const title = (media as { fields?: { title?: unknown } })?.fields?.title;\n if (typeof title !== 'string' || !title.trim()) {\n return {\n ok: false,\n fieldKey: key,\n message: `Selected image is missing a required Title; fix it in the Media library.`,\n };\n }\n }\n\n return { ok: true };\n}\n\n/**\n * In production, reject writes that would target `config.git.baseBranch` (no feature branch cookie).\n */\nexport const assertFeatureBranchForWritesIfRequired = async (): Promise<void> => {\n if (!isProductionMode()) {\n return;\n }\n\n if (!(await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value) {\n throw new Error('Create or select a branch before editing.');\n }\n};\n\nexport const waitForPublicReadConsistency = async (fileName: string, expectedContent: string, readRef?: string) => {\n if (!isProductionMode()) {\n return;\n }\n\n const parsedAttempts = Number.parseInt(process.env.CMS_GITHUB_CONSISTENCY_ATTEMPTS || '8', 10);\n const parsedDelayMs = Number.parseInt(process.env.CMS_GITHUB_CONSISTENCY_DELAY_MS || '250', 10);\n const maxAttempts = Number.isFinite(parsedAttempts) && parsedAttempts > 0 ? parsedAttempts : 1;\n const delayMs = Number.isFinite(parsedDelayMs) && parsedDelayMs >= 0 ? parsedDelayMs : 250;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const visibleContent = await readGitHubFilePublic(fileName, readRef);\n\n if (visibleContent === expectedContent) {\n return;\n }\n } catch (_e) {\n // Ignore transient read failures and retry within the same save request.\n }\n\n if (attempt < maxAttempts && delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n};\n\nexport const getContentFiles = async (collection: string = '**') => {\n const config = getConfig();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n // Try in-memory store first (instant)\n try {\n const stored = await getStoredContentFiles(collection, activeBranch);\n if (stored) return stored;\n } catch {\n // Store unavailable — fall through to direct GitHub API\n }\n\n try {\n if (collection === '**') {\n const listed = await listGitHubFilesRecursive(config.contentFolder, '.json', activeBranch);\n return Array.isArray(listed) ? listed : [];\n }\n\n const listed = await listGitHubFiles(`${config.contentFolder}/${collection}`, '.json', activeBranch);\n return Array.isArray(listed) ? listed : [];\n } catch (e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${config.contentFolder}/${collection}/*.json`);\n return files || [];\n } catch (e) {\n return [];\n }\n};\n\n/**\n * List media-entry JSON files (e.g. `cms/media/media-<uuid>.json`).\n *\n * Distinct from `getContentFiles`, which lists editorial content under\n * `config.contentFolder`, and from `getMediaFiles`, which lists physical image\n * binaries under `config.mediaFolder`. This is the JSON-entry layer.\n */\nexport const getMediaContentFiles = async (): Promise<string[]> => {\n const folder = mediaContentFolder();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n try {\n return await listGitHubFiles(folder, '.json', activeBranch);\n } catch (_e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${folder}/*.json`);\n return files || [];\n } catch (_e) {\n return [];\n }\n};\n\nexport const getMediaFiles = async (folder: string = '**') => {\n const config = getConfig();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n try {\n const dir = folder === '**' ? config.mediaFolder : `${config.mediaFolder}/${folder}`;\n const allFiles = await listGitHubFilesRecursive(dir, undefined, activeBranch);\n const extensions = config.mediaAllowedFormats;\n return allFiles.filter((f) => extensions.some((ext) => f.endsWith(`.${ext}`)));\n } catch (e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${config.mediaFolder}/${folder}/*.{${config.mediaAllowedFormats.join(',')}}`);\n return files || [];\n } catch (e) {\n return [];\n }\n};\n\nexport const getFile = async (fileName: string) => {\n const config = getConfig();\n try {\n let entry: any;\n\n if (isProductionMode()) {\n // Try in-memory store first (instant, includes pre-merged companions)\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const stored = await getStoredFile(fileName, activeBranch);\n\n if (stored) {\n entry = structuredClone(stored.content);\n // Merge pre-cached companion markdown into fields\n if (entry.fields) {\n for (const [fieldName, mdContent] of Object.entries(stored.companionMarkdown)) {\n entry.fields[fieldName] = mdContent;\n }\n }\n return entry;\n }\n } catch {\n // Store unavailable — fall through to direct GitHub API\n }\n\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const result = await getGitHubFile(fileName, activeBranch);\n\n if (result) {\n entry = JSON.parse(result.content);\n }\n } catch (e) {\n // Fall back to local file if GitHub API access is not available.\n }\n\n // Cold serverless instance: content store is empty. `getGitHubFile` may return null\n // (404 race) or throw before `readGitHubFilePublic`'s multi-client retry path runs.\n // Never fall through to `fs.readFile` on deploy — the repo is not on disk (ENOENT → 500).\n if (!entry) {\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const raw = await readGitHubFilePublic(fileName, activeBranch);\n if (raw) {\n entry = JSON.parse(raw);\n }\n } catch {\n /* best-effort */\n }\n }\n }\n\n if (!entry) {\n if (isProductionMode()) {\n return {};\n }\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n entry = JSON.parse(data);\n }\n\n if (!entry) {\n return {};\n }\n\n // Merge companion markdown and richtext files into fields\n const collectionType = entry?.sys?.type;\n if (typeof collectionType === 'string' && entry.fields) {\n const companionPaths = companionMarkdownPathsForEntry(fileName, collectionType, config.collections);\n for (const [fieldName, mdPath] of Object.entries(companionPaths)) {\n entry.fields[fieldName] = await readCompanionMarkdownContent(mdPath);\n }\n const richTextPaths = companionRichTextPathsForEntry(fileName, collectionType, config.collections);\n for (const [fieldName, mdxPath] of Object.entries(richTextPaths)) {\n entry.fields[fieldName] = await readCompanionMarkdownContent(mdxPath);\n }\n }\n\n return entry;\n } catch (e) {\n throw new Error('Failed to get file');\n }\n};\n\n/** Read a companion markdown file as a string. Returns `\"\"` if the file does not exist. */\nasync function readCompanionMarkdownContent(filePath: string): Promise<string> {\n if (isProductionMode()) {\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const result = await getGitHubFile(filePath, activeBranch);\n return result?.content ?? '';\n } catch {\n return '';\n }\n }\n\n try {\n return await fsPromises.readFile(path.join(/*turbopackIgnore: true*/ process.cwd(), filePath), {\n encoding: 'utf8',\n });\n } catch {\n return '';\n }\n}\n\nexport const saveFile = async (\n formData: any,\n fileName: string,\n options?: { skipStatusTransition?: boolean },\n): Promise<SaveFileResult> => {\n const config = getConfig();\n try {\n let payload = formData;\n const entryType = payload?.sys?.type;\n const rawFields = payload?.fields;\n if (typeof entryType === 'string' && rawFields && typeof rawFields === 'object' && !Array.isArray(rawFields)) {\n const strFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(rawFields)) {\n if (v == null) {\n strFields[k] = '';\n } else if (typeof v === 'object') {\n strFields[k] = JSON.stringify(v);\n } else {\n strFields[k] = String(v);\n }\n }\n const validated = validateEntryFields(entryType, strFields);\n if (!validated.ok) {\n const first = Object.values(validated.fieldErrors)[0];\n return {\n success: false,\n error: first || 'Validation failed',\n fieldErrors: validated.fieldErrors,\n };\n }\n\n const mediaTitles = await assertImageFieldsReferenceMediaWithTitle(entryType, strFields);\n if (!mediaTitles.ok) {\n return {\n success: false,\n error: mediaTitles.message,\n fieldErrors: { [mediaTitles.fieldKey]: mediaTitles.message },\n };\n }\n\n payload = {\n ...payload,\n fields: persistedFieldsFromFormStrings(entryType, strFields),\n };\n\n const slugUnique = await assertSlugFieldsUnique(entryType, fileName, payload.fields);\n if (!slugUnique.ok) {\n return {\n success: false,\n error: slugUnique.message,\n fieldErrors: { [slugUnique.fieldKey]: slugUnique.message },\n };\n }\n }\n\n // New entries start as draft (hidden from `query()`). First successful save promotes to `changed`\n // so they become eligible for public pages once the workspace branch is published from the header.\n if (!options?.skipStatusTransition && payload?.sys?.status === 'draft') {\n payload = { ...payload, sys: { ...payload.sys, status: 'changed' } };\n }\n\n // Auto-transition published/merged → changed on regular save (not on explicit publish)\n if (!options?.skipStatusTransition && (payload?.sys?.status === 'published' || payload?.sys?.status === 'merged')) {\n payload = { ...payload, sys: { ...payload.sys, status: 'changed' } };\n }\n\n // Extract markdown and richtext fields into companion files, remove from JSON payload\n const markdownContents: Record<string, string> = {};\n if (typeof entryType === 'string' && payload.fields) {\n const companionPaths = companionMarkdownPathsForEntry(fileName, entryType, config.collections);\n for (const [fieldName] of Object.entries(companionPaths)) {\n markdownContents[fieldName] = payload.fields[fieldName] ?? '';\n delete payload.fields[fieldName];\n }\n const richTextPaths = companionRichTextPathsForEntry(fileName, entryType, config.collections);\n for (const [fieldName] of Object.entries(richTextPaths)) {\n markdownContents[fieldName] = payload.fields[fieldName] ?? '';\n delete payload.fields[fieldName];\n }\n }\n\n const data = JSON.stringify(payload, null, 2);\n const normalizedData = `${data}\\n`;\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const entryTypeLabel = payload?.sys?.type || 'content';\n const entryId = payload?.sys?.id || '';\n const message = `Update ${entryTypeLabel} ${entryId}`;\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n // Use cached SHA from the store to skip the pre-read API call\n const cachedSha = (await getStoredFileSha(fileName, activeBranch)) || undefined;\n await saveGitHubFile(fileName, normalizedData, message, activeBranch, cachedSha);\n // Write companion markdown and richtext files\n const mdPaths =\n typeof entryType === 'string' ? companionMarkdownPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n const mdContent = markdownContents[fieldName] ?? '';\n await saveGitHubFile(mdPath, mdContent, `Update ${fieldName} for ${entryType} ${entryId}`, activeBranch);\n }\n const rtPaths =\n typeof entryType === 'string' ? companionRichTextPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n const rtContent = markdownContents[fieldName] ?? '';\n await saveGitHubFile(rtPath, rtContent, `Update ${fieldName} for ${entryType} ${entryId}`, activeBranch);\n }\n await waitForPublicReadConsistency(fileName, normalizedData);\n\n // Write-through: update in-memory store so subsequent reads are instant\n if (activeBranch) {\n applyMutation(activeBranch, {\n type: 'upsert',\n path: fileName,\n content: payload,\n sha: '', // SHA unknown after single-file commit; next tree fetch will correct it\n companions: markdownContents,\n });\n }\n\n await persistBranchHistoryEntryIfNeeded(activeBranch, fileName);\n await syncEmbeddingsForUpsertIfEnabled(fileName, payload, markdownContents, activeBranch, true);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n }\n\n const cookieStore = await cookies();\n const activeBranchDev = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n await fsPromises.writeFile(filePath, normalizedData, 'utf8');\n // Write companion markdown and richtext files\n const mdPaths =\n typeof entryType === 'string' ? companionMarkdownPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n const mdContent = markdownContents[fieldName] ?? '';\n await fsPromises.writeFile(path.join(/*turbopackIgnore: true*/ process.cwd(), mdPath), mdContent, 'utf8');\n }\n const rtPathsDev =\n typeof entryType === 'string' ? companionRichTextPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, rtPath] of Object.entries(rtPathsDev)) {\n const rtContent = markdownContents[fieldName] ?? '';\n await fsPromises.writeFile(path.join(/*turbopackIgnore: true*/ process.cwd(), rtPath), rtContent, 'utf8');\n }\n await persistBranchHistoryEntryIfNeeded(activeBranchDev, fileName);\n await syncEmbeddingsForUpsertIfEnabled(fileName, payload, markdownContents, activeBranchDev, false);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n } catch (e) {\n return actionErr(new Error(`Failed to save file: ${getErrorMessage(e)}`));\n }\n};\n\nexport const newFile = async (type: string): Promise<NewFileResult> => {\n const config = getConfig();\n try {\n const id = crypto.randomUUID();\n const values = {\n sys: {\n id,\n type,\n status: 'draft' as const,\n },\n fields: initialFieldsForNewEntry(type),\n };\n const data = JSON.stringify(values, null, 2);\n const file = `${config.contentFolder}/${type}/${type}-${id}.json`;\n const normalizedData = `${data}\\n`;\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n await saveGitHubFile(file, normalizedData, `Create new ${type} ${id}`, activeBranch);\n await waitForPublicReadConsistency(file, normalizedData);\n\n // Write-through: add new entry to in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, {\n type: 'upsert',\n path: file,\n content: values,\n sha: '',\n });\n }\n\n await persistBranchHistoryEntryIfNeeded(activeBranch, file);\n await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranch, true);\n const built = await buildJsons(file);\n\n return built.success ? { success: true, path: file } : { success: false, error: built.error };\n }\n\n const cookieStore = await cookies();\n const activeBranchDev = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), file);\n await fsPromises.writeFile(filePath, normalizedData, 'utf8');\n await persistBranchHistoryEntryIfNeeded(activeBranchDev, file);\n await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranchDev, false);\n const built = await buildJsons(file);\n\n return built.success ? { success: true, path: file } : { success: false, error: built.error };\n } catch (e) {\n return { success: false, error: getErrorMessage(e) } satisfies NewFileResult;\n }\n};\n\nexport const removeFile = async (fileName: string): Promise<ActionResult> => {\n const config = getConfig();\n try {\n let collectionType: string | undefined;\n try {\n const existing = await getFile(fileName);\n collectionType = existing?.sys?.type;\n } catch {\n /* best-effort */\n }\n\n // Determine companion markdown and richtext files to delete\n const companionPaths =\n typeof collectionType === 'string'\n ? [\n ...Object.values(companionMarkdownPathsForEntry(fileName, collectionType, config.collections)),\n ...Object.values(companionRichTextPathsForEntry(fileName, collectionType, config.collections)),\n ]\n : [];\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n await deleteGitHubFile(fileName, `Remove ${fileName}`, activeBranch);\n for (const mdPath of companionPaths) {\n try {\n await deleteGitHubFile(mdPath, `Remove companion ${mdPath}`, activeBranch);\n } catch {\n /* best-effort — companion may not exist */\n }\n }\n\n // Write-through: remove entry from in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'delete', path: fileName });\n }\n\n await syncEmbeddingsForRemoveIfEnabled(fileName, activeBranch, true);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n }\n\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n await fsPromises.unlink(filePath);\n for (const mdPath of companionPaths) {\n try {\n await fsPromises.unlink(path.join(/*turbopackIgnore: true*/ process.cwd(), mdPath));\n } catch {\n /* best-effort — companion may not exist */\n }\n }\n await syncEmbeddingsForRemoveIfEnabled(fileName, undefined, false);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":"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","names":["listed","mdPaths","built"]}
1
+ {"version":3,"sources":["../../../admin/actions/files.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { cookies } from 'next/headers';\n\nimport { getConfig } from '../../lib/configStore';\nimport { getAgentConfig } from '../../agent/configStore';\nimport { syncEmbeddingsAfterRemove, syncEmbeddingsAfterUpsert } from '../../agent/embeddingsHook';\nimport { BRANCH_HISTORY_FILE_PATH, mergeHistoryContentWithAppendedEntry } from '../../lib/branchHistory';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { initialFieldsForNewEntry } from '../../lib/initialEntryFields';\nimport { persistedFieldsFromFormStrings } from '../../lib/persistedFormFields';\nimport { normalizeStoredSlug } from '../../lib/slugField';\nimport { validateEntryFields } from '../../lib/validateEntryFields';\nimport type { Config } from '../types';\n\nimport {\n deleteGitHubFile,\n getGitHubFile,\n isProductionMode,\n listGitHubFiles,\n listGitHubFilesRecursive,\n readGitHubFilePublic,\n saveGitHubFile,\n} from '../github';\nimport { applyMutation, getStoredContentFiles, getStoredFile, getStoredFileSha } from '../store/contentStore';\nimport { mediaContentFolder, mediaEntryPath } from '../../lib/mediaPath';\nimport { buildJsons } from './build';\nimport {\n actionErr,\n actionOk,\n getErrorMessage,\n type ActionResult,\n type NewFileResult,\n type SaveFileResult,\n} from './utils';\n\nexport type { SaveFileResult } from './utils';\n\nconst CMS_ACTIVE_BRANCH_COOKIE = 'cms-active-branch';\n\nfunction normalizeContentPath(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\n/** Best-effort embedding store sync after content writes. No-op when the agent isn't configured. */\nasync function syncEmbeddingsForUpsertIfEnabled(\n entryPath: string,\n payload: { sys?: { type?: string }; fields?: Record<string, unknown> },\n companions: Record<string, string>,\n branch: string | undefined,\n isProduction: boolean,\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const config = getConfig();\n await syncEmbeddingsAfterUpsert({ agentConfig, config, entryPath, payload, companions, branch, isProduction });\n}\n\nasync function syncEmbeddingsForRemoveIfEnabled(\n entryPath: string,\n branch: string | undefined,\n isProduction: boolean,\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n await syncEmbeddingsAfterRemove({ agentConfig, entryPath, branch, isProduction });\n}\n\n/** Records the entry path under the active branch in `cms/branch-history.json` (GitHub or local). Best-effort. */\nasync function persistBranchHistoryEntryIfNeeded(activeBranch: string | undefined, entryPath: string): Promise<void> {\n if (!activeBranch) {\n return;\n }\n\n const normalized = normalizeContentPath(entryPath);\n\n if (isProductionMode()) {\n try {\n const historyFile = await getGitHubFile(BRANCH_HISTORY_FILE_PATH, activeBranch);\n const next = mergeHistoryContentWithAppendedEntry(historyFile?.content ?? '', activeBranch, normalized);\n if (next == null) {\n return;\n }\n\n await saveGitHubFile(BRANCH_HISTORY_FILE_PATH, next, 'CMS: track entry in branch history', activeBranch);\n } catch {\n /* best-effort sidecar — primary save must still succeed */\n }\n\n return;\n }\n\n try {\n const abs = path.join(/*turbopackIgnore: true*/ process.cwd(), BRANCH_HISTORY_FILE_PATH);\n let raw = '';\n try {\n raw = await fsPromises.readFile(abs, { encoding: 'utf8' });\n } catch {\n raw = '';\n }\n\n const next = mergeHistoryContentWithAppendedEntry(raw, activeBranch, normalized);\n if (next == null) {\n return;\n }\n\n await fsPromises.mkdir(path.dirname(abs), { recursive: true });\n await fsPromises.writeFile(abs, next, 'utf8');\n } catch {\n /* best-effort sidecar */\n }\n}\n\nasync function assertSlugFieldsUnique(\n entryType: string,\n fileName: string,\n persistedFields: Record<string, unknown>,\n): Promise<{ ok: true } | { ok: false; fieldKey: string; message: string }> {\n const config = getConfig();\n const col = config.collections[entryType as keyof Config['collections']];\n if (!col) {\n return { ok: true };\n }\n\n const slugFieldEntries = Object.entries(col.fields).filter(([, def]) => def.format === 'slug');\n if (slugFieldEntries.length === 0) {\n return { ok: true };\n }\n\n const selfPath = normalizeContentPath(fileName);\n const siblings = await getContentFiles(entryType);\n if (!Array.isArray(siblings)) {\n return { ok: true };\n }\n\n for (const [slugKey] of slugFieldEntries) {\n const candidate = persistedFields[slugKey];\n if (typeof candidate !== 'string' || !candidate.trim()) {\n continue;\n }\n const normCandidate = normalizeStoredSlug(candidate);\n if (!normCandidate) {\n continue;\n }\n\n for (const siblingPath of siblings) {\n if (normalizeContentPath(siblingPath) === selfPath) {\n continue;\n }\n let data: unknown;\n try {\n data = await getFile(siblingPath);\n } catch {\n continue;\n }\n if (!data || typeof data !== 'object') {\n continue;\n }\n const fields = (data as { fields?: Record<string, unknown> }).fields;\n if (!fields) {\n continue;\n }\n const other = fields[slugKey];\n if (typeof other !== 'string' || !other.trim()) {\n continue;\n }\n if (normalizeStoredSlug(other) === normCandidate) {\n return {\n ok: false,\n fieldKey: slugKey,\n message: `Another ${col.label} already uses this slug. Choose a different value.`,\n };\n }\n }\n }\n\n return { ok: true };\n}\n\nconst MEDIA_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nasync function assertImageFieldsReferenceMediaWithTitle(\n entryType: string,\n strFields: Record<string, string>,\n): Promise<{ ok: true } | { ok: false; fieldKey: string; message: string }> {\n const config = getConfig();\n const col = config.collections[entryType as keyof Config['collections']];\n if (!col) {\n return { ok: true };\n }\n\n for (const [key, def] of Object.entries(col.fields)) {\n if (def.format !== 'image') {\n continue;\n }\n const raw = (strFields[key] ?? '').trim();\n if (!raw || raw.startsWith('/')) {\n continue;\n }\n if (!MEDIA_UUID_RE.test(raw)) {\n continue;\n }\n\n const mediaPath = mediaEntryPath(raw);\n let media: unknown;\n try {\n media = await getFile(mediaPath);\n } catch {\n return {\n ok: false,\n fieldKey: key,\n message: `Media not found for ${def.label}. Choose a valid image in the Media library.`,\n };\n }\n\n const title = (media as { fields?: { title?: unknown } })?.fields?.title;\n if (typeof title !== 'string' || !title.trim()) {\n return {\n ok: false,\n fieldKey: key,\n message: `Selected image is missing a required Title; fix it in the Media library.`,\n };\n }\n }\n\n return { ok: true };\n}\n\n/**\n * In production, reject writes that would target `config.git.baseBranch` (no feature branch cookie).\n */\nexport const assertFeatureBranchForWritesIfRequired = async (): Promise<void> => {\n if (!isProductionMode()) {\n return;\n }\n\n if (!(await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value) {\n throw new Error('Create or select a branch before editing.');\n }\n};\n\nexport const waitForPublicReadConsistency = async (fileName: string, expectedContent: string, readRef?: string) => {\n if (!isProductionMode()) {\n return;\n }\n\n const parsedAttempts = Number.parseInt(process.env.CMS_GITHUB_CONSISTENCY_ATTEMPTS || '8', 10);\n const parsedDelayMs = Number.parseInt(process.env.CMS_GITHUB_CONSISTENCY_DELAY_MS || '250', 10);\n const maxAttempts = Number.isFinite(parsedAttempts) && parsedAttempts > 0 ? parsedAttempts : 1;\n const delayMs = Number.isFinite(parsedDelayMs) && parsedDelayMs >= 0 ? parsedDelayMs : 250;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const visibleContent = await readGitHubFilePublic(fileName, readRef);\n\n if (visibleContent === expectedContent) {\n return;\n }\n } catch (_e) {\n // Ignore transient read failures and retry within the same save request.\n }\n\n if (attempt < maxAttempts && delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n};\n\nexport const getContentFiles = async (collection: string = '**') => {\n const config = getConfig();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n // Try in-memory store first (instant)\n try {\n const stored = await getStoredContentFiles(collection, activeBranch);\n if (stored) return stored;\n } catch {\n // Store unavailable — fall through to direct GitHub API\n }\n\n try {\n if (collection === '**') {\n const listed = await listGitHubFilesRecursive(config.contentFolder, '.json', activeBranch);\n return Array.isArray(listed) ? listed : [];\n }\n\n const listed = await listGitHubFiles(`${config.contentFolder}/${collection}`, '.json', activeBranch);\n return Array.isArray(listed) ? listed : [];\n } catch (e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${config.contentFolder}/${collection}/*.json`);\n return files || [];\n } catch (e) {\n return [];\n }\n};\n\n/**\n * List media-entry JSON files (e.g. `cms/media/media-<uuid>.json`).\n *\n * Distinct from `getContentFiles`, which lists editorial content under\n * `config.contentFolder`, and from `getMediaFiles`, which lists physical image\n * binaries under `config.mediaFolder`. This is the JSON-entry layer.\n */\nexport const getMediaContentFiles = async (): Promise<string[]> => {\n const folder = mediaContentFolder();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n try {\n return await listGitHubFiles(folder, '.json', activeBranch);\n } catch (_e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${folder}/*.json`);\n return files || [];\n } catch (_e) {\n return [];\n }\n};\n\nexport const getMediaFiles = async (folder: string = '**') => {\n const config = getConfig();\n try {\n if (isProductionMode()) {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n try {\n const dir = folder === '**' ? config.mediaFolder : `${config.mediaFolder}/${folder}`;\n const allFiles = await listGitHubFilesRecursive(dir, undefined, activeBranch);\n const extensions = config.mediaAllowedFormats;\n return allFiles.filter((f) => extensions.some((ext) => f.endsWith(`.${ext}`)));\n } catch (e) {\n // Fall back to local files if GitHub API access is not available.\n }\n }\n\n const files = await glob(`${config.mediaFolder}/${folder}/*.{${config.mediaAllowedFormats.join(',')}}`);\n return files || [];\n } catch (e) {\n return [];\n }\n};\n\nexport const getFile = async (fileName: string) => {\n const config = getConfig();\n try {\n let entry: any;\n\n if (isProductionMode()) {\n // Try in-memory store first (instant, includes pre-merged companions)\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const stored = await getStoredFile(fileName, activeBranch);\n\n if (stored) {\n entry = structuredClone(stored.content);\n // Merge pre-cached companion markdown into fields\n if (entry.fields) {\n for (const [fieldName, mdContent] of Object.entries(stored.companionMarkdown)) {\n entry.fields[fieldName] = mdContent;\n }\n }\n return entry;\n }\n } catch {\n // Store unavailable — fall through to direct GitHub API\n }\n\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const result = await getGitHubFile(fileName, activeBranch);\n\n if (result) {\n entry = JSON.parse(result.content);\n }\n } catch (e) {\n // Fall back to local file if GitHub API access is not available.\n }\n\n // Cold serverless instance: content store is empty. `getGitHubFile` may return null\n // (404 race) or throw before `readGitHubFilePublic`'s multi-client retry path runs.\n // Never fall through to `fs.readFile` on deploy — the repo is not on disk (ENOENT → 500).\n if (!entry) {\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const raw = await readGitHubFilePublic(fileName, activeBranch);\n if (raw) {\n entry = JSON.parse(raw);\n }\n } catch {\n /* best-effort */\n }\n }\n }\n\n if (!entry) {\n if (isProductionMode()) {\n return {};\n }\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n entry = JSON.parse(data);\n }\n\n if (!entry) {\n return {};\n }\n\n // Merge companion markdown and richtext files into fields\n const collectionType = entry?.sys?.type;\n if (typeof collectionType === 'string' && entry.fields) {\n const companionPaths = companionMarkdownPathsForEntry(fileName, collectionType, config.collections);\n for (const [fieldName, mdPath] of Object.entries(companionPaths)) {\n entry.fields[fieldName] = await readCompanionMarkdownContent(mdPath);\n }\n const richTextPaths = companionRichTextPathsForEntry(fileName, collectionType, config.collections);\n for (const [fieldName, mdxPath] of Object.entries(richTextPaths)) {\n entry.fields[fieldName] = await readCompanionMarkdownContent(mdxPath);\n }\n }\n\n return entry;\n } catch (e) {\n throw new Error('Failed to get file');\n }\n};\n\n/** Read a companion markdown file as a string. Returns `\"\"` if the file does not exist. */\nasync function readCompanionMarkdownContent(filePath: string): Promise<string> {\n if (isProductionMode()) {\n try {\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const result = await getGitHubFile(filePath, activeBranch);\n return result?.content ?? '';\n } catch {\n return '';\n }\n }\n\n try {\n return await fsPromises.readFile(path.join(/*turbopackIgnore: true*/ process.cwd(), filePath), {\n encoding: 'utf8',\n });\n } catch {\n return '';\n }\n}\n\nexport const saveFile = async (\n formData: any,\n fileName: string,\n options?: { skipStatusTransition?: boolean },\n): Promise<SaveFileResult> => {\n const config = getConfig();\n try {\n let payload = formData;\n const entryType = payload?.sys?.type;\n const rawFields = payload?.fields;\n if (typeof entryType === 'string' && rawFields && typeof rawFields === 'object' && !Array.isArray(rawFields)) {\n const strFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(rawFields)) {\n if (v == null) {\n strFields[k] = '';\n } else if (typeof v === 'object') {\n strFields[k] = JSON.stringify(v);\n } else {\n strFields[k] = String(v);\n }\n }\n const validated = validateEntryFields(entryType, strFields);\n if (!validated.ok) {\n const first = Object.values(validated.fieldErrors)[0];\n return {\n success: false,\n error: first || 'Validation failed',\n fieldErrors: validated.fieldErrors,\n };\n }\n\n const mediaTitles = await assertImageFieldsReferenceMediaWithTitle(entryType, strFields);\n if (!mediaTitles.ok) {\n return {\n success: false,\n error: mediaTitles.message,\n fieldErrors: { [mediaTitles.fieldKey]: mediaTitles.message },\n };\n }\n\n payload = {\n ...payload,\n fields: persistedFieldsFromFormStrings(entryType, strFields),\n };\n\n const slugUnique = await assertSlugFieldsUnique(entryType, fileName, payload.fields);\n if (!slugUnique.ok) {\n return {\n success: false,\n error: slugUnique.message,\n fieldErrors: { [slugUnique.fieldKey]: slugUnique.message },\n };\n }\n }\n\n // New entries start as draft (hidden from `query()`). First successful save promotes to `changed`\n // so they become eligible for public pages once the workspace branch is published from the header.\n if (!options?.skipStatusTransition && payload?.sys?.status === 'draft') {\n payload = { ...payload, sys: { ...payload.sys, status: 'changed' } };\n }\n\n // Auto-transition published/merged → changed on regular save (not on explicit publish)\n if (!options?.skipStatusTransition && (payload?.sys?.status === 'published' || payload?.sys?.status === 'merged')) {\n payload = { ...payload, sys: { ...payload.sys, status: 'changed' } };\n }\n\n // Extract markdown and richtext fields into companion files, remove from JSON payload\n const markdownContents: Record<string, string> = {};\n if (typeof entryType === 'string' && payload.fields) {\n const companionPaths = companionMarkdownPathsForEntry(fileName, entryType, config.collections);\n for (const [fieldName] of Object.entries(companionPaths)) {\n markdownContents[fieldName] = payload.fields[fieldName] ?? '';\n delete payload.fields[fieldName];\n }\n const richTextPaths = companionRichTextPathsForEntry(fileName, entryType, config.collections);\n for (const [fieldName] of Object.entries(richTextPaths)) {\n markdownContents[fieldName] = payload.fields[fieldName] ?? '';\n delete payload.fields[fieldName];\n }\n }\n\n const data = JSON.stringify(payload, null, 2);\n const normalizedData = `${data}\\n`;\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const entryTypeLabel = payload?.sys?.type || 'content';\n const entryId = payload?.sys?.id || '';\n const message = `Update ${entryTypeLabel} ${entryId}`;\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n\n // Use cached SHA from the store to skip the pre-read API call\n const cachedSha = (await getStoredFileSha(fileName, activeBranch)) || undefined;\n await saveGitHubFile(fileName, normalizedData, message, activeBranch, cachedSha);\n // Write companion markdown and richtext files\n const mdPaths =\n typeof entryType === 'string' ? companionMarkdownPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n const mdContent = markdownContents[fieldName] ?? '';\n await saveGitHubFile(mdPath, mdContent, `Update ${fieldName} for ${entryType} ${entryId}`, activeBranch);\n }\n const rtPaths =\n typeof entryType === 'string' ? companionRichTextPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n const rtContent = markdownContents[fieldName] ?? '';\n await saveGitHubFile(rtPath, rtContent, `Update ${fieldName} for ${entryType} ${entryId}`, activeBranch);\n }\n await waitForPublicReadConsistency(fileName, normalizedData);\n\n // Write-through: update in-memory store so subsequent reads are instant\n if (activeBranch) {\n applyMutation(activeBranch, {\n type: 'upsert',\n path: fileName,\n content: payload,\n sha: '', // SHA unknown after single-file commit; next tree fetch will correct it\n companions: markdownContents,\n });\n }\n\n await persistBranchHistoryEntryIfNeeded(activeBranch, fileName);\n await syncEmbeddingsForUpsertIfEnabled(fileName, payload, markdownContents, activeBranch, true);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n }\n\n const cookieStore = await cookies();\n const activeBranchDev = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n await fsPromises.writeFile(filePath, normalizedData, 'utf8');\n // Write companion markdown and richtext files\n const mdPaths =\n typeof entryType === 'string' ? companionMarkdownPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n const mdContent = markdownContents[fieldName] ?? '';\n await fsPromises.writeFile(path.join(/*turbopackIgnore: true*/ process.cwd(), mdPath), mdContent, 'utf8');\n }\n const rtPathsDev =\n typeof entryType === 'string' ? companionRichTextPathsForEntry(fileName, entryType, config.collections) : {};\n for (const [fieldName, rtPath] of Object.entries(rtPathsDev)) {\n const rtContent = markdownContents[fieldName] ?? '';\n await fsPromises.writeFile(path.join(/*turbopackIgnore: true*/ process.cwd(), rtPath), rtContent, 'utf8');\n }\n await persistBranchHistoryEntryIfNeeded(activeBranchDev, fileName);\n await syncEmbeddingsForUpsertIfEnabled(fileName, payload, markdownContents, activeBranchDev, false);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n } catch (e) {\n return actionErr(new Error(`Failed to save file: ${getErrorMessage(e)}`));\n }\n};\n\nexport const newFile = async (type: string): Promise<NewFileResult> => {\n const config = getConfig();\n try {\n const id = crypto.randomUUID();\n const values = {\n sys: {\n id,\n type,\n status: 'draft' as const,\n },\n fields: initialFieldsForNewEntry(type),\n };\n const data = JSON.stringify(values, null, 2);\n const file = `${config.contentFolder}/${type}/${type}-${id}.json`;\n const normalizedData = `${data}\\n`;\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n await saveGitHubFile(file, normalizedData, `Create new ${type} ${id}`, activeBranch);\n await waitForPublicReadConsistency(file, normalizedData);\n\n // Write-through: add new entry to in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, {\n type: 'upsert',\n path: file,\n content: values,\n sha: '',\n });\n }\n\n await persistBranchHistoryEntryIfNeeded(activeBranch, file);\n await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranch, true);\n const built = await buildJsons(file);\n\n return built.success ? { success: true, path: file } : { success: false, error: built.error };\n }\n\n const cookieStore = await cookies();\n const activeBranchDev = cookieStore.get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), file);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, normalizedData, 'utf8');\n await persistBranchHistoryEntryIfNeeded(activeBranchDev, file);\n await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranchDev, false);\n const built = await buildJsons(file);\n\n return built.success ? { success: true, path: file } : { success: false, error: built.error };\n } catch (e) {\n return { success: false, error: getErrorMessage(e) } satisfies NewFileResult;\n }\n};\n\nexport const removeFile = async (fileName: string): Promise<ActionResult> => {\n const config = getConfig();\n try {\n let collectionType: string | undefined;\n try {\n const existing = await getFile(fileName);\n collectionType = existing?.sys?.type;\n } catch {\n /* best-effort */\n }\n\n // Determine companion markdown and richtext files to delete\n const companionPaths =\n typeof collectionType === 'string'\n ? [\n ...Object.values(companionMarkdownPathsForEntry(fileName, collectionType, config.collections)),\n ...Object.values(companionRichTextPathsForEntry(fileName, collectionType, config.collections)),\n ]\n : [];\n\n if (isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get(CMS_ACTIVE_BRANCH_COOKIE)?.value;\n await deleteGitHubFile(fileName, `Remove ${fileName}`, activeBranch);\n for (const mdPath of companionPaths) {\n try {\n await deleteGitHubFile(mdPath, `Remove companion ${mdPath}`, activeBranch);\n } catch {\n /* best-effort — companion may not exist */\n }\n }\n\n // Write-through: remove entry from in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'delete', path: fileName });\n }\n\n await syncEmbeddingsForRemoveIfEnabled(fileName, activeBranch, true);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n }\n\n const filePath = path.join(/*turbopackIgnore: true*/ process.cwd(), fileName);\n await fsPromises.unlink(filePath);\n for (const mdPath of companionPaths) {\n try {\n await fsPromises.unlink(path.join(/*turbopackIgnore: true*/ process.cwd(), mdPath));\n } catch {\n /* best-effort — companion may not exist */\n }\n }\n await syncEmbeddingsForRemoveIfEnabled(fileName, undefined, false);\n const built = await buildJsons(fileName);\n\n return built.success ? actionOk() : built;\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":"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","names":["listed","mdPaths","built"]}
@@ -3446,6 +3446,7 @@ var init_files = __esm({
3446
3446
  process.cwd(),
3447
3447
  file
3448
3448
  );
3449
+ await import_promises.default.mkdir(import_path4.default.dirname(filePath), { recursive: true });
3449
3450
  await import_promises.default.writeFile(filePath, normalizedData, "utf8");
3450
3451
  await persistBranchHistoryEntryIfNeeded(activeBranchDev, file);
3451
3452
  await syncEmbeddingsForUpsertIfEnabled(file, values, {}, activeBranchDev, false);