payload-plugin-llms 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +134 -61
  2. package/dist/global.d.ts +4 -0
  3. package/dist/global.d.ts.map +1 -0
  4. package/dist/index.cjs +13 -8
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.ts +7 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +13 -7
  9. package/dist/index.js.map +1 -1
  10. package/dist/lexical.d.ts +28 -4
  11. package/dist/lexical.d.ts.map +1 -1
  12. package/dist/llms-lexical.d.ts +4 -0
  13. package/dist/llms-lexical.d.ts.map +1 -0
  14. package/dist/llms-txt.d.ts +48 -7
  15. package/dist/llms-txt.d.ts.map +1 -1
  16. package/dist/next/headers.d.ts +0 -1
  17. package/dist/next/headers.d.ts.map +1 -1
  18. package/dist/next/index.cjs +1 -2
  19. package/dist/next/index.cjs.map +1 -1
  20. package/dist/next/index.d.ts +3 -5
  21. package/dist/next/index.d.ts.map +1 -1
  22. package/dist/next/index.js +1 -1
  23. package/dist/next/index.js.map +1 -1
  24. package/dist/next/llms-txt-response.d.ts +7 -0
  25. package/dist/next/llms-txt-response.d.ts.map +1 -0
  26. package/dist/next/markdown-response.d.ts +4 -0
  27. package/dist/next/markdown-response.d.ts.map +1 -0
  28. package/dist/next/rewrites.d.ts +32 -7
  29. package/dist/next/rewrites.d.ts.map +1 -1
  30. package/dist/next/types.d.ts +2 -0
  31. package/dist/next/types.d.ts.map +1 -1
  32. package/dist/options.d.ts.map +1 -1
  33. package/dist/plugin.d.ts.map +1 -1
  34. package/dist/types.d.ts +42 -9
  35. package/dist/types.d.ts.map +1 -1
  36. package/package.json +12 -5
  37. package/dist/chunk-B5YH4Y5S.js +0 -3
  38. package/dist/chunk-B5YH4Y5S.js.map +0 -1
  39. package/dist/next/llms-route.d.ts +0 -12
  40. package/dist/next/llms-route.d.ts.map +0 -1
  41. package/dist/next/markdown-route.d.ts +0 -34
  42. package/dist/next/markdown-route.d.ts.map +0 -1
package/dist/lexical.d.ts CHANGED
@@ -1,17 +1,41 @@
1
- export type SerializedLexicalNode = {
1
+ /** Minimal serialized Lexical node shape accepted by the markdown converter. */
2
+ export interface SerializedLexicalNode {
3
+ /** Lexical node type, such as `paragraph`, `heading`, `text`, or `link`. */
2
4
  type?: string;
3
5
  [key: string]: unknown;
4
- };
5
- export type LexicalToMarkdownOptions = {
6
+ }
7
+ /** Options for converting serialized Lexical content to markdown. */
8
+ export interface LexicalToMarkdownOptions {
9
+ /** Resolves Payload/Lexical internal link references to public URLs. */
6
10
  resolveInternalLink?: (reference: {
11
+ /** Collection slug for the linked document. */
7
12
  relationTo?: string;
13
+ /** Linked document id or populated document value. */
8
14
  value?: unknown;
15
+ /** Fallback URL stored on the Lexical link node. */
9
16
  url?: string;
10
17
  }) => string | null | undefined;
11
- };
18
+ }
19
+ /** Options for async Lexical → markdown conversion (includes serialized block nodes). */
20
+ export interface LexicalToMarkdownAsyncOptions extends LexicalToMarkdownOptions {
21
+ /**
22
+ * When a serialized `block` node is encountered, returns markdown for that block’s `fields`.
23
+ * If omitted, block nodes produce no output.
24
+ */
25
+ resolveLexicalBlock?: (fields: Record<string, unknown>) => Promise<string> | string;
26
+ }
12
27
  export declare function lexicalToMarkdown(data: {
13
28
  root?: {
14
29
  children?: SerializedLexicalNode[];
15
30
  };
16
31
  }, options?: LexicalToMarkdownOptions): string;
32
+ /**
33
+ * Like {@link lexicalToMarkdown}, but resolves top-level serialized `block` nodes via
34
+ * `resolveLexicalBlock`.
35
+ */
36
+ export declare function lexicalToMarkdownAsync(data: {
37
+ root?: {
38
+ children?: SerializedLexicalNode[];
39
+ };
40
+ } | null | undefined, options?: LexicalToMarkdownAsyncOptions): Promise<string>;
17
41
  //# sourceMappingURL=lexical.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lexical.d.ts","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAwBD,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE;QAChC,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAChC,CAAA;AAQD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAA;CAAE,EACvD,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAGR"}
