@analogjs/content 3.0.0-alpha.20 → 3.0.0-alpha.22

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.
@@ -68,7 +68,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
68
68
  static {
69
69
  this.ɵfac = i0.ɵɵngDeclareFactory({
70
70
  minVersion: "12.0.0",
71
- version: "21.2.5",
71
+ version: "21.2.6",
72
72
  ngImport: i0,
73
73
  type: Md4xContentRendererService,
74
74
  deps: null,
@@ -78,7 +78,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
78
78
  static {
79
79
  this.ɵprov = i0.ɵɵngDeclareInjectable({
80
80
  minVersion: "12.0.0",
81
- version: "21.2.5",
81
+ version: "21.2.6",
82
82
  ngImport: i0,
83
83
  type: Md4xContentRendererService
84
84
  });
@@ -86,7 +86,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
86
86
  };
87
87
  i0.ɵɵngDeclareClassMetadata({
88
88
  minVersion: "12.0.0",
89
- version: "21.2.5",
89
+ version: "21.2.6",
90
90
  ngImport: i0,
91
91
  type: Md4xContentRendererService,
92
92
  decorators: [{ type: Injectable }]
@@ -161,7 +161,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
161
161
  static {
162
162
  this.ɵfac = i0.ɵɵngDeclareFactory({
163
163
  minVersion: "12.0.0",
164
- version: "21.2.5",
164
+ version: "21.2.6",
165
165
  ngImport: i0,
166
166
  type: Md4xWasmContentRendererService,
167
167
  deps: null,
@@ -171,7 +171,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
171
171
  static {
172
172
  this.ɵprov = i0.ɵɵngDeclareInjectable({
173
173
  minVersion: "12.0.0",
174
- version: "21.2.5",
174
+ version: "21.2.6",
175
175
  ngImport: i0,
176
176
  type: Md4xWasmContentRendererService
177
177
  });
@@ -179,7 +179,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
179
179
  };
180
180
  i0.ɵɵngDeclareClassMetadata({
181
181
  minVersion: "12.0.0",
182
- version: "21.2.5",
182
+ version: "21.2.6",
183
183
  ngImport: i0,
184
184
  type: Md4xWasmContentRendererService,
185
185
  decorators: [{ type: Injectable }]
@@ -117,7 +117,7 @@ var MdcRendererDirective = class MdcRendererDirective {
117
117
  static {
118
118
  this.ɵfac = i0.ɵɵngDeclareFactory({
119
119
  minVersion: "12.0.0",
120
- version: "21.2.5",
120
+ version: "21.2.6",
121
121
  ngImport: i0,
122
122
  type: MdcRendererDirective,
123
123
  deps: [],
@@ -127,7 +127,7 @@ var MdcRendererDirective = class MdcRendererDirective {
127
127
  static {
128
128
  this.ɵdir = i0.ɵɵngDeclareDirective({
129
129
  minVersion: "17.1.0",
130
- version: "21.2.5",
130
+ version: "21.2.6",
131
131
  type: MdcRendererDirective,
132
132
  isStandalone: true,
133
133
  selector: "[mdcAst]",
@@ -144,7 +144,7 @@ var MdcRendererDirective = class MdcRendererDirective {
144
144
  };
145
145
  i0.ɵɵngDeclareClassMetadata({
146
146
  minVersion: "12.0.0",
147
- version: "21.2.5",
147
+ version: "21.2.6",
148
148
  ngImport: i0,
149
149
  type: MdcRendererDirective,
150
150
  decorators: [{
@@ -45,7 +45,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
45
45
  static {
46
46
  this.ɵfac = i0.ɵɵngDeclareFactory({
47
47
  minVersion: "12.0.0",
48
- version: "21.2.5",
48
+ version: "21.2.6",
49
49
  ngImport: i0,
50
50
  type: PrismHighlighter,
51
51
  deps: null,
@@ -55,7 +55,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
55
55
  static {
56
56
  this.ɵprov = i0.ɵɵngDeclareInjectable({
57
57
  minVersion: "12.0.0",
58
- version: "21.2.5",
58
+ version: "21.2.6",
59
59
  ngImport: i0,
60
60
  type: PrismHighlighter
61
61
  });
@@ -63,7 +63,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
63
63
  };
64
64
  i0.ɵɵngDeclareClassMetadata({
65
65
  minVersion: "12.0.0",
66
- version: "21.2.5",
66
+ version: "21.2.6",
67
67
  ngImport: i0,
68
68
  type: PrismHighlighter,
69
69
  decorators: [{ type: Injectable }]
@@ -1 +1 @@
1
- {"version":3,"file":"analogjs-content-resources.mjs","names":[],"sources":["../../resources/src/content-files-resource.ts","../../resources/src/content-file-resource.ts"],"sourcesContent":["import { resource, ResourceRef } from '@angular/core';\nimport {\n ContentFile,\n injectContentListLoader,\n InjectContentFilesFilterFunction,\n} from '@analogjs/content';\n\nexport function contentFilesResource<Attributes extends Record<string, any>>(\n filterFn?: InjectContentFilesFilterFunction<Attributes> | undefined,\n): ResourceRef<ContentFile<Attributes>[] | undefined> {\n const contentListLoader = injectContentListLoader<Attributes>();\n const contentList = contentListLoader().then((items) =>\n filterFn ? items.filter(filterFn) : items,\n );\n\n return resource({\n loader: () => contentList,\n });\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n computed,\n inject,\n resource,\n Signal,\n type ResourceRef,\n} from '@angular/core';\nimport {\n ContentFile,\n ContentRenderer,\n FrontmatterValidationError,\n parseRawContentFile,\n parseRawContentFileAsync,\n injectContentFileLoader,\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\nexport interface ContentFileResourceResult<\n Attributes extends Record<string, any> = Record<string, any>,\n> extends ContentFile<Attributes | Record<string, never>> {\n toc: Array<{ id: string; level: number; text: string }>;\n}\n\ntype ContentFileParams = Signal<\n | string\n | {\n customFilename: string;\n }\n>;\n\nasync function validateAttributes<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n attributes: unknown,\n filename?: string,\n) {\n const result = await schema['~standard'].validate(attributes);\n if (result.issues) {\n throw new FrontmatterValidationError(result.issues, filename);\n }\n\n return result.value;\n}\n\nfunction getValidationFilename(filename: string): string {\n return filename.replace(/^\\/src\\/content\\//, '');\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 schema?: StandardSchemaV1,\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 = [`${base}.md`, `${base}/index.md`];\n\n const matchKey =\n candidates.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$/, '');\n const validationFilename = getValidationFilename(matchKey!);\n\n return contentFile().then(\n async (contentFile: string | { default: any; metadata: any }) => {\n if (typeof contentFile === 'string') {\n const { content, attributes } = schema\n ? await parseRawContentFileAsync(\n contentFile,\n schema,\n validationFilename,\n )\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 const attributes = schema\n ? await validateAttributes(\n schema,\n contentFile.metadata,\n validationFilename,\n )\n : contentFile.metadata;\n\n return {\n filename: resolvedBase,\n slug,\n attributes,\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 * @example\n * ```typescript\n * // Without schema (existing behavior)\n * const post = contentFileResource<BlogAttributes>();\n *\n * // With schema validation\n * import * as v from 'valibot';\n * const BlogSchema = v.object({\n * title: v.string(),\n * date: v.pipe(v.string(), v.isoDate()),\n * });\n * const post = contentFileResource({ schema: BlogSchema });\n * ```\n */\nexport function contentFileResource<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n params?: ContentFileParams,\n fallback?: string,\n): ResourceRef<ContentFileResourceResult<Attributes> | undefined>;\n\nexport function contentFileResource<TSchema extends StandardSchemaV1>(options: {\n params?: ContentFileParams;\n fallback?: string;\n schema: TSchema;\n}): ResourceRef<\n | ContentFileResourceResult<\n StandardSchemaV1.InferOutput<TSchema> & Record<string, any>\n >\n | undefined\n>;\n\nexport function contentFileResource(\n paramsOrOptions?:\n | ContentFileParams\n | {\n params?: ContentFileParams;\n fallback?: string;\n schema?: StandardSchemaV1;\n },\n fallbackArg = 'No Content Found',\n) {\n // Detect options-object form vs legacy positional form\n const isOptionsObject =\n paramsOrOptions &&\n typeof paramsOrOptions === 'object' &&\n !('set' in paramsOrOptions) && // not a Signal\n ('schema' in paramsOrOptions ||\n 'params' in paramsOrOptions ||\n 'fallback' in paramsOrOptions);\n\n const params: ContentFileParams | undefined = isOptionsObject\n ? (paramsOrOptions as { params?: ContentFileParams }).params\n : (paramsOrOptions as ContentFileParams | undefined);\n const fallback: string = isOptionsObject\n ? ((paramsOrOptions as { fallback?: string }).fallback ??\n 'No Content Found')\n : fallbackArg;\n const schema: StandardSchemaV1 | undefined = isOptionsObject\n ? (paramsOrOptions as { schema?: StandardSchemaV1 }).schema\n : undefined;\n\n const loaderPromise = injectContentFileLoader();\n const contentRenderer = inject(ContentRenderer);\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: resourceParams }) => {\n const { input: param, files } = resourceParams;\n\n if (typeof param === 'string') {\n if (param) {\n const file = await getContentFile(files!, param, fallback, schema);\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 };\n } else {\n const file = await getContentFile(\n files!,\n param.customFilename,\n fallback,\n schema,\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"],"mappings":";;;;;;;AAOA,SAAgB,qBACd,UACoD;CAEpD,MAAM,cADoB,yBAAqC,EACvB,CAAA,MAAM,UAC5C,WAAW,MAAM,OAAO,SAAY,GAAA,MACrC;AAED,QAAO,SACL,EAAA,cAAA,aAAA,CAAA;;;;ACmBJ,eAAe,mBACb,QACA,YACA,UACA;CACA,MAAM,SAAS,MAAM,OAAO,aAAa,SAAS,WAAW;AAC7D,KAAI,OAAO,OACH,OAAI,IAAA,2BAA2B,OAAO,QAAQ,SAAS;AAG/D,QAAO,OAAO;;AAGhB,SAAS,sBAAsB,UAA0B;AACvD,QAAO,SAAS,QAAQ,qBAAwB,GAAA;;AAGlD,eAAe,eAGb,cACA,MACA,UACA,QAC0D;CAK1D,MAAK,kBAAY,EAAA;CACf,MAAM,YAAA,EAAgB;AAMtB,MAAA,MAAA,CAAA,KAAgB,aAAA,OAAiB,QAAA,aAAA,EAAA;EAE3B,MAAA,gBACH,IAAA,QAAA,2BAAA,eAAA,CASC,QAAO,WAAgB,IAAA;AACvB,kBAAiB,iBAAc;EAI/B,MAAA,OAAc,cAEf,MAAa,IAAA,CACT,KAAA,EACK,QAAA,YAAA,GAAA;AACV,MAAA,QAAc,CAAA,UAAA,MACR,WAAA,QAAA;;CAKV,MAAM,OAAA,gBAAyB,OAAQ,QAAS,WAAG,IAAA;CAGnD,MAAO,WAFD,CAAA,GAAA,KAAqB,MAAA,GAAA,KAAA,WAAsB,CAG/C,MAAO,MAAA,KAAA,gBAA0D,IAAA,UAAA;CAC/D,MAAI,cAAO,WAAgB,gBAAU,YAAA,KAAA;AACnC,KAAA,CAAM,YAQN,QAAO;EACL,UAAU;EACV,YAAA,EAAA;EACA,MAAA;EACA,SAAA;EACD;CAGH,MAAM,eAAa,SACf,QAAM,SAAA,GAAA;CAOV,MAAO,qBAAA,sBAAA,SAAA;AACL,QAAA,aAAU,CAAA,KAAA,OAAA,gBAAA;AACV,MAAA,OAAA,gBAAA,UAAA;GACA,MAAA,EAAA,SAAA,eAAA,SACS,MAAY,yBAAA,aAAA,QAAA,mBAAA,GACtB,oBAAA,YAAA;AAEJ,UAAA;;IAsCa;IAWR;IAQwC;IAGxC;;AAWA,SACJ;GAQK,UAAS;GACN;GAAyB,YAbb,SAChB,MAAA,mBAAyB,QAAA,YAAgB,UAAA,mBAAA,GACzC,YAAkB;GAW2B,SAAA,YAAA;GAAqB;GACtE;;AAGE,SAAW,oBAAoB,iBAAA,cAAA,oBAAA;OAE3B,kBAAmB,mBACnB,OAAI,oBAAwB,YAC1B,EAAA,SAAM,qBAGN,YAAO,mBACF,YAAA,mBACE,cAAS;OACf,SAAA,kBAAA,gBAAA,SAEH;OACK,WAAA,kBACE,gBAAA,YACN,qBAAA;CAGH,MAAA,SAAO,kBACL,gBAAU,SACV,KAAA;OACA,gBAAc,yBAAA;OACd,kBAAS,OAAA,gBAAA;OACJ,kBAAA,SAAA,KAAA,eAAA,CAAA,CAAA;OACN,QAAA,UAAA,SACI,OAAA,eAAA,CAAA,SAAA,KAAA,KAAA,WAAA,OAAA,IAAA,OAAA,CAAA,CAAA,EAAA,EAAA,aAAA,MAAA,CAAA;AACL,QAAM,SAAO;EAMT,QAAO,gBAAiB;GAAA,OAAA,OAAU;GAAA,OAAA,iBAAA;GAAA,EAAA;EACpC,QAAM,OAAY,EAAA,QAAM,qBAAuB;GAGxC,MAAA,EAAA,OAAA,OAAA,UAAA;AACF,OAAA,OAAA,UAAA,UAAA;AACE,QAAS,OAAO;KACtB,MAAA,OAAA,MAAA,eAAA,OAAA,OAAA,UAAA,OAAA;;MAEI,MAAA,WAAA,MAAA,gBAAA,OAAA,KAAA,QAAA;AACF,aAAA;OACE,GAAA;OACN,KAAA,SAAA,OAAA,EAAA;;;AAGL,YAAA"}
1
+ {"version":3,"file":"analogjs-content-resources.mjs","names":[],"sources":["../../resources/src/content-files-resource.ts","../../resources/src/content-file-resource.ts"],"sourcesContent":["import { resource, ResourceRef } from '@angular/core';\nimport {\n ContentFile,\n injectContentListLoader,\n InjectContentFilesFilterFunction,\n} from '@analogjs/content';\n\nexport function contentFilesResource<Attributes extends Record<string, any>>(\n filterFn?: InjectContentFilesFilterFunction<Attributes> | undefined,\n): ResourceRef<ContentFile<Attributes>[] | undefined> {\n const contentListLoader = injectContentListLoader<Attributes>();\n const contentList = contentListLoader().then((items) =>\n filterFn ? items.filter(filterFn) : items,\n );\n\n return resource({\n loader: () => contentList,\n });\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n computed,\n inject,\n resource,\n Signal,\n type ResourceRef,\n} from '@angular/core';\nimport {\n ContentFile,\n ContentRenderer,\n FrontmatterValidationError,\n parseRawContentFile,\n parseRawContentFileAsync,\n injectContentFileLoader,\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\nexport interface ContentFileResourceResult<\n Attributes extends Record<string, any> = Record<string, any>,\n> extends ContentFile<Attributes | Record<string, never>> {\n toc: Array<{ id: string; level: number; text: string }>;\n}\n\ntype ContentFileParams =\n | Signal<string | { customFilename: string }>\n | Signal<string>\n | Signal<{ customFilename: string }>;\n\nasync function validateAttributes<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n attributes: unknown,\n filename?: string,\n) {\n const result = await schema['~standard'].validate(attributes);\n if (result.issues) {\n throw new FrontmatterValidationError(result.issues, filename);\n }\n\n return result.value;\n}\n\nfunction getValidationFilename(filename: string): string {\n return filename.replace(/^\\/src\\/content\\//, '');\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 schema?: StandardSchemaV1,\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 = [`${base}.md`, `${base}/index.md`];\n\n const matchKey =\n candidates.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$/, '');\n const validationFilename = getValidationFilename(matchKey!);\n\n return contentFile().then(\n async (contentFile: string | { default: any; metadata: any }) => {\n if (typeof contentFile === 'string') {\n const { content, attributes } = schema\n ? await parseRawContentFileAsync(\n contentFile,\n schema,\n validationFilename,\n )\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 const attributes = schema\n ? await validateAttributes(\n schema,\n contentFile.metadata,\n validationFilename,\n )\n : contentFile.metadata;\n\n return {\n filename: resolvedBase,\n slug,\n attributes,\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 * @example\n * ```typescript\n * // Without schema (existing behavior)\n * const post = contentFileResource<BlogAttributes>();\n *\n * // With schema validation\n * import * as v from 'valibot';\n * const BlogSchema = v.object({\n * title: v.string(),\n * date: v.pipe(v.string(), v.isoDate()),\n * });\n * const post = contentFileResource({ schema: BlogSchema });\n * ```\n */\nexport function contentFileResource<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n params?: ContentFileParams,\n fallback?: string,\n): ResourceRef<ContentFileResourceResult<Attributes> | undefined>;\n\nexport function contentFileResource<TSchema extends StandardSchemaV1>(options: {\n params?: ContentFileParams;\n fallback?: string;\n schema: TSchema;\n}): ResourceRef<\n | ContentFileResourceResult<\n StandardSchemaV1.InferOutput<TSchema> & Record<string, any>\n >\n | undefined\n>;\n\nexport function contentFileResource(\n paramsOrOptions?:\n | ContentFileParams\n | {\n params?: ContentFileParams;\n fallback?: string;\n schema?: StandardSchemaV1;\n },\n fallbackArg = 'No Content Found',\n) {\n // Detect options-object form vs legacy positional form\n const isOptionsObject =\n paramsOrOptions &&\n typeof paramsOrOptions === 'object' &&\n !('set' in paramsOrOptions) && // not a Signal\n ('schema' in paramsOrOptions ||\n 'params' in paramsOrOptions ||\n 'fallback' in paramsOrOptions);\n\n const params: ContentFileParams | undefined = isOptionsObject\n ? (paramsOrOptions as { params?: ContentFileParams }).params\n : (paramsOrOptions as ContentFileParams | undefined);\n const fallback: string = isOptionsObject\n ? ((paramsOrOptions as { fallback?: string }).fallback ??\n 'No Content Found')\n : fallbackArg;\n const schema: StandardSchemaV1 | undefined = isOptionsObject\n ? (paramsOrOptions as { schema?: StandardSchemaV1 }).schema\n : undefined;\n\n const loaderPromise = injectContentFileLoader();\n const contentRenderer = inject(ContentRenderer);\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: resourceParams }) => {\n const { input: param, files } = resourceParams;\n\n if (typeof param === 'string') {\n if (param) {\n const file = await getContentFile(files!, param, fallback, schema);\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 };\n } else {\n const file = await getContentFile(\n files!,\n param.customFilename,\n fallback,\n schema,\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"],"mappings":";;;;;;;AAOA,SAAgB,qBACd,UACoD;CAEpD,MAAM,cADoB,yBAAqC,EACvB,CAAA,MAAM,UAC5C,WAAW,MAAM,OAAO,SAAY,GAAA,MACrC;AAED,QAAO,SACL,EAAA,cAAA,aAAA,CAAA;;;;ACiBJ,eAAe,mBACb,QACA,YACA,UACA;CACA,MAAM,SAAS,MAAM,OAAO,aAAa,SAAS,WAAW;AAC7D,KAAI,OAAO,OACH,OAAI,IAAA,2BAA2B,OAAO,QAAQ,SAAS;AAG/D,QAAO,OAAO;;AAGhB,SAAS,sBAAsB,UAA0B;AACvD,QAAO,SAAS,QAAQ,qBAAwB,GAAA;;AAGlD,eAAe,eAGb,cACA,MACA,UACA,QAC0D;CAK1D,MAAK,kBAAY,EAAA;CACf,MAAM,YAAA,EAAgB;AAMtB,MAAA,MAAA,CAAA,KAAgB,aAAA,OAAiB,QAAA,aAAA,EAAA;EAE3B,MAAA,gBACH,IAAA,QAAA,2BAAA,eAAA,CASC,QAAO,WAAgB,IAAA;AACvB,kBAAiB,iBAAc;EAI/B,MAAA,OAAc,cAEf,MAAa,IAAA,CACT,KAAA,EACK,QAAA,YAAA,GAAA;AACV,MAAA,QAAc,CAAA,UAAA,MACR,WAAA,QAAA;;CAKV,MAAM,OAAA,gBAAyB,OAAQ,QAAS,WAAG,IAAA;CAGnD,MAAO,WAFD,CAAA,GAAA,KAAqB,MAAA,GAAA,KAAA,WAAsB,CAG/C,MAAO,MAAA,KAAA,gBAA0D,IAAA,UAAA;CAC/D,MAAI,cAAO,WAAgB,gBAAU,YAAA,KAAA;AACnC,KAAA,CAAM,YAQN,QAAO;EACL,UAAU;EACV,YAAA,EAAA;EACA,MAAA;EACA,SAAA;EACD;CAGH,MAAM,eAAa,SACf,QAAM,SAAA,GAAA;CAOV,MAAO,qBAAA,sBAAA,SAAA;AACL,QAAA,aAAU,CAAA,KAAA,OAAA,gBAAA;AACV,MAAA,OAAA,gBAAA,UAAA;GACA,MAAA,EAAA,SAAA,eAAA,SACS,MAAY,yBAAA,aAAA,QAAA,mBAAA,GACtB,oBAAA,YAAA;AAEJ,UAAA;;IAsCa;IAWR;IAQwC;IAGxC;;AAWA,SACJ;GAQK,UAAS;GACN;GAAyB,YAbb,SAChB,MAAA,mBAAyB,QAAA,YAAgB,UAAA,mBAAA,GACzC,YAAkB;GAW2B,SAAA,YAAA;GAAqB;GACtE;;AAGE,SAAW,oBAAoB,iBAAA,cAAA,oBAAA;OAE3B,kBAAmB,mBACnB,OAAI,oBAAwB,YAC1B,EAAA,SAAM,qBAGN,YAAO,mBACF,YAAA,mBACE,cAAS;OACf,SAAA,kBAAA,gBAAA,SAEH;OACK,WAAA,kBACE,gBAAA,YACN,qBAAA;CAGH,MAAA,SAAO,kBACL,gBAAU,SACV,KAAA;OACA,gBAAc,yBAAA;OACd,kBAAS,OAAA,gBAAA;OACJ,kBAAA,SAAA,KAAA,eAAA,CAAA,CAAA;OACN,QAAA,UAAA,SACI,OAAA,eAAA,CAAA,SAAA,KAAA,KAAA,WAAA,OAAA,IAAA,OAAA,CAAA,CAAA,EAAA,EAAA,aAAA,MAAA,CAAA;AACL,QAAM,SAAO;EAMT,QAAO,gBAAiB;GAAA,OAAA,OAAU;GAAA,OAAA,iBAAA;GAAA,EAAA;EACpC,QAAM,OAAY,EAAA,QAAM,qBAAuB;GAGxC,MAAA,EAAA,OAAA,OAAA,UAAA;AACF,OAAA,OAAA,UAAA,UAAA;AACE,QAAS,OAAO;KACtB,MAAA,OAAA,MAAA,eAAA,OAAA,OAAA,UAAA,OAAA;;MAEI,MAAA,WAAA,MAAA,gBAAA,OAAA,KAAA,QAAA;AACF,aAAA;OACE,GAAA;OACN,KAAA,SAAA,OAAA,EAAA;;;AAGL,YAAA"}
@@ -34,7 +34,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
34
34
  static {
35
35
  this.ɵfac = i0.ɵɵngDeclareFactory({
36
36
  minVersion: "12.0.0",
37
- version: "21.2.5",
37
+ version: "21.2.6",
38
38
  ngImport: i0,
39
39
  type: AnchorNavigationDirective,
40
40
  deps: [],
@@ -44,7 +44,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
44
44
  static {
45
45
  this.ɵdir = i0.ɵɵngDeclareDirective({
46
46
  minVersion: "14.0.0",
47
- version: "21.2.5",
47
+ version: "21.2.6",
48
48
  type: AnchorNavigationDirective,
49
49
  isStandalone: true,
50
50
  selector: "[analogAnchorNavigation]",
@@ -55,7 +55,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
55
55
  };
56
56
  i0.ɵɵngDeclareClassMetadata({
57
57
  minVersion: "12.0.0",
58
- version: "21.2.5",
58
+ version: "21.2.6",
59
59
  ngImport: i0,
60
60
  type: AnchorNavigationDirective,
61
61
  decorators: [{
@@ -198,7 +198,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
198
198
  static {
199
199
  this.ɵfac = i0.ɵɵngDeclareFactory({
200
200
  minVersion: "12.0.0",
201
- version: "21.2.5",
201
+ version: "21.2.6",
202
202
  ngImport: i0,
203
203
  type: MarkedContentHighlighter,
204
204
  deps: [],
@@ -208,7 +208,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
208
208
  static {
209
209
  this.ɵprov = i0.ɵɵngDeclareInjectable({
210
210
  minVersion: "12.0.0",
211
- version: "21.2.5",
211
+ version: "21.2.6",
212
212
  ngImport: i0,
213
213
  type: MarkedContentHighlighter
214
214
  });
@@ -216,7 +216,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
216
216
  };
217
217
  i0.ɵɵngDeclareClassMetadata({
218
218
  minVersion: "12.0.0",
219
- version: "21.2.5",
219
+ version: "21.2.6",
220
220
  ngImport: i0,
221
221
  type: MarkedContentHighlighter,
222
222
  decorators: [{ type: Injectable }]
@@ -259,7 +259,7 @@ var MarkedSetupService = class MarkedSetupService {
259
259
  static {
260
260
  this.ɵfac = i0.ɵɵngDeclareFactory({
261
261
  minVersion: "12.0.0",
262
- version: "21.2.5",
262
+ version: "21.2.6",
263
263
  ngImport: i0,
264
264
  type: MarkedSetupService,
265
265
  deps: [],
@@ -269,7 +269,7 @@ var MarkedSetupService = class MarkedSetupService {
269
269
  static {
270
270
  this.ɵprov = i0.ɵɵngDeclareInjectable({
271
271
  minVersion: "12.0.0",
272
- version: "21.2.5",
272
+ version: "21.2.6",
273
273
  ngImport: i0,
274
274
  type: MarkedSetupService
275
275
  });
@@ -277,7 +277,7 @@ var MarkedSetupService = class MarkedSetupService {
277
277
  };
278
278
  i0.ɵɵngDeclareClassMetadata({
279
279
  minVersion: "12.0.0",
280
- version: "21.2.5",
280
+ version: "21.2.6",
281
281
  ngImport: i0,
282
282
  type: MarkedSetupService,
283
283
  decorators: [{ type: Injectable }],
@@ -304,7 +304,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
304
304
  static {
305
305
  this.ɵfac = i0.ɵɵngDeclareFactory({
306
306
  minVersion: "12.0.0",
307
- version: "21.2.5",
307
+ version: "21.2.6",
308
308
  ngImport: i0,
309
309
  type: MarkdownContentRendererService,
310
310
  deps: [],
@@ -314,7 +314,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
314
314
  static {
315
315
  this.ɵprov = i0.ɵɵngDeclareInjectable({
316
316
  minVersion: "12.0.0",
317
- version: "21.2.5",
317
+ version: "21.2.6",
318
318
  ngImport: i0,
319
319
  type: MarkdownContentRendererService
320
320
  });
@@ -322,7 +322,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
322
322
  };
323
323
  i0.ɵɵngDeclareClassMetadata({
324
324
  minVersion: "12.0.0",
325
- version: "21.2.5",
325
+ version: "21.2.6",
326
326
  ngImport: i0,
327
327
  type: MarkdownContentRendererService,
328
328
  decorators: [{ type: Injectable }]
@@ -366,7 +366,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
366
366
  static {
367
367
  this.ɵfac = i0.ɵɵngDeclareFactory({
368
368
  minVersion: "12.0.0",
369
- version: "21.2.5",
369
+ version: "21.2.6",
370
370
  ngImport: i0,
371
371
  type: AnalogMarkdownRouteComponent,
372
372
  deps: [],
@@ -376,7 +376,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
376
376
  static {
377
377
  this.ɵcmp = i0.ɵɵngDeclareComponent({
378
378
  minVersion: "14.0.0",
379
- version: "21.2.5",
379
+ version: "21.2.6",
380
380
  type: AnalogMarkdownRouteComponent,
381
381
  isStandalone: true,
382
382
  selector: "analog-markdown-route",
@@ -392,7 +392,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
392
392
  };
393
393
  i0.ɵɵngDeclareClassMetadata({
394
394
  minVersion: "12.0.0",
395
- version: "21.2.5",
395
+ version: "21.2.6",
396
396
  ngImport: i0,
397
397
  type: AnalogMarkdownRouteComponent,
398
398
  decorators: [{
@@ -449,7 +449,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
449
449
  static {
450
450
  this.ɵfac = i0.ɵɵngDeclareFactory({
451
451
  minVersion: "12.0.0",
452
- version: "21.2.5",
452
+ version: "21.2.6",
453
453
  ngImport: i0,
454
454
  type: AnalogMarkdownComponent,
455
455
  deps: [],
@@ -459,7 +459,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
459
459
  static {
460
460
  this.ɵcmp = i0.ɵɵngDeclareComponent({
461
461
  minVersion: "17.1.0",
462
- version: "21.2.5",
462
+ version: "21.2.6",
463
463
  type: AnalogMarkdownComponent,
464
464
  isStandalone: true,
465
465
  selector: "analog-markdown",
@@ -490,7 +490,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
490
490
  };
491
491
  i0.ɵɵngDeclareClassMetadata({
492
492
  minVersion: "12.0.0",
493
- version: "21.2.5",
493
+ version: "21.2.6",
494
494
  ngImport: i0,
495
495
  type: AnalogMarkdownComponent,
496
496
  decorators: [{
@@ -566,7 +566,7 @@ var DevToolsContentRenderer = class DevToolsContentRenderer extends ContentRende
566
566
  static {
567
567
  this.ɵfac = i0.ɵɵngDeclareFactory({
568
568
  minVersion: "12.0.0",
569
- version: "21.2.5",
569
+ version: "21.2.6",
570
570
  ngImport: i0,
571
571
  type: DevToolsContentRenderer,
572
572
  deps: null,
@@ -576,7 +576,7 @@ var DevToolsContentRenderer = class DevToolsContentRenderer extends ContentRende
576
576
  static {
577
577
  this.ɵprov = i0.ɵɵngDeclareInjectable({
578
578
  minVersion: "12.0.0",
579
- version: "21.2.5",
579
+ version: "21.2.6",
580
580
  ngImport: i0,
581
581
  type: DevToolsContentRenderer
582
582
  });
@@ -584,7 +584,7 @@ var DevToolsContentRenderer = class DevToolsContentRenderer extends ContentRende
584
584
  };
585
585
  i0.ɵɵngDeclareClassMetadata({
586
586
  minVersion: "12.0.0",
587
- version: "21.2.5",
587
+ version: "21.2.6",
588
588
  ngImport: i0,
589
589
  type: DevToolsContentRenderer,
590
590
  decorators: [{ type: Injectable }]
@@ -15,7 +15,7 @@ var ContentRenderer = class ContentRenderer {
15
15
  static {
16
16
  this.ɵfac = i0.ɵɵngDeclareFactory({
17
17
  minVersion: "12.0.0",
18
- version: "21.2.5",
18
+ version: "21.2.6",
19
19
  ngImport: i0,
20
20
  type: ContentRenderer,
21
21
  deps: [],
@@ -25,7 +25,7 @@ var ContentRenderer = class ContentRenderer {
25
25
  static {
26
26
  this.ɵprov = i0.ɵɵngDeclareInjectable({
27
27
  minVersion: "12.0.0",
28
- version: "21.2.5",
28
+ version: "21.2.6",
29
29
  ngImport: i0,
30
30
  type: ContentRenderer
31
31
  });
@@ -33,7 +33,7 @@ var ContentRenderer = class ContentRenderer {
33
33
  };
34
34
  i0.ɵɵngDeclareClassMetadata({
35
35
  minVersion: "12.0.0",
36
- version: "21.2.5",
36
+ version: "21.2.6",
37
37
  ngImport: i0,
38
38
  type: ContentRenderer,
39
39
  decorators: [{ type: Injectable }]
@@ -214,7 +214,7 @@ var RenderTaskService = class RenderTaskService {
214
214
  static {
215
215
  this.ɵfac = i0.ɵɵngDeclareFactory({
216
216
  minVersion: "12.0.0",
217
- version: "21.2.5",
217
+ version: "21.2.6",
218
218
  ngImport: i0,
219
219
  type: RenderTaskService,
220
220
  deps: [],
@@ -224,7 +224,7 @@ var RenderTaskService = class RenderTaskService {
224
224
  static {
225
225
  this.ɵprov = i0.ɵɵngDeclareInjectable({
226
226
  minVersion: "12.0.0",
227
- version: "21.2.5",
227
+ version: "21.2.6",
228
228
  ngImport: i0,
229
229
  type: RenderTaskService
230
230
  });
@@ -232,7 +232,7 @@ var RenderTaskService = class RenderTaskService {
232
232
  };
233
233
  i0.ɵɵngDeclareClassMetadata({
234
234
  minVersion: "12.0.0",
235
- version: "21.2.5",
235
+ version: "21.2.6",
236
236
  ngImport: i0,
237
237
  type: RenderTaskService,
238
238
  decorators: [{ type: Injectable }]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/content",
3
- "version": "3.0.0-alpha.20",
3
+ "version": "3.0.0-alpha.22",
4
4
  "description": "Content Rendering for Analog",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -23,22 +23,22 @@
23
23
  "url": "https://github.com/sponsors/brandonroberts"
24
24
  },
25
25
  "peerDependencies": {
26
- "@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
27
- "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
28
- "@angular/platform-browser": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
29
- "@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
26
+ "@angular/common": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
27
+ "@angular/core": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
28
+ "@angular/platform-browser": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
29
+ "@angular/router": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
30
30
  "@nx/devkit": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 || ^22",
31
31
  "front-matter": "^4.0.2",
32
32
  "marked": "^17.0.5",
33
- "marked-gfm-heading-id": "^4.1.1",
34
- "marked-highlight": "^2.2.1",
35
- "marked-mangle": "^1.1.10",
33
+ "marked-gfm-heading-id": "^4.1.3",
34
+ "marked-highlight": "^2.2.3",
35
+ "marked-mangle": "^1.1.12",
36
36
  "rxjs": "^6.5.0 || ^7.5.0",
37
- "@standard-schema/spec": "^1.0.0",
38
- "prismjs": "^1.29.0",
37
+ "@standard-schema/spec": "^1.1.0",
38
+ "prismjs": "^1.30.0",
39
39
  "satori": "^0.10.14",
40
40
  "satori-html": "^0.3.2",
41
- "sharp": "^0.33.5",
41
+ "sharp": "^0.34.5",
42
42
  "md4x": ">=0.0.20"
43
43
  },
44
44
  "peerDependenciesMeta": {
@@ -59,6 +59,9 @@
59
59
  },
60
60
  "sharp": {
61
61
  "optional": true
62
+ },
63
+ "prismjs": {
64
+ "optional": true
62
65
  }
63
66
  },
64
67
  "exports": {
@@ -105,7 +108,7 @@
105
108
  "tslib": "^2.3.0"
106
109
  },
107
110
  "devDependencies": {
108
- "@analogjs/vite-plugin-angular": "workspace:^"
111
+ "@analogjs/vite-plugin-angular": "3.0.0-alpha.22"
109
112
  },
110
113
  "ng-update": {
111
114
  "packageGroup": [
@@ -10,6 +10,8 @@ export interface ContentFileResourceResult<Attributes extends Record<string, any
10
10
  }
11
11
  type ContentFileParams = Signal<string | {
12
12
  customFilename: string;
13
+ }> | Signal<string> | Signal<{
14
+ customFilename: string;
13
15
  }>;
14
16
  /**
15
17
  * Resource for requesting an individual content file.