nuxt-llms 0.1.4 → 0.3.0

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.
package/README.md CHANGED
@@ -87,6 +87,7 @@ That's it! You can visit `/llms.txt` to see the generated documentation ✨
87
87
  - `full`: The `llms-full.txt` configuration. Setting this option will enable the `llms-full.txt` route.
88
88
  - `title`: The title of the llms-full documentation
89
89
  - `description`: The description of the llms-full documentation
90
+ - `prerender`: Whether to prerender `/llms.txt` (and `/llms-full.txt` when `full` is set) at build time. Defaults to `true`. Set it to `false` to serve them dynamically instead, for example when caching them with ISR.
90
91
 
91
92
  ## Documentation Formats
92
93
 
@@ -190,6 +191,8 @@ X-API-Key: <your-api-key>
190
191
  })
191
192
  ```
192
193
 
194
+ On Nuxt 5, register the same hooks with `useServerHooks().hook()` from `nuxt/server`, which also types them.
195
+
193
196
  ### Using Hooks in Nuxt Modules
194
197
 
195
198
  If you're developing a Nuxt module that needs to extend the LLMs documentation:
@@ -269,5 +272,5 @@ Copyright (c) NuxtLabs
269
272
  [license-src]: https://img.shields.io/npm/l/nuxt-llms.svg?style=flat&colorA=020420&colorB=00DC82
270
273
  [license-href]: https://npmjs.com/package/nuxt-llms
271
274
 
272
- [nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js
275
+ [nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt
273
276
  [nuxt-href]: https://nuxt.com
package/dist/module.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "nuxt-llms",
3
3
  "configKey": "llms",
4
- "version": "0.1.4",
4
+ "version": "0.3.0",
5
5
  "docs": "https://github.com/nuxtlabs/nuxt-llms",
6
6
  "builder": {
7
- "@nuxt/module-builder": "1.0.2",
7
+ "@nuxt/module-builder": "1.0.3",
8
8
  "unbuild": "3.6.1"
9
9
  }
10
10
  }
package/dist/module.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { defineNuxtModule, useLogger, createResolver, addServerImports, addServerHandler, addPrerenderRoutes } from '@nuxt/kit';
2
2
 
3
- const version = "0.1.4";
3
+ const version = "0.3.0";
4
4
 
5
5
  const module$1 = defineNuxtModule({
6
6
  meta: {
@@ -9,7 +9,9 @@ const module$1 = defineNuxtModule({
9
9
  version,
10
10
  docs: "https://github.com/nuxtlabs/nuxt-llms"
11
11
  },
12
- defaults: {},
12
+ defaults: {
13
+ prerender: true
14
+ },
13
15
  setup(options, nuxt) {
14
16
  const logger = useLogger("nuxt-llms");
15
17
  const { resolve } = createResolver(import.meta.url);
@@ -24,9 +26,25 @@ const module$1 = defineNuxtModule({
24
26
  logger.warn("nuxt-llms require a domain to be set. `llms.domain` is missing.");
25
27
  return;
26
28
  }
27
- addServerImports([{ name: "llmsHooks", from: resolve("./runtime/server/utils/hooks") }]);
28
- addServerHandler({ route: "/llms.txt", handler: resolve("./runtime/server/routes/llms.txt.get") });
29
- addPrerenderRoutes("/llms.txt");
29
+ addServerImports([
30
+ {
31
+ name: "llmsHooks",
32
+ from: {
33
+ nuxt: resolve("./runtime/server/utils/hooks"),
34
+ nitro2: resolve("./runtime/server/utils/hooks.legacy")
35
+ }
36
+ }
37
+ ]);
38
+ addServerHandler({
39
+ route: "/llms.txt",
40
+ handler: {
41
+ nuxt: resolve("./runtime/server/routes/llms.txt.get"),
42
+ nitro2: resolve("./runtime/server/routes/llms.txt.get.legacy")
43
+ }
44
+ });
45
+ if (options.prerender !== false) {
46
+ addPrerenderRoutes("/llms.txt");
47
+ }
30
48
  if (options.full) {
31
49
  llmsConfig.sections.unshift({
32
50
  title: "Documentation Sets",
@@ -38,8 +56,16 @@ const module$1 = defineNuxtModule({
38
56
  }
39
57
  ]
40
58
  });
41
- addServerHandler({ route: "/llms-full.txt", handler: resolve("./runtime/server/routes/llms-full.txt.get") });
42
- addPrerenderRoutes("/llms-full.txt");
59
+ addServerHandler({
60
+ route: "/llms-full.txt",
61
+ handler: {
62
+ nuxt: resolve("./runtime/server/routes/llms-full.txt.get"),
63
+ nitro2: resolve("./runtime/server/routes/llms-full.txt.get.legacy")
64
+ }
65
+ });
66
+ if (options.prerender !== false) {
67
+ addPrerenderRoutes("/llms-full.txt");
68
+ }
43
69
  }
44
70
  }
45
71
  });
@@ -1 +1 @@
1
- export * from './server/utils/hooks.js';
1
+ export * from './server/utils/hooks.legacy.js';
@@ -1 +1 @@
1
- export * from "./server/utils/hooks.js";
1
+ export * from "./server/utils/hooks.legacy.js";
@@ -1,2 +1,2 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string>>;
1
+ declare const _default: import("nuxt/server").EventHandler<Promise<string>>;
2
2
  export default _default;
@@ -1,12 +1,11 @@
1
- import { eventHandler, setHeader } from "h3";
2
- import { llmsHooks } from "nuxt-llms/runtime";
3
- import { useRuntimeConfig, useNitroApp } from "#imports";
4
- export default eventHandler(async (event) => {
5
- const options = useRuntimeConfig(event).llms;
1
+ import { defineEventHandler, useRuntimeConfig, useServerHooks } from "nuxt/server";
2
+ import { llmsHooks } from "../utils/hooks.js";
3
+ export default defineEventHandler(async (event) => {
4
+ const options = useRuntimeConfig().llms;
6
5
  const contents = [];
7
6
  const llms = JSON.parse(JSON.stringify(options));
8
- await useNitroApp().hooks.callHook("llms:generate:full", event, llms, contents);
7
+ await useServerHooks().callHook("llms:generate:full", event, llms, contents);
9
8
  await llmsHooks.callHook("generate:full", event, llms, contents);
10
- setHeader(event, "Content-Type", "text/plain; charset=utf-8");
9
+ event.res.headers.set("Content-Type", "text/plain; charset=utf-8");
11
10
  return contents.join("\n\n");
12
11
  });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string>>;
2
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import { eventHandler, setHeader } from "h3";
2
+ import { llmsHooks } from "nuxt-llms/runtime";
3
+ import { useRuntimeConfig, useNitroApp } from "nitropack/runtime";
4
+ export default eventHandler(async (event) => {
5
+ const options = useRuntimeConfig(event).llms;
6
+ const contents = [];
7
+ const llms = JSON.parse(JSON.stringify(options));
8
+ await useNitroApp().hooks.callHook("llms:generate:full", event, llms, contents);
9
+ await llmsHooks.callHook("generate:full", event, llms, contents);
10
+ setHeader(event, "Content-Type", "text/plain; charset=utf-8");
11
+ return contents.join("\n\n");
12
+ });
@@ -1,2 +1,2 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string>>;
1
+ declare const _default: import("nuxt/server").EventHandler<Promise<string>>;
2
2
  export default _default;
@@ -1,14 +1,11 @@
1
- import { eventHandler, setHeader } from "h3";
2
- import { llmsHooks } from "nuxt-llms/runtime";
3
- import { useRuntimeConfig, useNitroApp } from "#imports";
4
- export default eventHandler(async (event) => {
5
- const options = useRuntimeConfig(event).llms;
1
+ import { defineEventHandler, useRuntimeConfig, useServerHooks } from "nuxt/server";
2
+ import { llmsHooks } from "../utils/hooks.js";
3
+ export default defineEventHandler(async (event) => {
4
+ const options = useRuntimeConfig().llms;
6
5
  const llms = JSON.parse(JSON.stringify(options));
7
- await useNitroApp().hooks.callHook("llms:generate", event, llms);
6
+ await useServerHooks().callHook("llms:generate", event, llms);
8
7
  await llmsHooks.callHook("generate", event, llms);
9
- const document = [
10
- `# ${llms.title || "Documentation"}`
11
- ];
8
+ const document = [`# ${llms.title || "Documentation"}`];
12
9
  if (llms.description) {
13
10
  document.push(`> ${llms.description}`);
14
11
  }
