@sonordev/site-kit 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/README.md +376 -0
  2. package/dist/SetupWizard-Cki06kB0.d.mts +12 -0
  3. package/dist/SetupWizard-Cki06kB0.d.ts +12 -0
  4. package/dist/analytics/index.d.mts +93 -0
  5. package/dist/analytics/index.d.ts +93 -0
  6. package/dist/analytics/index.js +89 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics/index.mjs +71 -0
  9. package/dist/analytics/index.mjs.map +1 -0
  10. package/dist/api-CWtoFJCO.d.mts +137 -0
  11. package/dist/api-CWtoFJCO.d.ts +137 -0
  12. package/dist/blog/index.d.mts +305 -0
  13. package/dist/blog/index.d.ts +305 -0
  14. package/dist/blog/index.js +1578 -0
  15. package/dist/blog/index.js.map +1 -0
  16. package/dist/blog/index.mjs +1562 -0
  17. package/dist/blog/index.mjs.map +1 -0
  18. package/dist/blog/server.d.mts +229 -0
  19. package/dist/blog/server.d.ts +229 -0
  20. package/dist/blog/server.js +692 -0
  21. package/dist/blog/server.js.map +1 -0
  22. package/dist/blog/server.mjs +666 -0
  23. package/dist/blog/server.mjs.map +1 -0
  24. package/dist/chunk-24277A3Q.mjs +968 -0
  25. package/dist/chunk-24277A3Q.mjs.map +1 -0
  26. package/dist/chunk-373TK6TZ.js +321 -0
  27. package/dist/chunk-373TK6TZ.js.map +1 -0
  28. package/dist/chunk-3MYZS6PD.js +30 -0
  29. package/dist/chunk-3MYZS6PD.js.map +1 -0
  30. package/dist/chunk-43GBM4SX.js +283 -0
  31. package/dist/chunk-43GBM4SX.js.map +1 -0
  32. package/dist/chunk-4XPGGLVP.mjs +53 -0
  33. package/dist/chunk-4XPGGLVP.mjs.map +1 -0
  34. package/dist/chunk-622GAQP5.js +2008 -0
  35. package/dist/chunk-622GAQP5.js.map +1 -0
  36. package/dist/chunk-6BIPAKL4.mjs +28 -0
  37. package/dist/chunk-6BIPAKL4.mjs.map +1 -0
  38. package/dist/chunk-6ZCISNAB.mjs +343 -0
  39. package/dist/chunk-6ZCISNAB.mjs.map +1 -0
  40. package/dist/chunk-72MQFHYJ.js +1429 -0
  41. package/dist/chunk-72MQFHYJ.js.map +1 -0
  42. package/dist/chunk-7557OTHW.js +62 -0
  43. package/dist/chunk-7557OTHW.js.map +1 -0
  44. package/dist/chunk-7FUV73JZ.js +981 -0
  45. package/dist/chunk-7FUV73JZ.js.map +1 -0
  46. package/dist/chunk-7RF6PVHA.mjs +324 -0
  47. package/dist/chunk-7RF6PVHA.mjs.map +1 -0
  48. package/dist/chunk-7RYCHO6D.mjs +134 -0
  49. package/dist/chunk-7RYCHO6D.mjs.map +1 -0
  50. package/dist/chunk-7UKPRW25.mjs +1999 -0
  51. package/dist/chunk-7UKPRW25.mjs.map +1 -0
  52. package/dist/chunk-7URAOG2M.js +14864 -0
  53. package/dist/chunk-7URAOG2M.js.map +1 -0
  54. package/dist/chunk-AFAO3TGS.mjs +810 -0
  55. package/dist/chunk-AFAO3TGS.mjs.map +1 -0
  56. package/dist/chunk-BYLIU6XG.js +343 -0
  57. package/dist/chunk-BYLIU6XG.js.map +1 -0
  58. package/dist/chunk-D63MUKZ6.mjs +4423 -0
  59. package/dist/chunk-D63MUKZ6.mjs.map +1 -0
  60. package/dist/chunk-DDKW2FNA.js +390 -0
  61. package/dist/chunk-DDKW2FNA.js.map +1 -0
  62. package/dist/chunk-DQYMKR27.mjs +341 -0
  63. package/dist/chunk-DQYMKR27.mjs.map +1 -0
  64. package/dist/chunk-DW5UJKHH.js +221 -0
  65. package/dist/chunk-DW5UJKHH.js.map +1 -0
  66. package/dist/chunk-EEZCR6E6.js +50 -0
  67. package/dist/chunk-EEZCR6E6.js.map +1 -0
  68. package/dist/chunk-GCJXQ4AG.mjs +59 -0
  69. package/dist/chunk-GCJXQ4AG.mjs.map +1 -0
  70. package/dist/chunk-JGNQK2G6.mjs +14845 -0
  71. package/dist/chunk-JGNQK2G6.mjs.map +1 -0
  72. package/dist/chunk-JTLOJLWQ.mjs +563 -0
  73. package/dist/chunk-JTLOJLWQ.mjs.map +1 -0
  74. package/dist/chunk-K23A4G76.mjs +202 -0
  75. package/dist/chunk-K23A4G76.mjs.map +1 -0
  76. package/dist/chunk-KKU3K7RG.js +336 -0
  77. package/dist/chunk-KKU3K7RG.js.map +1 -0
  78. package/dist/chunk-KUGMH4ZF.js +571 -0
  79. package/dist/chunk-KUGMH4ZF.js.map +1 -0
  80. package/dist/chunk-LBVWVP72.js +110 -0
  81. package/dist/chunk-LBVWVP72.js.map +1 -0
  82. package/dist/chunk-LIVWLY2P.js +138 -0
  83. package/dist/chunk-LIVWLY2P.js.map +1 -0
  84. package/dist/chunk-M2T6R7BA.mjs +1003 -0
  85. package/dist/chunk-M2T6R7BA.mjs.map +1 -0
  86. package/dist/chunk-MV3QN7PW.mjs +47 -0
  87. package/dist/chunk-MV3QN7PW.mjs.map +1 -0
  88. package/dist/chunk-OB7E654K.js +72 -0
  89. package/dist/chunk-OB7E654K.js.map +1 -0
  90. package/dist/chunk-OIIKTGRL.mjs +380 -0
  91. package/dist/chunk-OIIKTGRL.mjs.map +1 -0
  92. package/dist/chunk-P3UWIUJS.mjs +1427 -0
  93. package/dist/chunk-P3UWIUJS.mjs.map +1 -0
  94. package/dist/chunk-PKN27UMH.mjs +136 -0
  95. package/dist/chunk-PKN27UMH.mjs.map +1 -0
  96. package/dist/chunk-QXV4667R.mjs +105 -0
  97. package/dist/chunk-QXV4667R.mjs.map +1 -0
  98. package/dist/chunk-S7FRYNSU.mjs +315 -0
  99. package/dist/chunk-S7FRYNSU.mjs.map +1 -0
  100. package/dist/chunk-TFLQX7K7.mjs +68 -0
  101. package/dist/chunk-TFLQX7K7.mjs.map +1 -0
  102. package/dist/chunk-UWE5PCYJ.mjs +279 -0
  103. package/dist/chunk-UWE5PCYJ.mjs.map +1 -0
  104. package/dist/chunk-UYFDNX2F.js +4469 -0
  105. package/dist/chunk-UYFDNX2F.js.map +1 -0
  106. package/dist/chunk-W4PALSGM.js +350 -0
  107. package/dist/chunk-W4PALSGM.js.map +1 -0
  108. package/dist/chunk-WECQ6KOB.js +1008 -0
  109. package/dist/chunk-WECQ6KOB.js.map +1 -0
  110. package/dist/chunk-XQQWI6WB.js +814 -0
  111. package/dist/chunk-XQQWI6WB.js.map +1 -0
  112. package/dist/chunk-XZJOZJB6.js +140 -0
  113. package/dist/chunk-XZJOZJB6.js.map +1 -0
  114. package/dist/chunk-ZSMWDLMK.js +63 -0
  115. package/dist/chunk-ZSMWDLMK.js.map +1 -0
  116. package/dist/cli/index.js +37243 -0
  117. package/dist/cli/index.js.map +1 -0
  118. package/dist/cli/index.mjs +37209 -0
  119. package/dist/cli/index.mjs.map +1 -0
  120. package/dist/commerce/index.d.mts +170 -0
  121. package/dist/commerce/index.d.ts +170 -0
  122. package/dist/commerce/index.js +174 -0
  123. package/dist/commerce/index.js.map +1 -0
  124. package/dist/commerce/index.mjs +5 -0
  125. package/dist/commerce/index.mjs.map +1 -0
  126. package/dist/commerce/server.d.mts +107 -0
  127. package/dist/commerce/server.d.ts +107 -0
  128. package/dist/commerce/server.js +187 -0
  129. package/dist/commerce/server.js.map +1 -0
  130. package/dist/commerce/server.mjs +177 -0
  131. package/dist/commerce/server.mjs.map +1 -0
  132. package/dist/config/index.d.mts +43 -0
  133. package/dist/config/index.d.ts +43 -0
  134. package/dist/config/index.js +66 -0
  135. package/dist/config/index.js.map +1 -0
  136. package/dist/config/index.mjs +64 -0
  137. package/dist/config/index.mjs.map +1 -0
  138. package/dist/engage/index.d.mts +33 -0
  139. package/dist/engage/index.d.ts +33 -0
  140. package/dist/engage/index.js +22 -0
  141. package/dist/engage/index.js.map +1 -0
  142. package/dist/engage/index.mjs +5 -0
  143. package/dist/engage/index.mjs.map +1 -0
  144. package/dist/forms/index.d.mts +437 -0
  145. package/dist/forms/index.d.ts +437 -0
  146. package/dist/forms/index.js +1168 -0
  147. package/dist/forms/index.js.map +1 -0
  148. package/dist/forms/index.mjs +1142 -0
  149. package/dist/forms/index.mjs.map +1 -0
  150. package/dist/generators-2XKQMPKH.mjs +4 -0
  151. package/dist/generators-2XKQMPKH.mjs.map +1 -0
  152. package/dist/generators-DTMO36DV.js +33 -0
  153. package/dist/generators-DTMO36DV.js.map +1 -0
  154. package/dist/images/index.d.mts +4 -0
  155. package/dist/images/index.d.ts +4 -0
  156. package/dist/images/index.js +46 -0
  157. package/dist/images/index.js.map +1 -0
  158. package/dist/images/index.mjs +5 -0
  159. package/dist/images/index.mjs.map +1 -0
  160. package/dist/images/server.d.mts +69 -0
  161. package/dist/images/server.d.ts +69 -0
  162. package/dist/images/server.js +21 -0
  163. package/dist/images/server.js.map +1 -0
  164. package/dist/images/server.mjs +4 -0
  165. package/dist/images/server.mjs.map +1 -0
  166. package/dist/index.d.mts +846 -0
  167. package/dist/index.d.ts +846 -0
  168. package/dist/index.js +2623 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/index.mjs +2416 -0
  171. package/dist/index.mjs.map +1 -0
  172. package/dist/layout/index.d.mts +53 -0
  173. package/dist/layout/index.d.ts +53 -0
  174. package/dist/layout/index.js +187 -0
  175. package/dist/layout/index.js.map +1 -0
  176. package/dist/layout/index.mjs +185 -0
  177. package/dist/layout/index.mjs.map +1 -0
  178. package/dist/llms/index.d.mts +448 -0
  179. package/dist/llms/index.d.ts +448 -0
  180. package/dist/llms/index.js +581 -0
  181. package/dist/llms/index.js.map +1 -0
  182. package/dist/llms/index.mjs +529 -0
  183. package/dist/llms/index.mjs.map +1 -0
  184. package/dist/manifest/index.d.mts +62 -0
  185. package/dist/manifest/index.d.ts +62 -0
  186. package/dist/manifest/index.js +85 -0
  187. package/dist/manifest/index.js.map +1 -0
  188. package/dist/manifest/index.mjs +83 -0
  189. package/dist/manifest/index.mjs.map +1 -0
  190. package/dist/middleware/index.d.mts +63 -0
  191. package/dist/middleware/index.d.ts +63 -0
  192. package/dist/middleware/index.js +54 -0
  193. package/dist/middleware/index.js.map +1 -0
  194. package/dist/middleware/index.mjs +51 -0
  195. package/dist/middleware/index.mjs.map +1 -0
  196. package/dist/migrator-2MQHOFDQ.mjs +4 -0
  197. package/dist/migrator-2MQHOFDQ.mjs.map +1 -0
  198. package/dist/migrator-THJCF6MZ.js +37 -0
  199. package/dist/migrator-THJCF6MZ.js.map +1 -0
  200. package/dist/redirects/index.d.mts +78 -0
  201. package/dist/redirects/index.d.ts +78 -0
  202. package/dist/redirects/index.js +26 -0
  203. package/dist/redirects/index.js.map +1 -0
  204. package/dist/redirects/index.mjs +5 -0
  205. package/dist/redirects/index.mjs.map +1 -0
  206. package/dist/reputation/index.d.mts +57 -0
  207. package/dist/reputation/index.d.ts +57 -0
  208. package/dist/reputation/index.js +21 -0
  209. package/dist/reputation/index.js.map +1 -0
  210. package/dist/reputation/index.mjs +4 -0
  211. package/dist/reputation/index.mjs.map +1 -0
  212. package/dist/robots/index.d.mts +38 -0
  213. package/dist/robots/index.d.ts +38 -0
  214. package/dist/robots/index.js +52 -0
  215. package/dist/robots/index.js.map +1 -0
  216. package/dist/robots/index.mjs +50 -0
  217. package/dist/robots/index.mjs.map +1 -0
  218. package/dist/routing-B5XS-6_W.d.mts +118 -0
  219. package/dist/routing-DZYzyDHw.d.ts +118 -0
  220. package/dist/scanner-GAF5PO5F.js +53 -0
  221. package/dist/scanner-GAF5PO5F.js.map +1 -0
  222. package/dist/scanner-LKJKW7IT.mjs +4 -0
  223. package/dist/scanner-LKJKW7IT.mjs.map +1 -0
  224. package/dist/securityHeaders-nwZ6nP4g.d.mts +24 -0
  225. package/dist/securityHeaders-nwZ6nP4g.d.ts +24 -0
  226. package/dist/seo/index.d.mts +600 -0
  227. package/dist/seo/index.d.ts +600 -0
  228. package/dist/seo/index.js +883 -0
  229. package/dist/seo/index.js.map +1 -0
  230. package/dist/seo/index.mjs +773 -0
  231. package/dist/seo/index.mjs.map +1 -0
  232. package/dist/seo/register-sitemap-cli.js +151 -0
  233. package/dist/seo/register-sitemap-cli.js.map +1 -0
  234. package/dist/seo/register-sitemap-cli.mjs +144 -0
  235. package/dist/seo/register-sitemap-cli.mjs.map +1 -0
  236. package/dist/seo/server.d.mts +107 -0
  237. package/dist/seo/server.d.ts +107 -0
  238. package/dist/seo/server.js +207 -0
  239. package/dist/seo/server.js.map +1 -0
  240. package/dist/seo/server.mjs +186 -0
  241. package/dist/seo/server.mjs.map +1 -0
  242. package/dist/server-api-EWXKOQZA.mjs +4 -0
  243. package/dist/server-api-EWXKOQZA.mjs.map +1 -0
  244. package/dist/server-api-GJPNRYUP.js +81 -0
  245. package/dist/server-api-GJPNRYUP.js.map +1 -0
  246. package/dist/setup/client.d.mts +60 -0
  247. package/dist/setup/client.d.ts +60 -0
  248. package/dist/setup/client.js +31 -0
  249. package/dist/setup/client.js.map +1 -0
  250. package/dist/setup/client.mjs +6 -0
  251. package/dist/setup/client.mjs.map +1 -0
  252. package/dist/setup/index.d.mts +5 -0
  253. package/dist/setup/index.d.ts +5 -0
  254. package/dist/setup/index.js +35 -0
  255. package/dist/setup/index.js.map +1 -0
  256. package/dist/setup/index.mjs +6 -0
  257. package/dist/setup/index.mjs.map +1 -0
  258. package/dist/setup/server.d.mts +14 -0
  259. package/dist/setup/server.d.ts +14 -0
  260. package/dist/setup/server.js +13 -0
  261. package/dist/setup/server.js.map +1 -0
  262. package/dist/setup/server.mjs +4 -0
  263. package/dist/setup/server.mjs.map +1 -0
  264. package/dist/site-config/index.d.mts +24 -0
  265. package/dist/site-config/index.d.ts +24 -0
  266. package/dist/site-config/index.js +17 -0
  267. package/dist/site-config/index.js.map +1 -0
  268. package/dist/site-config/index.mjs +4 -0
  269. package/dist/site-config/index.mjs.map +1 -0
  270. package/dist/sitemap/index.d.mts +96 -0
  271. package/dist/sitemap/index.d.ts +96 -0
  272. package/dist/sitemap/index.js +288 -0
  273. package/dist/sitemap/index.js.map +1 -0
  274. package/dist/sitemap/index.mjs +285 -0
  275. package/dist/sitemap/index.mjs.map +1 -0
  276. package/dist/socket-loader-J26QHHOB.js +16 -0
  277. package/dist/socket-loader-J26QHHOB.js.map +1 -0
  278. package/dist/socket-loader-R7S2YJ2J.mjs +14 -0
  279. package/dist/socket-loader-R7S2YJ2J.mjs.map +1 -0
  280. package/dist/types-0dmq3k20.d.mts +168 -0
  281. package/dist/types-0dmq3k20.d.ts +168 -0
  282. package/dist/types-Blb2QNkV.d.mts +263 -0
  283. package/dist/types-Blb2QNkV.d.ts +263 -0
  284. package/dist/types-BnCwwUX3.d.mts +250 -0
  285. package/dist/types-BnCwwUX3.d.ts +250 -0
  286. package/dist/types-CGlnp43R.d.mts +312 -0
  287. package/dist/types-CGlnp43R.d.ts +312 -0
  288. package/dist/types-D08004rU.d.mts +179 -0
  289. package/dist/types-D08004rU.d.ts +179 -0
  290. package/dist/types-DNSYU7qI.d.mts +127 -0
  291. package/dist/types-DNSYU7qI.d.ts +127 -0
  292. package/dist/types-KZP_VWZp.d.mts +266 -0
  293. package/dist/types-KZP_VWZp.d.ts +266 -0
  294. package/dist/useEventModal-BVTx69XE.d.mts +274 -0
  295. package/dist/useEventModal-Dx1dItTJ.d.ts +274 -0
  296. package/dist/web-vitals-444RLW3B.js +252 -0
  297. package/dist/web-vitals-444RLW3B.js.map +1 -0
  298. package/dist/web-vitals-KPICZIEF.mjs +241 -0
  299. package/dist/web-vitals-KPICZIEF.mjs.map +1 -0
  300. package/package.json +192 -0
