@analogjs/content 2.8.0-beta.1 → 2.8.0-beta.11

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.
@@ -1,48 +1,34 @@
1
- import satori from 'satori';
2
- import { html } from 'satori-html';
3
- import sharp from 'sharp';
4
-
5
- // Credit for modified source: https://github.com/etherCorps/sveltekit-og/blob/main/src/lib/api.ts
1
+ import satori from "satori";
2
+ import { html } from "satori-html";
3
+ import sharp from "sharp";
6
4
  const generateImage = async (element, options) => {
7
- const elementHtml = html(element);
8
- const svg = await satori(elementHtml, {
9
- width: options.width || 1200,
10
- height: options.height || 630,
11
- fonts: options.fonts?.length ? options.fonts : [],
12
- tailwindConfig: options.tailwindConfig,
13
- });
14
- const svgBuffer = Buffer.from(svg);
15
- const png = sharp(svgBuffer).png().toBuffer();
16
- const pngBuffer = await png;
17
- return pngBuffer;
5
+ const svg = await satori(html(element), {
6
+ width: options.width || 1200,
7
+ height: options.height || 630,
8
+ fonts: options.fonts?.length ? options.fonts : [],
9
+ tailwindConfig: options.tailwindConfig
10
+ });
11
+ return await sharp(Buffer.from(svg)).png().toBuffer();
12
+ };
13
+ var ImageResponse = class extends Response {
14
+ constructor(element, options = {}) {
15
+ super();
16
+ const body = new ReadableStream({ async start(controller) {
17
+ const buffer = await generateImage(element, options);
18
+ controller.enqueue(buffer);
19
+ controller.close();
20
+ } });
21
+ return new Response(body, {
22
+ headers: {
23
+ "Content-Type": "image/png",
24
+ "Cache-Control": options.debug ? "no-cache, no-store" : "public, immutable, no-transform, max-age=31536000",
25
+ ...options.headers
26
+ },
27
+ status: options.status || 200,
28
+ statusText: options.statusText
29
+ });
30
+ }
18
31
  };
19
- class ImageResponse extends Response {
20
- constructor(element, options = {}) {
21
- super();
22
- const body = new ReadableStream({
23
- async start(controller) {
24
- const buffer = await generateImage(element, options);
25
- controller.enqueue(buffer);
26
- controller.close();
27
- },
28
- });
29
- return new Response(body, {
30
- headers: {
31
- 'Content-Type': 'image/png',
32
- 'Cache-Control': options.debug
33
- ? 'no-cache, no-store'
34
- : 'public, immutable, no-transform, max-age=31536000',
35
- ...options.headers,
36
- },
37
- status: options.status || 200,
38
- statusText: options.statusText,
39
- });
40
- }
41
- }
42
-
43
- /**
44
- * Generated bundle index. Do not edit.
45
- */
46
-
47
32
  export { ImageResponse };