@@ -24,11 +21,8 @@ export default eventHandler(async (event) => {
24
21
  );
25
22
  }
26
23
  if (options.notes && options.notes.length) {
27
- document.push(
28
- "## Notes",
29
- (options.notes || []).map((note) => `- ${note}`).join("\n")
30
- );
24
+ document.push("## Notes", (options.notes || []).map((note) => `- ${note}`).join("\n"));
31
25
  }
32
- setHeader(event, "Content-Type", "text/plain; charset=utf-8");
26
+ event.res.headers.set("Content-Type", "text/plain; charset=utf-8");
33
27
  return document.join("\n\n");
34
28
  });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string>>;
2
+ export default _default;
@@ -0,0 +1,29 @@
1
+ import { eventHandler, setHeader } from "h3";
2
+ import { llmsHooks } from "nuxt-llms/runtime";
3
+ import { useRuntimeConfig, useNitroApp } from "nitropack/runtime";
4
+ export default eventHandler(async (event) => {
5
+ const options = useRuntimeConfig(event).llms;
6
+ const llms = JSON.parse(JSON.stringify(options));
7
+ await useNitroApp().hooks.callHook("llms:generate", event, llms);
8
+ await llmsHooks.callHook("generate", event, llms);
9
+ const document = [`# ${llms.title || "Documentation"}`];
10
+ if (llms.description) {
11
+ document.push(`> ${llms.description}`);
12
+ }
13
+ for (const section of llms.sections) {
14
+ document.push(`## ${section.title}`);
15
+ if (section.description) {
16
+ document.push(section.description);
17
+ }
18
+ document.push(
19
+ section.links?.map((link) => {
20
+ return link.description ? `- [${link.title}](${link.href}): ${link.description}` : `- [${link.title}](${link.href})`;
21
+ }).join("\n") || ""
22
+ );
23
+ }
24
+ if (options.notes && options.notes.length) {
25
+ document.push("## Notes", (options.notes || []).map((note) => `- ${note}`).join("\n"));
26
+ }
27
+ setHeader(event, "Content-Type", "text/plain; charset=utf-8");
28
+ return document.join("\n\n");
29
+ });
@@ -1,26 +1,13 @@
1
- import type { H3Event } from 'h3';
2
- import type { NitroRuntimeHooks } from 'nitropack/types';
1
+ import type { RequestEvent } from 'nuxt/server';
3
2
  import type { ModuleOptions } from 'nuxt-llms';