@@ -0,0 +1,51 @@
1
+ import { buildSecurityHeaders } from '../chunk-6BIPAKL4.mjs';
2
+ import { handleManagedRedirects } from '../chunk-QXV4667R.mjs';
3
+ import '../chunk-GCJXQ4AG.mjs';
4
+ import '../chunk-4XPGGLVP.mjs';
5
+ import { NextResponse } from 'next/server';
6
+
7
+ function createMiddleware(config) {
8
+ const securityHeaders = buildSecurityHeaders(
9
+ config?.securityHeaders
10
+ );
11
+ return async function middleware(request) {
12
+ if (config?.before) {
13
+ const earlyResponse = await config.before(request);
14
+ if (earlyResponse) {
15
+ applyHeaders(earlyResponse, securityHeaders);
16
+ return earlyResponse;
17
+ }
18
+ }
19
+ if (config?.redirects !== false) {
20
+ const redirectConfig = typeof config?.redirects === "object" ? config.redirects : {};
21
+ const redirect = await handleManagedRedirects(
22
+ request,
23
+ redirectConfig
24
+ );
25
+ if (redirect) {
26
+ applyHeaders(redirect, securityHeaders);
27
+ return redirect;
28
+ }
29
+ }
30
+ let response = NextResponse.next();
31
+ applyHeaders(response, securityHeaders);
32
+ if (config?.after) {
33
+ response = await config.after(request, response);
34
+ }
35
+ return response;
36
+ };
37
+ }
38
+ function applyHeaders(response, headers) {
39
+ for (const [key, value] of Object.entries(headers)) {
40
+ response.headers.set(key, value);
41
+ }
42
+ }
43
+ var siteKitMatcher = {
44
+ matcher: [
45
+ "/((?!_next/static|_next/image|favicon\\.ico|.*\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)"
46
+ ]
47
+ };
48
+
49
+ export { createMiddleware, siteKitMatcher };
50
+ //# sourceMappingURL=index.mjs.map
51
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;;;;AAmEO,SAAS,iBAAiB,MAAA,EAAkC;AACjE,EAAA,MAAM,eAAA,GAAkB,oBAAA;AAAA,IACtB,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,OAAO,eAAe,WACpB,OAAA,EACuB;AAEvB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACjD,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,YAAA,CAAa,eAAe,eAAe,CAAA;AAC3C,QAAA,OAAO,aAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ,cAAc,KAAA,EAAO;AAC/B,MAAA,MAAM,iBACJ,OAAO,MAAA,EAAQ,cAAc,QAAA,GACzB,MAAA,CAAO,YACP,EAAC;AAEP,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,YAAA,CAAa,UAAU,eAAe,CAAA;AACtC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,GAAW,aAAa,IAAA,EAAK;AAGjC,IAAA,YAAA,CAAa,UAAU,eAAe,CAAA;AAGtC,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AACF;AAEA,SAAS,YAAA,CACP,UACA,OAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACjC;AACF;AAMO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS;AAAA,IACP;AAAA;AAEJ","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/middleware\n *\n * Composable Next.js middleware factory. Handles:\n * - Portal-managed redirects (via existing handleManagedRedirects)\n * - Security headers (X-Frame-Options, CSP, etc.)\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // middleware.ts — entire file\n * import { createMiddleware, siteKitMatcher } from '@sonordev/site-kit/middleware'\n *\n * export default createMiddleware()\n * export const config = siteKitMatcher\n * ```\n *\n * @example With custom hooks:\n * ```ts\n * export default createMiddleware({\n * securityHeaders: { frameOptions: 'SAMEORIGIN' },\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\n\nexport interface SiteKitMiddlewareConfig {\n /** Enable Portal-managed redirects. Default: true */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js middleware function.\n *\n * With zero config this handles redirects + security headers automatically.\n */\nexport function createMiddleware(config?: SiteKitMiddlewareConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n return async function middleware(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response\n let response = NextResponse.next()\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * Standard matcher config that excludes static assets and images.\n * Export alongside createMiddleware in your middleware.ts.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { migrateAnalytics, migrateFAQ, migrateFile, migrateFiles, migrateMetadata, migrateSchema, migrateSitemap } from './chunk-24277A3Q.mjs';
2
+ import './chunk-4XPGGLVP.mjs';
3
+ //# sourceMappingURL=migrator-2MQHOFDQ.mjs.map
4
+ //# sourceMappingURL=migrator-2MQHOFDQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"migrator-2MQHOFDQ.mjs"}
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ var chunk7FUV73JZ_js = require('./chunk-7FUV73JZ.js');
4
+ require('./chunk-ZSMWDLMK.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "migrateAnalytics", {
9
+ enumerable: true,
10
+ get: function () { return chunk7FUV73JZ_js.migrateAnalytics; }
11
+ });
12
+ Object.defineProperty(exports, "migrateFAQ", {
13
+ enumerable: true,
14
+ get: function () { return chunk7FUV73JZ_js.migrateFAQ; }
15
+ });
16
+ Object.defineProperty(exports, "migrateFile", {
17
+ enumerable: true,
18
+ get: function () { return chunk7FUV73JZ_js.migrateFile; }
19
+ });
20
+ Object.defineProperty(exports, "migrateFiles", {
21
+ enumerable: true,
22
+ get: function () { return chunk7FUV73JZ_js.migrateFiles; }
23
+ });
24
+ Object.defineProperty(exports, "migrateMetadata", {
25
+ enumerable: true,
26
+ get: function () { return chunk7FUV73JZ_js.migrateMetadata; }
27
+ });
28
+ Object.defineProperty(exports, "migrateSchema", {
29
+ enumerable: true,
30
+ get: function () { return chunk7FUV73JZ_js.migrateSchema; }
31
+ });
32
+ Object.defineProperty(exports, "migrateSitemap", {
33
+ enumerable: true,
34
+ get: function () { return chunk7FUV73JZ_js.migrateSitemap; }
35
+ });
36
+ //# sourceMappingURL=migrator-THJCF6MZ.js.map
37
+ //# sourceMappingURL=migrator-THJCF6MZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"migrator-THJCF6MZ.js"}
@@ -0,0 +1,78 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ /**
4
+ * Managed Redirects - Next.js Middleware Helper
5
+ *
6
+ * Fetches redirect rules from Portal and applies them.
7
+ * Supports API key only (domain resolved from Portal) or domain-based lookup.
8
+ *
9
+ * Usage in middleware.ts (API key only):
10
+ *
11
+ * import { handleManagedRedirects } from '@sonordev/site-kit/redirects'
12
+ *
13
+ * export async function middleware(request: NextRequest) {
14
+ * const redirect = await handleManagedRedirects(request, {
15
+ * apiKey: process.env.NEXT_PUBLIC_UPTRADE_API_KEY,
16
+ * portalApiUrl: process.env.NEXT_PUBLIC_UPTRADE_API_URL,
17
+ * })
18
+ * if (redirect) return redirect
19
+ * return NextResponse.next()
20
+ * }
21
+ *
22
+ * Or with domain (legacy):
23
+ * const redirect = await handleManagedRedirects(request, { domain: 'example.com' })
24
+ */
25
+
26
+ interface RedirectRule {
27
+ from_path: string;
28
+ to_path: string;
29
+ redirect_type: '301' | '302' | '307' | '308';
30
+ is_enabled: boolean;
31
+ }
32
+ interface RedirectConfig {
33
+ /** Domain to fetch redirects for (optional when apiKey is set) */
34
+ domain?: string;
35
+ /** Project API key; when set, redirects are fetched by key (no domain needed) */
36
+ apiKey?: string;
37
+ portalApiUrl?: string;
38
+ cacheSeconds?: number;
39
+ }
40
+ /**
41
+ * Fetch redirect rules from Portal API.
42
+ * When apiKey is set (or from env), uses key-based endpoint (no domain required).
43
+ * Otherwise uses domain query (or domain from getSiteConfig when only env API key is set).
44
+ */
45
+ declare function fetchRedirectRules(config: RedirectConfig): Promise<RedirectRule[]>;
46
+ /**
47
+ * Handle managed redirects in middleware
48
+ * Returns a NextResponse.redirect if a match is found, otherwise undefined
49
+ */
50
+ declare function handleManagedRedirects(request: NextRequest, config: RedirectConfig): Promise<NextResponse | undefined>;
51
+ /**
52
+ * Generate Next.js redirects config from Portal
53
+ * Use this in next.config.js for build-time redirects
54
+ *
55
+ * Usage in next.config.js:
56
+ *
57
+ * const { generateNextRedirects } = require('@sonordev/site-kit/redirects')
58
+ *
59
+ * module.exports = {
60
+ * async redirects() {
61
+ * return generateNextRedirects({
62
+ * domain: 'example.com',
63
+ * portalApiUrl: process.env.PORTAL_API_URL,
64
+ * })
65
+ * }
66
+ * }
67
+ */
68
+ declare function generateNextRedirects(config: RedirectConfig): Promise<Array<{
69
+ source: string;
70
+ destination: string;
71
+ permanent: boolean;
72
+ }>>;
73
+ /**
74
+ * Clear redirect cache (useful for development)
75
+ */
76
+ declare function clearRedirectCache(): void;
77
+
78
+ export { type RedirectConfig, type RedirectRule, clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects };
@@ -0,0 +1,78 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ /**
4
+ * Managed Redirects - Next.js Middleware Helper
5
+ *
6
+ * Fetches redirect rules from Portal and applies them.
7
+ * Supports API key only (domain resolved from Portal) or domain-based lookup.
8
+ *
9
+ * Usage in middleware.ts (API key only):
10
+ *
11
+ * import { handleManagedRedirects } from '@sonordev/site-kit/redirects'
12
+ *
13
+ * export async function middleware(request: NextRequest) {
14
+ * const redirect = await handleManagedRedirects(request, {
15
+ * apiKey: process.env.NEXT_PUBLIC_UPTRADE_API_KEY,
16
+ * portalApiUrl: process.env.NEXT_PUBLIC_UPTRADE_API_URL,
17
+ * })
18
+ * if (redirect) return redirect
19
+ * return NextResponse.next()
20
+ * }
21
+ *
22
+ * Or with domain (legacy):
23
+ * const redirect = await handleManagedRedirects(request, { domain: 'example.com' })
24
+ */
25
+
26
+ interface RedirectRule {
27
+ from_path: string;
28
+ to_path: string;
29
+ redirect_type: '301' | '302' | '307' | '308';
30
+ is_enabled: boolean;
31
+ }
32
+ interface RedirectConfig {
33
+ /** Domain to fetch redirects for (optional when apiKey is set) */
34
+ domain?: string;
35
+ /** Project API key; when set, redirects are fetched by key (no domain needed) */
36
+ apiKey?: string;
37
+ portalApiUrl?: string;
38
+ cacheSeconds?: number;
39
+ }
40
+ /**
41
+ * Fetch redirect rules from Portal API.
42
+ * When apiKey is set (or from env), uses key-based endpoint (no domain required).
43
+ * Otherwise uses domain query (or domain from getSiteConfig when only env API key is set).
44
+ */
45
+ declare function fetchRedirectRules(config: RedirectConfig): Promise<RedirectRule[]>;
46
+ /**
47
+ * Handle managed redirects in middleware
48
+ * Returns a NextResponse.redirect if a match is found, otherwise undefined
49
+ */
50
+ declare function handleManagedRedirects(request: NextRequest, config: RedirectConfig): Promise<NextResponse | undefined>;
51
+ /**
52
+ * Generate Next.js redirects config from Portal
53
+ * Use this in next.config.js for build-time redirects
54
+ *
55
+ * Usage in next.config.js:
56
+ *
57
+ * const { generateNextRedirects } = require('@sonordev/site-kit/redirects')
58
+ *
59
+ * module.exports = {
60
+ * async redirects() {
61
+ * return generateNextRedirects({
62
+ * domain: 'example.com',
63
+ * portalApiUrl: process.env.PORTAL_API_URL,
64
+ * })
65
+ * }
66
+ * }
67
+ */
68
+ declare function generateNextRedirects(config: RedirectConfig): Promise<Array<{
69
+ source: string;
70
+ destination: string;
71
+ permanent: boolean;
72
+ }>>;
73
+ /**
74
+ * Clear redirect cache (useful for development)
75
+ */
76
+ declare function clearRedirectCache(): void;
77
+
78
+ export { type RedirectConfig, type RedirectRule, clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects };
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var chunkLBVWVP72_js = require('../chunk-LBVWVP72.js');
4
+ require('../chunk-7557OTHW.js');
5
+ require('../chunk-ZSMWDLMK.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "clearRedirectCache", {
10
+ enumerable: true,
11
+ get: function () { return chunkLBVWVP72_js.clearRedirectCache; }
12
+ });
13
+ Object.defineProperty(exports, "fetchRedirectRules", {
14
+ enumerable: true,
15
+ get: function () { return chunkLBVWVP72_js.fetchRedirectRules; }
16
+ });
17
+ Object.defineProperty(exports, "generateNextRedirects", {
18
+ enumerable: true,
19
+ get: function () { return chunkLBVWVP72_js.generateNextRedirects; }
20
+ });
21
+ Object.defineProperty(exports, "handleManagedRedirects", {
22
+ enumerable: true,
23
+ get: function () { return chunkLBVWVP72_js.handleManagedRedirects; }
24
+ });
25
+ //# sourceMappingURL=index.js.map
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,5 @@
1
+ export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from '../chunk-QXV4667R.mjs';
2
+ import '../chunk-GCJXQ4AG.mjs';
3
+ import '../chunk-4XPGGLVP.mjs';
4
+ //# sourceMappingURL=index.mjs.map
5
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,57 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * @sonordev/site-kit/reputation - Type Definitions
5
+ */
6
+ interface Review {
7
+ id: string;
8
+ quote: string;
9
+ name: string;
10
+ role?: string;
11
+ rating: number;
12
+ image?: string;
13
+ date?: string;
14
+ platform?: string;
15
+ isFeatured?: boolean;
16
+ serviceTags?: string[];
17
+ }
18
+ interface ReviewStats {
19
+ total_reviews: number;
20
+ average_rating: number;
21
+ distribution: {
22
+ 1: number;
23
+ 2: number;
24
+ 3: number;
25
+ 4: number;
26
+ 5: number;
27
+ };
28
+ }
29
+ interface TestimonialSectionProps {
30
+ title?: string;
31
+ subtitle?: string;
32
+ autoplay?: boolean;
33
+ autoplayInterval?: number;
34
+ showRating?: boolean;
35
+ maxReviews?: number;
36
+ featuredOnly?: boolean;
37
+ service?: string;
38
+ className?: string;
39
+ }
40
+
41
+ declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): react_jsx_runtime.JSX.Element | null;
42
+
43
+ /**
44
+ * @sonordev/site-kit/reputation - API Functions
45
+ *
46
+ * Fetch reviews and stats from Portal API public endpoint
47
+ */
48
+
49
+ interface FetchReviewsOptions {
50
+ service?: string;
51
+ limit?: number;
52
+ featured?: boolean;
53
+ }
54
+ declare function fetchReviews(options?: FetchReviewsOptions): Promise<Review[]>;
55
+ declare function fetchReviewStats(): Promise<ReviewStats | null>;
56
+
57
+ export { type Review, type ReviewStats, TestimonialSection, type TestimonialSectionProps, fetchReviewStats, fetchReviews };
@@ -0,0 +1,57 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * @sonordev/site-kit/reputation - Type Definitions
5
+ */
6
+ interface Review {
7
+ id: string;
8
+ quote: string;
9
+ name: string;
10
+ role?: string;
11
+ rating: number;
12
+ image?: string;
13
+ date?: string;
14
+ platform?: string;
15
+ isFeatured?: boolean;
16
+ serviceTags?: string[];
17
+ }
18
+ interface ReviewStats {
19
+ total_reviews: number;
20
+ average_rating: number;
21
+ distribution: {
22
+ 1: number;
23
+ 2: number;
24
+ 3: number;
25
+ 4: number;
26
+ 5: number;
27
+ };
28
+ }
29
+ interface TestimonialSectionProps {
30
+ title?: string;
31
+ subtitle?: string;
32
+ autoplay?: boolean;
33
+ autoplayInterval?: number;
34
+ showRating?: boolean;
35
+ maxReviews?: number;
36
+ featuredOnly?: boolean;
37
+ service?: string;
38
+ className?: string;
39
+ }
40
+
41
+ declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): react_jsx_runtime.JSX.Element | null;
42
+
43
+ /**
44
+ * @sonordev/site-kit/reputation - API Functions
45
+ *
46
+ * Fetch reviews and stats from Portal API public endpoint
47
+ */
48
+
49
+ interface FetchReviewsOptions {
50
+ service?: string;
51
+ limit?: number;
52
+ featured?: boolean;
53
+ }
54
+ declare function fetchReviews(options?: FetchReviewsOptions): Promise<Review[]>;
55
+ declare function fetchReviewStats(): Promise<ReviewStats | null>;
56
+
57
+ export { type Review, type ReviewStats, TestimonialSection, type TestimonialSectionProps, fetchReviewStats, fetchReviews };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunk43GBM4SX_js = require('../chunk-43GBM4SX.js');
4
+ require('../chunk-ZSMWDLMK.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "TestimonialSection", {
9
+ enumerable: true,
10
+ get: function () { return chunk43GBM4SX_js.TestimonialSection; }
11
+ });
12
+ Object.defineProperty(exports, "fetchReviewStats", {
13
+ enumerable: true,
14
+ get: function () { return chunk43GBM4SX_js.fetchReviewStats; }
15
+ });
16
+ Object.defineProperty(exports, "fetchReviews", {
17
+ enumerable: true,
18
+ get: function () { return chunk43GBM4SX_js.fetchReviews; }
19
+ });
20
+ //# sourceMappingURL=index.js.map
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { TestimonialSection, fetchReviewStats, fetchReviews } from '../chunk-UWE5PCYJ.mjs';
2
+ import '../chunk-4XPGGLVP.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @sonordev/site-kit/robots - robots.txt Generator
3
+ *
4
+ * Generates robots.txt with Sitemap directive.
5
+ * baseUrl can be omitted when apiKey is set (resolved from Portal project-info).
6
+ *
7
+ * @example
8
+ * // app/robots.txt/route.ts (API key only)
9
+ * import { createRobots } from '@sonordev/site-kit/robots'
10
+ * export const GET = createRobots({ apiKey: process.env.NEXT_PUBLIC_UPTRADE_API_KEY })
11
+ *
12
+ * @example
13
+ * // With explicit baseUrl
14
+ * export const GET = createRobots({
15
+ * baseUrl: process.env.NEXT_PUBLIC_SITE_URL || 'https://example.com',
16
+ * disallow: ['/admin'],
17
+ * })
18
+ */
19
+ interface RobotsConfig {
20
+ /** Base URL of the site (optional when apiKey is set; then resolved from Portal) */
21
+ baseUrl?: string;
22
+ /** Project API key; when set and baseUrl is not, baseUrl is resolved from Portal */
23
+ apiKey?: string;
24
+ apiUrl?: string;
25
+ /** Path to sitemap (default: /sitemap.xml) */
26
+ sitemapPath?: string;
27
+ /** Pre-built robots content from Portal (overrides default when provided) */
28
+ managedRobots?: string | null;
29
+ /** Paths to disallow (e.g. ['/admin', '/api']) */
30
+ disallow?: string[];
31
+ }
32
+ /**
33
+ * Create a robots.txt handler that returns a Response or Promise<Response>.
34
+ * Use as GET handler for app/robots.txt/route.ts. When baseUrl is omitted, pass apiKey to resolve from Portal.
35
+ */
36
+ declare function createRobots(config: RobotsConfig): () => Response | Promise<Response>;
37
+
38
+ export { type RobotsConfig, createRobots };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @sonordev/site-kit/robots - robots.txt Generator
3
+ *
4
+ * Generates robots.txt with Sitemap directive.
5
+ * baseUrl can be omitted when apiKey is set (resolved from Portal project-info).
6
+ *
7
+ * @example
8
+ * // app/robots.txt/route.ts (API key only)
9
+ * import { createRobots } from '@sonordev/site-kit/robots'
10
+ * export const GET = createRobots({ apiKey: process.env.NEXT_PUBLIC_UPTRADE_API_KEY })
11
+ *
12
+ * @example
13
+ * // With explicit baseUrl
14
+ * export const GET = createRobots({
15
+ * baseUrl: process.env.NEXT_PUBLIC_SITE_URL || 'https://example.com',
16
+ * disallow: ['/admin'],
17
+ * })
18
+ */
19
+ interface RobotsConfig {
20
+ /** Base URL of the site (optional when apiKey is set; then resolved from Portal) */
21
+ baseUrl?: string;
22
+ /** Project API key; when set and baseUrl is not, baseUrl is resolved from Portal */
23
+ apiKey?: string;
24
+ apiUrl?: string;
25
+ /** Path to sitemap (default: /sitemap.xml) */
26
+ sitemapPath?: string;
27
+ /** Pre-built robots content from Portal (overrides default when provided) */
28
+ managedRobots?: string | null;
29
+ /** Paths to disallow (e.g. ['/admin', '/api']) */
30
+ disallow?: string[];
31
+ }
32
+ /**
33
+ * Create a robots.txt handler that returns a Response or Promise<Response>.
34
+ * Use as GET handler for app/robots.txt/route.ts. When baseUrl is omitted, pass apiKey to resolve from Portal.
35
+ */
36
+ declare function createRobots(config: RobotsConfig): () => Response | Promise<Response>;
37
+
38
+ export { type RobotsConfig, createRobots };
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ var chunk7557OTHW_js = require('../chunk-7557OTHW.js');
4
+ require('../chunk-ZSMWDLMK.js');
5
+
6
+ // src/robots/index.ts
7
+ function buildRobotsResponse(baseUrl, config) {
8
+ const lines = [];
9
+ if (config.managedRobots?.trim()) {
10
+ lines.push(config.managedRobots.trim());
11
+ } else {
12
+ lines.push("User-agent: *");
13
+ lines.push("Allow: /");
14
+ for (const p of config.disallow ?? []) {
15
+ lines.push(`Disallow: ${p}`);
16
+ }
17
+ }
18
+ const base = baseUrl.replace(/\/$/, "");
19
+ const sitemapPath = config.sitemapPath ?? "/sitemap.xml";
20
+ const sitemapUrl = `${base}${sitemapPath.startsWith("/") ? "" : "/"}${sitemapPath}`;
21
+ lines.push(`Sitemap: ${sitemapUrl}`);
22
+ return new Response(lines.join("\n"), {
23
+ status: 200,
24
+ headers: {
25
+ "Content-Type": "text/plain; charset=utf-8",
26
+ "Cache-Control": "public, max-age=86400, s-maxage=86400"
27
+ }
28
+ });
29
+ }
30
+ function createRobots(config) {
31
+ return function robots() {
32
+ const baseUrl = config.baseUrl;
33
+ if (baseUrl) {
34
+ return buildRobotsResponse(baseUrl, config);
35
+ }
36
+ const apiKey = config.apiKey ?? (typeof process !== "undefined" && process.env && (process.env.NEXT_PUBLIC_UPTRADE_API_KEY || process.env.UPTRADE_API_KEY));
37
+ if (!apiKey) {
38
+ return new Response("User-agent: *\nDisallow: /", {
39
+ status: 200,
40
+ headers: { "Content-Type": "text/plain; charset=utf-8" }
41
+ });
42
+ }
43
+ return chunk7557OTHW_js.getSiteConfig({ apiKey, apiUrl: config.apiUrl }).then((site) => {
44
+ const url = site?.site_url ?? "https://example.com";
45
+ return buildRobotsResponse(url, config);
46
+ });
47
+ };
48
+ }
49
+
50
+ exports.createRobots = createRobots;
51
+ //# sourceMappingURL=index.js.map
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/robots/index.ts"],"names":["getSiteConfig"],"mappings":";;;;;;AAmCA,SAAS,mBAAA,CAAoB,SAAiB,MAAA,EAAgC;AAC5E,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,MAAA,CAAO,aAAA,EAAe,IAAA,EAAK,EAAG;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,EAAM,CAAA;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,cAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,IAAI,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AACjF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,CAAE,CAAA;AAEnC,EAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,IACpC,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,2BAAA;AAAA,MAChB,eAAA,EAAiB;AAAA;AACnB,GACD,CAAA;AACH;AAMO,SAAS,aAAa,MAAA,EAA0D;AACrF,EAAA,OAAO,SAAS,MAAA,GAAuC;AACrD,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAAA,IAC5C;AACA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,KAAW,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,KAAQ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IAA+B,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAA,CAAA;AAC1I,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAI,SAAS,4BAAA,EAA8B;AAAA,QAChD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,2BAAA;AAA4B,OACxD,CAAA;AAAA,IACH;AACA,IAAA,OAAOA,8BAAA,CAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AACrE,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,IAAY,qBAAA;AAC9B,MAAA,OAAO,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH,CAAA;AACF","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/robots - robots.txt Generator\n *\n * Generates robots.txt with Sitemap directive.\n * baseUrl can be omitted when apiKey is set (resolved from Portal project-info).\n *\n * @example\n * // app/robots.txt/route.ts (API key only)\n * import { createRobots } from '@sonordev/site-kit/robots'\n * export const GET = createRobots({ apiKey: process.env.NEXT_PUBLIC_UPTRADE_API_KEY })\n *\n * @example\n * // With explicit baseUrl\n * export const GET = createRobots({\n * baseUrl: process.env.NEXT_PUBLIC_SITE_URL || 'https://example.com',\n * disallow: ['/admin'],\n * })\n */\n\nimport { getSiteConfig } from '../site-config'\n\nexport interface RobotsConfig {\n /** Base URL of the site (optional when apiKey is set; then resolved from Portal) */\n baseUrl?: string\n /** Project API key; when set and baseUrl is not, baseUrl is resolved from Portal */\n apiKey?: string\n apiUrl?: string\n /** Path to sitemap (default: /sitemap.xml) */\n sitemapPath?: string\n /** Pre-built robots content from Portal (overrides default when provided) */\n managedRobots?: string | null\n /** Paths to disallow (e.g. ['/admin', '/api']) */\n disallow?: string[]\n}\n\nfunction buildRobotsResponse(baseUrl: string, config: RobotsConfig): Response {\n const lines: string[] = []\n\n if (config.managedRobots?.trim()) {\n lines.push(config.managedRobots.trim())\n } else {\n lines.push('User-agent: *')\n lines.push('Allow: /')\n for (const p of config.disallow ?? []) {\n lines.push(`Disallow: ${p}`)\n }\n }\n\n const base = baseUrl.replace(/\\/$/, '')\n const sitemapPath = config.sitemapPath ?? '/sitemap.xml'\n const sitemapUrl = `${base}${sitemapPath.startsWith('/') ? '' : '/'}${sitemapPath}`\n lines.push(`Sitemap: ${sitemapUrl}`)\n\n return new Response(lines.join('\\n'), {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=86400, s-maxage=86400',\n },\n })\n}\n\n/**\n * Create a robots.txt handler that returns a Response or Promise<Response>.\n * Use as GET handler for app/robots.txt/route.ts. When baseUrl is omitted, pass apiKey to resolve from Portal.\n */\nexport function createRobots(config: RobotsConfig): () => Response | Promise<Response> {\n return function robots(): Response | Promise<Response> {\n const baseUrl = config.baseUrl\n if (baseUrl) {\n return buildRobotsResponse(baseUrl, config)\n }\n const apiKey = config.apiKey ?? (typeof process !== 'undefined' && process.env && (process.env.NEXT_PUBLIC_UPTRADE_API_KEY || process.env.UPTRADE_API_KEY))\n if (!apiKey) {\n return new Response('User-agent: *\\nDisallow: /', {\n status: 200,\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n })\n }\n return getSiteConfig({ apiKey, apiUrl: config.apiUrl }).then((site) => {\n const url = site?.site_url ?? 'https://example.com'\n return buildRobotsResponse(url, config)\n })\n }\n}\n"]}
@@ -0,0 +1,50 @@
1
+ import { getSiteConfig } from '../chunk-GCJXQ4AG.mjs';
2
+ import '../chunk-4XPGGLVP.mjs';
3
+
4
+ // src/robots/index.ts
5
+ function buildRobotsResponse(baseUrl, config) {
6
+ const lines = [];
7
+ if (config.managedRobots?.trim()) {
8
+ lines.push(config.managedRobots.trim());
9
+ } else {
10
+ lines.push("User-agent: *");
11
+ lines.push("Allow: /");
12
+ for (const p of config.disallow ?? []) {
13
+ lines.push(`Disallow: ${p}`);
14
+ }
15
+ }
16
+ const base = baseUrl.replace(/\/$/, "");
17
+ const sitemapPath = config.sitemapPath ?? "/sitemap.xml";
18
+ const sitemapUrl = `${base}${sitemapPath.startsWith("/") ? "" : "/"}${sitemapPath}`;
19
+ lines.push(`Sitemap: ${sitemapUrl}`);
20
+ return new Response(lines.join("\n"), {
21
+ status: 200,
22
+ headers: {
23
+ "Content-Type": "text/plain; charset=utf-8",
24
+ "Cache-Control": "public, max-age=86400, s-maxage=86400"
25
+ }
26
+ });
27
+ }
28
+ function createRobots(config) {
29
+ return function robots() {
30
+ const baseUrl = config.baseUrl;
31
+ if (baseUrl) {
32
+ return buildRobotsResponse(baseUrl, config);
33
+ }
34
+ const apiKey = config.apiKey ?? (typeof process !== "undefined" && process.env && (process.env.NEXT_PUBLIC_UPTRADE_API_KEY || process.env.UPTRADE_API_KEY));
35
+ if (!apiKey) {
36
+ return new Response("User-agent: *\nDisallow: /", {
37
+ status: 200,
38
+ headers: { "Content-Type": "text/plain; charset=utf-8" }
39
+ });
40
+ }
41
+ return getSiteConfig({ apiKey, apiUrl: config.apiUrl }).then((site) => {
42
+ const url = site?.site_url ?? "https://example.com";
43
+ return buildRobotsResponse(url, config);
44
+ });
45
+ };
46
+ }
47
+
48
+ export { createRobots };
49
+ //# sourceMappingURL=index.mjs.map
50
+ //# sourceMappingURL=index.mjs.map