@silicajs/next 0.1.2 → 0.1.3

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.
@@ -6,7 +6,14 @@ declare function GET(request: Request): Promise<NextResponse<{
6
6
  results: {
7
7
  slug: string;
8
8
  title: string;
9
- excerpt: string;
9
+ titleParts: {
10
+ text: string;
11
+ highlighted: boolean;
12
+ }[];
13
+ excerptParts: {
14
+ text: string;
15
+ highlighted: boolean;
16
+ }[];
10
17
  }[];
11
18
  }>>;
12
19
  declare function parseTagQuery(query: string): {
@@ -1,6 +1,10 @@
1
1
  import path from "node:path";
2
2
  import { NextResponse } from "next/server";
3
- import { loadSearchIndex, querySearchIndex } from "@silicajs/search";
3
+ import {
4
+ loadSearchIndex,
5
+ querySearchIndex,
6
+ SEARCH_DATABASE_FILENAME
7
+ } from "@silicajs/search";
4
8
  import { getSilicaRoot } from "../server-data.js";
5
9
  const MAX_QUERY_LENGTH = 120;
6
10
  const MAX_TAGS = 10;
@@ -14,14 +18,15 @@ async function GET(request) {
14
18
  const parsed = parseTagQuery(query);
15
19
  const tags = [...url.searchParams.getAll("tag"), ...parsed.tags].slice(0, MAX_TAGS).map((tag) => tag.trim()).filter((tag) => tag.length > 0 && tag.length <= MAX_TAG_LENGTH);
16
20
  const loaded = await loadSearchIndex(
17
- path.join(getSilicaRoot(), "search-index.json")
21
+ path.join(getSilicaRoot(), SEARCH_DATABASE_FILENAME)
18
22
  );
19
23
  const results = querySearchIndex(loaded, parsed.query, { tags, limit: 10 });
20
24
  return NextResponse.json({
21
- results: results.map(({ slug, title, excerpt }) => ({
25
+ results: results.map(({ slug, title, titleParts, excerptParts }) => ({
22
26
  slug,
23
27
  title,
24
- excerpt
28
+ titleParts,
29
+ excerptParts
25
30
  }))
26
31
  });
27
32
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/api-search.ts"],"sourcesContent":["import path from \"node:path\";\nimport { NextResponse } from \"next/server\";\nimport { loadSearchIndex, querySearchIndex } from \"@silicajs/search\";\nimport { getSilicaRoot } from \"../server-data.js\";\n\nconst MAX_QUERY_LENGTH = 120;\nconst MAX_TAGS = 10;\nconst MAX_TAG_LENGTH = 64;\n\nexport async function GET(request: Request) {\n const url = new URL(request.url);\n const query = url.searchParams.get(\"q\") ?? \"\";\n if (query.length > MAX_QUERY_LENGTH) {\n return NextResponse.json({ error: \"Query is too long\" }, { status: 400 });\n }\n\n const parsed = parseTagQuery(query);\n const tags = [...url.searchParams.getAll(\"tag\"), ...parsed.tags]\n .slice(0, MAX_TAGS)\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0 && tag.length <= MAX_TAG_LENGTH);\n const loaded = await loadSearchIndex(\n path.join(getSilicaRoot(), \"search-index.json\"),\n );\n const results = querySearchIndex(loaded, parsed.query, { tags, limit: 10 });\n return NextResponse.json({\n results: results.map(({ slug, title, excerpt }) => ({\n slug,\n title,\n excerpt,\n })),\n });\n}\n\nexport function parseTagQuery(query: string): {\n query: string;\n tags: string[];\n} {\n const tags: string[] = [];\n const withoutOperators = query.replace(\n /(?:^|\\s)tag:(#?\\S+)/gi,\n (_match, tag: string) => {\n tags.push(tag);\n return \" \";\n },\n );\n const withoutShortcuts = withoutOperators.replace(\n /(?:^|\\s)(#\\S+)/g,\n (_match, tag: string) => {\n tags.push(tag);\n return \" \";\n },\n );\n\n return {\n query: withoutShortcuts.replace(/\\s+/g, \" \").trim(),\n tags,\n };\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB,wBAAwB;AAClD,SAAS,qBAAqB;AAE9B,MAAM,mBAAmB;AACzB,MAAM,WAAW;AACjB,MAAM,iBAAiB;AAEvB,eAAsB,IAAI,SAAkB;AAC1C,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,QAAQ,IAAI,aAAa,IAAI,GAAG,KAAK;AAC3C,MAAI,MAAM,SAAS,kBAAkB;AACnC,WAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC1E;AAEA,QAAM,SAAS,cAAc,KAAK;AAClC,QAAM,OAAO,CAAC,GAAG,IAAI,aAAa,OAAO,KAAK,GAAG,GAAG,OAAO,IAAI,EAC5D,MAAM,GAAG,QAAQ,EACjB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,UAAU,cAAc;AACjE,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK,KAAK,cAAc,GAAG,mBAAmB;AAAA,EAChD;AACA,QAAM,UAAU,iBAAiB,QAAQ,OAAO,OAAO,EAAE,MAAM,OAAO,GAAG,CAAC;AAC1E,SAAO,aAAa,KAAK;AAAA,IACvB,SAAS,QAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,QAAQ,OAAO;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AACH;AAEO,SAAS,cAAc,OAG5B;AACA,QAAM,OAAiB,CAAC;AACxB,QAAM,mBAAmB,MAAM;AAAA,IAC7B;AAAA,IACA,CAAC,QAAQ,QAAgB;AACvB,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,mBAAmB,iBAAiB;AAAA,IACxC;AAAA,IACA,CAAC,QAAQ,QAAgB;AACvB,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,iBAAiB,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/routes/api-search.ts"],"sourcesContent":["import path from \"node:path\";\nimport { NextResponse } from \"next/server\";\nimport {\n loadSearchIndex,\n querySearchIndex,\n SEARCH_DATABASE_FILENAME,\n} from \"@silicajs/search\";\nimport { getSilicaRoot } from \"../server-data.js\";\n\nconst MAX_QUERY_LENGTH = 120;\nconst MAX_TAGS = 10;\nconst MAX_TAG_LENGTH = 64;\n\nexport async function GET(request: Request) {\n const url = new URL(request.url);\n const query = url.searchParams.get(\"q\") ?? \"\";\n if (query.length > MAX_QUERY_LENGTH) {\n return NextResponse.json({ error: \"Query is too long\" }, { status: 400 });\n }\n\n const parsed = parseTagQuery(query);\n const tags = [...url.searchParams.getAll(\"tag\"), ...parsed.tags]\n .slice(0, MAX_TAGS)\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0 && tag.length <= MAX_TAG_LENGTH);\n const loaded = await loadSearchIndex(\n path.join(getSilicaRoot(), SEARCH_DATABASE_FILENAME),\n );\n const results = querySearchIndex(loaded, parsed.query, { tags, limit: 10 });\n return NextResponse.json({\n results: results.map(({ slug, title, titleParts, excerptParts }) => ({\n slug,\n title,\n titleParts,\n excerptParts,\n })),\n });\n}\n\nexport function parseTagQuery(query: string): {\n query: string;\n tags: string[];\n} {\n const tags: string[] = [];\n const withoutOperators = query.replace(\n /(?:^|\\s)tag:(#?\\S+)/gi,\n (_match, tag: string) => {\n tags.push(tag);\n return \" \";\n },\n );\n const withoutShortcuts = withoutOperators.replace(\n /(?:^|\\s)(#\\S+)/g,\n (_match, tag: string) => {\n tags.push(tag);\n return \" \";\n },\n );\n\n return {\n query: withoutShortcuts.replace(/\\s+/g, \" \").trim(),\n tags,\n };\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAE9B,MAAM,mBAAmB;AACzB,MAAM,WAAW;AACjB,MAAM,iBAAiB;AAEvB,eAAsB,IAAI,SAAkB;AAC1C,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,QAAQ,IAAI,aAAa,IAAI,GAAG,KAAK;AAC3C,MAAI,MAAM,SAAS,kBAAkB;AACnC,WAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC1E;AAEA,QAAM,SAAS,cAAc,KAAK;AAClC,QAAM,OAAO,CAAC,GAAG,IAAI,aAAa,OAAO,KAAK,GAAG,GAAG,OAAO,IAAI,EAC5D,MAAM,GAAG,QAAQ,EACjB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,UAAU,cAAc;AACjE,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK,KAAK,cAAc,GAAG,wBAAwB;AAAA,EACrD;AACA,QAAM,UAAU,iBAAiB,QAAQ,OAAO,OAAO,EAAE,MAAM,OAAO,GAAG,CAAC;AAC1E,SAAO,aAAa,KAAK;AAAA,IACvB,SAAS,QAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,YAAY,aAAa,OAAO;AAAA,MACnE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AACH;AAEO,SAAS,cAAc,OAG5B;AACA,QAAM,OAAiB,CAAC;AACxB,QAAM,mBAAmB,MAAM;AAAA,IAC7B;AAAA,IACA,CAAC,QAAQ,QAAgB;AACvB,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,mBAAmB,iBAAiB;AAAA,IACxC;AAAA,IACA,CAAC,QAAQ,QAAgB;AACvB,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,iBAAiB,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
@@ -12,14 +12,14 @@ const nextConfig: NextConfig = {
12
12
  "@silicajs/ui",
13
13
  "@silicajs/theme-amethyst",
14
14
  ],
15
- serverExternalPackages: ["flexsearch"],
15
+ serverExternalPackages: ["better-sqlite3"],
16
16
  outputFileTracingIncludes: {
17
17
  "/*": [
18
18
  "../content/**/*",
19
19
  "../manifest.json",
20
20
  "../graph.json",
21
21
  "../config.json",
22
- "../search-index.json",
22
+ "../search.db",
23
23
  "../build-id.txt",
24
24
  ],
25
25
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicajs/next",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Next.js runtime, routes, templates, and proxy for Silica.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -84,10 +84,10 @@
84
84
  },
85
85
  "dependencies": {
86
86
  "@silicajs/auth": "^0.1.1",
87
- "@silicajs/components": "^0.1.2",
88
- "@silicajs/core": "^0.1.1",
87
+ "@silicajs/components": "^0.1.3",
88
+ "@silicajs/core": "^0.1.2",
89
89
  "@silicajs/remark-obsidian": "^0.1.0",
90
- "@silicajs/search": "^0.1.0",
90
+ "@silicajs/search": "^0.2.0",
91
91
  "better-auth": "1.6.11",
92
92
  "katex": "^0.17.0"
93
93
  },