4
3
  /**
5
- * @deprecated Custom hooks are deprecated in favor of NitroRuntimeHooks.
4
+ * @deprecated Custom hooks are deprecated in favor of NuxtServerHooks.
6
5
  */
7
6
  export interface LLMSHooks {
8
- 'generate': (event: H3Event, options: ModuleOptions) => void;
9
- 'generate:full': (event: H3Event, options: ModuleOptions, contents: string[]) => void;
7
+ generate: (event: RequestEvent, options: ModuleOptions) => void;
8
+ 'generate:full': (event: RequestEvent, options: ModuleOptions, contents: string[]) => void;
10
9
  }
11
10
  /**
12
- * @deprecated Custom hooks are deprecated in favor of NitroRuntimeHooks.
11
+ * @deprecated Custom hooks are deprecated in favor of NuxtServerHooks.
13
12
  */
14
13
  export declare const llmsHooks: import("hookable").Hookable<LLMSHooks, import("hookable").HookKeys<LLMSHooks>>;
15
- /**
16
- * Run a callback when LLMs is being generated.
17
- *
18
- * @deprecated Use `useNitroApp().hooks.hook('llms:generate', (event, options) => {})` instead
19
- */
20
- export declare function onLLMsGenerate(cb: NitroRuntimeHooks['llms:generate']): any;
21
- /**
22
- * Run a callback when Full LLMs is being generated.
23
- *
24
- * @deprecated Use `useNitroApp().hooks.hook('llms:generate:full', (event, options, contents) => {})` instead
25
- */
26
- export declare function onLLMsGenerateFull(cb: NitroRuntimeHooks['llms:generate:full']): any;
@@ -1,16 +1,13 @@
1
1
  import { createHooks } from "hookable";
2
- import { useNitroApp } from "#imports";
3
2
  export const llmsHooks = createHooks();
