@peam-ai/next 0.1.6 → 0.1.8

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/index.d.mts CHANGED
@@ -1,24 +1,19 @@
1
1
  import { NextConfig } from 'next';
2
- import { SearchExporterConfig } from 'peam/search';
2
+ import { SearchStoreConfig } from 'peam/search';
3
3
 
4
4
  interface PeamConfig {
5
5
  /**
6
- * Search exporter configuration
6
+ * Search store configuration
7
7
  * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }
8
8
  */
9
- searchExporter?: SearchExporterConfig;
9
+ searchStore?: SearchStoreConfig;
10
10
  /**
11
- * Whether to respect robots.txt rules when indexing pages
12
- * @default true
13
- */
14
- respectRobotsTxt?: boolean;
15
- /**
16
- * Path to a custom robots.txt file relative to the project root
17
- * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations
11
+ * Path to a custom robots.txt file or false to disable robots.txt filtering
12
+ * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations
18
13
  * @example 'custom/robots.txt' or 'config/production-robots.txt'
19
14
  * @default undefined
20
15
  */
21
- robotsTxtPath?: string;
16
+ robotsTxt?: string | boolean;
22
17
  /**
23
18
  * Array of wildcard patterns to exclude from indexing
24
19
  * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)
package/dist/index.d.ts CHANGED
@@ -1,24 +1,19 @@
1
1
  import { NextConfig } from 'next';
2
- import { SearchExporterConfig } from 'peam/search';
2
+ import { SearchStoreConfig } from 'peam/search';
3
3
 
4
4
  interface PeamConfig {
5
5
  /**
6
- * Search exporter configuration
6
+ * Search store configuration
7
7
  * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }
8
8
  */
9
- searchExporter?: SearchExporterConfig;
9
+ searchStore?: SearchStoreConfig;
10
10
  /**
11
- * Whether to respect robots.txt rules when indexing pages
12
- * @default true
13
- */
14
- respectRobotsTxt?: boolean;
15
- /**
16
- * Path to a custom robots.txt file relative to the project root
17
- * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations
11
+ * Path to a custom robots.txt file or false to disable robots.txt filtering
12
+ * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations
18
13
  * @example 'custom/robots.txt' or 'config/production-robots.txt'
19
14
  * @default undefined
20
15
  */
21
- robotsTxtPath?: string;
16
+ robotsTxt?: string | boolean;
22
17
  /**
23
18
  * Array of wildcard patterns to exclude from indexing
24
19
  * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)
package/dist/index.js CHANGED
@@ -27,24 +27,20 @@ var path__namespace = /*#__PURE__*/_interopNamespace(path);
27
27
 
28
28
  // src/withPeam.ts
29
29
  var defaultConfig = {
30
- searchExporter: {
30
+ searchStore: {
31
31
  type: "fileBased",
32
32
  config: { indexPath: ".peam/index.json" }
33
33
  },
34
- respectRobotsTxt: true,
35
34
  exclude: []
36
35
  };
37
36
  function setNextConfig(nextConfig, peamConfig) {
38
- var _a, _b, _c, _d, _e, _f;
39
37
  const envVars = {
40
- PEAM_SEARCH_EXPORTER_TYPE: (_b = (_a = peamConfig == null ? void 0 : peamConfig.searchExporter) == null ? void 0 : _a.type) != null ? _b : defaultConfig.searchExporter.type,
41
- PEAM_SEARCH_EXPORTER_CONFIG: (_d = JSON.stringify((_c = peamConfig == null ? void 0 : peamConfig.searchExporter) == null ? void 0 : _c.config)) != null ? _d : JSON.stringify(defaultConfig.searchExporter.config),
42
- PEAM_RESPECT_ROBOTS_TXT: String((_e = peamConfig == null ? void 0 : peamConfig.respectRobotsTxt) != null ? _e : defaultConfig.respectRobotsTxt),
43
- PEAM_EXCLUDE: (_f = JSON.stringify(peamConfig == null ? void 0 : peamConfig.exclude)) != null ? _f : JSON.stringify(defaultConfig.exclude),
44
- PEAM_ROBOTS_TXT_PATH: ""
38
+ PEAM_SEARCH_STORE: JSON.stringify((peamConfig == null ? void 0 : peamConfig.searchStore) ? peamConfig.searchStore : defaultConfig.searchStore),
39
+ PEAM_EXCLUDE: JSON.stringify((peamConfig == null ? void 0 : peamConfig.exclude) ? peamConfig.exclude : defaultConfig.exclude),
40
+ PEAM_ROBOTS_TXT: ""
45
41
  };
46
- if (peamConfig == null ? void 0 : peamConfig.robotsTxtPath) {
47
- envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);
42
+ if ((peamConfig == null ? void 0 : peamConfig.robotsTxt) !== void 0) {
43
+ envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);
48
44
  }
49
45
  Object.assign(process.env, envVars);
50
46
  nextConfig.env = {
@@ -53,24 +49,26 @@ function setNextConfig(nextConfig, peamConfig) {
53
49
  };
54
50
  }
55
51
  var getConfig = () => {
56
- if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {
52
+ if (!process.env.PEAM_SEARCH_STORE) {
57
53
  throw new Error(
58
54
  "Peam configuration not found. Make sure withPeam() is properly configured in your next.config file."
59
55
  );
60
56
  }
61
- const searchExporterConfig = {
62
- type: process.env.PEAM_SEARCH_EXPORTER_TYPE,
63
- config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG)
64
- };
57
+ const searchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);
65
58
  const resolvedConfig = {
66
- searchExporter: searchExporterConfig,
67
- searchIndexExporter: search.createExporterFromConfig(searchExporterConfig),
68
- respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === "true",
69
- robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || void 0,
59
+ searchStore: searchStoreConfig,
60
+ searchIndexStore: search.createStoreFromConfig(searchStoreConfig),
61
+ robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),
70
62
  exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : []
71
63
  };
72
64
  return resolvedConfig;
73
65
  };
66
+ function parseRobotsTxtEnv(value) {
67
+ if (value === void 0 || value === "") return void 0;
68
+ if (value === "false") return false;
69
+ if (value === "true") return true;
70
+ return value;
71
+ }
74
72
 
75
73
  // src/withPeam.ts
76
74
  var require2 = module$1.createRequire(process.cwd() + "/");
@@ -92,20 +90,20 @@ function addStubIndex() {
92
90
  return;
93
91
  }
94
92
  const config = getConfig();
95
- if (((_a = config.searchExporter) == null ? void 0 : _a.type) !== "fileBased") {
93
+ if (((_a = config.searchStore) == null ? void 0 : _a.type) !== "fileBased") {
96
94
  return;
97
95
  }
98
96
  const stubData = { keys: [], data: {} };
99
- (_c = (_b = config.searchIndexExporter).exportSync) == null ? void 0 : _c.call(_b, stubData, { override: false });
97
+ (_c = (_b = config.searchIndexStore).exportSync) == null ? void 0 : _c.call(_b, stubData, { override: false });
100
98
  } catch (error) {
101
99
  log.error("Failed to create stub index:", error);
102
100
  }
103
101
  }
104
102
  function addAdapter(config) {
105
103
  const nextVersion = getNextVersion();
106
- if (!nextVersion || nextVersion.major < 16) {
104
+ if (!nextVersion || nextVersion.major < 15) {
107
105
  log.warn(
108
- "Peam adapter requires Next.js 16 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs."
106
+ "Peam adapter requires Next.js 15 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs."
109
107
  );
110
108
  return config;
111
109
  }
@@ -117,14 +115,16 @@ function addAdapter(config) {
117
115
  }
118
116
  };
119
117
  }
