{"version":3,"file":"analogjs-content-resources.mjs","sources":["../../../../packages/content/resources/src/content-files-resource.ts","../../../../packages/content/resources/src/content-file-resource.ts","../../../../packages/content/resources/src/analogjs-content-resources.ts"],"sourcesContent":["import { resource } from '@angular/core';\nimport {\n  injectContentListLoader,\n  InjectContentFilesFilterFunction,\n  filterByLocale,\n  injectContentLocale,\n} from '@analogjs/content';\n\nexport function contentFilesResource<Attributes extends Record<string, any>>(\n  filterFn?: InjectContentFilesFilterFunction<Attributes> | undefined,\n) {\n  const contentListLoader = injectContentListLoader<Attributes>();\n  const locale = injectContentLocale();\n  const contentList = contentListLoader().then((items) => {\n    let results = locale ? filterByLocale(items, locale) : items;\n    if (filterFn) {\n      results = results.filter(filterFn);\n    }\n    return results;\n  });\n\n  return resource({\n    loader: () => contentList,\n  });\n}\n","import { computed, inject, resource, Signal } from '@angular/core';\nimport {\n  ContentFile,\n  ContentRenderer,\n  parseRawContentFile,\n  injectContentFileLoader,\n  injectContentLocale,\n} from '@analogjs/content';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { from } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\ntype ContentFileParams = Signal<\n  | string\n  | {\n      customFilename: string;\n    }\n>;\n\nasync function getContentFile<\n  Attributes extends Record<string, any> = Record<string, any>,\n>(\n  contentFiles: Record<string, () => Promise<string>>,\n  slug: string,\n  fallback: string,\n  locale?: string | null,\n): Promise<ContentFile<Attributes | Record<string, never>>> {\n  // Normalize file keys so both \"/src/content/...\" and \"/<project>/src/content/...\" resolve.\n  // This mirrors normalization used elsewhere in the content pipeline.\n  const normalizedFiles: Record<string, () => Promise<string>> = {};\n  const stemToKey: Record<string, string> = {};\n  for (const [key, resolver] of Object.entries(contentFiles)) {\n    const normalizedKey = key\n      // replace any prefix up to the content directory with /src/content\n      // use a non-greedy match so nested paths containing \"/content\" are preserved\n      .replace(/^(?:.*?)\\/content(?=\\/)/, '/src/content')\n      // normalize duplicate slashes\n      .replace(/\\/{2,}/g, '/');\n    normalizedFiles[normalizedKey] = resolver;\n    // Index by bare filename stem so slug-only lookups work\n    const stem = normalizedKey\n      .split('/')\n      .pop()\n      ?.replace(/\\.[^.]+$/, '');\n    if (stem && !stemToKey[stem]) {\n      stemToKey[stem] = normalizedKey;\n    }\n  }\n\n  // Try direct file first, then directory index variants, then bare slug via stem\n  const base = `/src/content/${slug}`.replace(/\\/{2,}/g, '/');\n  const candidates = [\n    `${base}.md`,\n    `${base}.agx`,\n    `${base}/index.md`,\n    `${base}/index.agx`,\n  ];\n\n  // Try locale-prefixed paths first, then fall back to unprefixed, then bare slug via stem\n  const localeCandidates = locale\n    ? candidates.map((c) =>\n        c.replace('/src/content/', `/src/content/${locale}/`),\n      )\n    : [];\n  const allCandidates = [...localeCandidates, ...candidates];\n  const matchKey =\n    allCandidates.find((k) => k in normalizedFiles) ?? stemToKey[slug];\n  const contentFile = matchKey ? normalizedFiles[matchKey] : undefined;\n\n  if (!contentFile) {\n    return {\n      filename: base,\n      attributes: {},\n      slug: '',\n      content: fallback,\n    } as ContentFile<Attributes | Record<string, never>>;\n  }\n\n  const resolvedBase = matchKey!.replace(/\\.(md|agx)$/, '');\n\n  return contentFile().then(\n    (contentFile: string | { default: any; metadata: any }) => {\n      if (typeof contentFile === 'string') {\n        const { content, attributes } =\n          parseRawContentFile<Attributes>(contentFile);\n\n        return {\n          filename: resolvedBase,\n          slug,\n          attributes,\n          content,\n        } as ContentFile<Attributes | Record<string, never>>;\n      }\n\n      return {\n        filename: resolvedBase,\n        slug,\n        attributes: contentFile.metadata,\n        content: contentFile.default,\n      } as ContentFile<Attributes | Record<string, never>>;\n    },\n  );\n}\n\n/**\n * Resource for requesting an individual content file\n *\n * @param params\n * @param fallback\n * @returns\n */\nexport function contentFileResource<\n  Attributes extends Record<string, any> = Record<string, any>,\n>(params?: ContentFileParams, fallback = 'No Content Found') {\n  const loaderPromise = injectContentFileLoader();\n  const contentRenderer = inject(ContentRenderer);\n  const locale = injectContentLocale();\n  const contentFilesMap = toSignal(from(loaderPromise()));\n  const input =\n    params ||\n    toSignal(\n      inject(ActivatedRoute).paramMap.pipe(\n        map((params) => params.get('slug') as string),\n      ),\n      { requireSync: true },\n    );\n\n  return resource({\n    params: computed(() => ({ input: input(), files: contentFilesMap() })),\n    loader: async ({ params }) => {\n      const { input: param, files } = params;\n\n      if (typeof param === 'string') {\n        if (param) {\n          const file = await getContentFile<Attributes>(\n            files!,\n            param,\n            fallback,\n            locale,\n          );\n          if (typeof file.content === 'string') {\n            const rendered = (await contentRenderer.render(file.content)) as {\n              toc?: Array<{ id: string; level: number; text: string }>;\n            };\n            return {\n              ...file,\n              toc: rendered.toc ?? [],\n            };\n          }\n          return {\n            ...file,\n            toc: [],\n          };\n        }\n\n        return {\n          filename: '',\n          slug: '',\n          attributes: {},\n          content: fallback,\n          toc: [],\n        } as ContentFile<Attributes | Record<string, never>>;\n      } else {\n        const file = await getContentFile<Attributes>(\n          files!,\n          param.customFilename,\n          fallback,\n          locale,\n        );\n        if (typeof file.content === 'string') {\n          const rendered = (await contentRenderer.render(file.content)) as {\n            toc?: Array<{ id: string; level: number; text: string }>;\n          };\n          return {\n            ...file,\n            toc: rendered.toc ?? [],\n          };\n        }\n        return {\n          ...file,\n          toc: [],\n        };\n      }\n    },\n  });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}