@analogjs/content 3.0.0-alpha.91 → 3.0.0-alpha.93

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.
@@ -69,7 +69,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
69
69
  static {
70
70
  this.ɵfac = i0.ɵɵngDeclareFactory({
71
71
  minVersion: "12.0.0",
72
- version: "22.1.5",
72
+ version: "22.2.0",
73
73
  ngImport: i0,
74
74
  type: Md4xContentRendererService,
75
75
  deps: null,
@@ -79,7 +79,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
79
79
  static {
80
80
  this.ɵprov = i0.ɵɵngDeclareInjectable({
81
81
  minVersion: "12.0.0",
82
- version: "22.1.5",
82
+ version: "22.2.0",
83
83
  ngImport: i0,
84
84
  type: Md4xContentRendererService
85
85
  });
@@ -87,7 +87,7 @@ var Md4xContentRendererService = class Md4xContentRendererService extends Conten
87
87
  };
88
88
  i0.ɵɵngDeclareClassMetadata({
89
89
  minVersion: "12.0.0",
90
- version: "22.1.5",
90
+ version: "22.2.0",
91
91
  ngImport: i0,
92
92
  type: Md4xContentRendererService,
93
93
  decorators: [{ type: Injectable }]
@@ -162,7 +162,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
162
162
  static {
163
163
  this.ɵfac = i0.ɵɵngDeclareFactory({
164
164
  minVersion: "12.0.0",
165
- version: "22.1.5",
165
+ version: "22.2.0",
166
166
  ngImport: i0,
167
167
  type: Md4xWasmContentRendererService,
168
168
  deps: null,
@@ -172,7 +172,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
172
172
  static {
173
173
  this.ɵprov = i0.ɵɵngDeclareInjectable({
174
174
  minVersion: "12.0.0",
175
- version: "22.1.5",
175
+ version: "22.2.0",
176
176
  ngImport: i0,
177
177
  type: Md4xWasmContentRendererService
178
178
  });
@@ -180,7 +180,7 @@ var Md4xWasmContentRendererService = class Md4xWasmContentRendererService extend
180
180
  };
181
181
  i0.ɵɵngDeclareClassMetadata({
182
182
  minVersion: "12.0.0",
183
- version: "22.1.5",
183
+ version: "22.2.0",
184
184
  ngImport: i0,
185
185
  type: Md4xWasmContentRendererService,
186
186
  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: "22.1.5",
120
+ version: "22.2.0",
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: "22.1.5",
130
+ version: "22.2.0",
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: "22.1.5",
147
+ version: "22.2.0",
148
148
  ngImport: i0,
149
149
  type: MdcRendererDirective,
150
150
  decorators: [{
@@ -46,7 +46,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
46
46
  static {
47
47
  this.ɵfac = i0.ɵɵngDeclareFactory({
48
48
  minVersion: "12.0.0",
49
- version: "22.1.5",
49
+ version: "22.2.0",
50
50
  ngImport: i0,
51
51
  type: PrismHighlighter,
52
52
  deps: null,
@@ -56,7 +56,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
56
56
  static {
57
57
  this.ɵprov = i0.ɵɵngDeclareInjectable({
58
58
  minVersion: "12.0.0",
59
- version: "22.1.5",
59
+ version: "22.2.0",
60
60
  ngImport: i0,
61
61
  type: PrismHighlighter
62
62
  });
@@ -64,7 +64,7 @@ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
64
64
  };
65
65
  i0.ɵɵngDeclareClassMetadata({
66
66
  minVersion: "12.0.0",
67
- version: "22.1.5",
67
+ version: "22.2.0",
68
68
  ngImport: i0,
69
69
  type: PrismHighlighter,
70
70
  decorators: [{ type: Injectable }]
@@ -7,7 +7,7 @@ import { Component, Directive, HostListener, Injectable, InjectionToken, Input,
7
7
  import { DOCUMENT, Location, isPlatformBrowser } from "@angular/common";
8
8
  import { ActivatedRoute, Router } from "@angular/router";
9
9
  import { Observable, firstValueFrom, from, isObservable, of } from "rxjs";
10
- import { catchError, map, switchMap, tap } from "rxjs/operators";
10
+ import { catchError, finalize, map, switchMap, tap } from "rxjs/operators";
11
11
  import { getHeadingList, gfmHeadingId } from "marked-gfm-heading-id";
12
12
  import { marked } from "marked";
13
13
  import { mangle } from "marked-mangle";
@@ -35,7 +35,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
35
35
  static {
36
36
  this.ɵfac = i0.ɵɵngDeclareFactory({
37
37
  minVersion: "12.0.0",
38
- version: "22.1.5",
38
+ version: "22.2.0",
39
39
  ngImport: i0,
40
40
  type: AnchorNavigationDirective,
41
41
  deps: [],
@@ -45,7 +45,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
45
45
  static {
46
46
  this.ɵdir = i0.ɵɵngDeclareDirective({
47
47
  minVersion: "14.0.0",
48
- version: "22.1.5",
48
+ version: "22.2.0",
49
49
  type: AnchorNavigationDirective,
50
50
  isStandalone: true,
51
51
  selector: "[analogAnchorNavigation]",
@@ -56,7 +56,7 @@ var AnchorNavigationDirective = class AnchorNavigationDirective {
56
56
  };
57
57
  i0.ɵɵngDeclareClassMetadata({
58
58
  minVersion: "12.0.0",
59
- version: "22.1.5",
59
+ version: "22.2.0",
60
60
  ngImport: i0,
61
61
  type: AnchorNavigationDirective,
62
62
  decorators: [{
@@ -135,6 +135,8 @@ function getContentFile(contentFiles, prefix, slug, fallback, renderTaskService,
135
135
  content: contentFile.default,
136
136
  toc: []
137
137
  });
138
+ }), finalize(() => {
139
+ renderTaskService.clearRenderTask(contentTask);
138
140
  }));
139
141
  }
140
142
  /**
@@ -211,7 +213,7 @@ var MarkedSetupService = class MarkedSetupService {
211
213
  static {
212
214
  this.ɵfac = i0.ɵɵngDeclareFactory({
213
215
  minVersion: "12.0.0",
214
- version: "22.1.5",
216
+ version: "22.2.0",
215
217
  ngImport: i0,
216
218
  type: MarkedSetupService,
217
219
  deps: [],
@@ -221,7 +223,7 @@ var MarkedSetupService = class MarkedSetupService {
221
223
  static {
222
224
  this.ɵprov = i0.ɵɵngDeclareInjectable({
223
225
  minVersion: "12.0.0",
224
- version: "22.1.5",
226
+ version: "22.2.0",
225
227
  ngImport: i0,
226
228
  type: MarkedSetupService
227
229
  });
@@ -229,7 +231,7 @@ var MarkedSetupService = class MarkedSetupService {
229
231
  };
230
232
  i0.ɵɵngDeclareClassMetadata({
231
233
  minVersion: "12.0.0",
232
- version: "22.1.5",
234
+ version: "22.2.0",
233
235
  ngImport: i0,
234
236
  type: MarkedSetupService,
235
237
  decorators: [{ type: Injectable }],
@@ -256,7 +258,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
256
258
  static {
257
259
  this.ɵfac = i0.ɵɵngDeclareFactory({
258
260
  minVersion: "12.0.0",
259
- version: "22.1.5",
261
+ version: "22.2.0",
260
262
  ngImport: i0,
261
263
  type: MarkdownContentRendererService,
262
264
  deps: [],
@@ -266,7 +268,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
266
268
  static {
267
269
  this.ɵprov = i0.ɵɵngDeclareInjectable({
268
270
  minVersion: "12.0.0",
269
- version: "22.1.5",
271
+ version: "22.2.0",
270
272
  ngImport: i0,
271
273
  type: MarkdownContentRendererService
272
274
  });
@@ -274,7 +276,7 @@ var MarkdownContentRendererService = class MarkdownContentRendererService {
274
276
  };
275
277
  i0.ɵɵngDeclareClassMetadata({
276
278
  minVersion: "12.0.0",
277
- version: "22.1.5",
279
+ version: "22.2.0",
278
280
  ngImport: i0,
279
281
  type: MarkdownContentRendererService,
280
282
  decorators: [{ type: Injectable }]
@@ -318,7 +320,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
318
320
  static {
319
321
  this.ɵfac = i0.ɵɵngDeclareFactory({
320
322
  minVersion: "12.0.0",
321
- version: "22.1.5",
323
+ version: "22.2.0",
322
324
  ngImport: i0,
323
325
  type: AnalogMarkdownRouteComponent,
324
326
  deps: [],
@@ -328,7 +330,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
328
330
  static {
329
331
  this.ɵcmp = i0.ɵɵngDeclareComponent({
330
332
  minVersion: "14.0.0",
331
- version: "22.1.5",
333
+ version: "22.2.0",
332
334
  type: AnalogMarkdownRouteComponent,
333
335
  isStandalone: true,
334
336
  selector: "analog-markdown-route",
@@ -344,7 +346,7 @@ var AnalogMarkdownRouteComponent = class AnalogMarkdownRouteComponent {
344
346
  };
345
347
  i0.ɵɵngDeclareClassMetadata({
346
348
  minVersion: "12.0.0",
347
- version: "22.1.5",
349
+ version: "22.2.0",
348
350
  ngImport: i0,
349
351
  type: AnalogMarkdownRouteComponent,
350
352
  decorators: [{
@@ -401,7 +403,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
401
403
  static {
402
404
  this.ɵfac = i0.ɵɵngDeclareFactory({
403
405
  minVersion: "12.0.0",
404
- version: "22.1.5",
406
+ version: "22.2.0",
405
407
  ngImport: i0,
406
408
  type: AnalogMarkdownComponent,
407
409
  deps: [],
@@ -411,7 +413,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
411
413
  static {
412
414
  this.ɵcmp = i0.ɵɵngDeclareComponent({
413
415
  minVersion: "17.1.0",
414
- version: "22.1.5",
416
+ version: "22.2.0",
415
417
  type: AnalogMarkdownComponent,
416
418
  isStandalone: true,
417
419
  selector: "analog-markdown",
@@ -442,7 +444,7 @@ var AnalogMarkdownComponent = class AnalogMarkdownComponent {
442
444
  };
443
445
  i0.ɵɵngDeclareClassMetadata({
444
446
  minVersion: "12.0.0",
445
- version: "22.1.5",
447
+ version: "22.2.0",
446
448
  ngImport: i0,
447
449
  type: AnalogMarkdownComponent,
448
450
  decorators: [{
@@ -1 +1 @@
1
- {"version":3,"file":"analogjs-content.mjs","names":[],"sources":["../../src/lib/anchor-navigation.directive.ts","../../src/lib/utils/zone-wait-for.ts","../../src/lib/content.ts","../../src/lib/utils/escape-html.ts","../../src/lib/marked-setup.service.ts","../../src/lib/markdown-content-renderer.service.ts","../../src/lib/provide-content.ts","../../src/lib/markdown-route.component.ts","../../src/lib/markdown.component.ts"],"sourcesContent":["import { Directive, HostListener, inject } from '@angular/core';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { Router } from '@angular/router';\n\n@Directive({\n selector: '[analogAnchorNavigation]',\n standalone: true,\n})\nexport class AnchorNavigationDirective {\n private readonly document = inject(DOCUMENT);\n private readonly location = inject(Location);\n private readonly router = inject(Router);\n\n @HostListener('click', ['$event.target'])\n handleNavigation(element: EventTarget | null): boolean {\n if (\n element instanceof HTMLAnchorElement &&\n isInternalUrl(element, this.document) &&\n hasTargetSelf(element) &&\n !hasDownloadAttribute(element)\n ) {\n const { pathname, search, hash } = element;\n // A `<base>` element makes the browser resolve fragment-only hrefs\n // (e.g. `href=\"#some-id\"`) against the base URL rather than the\n // current document, so `pathname`/`search` come back as the base's\n // rather than the current page's. Fall back to the document's own\n // location in that case, or an in-page anchor link would navigate\n // to the base route and lose the fragment there.\n const isFragmentOnly = element.getAttribute('href')?.startsWith('#');\n const resolvedPathname = isFragmentOnly\n ? this.document.location.pathname\n : pathname;\n const resolvedSearch = isFragmentOnly\n ? this.document.location.search\n : search;\n const url = this.location.normalize(\n `${resolvedPathname}${resolvedSearch}${hash}`,\n );\n this.router.navigateByUrl(url);\n\n return false;\n }\n\n return true;\n }\n}\n\nfunction hasDownloadAttribute(anchorElement: HTMLAnchorElement): boolean {\n return anchorElement.getAttribute('download') !== null;\n}\n\nfunction hasTargetSelf(anchorElement: HTMLAnchorElement): boolean {\n return !anchorElement.target || anchorElement.target === '_self';\n}\n\nfunction isInternalUrl(\n anchorElement: HTMLAnchorElement,\n document: Document,\n): boolean {\n return (\n anchorElement.host === document.location.host &&\n anchorElement.protocol === document.location.protocol\n );\n}\n","import { firstValueFrom, isObservable, Observable } from 'rxjs';\n\ndeclare const Zone: any;\n\nexport async function waitFor<T>(prom: Promise<T> | Observable<T>): Promise<T> {\n if (isObservable(prom)) {\n prom = firstValueFrom(prom);\n }\n\n if (typeof Zone === 'undefined') {\n return prom;\n }\n\n const macroTask = Zone.current.scheduleMacroTask(\n `AnalogContentResolve-${Math.random()}`,\n () => {\n /* noop */\n },\n {},\n () => {\n /* noop */\n },\n );\n return prom.then((p: T) => {\n macroTask.invoke();\n return p;\n });\n}\n","/// <reference types=\"vite/client\" />\n\nimport { inject } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { from, Observable, of } from 'rxjs';\nimport { map, switchMap, tap } from 'rxjs/operators';\n\nimport { ContentFile } from './content-file';\nimport { ContentRenderer } from './content-renderer';\nimport { CONTENT_LOCALE, withLocaleCandidates } from './content-locale';\nimport { CONTENT_FILES_TOKEN } from './content-files-token';\nimport { parseRawContentFile } from './parse-raw-content-file';\nimport { waitFor } from './utils/zone-wait-for';\nimport { RenderTaskService } from './render-task.service';\n\nfunction getContentFile<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n contentFiles: Record<string, () => Promise<string>>,\n prefix: string,\n slug: string,\n fallback: string,\n renderTaskService: RenderTaskService,\n contentRenderer: ContentRenderer,\n locale?: string | null,\n): Observable<ContentFile<Attributes | Record<string, never>>> {\n // Normalize file keys so both \"/src/content/...\" and \"/<project>/src/content/...\" resolve.\n const normalizedFiles: Record<string, () => Promise<string>> = {};\n for (const [key, resolver] of Object.entries(contentFiles)) {\n const normalizedKey = key\n .replace(/^(?:.*?)\\/content(?=\\/)/, '/src/content')\n .replace(/\\/{2,}/g, '/');\n normalizedFiles[normalizedKey] = resolver as () => Promise<string>;\n }\n\n const base = `/src/content/${prefix}${slug}`.replace(/\\/{2,}/g, '/');\n const candidates = [`${base}.md`, `${base}/index.md`];\n\n const allCandidates = withLocaleCandidates(candidates, locale);\n const matchKey = allCandidates.find((k) => k in normalizedFiles);\n const contentFile = matchKey ? normalizedFiles[matchKey] : undefined;\n const resolvedBase = (matchKey || `${base}.md`).replace(/\\.md$/, '');\n\n if (!contentFile) {\n return of({\n filename: resolvedBase,\n attributes: {},\n slug: '',\n content: fallback,\n toc: [],\n });\n }\n\n const contentTask = renderTaskService.addRenderTask();\n return new Observable<string | { default: string; metadata: Attributes }>(\n (observer) => {\n // `waitFor` is a no-op in non-Zone environments (browser without zone.js),\n // so this branch works for both SSR and client. Keeping a single path also\n // avoids Rolldown evaluating `import.meta.env.SSR` at library-build time\n // and eliminating the task-clearing branch, which caused SSR to hang once\n // the content map resolved a real lazy import.\n waitFor(contentFile()).then((content) => {\n observer.next(content);\n observer.complete();\n\n setTimeout(() => renderTaskService.clearRenderTask(contentTask), 10);\n });\n },\n ).pipe(\n switchMap((contentFile) => {\n if (typeof contentFile === 'string') {\n const { content, attributes } =\n parseRawContentFile<Attributes>(contentFile);\n return from(contentRenderer.render(content)).pipe(\n map((rendered) => ({\n filename: resolvedBase,\n slug,\n attributes,\n content,\n toc: rendered.toc ?? [],\n })),\n );\n }\n return of({\n filename: resolvedBase,\n slug,\n attributes: contentFile.metadata,\n content: contentFile.default,\n toc: [],\n });\n }),\n );\n}\n\n/**\n * Retrieves the static content using the provided param and/or prefix.\n *\n * @param param route parameter (default: 'slug')\n * @param fallback fallback text if content file is not found (default: 'No Content Found')\n */\nexport function injectContent<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n param:\n | string\n | {\n param: string;\n subdirectory: string;\n }\n | {\n customFilename: string;\n } = 'slug',\n fallback = 'No Content Found',\n): Observable<ContentFile<Attributes | Record<string, never>>> {\n const contentFiles = inject(CONTENT_FILES_TOKEN);\n const contentRenderer = inject(ContentRenderer);\n const renderTaskService = inject(RenderTaskService);\n const locale = inject(CONTENT_LOCALE, { optional: true });\n const task = renderTaskService.addRenderTask();\n\n if (typeof param === 'string' || 'param' in param) {\n const prefix = typeof param === 'string' ? '' : `${param.subdirectory}/`;\n const route = inject(ActivatedRoute);\n const paramKey = typeof param === 'string' ? param : param.param;\n return route.paramMap.pipe(\n map((params) => params.get(paramKey)),\n switchMap((slug) => {\n if (slug) {\n return getContentFile<Attributes>(\n contentFiles,\n prefix,\n slug,\n fallback,\n renderTaskService,\n contentRenderer,\n locale,\n );\n }\n return of({\n filename: '',\n slug: '',\n attributes: {},\n content: fallback,\n toc: [],\n });\n }),\n tap(() => renderTaskService.clearRenderTask(task)),\n );\n } else {\n return getContentFile<Attributes>(\n contentFiles,\n '',\n param.customFilename,\n fallback,\n renderTaskService,\n contentRenderer,\n locale,\n ).pipe(tap(() => renderTaskService.clearRenderTask(task)));\n }\n}\n","export function escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n}\n\n/**\n * Reduces a fenced code-block info string to a safe language identifier so it\n * cannot break out of the `class=\"language-...\"` attribute it is interpolated\n * into.\n */\nexport function sanitizeLanguage(lang: string | undefined): string {\n return (lang ?? '').match(/^[a-zA-Z0-9-+#.]*/)?.[0] ?? '';\n}\n","/**\n * Credit goes to Scully for original implementation\n * https://github.com/scullyio/scully/blob/main/libs/scully/src/lib/fileHanderPlugins/markdown.ts\n */\nimport { inject, Injectable } from '@angular/core';\nimport { marked } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport { mangle } from 'marked-mangle';\nimport { MarkedContentHighlighter } from './marked-content-highlighter';\nimport { escapeHtml, sanitizeLanguage } from './utils/escape-html';\n\n@Injectable()\nexport class MarkedSetupService {\n private readonly marked: typeof marked;\n private readonly highlighter = inject(MarkedContentHighlighter, {\n optional: true,\n });\n\n constructor() {\n const renderer = new marked.Renderer();\n renderer.code = ({ text, lang }) => {\n // Let's do a language based detection like on GitHub\n // So we can still have non-interpreted mermaid code\n const language = sanitizeLanguage(lang);\n if (language === 'mermaid') {\n return '<pre class=\"mermaid\">' + escapeHtml(text) + '</pre>';\n }\n\n if (!language) {\n return '<pre><code>' + escapeHtml(text) + '</code></pre>';\n }\n\n if (this.highlighter?.augmentCodeBlock) {\n return this.highlighter?.augmentCodeBlock(text, language);\n }\n\n return `<pre class=\"language-${language}\"><code class=\"language-${language}\">${escapeHtml(text)}</code></pre>`;\n };\n\n const extensions = [gfmHeadingId(), mangle()];\n\n if (this.highlighter) {\n extensions.push(this.highlighter.getHighlightExtension());\n }\n\n marked.use(...extensions, {\n renderer,\n pedantic: false,\n gfm: true,\n breaks: false,\n });\n\n this.marked = marked;\n }\n\n getMarkedInstance(): typeof marked {\n return this.marked;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { getHeadingList } from 'marked-gfm-heading-id';\n\nimport {\n ContentRenderer,\n RenderedContent,\n TableOfContentItem,\n} from './content-renderer';\nimport { MarkedSetupService } from './marked-setup.service';\n\n@Injectable()\nexport class MarkdownContentRendererService implements ContentRenderer {\n #marked = inject(MarkedSetupService, { self: true });\n\n async render(content: string): Promise<RenderedContent> {\n const renderedContent = await this.#marked\n .getMarkedInstance()\n .parse(content);\n return {\n content: renderedContent,\n toc: getHeadingList(),\n };\n }\n\n getContentHeadings(content: string): TableOfContentItem[] {\n return [...content.matchAll(/^(#{1,6})\\s+(.+?)\\s*$/gm)].map((match) => ({\n id: match[2]\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-'),\n level: match[1].length,\n text: match[2].trim(),\n }));\n }\n\n // eslint-disable-next-line\n enhance(): void {}\n}\n","import { Provider, InjectionToken } from '@angular/core';\nimport { ContentRenderer, NoopContentRenderer } from './content-renderer';\nimport { RenderTaskService } from './render-task.service';\nimport { withContentFileLoader } from './content-file-loader';\nimport { withContentListLoader } from './content-list-loader';\n\nexport interface MarkdownRendererOptions {\n loadMermaid?: () => Promise<typeof import('mermaid')>;\n}\n\nconst CONTENT_RENDERER_PROVIDERS: Provider[] = [\n {\n provide: ContentRenderer,\n useClass: NoopContentRenderer,\n },\n withContentFileLoader(),\n withContentListLoader(),\n];\n\nexport function withMarkdownRenderer(\n options?: MarkdownRendererOptions,\n): Provider {\n return [\n CONTENT_RENDERER_PROVIDERS,\n options?.loadMermaid\n ? [\n {\n provide: MERMAID_IMPORT_TOKEN,\n useFactory: options.loadMermaid,\n },\n ]\n : [],\n ];\n}\n\nexport function provideContent(...features: Provider[]): Provider[] {\n return [\n { provide: RenderTaskService, useClass: RenderTaskService },\n ...features,\n ];\n}\n\nexport const MERMAID_IMPORT_TOKEN: InjectionToken<\n Promise<typeof import('mermaid')>\n> = new InjectionToken<Promise<typeof import('mermaid')>>('mermaid_import');\n","import {\n AfterViewChecked,\n Component,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { ContentRenderer } from './content-renderer';\nimport { AnchorNavigationDirective } from './anchor-navigation.directive';\n\n@Component({\n selector: 'analog-markdown-route',\n standalone: true,\n imports: [],\n hostDirectives: [AnchorNavigationDirective],\n preserveWhitespaces: true,\n encapsulation: ViewEncapsulation.None,\n template: `<div [innerHTML]=\"content\" [class]=\"classes\"></div>`,\n})\nexport default class AnalogMarkdownRouteComponent implements AfterViewChecked {\n private sanitizer = inject(DomSanitizer);\n private route = inject(ActivatedRoute);\n contentRenderer: ContentRenderer = inject(ContentRenderer);\n\n protected content: SafeHtml = this.sanitizer.bypassSecurityTrustHtml(\n this.route.snapshot.data['renderedAnalogContent'],\n );\n\n @Input() classes = 'analog-markdown-route';\n\n ngAfterViewChecked(): void {\n this.contentRenderer.enhance();\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewChecked,\n Component,\n InputSignal,\n NgZone,\n PLATFORM_ID,\n Signal,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ActivatedRoute, Data } from '@angular/router';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\n\nimport { AnchorNavigationDirective } from './anchor-navigation.directive';\nimport { ContentRenderer } from './content-renderer';\nimport { MERMAID_IMPORT_TOKEN } from './provide-content';\n\n@Component({\n selector: 'analog-markdown',\n standalone: true,\n hostDirectives: [AnchorNavigationDirective],\n preserveWhitespaces: true,\n encapsulation: ViewEncapsulation.None,\n template: ` <div [innerHTML]=\"htmlContent()\" [class]=\"classes()\"></div> `,\n})\nexport default class AnalogMarkdownComponent implements AfterViewChecked {\n private sanitizer = inject(DomSanitizer);\n private route = inject(ActivatedRoute);\n private zone = inject(NgZone);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly mermaidImport = inject(MERMAID_IMPORT_TOKEN, {\n optional: true,\n });\n private mermaid: typeof import('mermaid') | undefined;\n\n private contentSource: Signal<SafeHtml | string | undefined> = toSignal(\n this.getContentSource(),\n );\n readonly htmlContent: Signal<SafeHtml | string | undefined> = computed(() => {\n const inputContent = this.content();\n\n if (inputContent) {\n return this.sanitizer.bypassSecurityTrustHtml(inputContent as string);\n }\n\n return this.contentSource();\n });\n readonly content: InputSignal<string | object | null | undefined> = input<\n string | object | null\n >();\n readonly classes: InputSignal<string> = input('analog-markdown');\n\n contentRenderer: ContentRenderer = inject(ContentRenderer);\n\n constructor() {\n if (isPlatformBrowser(this.platformId) && this.mermaidImport) {\n // Mermaid can only be loaded on client side\n this.loadMermaid(this.mermaidImport);\n }\n }\n\n getContentSource(): Observable<SafeHtml | string> {\n return this.route.data.pipe(\n map<Data, string>((data) => data['_analogContent'] ?? ''),\n switchMap((contentString) => this.renderContent(contentString)),\n map((content) => this.sanitizer.bypassSecurityTrustHtml(content)),\n catchError((e) => of(`There was an error ${e}`)),\n );\n }\n\n async renderContent(content: string): Promise<string> {\n const rendered = await this.contentRenderer.render(content);\n return rendered.content;\n }\n\n ngAfterViewChecked(): void {\n this.contentRenderer.enhance();\n this.zone.runOutsideAngular(() => this.mermaid?.default.run());\n }\n\n private loadMermaid(mermaidImport: Promise<typeof import('mermaid')>) {\n this.zone.runOutsideAngular(() =>\n // Wrap into an observable to avoid redundant initialization once\n // the markdown component is destroyed before the promise is resolved.\n from(mermaidImport)\n .pipe(takeUntilDestroyed())\n .subscribe((mermaid) => {\n this.mermaid = mermaid;\n this.mermaid.default.initialize({ startOnLoad: false });\n // Explicitly running mermaid as ngAfterViewChecked\n // has probably already been called\n this.mermaid?.default.run();\n }),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"analogjs-content.mjs","names":[],"sources":["../../src/lib/anchor-navigation.directive.ts","../../src/lib/utils/zone-wait-for.ts","../../src/lib/content.ts","../../src/lib/utils/escape-html.ts","../../src/lib/marked-setup.service.ts","../../src/lib/markdown-content-renderer.service.ts","../../src/lib/provide-content.ts","../../src/lib/markdown-route.component.ts","../../src/lib/markdown.component.ts"],"sourcesContent":["import { Directive, HostListener, inject } from '@angular/core';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { Router } from '@angular/router';\n\n@Directive({\n selector: '[analogAnchorNavigation]',\n standalone: true,\n})\nexport class AnchorNavigationDirective {\n private readonly document = inject(DOCUMENT);\n private readonly location = inject(Location);\n private readonly router = inject(Router);\n\n @HostListener('click', ['$event.target'])\n handleNavigation(element: EventTarget | null): boolean {\n if (\n element instanceof HTMLAnchorElement &&\n isInternalUrl(element, this.document) &&\n hasTargetSelf(element) &&\n !hasDownloadAttribute(element)\n ) {\n const { pathname, search, hash } = element;\n // A `<base>` element makes the browser resolve fragment-only hrefs\n // (e.g. `href=\"#some-id\"`) against the base URL rather than the\n // current document, so `pathname`/`search` come back as the base's\n // rather than the current page's. Fall back to the document's own\n // location in that case, or an in-page anchor link would navigate\n // to the base route and lose the fragment there.\n const isFragmentOnly = element.getAttribute('href')?.startsWith('#');\n const resolvedPathname = isFragmentOnly\n ? this.document.location.pathname\n : pathname;\n const resolvedSearch = isFragmentOnly\n ? this.document.location.search\n : search;\n const url = this.location.normalize(\n `${resolvedPathname}${resolvedSearch}${hash}`,\n );\n this.router.navigateByUrl(url);\n\n return false;\n }\n\n return true;\n }\n}\n\nfunction hasDownloadAttribute(anchorElement: HTMLAnchorElement): boolean {\n return anchorElement.getAttribute('download') !== null;\n}\n\nfunction hasTargetSelf(anchorElement: HTMLAnchorElement): boolean {\n return !anchorElement.target || anchorElement.target === '_self';\n}\n\nfunction isInternalUrl(\n anchorElement: HTMLAnchorElement,\n document: Document,\n): boolean {\n return (\n anchorElement.host === document.location.host &&\n anchorElement.protocol === document.location.protocol\n );\n}\n","import { firstValueFrom, isObservable, Observable } from 'rxjs';\n\ndeclare const Zone: any;\n\nexport async function waitFor<T>(prom: Promise<T> | Observable<T>): Promise<T> {\n if (isObservable(prom)) {\n prom = firstValueFrom(prom);\n }\n\n if (typeof Zone === 'undefined') {\n return prom;\n }\n\n const macroTask = Zone.current.scheduleMacroTask(\n `AnalogContentResolve-${Math.random()}`,\n () => {\n /* noop */\n },\n {},\n () => {\n /* noop */\n },\n );\n return prom.then((p: T) => {\n macroTask.invoke();\n return p;\n });\n}\n","/// <reference types=\"vite/client\" />\n\nimport { inject } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { from, Observable, of } from 'rxjs';\nimport { finalize, map, switchMap, tap } from 'rxjs/operators';\n\nimport { ContentFile } from './content-file';\nimport { ContentRenderer } from './content-renderer';\nimport { CONTENT_LOCALE, withLocaleCandidates } from './content-locale';\nimport { CONTENT_FILES_TOKEN } from './content-files-token';\nimport { parseRawContentFile } from './parse-raw-content-file';\nimport { waitFor } from './utils/zone-wait-for';\nimport { RenderTaskService } from './render-task.service';\n\nfunction getContentFile<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n contentFiles: Record<string, () => Promise<string>>,\n prefix: string,\n slug: string,\n fallback: string,\n renderTaskService: RenderTaskService,\n contentRenderer: ContentRenderer,\n locale?: string | null,\n): Observable<ContentFile<Attributes | Record<string, never>>> {\n // Normalize file keys so both \"/src/content/...\" and \"/<project>/src/content/...\" resolve.\n const normalizedFiles: Record<string, () => Promise<string>> = {};\n for (const [key, resolver] of Object.entries(contentFiles)) {\n const normalizedKey = key\n .replace(/^(?:.*?)\\/content(?=\\/)/, '/src/content')\n .replace(/\\/{2,}/g, '/');\n normalizedFiles[normalizedKey] = resolver as () => Promise<string>;\n }\n\n const base = `/src/content/${prefix}${slug}`.replace(/\\/{2,}/g, '/');\n const candidates = [`${base}.md`, `${base}/index.md`];\n\n const allCandidates = withLocaleCandidates(candidates, locale);\n const matchKey = allCandidates.find((k) => k in normalizedFiles);\n const contentFile = matchKey ? normalizedFiles[matchKey] : undefined;\n const resolvedBase = (matchKey || `${base}.md`).replace(/\\.md$/, '');\n\n if (!contentFile) {\n return of({\n filename: resolvedBase,\n attributes: {},\n slug: '',\n content: fallback,\n toc: [],\n });\n }\n\n const contentTask = renderTaskService.addRenderTask();\n return new Observable<string | { default: string; metadata: Attributes }>(\n (observer) => {\n // `waitFor` is a no-op in non-Zone environments (browser without zone.js),\n // so this branch works for both SSR and client. Keeping a single path also\n // avoids Rolldown evaluating `import.meta.env.SSR` at library-build time\n // and eliminating the task-clearing branch, which caused SSR to hang once\n // the content map resolved a real lazy import.\n waitFor(contentFile()).then((content) => {\n observer.next(content);\n observer.complete();\n\n setTimeout(() => renderTaskService.clearRenderTask(contentTask), 10);\n });\n },\n ).pipe(\n switchMap((contentFile) => {\n if (typeof contentFile === 'string') {\n const { content, attributes } =\n parseRawContentFile<Attributes>(contentFile);\n return from(contentRenderer.render(content)).pipe(\n map((rendered) => ({\n filename: resolvedBase,\n slug,\n attributes,\n content,\n toc: rendered.toc ?? [],\n })),\n );\n }\n return of({\n filename: resolvedBase,\n slug,\n attributes: contentFile.metadata,\n content: contentFile.default,\n toc: [],\n });\n }),\n finalize(() => {\n if (import.meta.env.SSR !== true) {\n renderTaskService.clearRenderTask(contentTask);\n }\n }),\n );\n}\n\n/**\n * Retrieves the static content using the provided param and/or prefix.\n *\n * @param param route parameter (default: 'slug')\n * @param fallback fallback text if content file is not found (default: 'No Content Found')\n */\nexport function injectContent<\n Attributes extends Record<string, any> = Record<string, any>,\n>(\n param:\n | string\n | {\n param: string;\n subdirectory: string;\n }\n | {\n customFilename: string;\n } = 'slug',\n fallback = 'No Content Found',\n): Observable<ContentFile<Attributes | Record<string, never>>> {\n const contentFiles = inject(CONTENT_FILES_TOKEN);\n const contentRenderer = inject(ContentRenderer);\n const renderTaskService = inject(RenderTaskService);\n const locale = inject(CONTENT_LOCALE, { optional: true });\n const task = renderTaskService.addRenderTask();\n\n if (typeof param === 'string' || 'param' in param) {\n const prefix = typeof param === 'string' ? '' : `${param.subdirectory}/`;\n const route = inject(ActivatedRoute);\n const paramKey = typeof param === 'string' ? param : param.param;\n return route.paramMap.pipe(\n map((params) => params.get(paramKey)),\n switchMap((slug) => {\n if (slug) {\n return getContentFile<Attributes>(\n contentFiles,\n prefix,\n slug,\n fallback,\n renderTaskService,\n contentRenderer,\n locale,\n );\n }\n return of({\n filename: '',\n slug: '',\n attributes: {},\n content: fallback,\n toc: [],\n });\n }),\n tap(() => renderTaskService.clearRenderTask(task)),\n );\n } else {\n return getContentFile<Attributes>(\n contentFiles,\n '',\n param.customFilename,\n fallback,\n renderTaskService,\n contentRenderer,\n locale,\n ).pipe(tap(() => renderTaskService.clearRenderTask(task)));\n }\n}\n","export function escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n}\n\n/**\n * Reduces a fenced code-block info string to a safe language identifier so it\n * cannot break out of the `class=\"language-...\"` attribute it is interpolated\n * into.\n */\nexport function sanitizeLanguage(lang: string | undefined): string {\n return (lang ?? '').match(/^[a-zA-Z0-9-+#.]*/)?.[0] ?? '';\n}\n","/**\n * Credit goes to Scully for original implementation\n * https://github.com/scullyio/scully/blob/main/libs/scully/src/lib/fileHanderPlugins/markdown.ts\n */\nimport { inject, Injectable } from '@angular/core';\nimport { marked } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport { mangle } from 'marked-mangle';\nimport { MarkedContentHighlighter } from './marked-content-highlighter';\nimport { escapeHtml, sanitizeLanguage } from './utils/escape-html';\n\n@Injectable()\nexport class MarkedSetupService {\n private readonly marked: typeof marked;\n private readonly highlighter = inject(MarkedContentHighlighter, {\n optional: true,\n });\n\n constructor() {\n const renderer = new marked.Renderer();\n renderer.code = ({ text, lang }) => {\n // Let's do a language based detection like on GitHub\n // So we can still have non-interpreted mermaid code\n const language = sanitizeLanguage(lang);\n if (language === 'mermaid') {\n return '<pre class=\"mermaid\">' + escapeHtml(text) + '</pre>';\n }\n\n if (!language) {\n return '<pre><code>' + escapeHtml(text) + '</code></pre>';\n }\n\n if (this.highlighter?.augmentCodeBlock) {\n return this.highlighter?.augmentCodeBlock(text, language);\n }\n\n return `<pre class=\"language-${language}\"><code class=\"language-${language}\">${escapeHtml(text)}</code></pre>`;\n };\n\n const extensions = [gfmHeadingId(), mangle()];\n\n if (this.highlighter) {\n extensions.push(this.highlighter.getHighlightExtension());\n }\n\n marked.use(...extensions, {\n renderer,\n pedantic: false,\n gfm: true,\n breaks: false,\n });\n\n this.marked = marked;\n }\n\n getMarkedInstance(): typeof marked {\n return this.marked;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { getHeadingList } from 'marked-gfm-heading-id';\n\nimport {\n ContentRenderer,\n RenderedContent,\n TableOfContentItem,\n} from './content-renderer';\nimport { MarkedSetupService } from './marked-setup.service';\n\n@Injectable()\nexport class MarkdownContentRendererService implements ContentRenderer {\n #marked = inject(MarkedSetupService, { self: true });\n\n async render(content: string): Promise<RenderedContent> {\n const renderedContent = await this.#marked\n .getMarkedInstance()\n .parse(content);\n return {\n content: renderedContent,\n toc: getHeadingList(),\n };\n }\n\n getContentHeadings(content: string): TableOfContentItem[] {\n return [...content.matchAll(/^(#{1,6})\\s+(.+?)\\s*$/gm)].map((match) => ({\n id: match[2]\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-'),\n level: match[1].length,\n text: match[2].trim(),\n }));\n }\n\n // eslint-disable-next-line\n enhance(): void {}\n}\n","import { Provider, InjectionToken } from '@angular/core';\nimport { ContentRenderer, NoopContentRenderer } from './content-renderer';\nimport { RenderTaskService } from './render-task.service';\nimport { withContentFileLoader } from './content-file-loader';\nimport { withContentListLoader } from './content-list-loader';\n\nexport interface MarkdownRendererOptions {\n loadMermaid?: () => Promise<typeof import('mermaid')>;\n}\n\nconst CONTENT_RENDERER_PROVIDERS: Provider[] = [\n {\n provide: ContentRenderer,\n useClass: NoopContentRenderer,\n },\n withContentFileLoader(),\n withContentListLoader(),\n];\n\nexport function withMarkdownRenderer(\n options?: MarkdownRendererOptions,\n): Provider {\n return [\n CONTENT_RENDERER_PROVIDERS,\n options?.loadMermaid\n ? [\n {\n provide: MERMAID_IMPORT_TOKEN,\n useFactory: options.loadMermaid,\n },\n ]\n : [],\n ];\n}\n\nexport function provideContent(...features: Provider[]): Provider[] {\n return [\n { provide: RenderTaskService, useClass: RenderTaskService },\n ...features,\n ];\n}\n\nexport const MERMAID_IMPORT_TOKEN: InjectionToken<\n Promise<typeof import('mermaid')>\n> = new InjectionToken<Promise<typeof import('mermaid')>>('mermaid_import');\n","import {\n AfterViewChecked,\n Component,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { ContentRenderer } from './content-renderer';\nimport { AnchorNavigationDirective } from './anchor-navigation.directive';\n\n@Component({\n selector: 'analog-markdown-route',\n standalone: true,\n imports: [],\n hostDirectives: [AnchorNavigationDirective],\n preserveWhitespaces: true,\n encapsulation: ViewEncapsulation.None,\n template: `<div [innerHTML]=\"content\" [class]=\"classes\"></div>`,\n})\nexport default class AnalogMarkdownRouteComponent implements AfterViewChecked {\n private sanitizer = inject(DomSanitizer);\n private route = inject(ActivatedRoute);\n contentRenderer: ContentRenderer = inject(ContentRenderer);\n\n protected content: SafeHtml = this.sanitizer.bypassSecurityTrustHtml(\n this.route.snapshot.data['renderedAnalogContent'],\n );\n\n @Input() classes = 'analog-markdown-route';\n\n ngAfterViewChecked(): void {\n this.contentRenderer.enhance();\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewChecked,\n Component,\n InputSignal,\n NgZone,\n PLATFORM_ID,\n Signal,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ActivatedRoute, Data } from '@angular/router';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\n\nimport { AnchorNavigationDirective } from './anchor-navigation.directive';\nimport { ContentRenderer } from './content-renderer';\nimport { MERMAID_IMPORT_TOKEN } from './provide-content';\n\n@Component({\n selector: 'analog-markdown',\n standalone: true,\n hostDirectives: [AnchorNavigationDirective],\n preserveWhitespaces: true,\n encapsulation: ViewEncapsulation.None,\n template: ` <div [innerHTML]=\"htmlContent()\" [class]=\"classes()\"></div> `,\n})\nexport default class AnalogMarkdownComponent implements AfterViewChecked {\n private sanitizer = inject(DomSanitizer);\n private route = inject(ActivatedRoute);\n private zone = inject(NgZone);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly mermaidImport = inject(MERMAID_IMPORT_TOKEN, {\n optional: true,\n });\n private mermaid: typeof import('mermaid') | undefined;\n\n private contentSource: Signal<SafeHtml | string | undefined> = toSignal(\n this.getContentSource(),\n );\n readonly htmlContent: Signal<SafeHtml | string | undefined> = computed(() => {\n const inputContent = this.content();\n\n if (inputContent) {\n return this.sanitizer.bypassSecurityTrustHtml(inputContent as string);\n }\n\n return this.contentSource();\n });\n readonly content: InputSignal<string | object | null | undefined> = input<\n string | object | null\n >();\n readonly classes: InputSignal<string> = input('analog-markdown');\n\n contentRenderer: ContentRenderer = inject(ContentRenderer);\n\n constructor() {\n if (isPlatformBrowser(this.platformId) && this.mermaidImport) {\n // Mermaid can only be loaded on client side\n this.loadMermaid(this.mermaidImport);\n }\n }\n\n getContentSource(): Observable<SafeHtml | string> {\n return this.route.data.pipe(\n map<Data, string>((data) => data['_analogContent'] ?? ''),\n switchMap((contentString) => this.renderContent(contentString)),\n map((content) => this.sanitizer.bypassSecurityTrustHtml(content)),\n catchError((e) => of(`There was an error ${e}`)),\n );\n }\n\n async renderContent(content: string): Promise<string> {\n const rendered = await this.contentRenderer.render(content);\n return rendered.content;\n }\n\n ngAfterViewChecked(): void {\n this.contentRenderer.enhance();\n this.zone.runOutsideAngular(() => this.mermaid?.default.run());\n }\n\n private loadMermaid(mermaidImport: Promise<typeof import('mermaid')>) {\n this.zone.runOutsideAngular(() =>\n // Wrap into an observable to avoid redundant initialization once\n // the markdown component is destroyed before the promise is resolved.\n from(mermaidImport)\n .pipe(takeUntilDestroyed())\n .subscribe((mermaid) => {\n this.mermaid = mermaid;\n this.mermaid.default.initialize({ startOnLoad: false });\n // Explicitly running mermaid as ngAfterViewChecked\n // has probably already been called\n this.mermaid?.default.run();\n }),\n );\n }\n}\n"],"mappings":"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"}
@@ -187,7 +187,7 @@ var RenderTaskService = class RenderTaskService {
187
187
  static {
188
188
  this.ɵfac = i0.ɵɵngDeclareFactory({
189
189
  minVersion: "12.0.0",
190
- version: "22.1.5",
190
+ version: "22.2.0",
191
191
  ngImport: i0,
192
192
  type: RenderTaskService,
193
193
  deps: [],
@@ -197,7 +197,7 @@ var RenderTaskService = class RenderTaskService {
197
197
  static {
198
198
  this.ɵprov = i0.ɵɵngDeclareInjectable({
199
199
  minVersion: "12.0.0",
200
- version: "22.1.5",
200
+ version: "22.2.0",
201
201
  ngImport: i0,
202
202
  type: RenderTaskService
203
203
  });
@@ -205,7 +205,7 @@ var RenderTaskService = class RenderTaskService {
205
205
  };
206
206
  i0.ɵɵngDeclareClassMetadata({
207
207
  minVersion: "12.0.0",
208
- version: "22.1.5",
208
+ version: "22.2.0",
209
209
  ngImport: i0,
210
210
  type: RenderTaskService,
211
211
  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: "22.1.5",
18
+ version: "22.2.0",
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: "22.1.5",
28
+ version: "22.2.0",
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: "22.1.5",
36
+ version: "22.2.0",
37
37
  ngImport: i0,
38
38
  type: ContentRenderer,
39
39
  decorators: [{ type: Injectable }]
@@ -5,7 +5,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
5
5
  static {
6
6
  this.ɵfac = i0.ɵɵngDeclareFactory({
7
7
  minVersion: "12.0.0",
8
- version: "22.1.5",
8
+ version: "22.2.0",
9
9
  ngImport: i0,
10
10
  type: MarkedContentHighlighter,
11
11
  deps: [],
@@ -15,7 +15,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
15
15
  static {
16
16
  this.ɵprov = i0.ɵɵngDeclareInjectable({
17
17
  minVersion: "12.0.0",
18
- version: "22.1.5",
18
+ version: "22.2.0",
19
19
  ngImport: i0,
20
20
  type: MarkedContentHighlighter
21
21
  });
@@ -23,7 +23,7 @@ var MarkedContentHighlighter = class MarkedContentHighlighter {
23
23
  };
24
24
  i0.ɵɵngDeclareClassMetadata({
25
25
  minVersion: "12.0.0",
26
- version: "22.1.5",
26
+ version: "22.2.0",
27
27
  ngImport: i0,
28
28
  type: MarkedContentHighlighter,
29
29
  decorators: [{ type: Injectable }]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/content",
3
- "version": "3.0.0-alpha.91",
3
+ "version": "3.0.0-alpha.93",
4
4
  "description": "Content Rendering for Analog",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -108,8 +108,8 @@
108
108
  "tslib": "^2.3.0"
109
109
  },
110
110
  "devDependencies": {
111
- "@analogjs/vite-plugin-angular": "3.0.0-alpha.91",
112
- "@analogjs/vitest-angular": "3.0.0-alpha.91"
111
+ "@analogjs/vite-plugin-angular": "3.0.0-alpha.93",
112
+ "@analogjs/vitest-angular": "3.0.0-alpha.93"
113
113
  },
114
114
  "ng-update": {
115
115
  "packageGroup": [
@@ -29,5 +29,5 @@ export declare class Md4xContentRendererService extends ContentRenderer {
29
29
  render(content: string): Promise<RenderedContent>;
30
30
  getContentHeadings(content: string): TableOfContentItem[];
31
31
  static ɵfac: i0.ɵɵFactoryDeclaration<Md4xContentRendererService, never>;
32
- static ɵprov: i0.ɵɵInjectableDeclaration<Md4xContentRendererService>;
32
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
33
33
  }
@@ -12,5 +12,5 @@ export declare class Md4xWasmContentRendererService extends ContentRenderer {
12
12
  render(content: string): Promise<RenderedContent>;
13
13
  getContentHeadings(content: string): TableOfContentItem[];
14
14
  static ɵfac: i0.ɵɵFactoryDeclaration<Md4xWasmContentRendererService, never>;
15
- static ɵprov: i0.ɵɵInjectableDeclaration<Md4xWasmContentRendererService>;
15
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
16
16
  }
@@ -4,5 +4,5 @@ export declare class PrismHighlighter extends MarkedContentHighlighter {
4
4
  augmentCodeBlock(code: string, lang: string): string;
5
5
  getHighlightExtension(): import('marked').MarkedExtension;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<PrismHighlighter, never>;
7
- static ɵprov: i0.ɵɵInjectableDeclaration<PrismHighlighter>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
8
8
  }
@@ -13,7 +13,7 @@ export declare abstract class ContentRenderer {
13
13
  getContentHeadings(_content: string): TableOfContentItem[];
14
14
  enhance(): void;
15
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ContentRenderer, never>;
16
- static ɵprov: i0.ɵɵInjectableDeclaration<ContentRenderer>;
16
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
17
17
  }
18
18
  export declare class NoopContentRenderer implements ContentRenderer {
19
19
  private readonly transferState;
@@ -6,5 +6,5 @@ export declare class MarkdownContentRendererService implements ContentRenderer {
6
6
  getContentHeadings(content: string): TableOfContentItem[];
7
7
  enhance(): void;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<MarkdownContentRendererService, never>;
9
- static ɵprov: i0.ɵɵInjectableDeclaration<MarkdownContentRendererService>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
10
10
  }
@@ -4,7 +4,7 @@ export declare abstract class MarkedContentHighlighter {
4
4
  augmentCodeBlock?(code: string, lang: string): string;
5
5
  abstract getHighlightExtension(): import('marked').MarkedExtension;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<MarkedContentHighlighter, never>;
7
- static ɵprov: i0.ɵɵInjectableDeclaration<MarkedContentHighlighter>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
8
8
  }
9
9
  export declare function withHighlighter(provider: ({
10
10
  useValue: MarkedContentHighlighter;
@@ -6,5 +6,5 @@ export declare class MarkedSetupService {
6
6
  constructor();
7
7
  getMarkedInstance(): typeof marked;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<MarkedSetupService, never>;
9
- static ɵprov: i0.ɵɵInjectableDeclaration<MarkedSetupService>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
10
10
  }
@@ -4,5 +4,5 @@ export declare class RenderTaskService {
4
4
  addRenderTask(): number;
5
5
  clearRenderTask(clear: number | (() => void)): void;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<RenderTaskService, never>;
7
- static ɵprov: i0.ɵɵInjectableDeclaration<RenderTaskService>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
8
8
  }