120
- function addOutputFileTracing(nextConfig, peamConfig) {
118
+ function addOutputFileTracing(nextConfig) {
121
119
  var _a, _b, _c, _d;
122
- nextConfig = { ...nextConfig };
123
- if (((_a = peamConfig.searchExporter) == null ? void 0 : _a.type) !== "fileBased") {
120
+ const peamConfig = getConfig();
121
+ if (((_a = peamConfig.searchStore) == null ? void 0 : _a.type) !== "fileBased") {
124
122
  return nextConfig;
125
123
  }
126
- const exporterConfig = peamConfig.searchExporter.config;
127
- const indexDir = path__namespace.dirname(exporterConfig.indexPath);
124
+ nextConfig = { ...nextConfig };
125
+ const storeConfig = peamConfig.searchStore.config;
126
+ const indexPath = (_b = storeConfig.indexPath) != null ? _b : ".peam/index.json";
127
+ const indexDir = path__namespace.dirname(indexPath);
128
128
  const tracingConfig = {
129
129
  "/api/peam": [`./${indexDir}/**/*`]
130
130
  };
@@ -133,37 +133,39 @@ function addOutputFileTracing(nextConfig, peamConfig) {
133
133
  log.warn(
134
134
  "Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config."
135
135
  );
136
- const existingExperimentalTracing = nextConfig.experimental && typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
137
- if (nextConfig.experimental) {
138
- Object.assign(nextConfig.experimental, {
139
- outputFileTracingIncludes: {
140
- ...existingExperimentalTracing || {},
141
- ...tracingConfig
142
- }
143
- });
136
+ const existingExperimentalTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
137
+ if (!nextConfig.experimental) {
138
+ nextConfig.experimental = {};
144
139
  }
145
- const existingRootTracing = (_b = nextConfig.outputFileTracingIncludes) != null ? _b : void 0;
140
+ Object.assign(nextConfig.experimental, {
141
+ outputFileTracingIncludes: {
142
+ ...existingExperimentalTracing || {},
143
+ ...tracingConfig
144
+ }
145
+ });
146
+ const existingRootTracing = (_c = nextConfig.outputFileTracingIncludes) != null ? _c : {};
146
147
  Object.assign(nextConfig, {
147
148
  outputFileTracingIncludes: {
148
- ...existingRootTracing || {},
149
+ ...existingRootTracing,
149
150
  ...tracingConfig
150
151
  }
151
152
  });
152
153
  } else if (nextVersion.major < 15) {
153
- const existingTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? (_c = nextConfig.experimental) == null ? void 0 : _c.outputFileTracingIncludes : void 0;
154
- if (nextConfig.experimental) {
155
- Object.assign(nextConfig.experimental, {
156
- outputFileTracingIncludes: {
157
- ...existingTracing || {},
158
- ...tracingConfig
159
- }
160
- });
154
+ const existingTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
155
+ if (!nextConfig.experimental) {
156
+ nextConfig.experimental = {};
161
157
  }
158
+ Object.assign(nextConfig.experimental, {
159
+ outputFileTracingIncludes: {
160
+ ...existingTracing || {},
161
+ ...tracingConfig
162
+ }
163
+ });
162
164
  } else {
163
- const existingTracing = (_d = nextConfig.outputFileTracingIncludes) != null ? _d : void 0;
165
+ const existingTracing = (_d = nextConfig.outputFileTracingIncludes) != null ? _d : {};
164
166
  Object.assign(nextConfig, {
165
167
  outputFileTracingIncludes: {
166
- ...existingTracing || {},
168
+ ...existingTracing,
167
169
  ...tracingConfig
168
170
  }
169
171
  });
@@ -176,7 +178,7 @@ function withPeam(peamConfig) {
176
178
  addStubIndex();
177
179
  let updatedNextConfig = { ...nextConfig };
178
180
  updatedNextConfig = addAdapter(updatedNextConfig);
179
- updatedNextConfig = addOutputFileTracing(updatedNextConfig, getConfig());
181
+ updatedNextConfig = addOutputFileTracing(updatedNextConfig);
180
182
  return updatedNextConfig;
181
183
  };
182
184
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/withPeam.ts","../src/index.ts"],"names":["createExporterFromConfig","require","createRequire","loggers","path"],"mappings":"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","file":"index.js","sourcesContent":["import { NextConfig } from 'next';\nimport { createExporterFromConfig, type SearchExporterConfig, type SearchIndexExporter } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search exporter configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchExporter?: SearchExporterConfig;\n /**\n * Whether to respect robots.txt rules when indexing pages\n * @default true\n */\n respectRobotsTxt?: boolean;\n /**\n * Path to a custom robots.txt file relative to the project root\n * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxtPath?: string;\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxtPath'>> & {\n robotsTxtPath?: string;\n searchIndexExporter: SearchIndexExporter;\n};\n\nconst defaultConfig = {\n searchExporter: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n respectRobotsTxt: true,\n robotsTxtPath: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_EXPORTER_TYPE: peamConfig?.searchExporter?.type ?? defaultConfig.searchExporter.type,\n PEAM_SEARCH_EXPORTER_CONFIG:\n JSON.stringify(peamConfig?.searchExporter?.config) ?? JSON.stringify(defaultConfig.searchExporter.config),\n PEAM_RESPECT_ROBOTS_TXT: String(peamConfig?.respectRobotsTxt ?? defaultConfig.respectRobotsTxt),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude) ?? JSON.stringify(defaultConfig.exclude),\n PEAM_ROBOTS_TXT_PATH: '',\n };\n\n if (peamConfig?.robotsTxtPath) {\n envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchExporterConfig: SearchExporterConfig = {\n type: process.env.PEAM_SEARCH_EXPORTER_TYPE as SearchExporterConfig['type'],\n config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG),\n };\n\n const resolvedConfig = {\n searchExporter: searchExporterConfig,\n searchIndexExporter: createExporterFromConfig(searchExporterConfig),\n respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === 'true',\n robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || undefined,\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n","import type { NextConfig } from 'next';\nimport { createRequire } from 'node:module';\nimport * as path from 'path';\nimport { loggers } from 'peam/logger';\nimport { getConfig, PeamConfig, setNextConfig } from './config';\n\nconst require = createRequire(process.cwd() + '/');\nconst log = loggers.next;\nconst isProd = process.env.NODE_ENV === 'production';\n\nfunction getNextVersion(): { major: number; minor: number } | undefined {\n try {\n const [major, minor] = require('next/package.json').version.split('.', 2).map(Number);\n\n return { major, minor };\n } catch (error) {\n log.error('Could not resolve Next.js version.', error);\n return undefined;\n }\n}\n\nfunction addStubIndex() {\n try {\n if (!isProd) {\n return;\n }\n\n const config = getConfig();\n\n if (config.searchExporter?.type !== 'fileBased') {\n return;\n }\n\n const stubData = { keys: [], data: {} };\n config.searchIndexExporter.exportSync?.(stubData, { override: false });\n } catch (error) {\n log.error('Failed to create stub index:', error);\n }\n}\n\nfunction addAdapter(config: NextConfig): NextConfig {\n const nextVersion = getNextVersion();\n\n if (!nextVersion || nextVersion.major < 16) {\n log.warn(\n 'Peam adapter requires Next.js 16 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs.'\n );\n return config;\n }\n\n return {\n ...config,\n experimental: {\n ...config.experimental,\n adapterPath: require.resolve(path.join(__dirname, 'peam.adapter.js')),\n },\n };\n}\n\nfunction addOutputFileTracing(nextConfig: NextConfig, peamConfig: PeamConfig): NextConfig {\n nextConfig = { ...nextConfig };\n\n if (peamConfig.searchExporter?.type !== 'fileBased') {\n return nextConfig;\n }\n\n const exporterConfig = peamConfig.searchExporter.config;\n const indexDir = path.dirname(exporterConfig.indexPath);\n const tracingConfig = {\n '/api/peam': [`./${indexDir}/**/*`],\n };\n\n const nextVersion = getNextVersion();\n\n if (!nextVersion) {\n log.warn(\n 'Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config.'\n );\n\n // Add to experimental (for Next.js 14.x)\n const existingExperimentalTracing =\n nextConfig.experimental &&\n typeof nextConfig.experimental === 'object' &&\n 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (nextConfig.experimental) {\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingExperimentalTracing || {}),\n ...tracingConfig,\n },\n });\n }\n\n // Add to root (for Next.js 15+)\n const existingRootTracing = nextConfig.outputFileTracingIncludes ?? undefined;\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...(existingRootTracing || {}),\n ...tracingConfig,\n },\n });\n } else if (nextVersion.major < 15) {\n // For Next.js 14.x, add outputFileTracingIncludes in experimental\n const existingTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental?.outputFileTracingIncludes\n : undefined;\n\n if (nextConfig.experimental) {\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n }\n } else {\n // For Next.js 15+, add outputFileTracingIncludes at root\n const existingTracing = nextConfig.outputFileTracingIncludes ?? undefined;\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n }\n\n return nextConfig;\n}\n\n/**\n * Wraps Next.js config to enable Peam content extraction during build.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import withPeam from '@peam-ai/next';\n *\n * export default withPeam()({\n * // your Next.js config\n * });\n * ```\n *\n * Or with `require()`:\n * ```javascript\n * // next.config.js\n * const withPeam = require('@peam-ai/next');\n *\n * module.exports = withPeam()({\n * // your Next.js config\n * });\n * ```\n */\nexport function withPeam(peamConfig?: PeamConfig) {\n return function (nextConfig: NextConfig = {}): NextConfig {\n setNextConfig(nextConfig, peamConfig);\n addStubIndex();\n\n let updatedNextConfig: NextConfig = { ...nextConfig };\n updatedNextConfig = addAdapter(updatedNextConfig);\n updatedNextConfig = addOutputFileTracing(updatedNextConfig, getConfig());\n\n return updatedNextConfig;\n };\n}\n\nexport default withPeam;\n","import { withPeam } from './withPeam';\nexport default withPeam;\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/withPeam.ts","../src/index.ts"],"names":["createStoreFromConfig","require","createRequire","loggers","path"],"mappings":"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","file":"index.js","sourcesContent":["import { NextConfig } from 'next';\nimport { createStoreFromConfig, type SearchIndexStore, type SearchStoreConfig } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search store configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchStore?: SearchStoreConfig;\n\n /**\n * Path to a custom robots.txt file or false to disable robots.txt filtering\n * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxt?: string | boolean;\n\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxt'>> & {\n robotsTxt?: string | boolean;\n searchIndexStore: SearchIndexStore;\n};\n\nconst defaultConfig = {\n searchStore: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n robotsTxt: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_STORE: JSON.stringify(peamConfig?.searchStore ? peamConfig.searchStore : defaultConfig.searchStore),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude ? peamConfig.exclude : defaultConfig.exclude),\n PEAM_ROBOTS_TXT: '',\n };\n\n if (peamConfig?.robotsTxt !== undefined) {\n envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_STORE) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchStoreConfig: SearchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);\n\n const resolvedConfig = {\n searchStore: searchStoreConfig,\n searchIndexStore: createStoreFromConfig(searchStoreConfig),\n robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n\nfunction parseRobotsTxtEnv(value: string | undefined): string | boolean | undefined {\n if (value === undefined || value === '') return undefined;\n if (value === 'false') return false;\n if (value === 'true') return true;\n return value;\n}\n","import type { NextConfig } from 'next';\nimport { createRequire } from 'node:module';\nimport * as path from 'path';\nimport { loggers } from 'peam/logger';\nimport { getConfig, PeamConfig, setNextConfig } from './config';\n\nconst require = createRequire(process.cwd() + '/');\nconst log = loggers.next;\nconst isProd = process.env.NODE_ENV === 'production';\n\nfunction getNextVersion(): { major: number; minor: number } | undefined {\n try {\n const [major, minor] = require('next/package.json').version.split('.', 2).map(Number);\n\n return { major, minor };\n } catch (error) {\n log.error('Could not resolve Next.js version.', error);\n return undefined;\n }\n}\n\nfunction addStubIndex() {\n try {\n if (!isProd) {\n return;\n }\n\n const config = getConfig();\n\n if (config.searchStore?.type !== 'fileBased') {\n return;\n }\n\n const stubData = { keys: [], data: {} };\n config.searchIndexStore.exportSync?.(stubData, { override: false });\n } catch (error) {\n log.error('Failed to create stub index:', error);\n }\n}\n\nfunction addAdapter(config: NextConfig): NextConfig {\n const nextVersion = getNextVersion();\n\n if (!nextVersion || nextVersion.major < 15) {\n log.warn(\n 'Peam adapter requires Next.js 15 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs.'\n );\n return config;\n }\n\n return {\n ...config,\n experimental: {\n ...config.experimental,\n adapterPath: require.resolve(path.join(__dirname, 'peam.adapter.js')),\n },\n };\n}\n\nfunction addOutputFileTracing(nextConfig: NextConfig): NextConfig {\n const peamConfig = getConfig();\n\n if (peamConfig.searchStore?.type !== 'fileBased') {\n return nextConfig;\n }\n\n nextConfig = { ...nextConfig };\n\n const storeConfig = peamConfig.searchStore.config;\n const indexPath = storeConfig.indexPath ?? '.peam/index.json';\n const indexDir = path.dirname(indexPath);\n const tracingConfig = {\n '/api/peam': [`./${indexDir}/**/*`],\n };\n\n const nextVersion = getNextVersion();\n\n if (!nextVersion) {\n log.warn(\n 'Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config.'\n );\n\n // Add to experimental (for Next.js 14.x)\n const existingExperimentalTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (!nextConfig.experimental) {\n nextConfig.experimental = {};\n }\n\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingExperimentalTracing || {}),\n ...tracingConfig,\n },\n });\n\n // Add to root (for Next.js 15+)\n const existingRootTracing = nextConfig.outputFileTracingIncludes ?? {};\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...existingRootTracing,\n ...tracingConfig,\n },\n });\n } else if (nextVersion.major < 15) {\n // For Next.js 14.x, add outputFileTracingIncludes in experimental\n const existingTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (!nextConfig.experimental) {\n nextConfig.experimental = {};\n }\n\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n } else {\n // For Next.js 15+, add outputFileTracingIncludes at root\n const existingTracing = nextConfig.outputFileTracingIncludes ?? {};\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...existingTracing,\n ...tracingConfig,\n },\n });\n }\n\n return nextConfig;\n}\n\n/**\n * Wraps Next.js config to enable Peam content extraction during build.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import withPeam from '@peam-ai/next';\n *\n * export default withPeam()({\n * // your Next.js config\n * });\n * ```\n *\n * Or with `require()`:\n * ```javascript\n * // next.config.js\n * const withPeam = require('@peam-ai/next');\n *\n * module.exports = withPeam()({\n * // your Next.js config\n * });\n * ```\n */\nexport function withPeam(peamConfig?: PeamConfig) {\n return function (nextConfig: NextConfig = {}): NextConfig {\n setNextConfig(nextConfig, peamConfig);\n addStubIndex();\n\n let updatedNextConfig: NextConfig = { ...nextConfig };\n updatedNextConfig = addAdapter(updatedNextConfig);\n updatedNextConfig = addOutputFileTracing(updatedNextConfig);\n\n return updatedNextConfig;\n };\n}\n\nexport default withPeam;\n","import { withPeam } from './withPeam';\nexport default withPeam;\n"]}
package/dist/index.mjs CHANGED
@@ -1,28 +1,24 @@
1
1
  import { createRequire } from 'module';
2
2
  import * as path from 'path';
3
3
  import { loggers } from 'peam/logger';
4
- import { createExporterFromConfig } from 'peam/search';
4
+ import { createStoreFromConfig } from 'peam/search';
5
5
 
6
6
  // src/withPeam.ts
7
7
  var defaultConfig = {
8
- searchExporter: {
8
+ searchStore: {
9
9
  type: "fileBased",
10
10
  config: { indexPath: ".peam/index.json" }
11
11
  },
12
- respectRobotsTxt: true,
13
12
  exclude: []
14
13
  };
15
14
  function setNextConfig(nextConfig, peamConfig) {
16
- var _a, _b, _c, _d, _e, _f;
17
15
  const envVars = {
18
- PEAM_SEARCH_EXPORTER_TYPE: (_b = (_a = peamConfig == null ? void 0 : peamConfig.searchExporter) == null ? void 0 : _a.type) != null ? _b : defaultConfig.searchExporter.type,
19
- PEAM_SEARCH_EXPORTER_CONFIG: (_d = JSON.stringify((_c = peamConfig == null ? void 0 : peamConfig.searchExporter) == null ? void 0 : _c.config)) != null ? _d : JSON.stringify(defaultConfig.searchExporter.config),
20
- PEAM_RESPECT_ROBOTS_TXT: String((_e = peamConfig == null ? void 0 : peamConfig.respectRobotsTxt) != null ? _e : defaultConfig.respectRobotsTxt),
21
- PEAM_EXCLUDE: (_f = JSON.stringify(peamConfig == null ? void 0 : peamConfig.exclude)) != null ? _f : JSON.stringify(defaultConfig.exclude),
22
- PEAM_ROBOTS_TXT_PATH: ""
16
+ PEAM_SEARCH_STORE: JSON.stringify((peamConfig == null ? void 0 : peamConfig.searchStore) ? peamConfig.searchStore : defaultConfig.searchStore),
17
+ PEAM_EXCLUDE: JSON.stringify((peamConfig == null ? void 0 : peamConfig.exclude) ? peamConfig.exclude : defaultConfig.exclude),
18
+ PEAM_ROBOTS_TXT: ""
23
19
  };
24
- if (peamConfig == null ? void 0 : peamConfig.robotsTxtPath) {
25
- envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);
20
+ if ((peamConfig == null ? void 0 : peamConfig.robotsTxt) !== void 0) {
21
+ envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);
26
22
  }
27
23
  Object.assign(process.env, envVars);
28
24
  nextConfig.env = {
@@ -31,24 +27,26 @@ function setNextConfig(nextConfig, peamConfig) {
31
27
  };
32
28
  }
33
29
  var getConfig = () => {
34
- if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {
30
+ if (!process.env.PEAM_SEARCH_STORE) {
35
31
  throw new Error(
36
32
  "Peam configuration not found. Make sure withPeam() is properly configured in your next.config file."
37
33
  );
38
34
  }
39
- const searchExporterConfig = {
40
- type: process.env.PEAM_SEARCH_EXPORTER_TYPE,
41
- config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG)
42
- };
35
+ const searchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);
43
36
  const resolvedConfig = {
44
- searchExporter: searchExporterConfig,
45
- searchIndexExporter: createExporterFromConfig(searchExporterConfig),
46
- respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === "true",
47
- robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || void 0,
37
+ searchStore: searchStoreConfig,
38
+ searchIndexStore: createStoreFromConfig(searchStoreConfig),
39
+ robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),
48
40
  exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : []
49
41
  };
50
42
  return resolvedConfig;
51
43
  };
44
+ function parseRobotsTxtEnv(value) {
45
+ if (value === void 0 || value === "") return void 0;
46
+ if (value === "false") return false;
47
+ if (value === "true") return true;
48
+ return value;
49
+ }
52
50
 
53
51
  // src/withPeam.ts
54
52
  var require2 = createRequire(process.cwd() + "/");
@@ -70,20 +68,20 @@ function addStubIndex() {
70
68
  return;
71
69
  }
72
70
  const config = getConfig();
73
- if (((_a = config.searchExporter) == null ? void 0 : _a.type) !== "fileBased") {
71
+ if (((_a = config.searchStore) == null ? void 0 : _a.type) !== "fileBased") {
74
72
  return;
75
73
  }
76
74
  const stubData = { keys: [], data: {} };
77
- (_c = (_b = config.searchIndexExporter).exportSync) == null ? void 0 : _c.call(_b, stubData, { override: false });
75
+ (_c = (_b = config.searchIndexStore).exportSync) == null ? void 0 : _c.call(_b, stubData, { override: false });
78
76
  } catch (error) {
79
77
  log.error("Failed to create stub index:", error);
80
78
  }
81
79
  }
82
80
  function addAdapter(config) {
83
81
  const nextVersion = getNextVersion();
84
- if (!nextVersion || nextVersion.major < 16) {
82
+ if (!nextVersion || nextVersion.major < 15) {
85
83
  log.warn(
86
- "Peam adapter requires Next.js 16 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs."
84
+ "Peam adapter requires Next.js 15 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs."
87
85
  );
88
86
  return config;
89
87
  }
@@ -95,14 +93,16 @@ function addAdapter(config) {
95
93
  }
96
94
  };
97
95
  }
98
- function addOutputFileTracing(nextConfig, peamConfig) {
96
+ function addOutputFileTracing(nextConfig) {
99
97
  var _a, _b, _c, _d;
100
- nextConfig = { ...nextConfig };
101
- if (((_a = peamConfig.searchExporter) == null ? void 0 : _a.type) !== "fileBased") {
98
+ const peamConfig = getConfig();
99
+ if (((_a = peamConfig.searchStore) == null ? void 0 : _a.type) !== "fileBased") {
102
100
  return nextConfig;
103
101
  }
104
- const exporterConfig = peamConfig.searchExporter.config;
105
- const indexDir = path.dirname(exporterConfig.indexPath);
102
+ nextConfig = { ...nextConfig };
103
+ const storeConfig = peamConfig.searchStore.config;
104
+ const indexPath = (_b = storeConfig.indexPath) != null ? _b : ".peam/index.json";
105
+ const indexDir = path.dirname(indexPath);
106
106
  const tracingConfig = {
107
107
  "/api/peam": [`./${indexDir}/**/*`]
108
108
  };
@@ -111,37 +111,39 @@ function addOutputFileTracing(nextConfig, peamConfig) {
111
111
  log.warn(
112
112
  "Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config."
113
113
  );
114
- const existingExperimentalTracing = nextConfig.experimental && typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
115
- if (nextConfig.experimental) {
116
- Object.assign(nextConfig.experimental, {
117
- outputFileTracingIncludes: {
118
- ...existingExperimentalTracing || {},
119
- ...tracingConfig
120
- }
121
- });
114
+ const existingExperimentalTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
115
+ if (!nextConfig.experimental) {
116
+ nextConfig.experimental = {};
122
117
  }
123
- const existingRootTracing = (_b = nextConfig.outputFileTracingIncludes) != null ? _b : void 0;
118
+ Object.assign(nextConfig.experimental, {
119
+ outputFileTracingIncludes: {
120
+ ...existingExperimentalTracing || {},
121
+ ...tracingConfig
122
+ }
123
+ });
124
+ const existingRootTracing = (_c = nextConfig.outputFileTracingIncludes) != null ? _c : {};
124
125
  Object.assign(nextConfig, {
125
126
  outputFileTracingIncludes: {
126
- ...existingRootTracing || {},
127
+ ...existingRootTracing,
127
128
  ...tracingConfig
128
129
  }
129
130
  });
130
131
  } else if (nextVersion.major < 15) {
131
- const existingTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? (_c = nextConfig.experimental) == null ? void 0 : _c.outputFileTracingIncludes : void 0;
132
- if (nextConfig.experimental) {
133
- Object.assign(nextConfig.experimental, {
134
- outputFileTracingIncludes: {
135
- ...existingTracing || {},
136
- ...tracingConfig
137
- }
138
- });
132
+ const existingTracing = typeof nextConfig.experimental === "object" && "outputFileTracingIncludes" in nextConfig.experimental ? nextConfig.experimental.outputFileTracingIncludes : void 0;
133
+ if (!nextConfig.experimental) {
134
+ nextConfig.experimental = {};
139
135
  }
136
+ Object.assign(nextConfig.experimental, {
137
+ outputFileTracingIncludes: {
138
+ ...existingTracing || {},
139
+ ...tracingConfig
140
+ }
141
+ });
140
142
  } else {
141
- const existingTracing = (_d = nextConfig.outputFileTracingIncludes) != null ? _d : void 0;
143
+ const existingTracing = (_d = nextConfig.outputFileTracingIncludes) != null ? _d : {};
142
144
  Object.assign(nextConfig, {
143
145
  outputFileTracingIncludes: {
144
- ...existingTracing || {},
146
+ ...existingTracing,
145
147
  ...tracingConfig
146
148
  }
147
149
  });
@@ -154,7 +156,7 @@ function withPeam(peamConfig) {
154
156
  addStubIndex();
155
157
  let updatedNextConfig = { ...nextConfig };
156
158
  updatedNextConfig = addAdapter(updatedNextConfig);
157
- updatedNextConfig = addOutputFileTracing(updatedNextConfig, getConfig());
159
+ updatedNextConfig = addOutputFileTracing(updatedNextConfig);
158
160
  return updatedNextConfig;
159
161
  };
160
162
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/withPeam.ts","../src/index.ts"],"names":["require"],"mappings":"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","file":"index.mjs","sourcesContent":["import { NextConfig } from 'next';\nimport { createExporterFromConfig, type SearchExporterConfig, type SearchIndexExporter } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search exporter configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchExporter?: SearchExporterConfig;\n /**\n * Whether to respect robots.txt rules when indexing pages\n * @default true\n */\n respectRobotsTxt?: boolean;\n /**\n * Path to a custom robots.txt file relative to the project root\n * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxtPath?: string;\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxtPath'>> & {\n robotsTxtPath?: string;\n searchIndexExporter: SearchIndexExporter;\n};\n\nconst defaultConfig = {\n searchExporter: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n respectRobotsTxt: true,\n robotsTxtPath: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_EXPORTER_TYPE: peamConfig?.searchExporter?.type ?? defaultConfig.searchExporter.type,\n PEAM_SEARCH_EXPORTER_CONFIG:\n JSON.stringify(peamConfig?.searchExporter?.config) ?? JSON.stringify(defaultConfig.searchExporter.config),\n PEAM_RESPECT_ROBOTS_TXT: String(peamConfig?.respectRobotsTxt ?? defaultConfig.respectRobotsTxt),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude) ?? JSON.stringify(defaultConfig.exclude),\n PEAM_ROBOTS_TXT_PATH: '',\n };\n\n if (peamConfig?.robotsTxtPath) {\n envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchExporterConfig: SearchExporterConfig = {\n type: process.env.PEAM_SEARCH_EXPORTER_TYPE as SearchExporterConfig['type'],\n config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG),\n };\n\n const resolvedConfig = {\n searchExporter: searchExporterConfig,\n searchIndexExporter: createExporterFromConfig(searchExporterConfig),\n respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === 'true',\n robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || undefined,\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n","import type { NextConfig } from 'next';\nimport { createRequire } from 'node:module';\nimport * as path from 'path';\nimport { loggers } from 'peam/logger';\nimport { getConfig, PeamConfig, setNextConfig } from './config';\n\nconst require = createRequire(process.cwd() + '/');\nconst log = loggers.next;\nconst isProd = process.env.NODE_ENV === 'production';\n\nfunction getNextVersion(): { major: number; minor: number } | undefined {\n try {\n const [major, minor] = require('next/package.json').version.split('.', 2).map(Number);\n\n return { major, minor };\n } catch (error) {\n log.error('Could not resolve Next.js version.', error);\n return undefined;\n }\n}\n\nfunction addStubIndex() {\n try {\n if (!isProd) {\n return;\n }\n\n const config = getConfig();\n\n if (config.searchExporter?.type !== 'fileBased') {\n return;\n }\n\n const stubData = { keys: [], data: {} };\n config.searchIndexExporter.exportSync?.(stubData, { override: false });\n } catch (error) {\n log.error('Failed to create stub index:', error);\n }\n}\n\nfunction addAdapter(config: NextConfig): NextConfig {\n const nextVersion = getNextVersion();\n\n if (!nextVersion || nextVersion.major < 16) {\n log.warn(\n 'Peam adapter requires Next.js 16 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs.'\n );\n return config;\n }\n\n return {\n ...config,\n experimental: {\n ...config.experimental,\n adapterPath: require.resolve(path.join(__dirname, 'peam.adapter.js')),\n },\n };\n}\n\nfunction addOutputFileTracing(nextConfig: NextConfig, peamConfig: PeamConfig): NextConfig {\n nextConfig = { ...nextConfig };\n\n if (peamConfig.searchExporter?.type !== 'fileBased') {\n return nextConfig;\n }\n\n const exporterConfig = peamConfig.searchExporter.config;\n const indexDir = path.dirname(exporterConfig.indexPath);\n const tracingConfig = {\n '/api/peam': [`./${indexDir}/**/*`],\n };\n\n const nextVersion = getNextVersion();\n\n if (!nextVersion) {\n log.warn(\n 'Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config.'\n );\n\n // Add to experimental (for Next.js 14.x)\n const existingExperimentalTracing =\n nextConfig.experimental &&\n typeof nextConfig.experimental === 'object' &&\n 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (nextConfig.experimental) {\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingExperimentalTracing || {}),\n ...tracingConfig,\n },\n });\n }\n\n // Add to root (for Next.js 15+)\n const existingRootTracing = nextConfig.outputFileTracingIncludes ?? undefined;\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...(existingRootTracing || {}),\n ...tracingConfig,\n },\n });\n } else if (nextVersion.major < 15) {\n // For Next.js 14.x, add outputFileTracingIncludes in experimental\n const existingTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental?.outputFileTracingIncludes\n : undefined;\n\n if (nextConfig.experimental) {\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n }\n } else {\n // For Next.js 15+, add outputFileTracingIncludes at root\n const existingTracing = nextConfig.outputFileTracingIncludes ?? undefined;\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n }\n\n return nextConfig;\n}\n\n/**\n * Wraps Next.js config to enable Peam content extraction during build.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import withPeam from '@peam-ai/next';\n *\n * export default withPeam()({\n * // your Next.js config\n * });\n * ```\n *\n * Or with `require()`:\n * ```javascript\n * // next.config.js\n * const withPeam = require('@peam-ai/next');\n *\n * module.exports = withPeam()({\n * // your Next.js config\n * });\n * ```\n */\nexport function withPeam(peamConfig?: PeamConfig) {\n return function (nextConfig: NextConfig = {}): NextConfig {\n setNextConfig(nextConfig, peamConfig);\n addStubIndex();\n\n let updatedNextConfig: NextConfig = { ...nextConfig };\n updatedNextConfig = addAdapter(updatedNextConfig);\n updatedNextConfig = addOutputFileTracing(updatedNextConfig, getConfig());\n\n return updatedNextConfig;\n };\n}\n\nexport default withPeam;\n","import { withPeam } from './withPeam';\nexport default withPeam;\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/withPeam.ts","../src/index.ts"],"names":["require"],"mappings":"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","file":"index.mjs","sourcesContent":["import { NextConfig } from 'next';\nimport { createStoreFromConfig, type SearchIndexStore, type SearchStoreConfig } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search store configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchStore?: SearchStoreConfig;\n\n /**\n * Path to a custom robots.txt file or false to disable robots.txt filtering\n * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxt?: string | boolean;\n\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxt'>> & {\n robotsTxt?: string | boolean;\n searchIndexStore: SearchIndexStore;\n};\n\nconst defaultConfig = {\n searchStore: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n robotsTxt: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_STORE: JSON.stringify(peamConfig?.searchStore ? peamConfig.searchStore : defaultConfig.searchStore),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude ? peamConfig.exclude : defaultConfig.exclude),\n PEAM_ROBOTS_TXT: '',\n };\n\n if (peamConfig?.robotsTxt !== undefined) {\n envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_STORE) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchStoreConfig: SearchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);\n\n const resolvedConfig = {\n searchStore: searchStoreConfig,\n searchIndexStore: createStoreFromConfig(searchStoreConfig),\n robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n\nfunction parseRobotsTxtEnv(value: string | undefined): string | boolean | undefined {\n if (value === undefined || value === '') return undefined;\n if (value === 'false') return false;\n if (value === 'true') return true;\n return value;\n}\n","import type { NextConfig } from 'next';\nimport { createRequire } from 'node:module';\nimport * as path from 'path';\nimport { loggers } from 'peam/logger';\nimport { getConfig, PeamConfig, setNextConfig } from './config';\n\nconst require = createRequire(process.cwd() + '/');\nconst log = loggers.next;\nconst isProd = process.env.NODE_ENV === 'production';\n\nfunction getNextVersion(): { major: number; minor: number } | undefined {\n try {\n const [major, minor] = require('next/package.json').version.split('.', 2).map(Number);\n\n return { major, minor };\n } catch (error) {\n log.error('Could not resolve Next.js version.', error);\n return undefined;\n }\n}\n\nfunction addStubIndex() {\n try {\n if (!isProd) {\n return;\n }\n\n const config = getConfig();\n\n if (config.searchStore?.type !== 'fileBased') {\n return;\n }\n\n const stubData = { keys: [], data: {} };\n config.searchIndexStore.exportSync?.(stubData, { override: false });\n } catch (error) {\n log.error('Failed to create stub index:', error);\n }\n}\n\nfunction addAdapter(config: NextConfig): NextConfig {\n const nextVersion = getNextVersion();\n\n if (!nextVersion || nextVersion.major < 15) {\n log.warn(\n 'Peam adapter requires Next.js 15 or higher, skipping adapter configuration. Make sure the postbuild script is set up correctly, See more here: https://peam.ai/docs.'\n );\n return config;\n }\n\n return {\n ...config,\n experimental: {\n ...config.experimental,\n adapterPath: require.resolve(path.join(__dirname, 'peam.adapter.js')),\n },\n };\n}\n\nfunction addOutputFileTracing(nextConfig: NextConfig): NextConfig {\n const peamConfig = getConfig();\n\n if (peamConfig.searchStore?.type !== 'fileBased') {\n return nextConfig;\n }\n\n nextConfig = { ...nextConfig };\n\n const storeConfig = peamConfig.searchStore.config;\n const indexPath = storeConfig.indexPath ?? '.peam/index.json';\n const indexDir = path.dirname(indexPath);\n const tracingConfig = {\n '/api/peam': [`./${indexDir}/**/*`],\n };\n\n const nextVersion = getNextVersion();\n\n if (!nextVersion) {\n log.warn(\n 'Could not determine Next.js version. Adding outputFileTracingIncludes to both experimental and root config.'\n );\n\n // Add to experimental (for Next.js 14.x)\n const existingExperimentalTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (!nextConfig.experimental) {\n nextConfig.experimental = {};\n }\n\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingExperimentalTracing || {}),\n ...tracingConfig,\n },\n });\n\n // Add to root (for Next.js 15+)\n const existingRootTracing = nextConfig.outputFileTracingIncludes ?? {};\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...existingRootTracing,\n ...tracingConfig,\n },\n });\n } else if (nextVersion.major < 15) {\n // For Next.js 14.x, add outputFileTracingIncludes in experimental\n const existingTracing =\n typeof nextConfig.experimental === 'object' && 'outputFileTracingIncludes' in nextConfig.experimental\n ? nextConfig.experimental.outputFileTracingIncludes\n : undefined;\n\n if (!nextConfig.experimental) {\n nextConfig.experimental = {};\n }\n\n Object.assign(nextConfig.experimental, {\n outputFileTracingIncludes: {\n ...(existingTracing || {}),\n ...tracingConfig,\n },\n });\n } else {\n // For Next.js 15+, add outputFileTracingIncludes at root\n const existingTracing = nextConfig.outputFileTracingIncludes ?? {};\n\n Object.assign(nextConfig, {\n outputFileTracingIncludes: {\n ...existingTracing,\n ...tracingConfig,\n },\n });\n }\n\n return nextConfig;\n}\n\n/**\n * Wraps Next.js config to enable Peam content extraction during build.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import withPeam from '@peam-ai/next';\n *\n * export default withPeam()({\n * // your Next.js config\n * });\n * ```\n *\n * Or with `require()`:\n * ```javascript\n * // next.config.js\n * const withPeam = require('@peam-ai/next');\n *\n * module.exports = withPeam()({\n * // your Next.js config\n * });\n * ```\n */\nexport function withPeam(peamConfig?: PeamConfig) {\n return function (nextConfig: NextConfig = {}): NextConfig {\n setNextConfig(nextConfig, peamConfig);\n addStubIndex();\n\n let updatedNextConfig: NextConfig = { ...nextConfig };\n updatedNextConfig = addAdapter(updatedNextConfig);\n updatedNextConfig = addOutputFileTracing(updatedNextConfig);\n\n return updatedNextConfig;\n };\n}\n\nexport default withPeam;\n","import { withPeam } from './withPeam';\nexport default withPeam;\n"]}
@@ -1,149 +1,79 @@
1
1
  'use strict';
2
2
 
3
- var fs = require('fs');
3
+ var builder = require('peam/builder');
4
4
  var logger = require('peam/logger');
5
- var parser = require('peam/parser');
6
5
  var search = require('peam/search');
7
6
 
8
7
  // src/adapter.ts
9
8
  var log = logger.loggers.adapter;
10
- function extractRobotsFromPrerender(prerender) {
11
- var _a;
12
- try {
13
- if (prerender.pathname !== "/robots.txt") {
14
- return null;
15
- }
16
- if ((_a = prerender.fallback) == null ? void 0 : _a.filePath) {
17
- const content = fs.readFileSync(prerender.fallback.filePath, "utf-8");
18
- return content;
19
- }
20
- } catch (error) {
21
- log.error("Error extracting robots from prerender:", error);
22
- }
23
- return null;
24
- }
25
- function loadRobotsTxt(projectDir, prerenders, robotsTxtPath) {
26
- try {
27
- let robotsContent = null;
28
- let foundPath = null;
29
- if (prerenders && prerenders.length > 0) {
30
- for (const prerender of prerenders) {
31
- const content = extractRobotsFromPrerender(prerender);
32
- if (content) {
33
- log.debug("Found dynamic robots.txt from prerenders");
34
- robotsContent = content;
35
- foundPath = prerender.pathname;
36
- break;
37
- }
38
- }
39
- }
40
- if (!robotsContent) {
41
- const searchPaths = ["public/robots.txt", "app/robots.txt", "src/app/robots.txt"];
42
- const result = parser.loadRobotsTxt(projectDir, searchPaths, robotsTxtPath);
43
- if (result) {
44
- log.debug("Loaded robots.txt from:", result.path);
45
- return result;
46
- }
47
- return null;
48
- }
49
- return {
50
- parser: parser.createRobotsParser(robotsContent),
51
- path: foundPath || ""
52
- };
53
- } catch (error) {
54
- log.error("Error loading robots.txt:", error);
55
- return null;
9
+ function normalizePrerenders(outputs) {
10
+ if ("prerenders" in outputs) {
11
+ return outputs.prerenders.map((prerender) => ({
12
+ pathname: prerender.pathname,
13
+ fallback: prerender.fallback
14
+ }));
56
15
  }
16
+ return outputs.map((prerender) => ({
17
+ pathname: prerender.pathname,
18
+ fallback: prerender.fallback
19
+ }));
57
20
  }
58
21
  function createPeamAdapter(config) {
59
22
  return {
60
23
  name: "peam-adapter",
61
24
  async onBuildComplete(ctx) {
62
- var _a, _b;
63
25
  log.debug("Extracting page content via adapter");
64
26
  const outputs = ctx.outputs;
65
- let prerenders;
66
- if (Array.isArray(outputs)) {
67
- prerenders = outputs.filter((output) => output.type === "PRERENDER");
68
- } else {
69
- prerenders = outputs.prerenders || [];
70
- }
71
- log.debug("Total prerenders:", prerenders.length);
72
27
  const projectDir = ctx.projectDir || process.cwd();
73
- const robotsResult = config.respectRobotsTxt ? loadRobotsTxt(projectDir, prerenders, config.robotsTxtPath) : null;
74
- if (robotsResult) {
75
- log.debug("Using robots.txt from:", robotsResult.path);
76
- }
77
- const pages = [];
78
- for (const prerender of prerenders) {
79
- const pathname = prerender.pathname;
80
- let fallbackFilePath = (_a = prerender.fallback) == null ? void 0 : _a.filePath;
81
- if (!fallbackFilePath) {
82
- continue;
83
- }
84
- if (fallbackFilePath == null ? void 0 : fallbackFilePath.endsWith("/.html")) {
85
- fallbackFilePath = fallbackFilePath.replace("/.html", "/index.html");
86
- }
87
- const filterResult = parser.shouldIncludePath(
88
- pathname,
89
- (_b = robotsResult == null ? void 0 : robotsResult.parser) != null ? _b : null,
90
- config.exclude,
91
- config.respectRobotsTxt
92
- );
93
- if (!filterResult.included) {
94
- if (filterResult.reason === "robots-txt") {
95
- log.debug("Path excluded by robots.txt:", pathname);
96
- } else if (filterResult.reason === "exclude-pattern") {
97
- log.debug("Path excluded by user pattern:", pathname);
28
+ const prerenders = normalizePrerenders(outputs);
29
+ const pipeline = builder.SearchIndexBuilder.fromConfigs(
30
+ [
31
+ {
32
+ type: "prerender",
33
+ config: {
34
+ prerenders,
35
+ projectDir
36
+ }
98
37
  }
99
- continue;
100
- }
101
- try {
102
- log.debug("Reading HTML from:", fallbackFilePath);
103
- const html = fs.readFileSync(fallbackFilePath, "utf-8");
104
- const structuredPage = parser.parseHTML(html);
105
- if (!structuredPage) {
106
- log.warn("No content extracted from", pathname);
107
- continue;
108
- }
109
- log.debug("Successfully extracted content from", pathname);
110
- pages.push({
111
- path: pathname,
112
- htmlFile: fallbackFilePath.replace(projectDir + "/", ""),
113
- structuredPage,
114
- type: "page"
115
- });
116
- } catch (error) {
117
- log.error("Error processing", pathname, error);
38
+ ],
39
+ {
40
+ robotsTxt: config.robotsTxt,
41
+ exclude: config.exclude
118
42
  }
43
+ );
44
+ log.debug("Building search index from prerender outputs...");
45
+ const searchIndexData = await pipeline.build(new search.TextBasedSearchEngine());
46
+ if (!searchIndexData) {
47
+ log.warn("No search index data generated");
48
+ return;
119
49
  }
120
- log.debug("Creating search index...");
121
- const searchIndexData = await search.buildSearchIndex(pages);
122
- await config.searchIndexExporter.export(searchIndexData);
123
- log.debug("Saved search index via exporter");
124
- log.debug("Extraction complete with total pages:", pages.length);
50
+ await config.searchIndexStore.export(searchIndexData);
51
+ log.debug("Saved search index via store");
52
+ log.debug("Extraction complete with total keys:", searchIndexData.keys.length);
125
53
  }
126
54
  };
127
55
  }
128
56
  var getConfig = () => {
129
- if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {
57
+ if (!process.env.PEAM_SEARCH_STORE) {
130
58
  throw new Error(
131
59
  "Peam configuration not found. Make sure withPeam() is properly configured in your next.config file."
132
60
  );
133
61
  }
134
- const searchExporterConfig = {
135
- type: process.env.PEAM_SEARCH_EXPORTER_TYPE,
136
- config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG)
137
- };
62
+ const searchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);
138
63
  const resolvedConfig = {
139
- searchExporter: searchExporterConfig,
140
- searchIndexExporter: search.createExporterFromConfig(searchExporterConfig),
141
- respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === "true",
142
- robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || void 0,
64
+ searchStore: searchStoreConfig,
65
+ searchIndexStore: search.createStoreFromConfig(searchStoreConfig),
66
+ robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),
143
67
  exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : []
144
68
  };
145
69
  return resolvedConfig;
146
70
  };
71
+ function parseRobotsTxtEnv(value) {
72
+ if (value === void 0 || value === "") return void 0;
73
+ if (value === "false") return false;
74
+ if (value === "true") return true;
75
+ return value;
76
+ }
147
77
 
148
78
  // src/peam.adapter.ts
149
79
  var peam_adapter_default = createPeamAdapter(getConfig());
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/config.ts","../src/peam.adapter.ts"],"names":["loggers","readFileSync","baseLoadRobotsTxt","createRobotsParser","shouldIncludePath","parseHTML","buildSearchIndex","createExporterFromConfig"],"mappings":"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","file":"peam.adapter.js","sourcesContent":["import { readFileSync } from 'fs';\nimport type { NextAdapter } from 'next';\nimport { loggers } from 'peam/logger';\nimport {\n loadRobotsTxt as baseLoadRobotsTxt,\n createRobotsParser,\n parseHTML,\n shouldIncludePath,\n type RobotsTxtResult,\n type StructuredPage,\n} from 'peam/parser';\nimport { buildSearchIndex } from 'peam/search';\nimport { type ResolvedPeamAdapterConfig } from './config';\n\nconst log = loggers.adapter;\n\ninterface PrerenderOutput {\n pathname: string;\n fallback?: {\n filePath: string;\n };\n}\n\ninterface NextJS15Output extends PrerenderOutput {\n type: string;\n}\n\ninterface NextJS16Outputs {\n prerenders: Array<PrerenderOutput>;\n}\n\nfunction extractRobotsFromPrerender(prerender: PrerenderOutput): string | null {\n try {\n if (prerender.pathname !== '/robots.txt') {\n return null;\n }\n\n if (prerender.fallback?.filePath) {\n const content = readFileSync(prerender.fallback.filePath, 'utf-8');\n return content;\n }\n } catch (error) {\n log.error('Error extracting robots from prerender:', error);\n }\n\n return null;\n}\n\nfunction loadRobotsTxt(\n projectDir: string,\n prerenders: PrerenderOutput[],\n robotsTxtPath?: string\n): RobotsTxtResult | null {\n try {\n let robotsContent: string | null = null;\n let foundPath: string | null = null;\n\n if (prerenders && prerenders.length > 0) {\n for (const prerender of prerenders) {\n const content = extractRobotsFromPrerender(prerender);\n if (content) {\n log.debug('Found dynamic robots.txt from prerenders');\n robotsContent = content;\n foundPath = prerender.pathname;\n break;\n }\n }\n }\n\n if (!robotsContent) {\n const searchPaths = ['public/robots.txt', 'app/robots.txt', 'src/app/robots.txt'];\n const result = baseLoadRobotsTxt(projectDir, searchPaths, robotsTxtPath);\n if (result) {\n log.debug('Loaded robots.txt from:', result.path);\n return result;\n }\n return null;\n }\n\n return {\n parser: createRobotsParser(robotsContent),\n path: foundPath || '',\n };\n } catch (error) {\n log.error('Error loading robots.txt:', error);\n return null;\n }\n}\n\nexport function createPeamAdapter(config: ResolvedPeamAdapterConfig): NextAdapter {\n return {\n name: 'peam-adapter',\n\n async onBuildComplete(ctx) {\n log.debug('Extracting page content via adapter');\n\n const outputs = ctx.outputs as NextJS15Output[] | NextJS16Outputs;\n let prerenders: PrerenderOutput[];\n\n if (Array.isArray(outputs)) {\n prerenders = outputs.filter((output: NextJS15Output) => output.type === 'PRERENDER');\n } else {\n prerenders = outputs.prerenders || [];\n }\n\n log.debug('Total prerenders:', prerenders.length);\n\n const projectDir = ctx.projectDir || process.cwd();\n\n const robotsResult = config.respectRobotsTxt ? loadRobotsTxt(projectDir, prerenders, config.robotsTxtPath) : null;\n\n if (robotsResult) {\n log.debug('Using robots.txt from:', robotsResult.path);\n }\n\n const pages: Array<{\n path: string;\n htmlFile: string;\n structuredPage: StructuredPage;\n type: string;\n runtime?: string;\n }> = [];\n\n for (const prerender of prerenders) {\n const pathname = prerender.pathname;\n let fallbackFilePath = prerender.fallback?.filePath;\n\n if (!fallbackFilePath) {\n continue;\n }\n\n // Fix for Next.js 15\n if (fallbackFilePath?.endsWith('/.html')) {\n fallbackFilePath = fallbackFilePath.replace('/.html', '/index.html');\n }\n\n const filterResult = shouldIncludePath(\n pathname,\n robotsResult?.parser ?? null,\n config.exclude,\n config.respectRobotsTxt\n );\n\n if (!filterResult.included) {\n if (filterResult.reason === 'robots-txt') {\n log.debug('Path excluded by robots.txt:', pathname);\n } else if (filterResult.reason === 'exclude-pattern') {\n log.debug('Path excluded by user pattern:', pathname);\n }\n continue;\n }\n\n try {\n log.debug('Reading HTML from:', fallbackFilePath);\n\n const html = readFileSync(fallbackFilePath, 'utf-8');\n const structuredPage = parseHTML(html);\n\n if (!structuredPage) {\n log.warn('No content extracted from', pathname);\n continue;\n }\n\n log.debug('Successfully extracted content from', pathname);\n pages.push({\n path: pathname,\n htmlFile: fallbackFilePath.replace(projectDir + '/', ''),\n structuredPage,\n type: 'page',\n });\n } catch (error) {\n log.error('Error processing', pathname, error);\n }\n }\n\n log.debug('Creating search index...');\n const searchIndexData = await buildSearchIndex(pages);\n\n // Use the exporter to save the search index\n await config.searchIndexExporter.export(searchIndexData);\n\n log.debug('Saved search index via exporter');\n log.debug('Extraction complete with total pages:', pages.length);\n },\n };\n}\n","import { NextConfig } from 'next';\nimport { createExporterFromConfig, type SearchExporterConfig, type SearchIndexExporter } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search exporter configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchExporter?: SearchExporterConfig;\n /**\n * Whether to respect robots.txt rules when indexing pages\n * @default true\n */\n respectRobotsTxt?: boolean;\n /**\n * Path to a custom robots.txt file relative to the project root\n * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxtPath?: string;\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxtPath'>> & {\n robotsTxtPath?: string;\n searchIndexExporter: SearchIndexExporter;\n};\n\nconst defaultConfig = {\n searchExporter: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n respectRobotsTxt: true,\n robotsTxtPath: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_EXPORTER_TYPE: peamConfig?.searchExporter?.type ?? defaultConfig.searchExporter.type,\n PEAM_SEARCH_EXPORTER_CONFIG:\n JSON.stringify(peamConfig?.searchExporter?.config) ?? JSON.stringify(defaultConfig.searchExporter.config),\n PEAM_RESPECT_ROBOTS_TXT: String(peamConfig?.respectRobotsTxt ?? defaultConfig.respectRobotsTxt),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude) ?? JSON.stringify(defaultConfig.exclude),\n PEAM_ROBOTS_TXT_PATH: '',\n };\n\n if (peamConfig?.robotsTxtPath) {\n envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchExporterConfig: SearchExporterConfig = {\n type: process.env.PEAM_SEARCH_EXPORTER_TYPE as SearchExporterConfig['type'],\n config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG),\n };\n\n const resolvedConfig = {\n searchExporter: searchExporterConfig,\n searchIndexExporter: createExporterFromConfig(searchExporterConfig),\n respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === 'true',\n robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || undefined,\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n","import { createPeamAdapter } from './adapter';\nimport { getConfig } from './config';\n\nexport default createPeamAdapter(getConfig());\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/config.ts","../src/peam.adapter.ts"],"names":["loggers","SearchIndexBuilder","TextBasedSearchEngine","createStoreFromConfig"],"mappings":"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","file":"peam.adapter.js","sourcesContent":["import type { NextAdapter } from 'next';\nimport { SearchIndexBuilder } from 'peam/builder';\nimport { loggers } from 'peam/logger';\nimport { TextBasedSearchEngine } from 'peam/search';\nimport { type ResolvedPeamAdapterConfig } from './config';\n\nconst log = loggers.adapter;\n\ninterface PrerenderOutput {\n pathname: string;\n fallback?: {\n filePath: string;\n };\n}\n\ninterface NextJS15Output extends PrerenderOutput {\n type: string;\n}\n\ninterface NextJS16Outputs {\n prerenders: Array<PrerenderOutput>;\n}\n\n/**\n * Normalize Next.js outputs into PrerenderPage array\n */\nfunction normalizePrerenders(outputs: NextJS15Output[] | NextJS16Outputs) {\n // Next.js 16+ format (outputs is an object with prerenders array)\n if ('prerenders' in outputs) {\n return outputs.prerenders.map((prerender) => ({\n pathname: prerender.pathname,\n fallback: prerender.fallback,\n }));\n }\n\n // Next.js 15 format (outputs is an array)\n return (outputs as NextJS15Output[]).map((prerender) => ({\n pathname: prerender.pathname,\n fallback: prerender.fallback,\n }));\n}\n\nexport function createPeamAdapter(config: ResolvedPeamAdapterConfig): NextAdapter {\n return {\n name: 'peam-adapter',\n\n async onBuildComplete(ctx) {\n log.debug('Extracting page content via adapter');\n\n const outputs = ctx.outputs as NextJS15Output[] | NextJS16Outputs;\n const projectDir = ctx.projectDir || process.cwd();\n const prerenders = normalizePrerenders(outputs);\n\n const pipeline = SearchIndexBuilder.fromConfigs(\n [\n {\n type: 'prerender',\n config: {\n prerenders,\n projectDir,\n },\n },\n ],\n {\n robotsTxt: config.robotsTxt,\n exclude: config.exclude,\n }\n );\n\n log.debug('Building search index from prerender outputs...');\n\n // TODO: this is creating unnecessary coupling between builder and search, can we fix it?\n const searchIndexData = await pipeline.build(new TextBasedSearchEngine());\n\n if (!searchIndexData) {\n log.warn('No search index data generated');\n return;\n }\n\n await config.searchIndexStore.export(searchIndexData);\n\n log.debug('Saved search index via store');\n log.debug('Extraction complete with total keys:', searchIndexData.keys.length);\n },\n };\n}\n","import { NextConfig } from 'next';\nimport { createStoreFromConfig, type SearchIndexStore, type SearchStoreConfig } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search store configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchStore?: SearchStoreConfig;\n\n /**\n * Path to a custom robots.txt file or false to disable robots.txt filtering\n * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxt?: string | boolean;\n\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxt'>> & {\n robotsTxt?: string | boolean;\n searchIndexStore: SearchIndexStore;\n};\n\nconst defaultConfig = {\n searchStore: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n robotsTxt: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_STORE: JSON.stringify(peamConfig?.searchStore ? peamConfig.searchStore : defaultConfig.searchStore),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude ? peamConfig.exclude : defaultConfig.exclude),\n PEAM_ROBOTS_TXT: '',\n };\n\n if (peamConfig?.robotsTxt !== undefined) {\n envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_STORE) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchStoreConfig: SearchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);\n\n const resolvedConfig = {\n searchStore: searchStoreConfig,\n searchIndexStore: createStoreFromConfig(searchStoreConfig),\n robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n\nfunction parseRobotsTxtEnv(value: string | undefined): string | boolean | undefined {\n if (value === undefined || value === '') return undefined;\n if (value === 'false') return false;\n if (value === 'true') return true;\n return value;\n}\n","import { createPeamAdapter } from './adapter';\nimport { getConfig } from './config';\n\nexport default createPeamAdapter(getConfig());\n"]}
package/dist/route.d.mts CHANGED
@@ -1,3 +1,15 @@
1
- declare const POST: (req: Request) => Promise<Response>;
1
+ import { ChatRuntimeOptions, DefaultChatRuntime } from 'peam/server';
2
2
 
3
- export { POST };
3
+ declare function createChat(options?: ChatRuntimeOptions): DefaultChatRuntime;
4
+
5
+ /**
6
+ * Default POST handler using GPT-4o.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * export { POST } from '@peam-ai/next/route';
11
+ * ```
12
+ */
13
+ declare const POST: (request: Request) => Promise<Response>;
14
+
15
+ export { POST, createChat };
package/dist/route.d.ts CHANGED
@@ -1,3 +1,15 @@
1
- declare const POST: (req: Request) => Promise<Response>;
1
+ import { ChatRuntimeOptions, DefaultChatRuntime } from 'peam/server';
2
2
 
3
- export { POST };
3
+ declare function createChat(options?: ChatRuntimeOptions): DefaultChatRuntime;
4
+
5
+ /**
6
+ * Default POST handler using GPT-4o.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * export { POST } from '@peam-ai/next/route';
11
+ * ```
12
+ */
13
+ declare const POST: (request: Request) => Promise<Response>;
14
+
15
+ export { POST, createChat };
package/dist/route.js CHANGED
@@ -3,33 +3,42 @@
3
3
  var server = require('peam/server');
4
4
  var search = require('peam/search');
5
5
 
6
- // src/route.ts
6
+ // src/createChat.ts
7
7
  var getConfig = () => {
8
- if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {
8
+ if (!process.env.PEAM_SEARCH_STORE) {
9
9
  throw new Error(
10
10
  "Peam configuration not found. Make sure withPeam() is properly configured in your next.config file."
11
11
  );
12
12
  }
13
- const searchExporterConfig = {
14
- type: process.env.PEAM_SEARCH_EXPORTER_TYPE,
15
- config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG)
16
- };
13
+ const searchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);
17
14
  const resolvedConfig = {
18
- searchExporter: searchExporterConfig,
19
- searchIndexExporter: search.createExporterFromConfig(searchExporterConfig),
20
- respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === "true",
21
- robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || void 0,
15
+ searchStore: searchStoreConfig,
16
+ searchIndexStore: search.createStoreFromConfig(searchStoreConfig),
17
+ robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),
22
18
  exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : []
23
19
  };
24
20
  return resolvedConfig;
25
21
  };
22
+ function parseRobotsTxtEnv(value) {
23
+ if (value === void 0 || value === "") return void 0;
24
+ if (value === "false") return false;
25
+ if (value === "true") return true;
26
+ return value;
27
+ }
28
+
29
+ // src/createChat.ts
30
+ function createChat(options = {}) {
31
+ const config = getConfig();
32
+ return server.createChat({
33
+ searchIndexStore: config.searchIndexStore,
34
+ ...options
35
+ });
36
+ }
26
37
 
27
38
  // src/route.ts
28
- var config = getConfig();
29
- var POST = server.createHandler({
30
- searchIndexExporter: config.searchIndexExporter
31
- });
39
+ var POST = createChat().handler;
32
40
 
33
41
  exports.POST = POST;
42
+ exports.createChat = createChat;
34
43
  //# sourceMappingURL=route.js.map
35
44
  //# sourceMappingURL=route.js.map
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/route.ts"],"names":["createExporterFromConfig","createHandler"],"mappings":";;;;;;AAqEO,IAAM,YAAY,MAAiC;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAC,OAAA,CAAQ,IAAI,2BAAA,EAA6B;AACtF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,oBAAA,GAA6C;AAAA,IACjD,IAAA,EAAM,QAAQ,GAAA,CAAI,yBAAA;AAAA,IAClB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,2BAA2B;AAAA,GAC5D;AAEA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,cAAA,EAAgB,oBAAA;AAAA,IAChB,mBAAA,EAAqBA,gCAAyB,oBAAoB,CAAA;AAAA,IAClE,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,uBAAA,KAA4B,MAAA;AAAA,IAC1D,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,oBAAA,IAAwB,MAAA;AAAA,IACnD,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GAAI;AAAC,GAC9E;AAEA,EAAA,OAAO,cAAA;AACT,CAAA;;;AC/EA,IAAM,SAAS,SAAA,EAAU;AAElB,IAAM,OAAOC,oBAAA,CAAc;AAAA,EAChC,qBAAqB,MAAA,CAAO;AAC9B,CAAC","file":"route.js","sourcesContent":["import { NextConfig } from 'next';\nimport { createExporterFromConfig, type SearchExporterConfig, type SearchIndexExporter } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search exporter configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchExporter?: SearchExporterConfig;\n /**\n * Whether to respect robots.txt rules when indexing pages\n * @default true\n */\n respectRobotsTxt?: boolean;\n /**\n * Path to a custom robots.txt file relative to the project root\n * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxtPath?: string;\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxtPath'>> & {\n robotsTxtPath?: string;\n searchIndexExporter: SearchIndexExporter;\n};\n\nconst defaultConfig = {\n searchExporter: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n respectRobotsTxt: true,\n robotsTxtPath: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_EXPORTER_TYPE: peamConfig?.searchExporter?.type ?? defaultConfig.searchExporter.type,\n PEAM_SEARCH_EXPORTER_CONFIG:\n JSON.stringify(peamConfig?.searchExporter?.config) ?? JSON.stringify(defaultConfig.searchExporter.config),\n PEAM_RESPECT_ROBOTS_TXT: String(peamConfig?.respectRobotsTxt ?? defaultConfig.respectRobotsTxt),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude) ?? JSON.stringify(defaultConfig.exclude),\n PEAM_ROBOTS_TXT_PATH: '',\n };\n\n if (peamConfig?.robotsTxtPath) {\n envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchExporterConfig: SearchExporterConfig = {\n type: process.env.PEAM_SEARCH_EXPORTER_TYPE as SearchExporterConfig['type'],\n config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG),\n };\n\n const resolvedConfig = {\n searchExporter: searchExporterConfig,\n searchIndexExporter: createExporterFromConfig(searchExporterConfig),\n respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === 'true',\n robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || undefined,\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n","import { createHandler } from 'peam/server';\nimport { getConfig } from './config';\n\n/**\n * Default POST handler using GPT-4o.\n *\n * @example\n * ```typescript\n * export { POST } from '@peam-ai/next/route';\n * ```\n */\nconst config = getConfig();\n\nexport const POST = createHandler({\n searchIndexExporter: config.searchIndexExporter,\n});\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/createChat.ts","../src/route.ts"],"names":["createStoreFromConfig","createServerChat"],"mappings":";;;;;;AA8DO,IAAM,YAAY,MAAiC;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAuC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAErF,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,WAAA,EAAa,iBAAA;AAAA,IACb,gBAAA,EAAkBA,6BAAsB,iBAAiB,CAAA;AAAA,IACzD,SAAA,EAAW,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAAA,IACxD,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GAAI;AAAC,GAC9E;AAEA,EAAA,OAAO,cAAA;AACT,CAAA;AAEA,SAAS,kBAAkB,KAAA,EAAyD;AAClF,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI,OAAO,MAAA;AAChD,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,OAAO,KAAA;AACT;;;ACnFO,SAAS,UAAA,CAAW,OAAA,GAA8B,EAAC,EAAuB;AAC/E,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,OAAOC,iBAAA,CAAiB;AAAA,IACtB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,GAAG;AAAA,GACJ,CAAA;AACH;;;ACCO,IAAM,IAAA,GAAO,YAAW,CAAE","file":"route.js","sourcesContent":["import { NextConfig } from 'next';\nimport { createStoreFromConfig, type SearchIndexStore, type SearchStoreConfig } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search store configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchStore?: SearchStoreConfig;\n\n /**\n * Path to a custom robots.txt file or false to disable robots.txt filtering\n * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxt?: string | boolean;\n\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxt'>> & {\n robotsTxt?: string | boolean;\n searchIndexStore: SearchIndexStore;\n};\n\nconst defaultConfig = {\n searchStore: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n robotsTxt: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_STORE: JSON.stringify(peamConfig?.searchStore ? peamConfig.searchStore : defaultConfig.searchStore),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude ? peamConfig.exclude : defaultConfig.exclude),\n PEAM_ROBOTS_TXT: '',\n };\n\n if (peamConfig?.robotsTxt !== undefined) {\n envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_STORE) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchStoreConfig: SearchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);\n\n const resolvedConfig = {\n searchStore: searchStoreConfig,\n searchIndexStore: createStoreFromConfig(searchStoreConfig),\n robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n\nfunction parseRobotsTxtEnv(value: string | undefined): string | boolean | undefined {\n if (value === undefined || value === '') return undefined;\n if (value === 'false') return false;\n if (value === 'true') return true;\n return value;\n}\n","import { createChat as createServerChat, type ChatRuntimeOptions, type DefaultChatRuntime } from 'peam/server';\nimport { getConfig } from './config';\n\nexport function createChat(options: ChatRuntimeOptions = {}): DefaultChatRuntime {\n const config = getConfig();\n\n return createServerChat({\n searchIndexStore: config.searchIndexStore,\n ...options,\n });\n}\n","export { createChat } from './createChat';\nimport { createChat } from './createChat';\n\n/**\n * Default POST handler using GPT-4o.\n *\n * @example\n * ```typescript\n * export { POST } from '@peam-ai/next/route';\n * ```\n */\nexport const POST = createChat().handler;\n"]}
package/dist/route.mjs CHANGED
@@ -1,33 +1,41 @@
1
- import { createHandler } from 'peam/server';
2
- import { createExporterFromConfig } from 'peam/search';
1
+ import { createChat as createChat$1 } from 'peam/server';
2
+ import { createStoreFromConfig } from 'peam/search';
3
3
 
4
- // src/route.ts
4
+ // src/createChat.ts
5
5
  var getConfig = () => {
6
- if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {
6
+ if (!process.env.PEAM_SEARCH_STORE) {
7
7
  throw new Error(
8
8
  "Peam configuration not found. Make sure withPeam() is properly configured in your next.config file."
9
9
  );
10
10
  }
11
- const searchExporterConfig = {
12
- type: process.env.PEAM_SEARCH_EXPORTER_TYPE,
13
- config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG)
14
- };
11
+ const searchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);
15
12
  const resolvedConfig = {
16
- searchExporter: searchExporterConfig,
17
- searchIndexExporter: createExporterFromConfig(searchExporterConfig),
18
- respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === "true",
19
- robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || void 0,
13
+ searchStore: searchStoreConfig,
14
+ searchIndexStore: createStoreFromConfig(searchStoreConfig),
15
+ robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),
20
16
  exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : []
21
17
  };
22
18
  return resolvedConfig;
23
19
  };
20
+ function parseRobotsTxtEnv(value) {
21
+ if (value === void 0 || value === "") return void 0;
22
+ if (value === "false") return false;
23
+ if (value === "true") return true;
24
+ return value;
25
+ }
26
+
27
+ // src/createChat.ts
28
+ function createChat(options = {}) {
29
+ const config = getConfig();
30
+ return createChat$1({
31
+ searchIndexStore: config.searchIndexStore,
32
+ ...options
33
+ });
34
+ }
24
35
 
25
36
  // src/route.ts
26
- var config = getConfig();
27
- var POST = createHandler({
28
- searchIndexExporter: config.searchIndexExporter
29
- });
37
+ var POST = createChat().handler;
30
38
 
31
- export { POST };
39
+ export { POST, createChat };
32
40
  //# sourceMappingURL=route.mjs.map
33
41
  //# sourceMappingURL=route.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/route.ts"],"names":[],"mappings":";;;;AAqEO,IAAM,YAAY,MAAiC;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAC,OAAA,CAAQ,IAAI,2BAAA,EAA6B;AACtF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,oBAAA,GAA6C;AAAA,IACjD,IAAA,EAAM,QAAQ,GAAA,CAAI,yBAAA;AAAA,IAClB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,2BAA2B;AAAA,GAC5D;AAEA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,cAAA,EAAgB,oBAAA;AAAA,IAChB,mBAAA,EAAqB,yBAAyB,oBAAoB,CAAA;AAAA,IAClE,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,uBAAA,KAA4B,MAAA;AAAA,IAC1D,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,oBAAA,IAAwB,MAAA;AAAA,IACnD,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GAAI;AAAC,GAC9E;AAEA,EAAA,OAAO,cAAA;AACT,CAAA;;;AC/EA,IAAM,SAAS,SAAA,EAAU;AAElB,IAAM,OAAO,aAAA,CAAc;AAAA,EAChC,qBAAqB,MAAA,CAAO;AAC9B,CAAC","file":"route.mjs","sourcesContent":["import { NextConfig } from 'next';\nimport { createExporterFromConfig, type SearchExporterConfig, type SearchIndexExporter } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search exporter configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchExporter?: SearchExporterConfig;\n /**\n * Whether to respect robots.txt rules when indexing pages\n * @default true\n */\n respectRobotsTxt?: boolean;\n /**\n * Path to a custom robots.txt file relative to the project root\n * If not specified, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxtPath?: string;\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxtPath'>> & {\n robotsTxtPath?: string;\n searchIndexExporter: SearchIndexExporter;\n};\n\nconst defaultConfig = {\n searchExporter: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n respectRobotsTxt: true,\n robotsTxtPath: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_EXPORTER_TYPE: peamConfig?.searchExporter?.type ?? defaultConfig.searchExporter.type,\n PEAM_SEARCH_EXPORTER_CONFIG:\n JSON.stringify(peamConfig?.searchExporter?.config) ?? JSON.stringify(defaultConfig.searchExporter.config),\n PEAM_RESPECT_ROBOTS_TXT: String(peamConfig?.respectRobotsTxt ?? defaultConfig.respectRobotsTxt),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude) ?? JSON.stringify(defaultConfig.exclude),\n PEAM_ROBOTS_TXT_PATH: '',\n };\n\n if (peamConfig?.robotsTxtPath) {\n envVars.PEAM_ROBOTS_TXT_PATH = String(peamConfig.robotsTxtPath);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_EXPORTER_TYPE || !process.env.PEAM_SEARCH_EXPORTER_CONFIG) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchExporterConfig: SearchExporterConfig = {\n type: process.env.PEAM_SEARCH_EXPORTER_TYPE as SearchExporterConfig['type'],\n config: JSON.parse(process.env.PEAM_SEARCH_EXPORTER_CONFIG),\n };\n\n const resolvedConfig = {\n searchExporter: searchExporterConfig,\n searchIndexExporter: createExporterFromConfig(searchExporterConfig),\n respectRobotsTxt: process.env.PEAM_RESPECT_ROBOTS_TXT === 'true',\n robotsTxtPath: process.env.PEAM_ROBOTS_TXT_PATH || undefined,\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n","import { createHandler } from 'peam/server';\nimport { getConfig } from './config';\n\n/**\n * Default POST handler using GPT-4o.\n *\n * @example\n * ```typescript\n * export { POST } from '@peam-ai/next/route';\n * ```\n */\nconst config = getConfig();\n\nexport const POST = createHandler({\n searchIndexExporter: config.searchIndexExporter,\n});\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/createChat.ts","../src/route.ts"],"names":["createServerChat"],"mappings":";;;;AA8DO,IAAM,YAAY,MAAiC;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAuC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAErF,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,WAAA,EAAa,iBAAA;AAAA,IACb,gBAAA,EAAkB,sBAAsB,iBAAiB,CAAA;AAAA,IACzD,SAAA,EAAW,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAAA,IACxD,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,YAAA,GAAe,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GAAI;AAAC,GAC9E;AAEA,EAAA,OAAO,cAAA;AACT,CAAA;AAEA,SAAS,kBAAkB,KAAA,EAAyD;AAClF,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI,OAAO,MAAA;AAChD,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,OAAO,KAAA;AACT;;;ACnFO,SAAS,UAAA,CAAW,OAAA,GAA8B,EAAC,EAAuB;AAC/E,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,OAAOA,YAAA,CAAiB;AAAA,IACtB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,GAAG;AAAA,GACJ,CAAA;AACH;;;ACCO,IAAM,IAAA,GAAO,YAAW,CAAE","file":"route.mjs","sourcesContent":["import { NextConfig } from 'next';\nimport { createStoreFromConfig, type SearchIndexStore, type SearchStoreConfig } from 'peam/search';\n\nexport interface PeamConfig {\n /**\n * Search store configuration\n * @default { type: 'fileBased', config: { indexPath: '.peam/index.json' } }\n */\n searchStore?: SearchStoreConfig;\n\n /**\n * Path to a custom robots.txt file or false to disable robots.txt filtering\n * If undefined, the adapter will look for static or dynamic robots.txt files in standard locations\n * @example 'custom/robots.txt' or 'config/production-robots.txt'\n * @default undefined\n */\n robotsTxt?: string | boolean;\n\n /**\n * Array of wildcard patterns to exclude from indexing\n * Supports * (matches any characters except /), ** (matches any characters including /), and ? (single character)\n * @example ['/admin/**', '/api/*', '/private-*']\n * @default []\n */\n exclude?: string[];\n}\n\nexport type ResolvedPeamAdapterConfig = Required<Omit<PeamConfig, 'robotsTxt'>> & {\n robotsTxt?: string | boolean;\n searchIndexStore: SearchIndexStore;\n};\n\nconst defaultConfig = {\n searchStore: {\n type: 'fileBased' as const,\n config: { indexPath: '.peam/index.json' },\n },\n robotsTxt: undefined,\n exclude: [],\n} satisfies PeamConfig;\n\nexport function setNextConfig(nextConfig: NextConfig, peamConfig?: PeamConfig): void {\n const envVars = {\n PEAM_SEARCH_STORE: JSON.stringify(peamConfig?.searchStore ? peamConfig.searchStore : defaultConfig.searchStore),\n PEAM_EXCLUDE: JSON.stringify(peamConfig?.exclude ? peamConfig.exclude : defaultConfig.exclude),\n PEAM_ROBOTS_TXT: '',\n };\n\n if (peamConfig?.robotsTxt !== undefined) {\n envVars.PEAM_ROBOTS_TXT = String(peamConfig.robotsTxt);\n }\n\n // Set build time vars\n Object.assign(process.env, envVars);\n\n // Set runtime vars\n nextConfig.env = {\n ...nextConfig.env,\n ...envVars,\n };\n}\n\nexport const getConfig = (): ResolvedPeamAdapterConfig => {\n if (!process.env.PEAM_SEARCH_STORE) {\n throw new Error(\n 'Peam configuration not found. Make sure withPeam() is properly configured in your next.config file.'\n );\n }\n\n const searchStoreConfig: SearchStoreConfig = JSON.parse(process.env.PEAM_SEARCH_STORE);\n\n const resolvedConfig = {\n searchStore: searchStoreConfig,\n searchIndexStore: createStoreFromConfig(searchStoreConfig),\n robotsTxt: parseRobotsTxtEnv(process.env.PEAM_ROBOTS_TXT),\n exclude: process.env.PEAM_EXCLUDE ? JSON.parse(process.env.PEAM_EXCLUDE) : [],\n };\n\n return resolvedConfig;\n};\n\nfunction parseRobotsTxtEnv(value: string | undefined): string | boolean | undefined {\n if (value === undefined || value === '') return undefined;\n if (value === 'false') return false;\n if (value === 'true') return true;\n return value;\n}\n","import { createChat as createServerChat, type ChatRuntimeOptions, type DefaultChatRuntime } from 'peam/server';\nimport { getConfig } from './config';\n\nexport function createChat(options: ChatRuntimeOptions = {}): DefaultChatRuntime {\n const config = getConfig();\n\n return createServerChat({\n searchIndexStore: config.searchIndexStore,\n ...options,\n });\n}\n","export { createChat } from './createChat';\nimport { createChat } from './createChat';\n\n/**\n * Default POST handler using GPT-4o.\n *\n * @example\n * ```typescript\n * export { POST } from '@peam-ai/next/route';\n * ```\n */\nexport const POST = createChat().handler;\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@peam-ai/next",
3
3
  "description": "Peam Next.js integration",
4
- "version": "0.1.6",
4
+ "version": "0.1.8",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -43,17 +43,18 @@
43
43
  "next": ">=14.0.0"
44
44
  },
45
45
  "dependencies": {
46
- "peam": "0.1.4"
46
+ "peam": "0.1.5"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "next": ">=14.0.0"
50
50
  },
51
51
  "scripts": {
52
52
  "build": "tsup",
53
+ "build:watch": "tsup --watch",
53
54
  "clean": "rm -rf dist",
54
- "dev": "tsup --watch",
55
+ "format": "prettier --write \"src/**/*.ts*\"",
55
56
  "test:lint": "eslint \"src/**/*.ts*\"",
56
- "test:prettier": "prettier --check \"src/**/*.ts*\"",
57
+ "test:format": "prettier --check \"src/**/*.ts*\"",
57
58
  "test:unit": "vitest run"
58
59
  }
59
60
  }