48
- //# sourceMappingURL=analogjs-content-og.mjs.map
33
+
34
+ //# sourceMappingURL=analogjs-content-og.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"analogjs-content-og.mjs","sources":["../../../../packages/content/og/src/lib/og.ts","../../../../packages/content/og/src/analogjs-content-og.ts"],"sourcesContent":["// Credit for modified source: https://github.com/etherCorps/sveltekit-og/blob/main/src/lib/api.ts\n\nimport satori from 'satori';\nimport { html as toReactElement } from 'satori-html';\nimport sharp from 'sharp';\n\nimport { ImageResponseOptions } from './options';\n\nexport const generateImage = async (\n element: string,\n options: ImageResponseOptions,\n) => {\n const elementHtml = toReactElement(element);\n const svg = await satori(elementHtml as any, {\n width: options.width || 1200,\n height: options.height || 630,\n fonts: options.fonts?.length ? options.fonts : [],\n tailwindConfig: options.tailwindConfig,\n });\n const svgBuffer = Buffer.from(svg);\n const png = sharp(svgBuffer).png().toBuffer();\n\n const pngBuffer = await png;\n\n return pngBuffer;\n};\n\nexport class ImageResponse extends Response {\n constructor(element: string, options: ImageResponseOptions = {}) {\n super();\n\n const body = new ReadableStream({\n async start(controller) {\n const buffer = await generateImage(element, options);\n controller.enqueue(buffer);\n controller.close();\n },\n });\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'image/png',\n 'Cache-Control': options.debug\n ? 'no-cache, no-store'\n : 'public, immutable, no-transform, max-age=31536000',\n ...options.headers,\n },\n status: options.status || 200,\n statusText: options.statusText,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["toReactElement"],"mappings":";;;;AAAA;AAQO,MAAM,aAAa,GAAG,OAC3B,OAAe,EACf,OAA6B,KAC3B;AACF,IAAA,MAAM,WAAW,GAAGA,IAAc,CAAC,OAAO,CAAC;AAC3C,IAAA,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAkB,EAAE;AAC3C,QAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;AAC5B,QAAA,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;AAC7B,QAAA,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,EAAE;QACjD,cAAc,EAAE,OAAO,CAAC,cAAc;AACvC,KAAA,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;AAE7C,IAAA,MAAM,SAAS,GAAG,MAAM,GAAG;AAE3B,IAAA,OAAO,SAAS;AAClB,CAAC;AAEK,MAAO,aAAc,SAAQ,QAAQ,CAAA;IACzC,WAAA,CAAY,OAAe,EAAE,OAAA,GAAgC,EAAE,EAAA;AAC7D,QAAA,KAAK,EAAE;AAEP,QAAA,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC;YAC9B,MAAM,KAAK,CAAC,UAAU,EAAA;gBACpB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC;AACpD,gBAAA,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC1B,UAAU,CAAC,KAAK,EAAE;YACpB,CAAC;AACF,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACxB,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,WAAW;gBAC3B,eAAe,EAAE,OAAO,CAAC;AACvB,sBAAE;AACF,sBAAE,mDAAmD;gBACvD,GAAG,OAAO,CAAC,OAAO;AACnB,aAAA;AACD,YAAA,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;YAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;AAC/B,SAAA,CAAC;IACJ;AACD;;ACnDD;;AAEG;;;;"}
1
+ {"version":3,"file":"analogjs-content-og.mjs","names":[],"sources":["../../../../packages/content/og/src/lib/og.ts"],"sourcesContent":["// Credit for modified source: https://github.com/etherCorps/sveltekit-og/blob/main/src/lib/api.ts\n\nimport satori from 'satori';\nimport { html as toReactElement } from 'satori-html';\nimport sharp from 'sharp';\n\nimport { ImageResponseOptions } from './options';\n\nexport const generateImage = async (\n element: string,\n options: ImageResponseOptions,\n) => {\n const elementHtml = toReactElement(element);\n const svg = await satori(elementHtml as any, {\n width: options.width || 1200,\n height: options.height || 630,\n fonts: options.fonts?.length ? options.fonts : [],\n tailwindConfig: options.tailwindConfig,\n });\n const svgBuffer = Buffer.from(svg);\n const png = sharp(svgBuffer).png().toBuffer();\n\n const pngBuffer = await png;\n\n return pngBuffer;\n};\n\nexport class ImageResponse extends Response {\n constructor(element: string, options: ImageResponseOptions = {}) {\n super();\n\n const body = new ReadableStream({\n async start(controller) {\n const buffer = await generateImage(element, options);\n controller.enqueue(buffer);\n controller.close();\n },\n });\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'image/png',\n 'Cache-Control': options.debug\n ? 'no-cache, no-store'\n : 'public, immutable, no-transform, max-age=31536000',\n ...options.headers,\n },\n status: options.status || 200,\n statusText: options.statusText,\n });\n }\n}\n"],"mappings":";;;AAQA,MAAa,gBAAgB,OAC3B,SACA,YACE;CAEF,MAAM,MAAM,MAAM,OADE,KAAe,OACV,GAAoB;EAC3C,OAAO,QAAQ,SAAS;EACxB,QAAQ,QAAQ,UAAU;EAC1B,OAAO,QAAQ,OAAO,SAAS,QAAQ,QAAQ,CAAA;EAC/C,gBAAgB,QAAQ;CACzB,CAAA;CAMD,OAAO,MAJK,MADM,OAAO,KAAK,GACZ,CAAS,CAAC,CAAC,IAAG,CAAE,CAAC,SAEX;AAG1B;AAEA,IAAa,gBAAb,cAAmC,SAAQ;CACzC,YAAY,SAAiB,UAAgC,CAAA,GAAE;EAC7D,MAAK;EAEL,MAAM,OAAO,IAAI,eAAe,EAC9B,MAAM,MAAM,YAAU;GACpB,MAAM,SAAS,MAAM,cAAc,SAAS,OAAO;GACnD,WAAW,QAAQ,MAAM;GACzB,WAAW,MAAK;EAClB,EACD,CAAA;EAED,OAAO,IAAI,SAAS,MAAM;GACxB,SAAS;IACP,gBAAgB;IAChB,iBAAiB,QAAQ,QACrB,uBACA;IACJ,GAAG,QAAQ;GACZ;GACD,QAAQ,QAAQ,UAAU;GAC1B,YAAY,QAAQ;EACrB,CAAA;CACH;AACD"}
@@ -1,27 +1,24 @@
1
- import { MarkedContentHighlighter, NoopContentRenderer, ContentRenderer } from '@analogjs/content';
2
- import * as i0 from '@angular/core';
3
- import { Injectable } from '@angular/core';
4
- import { markedHighlight } from 'marked-highlight';
5
- import 'prismjs';
6
- import 'prismjs/plugins/toolbar/prism-toolbar';
7
- import 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard';
8
-
9
- class PrismHighlighter extends MarkedContentHighlighter {
10
- augmentCodeBlock(code, lang) {
11
- const classes = lang.startsWith('diff') && Prism.languages['diff']
12
- ? `language-${lang} diff-highlight`
13
- : `language-${lang.replace('diff-', '')}`;
14
- return `<pre class="${classes}"><code class="${classes}">${code}</code></pre>`;
15
- }
16
- getHighlightExtension() {
17
- return markedHighlight({
18
- async: true,
19
- highlight: (code, lang) => {
20
- let diff = lang?.startsWith('diff-');
21
- lang = diff ? lang.replace('diff-', '') : lang || 'typescript';
22
- if (diff && !Prism.languages['diff']) {
23
- diff = false;
24
- console.warn(`Notice:
1
+ import { ContentRenderer, MarkedContentHighlighter, NoopContentRenderer } from "@analogjs/content";
2
+ import * as i0 from "@angular/core";
3
+ import { Injectable } from "@angular/core";
4
+ import { markedHighlight } from "marked-highlight";
5
+ import "prismjs";
6
+ import "prismjs/plugins/toolbar/prism-toolbar";
7
+ import "prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard";
8
+ var PrismHighlighter = class PrismHighlighter extends MarkedContentHighlighter {
9
+ augmentCodeBlock(code, lang) {
10
+ const classes = lang.startsWith("diff") && Prism.languages["diff"] ? `language-${lang} diff-highlight` : `language-${lang.replace("diff-", "")}`;
11
+ return `<pre class="${classes}"><code class="${classes}">${code}</code></pre>`;
12
+ }
13
+ getHighlightExtension() {
14
+ return markedHighlight({
15
+ async: true,
16
+ highlight: (code, lang) => {
17
+ let diff = lang?.startsWith("diff-");
18
+ lang = diff ? lang.replace("diff-", "") : lang || "typescript";
19
+ if (diff && !Prism.languages["diff"]) {
20
+ diff = false;
21
+ console.warn(`Notice:
25
22
  ---------------------------------------------------------------------------------------
26
23
  The \`diff\` language and plugin are not available in the provided setup.
27
24
  To enable it, add the following imports your \`app.config.ts\`:
@@ -29,57 +26,67 @@ class PrismHighlighter extends MarkedContentHighlighter {
29
26
  import 'prismjs/plugins/diff-highlight/prism-diff-highlight';
30
27
  ---------------------------------------------------------------------------------------
31
28
  `);
32
- }
33
- if (!Prism.languages[lang]) {
34
- if (lang !== 'mermaid') {
35
- console.warn(`Notice:
29
+ }
30
+ if (!Prism.languages[lang]) {
31
+ if (lang !== "mermaid") console.warn(`Notice:
36
32
  ---------------------------------------------------------------------------------------
37
33
  The requested language '${lang}' is not available in the provided setup.
38
34
  To enable it, add the following import your \`app.config.ts\`:
39
35
  import 'prismjs/components/prism-${lang}';
40
36
  ---------------------------------------------------------------------------------------
41
37
  `);
42
- }
43
- return code;
44
- }
45
- return Prism.highlight(code, diff ? Prism.languages['diff'] : Prism.languages[lang], lang);
46
- },
47
- });
48
- }
49
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PrismHighlighter, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
50
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PrismHighlighter }); }
51
- }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PrismHighlighter, decorators: [{
53
- type: Injectable
54
- }] });
55
-
56
- "use strict";
57
- (function () {
58
- if (typeof Prism === 'undefined') {
59
- return;
60
- }
61
- Prism.languages.angular = Prism.languages.extend('markup', {
62
- keyword: /(?:@if|@for|@switch|@defer|@loading|@error|@placeholder|prefetch)\b/,
63
- operator: /\b(?:on|when)\b/,
64
- number: {
65
- pattern: /\b(minimum|after)\s+\d+(?:s|ms|)/gi,
66
- lookbehind: true,
67
- },
68
- builtin: {
69
- pattern: /\b(?:viewport|timer|minimum|after|hover|idle|immediate|interaction)/,
70
- },
71
- function: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
72
- });
73
- Prism.languages.ng = Prism.languages.angular;
38
+ return code;
39
+ }
40
+ return Prism.highlight(code, diff ? Prism.languages["diff"] : Prism.languages[lang], lang);
41
+ }
42
+ });
43
+ }
44
+ static {
45
+ this.ɵfac = i0.ɵɵngDeclareFactory({
46
+ minVersion: "12.0.0",
47
+ version: "22.2.0",
48
+ ngImport: i0,
49
+ type: PrismHighlighter,
50
+ deps: null,
51
+ target: i0.ɵɵFactoryTarget.Injectable
52
+ });
53
+ }
54
+ static {
55
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
56
+ minVersion: "12.0.0",
57
+ version: "22.2.0",
58
+ ngImport: i0,
59
+ type: PrismHighlighter
60
+ });
61
+ }
62
+ };
63
+ i0.ɵɵngDeclareClassMetadata({
64
+ minVersion: "12.0.0",
65
+ version: "22.2.0",
66
+ ngImport: i0,
67
+ type: PrismHighlighter,
68
+ decorators: [{ type: Injectable }]
69
+ });
70
+ (function() {
71
+ if (typeof Prism === "undefined") return;
72
+ Prism.languages.angular = Prism.languages.extend("markup", {
73
+ keyword: /(?:@if|@for|@switch|@defer|@loading|@error|@placeholder|prefetch)\b/,
74
+ operator: /\b(?:on|when)\b/,
75
+ number: {
76
+ pattern: /\b(minimum|after)\s+\d+(?:s|ms|)/gi,
77
+ lookbehind: true
78
+ },
79
+ builtin: { pattern: /\b(?:viewport|timer|minimum|after|hover|idle|immediate|interaction)/ },
80
+ function: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/
81
+ });
82
+ Prism.languages.ng = Prism.languages.angular;
74
83
  })();
