nuxt-ai-ready 0.6.0 → 0.6.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.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "nuxt": ">=4.0.0"
5
5
  },
6
6
  "configKey": "aiReady",
7
- "version": "0.6.0",
7
+ "version": "0.6.1",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
@@ -1,7 +1,7 @@
1
1
  export async function exportDump(db) {
2
2
  return db.all(`
3
3
  SELECT route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error
4
- FROM pages
4
+ FROM ai_ready_pages
5
5
  `);
6
6
  }
7
7
  export async function compressDump(data) {
@@ -22,7 +22,7 @@ export async function decompressDump(base64) {
22
22
  export async function importDump(db, rows) {
23
23
  for (const row of rows) {
24
24
  await db.exec(`
25
- INSERT OR REPLACE INTO pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
25
+ INSERT OR REPLACE INTO ai_ready_pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
26
26
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
27
27
  `, [row.route, row.route_key, row.title, row.description, row.markdown, row.headings, row.keywords, row.updated_at, row.indexed_at, row.is_error]);
28
28
  }
@@ -12,15 +12,15 @@ function rowToEntry(row) {
12
12
  };
13
13
  }
14
14
  export async function getAllPages(db) {
15
- const rows = await db.all("SELECT * FROM pages WHERE is_error = 0");
15
+ const rows = await db.all("SELECT * FROM ai_ready_pages WHERE is_error = 0");
16
16
  return rows.map(rowToEntry);
17
17
  }
18
18
  export async function getPage(db, route) {
19
- const row = await db.first("SELECT * FROM pages WHERE route = ?", [route]);
19
+ const row = await db.first("SELECT * FROM ai_ready_pages WHERE route = ?", [route]);
20
20
  return row ? rowToEntry(row) : void 0;
21
21
  }
22
22
  export async function getPageWithMarkdown(db, route) {
23
- const row = await db.first("SELECT * FROM pages WHERE route = ?", [route]);
23
+ const row = await db.first("SELECT * FROM ai_ready_pages WHERE route = ?", [route]);
24
24
  return row ? { ...rowToEntry(row), markdown: row.markdown } : void 0;
25
25
  }
26
26
  export async function searchPages(db, query, opts = {}) {
@@ -29,10 +29,10 @@ export async function searchPages(db, query, opts = {}) {
29
29
  if (!sanitized) return [];
30
30
  const terms = sanitized.split(/\s+/).map((t) => `${t}*`).join(" ");
31
31
  return db.all(`
32
- SELECT p.route, p.title, p.description, bm25(pages_fts, 5.0, 3.0, 1.0, 0.5, 2.0, 2.0) as score
33
- FROM pages_fts
34
- JOIN pages p ON pages_fts.rowid = p.id
35
- WHERE pages_fts MATCH ?
32
+ SELECT p.route, p.title, p.description, bm25(ai_ready_pages_fts, 5.0, 3.0, 1.0, 0.5, 2.0, 2.0) as score
33
+ FROM ai_ready_pages_fts
34
+ JOIN ai_ready_pages p ON ai_ready_pages_fts.rowid = p.id
35
+ WHERE ai_ready_pages_fts MATCH ?
36
36
  ORDER BY score
37
37
  LIMIT ?
38
38
  `, [terms, limit]);
@@ -42,7 +42,7 @@ export async function upsertPage(db, page) {
42
42
  const keywordsJson = JSON.stringify(page.keywords);
43
43
  const indexedAt = Date.now();
44
44
  await db.exec(`
45
- INSERT INTO pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
45
+ INSERT INTO ai_ready_pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
46
46
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
47
47
  ON CONFLICT(route) DO UPDATE SET
48
48
  title = excluded.title,
@@ -56,21 +56,21 @@ export async function upsertPage(db, page) {
56
56
  `, [page.route, routeKey, page.title, page.description, page.markdown, page.headings, keywordsJson, page.updatedAt, indexedAt, page.isError ? 1 : 0]);
57
57
  }
58
58
  export async function getErrorRoutes(db) {
59
- const rows = await db.all("SELECT route FROM pages WHERE is_error = 1");
59
+ const rows = await db.all("SELECT route FROM ai_ready_pages WHERE is_error = 1");
60
60
  return rows.map((r) => r.route);
61
61
  }
62
62
  export async function isPageFresh(db, route, ttlSeconds) {
63
63
  if (ttlSeconds <= 0) return false;
64
- const row = await db.first("SELECT indexed_at FROM pages WHERE route = ?", [route]);
64
+ const row = await db.first("SELECT indexed_at FROM ai_ready_pages WHERE route = ?", [route]);
65
65
  if (!row) return false;
66
66
  const age = (Date.now() - row.indexed_at) / 1e3;
67
67
  return age < ttlSeconds;
68
68
  }
69
69
  export async function deletePage(db, route) {
70
- await db.exec("DELETE FROM pages WHERE route = ?", [route]);
70
+ await db.exec("DELETE FROM ai_ready_pages WHERE route = ?", [route]);
71
71
  }
72
72
  export async function getPageCount(db) {
73
- const row = await db.first("SELECT COUNT(*) as count FROM pages WHERE is_error = 0");
73
+ const row = await db.first("SELECT COUNT(*) as count FROM ai_ready_pages WHERE is_error = 0");
74
74
  return row?.count || 0;
75
75
  }
76
76
  export async function hasPages(db) {
@@ -1,5 +1,5 @@
1
- export declare const SCHEMA_VERSION = "v1.0.0";
2
- export declare const createTablesSQL = "\nCREATE TABLE IF NOT EXISTS pages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n route TEXT UNIQUE NOT NULL,\n route_key TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n description TEXT NOT NULL DEFAULT '',\n markdown TEXT NOT NULL DEFAULT '',\n headings TEXT NOT NULL DEFAULT '[]',\n keywords TEXT NOT NULL DEFAULT '[]',\n updated_at TEXT NOT NULL,\n indexed_at INTEGER NOT NULL,\n is_error INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS idx_pages_route ON pages(route);\nCREATE INDEX IF NOT EXISTS idx_pages_is_error ON pages(is_error);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5(\n route, title, description, markdown, headings, keywords,\n content=pages, content_rowid=id\n);\n\nCREATE TRIGGER IF NOT EXISTS pages_ai AFTER INSERT ON pages BEGIN\n INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS pages_ad AFTER DELETE ON pages BEGIN\n INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS pages_au AFTER UPDATE ON pages BEGIN\n INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\n INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TABLE IF NOT EXISTS _ai_ready_info (\n id TEXT PRIMARY KEY,\n version TEXT,\n checksum TEXT,\n ready INTEGER DEFAULT 0\n);\n";
1
+ export declare const SCHEMA_VERSION = "v1.1.0";
2
+ export declare const createTablesSQL = "\nCREATE TABLE IF NOT EXISTS ai_ready_pages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n route TEXT UNIQUE NOT NULL,\n route_key TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n description TEXT NOT NULL DEFAULT '',\n markdown TEXT NOT NULL DEFAULT '',\n headings TEXT NOT NULL DEFAULT '[]',\n keywords TEXT NOT NULL DEFAULT '[]',\n updated_at TEXT NOT NULL,\n indexed_at INTEGER NOT NULL,\n is_error INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route);\nCREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(\n route, title, description, markdown, headings, keywords,\n content=ai_ready_pages, content_rowid=id\n);\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\n INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TABLE IF NOT EXISTS _ai_ready_info (\n id TEXT PRIMARY KEY,\n version TEXT,\n checksum TEXT,\n ready INTEGER DEFAULT 0\n);\n";
3
3
  export interface DatabaseAdapter {
4
4
  all: <T>(sql: string, params?: unknown[]) => Promise<T[]>;
5
5
  first: <T>(sql: string, params?: unknown[]) => Promise<T | undefined>;
@@ -1,11 +1,14 @@
1
- export const SCHEMA_VERSION = "v1.0.0";
1
+ export const SCHEMA_VERSION = "v1.1.0";
2
2
  const DROP_TABLES_SQL = [
3
+ "DROP TABLE IF EXISTS ai_ready_pages_fts",
4
+ "DROP TABLE IF EXISTS ai_ready_pages",
5
+ "DROP TABLE IF EXISTS _ai_ready_info",
6
+ // Legacy unprefixed tables (migration from v1.0.0)
3
7
  "DROP TABLE IF EXISTS pages_fts",
4
- "DROP TABLE IF EXISTS pages",
5
- "DROP TABLE IF EXISTS _ai_ready_info"
8
+ "DROP TABLE IF EXISTS pages"
6
9
  ];
7
10
  export const createTablesSQL = `
8
- CREATE TABLE IF NOT EXISTS pages (
11
+ CREATE TABLE IF NOT EXISTS ai_ready_pages (
9
12
  id INTEGER PRIMARY KEY AUTOINCREMENT,
10
13
  route TEXT UNIQUE NOT NULL,
11
14
  route_key TEXT UNIQUE NOT NULL,
@@ -19,28 +22,28 @@ CREATE TABLE IF NOT EXISTS pages (
19
22
  is_error INTEGER NOT NULL DEFAULT 0
20
23
  );
21
24
 
22
- CREATE INDEX IF NOT EXISTS idx_pages_route ON pages(route);
23
- CREATE INDEX IF NOT EXISTS idx_pages_is_error ON pages(is_error);
25
+ CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route);
26
+ CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error);
24
27
 
25
- CREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5(
28
+ CREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(
26
29
  route, title, description, markdown, headings, keywords,
27
- content=pages, content_rowid=id
30
+ content=ai_ready_pages, content_rowid=id
28
31
  );
29
32
 
30
- CREATE TRIGGER IF NOT EXISTS pages_ai AFTER INSERT ON pages BEGIN
31
- INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)
33
+ CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN
34
+ INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
32
35
  VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
33
36
  END;
34
37
 
35
- CREATE TRIGGER IF NOT EXISTS pages_ad AFTER DELETE ON pages BEGIN
36
- INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)
38
+ CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN
39
+ INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
37
40
  VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
38
41
  END;
39
42
 
40
- CREATE TRIGGER IF NOT EXISTS pages_au AFTER UPDATE ON pages BEGIN
41
- INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)
43
+ CREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN
44
+ INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
42
45
  VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
43
- INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)
46
+ INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
44
47
  VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
45
48
  END;
46
49
 
@@ -60,7 +63,7 @@ export async function initSchema(db) {
60
63
  }
61
64
  const statements = [
62
65
  // Main table
63
- `CREATE TABLE IF NOT EXISTS pages (
66
+ `CREATE TABLE IF NOT EXISTS ai_ready_pages (
64
67
  id INTEGER PRIMARY KEY AUTOINCREMENT,
65
68
  route TEXT UNIQUE NOT NULL,
66
69
  route_key TEXT UNIQUE NOT NULL,
@@ -74,26 +77,26 @@ export async function initSchema(db) {
74
77
  is_error INTEGER NOT NULL DEFAULT 0
75
78
  )`,
76
79
  // Indexes
77
- `CREATE INDEX IF NOT EXISTS idx_pages_route ON pages(route)`,
78
- `CREATE INDEX IF NOT EXISTS idx_pages_is_error ON pages(is_error)`,
80
+ `CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route)`,
81
+ `CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error)`,
79
82
  // FTS5 virtual table
80
- `CREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5(
83
+ `CREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(
81
84
  route, title, description, markdown, headings, keywords,
82
- content=pages, content_rowid=id
85
+ content=ai_ready_pages, content_rowid=id
83
86
  )`,
84
87
  // Triggers for FTS sync
85
- `CREATE TRIGGER IF NOT EXISTS pages_ai AFTER INSERT ON pages BEGIN
86
- INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)
88
+ `CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN
89
+ INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
87
90
  VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
88
91
  END`,
89
- `CREATE TRIGGER IF NOT EXISTS pages_ad AFTER DELETE ON pages BEGIN
90
- INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)
92
+ `CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN
93
+ INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
91
94
  VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
92
95
  END`,
93
- `CREATE TRIGGER IF NOT EXISTS pages_au AFTER UPDATE ON pages BEGIN
94
- INSERT INTO pages_fts(pages_fts, rowid, route, title, description, markdown, headings, keywords)
96
+ `CREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN
97
+ INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
95
98
  VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
96
- INSERT INTO pages_fts(rowid, route, title, description, markdown, headings, keywords)
99
+ INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
97
100
  VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
98
101
  END`,
99
102
  // Info table
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-ai-ready",
3
3
  "type": "module",
4
- "version": "0.6.0",
4
+ "version": "0.6.1",
5
5
  "description": "Best practice AI & LLM discoverability for Nuxt sites.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",