1
+ {"version":3,"file":"lexical.d.ts","sourceRoot":"","sources":["../src/lexical.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAwBD,qEAAqE;AACrE,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE;QAChC,+CAA+C;QAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,sDAAsD;QACtD,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,oDAAoD;QACpD,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAChC;AAED,yFAAyF;AACzF,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC7E;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;CACpF;AAQD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAA;CAAE,EACvD,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EAC1E,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,4 @@
1
+ import type { RichTextField } from "payload";
2
+ /** Lexical editor for llms opening content and section bodies (headings, lists, quotes, rules, default rich-text features). */
3
+ export declare function createLlmsLexicalEditor(): NonNullable<RichTextField["editor"]>;
4
+ //# sourceMappingURL=llms-lexical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-lexical.d.ts","sourceRoot":"","sources":["../src/llms-lexical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAW5C,+HAA+H;AAC/H,wBAAgB,uBAAuB,IAAI,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAW9E"}
@@ -1,20 +1,61 @@
1
- export type LlmsTxtLink = {
1
+ import { type LexicalToMarkdownAsyncOptions } from "./lexical";
2
+ import type { Payload, PayloadRequest } from "payload";
3
+ /** Link entry rendered inside a structured llms.txt section (legacy builder). */
4
+ export interface LlmsTxtLink {
5
+ /** Link label rendered inside the markdown link. */
2
6
  title: string;
7
+ /** Link destination URL. */
3
8
  url: string;
9
+ /** Optional text appended after the link. */
4
10
  description?: string | null;
5
- };
6
- export type LlmsTxtSection = {
11
+ }
12
+ /** Section rendered in a structured llms.txt document (legacy builder). */
13
+ export interface LlmsTxtSection {
14
+ /** Section heading. */
7
15
  title: string;
16
+ /** Paragraph content rendered before section links. */
8
17
  content?: string | string[];
18
+ /** Links rendered in the section. */
9
19
  links?: LlmsTxtLink[];
10
- };
11
- export type LlmsTxtContent = {
20
+ }
21
+ /** Structured content used to build an llms.txt document without Lexical (legacy builder). */
22
+ export interface LlmsTxtContent {
23
+ /** Optional document title rendered as the top-level heading. */
12
24
  title?: string;
25
+ /** Optional blockquote description rendered below the title. */
13
26
  description?: string;
27
+ /** Intro paragraphs rendered before sections. */
14
28
  intro?: string | string[];
29
+ /** Sections rendered in order. */
15
30
  sections?: LlmsTxtSection[];
31
+ /** Footer paragraphs rendered after sections. */
16
32
  footer?: string | string[];
17
- };
33
+ }
34
+ export interface BuildLlmsTxtFromGlobalOptions {
35
+ /** Payload instance (Local API). */
36
+ payload: Payload;
37
+ /** Passed to `findGlobal` when the llms global uses localized fields. */
38
+ locale?: string;
39
+ draft?: boolean;
40
+ depth?: number;
41
+ /** Express / Payload request for nested operations; recommended inside hooks. */
42
+ req?: PayloadRequest;
43
+ /**
44
+ * Global slug; defaults to `"llms"`.
45
+ * Should match the `global.slug` option passed to `payloadPluginLlms` when overridden.
46
+ */
47
+ globalSlug?: string;
48
+ /**
49
+ * Options passed to markdown conversion. Use `resolveLexicalBlock` if you need custom
50
+ * Lexical block serialization.
51
+ */
52
+ lexical?: LexicalToMarkdownAsyncOptions;
53
+ }
18
54
  export declare function formatLlmsTxtLink(link: LlmsTxtLink): string;
19
- export declare function buildLlmsTxt(content: LlmsTxtContent): string;
55
+ /** Build llms.txt-style plain text from structured sections and links (no Lexical). */
56
+ export declare function buildLlmsTxtFromStructured(content: LlmsTxtContent): string;
57
+ /** Load the `llms.txt` tab from the `llms` global and render markdown. */
58
+ export declare function buildLlmsTxt(options: BuildLlmsTxtFromGlobalOptions): Promise<string>;
59
+ /** Load the `llms-full.txt` tab from the `llms` global and render markdown. */
60
+ export declare function buildLlmsFullTxt(options: BuildLlmsTxtFromGlobalOptions): Promise<string>;
20
61
  //# sourceMappingURL=llms-txt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC3B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC3B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAG3D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAwB5D"}
1
+ {"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,6BAA6B,EAEnC,MAAM,WAAW,CAAA;AAElB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEtD,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC3B,qCAAqC;IACrC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAA;IAC3B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,6BAA6B,CAAA;CACxC;AAOD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAG3D;AAED,uFAAuF;AACvF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAwB1E;AAED,0EAA0E;AAC1E,wBAAsB,YAAY,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9F"}
@@ -3,7 +3,6 @@ export declare const DEFAULT_MARKDOWN_HEADERS: {
3
3
  };
4
4
  export declare const DEFAULT_LLMS_TXT_HEADERS: {
5
5
  "Content-Type": string;
6
- "Cache-Control": string;
7
6
  };
8
7
  export declare function isMarkdownAccepted(accept: string | null | undefined): boolean;
9
8
  export declare function mergeHeaders(defaults: HeadersInit, overrides?: HeadersInit): Headers;
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/next/headers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;CAEd,CAAA;AAEvB,eAAO,MAAM,wBAAwB;;;CAGd,CAAA;AAEvB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAW7E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,WAAW,GAAG,OAAO,CASpF"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/next/headers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;CAEd,CAAA;AAEvB,eAAO,MAAM,wBAAwB;;CAEd,CAAA;AAEvB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAW7E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,WAAW,GAAG,OAAO,CASpF"}
@@ -1,3 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var P=(e,t)=>{for(var r in t)p(e,r,{get:t[r],enumerable:!0})},S=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of C(t))!H.call(e,o)&&o!==r&&p(e,o,{get:()=>t[o],enumerable:!(n=y(t,o))||n.enumerable});return e};var A=e=>S(p({},"__esModule",{value:!0}),e);var _={};P(_,{DEFAULT_LLMS_TXT_HEADERS:()=>l,DEFAULT_MARKDOWN_HEADERS:()=>u,createLlmsTxtRoute:()=>k,createMarkdownResponse:()=>f,createMarkdownRewrites:()=>L,createMarkdownRoute:()=>h,isMarkdownAccepted:()=>g,mergeHeaders:()=>i});module.exports=A(_);var u={"Content-Type":"text/markdown; charset=utf-8"},l={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"public, max-age=3600, s-maxage=86400"};function g(e){return(e??"").split(",").some(t=>{let[r="",...n]=t.split(";").map(a=>a.trim());if(r.toLowerCase()!=="text/markdown")return!1;let o=n.find(a=>/^q\s*=/i.test(a));if(!o)return!0;let[,s=""]=o.split("=");return Number.parseFloat(s.trim())>0})}function i(e,t){let r=new Headers(e);return t&&new Headers(t).forEach((o,s)=>{r.set(s,o)}),r}function E(e){let t=`- [${e.title}](${e.url})`;return e.description?`${t}: ${e.description}`:t}function R(e){let t=[];e.title&&t.push(`# ${e.title}`,""),e.description&&t.push(`> ${e.description}`,""),w(t,e.intro);for(let r of e.sections??[]){t.push(`## ${r.title}`,""),w(t,r.content,{trailingBlank:!1});for(let n of r.links??[])t.push(E(n));t.push("")}return w(t,e.footer,{trailingBlank:!1}),b(t).join(`
2
- `)}function w(e,t,r={}){let n=Array.isArray(t)?t:t?[t]:[];if(n.length!==0){if(r.trailingBlank??!0){for(let o of n)e.push(o,"");return}for(let o of n)e.push(o)}}function b(e){let t=[...e];for(;t[0]==="";)t.shift();for(;t.at(-1)==="";)t.pop();return t}function k(e){return async function(r){let n={request:r},o=await e.loadContent(n),s=e.beforeBuild?await e.beforeBuild(o,n):o,a=R(s),c=e.afterBuild?await e.afterBuild(a,n):a,d=typeof e.headers=="function"?await e.headers(s,n):e.headers;return new Response(c,{headers:i(l,d)})}}function f(e,t={}){return new Response(e,{headers:i(u,t.headers)})}function h(e){let t=new Set(e.locales);return async function(n,o){let s=await o.params;if(!t.has(s.locale))return M(e);let a=await D(e.draftMode),c=F(new URL(n.url).searchParams,e.searchParams),d={locale:s.locale,slug:s.slug,draft:a,searchParams:c,request:n},m=await e.getMarkdown(d);if(m===null)return M(e);let x=e.beforeResponse?await e.beforeResponse(m,d):m,T=typeof e.headers=="function"?await e.headers(x,d):e.headers;return f(x,{headers:T})}}function M(e){return new Response(e.notFoundBody??"Not Found",{status:e.notFoundStatus??404})}async function D(e){if(!e)return!1;let t=typeof e=="function"?await e():e;return typeof t=="boolean"?t:t.isEnabled}function F(e,t){if(!t)return{};if(typeof t=="function")return t(e);let r={};for(let n of t){let o=e.get(n);o&&(r[n]=o)}return r}function L(e){let t=e.markdownSegment??"md",r=e.locales.map(O).join("|"),n=e.has??[{type:"header",key:"accept",value:e.acceptHeaderPattern??"(.*)text/markdown(.*)"}],o=[{source:`/:locale(${r})/:path*`,destination:`/:locale/${t}/:path*`,has:n}];return(e.includeIndexRewrite??!0)&&o.push({source:`/:locale(${r})`,destination:`/:locale/${t}`,has:n}),o}function O(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}0&&(module.exports={DEFAULT_LLMS_TXT_HEADERS,DEFAULT_MARKDOWN_HEADERS,createLlmsTxtRoute,createMarkdownResponse,createMarkdownRewrites,createMarkdownRoute,isMarkdownAccepted,mergeHeaders});
1
+ "use strict";var p=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var H=(e,r)=>{for(var t in r)p(e,t,{get:r[t],enumerable:!0})},h=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of m(r))!x.call(e,n)&&n!==t&&p(e,n,{get:()=>r[n],enumerable:!(a=M(r,n))||a.enumerable});return e};var g=e=>h(p({},"__esModule",{value:!0}),e);var E={};H(E,{DEFAULT_LLMS_TXT_HEADERS:()=>c,DEFAULT_MARKDOWN_HEADERS:()=>d,LlmsResponse:()=>w,createMarkdownResponse:()=>u,createMarkdownRewrites:()=>f,isMarkdownAccepted:()=>R,mergeHeaders:()=>s});module.exports=g(E);var d={"Content-Type":"text/markdown; charset=utf-8"},c={"Content-Type":"text/plain; charset=utf-8"};function R(e){return(e??"").split(",").some(r=>{let[t="",...a]=r.split(";").map(o=>o.trim());if(t.toLowerCase()!=="text/markdown")return!1;let n=a.find(o=>/^q\s*=/i.test(o));if(!n)return!0;let[,i=""]=n.split("=");return Number.parseFloat(i.trim())>0})}function s(e,r){let t=new Headers(e);return r&&new Headers(r).forEach((n,i)=>{t.set(i,n)}),t}function u(e,r={}){return new Response(e,{headers:s(d,r.headers)})}var w=class extends Response{constructor(r,t={}){let{headers:a,...n}=t;super(r,{...n,headers:s(c,a)})}};function f(e){let r=e.markdownSegment??"md",t=e.has??[{type:"header",key:"accept",value:e.acceptHeaderPattern??"(.*)text/markdown(.*)"}];if(e.localizedRoutes===!1)return C(r,t,e.includeIndexRewrite??!0);let a=e.locales.map(l).join("|"),n=[{source:`/:locale(${a})/:path*`,destination:`/:locale/${r}/:path*`,has:t}];return(e.includeIndexRewrite??!0)&&n.push({source:`/:locale(${a})`,destination:`/:locale/${r}`,has:t}),n}function C(e,r,t){let a=l(e),o=[{source:`/:path(${`(?!${["_next","api"].map(k=>`${l(k)}(?:/|$)`).join("|")})(?!${a}(?:/|$)).*`})`,destination:`/${e}/:path`,has:r}];return t&&o.push({source:"/",destination:`/${e}`,has:r}),o}function l(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}0&&(module.exports={DEFAULT_LLMS_TXT_HEADERS,DEFAULT_MARKDOWN_HEADERS,LlmsResponse,createMarkdownResponse,createMarkdownRewrites,isMarkdownAccepted,mergeHeaders});
3
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/index.ts","../../src/next/headers.ts","../../src/llms-txt.ts","../../src/next/llms-route.ts","../../src/next/markdown-route.ts","../../src/next/rewrites.ts"],"sourcesContent":["export {\n DEFAULT_LLMS_TXT_HEADERS,\n DEFAULT_MARKDOWN_HEADERS,\n isMarkdownAccepted,\n mergeHeaders,\n} from \"./headers\"\nexport { createLlmsTxtRoute } from \"./llms-route\"\nexport type { CreateLlmsTxtRouteOptions, LlmsTxtRouteContext } from \"./llms-route\"\nexport { createMarkdownResponse, createMarkdownRoute } from \"./markdown-route\"\nexport type {\n CreateMarkdownRouteOptions,\n MarkdownRouteContext,\n MarkdownRouteGetMarkdownArgs,\n MarkdownRouteParams,\n MarkdownSearchParamsMapper,\n} from \"./markdown-route\"\nexport { createMarkdownRewrites } from \"./rewrites\"\nexport type {\n CreateMarkdownRewritesOptions,\n MarkdownRewrite,\n MarkdownRewriteHasCondition,\n} from \"./rewrites\"\nexport type { HeaderResolver, HeadersInput } from \"./types\"\n","export const DEFAULT_MARKDOWN_HEADERS = {\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n} satisfies HeadersInit\n\nexport const DEFAULT_LLMS_TXT_HEADERS = {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"public, max-age=3600, s-maxage=86400\",\n} satisfies HeadersInit\n\nexport function isMarkdownAccepted(accept: string | null | undefined): boolean {\n return (accept ?? \"\").split(\",\").some((range) => {\n const [mediaType = \"\", ...parameters] = range.split(\";\").map((part) => part.trim())\n if (mediaType.toLowerCase() !== \"text/markdown\") return false\n\n const qParameter = parameters.find((parameter) => /^q\\s*=/i.test(parameter))\n if (!qParameter) return true\n\n const [, value = \"\"] = qParameter.split(\"=\")\n return Number.parseFloat(value.trim()) > 0\n })\n}\n\nexport function mergeHeaders(defaults: HeadersInit, overrides?: HeadersInit): Headers {\n const headers = new Headers(defaults)\n if (!overrides) return headers\n\n const overrideHeaders = new Headers(overrides)\n overrideHeaders.forEach((value, key) => {\n headers.set(key, value)\n })\n return headers\n}\n","export type LlmsTxtLink = {\n title: string\n url: string\n description?: string | null\n}\n\nexport type LlmsTxtSection = {\n title: string\n content?: string | string[]\n links?: LlmsTxtLink[]\n}\n\nexport type LlmsTxtContent = {\n title?: string\n description?: string\n intro?: string | string[]\n sections?: LlmsTxtSection[]\n footer?: string | string[]\n}\n\nexport function formatLlmsTxtLink(link: LlmsTxtLink): string {\n const line = `- [${link.title}](${link.url})`\n return link.description ? `${line}: ${link.description}` : line\n}\n\nexport function buildLlmsTxt(content: LlmsTxtContent): string {\n const lines: string[] = []\n\n if (content.title) {\n lines.push(`# ${content.title}`, \"\")\n }\n if (content.description) {\n lines.push(`> ${content.description}`, \"\")\n }\n\n appendLines(lines, content.intro)\n\n for (const section of content.sections ?? []) {\n lines.push(`## ${section.title}`, \"\")\n appendLines(lines, section.content, { trailingBlank: false })\n for (const link of section.links ?? []) {\n lines.push(formatLlmsTxtLink(link))\n }\n lines.push(\"\")\n }\n\n appendLines(lines, content.footer, { trailingBlank: false })\n\n return trimBlankEdges(lines).join(\"\\n\")\n}\n\nfunction appendLines(\n lines: string[],\n value: string | string[] | undefined,\n options: { trailingBlank?: boolean } = {},\n) {\n const values = Array.isArray(value) ? value : value ? [value] : []\n if (values.length === 0) return\n\n if (options.trailingBlank ?? true) {\n for (const item of values) {\n lines.push(item, \"\")\n }\n return\n }\n\n for (const item of values) {\n lines.push(item)\n }\n}\n\nfunction trimBlankEdges(lines: string[]) {\n const trimmed = [...lines]\n while (trimmed[0] === \"\") trimmed.shift()\n while (trimmed.at(-1) === \"\") trimmed.pop()\n return trimmed\n}\n","import { buildLlmsTxt } from \"../llms-txt\"\nimport { DEFAULT_LLMS_TXT_HEADERS, mergeHeaders } from \"./headers\"\n\nimport type { LlmsTxtContent } from \"../llms-txt\"\n\nexport type LlmsTxtRouteContext = {\n request: Request\n}\n\nexport type CreateLlmsTxtRouteOptions = {\n loadContent: (context: LlmsTxtRouteContext) => Promise<LlmsTxtContent> | LlmsTxtContent\n beforeBuild?: (\n content: LlmsTxtContent,\n context: LlmsTxtRouteContext,\n ) => Promise<LlmsTxtContent> | LlmsTxtContent\n afterBuild?: (text: string, context: LlmsTxtRouteContext) => Promise<string> | string\n headers?:\n | HeadersInit\n | ((content: LlmsTxtContent, context: LlmsTxtRouteContext) => HeadersInit | Promise<HeadersInit>)\n}\n\nexport function createLlmsTxtRoute(options: CreateLlmsTxtRouteOptions) {\n return async function GET(request: Request): Promise<Response> {\n const context = { request }\n const loaded = await options.loadContent(context)\n const content = options.beforeBuild ? await options.beforeBuild(loaded, context) : loaded\n const built = buildLlmsTxt(content)\n const text = options.afterBuild ? await options.afterBuild(built, context) : built\n const headerOverrides =\n typeof options.headers === \"function\"\n ? await options.headers(content, context)\n : options.headers\n\n return new Response(text, {\n headers: mergeHeaders(DEFAULT_LLMS_TXT_HEADERS, headerOverrides),\n })\n }\n}\n","import { DEFAULT_MARKDOWN_HEADERS, mergeHeaders } from \"./headers\"\n\nexport function createMarkdownResponse(\n markdown: string,\n options: { headers?: HeadersInit } = {},\n): Response {\n return new Response(markdown, {\n headers: mergeHeaders(DEFAULT_MARKDOWN_HEADERS, options.headers),\n })\n}\n\nexport type MarkdownRouteParams = {\n locale: string\n slug?: string[]\n}\n\nexport type MarkdownRouteContext = {\n params: MarkdownRouteParams | Promise<MarkdownRouteParams>\n}\n\nexport type MarkdownSearchParamsMapper =\n | string[]\n | ((searchParams: URLSearchParams) => Record<string, string>)\n\nexport type MarkdownRouteGetMarkdownArgs = {\n locale: string\n slug?: string[]\n draft: boolean\n searchParams: Record<string, string>\n request: Request\n}\n\ntype DraftModeValue = boolean | { isEnabled: boolean }\n\nexport type CreateMarkdownRouteOptions = {\n locales: readonly string[]\n getMarkdown: (args: MarkdownRouteGetMarkdownArgs) => Promise<string | null> | string | null\n draftMode?: (() => Promise<DraftModeValue> | DraftModeValue) | DraftModeValue\n searchParams?: MarkdownSearchParamsMapper\n notFoundBody?: string\n notFoundStatus?: number\n headers?:\n | HeadersInit\n | ((markdown: string, context: MarkdownRouteGetMarkdownArgs) => HeadersInit | Promise<HeadersInit>)\n beforeResponse?: (\n markdown: string,\n context: MarkdownRouteGetMarkdownArgs,\n ) => Promise<string> | string\n}\n\nexport function createMarkdownRoute(options: CreateMarkdownRouteOptions) {\n const localeSet = new Set(options.locales)\n\n return async function GET(request: Request, context: MarkdownRouteContext): Promise<Response> {\n const params = await context.params\n if (!localeSet.has(params.locale)) {\n return notFound(options)\n }\n\n const draft = await resolveDraft(options.draftMode)\n const searchParams = mapSearchParams(new URL(request.url).searchParams, options.searchParams)\n const routeContext: MarkdownRouteGetMarkdownArgs = {\n locale: params.locale,\n slug: params.slug,\n draft,\n searchParams,\n request,\n }\n\n const markdown = await options.getMarkdown(routeContext)\n if (markdown === null) {\n return notFound(options)\n }\n\n const finalMarkdown = options.beforeResponse\n ? await options.beforeResponse(markdown, routeContext)\n : markdown\n const headers =\n typeof options.headers === \"function\"\n ? await options.headers(finalMarkdown, routeContext)\n : options.headers\n\n return createMarkdownResponse(finalMarkdown, { headers })\n }\n}\n\nfunction notFound(options: Pick<CreateMarkdownRouteOptions, \"notFoundBody\" | \"notFoundStatus\">) {\n return new Response(options.notFoundBody ?? \"Not Found\", {\n status: options.notFoundStatus ?? 404,\n })\n}\n\nasync function resolveDraft(\n draftMode: CreateMarkdownRouteOptions[\"draftMode\"],\n): Promise<boolean> {\n if (!draftMode) return false\n const result = typeof draftMode === \"function\" ? await draftMode() : draftMode\n return typeof result === \"boolean\" ? result : result.isEnabled\n}\n\nfunction mapSearchParams(\n searchParams: URLSearchParams,\n mapper: MarkdownSearchParamsMapper | undefined,\n): Record<string, string> {\n if (!mapper) return {}\n if (typeof mapper === \"function\") return mapper(searchParams)\n\n const result: Record<string, string> = {}\n for (const key of mapper) {\n const value = searchParams.get(key)\n if (value) result[key] = value\n }\n return result\n}\n","export type MarkdownRewriteHasCondition = {\n type: \"header\" | \"host\" | \"cookie\" | \"query\"\n key: string\n value?: string\n}\n\nexport type MarkdownRewrite = {\n source: string\n destination: string\n has?: MarkdownRewriteHasCondition[]\n}\n\nexport type CreateMarkdownRewritesOptions = {\n locales: readonly string[]\n markdownSegment?: string\n acceptHeaderPattern?: string\n includeIndexRewrite?: boolean\n has?: MarkdownRewriteHasCondition[]\n}\n\nexport function createMarkdownRewrites(options: CreateMarkdownRewritesOptions): MarkdownRewrite[] {\n const markdownSegment = options.markdownSegment ?? \"md\"\n const localeSegment = options.locales.map(escapeRegex).join(\"|\")\n const has = options.has ?? [\n {\n type: \"header\",\n key: \"accept\",\n value: options.acceptHeaderPattern ?? \"(.*)text/markdown(.*)\",\n },\n ]\n\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:locale(${localeSegment})/:path*`,\n destination: `/:locale/${markdownSegment}/:path*`,\n has,\n },\n ]\n\n if (options.includeIndexRewrite ?? true) {\n rewrites.push({\n source: `/:locale(${localeSegment})`,\n destination: `/:locale/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n"],"mappings":"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","names":["next_exports","__export","DEFAULT_LLMS_TXT_HEADERS","DEFAULT_MARKDOWN_HEADERS","createLlmsTxtRoute","createMarkdownResponse","createMarkdownRewrites","createMarkdownRoute","isMarkdownAccepted","mergeHeaders","__toCommonJS","DEFAULT_MARKDOWN_HEADERS","DEFAULT_LLMS_TXT_HEADERS","isMarkdownAccepted","accept","range","mediaType","parameters","part","qParameter","parameter","value","mergeHeaders","defaults","overrides","headers","key","formatLlmsTxtLink","link","line","buildLlmsTxt","content","lines","appendLines","section","trimBlankEdges","value","options","values","item","trimmed","createLlmsTxtRoute","options","request","context","loaded","content","built","buildLlmsTxt","text","headerOverrides","mergeHeaders","DEFAULT_LLMS_TXT_HEADERS","createMarkdownResponse","markdown","options","mergeHeaders","DEFAULT_MARKDOWN_HEADERS","createMarkdownRoute","localeSet","request","context","params","notFound","draft","resolveDraft","searchParams","mapSearchParams","routeContext","finalMarkdown","headers","draftMode","result","mapper","key","value","createMarkdownRewrites","options","markdownSegment","localeSegment","escapeRegex","has","rewrites","value"]}
1
+ {"version":3,"sources":["../../src/next/index.ts","../../src/next/headers.ts","../../src/next/markdown-response.ts","../../src/next/llms-txt-response.ts","../../src/next/rewrites.ts"],"sourcesContent":["export {\n DEFAULT_LLMS_TXT_HEADERS,\n DEFAULT_MARKDOWN_HEADERS,\n isMarkdownAccepted,\n mergeHeaders,\n} from \"./headers\"\nexport { createMarkdownResponse } from \"./markdown-response\"\nexport { LlmsResponse } from \"./llms-txt-response\"\nexport { createMarkdownRewrites } from \"./rewrites\"\nexport type {\n CreateMarkdownRewritesLocalizedOptions,\n CreateMarkdownRewritesOptions,\n CreateMarkdownRewritesUnlocalizedOptions,\n MarkdownRewrite,\n MarkdownRewriteHasCondition,\n} from \"./rewrites\"\nexport type { HeaderResolver, HeadersInput } from \"./types\"\n","export const DEFAULT_MARKDOWN_HEADERS = {\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n} satisfies HeadersInit\n\nexport const DEFAULT_LLMS_TXT_HEADERS = {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n} satisfies HeadersInit\n\nexport function isMarkdownAccepted(accept: string | null | undefined): boolean {\n return (accept ?? \"\").split(\",\").some((range) => {\n const [mediaType = \"\", ...parameters] = range.split(\";\").map((part) => part.trim())\n if (mediaType.toLowerCase() !== \"text/markdown\") return false\n\n const qParameter = parameters.find((parameter) => /^q\\s*=/i.test(parameter))\n if (!qParameter) return true\n\n const [, value = \"\"] = qParameter.split(\"=\")\n return Number.parseFloat(value.trim()) > 0\n })\n}\n\nexport function mergeHeaders(defaults: HeadersInit, overrides?: HeadersInit): Headers {\n const headers = new Headers(defaults)\n if (!overrides) return headers\n\n const overrideHeaders = new Headers(overrides)\n overrideHeaders.forEach((value, key) => {\n headers.set(key, value)\n })\n return headers\n}\n","import { DEFAULT_MARKDOWN_HEADERS, mergeHeaders } from \"./headers\"\n\nexport function createMarkdownResponse(\n markdown: string,\n options: { headers?: HeadersInit } = {},\n): Response {\n return new Response(markdown, {\n headers: mergeHeaders(DEFAULT_MARKDOWN_HEADERS, options.headers),\n })\n}\n","import { DEFAULT_LLMS_TXT_HEADERS, mergeHeaders } from \"./headers\"\n\n/** `Response` for `llms.txt`-style plain text with {@link DEFAULT_LLMS_TXT_HEADERS} merged into `init.headers`. */\nexport class LlmsResponse extends Response {\n constructor(body: BodyInit, init: ResponseInit & { headers?: HeadersInit } = {}) {\n const { headers, ...rest } = init\n super(body, {\n ...rest,\n headers: mergeHeaders(DEFAULT_LLMS_TXT_HEADERS, headers),\n })\n }\n}\n","/** Next.js rewrite condition used to route markdown-preferring requests. */\nexport interface MarkdownRewriteHasCondition {\n /** Rewrite condition type understood by Next.js. */\n type: \"header\" | \"host\" | \"cookie\" | \"query\"\n /** Header, host, cookie, or query key to inspect. */\n key: string\n /** Optional match pattern for the inspected value. */\n value?: string\n}\n\n/** Next.js rewrite entry produced for markdown route support. */\nexport interface MarkdownRewrite {\n /** Source route pattern to match. */\n source: string\n /** Destination markdown route pattern. */\n destination: string\n /** Optional conditions that must match for the rewrite. */\n has?: MarkdownRewriteHasCondition[]\n}\n\n/** Shared options for generating Next.js markdown rewrites. */\ninterface CreateMarkdownRewritesSharedOptions {\n /** Markdown route segment; defaults to `\"md\"`. */\n markdownSegment?: string\n /** Accept header pattern used when no custom `has` conditions are provided. */\n acceptHeaderPattern?: string\n /** Whether to include an index rewrite (`/` or `/:locale`) to the markdown segment; defaults to true. */\n includeIndexRewrite?: boolean\n /** Custom rewrite conditions replacing the default markdown Accept header check. */\n has?: MarkdownRewriteHasCondition[]\n}\n\n/** Options when routes include a dynamic locale prefix (`/:locale/...`). */\nexport interface CreateMarkdownRewritesLocalizedOptions extends CreateMarkdownRewritesSharedOptions {\n /** Locale segments to include in generated rewrite patterns. */\n locales: readonly string[]\n /** Include `:locale(...)` in rewrite patterns (default). */\n localizedRoutes?: true\n}\n\n/** Options when there is no locale prefix (single-locale apps using `/...` instead of `/:locale/...`). */\nexport interface CreateMarkdownRewritesUnlocalizedOptions extends CreateMarkdownRewritesSharedOptions {\n localizedRoutes: false\n}\n\nexport type CreateMarkdownRewritesOptions =\n | CreateMarkdownRewritesLocalizedOptions\n | CreateMarkdownRewritesUnlocalizedOptions\n\nexport function createMarkdownRewrites(options: CreateMarkdownRewritesOptions): MarkdownRewrite[] {\n const markdownSegment = options.markdownSegment ?? \"md\"\n const has = options.has ?? [\n {\n type: \"header\",\n key: \"accept\",\n value: options.acceptHeaderPattern ?? \"(.*)text/markdown(.*)\",\n },\n ]\n\n if (options.localizedRoutes === false) {\n return createUnlocalizedMarkdownRewrites(markdownSegment, has, options.includeIndexRewrite ?? true)\n }\n\n const localeSegment = options.locales.map(escapeRegex).join(\"|\")\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:locale(${localeSegment})/:path*`,\n destination: `/:locale/${markdownSegment}/:path*`,\n has,\n },\n ]\n\n if (options.includeIndexRewrite ?? true) {\n rewrites.push({\n source: `/:locale(${localeSegment})`,\n destination: `/:locale/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction createUnlocalizedMarkdownRewrites(\n markdownSegment: string,\n has: MarkdownRewriteHasCondition[],\n includeIndexRewrite: boolean,\n): MarkdownRewrite[] {\n const mdEsc = escapeRegex(markdownSegment)\n const frameworkPrefixesPattern = [\"_next\", \"api\"]\n .map((prefix) => `${escapeRegex(prefix)}(?:/|$)`)\n .join(\"|\")\n /**\n * Exclude paths already under `/${markdownSegment}`, Next internals (`/_next`, `/api`), so we do not\n * rewrite markdown URLs or framework routes twice.\n */\n const pathPattern = `(?!${frameworkPrefixesPattern})(?!${mdEsc}(?:/|$)).*`\n\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:path(${pathPattern})`,\n destination: `/${markdownSegment}/:path`,\n has,\n },\n ]\n\n if (includeIndexRewrite) {\n rewrites.push({\n source: \"/\",\n destination: `/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,EAAA,6BAAAC,EAAA,iBAAAC,EAAA,2BAAAC,EAAA,2BAAAC,EAAA,uBAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAT,GCAO,IAAMU,EAA2B,CACtC,eAAgB,8BAClB,EAEaC,EAA2B,CACtC,eAAgB,2BAClB,EAEO,SAASC,EAAmBC,EAA4C,CAC7E,OAAQA,GAAU,IAAI,MAAM,GAAG,EAAE,KAAMC,GAAU,CAC/C,GAAM,CAACC,EAAY,GAAI,GAAGC,CAAU,EAAIF,EAAM,MAAM,GAAG,EAAE,IAAKG,GAASA,EAAK,KAAK,CAAC,EAClF,GAAIF,EAAU,YAAY,IAAM,gBAAiB,MAAO,GAExD,IAAMG,EAAaF,EAAW,KAAMG,GAAc,UAAU,KAAKA,CAAS,CAAC,EAC3E,GAAI,CAACD,EAAY,MAAO,GAExB,GAAM,CAAC,CAAEE,EAAQ,EAAE,EAAIF,EAAW,MAAM,GAAG,EAC3C,OAAO,OAAO,WAAWE,EAAM,KAAK,CAAC,EAAI,CAC3C,CAAC,CACH,CAEO,SAASC,EAAaC,EAAuBC,EAAkC,CACpF,IAAMC,EAAU,IAAI,QAAQF,CAAQ,EACpC,OAAKC,GAEmB,IAAI,QAAQA,CAAS,EAC7B,QAAQ,CAACH,EAAOK,IAAQ,CACtCD,EAAQ,IAAIC,EAAKL,CAAK,CACxB,CAAC,EACMI,CACT,CC5BO,SAASE,EACdC,EACAC,EAAqC,CAAC,EAC5B,CACV,OAAO,IAAI,SAASD,EAAU,CAC5B,QAASE,EAAaC,EAA0BF,EAAQ,OAAO,CACjE,CAAC,CACH,CCNO,IAAMG,EAAN,cAA2B,QAAS,CACzC,YAAYC,EAAgBC,EAAiD,CAAC,EAAG,CAC/E,GAAM,CAAE,QAAAC,EAAS,GAAGC,CAAK,EAAIF,EAC7B,MAAMD,EAAM,CACV,GAAGG,EACH,QAASC,EAAaC,EAA0BH,CAAO,CACzD,CAAC,CACH,CACF,ECsCO,SAASI,EAAuBC,EAA2D,CAChG,IAAMC,EAAkBD,EAAQ,iBAAmB,KAC7CE,EAAMF,EAAQ,KAAO,CACzB,CACE,KAAM,SACN,IAAK,SACL,MAAOA,EAAQ,qBAAuB,uBACxC,CACF,EAEA,GAAIA,EAAQ,kBAAoB,GAC9B,OAAOG,EAAkCF,EAAiBC,EAAKF,EAAQ,qBAAuB,EAAI,EAGpG,IAAMI,EAAgBJ,EAAQ,QAAQ,IAAIK,CAAW,EAAE,KAAK,GAAG,EACzDC,EAA8B,CAClC,CACE,OAAQ,YAAYF,CAAa,WACjC,YAAa,YAAYH,CAAe,UACxC,IAAAC,CACF,CACF,EAEA,OAAIF,EAAQ,qBAAuB,KACjCM,EAAS,KAAK,CACZ,OAAQ,YAAYF,CAAa,IACjC,YAAa,YAAYH,CAAe,GACxC,IAAAC,CACF,CAAC,EAGII,CACT,CAEA,SAASH,EACPF,EACAC,EACAK,EACmB,CACnB,IAAMC,EAAQH,EAAYJ,CAAe,EAUnCK,EAA8B,CAClC,CACE,OAAQ,UAJQ,MAPa,CAAC,QAAS,KAAK,EAC7C,IAAKG,GAAW,GAAGJ,EAAYI,CAAM,CAAC,SAAS,EAC/C,KAAK,GAAG,CAKuC,OAAOD,CAAK,YAI7B,IAC7B,YAAa,IAAIP,CAAe,SAChC,IAAAC,CACF,CACF,EAEA,OAAIK,GACFD,EAAS,KAAK,CACZ,OAAQ,IACR,YAAa,IAAIL,CAAe,GAChC,IAAAC,CACF,CAAC,EAGII,CACT,CAEA,SAASD,EAAYK,EAAuB,CAC1C,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACpD","names":["next_exports","__export","DEFAULT_LLMS_TXT_HEADERS","DEFAULT_MARKDOWN_HEADERS","LlmsResponse","createMarkdownResponse","createMarkdownRewrites","isMarkdownAccepted","mergeHeaders","__toCommonJS","DEFAULT_MARKDOWN_HEADERS","DEFAULT_LLMS_TXT_HEADERS","isMarkdownAccepted","accept","range","mediaType","parameters","part","qParameter","parameter","value","mergeHeaders","defaults","overrides","headers","key","createMarkdownResponse","markdown","options","mergeHeaders","DEFAULT_MARKDOWN_HEADERS","LlmsResponse","body","init","headers","rest","mergeHeaders","DEFAULT_LLMS_TXT_HEADERS","createMarkdownRewrites","options","markdownSegment","has","createUnlocalizedMarkdownRewrites","localeSegment","escapeRegex","rewrites","includeIndexRewrite","mdEsc","prefix","value"]}
@@ -1,9 +1,7 @@
1
1
  export { DEFAULT_LLMS_TXT_HEADERS, DEFAULT_MARKDOWN_HEADERS, isMarkdownAccepted, mergeHeaders, } from "./headers";
2
- export { createLlmsTxtRoute } from "./llms-route";
3
- export type { CreateLlmsTxtRouteOptions, LlmsTxtRouteContext } from "./llms-route";
4
- export { createMarkdownResponse, createMarkdownRoute } from "./markdown-route";
5
- export type { CreateMarkdownRouteOptions, MarkdownRouteContext, MarkdownRouteGetMarkdownArgs, MarkdownRouteParams, MarkdownSearchParamsMapper, } from "./markdown-route";
2
+ export { createMarkdownResponse } from "./markdown-response";
3
+ export { LlmsResponse } from "./llms-txt-response";
6
4
  export { createMarkdownRewrites } from "./rewrites";
7
- export type { CreateMarkdownRewritesOptions, MarkdownRewrite, MarkdownRewriteHasCondition, } from "./rewrites";
5
+ export type { CreateMarkdownRewritesLocalizedOptions, CreateMarkdownRewritesOptions, CreateMarkdownRewritesUnlocalizedOptions, MarkdownRewrite, MarkdownRewriteHasCondition, } from "./rewrites";
8
6
  export type { HeaderResolver, HeadersInput } from "./types";
9
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,GACb,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,YAAY,EACV,0BAA0B,EAC1B,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,GACb,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,YAAY,EACV,sCAAsC,EACtC,6BAA6B,EAC7B,wCAAwC,EACxC,eAAe,EACf,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
@@ -1,2 +1,2 @@
1
- import{b as p}from"../chunk-B5YH4Y5S.js";var l={"Content-Type":"text/markdown; charset=utf-8"},m={"Content-Type":"text/plain; charset=utf-8","Cache-Control":"public, max-age=3600, s-maxage=86400"};function k(e){return(e??"").split(",").some(t=>{let[o="",...r]=t.split(";").map(s=>s.trim());if(o.toLowerCase()!=="text/markdown")return!1;let n=r.find(s=>/^q\s*=/i.test(s));if(!n)return!0;let[,a=""]=n.split("=");return Number.parseFloat(a.trim())>0})}function i(e,t){let o=new Headers(e);return t&&new Headers(t).forEach((n,a)=>{o.set(a,n)}),o}function M(e){return async function(o){let r={request:o},n=await e.loadContent(r),a=e.beforeBuild?await e.beforeBuild(n,r):n,s=p(a),u=e.afterBuild?await e.afterBuild(s,r):s,d=typeof e.headers=="function"?await e.headers(a,r):e.headers;return new Response(u,{headers:i(m,d)})}}function x(e,t={}){return new Response(e,{headers:i(l,t.headers)})}function g(e){let t=new Set(e.locales);return async function(r,n){let a=await n.params;if(!t.has(a.locale))return R(e);let s=await h(e.draftMode),u=y(new URL(r.url).searchParams,e.searchParams),d={locale:a.locale,slug:a.slug,draft:s,searchParams:u,request:r},c=await e.getMarkdown(d);if(c===null)return R(e);let w=e.beforeResponse?await e.beforeResponse(c,d):c,f=typeof e.headers=="function"?await e.headers(w,d):e.headers;return x(w,{headers:f})}}function R(e){return new Response(e.notFoundBody??"Not Found",{status:e.notFoundStatus??404})}async function h(e){if(!e)return!1;let t=typeof e=="function"?await e():e;return typeof t=="boolean"?t:t.isEnabled}function y(e,t){if(!t)return{};if(typeof t=="function")return t(e);let o={};for(let r of t){let n=e.get(r);n&&(o[r]=n)}return o}function C(e){let t=e.markdownSegment??"md",o=e.locales.map(T).join("|"),r=e.has??[{type:"header",key:"accept",value:e.acceptHeaderPattern??"(.*)text/markdown(.*)"}],n=[{source:`/:locale(${o})/:path*`,destination:`/:locale/${t}/:path*`,has:r}];return(e.includeIndexRewrite??!0)&&n.push({source:`/:locale(${o})`,destination:`/:locale/${t}`,has:r}),n}function T(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{m as DEFAULT_LLMS_TXT_HEADERS,l as DEFAULT_MARKDOWN_HEADERS,M as createLlmsTxtRoute,x as createMarkdownResponse,C as createMarkdownRewrites,g as createMarkdownRoute,k as isMarkdownAccepted,i as mergeHeaders};
1
+ var d={"Content-Type":"text/markdown; charset=utf-8"},c={"Content-Type":"text/plain; charset=utf-8"};function R(e){return(e??"").split(",").some(r=>{let[t="",...a]=r.split(";").map(o=>o.trim());if(t.toLowerCase()!=="text/markdown")return!1;let n=a.find(o=>/^q\s*=/i.test(o));if(!n)return!0;let[,i=""]=n.split("=");return Number.parseFloat(i.trim())>0})}function s(e,r){let t=new Headers(e);return r&&new Headers(r).forEach((n,i)=>{t.set(i,n)}),t}function u(e,r={}){return new Response(e,{headers:s(d,r.headers)})}var w=class extends Response{constructor(r,t={}){let{headers:a,...n}=t;super(r,{...n,headers:s(c,a)})}};function f(e){let r=e.markdownSegment??"md",t=e.has??[{type:"header",key:"accept",value:e.acceptHeaderPattern??"(.*)text/markdown(.*)"}];if(e.localizedRoutes===!1)return k(r,t,e.includeIndexRewrite??!0);let a=e.locales.map(p).join("|"),n=[{source:`/:locale(${a})/:path*`,destination:`/:locale/${r}/:path*`,has:t}];return(e.includeIndexRewrite??!0)&&n.push({source:`/:locale(${a})`,destination:`/:locale/${r}`,has:t}),n}function k(e,r,t){let a=p(e),o=[{source:`/:path(${`(?!${["_next","api"].map(l=>`${p(l)}(?:/|$)`).join("|")})(?!${a}(?:/|$)).*`})`,destination:`/${e}/:path`,has:r}];return t&&o.push({source:"/",destination:`/${e}`,has:r}),o}function p(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{c as DEFAULT_LLMS_TXT_HEADERS,d as DEFAULT_MARKDOWN_HEADERS,w as LlmsResponse,u as createMarkdownResponse,f as createMarkdownRewrites,R as isMarkdownAccepted,s as mergeHeaders};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/headers.ts","../../src/next/llms-route.ts","../../src/next/markdown-route.ts","../../src/next/rewrites.ts"],"sourcesContent":["export const DEFAULT_MARKDOWN_HEADERS = {\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n} satisfies HeadersInit\n\nexport const DEFAULT_LLMS_TXT_HEADERS = {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"public, max-age=3600, s-maxage=86400\",\n} satisfies HeadersInit\n\nexport function isMarkdownAccepted(accept: string | null | undefined): boolean {\n return (accept ?? \"\").split(\",\").some((range) => {\n const [mediaType = \"\", ...parameters] = range.split(\";\").map((part) => part.trim())\n if (mediaType.toLowerCase() !== \"text/markdown\") return false\n\n const qParameter = parameters.find((parameter) => /^q\\s*=/i.test(parameter))\n if (!qParameter) return true\n\n const [, value = \"\"] = qParameter.split(\"=\")\n return Number.parseFloat(value.trim()) > 0\n })\n}\n\nexport function mergeHeaders(defaults: HeadersInit, overrides?: HeadersInit): Headers {\n const headers = new Headers(defaults)\n if (!overrides) return headers\n\n const overrideHeaders = new Headers(overrides)\n overrideHeaders.forEach((value, key) => {\n headers.set(key, value)\n })\n return headers\n}\n","import { buildLlmsTxt } from \"../llms-txt\"\nimport { DEFAULT_LLMS_TXT_HEADERS, mergeHeaders } from \"./headers\"\n\nimport type { LlmsTxtContent } from \"../llms-txt\"\n\nexport type LlmsTxtRouteContext = {\n request: Request\n}\n\nexport type CreateLlmsTxtRouteOptions = {\n loadContent: (context: LlmsTxtRouteContext) => Promise<LlmsTxtContent> | LlmsTxtContent\n beforeBuild?: (\n content: LlmsTxtContent,\n context: LlmsTxtRouteContext,\n ) => Promise<LlmsTxtContent> | LlmsTxtContent\n afterBuild?: (text: string, context: LlmsTxtRouteContext) => Promise<string> | string\n headers?:\n | HeadersInit\n | ((content: LlmsTxtContent, context: LlmsTxtRouteContext) => HeadersInit | Promise<HeadersInit>)\n}\n\nexport function createLlmsTxtRoute(options: CreateLlmsTxtRouteOptions) {\n return async function GET(request: Request): Promise<Response> {\n const context = { request }\n const loaded = await options.loadContent(context)\n const content = options.beforeBuild ? await options.beforeBuild(loaded, context) : loaded\n const built = buildLlmsTxt(content)\n const text = options.afterBuild ? await options.afterBuild(built, context) : built\n const headerOverrides =\n typeof options.headers === \"function\"\n ? await options.headers(content, context)\n : options.headers\n\n return new Response(text, {\n headers: mergeHeaders(DEFAULT_LLMS_TXT_HEADERS, headerOverrides),\n })\n }\n}\n","import { DEFAULT_MARKDOWN_HEADERS, mergeHeaders } from \"./headers\"\n\nexport function createMarkdownResponse(\n markdown: string,\n options: { headers?: HeadersInit } = {},\n): Response {\n return new Response(markdown, {\n headers: mergeHeaders(DEFAULT_MARKDOWN_HEADERS, options.headers),\n })\n}\n\nexport type MarkdownRouteParams = {\n locale: string\n slug?: string[]\n}\n\nexport type MarkdownRouteContext = {\n params: MarkdownRouteParams | Promise<MarkdownRouteParams>\n}\n\nexport type MarkdownSearchParamsMapper =\n | string[]\n | ((searchParams: URLSearchParams) => Record<string, string>)\n\nexport type MarkdownRouteGetMarkdownArgs = {\n locale: string\n slug?: string[]\n draft: boolean\n searchParams: Record<string, string>\n request: Request\n}\n\ntype DraftModeValue = boolean | { isEnabled: boolean }\n\nexport type CreateMarkdownRouteOptions = {\n locales: readonly string[]\n getMarkdown: (args: MarkdownRouteGetMarkdownArgs) => Promise<string | null> | string | null\n draftMode?: (() => Promise<DraftModeValue> | DraftModeValue) | DraftModeValue\n searchParams?: MarkdownSearchParamsMapper\n notFoundBody?: string\n notFoundStatus?: number\n headers?:\n | HeadersInit\n | ((markdown: string, context: MarkdownRouteGetMarkdownArgs) => HeadersInit | Promise<HeadersInit>)\n beforeResponse?: (\n markdown: string,\n context: MarkdownRouteGetMarkdownArgs,\n ) => Promise<string> | string\n}\n\nexport function createMarkdownRoute(options: CreateMarkdownRouteOptions) {\n const localeSet = new Set(options.locales)\n\n return async function GET(request: Request, context: MarkdownRouteContext): Promise<Response> {\n const params = await context.params\n if (!localeSet.has(params.locale)) {\n return notFound(options)\n }\n\n const draft = await resolveDraft(options.draftMode)\n const searchParams = mapSearchParams(new URL(request.url).searchParams, options.searchParams)\n const routeContext: MarkdownRouteGetMarkdownArgs = {\n locale: params.locale,\n slug: params.slug,\n draft,\n searchParams,\n request,\n }\n\n const markdown = await options.getMarkdown(routeContext)\n if (markdown === null) {\n return notFound(options)\n }\n\n const finalMarkdown = options.beforeResponse\n ? await options.beforeResponse(markdown, routeContext)\n : markdown\n const headers =\n typeof options.headers === \"function\"\n ? await options.headers(finalMarkdown, routeContext)\n : options.headers\n\n return createMarkdownResponse(finalMarkdown, { headers })\n }\n}\n\nfunction notFound(options: Pick<CreateMarkdownRouteOptions, \"notFoundBody\" | \"notFoundStatus\">) {\n return new Response(options.notFoundBody ?? \"Not Found\", {\n status: options.notFoundStatus ?? 404,\n })\n}\n\nasync function resolveDraft(\n draftMode: CreateMarkdownRouteOptions[\"draftMode\"],\n): Promise<boolean> {\n if (!draftMode) return false\n const result = typeof draftMode === \"function\" ? await draftMode() : draftMode\n return typeof result === \"boolean\" ? result : result.isEnabled\n}\n\nfunction mapSearchParams(\n searchParams: URLSearchParams,\n mapper: MarkdownSearchParamsMapper | undefined,\n): Record<string, string> {\n if (!mapper) return {}\n if (typeof mapper === \"function\") return mapper(searchParams)\n\n const result: Record<string, string> = {}\n for (const key of mapper) {\n const value = searchParams.get(key)\n if (value) result[key] = value\n }\n return result\n}\n","export type MarkdownRewriteHasCondition = {\n type: \"header\" | \"host\" | \"cookie\" | \"query\"\n key: string\n value?: string\n}\n\nexport type MarkdownRewrite = {\n source: string\n destination: string\n has?: MarkdownRewriteHasCondition[]\n}\n\nexport type CreateMarkdownRewritesOptions = {\n locales: readonly string[]\n markdownSegment?: string\n acceptHeaderPattern?: string\n includeIndexRewrite?: boolean\n has?: MarkdownRewriteHasCondition[]\n}\n\nexport function createMarkdownRewrites(options: CreateMarkdownRewritesOptions): MarkdownRewrite[] {\n const markdownSegment = options.markdownSegment ?? \"md\"\n const localeSegment = options.locales.map(escapeRegex).join(\"|\")\n const has = options.has ?? [\n {\n type: \"header\",\n key: \"accept\",\n value: options.acceptHeaderPattern ?? \"(.*)text/markdown(.*)\",\n },\n ]\n\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:locale(${localeSegment})/:path*`,\n destination: `/:locale/${markdownSegment}/:path*`,\n has,\n },\n ]\n\n if (options.includeIndexRewrite ?? true) {\n rewrites.push({\n source: `/:locale(${localeSegment})`,\n destination: `/:locale/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n"],"mappings":"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","names":["DEFAULT_MARKDOWN_HEADERS","DEFAULT_LLMS_TXT_HEADERS","isMarkdownAccepted","accept","range","mediaType","parameters","part","qParameter","parameter","value","mergeHeaders","defaults","overrides","headers","key","createLlmsTxtRoute","options","request","context","loaded","content","built","buildLlmsTxt","text","headerOverrides","mergeHeaders","DEFAULT_LLMS_TXT_HEADERS","createMarkdownResponse","markdown","options","mergeHeaders","DEFAULT_MARKDOWN_HEADERS","createMarkdownRoute","localeSet","request","context","params","notFound","draft","resolveDraft","searchParams","mapSearchParams","routeContext","finalMarkdown","headers","draftMode","result","mapper","key","value","createMarkdownRewrites","options","markdownSegment","localeSegment","escapeRegex","has","rewrites","value"]}
1
+ {"version":3,"sources":["../../src/next/headers.ts","../../src/next/markdown-response.ts","../../src/next/llms-txt-response.ts","../../src/next/rewrites.ts"],"sourcesContent":["export const DEFAULT_MARKDOWN_HEADERS = {\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n} satisfies HeadersInit\n\nexport const DEFAULT_LLMS_TXT_HEADERS = {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n} satisfies HeadersInit\n\nexport function isMarkdownAccepted(accept: string | null | undefined): boolean {\n return (accept ?? \"\").split(\",\").some((range) => {\n const [mediaType = \"\", ...parameters] = range.split(\";\").map((part) => part.trim())\n if (mediaType.toLowerCase() !== \"text/markdown\") return false\n\n const qParameter = parameters.find((parameter) => /^q\\s*=/i.test(parameter))\n if (!qParameter) return true\n\n const [, value = \"\"] = qParameter.split(\"=\")\n return Number.parseFloat(value.trim()) > 0\n })\n}\n\nexport function mergeHeaders(defaults: HeadersInit, overrides?: HeadersInit): Headers {\n const headers = new Headers(defaults)\n if (!overrides) return headers\n\n const overrideHeaders = new Headers(overrides)\n overrideHeaders.forEach((value, key) => {\n headers.set(key, value)\n })\n return headers\n}\n","import { DEFAULT_MARKDOWN_HEADERS, mergeHeaders } from \"./headers\"\n\nexport function createMarkdownResponse(\n markdown: string,\n options: { headers?: HeadersInit } = {},\n): Response {\n return new Response(markdown, {\n headers: mergeHeaders(DEFAULT_MARKDOWN_HEADERS, options.headers),\n })\n}\n","import { DEFAULT_LLMS_TXT_HEADERS, mergeHeaders } from \"./headers\"\n\n/** `Response` for `llms.txt`-style plain text with {@link DEFAULT_LLMS_TXT_HEADERS} merged into `init.headers`. */\nexport class LlmsResponse extends Response {\n constructor(body: BodyInit, init: ResponseInit & { headers?: HeadersInit } = {}) {\n const { headers, ...rest } = init\n super(body, {\n ...rest,\n headers: mergeHeaders(DEFAULT_LLMS_TXT_HEADERS, headers),\n })\n }\n}\n","/** Next.js rewrite condition used to route markdown-preferring requests. */\nexport interface MarkdownRewriteHasCondition {\n /** Rewrite condition type understood by Next.js. */\n type: \"header\" | \"host\" | \"cookie\" | \"query\"\n /** Header, host, cookie, or query key to inspect. */\n key: string\n /** Optional match pattern for the inspected value. */\n value?: string\n}\n\n/** Next.js rewrite entry produced for markdown route support. */\nexport interface MarkdownRewrite {\n /** Source route pattern to match. */\n source: string\n /** Destination markdown route pattern. */\n destination: string\n /** Optional conditions that must match for the rewrite. */\n has?: MarkdownRewriteHasCondition[]\n}\n\n/** Shared options for generating Next.js markdown rewrites. */\ninterface CreateMarkdownRewritesSharedOptions {\n /** Markdown route segment; defaults to `\"md\"`. */\n markdownSegment?: string\n /** Accept header pattern used when no custom `has` conditions are provided. */\n acceptHeaderPattern?: string\n /** Whether to include an index rewrite (`/` or `/:locale`) to the markdown segment; defaults to true. */\n includeIndexRewrite?: boolean\n /** Custom rewrite conditions replacing the default markdown Accept header check. */\n has?: MarkdownRewriteHasCondition[]\n}\n\n/** Options when routes include a dynamic locale prefix (`/:locale/...`). */\nexport interface CreateMarkdownRewritesLocalizedOptions extends CreateMarkdownRewritesSharedOptions {\n /** Locale segments to include in generated rewrite patterns. */\n locales: readonly string[]\n /** Include `:locale(...)` in rewrite patterns (default). */\n localizedRoutes?: true\n}\n\n/** Options when there is no locale prefix (single-locale apps using `/...` instead of `/:locale/...`). */\nexport interface CreateMarkdownRewritesUnlocalizedOptions extends CreateMarkdownRewritesSharedOptions {\n localizedRoutes: false\n}\n\nexport type CreateMarkdownRewritesOptions =\n | CreateMarkdownRewritesLocalizedOptions\n | CreateMarkdownRewritesUnlocalizedOptions\n\nexport function createMarkdownRewrites(options: CreateMarkdownRewritesOptions): MarkdownRewrite[] {\n const markdownSegment = options.markdownSegment ?? \"md\"\n const has = options.has ?? [\n {\n type: \"header\",\n key: \"accept\",\n value: options.acceptHeaderPattern ?? \"(.*)text/markdown(.*)\",\n },\n ]\n\n if (options.localizedRoutes === false) {\n return createUnlocalizedMarkdownRewrites(markdownSegment, has, options.includeIndexRewrite ?? true)\n }\n\n const localeSegment = options.locales.map(escapeRegex).join(\"|\")\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:locale(${localeSegment})/:path*`,\n destination: `/:locale/${markdownSegment}/:path*`,\n has,\n },\n ]\n\n if (options.includeIndexRewrite ?? true) {\n rewrites.push({\n source: `/:locale(${localeSegment})`,\n destination: `/:locale/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction createUnlocalizedMarkdownRewrites(\n markdownSegment: string,\n has: MarkdownRewriteHasCondition[],\n includeIndexRewrite: boolean,\n): MarkdownRewrite[] {\n const mdEsc = escapeRegex(markdownSegment)\n const frameworkPrefixesPattern = [\"_next\", \"api\"]\n .map((prefix) => `${escapeRegex(prefix)}(?:/|$)`)\n .join(\"|\")\n /**\n * Exclude paths already under `/${markdownSegment}`, Next internals (`/_next`, `/api`), so we do not\n * rewrite markdown URLs or framework routes twice.\n */\n const pathPattern = `(?!${frameworkPrefixesPattern})(?!${mdEsc}(?:/|$)).*`\n\n const rewrites: MarkdownRewrite[] = [\n {\n source: `/:path(${pathPattern})`,\n destination: `/${markdownSegment}/:path`,\n has,\n },\n ]\n\n if (includeIndexRewrite) {\n rewrites.push({\n source: \"/\",\n destination: `/${markdownSegment}`,\n has,\n })\n }\n\n return rewrites\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n"],"mappings":"AAAO,IAAMA,EAA2B,CACtC,eAAgB,8BAClB,EAEaC,EAA2B,CACtC,eAAgB,2BAClB,EAEO,SAASC,EAAmBC,EAA4C,CAC7E,OAAQA,GAAU,IAAI,MAAM,GAAG,EAAE,KAAMC,GAAU,CAC/C,GAAM,CAACC,EAAY,GAAI,GAAGC,CAAU,EAAIF,EAAM,MAAM,GAAG,EAAE,IAAKG,GAASA,EAAK,KAAK,CAAC,EAClF,GAAIF,EAAU,YAAY,IAAM,gBAAiB,MAAO,GAExD,IAAMG,EAAaF,EAAW,KAAMG,GAAc,UAAU,KAAKA,CAAS,CAAC,EAC3E,GAAI,CAACD,EAAY,MAAO,GAExB,GAAM,CAAC,CAAEE,EAAQ,EAAE,EAAIF,EAAW,MAAM,GAAG,EAC3C,OAAO,OAAO,WAAWE,EAAM,KAAK,CAAC,EAAI,CAC3C,CAAC,CACH,CAEO,SAASC,EAAaC,EAAuBC,EAAkC,CACpF,IAAMC,EAAU,IAAI,QAAQF,CAAQ,EACpC,OAAKC,GAEmB,IAAI,QAAQA,CAAS,EAC7B,QAAQ,CAACH,EAAOK,IAAQ,CACtCD,EAAQ,IAAIC,EAAKL,CAAK,CACxB,CAAC,EACMI,CACT,CC5BO,SAASE,EACdC,EACAC,EAAqC,CAAC,EAC5B,CACV,OAAO,IAAI,SAASD,EAAU,CAC5B,QAASE,EAAaC,EAA0BF,EAAQ,OAAO,CACjE,CAAC,CACH,CCNO,IAAMG,EAAN,cAA2B,QAAS,CACzC,YAAYC,EAAgBC,EAAiD,CAAC,EAAG,CAC/E,GAAM,CAAE,QAAAC,EAAS,GAAGC,CAAK,EAAIF,EAC7B,MAAMD,EAAM,CACV,GAAGG,EACH,QAASC,EAAaC,EAA0BH,CAAO,CACzD,CAAC,CACH,CACF,ECsCO,SAASI,EAAuBC,EAA2D,CAChG,IAAMC,EAAkBD,EAAQ,iBAAmB,KAC7CE,EAAMF,EAAQ,KAAO,CACzB,CACE,KAAM,SACN,IAAK,SACL,MAAOA,EAAQ,qBAAuB,uBACxC,CACF,EAEA,GAAIA,EAAQ,kBAAoB,GAC9B,OAAOG,EAAkCF,EAAiBC,EAAKF,EAAQ,qBAAuB,EAAI,EAGpG,IAAMI,EAAgBJ,EAAQ,QAAQ,IAAIK,CAAW,EAAE,KAAK,GAAG,EACzDC,EAA8B,CAClC,CACE,OAAQ,YAAYF,CAAa,WACjC,YAAa,YAAYH,CAAe,UACxC,IAAAC,CACF,CACF,EAEA,OAAIF,EAAQ,qBAAuB,KACjCM,EAAS,KAAK,CACZ,OAAQ,YAAYF,CAAa,IACjC,YAAa,YAAYH,CAAe,GACxC,IAAAC,CACF,CAAC,EAGII,CACT,CAEA,SAASH,EACPF,EACAC,EACAK,EACmB,CACnB,IAAMC,EAAQH,EAAYJ,CAAe,EAUnCK,EAA8B,CAClC,CACE,OAAQ,UAJQ,MAPa,CAAC,QAAS,KAAK,EAC7C,IAAKG,GAAW,GAAGJ,EAAYI,CAAM,CAAC,SAAS,EAC/C,KAAK,GAAG,CAKuC,OAAOD,CAAK,YAI7B,IAC7B,YAAa,IAAIP,CAAe,SAChC,IAAAC,CACF,CACF,EAEA,OAAIK,GACFD,EAAS,KAAK,CACZ,OAAQ,IACR,YAAa,IAAIL,CAAe,GAChC,IAAAC,CACF,CAAC,EAGII,CACT,CAEA,SAASD,EAAYK,EAAuB,CAC1C,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACpD","names":["DEFAULT_MARKDOWN_HEADERS","DEFAULT_LLMS_TXT_HEADERS","isMarkdownAccepted","accept","range","mediaType","parameters","part","qParameter","parameter","value","mergeHeaders","defaults","overrides","headers","key","createMarkdownResponse","markdown","options","mergeHeaders","DEFAULT_MARKDOWN_HEADERS","LlmsResponse","body","init","headers","rest","mergeHeaders","DEFAULT_LLMS_TXT_HEADERS","createMarkdownRewrites","options","markdownSegment","has","createUnlocalizedMarkdownRewrites","localeSegment","escapeRegex","rewrites","includeIndexRewrite","mdEsc","prefix","value"]}
@@ -0,0 +1,7 @@
1
+ /** `Response` for `llms.txt`-style plain text with {@link DEFAULT_LLMS_TXT_HEADERS} merged into `init.headers`. */
2
+ export declare class LlmsResponse extends Response {
3
+ constructor(body: BodyInit, init?: ResponseInit & {
4
+ headers?: HeadersInit;
5
+ });
6
+ }
7
+ //# sourceMappingURL=llms-txt-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt-response.d.ts","sourceRoot":"","sources":["../../src/next/llms-txt-response.ts"],"names":[],"mappings":"AAEA,mHAAmH;AACnH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,YAAY,GAAG;QAAE,OAAO,CAAC,EAAE,WAAW,CAAA;KAAO;CAOhF"}
@@ -0,0 +1,4 @@
1
+ export declare function createMarkdownResponse(markdown: string, options?: {
2
+ headers?: HeadersInit;
3
+ }): Response;
4
+ //# sourceMappingURL=markdown-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-response.d.ts","sourceRoot":"","sources":["../../src/next/markdown-response.ts"],"names":[],"mappings":"AAEA,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,WAAW,CAAA;CAAO,GACtC,QAAQ,CAIV"}
@@ -1,19 +1,44 @@
1
- export type MarkdownRewriteHasCondition = {
1
+ /** Next.js rewrite condition used to route markdown-preferring requests. */
2
+ export interface MarkdownRewriteHasCondition {
3
+ /** Rewrite condition type understood by Next.js. */
2
4
  type: "header" | "host" | "cookie" | "query";
5
+ /** Header, host, cookie, or query key to inspect. */
3
6
  key: string;
7
+ /** Optional match pattern for the inspected value. */
4
8
  value?: string;
5
- };
6
- export type MarkdownRewrite = {
9
+ }
10
+ /** Next.js rewrite entry produced for markdown route support. */
11
+ export interface MarkdownRewrite {
12
+ /** Source route pattern to match. */
7
13
  source: string;
14
+ /** Destination markdown route pattern. */
8
15
  destination: string;
16
+ /** Optional conditions that must match for the rewrite. */
9
17
  has?: MarkdownRewriteHasCondition[];
10
- };
11
- export type CreateMarkdownRewritesOptions = {
12
- locales: readonly string[];
18
+ }
19
+ /** Shared options for generating Next.js markdown rewrites. */
20
+ interface CreateMarkdownRewritesSharedOptions {
21
+ /** Markdown route segment; defaults to `"md"`. */
13
22
  markdownSegment?: string;
23
+ /** Accept header pattern used when no custom `has` conditions are provided. */
14
24
  acceptHeaderPattern?: string;
25
+ /** Whether to include an index rewrite (`/` or `/:locale`) to the markdown segment; defaults to true. */
15
26
  includeIndexRewrite?: boolean;
27
+ /** Custom rewrite conditions replacing the default markdown Accept header check. */
16
28
  has?: MarkdownRewriteHasCondition[];
17
- };
29
+ }
30
+ /** Options when routes include a dynamic locale prefix (`/:locale/...`). */
31
+ export interface CreateMarkdownRewritesLocalizedOptions extends CreateMarkdownRewritesSharedOptions {
32
+ /** Locale segments to include in generated rewrite patterns. */
33
+ locales: readonly string[];
34
+ /** Include `:locale(...)` in rewrite patterns (default). */
35
+ localizedRoutes?: true;
36
+ }
37
+ /** Options when there is no locale prefix (single-locale apps using `/...` instead of `/:locale/...`). */
38
+ export interface CreateMarkdownRewritesUnlocalizedOptions extends CreateMarkdownRewritesSharedOptions {
39
+ localizedRoutes: false;
40
+ }
41
+ export type CreateMarkdownRewritesOptions = CreateMarkdownRewritesLocalizedOptions | CreateMarkdownRewritesUnlocalizedOptions;
18
42
  export declare function createMarkdownRewrites(options: CreateMarkdownRewritesOptions): MarkdownRewrite[];
43
+ export {};
19
44
  //# sourceMappingURL=rewrites.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rewrites.d.ts","sourceRoot":"","sources":["../../src/next/rewrites.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC5C,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,EAAE,2BAA2B,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,GAAG,CAAC,EAAE,2BAA2B,EAAE,CAAA;CACpC,CAAA;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,eAAe,EAAE,CA4BhG"}
1
+ {"version":3,"file":"rewrites.d.ts","sourceRoot":"","sources":["../../src/next/rewrites.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC5C,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,2BAA2B,EAAE,CAAA;CACpC;AAED,+DAA+D;AAC/D,UAAU,mCAAmC;IAC3C,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yGAAyG;IACzG,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,oFAAoF;IACpF,GAAG,CAAC,EAAE,2BAA2B,EAAE,CAAA;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,sCAAuC,SAAQ,mCAAmC;IACjG,gEAAgE;IAChE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,4DAA4D;IAC5D,eAAe,CAAC,EAAE,IAAI,CAAA;CACvB;AAED,0GAA0G;AAC1G,MAAM,WAAW,wCAAyC,SAAQ,mCAAmC;IACnG,eAAe,EAAE,KAAK,CAAA;CACvB;AAED,MAAM,MAAM,6BAA6B,GACrC,sCAAsC,GACtC,wCAAwC,CAAA;AAE5C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,eAAe,EAAE,CAgChG"}
@@ -1,3 +1,5 @@
1
+ /** Optional headers accepted by Next.js route helpers. */
1
2
  export type HeadersInput = HeadersInit | undefined;
3
+ /** Static headers or a context-aware function that resolves response headers. */
2
4
  export type HeaderResolver<Context> = HeadersInit | ((context: Context) => HeadersInit | Promise<HeadersInit>) | undefined;
3
5
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/next/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AAElD,MAAM,MAAM,cAAc,CAAC,OAAO,IAC9B,WAAW,GACX,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,GAC1D,SAAS,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/next/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AAElD,iFAAiF;AACjF,MAAM,MAAM,cAAc,CAAC,OAAO,IAC9B,WAAW,GACX,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,GAC1D,SAAS,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kCAAkC,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAE3F,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,wBAA6B,GACrC,kCAAkC,CAQpC"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kCAAkC,EAClC,wBAAwB,EACzB,MAAM,SAAS,CAAA;AAWhB,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,wBAA6B,GACrC,kCAAkC,CASpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEtE,eAAO,MAAM,iBAAiB,GAAI,UAAU,wBAAwB,KAAG,aAItE,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEtE,eAAO,MAAM,iBAAiB,GAAI,UAAU,wBAAwB,KAAG,aAiBtE,CAAA"}
package/dist/types.d.ts CHANGED
@@ -1,20 +1,53 @@
1
- export type PayloadPluginConfig = {
2
- collections?: unknown[];
3
- [key: string]: unknown;
4
- };
5
- export type PayloadPlugin = (config: PayloadPluginConfig) => PayloadPluginConfig;
6
- export type PayloadPluginLlmsOptions = {
1
+ import type { GlobalConfig, Plugin } from "payload";
2
+ /** Payload config type accepted by plugin functions. */
3
+ export type PayloadPluginConfig = Parameters<Plugin>[0];
4
+ /** Payload plugin function type returned by this package. */
5
+ export type PayloadPlugin = Plugin;
6
+ /** Plugin options for the llms Payload global (admin + schema). */
7
+ export interface PayloadPluginLlmsGlobalOptions {
8
+ /** Global slug; defaults to `"llms"`. */
9
+ slug?: string;
10
+ /** Admin label; defaults to `"LLMs"`. */
11
+ label?: string;
12
+ /** Localize rich text and sections like a typical i18n global; defaults to `false`. */
13
+ localized?: boolean;
14
+ /** Deep-merge into the generated global config (access, hooks, admin, etc.). */
15
+ overrides?: Partial<GlobalConfig>;
16
+ }
17
+ /** Options for configuring the Payload llms plugin. */
18
+ export interface PayloadPluginLlmsOptions {
19
+ /** Enables or disables the plugin; defaults to enabled. */
7
20
  enabled?: boolean;
21
+ /** Route segment overrides for llms.txt and markdown output (documentation defaults only). */
8
22
  routes?: {
23
+ /** Path for the generated llms.txt route. */
9
24
  llmsTxt?: string;
25
+ /** URL segment used for markdown routes. */
10
26
  markdownSegment?: string;
11
27
  };
12
- };
13
- export type NormalizedPayloadPluginLlmsOptions = {
28
+ /** Payload global holding llms.txt / llms-full.txt editor content. */
29
+ global?: PayloadPluginLlmsGlobalOptions;
30
+ }
31
+ /** Normalized global options used when building the llms global. */
32
+ export interface NormalizedLlmsGlobalOptions {
33
+ slug: string;
34
+ label: string;
35
+ localized: boolean;
36
+ overrides?: Partial<GlobalConfig>;
37
+ }
38
+ /** Normalized llms plugin options used internally after defaults are applied. */
39
+ export interface NormalizedPayloadPluginLlmsOptions {
40
+ /** Whether the plugin is enabled after defaults are applied. */
14
41
  enabled: boolean;
42
+ /** Normalized route segment settings. */
15
43
  routes: {
44
+ /** Path for the generated llms.txt route. */
16
45
  llmsTxt: string;
46
+ /** URL segment used for markdown routes. */
17
47
  markdownSegment: string;
18
48
  };
19
- };
49
+ global: NormalizedLlmsGlobalOptions;
50
+ }
51
+ /** Tab keys on the llms global document. */
52
+ export type LlmsGlobalTabKey = "llmsTxt" | "llmsFullTxt";
20
53
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,mBAAmB,KAAK,mBAAmB,CAAA;AAEhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;CACF,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEnD,wDAAwD;AACxD,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAEvD,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC,mEAAmE;AACnE,MAAM,WAAW,8BAA8B;IAC7C,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uFAAuF;IACvF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAClC;AAED,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE;QACP,6CAA6C;QAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,4CAA4C;QAC5C,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB,CAAA;IACD,sEAAsE;IACtE,MAAM,CAAC,EAAE,8BAA8B,CAAA;CACxC;AAED,oEAAoE;AACpE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAClC;AAED,iFAAiF;AACjF,MAAM,WAAW,kCAAkC;IACjD,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,MAAM,EAAE;QACN,6CAA6C;QAC7C,OAAO,EAAE,MAAM,CAAA;QACf,4CAA4C;QAC5C,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,MAAM,EAAE,2BAA2B,CAAA;CACpC;AAED,4CAA4C;AAC5C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,aAAa,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "payload-plugin-llms",
3
- "version": "0.9.0",
4
- "description": "Payload CMS plugin and Next.js helpers for llms.txt and markdown routes.",
3
+ "version": "0.9.1",
4
+ "description": "Payload global for llms.txt / llms-full.txt, Lexical → Markdown, and Next.js markdown helpers.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "keywords": [
@@ -44,11 +44,15 @@
44
44
  "build": "tsup --config tsup.config.ts --minify && tsc -p tsconfig.build.json --emitDeclarationOnly",
45
45
  "dev": "tsup --config tsup.config.ts --watch",
46
46
  "test": "vitest run tests/index.test.ts",
47
- "typecheck": "tsc --noEmit"
47
+ "typecheck": "tsc --noEmit",
48
+ "lint": "pnpm -w exec oxlint \"packages/${npm_package_name}\"",
49
+ "format": "pnpm exec oxfmt .",
50
+ "format:check": "pnpm exec oxfmt --check ."
48
51
  },
49
52
  "peerDependencies": {
50
- "next": ">=15.0.0",
51
- "payload": ">=3.0.0"
53
+ "@payloadcms/richtext-lexical": "^3.80.0",
54
+ "next": "^15.0.0 || ^16.0.0",
55
+ "payload": "^3.80.0"
52
56
  },
53
57
  "peerDependenciesMeta": {
54
58
  "next": {
@@ -57,5 +61,8 @@
57
61
  },
58
62
  "publishConfig": {
59
63
  "access": "public"
64
+ },
65
+ "devDependencies": {
66
+ "@payloadcms/richtext-lexical": "3.84.1"
60
67
  }
61
68
  }
@@ -1,3 +0,0 @@
1
- function o(i){let t=`- [${i.title}](${i.url})`;return i.description?`${t}: ${i.description}`:t}function g(i){let t=[];i.title&&t.push(`# ${i.title}`,""),i.description&&t.push(`> ${i.description}`,""),e(t,i.intro);for(let n of i.sections??[]){t.push(`## ${n.title}`,""),e(t,n.content,{trailingBlank:!1});for(let s of n.links??[])t.push(o(s));t.push("")}return e(t,i.footer,{trailingBlank:!1}),l(t).join(`
2
- `)}function e(i,t,n={}){let s=Array.isArray(t)?t:t?[t]:[];if(s.length!==0){if(n.trailingBlank??!0){for(let r of s)i.push(r,"");return}for(let r of s)i.push(r)}}function l(i){let t=[...i];for(;t[0]==="";)t.shift();for(;t.at(-1)==="";)t.pop();return t}export{o as a,g as b};
3
- //# sourceMappingURL=chunk-B5YH4Y5S.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llms-txt.ts"],"sourcesContent":["export type LlmsTxtLink = {\n title: string\n url: string\n description?: string | null\n}\n\nexport type LlmsTxtSection = {\n title: string\n content?: string | string[]\n links?: LlmsTxtLink[]\n}\n\nexport type LlmsTxtContent = {\n title?: string\n description?: string\n intro?: string | string[]\n sections?: LlmsTxtSection[]\n footer?: string | string[]\n}\n\nexport function formatLlmsTxtLink(link: LlmsTxtLink): string {\n const line = `- [${link.title}](${link.url})`\n return link.description ? `${line}: ${link.description}` : line\n}\n\nexport function buildLlmsTxt(content: LlmsTxtContent): string {\n const lines: string[] = []\n\n if (content.title) {\n lines.push(`# ${content.title}`, \"\")\n }\n if (content.description) {\n lines.push(`> ${content.description}`, \"\")\n }\n\n appendLines(lines, content.intro)\n\n for (const section of content.sections ?? []) {\n lines.push(`## ${section.title}`, \"\")\n appendLines(lines, section.content, { trailingBlank: false })\n for (const link of section.links ?? []) {\n lines.push(formatLlmsTxtLink(link))\n }\n lines.push(\"\")\n }\n\n appendLines(lines, content.footer, { trailingBlank: false })\n\n return trimBlankEdges(lines).join(\"\\n\")\n}\n\nfunction appendLines(\n lines: string[],\n value: string | string[] | undefined,\n options: { trailingBlank?: boolean } = {},\n) {\n const values = Array.isArray(value) ? value : value ? [value] : []\n if (values.length === 0) return\n\n if (options.trailingBlank ?? true) {\n for (const item of values) {\n lines.push(item, \"\")\n }\n return\n }\n\n for (const item of values) {\n lines.push(item)\n }\n}\n\nfunction trimBlankEdges(lines: string[]) {\n const trimmed = [...lines]\n while (trimmed[0] === \"\") trimmed.shift()\n while (trimmed.at(-1) === \"\") trimmed.pop()\n return trimmed\n}\n"],"mappings":"AAoBO,SAASA,EAAkBC,EAA2B,CAC3D,IAAMC,EAAO,MAAMD,EAAK,KAAK,KAAKA,EAAK,GAAG,IAC1C,OAAOA,EAAK,YAAc,GAAGC,CAAI,KAAKD,EAAK,WAAW,GAAKC,CAC7D,CAEO,SAASC,EAAaC,EAAiC,CAC5D,IAAMC,EAAkB,CAAC,EAErBD,EAAQ,OACVC,EAAM,KAAK,KAAKD,EAAQ,KAAK,GAAI,EAAE,EAEjCA,EAAQ,aACVC,EAAM,KAAK,KAAKD,EAAQ,WAAW,GAAI,EAAE,EAG3CE,EAAYD,EAAOD,EAAQ,KAAK,EAEhC,QAAWG,KAAWH,EAAQ,UAAY,CAAC,EAAG,CAC5CC,EAAM,KAAK,MAAME,EAAQ,KAAK,GAAI,EAAE,EACpCD,EAAYD,EAAOE,EAAQ,QAAS,CAAE,cAAe,EAAM,CAAC,EAC5D,QAAWN,KAAQM,EAAQ,OAAS,CAAC,EACnCF,EAAM,KAAKL,EAAkBC,CAAI,CAAC,EAEpCI,EAAM,KAAK,EAAE,CACf,CAEA,OAAAC,EAAYD,EAAOD,EAAQ,OAAQ,CAAE,cAAe,EAAM,CAAC,EAEpDI,EAAeH,CAAK,EAAE,KAAK;AAAA,CAAI,CACxC,CAEA,SAASC,EACPD,EACAI,EACAC,EAAuC,CAAC,EACxC,CACA,IAAMC,EAAS,MAAM,QAAQF,CAAK,EAAIA,EAAQA,EAAQ,CAACA,CAAK,EAAI,CAAC,EACjE,GAAIE,EAAO,SAAW,EAEtB,IAAID,EAAQ,eAAiB,GAAM,CACjC,QAAWE,KAAQD,EACjBN,EAAM,KAAKO,EAAM,EAAE,EAErB,MACF,CAEA,QAAWA,KAAQD,EACjBN,EAAM,KAAKO,CAAI,EAEnB,CAEA,SAASJ,EAAeH,EAAiB,CACvC,IAAMQ,EAAU,CAAC,GAAGR,CAAK,EACzB,KAAOQ,EAAQ,CAAC,IAAM,IAAIA,EAAQ,MAAM,EACxC,KAAOA,EAAQ,GAAG,EAAE,IAAM,IAAIA,EAAQ,IAAI,EAC1C,OAAOA,CACT","names":["formatLlmsTxtLink","link","line","buildLlmsTxt","content","lines","appendLines","section","trimBlankEdges","value","options","values","item","trimmed"]}
@@ -1,12 +0,0 @@
1
- import type { LlmsTxtContent } from "../llms-txt";
2
- export type LlmsTxtRouteContext = {
3
- request: Request;
4
- };
5
- export type CreateLlmsTxtRouteOptions = {
6
- loadContent: (context: LlmsTxtRouteContext) => Promise<LlmsTxtContent> | LlmsTxtContent;
7
- beforeBuild?: (content: LlmsTxtContent, context: LlmsTxtRouteContext) => Promise<LlmsTxtContent> | LlmsTxtContent;
8
- afterBuild?: (text: string, context: LlmsTxtRouteContext) => Promise<string> | string;
9
- headers?: HeadersInit | ((content: LlmsTxtContent, context: LlmsTxtRouteContext) => HeadersInit | Promise<HeadersInit>);
10
- };
11
- export declare function createLlmsTxtRoute(options: CreateLlmsTxtRouteOptions): (request: Request) => Promise<Response>;
12
- //# sourceMappingURL=llms-route.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llms-route.d.ts","sourceRoot":"","sources":["../../src/next/llms-route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAA;IACvF,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,mBAAmB,KACzB,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAA;IAC7C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IACrF,OAAO,CAAC,EACJ,WAAW,GACX,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,mBAAmB,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;CACpG,CAAA;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,IACzC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAe/D"}