75
-
76
84
  function withPrismHighlighter() {
77
- return [{ provide: ContentRenderer, useClass: NoopContentRenderer }];
85
+ return [{
86
+ provide: ContentRenderer,
87
+ useClass: NoopContentRenderer
88
+ }];
78
89
  }
79
-
80
- /**
81
- * Generated bundle index. Do not edit.
82
- */
83
-
84
90
  export { PrismHighlighter, withPrismHighlighter };
85
- //# sourceMappingURL=analogjs-content-prism-highlighter.mjs.map
91
+
92
+ //# sourceMappingURL=analogjs-content-prism-highlighter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"analogjs-content-prism-highlighter.mjs","sources":["../../../../packages/content/prism-highlighter/src/lib/prism-highlighter.ts","../../../../packages/content/prism-highlighter/src/lib/prism/angular.js","../../../../packages/content/prism-highlighter/src/index.ts","../../../../packages/content/prism-highlighter/src/analogjs-content-prism-highlighter.ts"],"sourcesContent":["import { MarkedContentHighlighter } from '@analogjs/content';\nimport { Injectable } from '@angular/core';\nimport { markedHighlight } from 'marked-highlight';\n\ndeclare const Prism: typeof import('prismjs');\n\ntype HighlightExtension = ReturnType<\n MarkedContentHighlighter['getHighlightExtension']\n>;\n\n@Injectable()\nexport class PrismHighlighter extends MarkedContentHighlighter {\n override augmentCodeBlock(code: string, lang: string): string {\n const classes =\n lang.startsWith('diff') && Prism.languages['diff']\n ? `language-${lang} diff-highlight`\n : `language-${lang.replace('diff-', '')}`;\n return `<pre class=\"${classes}\"><code class=\"${classes}\">${code}</code></pre>`;\n }\n\n override getHighlightExtension(): HighlightExtension {\n return markedHighlight({\n async: true,\n highlight: (code: string, lang: string) => {\n let diff = lang?.startsWith('diff-');\n lang = diff ? lang.replace('diff-', '') : lang || 'typescript';\n\n if (diff && !Prism.languages['diff']) {\n diff = false;\n console.warn(`Notice:\n ---------------------------------------------------------------------------------------\n The \\`diff\\` language and plugin are not available in the provided setup.\n To enable it, add the following imports your \\`app.config.ts\\`:\n import 'prismjs/components/prism-diff';\n import 'prismjs/plugins/diff-highlight/prism-diff-highlight';\n ---------------------------------------------------------------------------------------\n `);\n }\n\n if (!Prism.languages[lang]) {\n if (lang !== 'mermaid') {\n console.warn(`Notice:\n ---------------------------------------------------------------------------------------\n The requested language '${lang}' is not available in the provided setup.\n To enable it, add the following import your \\`app.config.ts\\`:\n import 'prismjs/components/prism-${lang}';\n ---------------------------------------------------------------------------------------\n `);\n }\n return code;\n }\n return Prism.highlight(\n code,\n diff ? Prism.languages['diff'] : Prism.languages[lang],\n lang,\n );\n },\n }) as HighlightExtension;\n }\n}\n","(function () {\n if (typeof Prism === 'undefined') {\n return;\n }\n\n Prism.languages.angular = Prism.languages.extend('markup', {\n keyword:\n /(?:@if|@for|@switch|@defer|@loading|@error|@placeholder|prefetch)\\b/,\n operator: /\\b(?:on|when)\\b/,\n number: {\n pattern: /\\b(minimum|after)\\s+\\d+(?:s|ms|)/gi,\n lookbehind: true,\n },\n builtin: {\n pattern:\n /\\b(?:viewport|timer|minimum|after|hover|idle|immediate|interaction)/,\n },\n function:\n /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n });\n\n Prism.languages.ng = Prism.languages.angular;\n})();\n","import { ContentRenderer, NoopContentRenderer } from '@analogjs/content';\nimport { Provider } from '@angular/core';\nimport { PrismHighlighter } from './lib/prism-highlighter';\n\nimport 'prismjs';\nimport 'prismjs/plugins/toolbar/prism-toolbar';\nimport 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard';\nimport './lib/prism/angular';\n\nexport { PrismHighlighter };\n\nexport function withPrismHighlighter(): Provider[] {\n return [{ provide: ContentRenderer, useClass: NoopContentRenderer }];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAWM,MAAO,gBAAiB,SAAQ,wBAAwB,CAAA;IACnD,gBAAgB,CAAC,IAAY,EAAE,IAAY,EAAA;AAClD,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM;cAC7C,CAAA,SAAA,EAAY,IAAI,CAAA,eAAA;cAChB,CAAA,SAAA,EAAY,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA,CAAE;AAC7C,QAAA,OAAO,eAAe,OAAO,CAAA,eAAA,EAAkB,OAAO,CAAA,EAAA,EAAK,IAAI,eAAe;IAChF;IAES,qBAAqB,GAAA;AAC5B,QAAA,OAAO,eAAe,CAAC;AACrB,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,SAAS,EAAE,CAAC,IAAY,EAAE,IAAY,KAAI;gBACxC,IAAI,IAAI,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;AACpC,gBAAA,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,YAAY;gBAE9D,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;oBACpC,IAAI,GAAG,KAAK;oBACZ,OAAO,CAAC,IAAI,CAAC,CAAA;;;;;;;AAOV,YAAA,CAAA,CAAC;gBACN;gBAEA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AAC1B,oBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;wBACtB,OAAO,CAAC,IAAI,CAAC,CAAA;;8BAEK,IAAI,CAAA;;yCAEO,IAAI,CAAA;;AAE9B,cAAA,CAAA,CAAC;oBACN;AACA,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,KAAK,CAAC,SAAS,CACpB,IAAI,EACJ,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EACtD,IAAI,CACL;YACH,CAAC;AACF,SAAA,CAAuB;IAC1B;8GA/CW,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAhB,gBAAgB,EAAA,CAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;;ACVD,CAAC,YAAA;AACC,IAAA,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;QAChC;IACF;AAEA,IAAA,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE;AACzD,QAAA,OAAO,EACL,qEAAqE;AACvE,QAAA,QAAQ,EAAE,iBAAiB;AAC3B,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,oCAAoC;AAC7C,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EACL,qEAAqE;AACxE,SAAA;AACD,QAAA,QAAQ,EACN,mGAAmG;AACtG,KAAA,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO;AAC9C,CAAC,GAAG;;SCXY,oBAAoB,GAAA;IAClC,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;AACtE;;ACbA;;AAEG;;;;"}
1
+ {"version":3,"file":"analogjs-content-prism-highlighter.mjs","names":[],"sources":["../../../../packages/content/prism-highlighter/src/lib/prism-highlighter.ts","../../../../packages/content/prism-highlighter/src/lib/prism/angular.js","../../../../packages/content/prism-highlighter/src/index.ts"],"sourcesContent":["import { MarkedContentHighlighter } from '@analogjs/content';\nimport { Injectable } from '@angular/core';\nimport { markedHighlight } from 'marked-highlight';\n\ndeclare const Prism: typeof import('prismjs');\n\ntype HighlightExtension = ReturnType<\n MarkedContentHighlighter['getHighlightExtension']\n>;\n\n@Injectable()\nexport class PrismHighlighter extends MarkedContentHighlighter {\n override augmentCodeBlock(code: string, lang: string): string {\n const classes =\n lang.startsWith('diff') && Prism.languages['diff']\n ? `language-${lang} diff-highlight`\n : `language-${lang.replace('diff-', '')}`;\n return `<pre class=\"${classes}\"><code class=\"${classes}\">${code}</code></pre>`;\n }\n\n override getHighlightExtension(): HighlightExtension {\n return markedHighlight({\n async: true,\n highlight: (code: string, lang: string) => {\n let diff = lang?.startsWith('diff-');\n lang = diff ? lang.replace('diff-', '') : lang || 'typescript';\n\n if (diff && !Prism.languages['diff']) {\n diff = false;\n console.warn(`Notice:\n ---------------------------------------------------------------------------------------\n The \\`diff\\` language and plugin are not available in the provided setup.\n To enable it, add the following imports your \\`app.config.ts\\`:\n import 'prismjs/components/prism-diff';\n import 'prismjs/plugins/diff-highlight/prism-diff-highlight';\n ---------------------------------------------------------------------------------------\n `);\n }\n\n if (!Prism.languages[lang]) {\n if (lang !== 'mermaid') {\n console.warn(`Notice:\n ---------------------------------------------------------------------------------------\n The requested language '${lang}' is not available in the provided setup.\n To enable it, add the following import your \\`app.config.ts\\`:\n import 'prismjs/components/prism-${lang}';\n ---------------------------------------------------------------------------------------\n `);\n }\n return code;\n }\n return Prism.highlight(\n code,\n diff ? Prism.languages['diff'] : Prism.languages[lang],\n lang,\n );\n },\n }) as HighlightExtension;\n }\n}\n","(function () {\n if (typeof Prism === 'undefined') {\n return;\n }\n\n Prism.languages.angular = Prism.languages.extend('markup', {\n keyword:\n /(?:@if|@for|@switch|@defer|@loading|@error|@placeholder|prefetch)\\b/,\n operator: /\\b(?:on|when)\\b/,\n number: {\n pattern: /\\b(minimum|after)\\s+\\d+(?:s|ms|)/gi,\n lookbehind: true,\n },\n builtin: {\n pattern:\n /\\b(?:viewport|timer|minimum|after|hover|idle|immediate|interaction)/,\n },\n function:\n /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n });\n\n Prism.languages.ng = Prism.languages.angular;\n})();\n","import { ContentRenderer, NoopContentRenderer } from '@analogjs/content';\nimport { Provider } from '@angular/core';\nimport { PrismHighlighter } from './lib/prism-highlighter';\n\nimport 'prismjs';\nimport 'prismjs/plugins/toolbar/prism-toolbar';\nimport 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard';\nimport './lib/prism/angular';\n\nexport { PrismHighlighter };\n\nexport function withPrismHighlighter(): Provider[] {\n return [{ provide: ContentRenderer, useClass: NoopContentRenderer }];\n}\n"],"mappings":";;;;;;;AAWA,IAAa,mBAAb,MAAa,yBAAyB,yBAAwB;CACnD,iBAAiB,MAAc,MAAY;EAClD,MAAM,UACJ,KAAK,WAAW,MAAM,KAAK,MAAM,UAAU,UACvC,YAAY,KAAI,mBAChB,YAAY,KAAK,QAAQ,SAAS,EAAE;EAC1C,OAAO,eAAe,QAAO,iBAAkB,QAAO,IAAK,KAAI;CACjE;CAES,wBAAqB;EAC5B,OAAO,gBAAgB;GACrB,OAAO;GACP,YAAY,MAAc,SAAgB;IACxC,IAAI,OAAO,MAAM,WAAW,OAAO;IACnC,OAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,IAAI,QAAQ;IAElD,IAAI,QAAQ,CAAC,MAAM,UAAU,SAAS;KACpC,OAAO;KACP,QAAQ,KAAK;;;;;;;aAOV;IACL;IAEA,IAAI,CAAC,MAAM,UAAU,OAAO;KAC1B,IAAI,SAAS,WACX,QAAQ,KAAK;;8BAEK,KAAI;;yCAEO,KAAI;;eAE9B;KAEL,OAAO;IACT;IACA,OAAO,MAAM,UACX,MACA,OAAO,MAAM,UAAU,UAAU,MAAM,UAAU,OACjD,IAAI;GAER;EACD,CAAA;CACH;CA/CW;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAhB;EAAA,KAAA,QAAA,GAAA,sBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;EAAgB,CAAA;CAAA;;AAAhB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA,EAD5B,MAAA,WAAA,CAAA;;CCVA,WAAA;CACC,IAAI,OAAO,UAAU,aACnB;CAGF,MAAM,UAAU,UAAU,MAAM,UAAU,OAAO,UAAU;EACzD,SACE;EACF,UAAU;EACV,QAAQ;GACN,SAAS;GACT,YAAY;EACb;EACD,SAAS,EACP,SACE,sEACH;EACD,UACE;CACH,CAAA;CAED,MAAM,UAAU,KAAK,MAAM,UAAU;AACvC,EAAA,CAAE;ACXF,SAAgB,uBAAoB;CAClC,OAAO,CAAC;EAAE,SAAS;EAAiB,UAAU;CAAmB,CAAE;AACrE"}
@@ -1,151 +1,114 @@
1
- import { resource, inject, computed } from '@angular/core';
2
- import { injectContentListLoader, injectContentLocale, filterByLocale, parseRawContentFile, injectContentFileLoader, ContentRenderer } from '@analogjs/content';
3
- import { ActivatedRoute } from '@angular/router';
4
- import { toSignal } from '@angular/core/rxjs-interop';
5
- import { from } from 'rxjs';
6
- import { map } from 'rxjs/operators';
7
-
1
+ import { computed, inject, resource } from "@angular/core";
2
+ import { ContentRenderer, filterByLocale, injectContentFileLoader, injectContentListLoader, injectContentLocale, parseRawContentFile } from "@analogjs/content";
3
+ import { ActivatedRoute } from "@angular/router";
4
+ import { toSignal } from "@angular/core/rxjs-interop";
5
+ import { from } from "rxjs";
6
+ import { map } from "rxjs/operators";
8
7
  function contentFilesResource(filterFn) {
9
- const contentListLoader = injectContentListLoader();
10
- const locale = injectContentLocale();
11
- const contentList = contentListLoader().then((items) => {
12
- let results = locale ? filterByLocale(items, locale) : items;
13
- if (filterFn) {
14
- results = results.filter(filterFn);
15
- }
16
- return results;
17
- });
18
- return resource({
19
- loader: () => contentList,
20
- });
8
+ const contentListLoader = injectContentListLoader();
9
+ const locale = injectContentLocale();
10
+ const contentList = contentListLoader().then((items) => {
11
+ let results = locale ? filterByLocale(items, locale) : items;
12
+ if (filterFn) results = results.filter(filterFn);
13
+ return results;
14
+ });
15
+ return resource({ loader: () => contentList });
21
16
  }