4
3
  llmsHooks.beforeEach(() => {
5
4
  const hooks = Object.values(llmsHooks._hooks || {});
6
- const hasRegisteredHook = hooks.some((hooksList) => Array.isArray(hooksList) && hooksList.length > 0);
5
+ const hasRegisteredHook = hooks.some(
6
+ (hooksList) => Array.isArray(hooksList) && hooksList.length > 0
7
+ );
7
8
  if (hasRegisteredHook) {
8
- console.warn("[nuxt-llms] `llmsHooks` are deprecated and will be removed in future versions. Use `useNitroApp().hooks.hook('llms:generate', (event, options) => {})` instead");
9
+ console.warn(
10
+ "[nuxt-llms] `llmsHooks` are deprecated and will be removed in future versions. Use `useServerHooks().hook('llms:generate', (event, options) => {})` instead"
11
+ );
9
12
  }
10
13
  });
11
- export function onLLMsGenerate(cb) {
12
- return useNitroApp().hooks.hook("llms:generate", cb);
13
- }
14
- export function onLLMsGenerateFull(cb) {
15
- return useNitroApp().hooks.hook("llms:generate:full", cb);
16
- }
@@ -0,0 +1,26 @@
1
+ import type { H3Event } from 'h3';
2
+ import type { NitroRuntimeHooks } from 'nitropack/types';
3
+ import type { ModuleOptions } from 'nuxt-llms';
4
+ /**
5
+ * @deprecated Custom hooks are deprecated in favor of NitroRuntimeHooks.
6
+ */
7
+ export interface LLMSHooks {
8
+ generate: (event: H3Event, options: ModuleOptions) => void;
9
+ 'generate:full': (event: H3Event, options: ModuleOptions, contents: string[]) => void;
10
+ }
11
+ /**
12
+ * @deprecated Custom hooks are deprecated in favor of NitroRuntimeHooks.
13
+ */
14
+ export declare const llmsHooks: import("hookable").Hookable<LLMSHooks, import("hookable").HookKeys<LLMSHooks>>;
15
+ /**
16
+ * Run a callback when LLMs is being generated.
17
+ *
18
+ * @deprecated Use `useNitroApp().hooks.hook('llms:generate', (event, options) => {})` instead
19
+ */
20
+ export declare function onLLMsGenerate(cb: NitroRuntimeHooks['llms:generate']): () => void;
21
+ /**
22
+ * Run a callback when Full LLMs is being generated.
23
+ *
24
+ * @deprecated Use `useNitroApp().hooks.hook('llms:generate:full', (event, options, contents) => {})` instead
25
+ */
26
+ export declare function onLLMsGenerateFull(cb: NitroRuntimeHooks['llms:generate:full']): () => void;
@@ -0,0 +1,20 @@
1
+ import { createHooks } from "hookable";
2
+ import { useNitroApp } from "nitropack/runtime";
3
+ export const llmsHooks = createHooks();
4
+ llmsHooks.beforeEach(() => {
5
+ const hooks = Object.values(llmsHooks._hooks || {});
6
+ const hasRegisteredHook = hooks.some(
7
+ (hooksList) => Array.isArray(hooksList) && hooksList.length > 0
8
+ );
9
+ if (hasRegisteredHook) {
10
+ console.warn(
11
+ "[nuxt-llms] `llmsHooks` are deprecated and will be removed in future versions. Use `useNitroApp().hooks.hook('llms:generate', (event, options) => {})` instead"
12
+ );
13
+ }
14
+ });
15
+ export function onLLMsGenerate(cb) {
16
+ return useNitroApp().hooks.hook("llms:generate", cb);
17
+ }
18
+ export function onLLMsGenerateFull(cb) {
19
+ return useNitroApp().hooks.hook("llms:generate:full", cb);
20
+ }
@@ -1,10 +1,30 @@
1
1
  import type { H3Event } from 'h3';