22
-
23
17
  async function getContentFile(contentFiles, slug, fallback, locale) {
24
- // Normalize file keys so both "/src/content/..." and "/<project>/src/content/..." resolve.
25
- // This mirrors normalization used elsewhere in the content pipeline.
26
- const normalizedFiles = {};
27
- const stemToKey = {};
28
- for (const [key, resolver] of Object.entries(contentFiles)) {
29
- const normalizedKey = key
30
- // replace any prefix up to the content directory with /src/content
31
- // use a non-greedy match so nested paths containing "/content" are preserved
32
- .replace(/^(?:.*?)\/content(?=\/)/, '/src/content')
33
- // normalize duplicate slashes
34
- .replace(/\/{2,}/g, '/');
35
- normalizedFiles[normalizedKey] = resolver;
36
- // Index by bare filename stem so slug-only lookups work
37
- const stem = normalizedKey
38
- .split('/')
39
- .pop()
40
- ?.replace(/\.[^.]+$/, '');
41
- if (stem && !stemToKey[stem]) {
42
- stemToKey[stem] = normalizedKey;
43
- }
44
- }
45
- // Try direct file first, then directory index variants, then bare slug via stem
46
- const base = `/src/content/${slug}`.replace(/\/{2,}/g, '/');
47
- const candidates = [
48
- `${base}.md`,
49
- `${base}.agx`,
50
- `${base}/index.md`,
51
- `${base}/index.agx`,
52
- ];
53
- // Try locale-prefixed paths first, then fall back to unprefixed, then bare slug via stem
54
- const localeCandidates = locale
55
- ? candidates.map((c) => c.replace('/src/content/', `/src/content/${locale}/`))
56
- : [];
57
- const allCandidates = [...localeCandidates, ...candidates];
58
- const matchKey = allCandidates.find((k) => k in normalizedFiles) ?? stemToKey[slug];
59
- const contentFile = matchKey ? normalizedFiles[matchKey] : undefined;
60
- if (!contentFile) {
61
- return {
62
- filename: base,
63
- attributes: {},
64
- slug: '',
65
- content: fallback,
66
- };
67
- }
68
- const resolvedBase = matchKey.replace(/\.(md|agx)$/, '');
69
- return contentFile().then((contentFile) => {
70
- if (typeof contentFile === 'string') {
71
- const { content, attributes } = parseRawContentFile(contentFile);
72
- return {
73
- filename: resolvedBase,
74
- slug,
75
- attributes,
76
- content,
77
- };
78
- }
79
- return {
80
- filename: resolvedBase,
81
- slug,
82
- attributes: contentFile.metadata,
83
- content: contentFile.default,
84
- };
85
- });
18
+ const normalizedFiles = {};
19
+ const stemToKey = {};
20
+ for (const [key, resolver] of Object.entries(contentFiles)) {
21
+ const normalizedKey = key.replace(/^(?:.*?)\/content(?=\/)/, "/src/content").replace(/\/{2,}/g, "/");
22
+ normalizedFiles[normalizedKey] = resolver;
23
+ const stem = normalizedKey.split("/").pop()?.replace(/\.[^.]+$/, "");
24
+ if (stem && !stemToKey[stem]) stemToKey[stem] = normalizedKey;
25
+ }
26
+ const base = `/src/content/${slug}`.replace(/\/{2,}/g, "/");
27
+ const candidates = [
28
+ `${base}.md`,
29
+ `${base}.agx`,
30
+ `${base}/index.md`,
31
+ `${base}/index.agx`
32
+ ];
33
+ const matchKey = [...locale ? candidates.map((c) => c.replace("/src/content/", `/src/content/${locale}/`)) : [], ...candidates].find((k) => k in normalizedFiles) ?? stemToKey[slug];
34
+ const contentFile = matchKey ? normalizedFiles[matchKey] : void 0;
35
+ if (!contentFile) return {
36
+ filename: base,
37
+ attributes: {},
38
+ slug: "",
39
+ content: fallback
40
+ };
41
+ const resolvedBase = matchKey.replace(/\.(md|agx)$/, "");
42
+ return contentFile().then((contentFile) => {
43
+ if (typeof contentFile === "string") {
44
+ const { content, attributes } = parseRawContentFile(contentFile);
45
+ return {
46
+ filename: resolvedBase,
47
+ slug,
48
+ attributes,
49
+ content
50
+ };
51
+ }
52
+ return {
53
+ filename: resolvedBase,
54
+ slug,
55
+ attributes: contentFile.metadata,
56
+ content: contentFile.default
57
+ };
58
+ });
86
59
  }
87
- /**
88
- * Resource for requesting an individual content file
89
- *
90
- * @param params
91
- * @param fallback
92
- * @returns
93
- */
94
- function contentFileResource(params, fallback = 'No Content Found') {
95
- const loaderPromise = injectContentFileLoader();
96
- const contentRenderer = inject(ContentRenderer);
97
- const locale = injectContentLocale();
98
- const contentFilesMap = toSignal(from(loaderPromise()));
99
- const input = params ||
100
- toSignal(inject(ActivatedRoute).paramMap.pipe(map((params) => params.get('slug'))), { requireSync: true });
101
- return resource({
102
- params: computed(() => ({ input: input(), files: contentFilesMap() })),
103
- loader: async ({ params }) => {
104
- const { input: param, files } = params;
105
- if (typeof param === 'string') {
106
- if (param) {
107
- const file = await getContentFile(files, param, fallback, locale);
108
- if (typeof file.content === 'string') {
109
- const rendered = (await contentRenderer.render(file.content));
110
- return {
111
- ...file,
112
- toc: rendered.toc ?? [],
113
- };
114
- }
115
- return {
116
- ...file,
117
- toc: [],
118
- };
119
- }
120
- return {
121
- filename: '',
122
- slug: '',
123
- attributes: {},
124
- content: fallback,
125
- toc: [],
126
- };
127
- }
128
- else {
129
- const file = await getContentFile(files, param.customFilename, fallback, locale);
130
- if (typeof file.content === 'string') {
131
- const rendered = (await contentRenderer.render(file.content));
132
- return {
133
- ...file,
134
- toc: rendered.toc ?? [],
135
- };
136
- }
137
- return {
138
- ...file,
139
- toc: [],
140
- };
141
- }
142
- },
143
- });
60
+ function contentFileResource(params, fallback = "No Content Found") {
61
+ const loaderPromise = injectContentFileLoader();
62
+ const contentRenderer = inject(ContentRenderer);
63
+ const locale = injectContentLocale();
64
+ const contentFilesMap = toSignal(from(loaderPromise()));
65
+ const input = params || toSignal(inject(ActivatedRoute).paramMap.pipe(map((params) => params.get("slug"))), { requireSync: true });
66
+ return resource({
67
+ params: computed(() => ({
68
+ input: input(),
69
+ files: contentFilesMap()
70
+ })),
71
+ loader: async ({ params }) => {
72
+ const { input: param, files } = params;
73
+ if (typeof param === "string") {
74
+ if (param) {
75
+ const file = await getContentFile(files, param, fallback, locale);
76
+ if (typeof file.content === "string") {
77
+ const rendered = await contentRenderer.render(file.content);
78
+ return {
79
+ ...file,
80
+ toc: rendered.toc ?? []
81
+ };
82
+ }
83
+ return {
84
+ ...file,
85
+ toc: []
86
+ };
87
+ }
88
+ return {
89
+ filename: "",
90
+ slug: "",
91
+ attributes: {},
92
+ content: fallback,
93
+ toc: []
94
+ };
95
+ } else {
96
+ const file = await getContentFile(files, param.customFilename, fallback, locale);
97
+ if (typeof file.content === "string") {
98
+ const rendered = await contentRenderer.render(file.content);
99
+ return {
100
+ ...file,
101
+ toc: rendered.toc ?? []
102
+ };
103
+ }
104
+ return {
105
+ ...file,
106
+ toc: []
107
+ };
108
+ }
109
+ }
110
+ });
144
111
  }
145
-
146
- /**
147
- * Generated bundle index. Do not edit.
148
- */
149
-
150
112
  export { contentFileResource, contentFilesResource };
151
- //# sourceMappingURL=analogjs-content-resources.mjs.map
113
+
114
+ //# sourceMappingURL=analogjs-content-resources.mjs.map
@@ -1 +1 @@
1
- {"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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"}
1
+ {"version":3,"file":"analogjs-content-resources.mjs","names":[],"sources":["../../../../packages/content/resources/src/content-files-resource.ts","../../../../packages/content/resources/src/content-file-resource.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"],"mappings":";;;;;;AAQA,SAAgB,qBACd,UAAmE;CAEnE,MAAM,oBAAoB,wBAAuB;CACjD,MAAM,SAAS,oBAAmB;CAClC,MAAM,cAAc,kBAAiB,CAAE,CAAC,MAAM,UAAS;EACrD,IAAI,UAAU,SAAS,eAAe,OAAO,MAAM,IAAI;EACvD,IAAI,UACF,UAAU,QAAQ,OAAO,QAAQ;EAEnC,OAAO;CACT,CAAC;CAED,OAAO,SAAS,EACd,cAAc,YACf,CAAA;AACH;ACHA,eAAe,eAGb,cACA,MACA,UACA,QAAsB;CAItB,MAAM,kBAAyD,CAAA;CAC/D,MAAM,YAAoC,CAAA;CAC1C,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,YAAY,GAAG;EAC1D,MAAM,gBAAgB,IAGnB,QAAQ,2BAA2B,cAAc,CAAC,CAElD,QAAQ,WAAW,GAAG;EACzB,gBAAgB,iBAAiB;EAEjC,MAAM,OAAO,cACV,MAAM,GAAG,CAAC,CACV,IAAG,CAAE,EACJ,QAAQ,YAAY,EAAE;EAC1B,IAAI,QAAQ,CAAC,UAAU,OACrB,UAAU,QAAQ;CAEtB;CAGA,MAAM,OAAO,gBAAgB,OAAO,QAAQ,WAAW,GAAG;CAC1D,MAAM,aAAa;EACjB,GAAG,KAAI;EACP,GAAG,KAAI;EACP,GAAG,KAAI;EACP,GAAG,KAAI;CACR;CASD,MAAM,WACJ,CAFqB,GALE,SACrB,WAAW,KAAK,MACd,EAAE,QAAQ,iBAAiB,gBAAgB,OAAM,EAAG,CAAC,IAEvD,CAAA,GACwC,GAAG,UAE7C,CAAA,CAAc,MAAM,MAAM,KAAK,eAAe,KAAK,UAAU;CAC/D,MAAM,cAAc,WAAW,gBAAgB,YAAY;CAE3D,IAAI,CAAC,aACH,OAAO;EACL,UAAU;EACV,YAAY,CAAA;EACZ,MAAM;EACN,SAAS;CACyC;CAGtD,MAAM,eAAe,SAAU,QAAQ,eAAe,EAAE;CAExD,OAAO,YAAW,CAAE,CAAC,MAClB,gBAAyD;EACxD,IAAI,OAAO,gBAAgB,UAAU;GACnC,MAAM,EAAE,SAAS,eACf,oBAAgC,WAAW;GAE7C,OAAO;IACL,UAAU;IACV;IACA;IACA;GACkD;EACtD;EAEA,OAAO;GACL,UAAU;GACV;GACA,YAAY,YAAY;GACxB,SAAS,YAAY;EAC6B;CACtD,CAAC;AAEL;AASA,SAAgB,oBAEd,QAA4B,WAAW,oBAAkB;CACzD,MAAM,gBAAgB,wBAAuB;CAC7C,MAAM,kBAAkB,OAAO,eAAe;CAC9C,MAAM,SAAS,oBAAmB;CAClC,MAAM,kBAAkB,SAAS,KAAK,cAAa,CAAE,CAAC;CACtD,MAAM,QACJ,UACA,SACE,OAAO,cAAc,CAAC,CAAC,SAAS,KAC9B,KAAK,WAAW,OAAO,IAAI,MAAM,CAAW,CAAC,GAE/C,EAAE,aAAa,KAAI,CAAE;CAGzB,OAAO,SAAS;EACd,QAAQ,gBAAgB;GAAE,OAAO,MAAK;GAAI,OAAO,gBAAe;EAAE,EAAG;EACrE,QAAQ,OAAO,EAAE,aAAY;GAC3B,MAAM,EAAE,OAAO,OAAO,UAAU;GAEhC,IAAI,OAAO,UAAU,UAAU;IAC7B,IAAI,OAAO;KACT,MAAM,OAAO,MAAM,eACjB,OACA,OACA,UACA,MAAM;KAER,IAAI,OAAO,KAAK,YAAY,UAAU;MACpC,MAAM,WAAY,MAAM,gBAAgB,OAAO,KAAK,OAAO;MAG3D,OAAO;OACL,GAAG;OACH,KAAK,SAAS,OAAO,CAAA;MACtB;KACH;KACA,OAAO;MACL,GAAG;MACH,KAAK,CAAA;KACN;IACH;IAEA,OAAO;KACL,UAAU;KACV,MAAM;KACN,YAAY,CAAA;KACZ,SAAS;KACT,KAAK,CAAA;IAC6C;GACtD,OAAO;IACL,MAAM,OAAO,MAAM,eACjB,OACA,MAAM,gBACN,UACA,MAAM;IAER,IAAI,OAAO,KAAK,YAAY,UAAU;KACpC,MAAM,WAAY,MAAM,gBAAgB,OAAO,KAAK,OAAO;KAG3D,OAAO;MACL,GAAG;MACH,KAAK,SAAS,OAAO,CAAA;KACtB;IACH;IACA,OAAO;KACL,GAAG;KACH,KAAK,CAAA;IACN;GACH;EACF;CACD,CAAA;AACH"}