2
+ /**
3
+ * The request event `nuxt/server` passes to hooks on Nuxt 5. Declared here since
4
+ * `nuxt/schema` only exports `RequestEvent` from Nuxt 4.6.
5
+ */
6
+ export interface LLMsRequestEvent {
7
+ readonly req: Request;
8
+ url: URL;
9
+ readonly res: {
10
+ status?: number;
11
+ statusText?: string;
12
+ readonly headers: Headers;
13
+ };
14
+ readonly context: object;
15
+ }
2
16
  declare module 'nitropack/types' {
3
17
  interface NitroRuntimeHooks {
4
18
  'llms:generate': (event: H3Event, options: ModuleOptions) => void;
5
19
  'llms:generate:full': (event: H3Event, options: ModuleOptions, contents: string[]) => void;
6
20
  }
7
21
  }
22
+ declare module 'nuxt/schema' {
23
+ interface NuxtServerHooks {
24
+ 'llms:generate': (event: LLMsRequestEvent, options: ModuleOptions) => void;
25
+ 'llms:generate:full': (event: LLMsRequestEvent, options: ModuleOptions, contents: string[]) => void;
26
+ }
27
+ }
8
28
  export interface LLMsSection {
9
29
  title: string;
10
30
  description?: string;
@@ -30,4 +50,10 @@ export interface ModuleOptions {
30
50
  title?: string;
31
51
  description?: string;
32
52
  notes?: string[];
53
+ /**
54
+ * Prerender `/llms.txt` and `/llms-full.txt` at build time.
55
+ * Disable to serve them dynamically, for example with ISR.
56
+ * @default true
57
+ */
58
+ prerender?: boolean;
33
59
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxt-llms",
3
- "version": "0.1.4",
3
+ "version": "0.3.0",
4
4
  "description": "Generate llms.txt documentation for your Nuxt application",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,8 +36,10 @@
36
36
  "dev": "nuxi dev playground",
37
37
  "dev:build": "nuxi build playground",
38
38
  "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
39
- "release": "npm run lint && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
40
- "lint": "eslint .",
39
+ "release": "npm run lint && npm run test && npm run prepack && release-it",
40
+ "lint:fix": "oxlint --fix && oxfmt src test playground",
41
+ "lint": "oxlint && oxfmt --check src test playground",
42
+ "format": "oxlint --fix && oxfmt src test playground",
41
43
  "typecheck": "nuxi typecheck",
42
44
  "test": "vitest run",
43
45
  "test:watch": "vitest watch",
@@ -45,23 +47,32 @@
45
47
  "verify": "npm run dev:prepare && npm run prepack && npm run lint && npm run test && npm run typecheck"
46
48
  },
47
49
  "dependencies": {
48
- "@nuxt/kit": "^4.2.2"
50
+ "@nuxt/kit": "^4.6.2"
49
51
  },
50
52
  "devDependencies": {
51
- "@nuxt/content": "^3.10.0",
52
- "@nuxt/devtools": "^3.1.1",
53
- "@nuxt/eslint-config": "^1.12.1",
54
- "@nuxt/module-builder": "^1.0.2",
55
- "@nuxt/schema": "^4.2.2",
56
- "@nuxt/test-utils": "^3.23.0",
57
- "@types/node": "^25.0.7",
58
- "changelogen": "^0.6.2",
59
- "eslint": "^9.39.2",
60
- "nuxt": "^4.2.2",
53
+ "@nuxt/content": "^3.16.2",
54
+ "@nuxt/devtools": "^3.4.4",
55
+ "@nuxt/module-builder": "^1.0.3",
56
+ "@nuxt/schema": "^4.6.2",
57
+ "@nuxt/test-utils": "^4.3.4",
58
+ "@types/node": "^26.6.5",
59
+ "nuxt": "^4.6.2",
61
60
  "nuxt-llms": "link:",
62
- "typescript": "~5.9.3",
63
- "vitest": "^4.0.17",
64
- "vue-tsc": "^3.2.2"
61
+ "oxfmt": "^0.74.0",
62
+ "oxlint": "^1.89.0",
63
+ "release-it": "^21.1.1",
64
+ "typescript": "~6.0.3",
65
+ "vitest": "^5.0.5",
66
+ "vue-tsc": "^3.3.13"
65
67
  },
66
- "packageManager": "pnpm@10.28.0"
68
+ "release-it": {
69
+ "git": {
70
+ "commitMessage": "chore(release): release v${version}"
71
+ },
72
+ "github": {
73
+ "release": true,
74
+ "releaseName": "v${version}"
75
+ }
76
+ },
77
+ "packageManager": "pnpm@12.14.0"
67
78
  }