@strivacity/sdk-next 3.0.2 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1983 -428
  3. package/dist/client/components.cjs +1 -0
  4. package/dist/client/components.d.ts +1 -0
  5. package/dist/client/components.mjs +1 -0
  6. package/dist/client/hooks.cjs +1 -0
  7. package/dist/client/hooks.d.ts +1 -0
  8. package/dist/client/hooks.mjs +1 -0
  9. package/dist/client/index.cjs +1 -0
  10. package/dist/client/index.d.ts +9 -0
  11. package/dist/client/index.mjs +1 -0
  12. package/dist/client/storages.cjs +1 -0
  13. package/dist/client/storages.d.ts +1 -0
  14. package/dist/client/storages.mjs +1 -0
  15. package/dist/client/types.cjs +1 -0
  16. package/dist/client/types.d.ts +1 -0
  17. package/dist/client/types.mjs +1 -0
  18. package/dist/client/utils.cjs +1 -0
  19. package/dist/client/utils.d.ts +1 -0
  20. package/dist/client/utils.mjs +1 -0
  21. package/dist/errors.cjs +1 -0
  22. package/dist/errors.d.ts +1 -0
  23. package/dist/errors.mjs +1 -0
  24. package/dist/server/handlers/api.cjs +2 -0
  25. package/dist/server/handlers/api.cjs.map +1 -0
  26. package/dist/server/handlers/api.d.ts +4 -0
  27. package/dist/server/handlers/api.mjs +2 -0
  28. package/dist/server/handlers/api.mjs.map +1 -0
  29. package/dist/server/handlers/route.cjs +2 -0
  30. package/dist/server/handlers/route.cjs.map +1 -0
  31. package/dist/server/handlers/route.d.ts +4 -0
  32. package/dist/server/handlers/route.mjs +2 -0
  33. package/dist/server/handlers/route.mjs.map +1 -0
  34. package/dist/server/index.cjs +1 -0
  35. package/dist/server/index.d.ts +8 -0
  36. package/dist/server/index.mjs +1 -0
  37. package/dist/server/sdk.cjs +2 -0
  38. package/dist/server/sdk.cjs.map +1 -0
  39. package/dist/server/sdk.d.ts +8 -0
  40. package/dist/server/sdk.mjs +2 -0
  41. package/dist/server/sdk.mjs.map +1 -0
  42. package/dist/server/storages.cjs +2 -0
  43. package/dist/server/storages.cjs.map +1 -0
  44. package/dist/server/storages.d.ts +20 -0
  45. package/dist/server/storages.mjs +2 -0
  46. package/dist/server/storages.mjs.map +1 -0
  47. package/dist/server/types.cjs +1 -0
  48. package/dist/server/types.d.ts +101 -0
  49. package/dist/server/types.mjs +1 -0
  50. package/dist/server/utils.cjs +2 -0
  51. package/dist/server/utils.cjs.map +1 -0
  52. package/dist/server/utils.d.ts +28 -0
  53. package/dist/server/utils.mjs +2 -0
  54. package/dist/server/utils.mjs.map +1 -0
  55. package/dist/types.cjs +1 -2
  56. package/dist/types.d.ts +2 -176
  57. package/dist/types.mjs +1 -2
  58. package/package.json +48 -10
  59. package/testing/tests/client/components.spec.ts +10 -0
  60. package/testing/tests/client/hooks.spec.ts +10 -0
  61. package/testing/tests/client/index.spec.ts +106 -0
  62. package/testing/tests/client/storages.spec.ts +10 -0
  63. package/testing/tests/client/utils.spec.ts +10 -0
  64. package/testing/tests/server/handlers/api.spec.ts +110 -0
  65. package/testing/tests/server/handlers/route.spec.ts +173 -0
  66. package/testing/tests/server/index.spec.ts +103 -0
  67. package/testing/tests/server/sdk.spec.ts +250 -0
  68. package/testing/tests/server/storages.spec.ts +353 -0
  69. package/testing/tests/server/utils.spec.ts +110 -0
  70. package/dist/AuthProvider.cjs +0 -2
  71. package/dist/AuthProvider.cjs.map +0 -1
  72. package/dist/AuthProvider.d.ts +0 -7
  73. package/dist/AuthProvider.mjs +0 -2
  74. package/dist/AuthProvider.mjs.map +0 -1
  75. package/dist/LoginRenderer.cjs +0 -2
  76. package/dist/LoginRenderer.cjs.map +0 -1
  77. package/dist/LoginRenderer.d.ts +0 -20
  78. package/dist/LoginRenderer.mjs +0 -2
  79. package/dist/LoginRenderer.mjs.map +0 -1
  80. package/dist/composables.cjs +0 -2
  81. package/dist/composables.cjs.map +0 -1
  82. package/dist/composables.d.ts +0 -12
  83. package/dist/composables.mjs +0 -2
  84. package/dist/composables.mjs.map +0 -1
  85. package/dist/index.cjs +0 -2
  86. package/dist/index.cjs.map +0 -1
  87. package/dist/index.d.ts +0 -13
  88. package/dist/index.mjs +0 -2
  89. package/dist/index.mjs.map +0 -1
  90. package/dist/types.cjs.map +0 -1
  91. package/dist/types.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-react/components");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-react/components';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-react/components";
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-react/hooks");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-react/hooks';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-react/hooks";
@@ -0,0 +1 @@
1
+ require("../errors.cjs"),require("./types.cjs"),require("./components.cjs"),require("./hooks.cjs"),require("./storages.cjs"),require("./utils.cjs");var e=require("@strivacity/sdk-core/flows");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});var t=require("@strivacity/sdk-core/handlers");Object.keys(t).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})});var n=require("@strivacity/sdk-core/utils");Object.keys(n).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return n[e]}})});var r=require("@strivacity/sdk-core/utils/errors");Object.keys(r).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return r[e]}})});var i=require("@strivacity/sdk-react/types");Object.keys(i).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return i[e]}})});var a=require("@strivacity/sdk-react/storages");Object.keys(a).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return a[e]}})});var o=require("@strivacity/sdk-react/components");Object.keys(o).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return o[e]}})});var s=require("@strivacity/sdk-react/hooks");Object.keys(s).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return s[e]}})});var c=require("@strivacity/sdk-react/utils");Object.keys(c).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return c[e]}})});
@@ -0,0 +1,9 @@
1
+ export * from '@strivacity/sdk-core/flows';
2
+ export * from '@strivacity/sdk-core/handlers';
3
+ export * from '@strivacity/sdk-core/utils';
4
+ export * from '../errors';
5
+ export * from './components';
6
+ export * from './hooks';
7
+ export * from './storages';
8
+ export * from './types';
9
+ export * from './utils';
@@ -0,0 +1 @@
1
+ import"../errors.mjs";import"./types.mjs";import"./components.mjs";import"./hooks.mjs";import"./storages.mjs";import"./utils.mjs";export*from"@strivacity/sdk-core/utils/errors";export*from"@strivacity/sdk-react/types";export*from"@strivacity/sdk-core/flows";export*from"@strivacity/sdk-core/handlers";export*from"@strivacity/sdk-core/utils";export*from"@strivacity/sdk-react/storages";export*from"@strivacity/sdk-react/components";export*from"@strivacity/sdk-react/hooks";export*from"@strivacity/sdk-react/utils";
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-react/storages");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-react/storages';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-react/storages";
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-react/types");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-react/types';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-react/types";
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-react/utils");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-react/utils';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-react/utils";
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-core/utils/errors");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1 @@
1
+ export * from '@strivacity/sdk-core/utils/errors';
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-core/utils/errors";
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils.cjs");let t=require("next/server");var n=n=>r=>async(i,a)=>{let o=i instanceof Request?e.toNextRequest(i):i;if(!await n.getSession(o))return t.NextResponse.json({error:`not_authenticated`,description:`The user does not have an active session or is not authenticated`},{status:401});let s=await r(o,a);return s instanceof t.NextResponse?s:new t.NextResponse(s.body,s)},r=e=>t=>async(n,r)=>{if(!await e.getSession(n))return r.status(401).json({error:`not_authenticated`,description:`The user does not have an active session or is not authenticated`});await t(n,r)};exports.apiAppRouteHandlerFactory=n,exports.apiPageRouteHandlerFactory=r;
2
+ //# sourceMappingURL=api.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.cjs","names":[],"sources":["../../../src/server/handlers/api.ts"],"sourcesContent":["import type { BaseServerSDK, PagesRouterRequest, WithApiAuthRequiredAppRoute, WithApiAuthRequiredPageRoute } from '../types';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { toNextRequest } from '../utils';\n\nexport const apiAppRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithApiAuthRequiredAppRoute =>\n\t(apiRoute) =>\n\tasync (req: NextRequest | Request, params): Promise<NextResponse> => {\n\t\tconst nextReq = req instanceof Request ? toNextRequest(req) : req;\n\n\t\tconst session = await sdk.getSession(nextReq);\n\n\t\tif (!session) {\n\t\t\treturn NextResponse.json(\n\t\t\t\t{\n\t\t\t\t\terror: 'not_authenticated',\n\t\t\t\t\tdescription: 'The user does not have an active session or is not authenticated',\n\t\t\t\t},\n\t\t\t\t{ status: 401 },\n\t\t\t);\n\t\t}\n\n\t\tconst apiRes: NextResponse | Response = await apiRoute(nextReq, params);\n\t\tconst nextApiRes: NextResponse = apiRes instanceof NextResponse ? apiRes : new NextResponse(apiRes.body, apiRes);\n\n\t\treturn nextApiRes;\n\t};\n\nexport const apiPageRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithApiAuthRequiredPageRoute =>\n\t(apiRoute) =>\n\tasync (req, res) => {\n\t\tconst session = await sdk.getSession(req);\n\n\t\tif (!session) {\n\t\t\treturn res.status(401).json({\n\t\t\t\terror: 'not_authenticated',\n\t\t\t\tdescription: 'The user does not have an active session or is not authenticated',\n\t\t\t});\n\t\t}\n\n\t\tawait apiRoute(req, res);\n\t};\n"],"mappings":"gIAIA,IAAa,EACX,GACA,GACD,MAAO,EAA4B,IAAkC,CACpE,IAAM,EAAU,aAAe,QAAU,EAAA,cAAc,CAAG,EAAI,EAI9D,GAAI,CAAC,MAFiB,EAAI,WAAW,CAAO,EAG3C,OAAO,EAAA,aAAa,KACnB,CACC,MAAO,oBACP,YAAa,kEACd,EACA,CAAE,OAAQ,GAAI,CACf,EAGD,IAAM,EAAkC,MAAM,EAAS,EAAS,CAAM,EAGtE,OAFiC,aAAkB,EAAA,aAAe,EAAS,IAAI,EAAA,aAAa,EAAO,KAAM,CAAM,CAGhH,EAEY,EACX,GACA,GACD,MAAO,EAAK,IAAQ,CAGnB,GAAI,CAAC,MAFiB,EAAI,WAAW,CAAG,EAGvC,OAAO,EAAI,OAAO,GAAG,CAAC,CAAC,KAAK,CAC3B,MAAO,oBACP,YAAa,kEACd,CAAC,EAGF,MAAM,EAAS,EAAK,CAAG,CACxB"}
@@ -0,0 +1,4 @@
1
+ import { BaseServerSDK, PagesRouterRequest, WithApiAuthRequiredAppRoute, WithApiAuthRequiredPageRoute } from '../types';
2
+ import { NextRequest } from 'next/server';
3
+ export declare const apiAppRouteHandlerFactory: (sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>) => WithApiAuthRequiredAppRoute;
4
+ export declare const apiPageRouteHandlerFactory: (sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>) => WithApiAuthRequiredPageRoute;
@@ -0,0 +1,2 @@
1
+ import{toNextRequest as e}from"../utils.mjs";import{NextResponse as t}from"next/server";var n=n=>r=>async(i,a)=>{let o=i instanceof Request?e(i):i;if(!await n.getSession(o))return t.json({error:`not_authenticated`,description:`The user does not have an active session or is not authenticated`},{status:401});let s=await r(o,a);return s instanceof t?s:new t(s.body,s)},r=e=>t=>async(n,r)=>{if(!await e.getSession(n))return r.status(401).json({error:`not_authenticated`,description:`The user does not have an active session or is not authenticated`});await t(n,r)};export{n as apiAppRouteHandlerFactory,r as apiPageRouteHandlerFactory};
2
+ //# sourceMappingURL=api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.mjs","names":[],"sources":["../../../src/server/handlers/api.ts"],"sourcesContent":["import type { BaseServerSDK, PagesRouterRequest, WithApiAuthRequiredAppRoute, WithApiAuthRequiredPageRoute } from '../types';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { toNextRequest } from '../utils';\n\nexport const apiAppRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithApiAuthRequiredAppRoute =>\n\t(apiRoute) =>\n\tasync (req: NextRequest | Request, params): Promise<NextResponse> => {\n\t\tconst nextReq = req instanceof Request ? toNextRequest(req) : req;\n\n\t\tconst session = await sdk.getSession(nextReq);\n\n\t\tif (!session) {\n\t\t\treturn NextResponse.json(\n\t\t\t\t{\n\t\t\t\t\terror: 'not_authenticated',\n\t\t\t\t\tdescription: 'The user does not have an active session or is not authenticated',\n\t\t\t\t},\n\t\t\t\t{ status: 401 },\n\t\t\t);\n\t\t}\n\n\t\tconst apiRes: NextResponse | Response = await apiRoute(nextReq, params);\n\t\tconst nextApiRes: NextResponse = apiRes instanceof NextResponse ? apiRes : new NextResponse(apiRes.body, apiRes);\n\n\t\treturn nextApiRes;\n\t};\n\nexport const apiPageRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithApiAuthRequiredPageRoute =>\n\t(apiRoute) =>\n\tasync (req, res) => {\n\t\tconst session = await sdk.getSession(req);\n\n\t\tif (!session) {\n\t\t\treturn res.status(401).json({\n\t\t\t\terror: 'not_authenticated',\n\t\t\t\tdescription: 'The user does not have an active session or is not authenticated',\n\t\t\t});\n\t\t}\n\n\t\tawait apiRoute(req, res);\n\t};\n"],"mappings":"wFAIA,IAAa,EACX,GACA,GACD,MAAO,EAA4B,IAAkC,CACpE,IAAM,EAAU,aAAe,QAAU,EAAc,CAAG,EAAI,EAI9D,GAAI,CAAC,MAFiB,EAAI,WAAW,CAAO,EAG3C,OAAO,EAAa,KACnB,CACC,MAAO,oBACP,YAAa,kEACd,EACA,CAAE,OAAQ,GAAI,CACf,EAGD,IAAM,EAAkC,MAAM,EAAS,EAAS,CAAM,EAGtE,OAFiC,aAAkB,EAAe,EAAS,IAAI,EAAa,EAAO,KAAM,CAAM,CAGhH,EAEY,EACX,GACA,GACD,MAAO,EAAK,IAAQ,CAGnB,GAAI,CAAC,MAFiB,EAAI,WAAW,CAAG,EAGvC,OAAO,EAAI,OAAO,GAAG,CAAC,CAAC,KAAK,CAC3B,MAAO,oBACP,YAAa,kEACd,CAAC,EAGF,MAAM,EAAS,EAAK,CAAG,CACxB"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=function(e,t,n){let r=Promise.resolve();function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},t=t=>(n,r={})=>async i=>{let a=await t.getSession();if(!a){let n=typeof r.returnTo==`function`?await r.returnTo(i):r.returnTo,{redirect:a}=await e(async()=>{let{redirect:e}=await import(`next/navigation`);return{redirect:e}},void 0);a(`${t.options.loginUri}${n?`?returnTo=${encodeURIComponent(n)}`:``}`)}return n({...i,session:a})},n=e=>({getServerSideProps:t,returnTo:n}={})=>async r=>{let i=await e.getSession();if(!i)return{redirect:{destination:`${e.options.loginUri}?returnTo=${encodeURIComponent(n||r.resolvedUrl)}`,permanent:!1}};let a={props:{}};if(t&&(a=await t(r)),a.props instanceof Promise){let e=await a.props;return{...a,props:{session:i,...e}}}return{...a,props:{session:i,...a.props}}};exports.appRouteHandlerFactory=t,exports.pageRouteHandlerFactory=n;
2
+ //# sourceMappingURL=route.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.cjs","names":[],"sources":["../../../src/server/handlers/route.ts"],"sourcesContent":["import type { NextRequest } from 'next/server';\nimport type {\n\tAppRouterPageRoute,\n\tAppRouterPageRouteOpts,\n\tBaseServerSDK,\n\tPagesRouterRequest,\n\tWithAuthGuardAppRouter,\n\tWithAuthGuardAppRouterOptions,\n\tWithAuthGuardPageRouter,\n} from '../types';\n\nexport const appRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithAuthGuardAppRouter =>\n\t<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts>(handler: AppRouterPageRoute<P>, opts: WithAuthGuardAppRouterOptions<P> = {}) =>\n\tasync (params: P) => {\n\t\tconst session = await sdk.getSession();\n\n\t\tif (!session) {\n\t\t\tconst returnTo = typeof opts.returnTo === 'function' ? await opts.returnTo(params) : opts.returnTo;\n\t\t\tconst { redirect } = await import('next/navigation');\n\n\t\t\tredirect(`${sdk.options.loginUri}${returnTo ? `?returnTo=${encodeURIComponent(returnTo)}` : ''}`);\n\t\t}\n\n\t\treturn handler({ ...params, session });\n\t};\n\nexport const pageRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithAuthGuardPageRouter =>\n\t({ getServerSideProps, returnTo } = {}) =>\n\tasync (ctx) => {\n\t\tconst session = await sdk.getSession();\n\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tredirect: {\n\t\t\t\t\tdestination: `${sdk.options.loginUri}?returnTo=${encodeURIComponent(returnTo || ctx.resolvedUrl)}`,\n\t\t\t\t\tpermanent: false,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tlet ret: any = { props: {} };\n\n\t\tif (getServerSideProps) {\n\t\t\tret = await getServerSideProps(ctx);\n\t\t}\n\n\t\tif (ret.props instanceof Promise) {\n\t\t\tconst props = await ret.props;\n\n\t\t\treturn {\n\t\t\t\t...ret,\n\t\t\t\tprops: {\n\t\t\t\t\tsession,\n\t\t\t\t\t...props,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { ...ret, props: { session, ...ret.props } };\n\t};\n"],"mappings":"sVAWa,EACX,IAC2D,EAAgC,EAAyC,CAAC,IACtI,KAAO,IAAc,CACpB,IAAM,EAAU,MAAM,EAAI,WAAW,EAErC,GAAI,CAAC,EAAS,CACb,IAAM,EAAW,OAAO,EAAK,UAAa,WAAa,MAAM,EAAK,SAAS,CAAM,EAAI,EAAK,SACpF,CAAE,YAAA,MAAA,EAAA,SAAA,CAAF,GAAA,CAAE,YAAa,MAAM,OAAO,+CAElC,EAAS,GAAG,EAAI,QAAQ,WAAW,EAAW,aAAa,mBAAmB,CAAQ,IAAM,IAAI,CACjG,CAEA,OAAO,EAAQ,CAAE,GAAG,EAAQ,SAAQ,CAAC,CACtC,EAEY,EACX,IACA,CAAE,qBAAoB,YAAa,CAAC,IACrC,KAAO,IAAQ,CACd,IAAM,EAAU,MAAM,EAAI,WAAW,EAErC,GAAI,CAAC,EACJ,MAAO,CACN,SAAU,CACT,YAAa,GAAG,EAAI,QAAQ,SAAS,YAAY,mBAAmB,GAAY,EAAI,WAAW,IAC/F,UAAW,EACZ,CACD,EAID,IAAI,EAAW,CAAE,MAAO,CAAC,CAAE,EAM3B,GAJI,IACH,EAAM,MAAM,EAAmB,CAAG,GAG/B,EAAI,iBAAiB,QAAS,CACjC,IAAM,EAAQ,MAAM,EAAI,MAExB,MAAO,CACN,GAAG,EACH,MAAO,CACN,UACA,GAAG,CACJ,CACD,CACD,CAEA,MAAO,CAAE,GAAG,EAAK,MAAO,CAAE,UAAS,GAAG,EAAI,KAAM,CAAE,CACnD"}
@@ -0,0 +1,4 @@
1
+ import { NextRequest } from 'next/server';
2
+ import { BaseServerSDK, PagesRouterRequest, WithAuthGuardAppRouter, WithAuthGuardPageRouter } from '../types';
3
+ export declare const appRouteHandlerFactory: (sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>) => WithAuthGuardAppRouter;
4
+ export declare const pageRouteHandlerFactory: (sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>) => WithAuthGuardPageRouter;
@@ -0,0 +1,2 @@
1
+ var e=function(e){return`/`+e},t={},n=function(n,r,i){let a=Promise.resolve();if(r&&r.length>0){let n=document.getElementsByTagName(`link`),o=document.querySelector(`meta[property=csp-nonce]`),s=o?.nonce||o?.getAttribute(`nonce`);function c(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function l(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}a=c(r.map(r=>{if(r=e(r,i),r=l(r),r in t)return;t[r]=!0;let a=r.endsWith(`.css`);for(let e=n.length-1;e>=0;e--){let t=n[e];if(t.href===r&&(!a||t.rel===`stylesheet`))return}let o=document.createElement(`link`);if(o.rel=a?`stylesheet`:`modulepreload`,a||(o.as=`script`),o.crossOrigin=``,o.href=r,s&&o.setAttribute(`nonce`,s),document.head.appendChild(o),a)return new Promise((e,t)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${r}`)))})}))}function o(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return a.then(e=>{for(let t of e||[])t.status===`rejected`&&o(t.reason);return n().catch(o)})},r=e=>(t,r={})=>async i=>{let a=await e.getSession();if(!a){let t=typeof r.returnTo==`function`?await r.returnTo(i):r.returnTo,{redirect:a}=await n(async()=>{let{redirect:e}=await import(`next/navigation`);return{redirect:e}},[]);a(`${e.options.loginUri}${t?`?returnTo=${encodeURIComponent(t)}`:``}`)}return t({...i,session:a})},i=e=>({getServerSideProps:t,returnTo:n}={})=>async r=>{let i=await e.getSession();if(!i)return{redirect:{destination:`${e.options.loginUri}?returnTo=${encodeURIComponent(n||r.resolvedUrl)}`,permanent:!1}};let a={props:{}};if(t&&(a=await t(r)),a.props instanceof Promise){let e=await a.props;return{...a,props:{session:i,...e}}}return{...a,props:{session:i,...a.props}}};export{r as appRouteHandlerFactory,i as pageRouteHandlerFactory};
2
+ //# sourceMappingURL=route.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"6pCAWa,EACX,IAC2D,EAAgC,EAAyC,CAAC,IACtI,KAAO,IAAc,CACpB,IAAM,EAAU,MAAM,EAAI,WAAW,EAErC,GAAI,CAAC,EAAS,CACb,IAAM,EAAW,OAAO,EAAK,UAAa,WAAa,MAAM,EAAK,SAAS,CAAM,EAAI,EAAK,SACpF,CAAE,8BAAF,IAAE,YAAa,MAAM,OAAO,2CAElC,EAAS,GAAG,EAAI,QAAQ,WAAW,EAAW,aAAa,mBAAmB,CAAQ,IAAM,IAAI,CACjG,CAEA,OAAO,EAAQ,CAAE,GAAG,EAAQ,SAAQ,CAAC,CACtC,EAEY,EACX,IACA,CAAE,qBAAoB,YAAa,CAAC,IACrC,KAAO,IAAQ,CACd,IAAM,EAAU,MAAM,EAAI,WAAW,EAErC,GAAI,CAAC,EACJ,MAAO,CACN,SAAU,CACT,YAAa,GAAG,EAAI,QAAQ,SAAS,YAAY,mBAAmB,GAAY,EAAI,WAAW,IAC/F,UAAW,EACZ,CACD,EAID,IAAI,EAAW,CAAE,MAAO,CAAC,CAAE,EAM3B,GAJI,IACH,EAAM,MAAM,EAAmB,CAAG,GAG/B,EAAI,iBAAiB,QAAS,CACjC,IAAM,EAAQ,MAAM,EAAI,MAExB,MAAO,CACN,GAAG,EACH,MAAO,CACN,UACA,GAAG,CACJ,CACD,CACD,CAEA,MAAO,CAAE,GAAG,EAAK,MAAO,CAAE,UAAS,GAAG,EAAI,KAAM,CAAE,CACnD","names":[],"ignoreList":[],"sources":["../../../src/server/handlers/route.ts"],"sourcesContent":["import type { NextRequest } from 'next/server';\nimport type {\n\tAppRouterPageRoute,\n\tAppRouterPageRouteOpts,\n\tBaseServerSDK,\n\tPagesRouterRequest,\n\tWithAuthGuardAppRouter,\n\tWithAuthGuardAppRouterOptions,\n\tWithAuthGuardPageRouter,\n} from '../types';\n\nexport const appRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithAuthGuardAppRouter =>\n\t<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts>(handler: AppRouterPageRoute<P>, opts: WithAuthGuardAppRouterOptions<P> = {}) =>\n\tasync (params: P) => {\n\t\tconst session = await sdk.getSession();\n\n\t\tif (!session) {\n\t\t\tconst returnTo = typeof opts.returnTo === 'function' ? await opts.returnTo(params) : opts.returnTo;\n\t\t\tconst { redirect } = await import('next/navigation');\n\n\t\t\tredirect(`${sdk.options.loginUri}${returnTo ? `?returnTo=${encodeURIComponent(returnTo)}` : ''}`);\n\t\t}\n\n\t\treturn handler({ ...params, session });\n\t};\n\nexport const pageRouteHandlerFactory =\n\t(sdk: BaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>): WithAuthGuardPageRouter =>\n\t({ getServerSideProps, returnTo } = {}) =>\n\tasync (ctx) => {\n\t\tconst session = await sdk.getSession();\n\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tredirect: {\n\t\t\t\t\tdestination: `${sdk.options.loginUri}?returnTo=${encodeURIComponent(returnTo || ctx.resolvedUrl)}`,\n\t\t\t\t\tpermanent: false,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tlet ret: any = { props: {} };\n\n\t\tif (getServerSideProps) {\n\t\t\tret = await getServerSideProps(ctx);\n\t\t}\n\n\t\tif (ret.props instanceof Promise) {\n\t\t\tconst props = await ret.props;\n\n\t\t\treturn {\n\t\t\t\t...ret,\n\t\t\t\tprops: {\n\t\t\t\t\tsession,\n\t\t\t\t\t...props,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { ...ret, props: { session, ...ret.props } };\n\t};\n"],"file":"route.mjs"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../errors.cjs"),require("./types.cjs");const e=require("./storages.cjs"),t=require("./utils.cjs"),n=require("./sdk.cjs");exports.collectFromNextUrl=t.collectFromNextUrl,exports.createEncryptedCookieStorage=e.createEncryptedCookieStorage,exports.createServerSDK=n.createServerSDK,exports.createSessionIdCookieStorage=e.createSessionIdCookieStorage,exports.toNextRequest=t.toNextRequest;var r=require("@strivacity/sdk-core/flows");Object.keys(r).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return r[e]}})});var i=require("@strivacity/sdk-core/handlers");Object.keys(i).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return i[e]}})});var a=require("@strivacity/sdk-core/utils");Object.keys(a).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return a[e]}})});var o=require("@strivacity/sdk-core/utils/errors");Object.keys(o).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return o[e]}})});var s=require("@strivacity/sdk-core/types");Object.keys(s).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return s[e]}})});var c=require("@strivacity/sdk-react/storages");Object.keys(c).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return c[e]}})});
@@ -0,0 +1,8 @@
1
+ export * from '@strivacity/sdk-core/flows';
2
+ export * from '@strivacity/sdk-core/handlers';
3
+ export * from '@strivacity/sdk-core/utils';
4
+ export * from '../errors';
5
+ export * from './sdk';
6
+ export * from './storages';
7
+ export * from './types';
8
+ export * from './utils';
@@ -0,0 +1 @@
1
+ import"../errors.mjs";import"./types.mjs";import{createEncryptedCookieStorage as e,createSessionIdCookieStorage as t}from"./storages.mjs";import{collectFromNextUrl as n,toNextRequest as r}from"./utils.mjs";import{createServerSDK as i}from"./sdk.mjs";export*from"@strivacity/sdk-core/utils/errors";export*from"@strivacity/sdk-core/types";export*from"@strivacity/sdk-core/flows";export*from"@strivacity/sdk-core/handlers";export*from"@strivacity/sdk-core/utils";export*from"@strivacity/sdk-react/storages";export{n as collectFromNextUrl,e as createEncryptedCookieStorage,i as createServerSDK,t as createSessionIdCookieStorage,r as toNextRequest};
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./storages.cjs"),t=require("./handlers/api.cjs"),n=require("./handlers/route.cjs");let r=require("@strivacity/sdk-core/utils/errors"),i=require("next/server"),a=require("@strivacity/sdk-core/server");function o(o){if(!o.storage){if(!o.secret)throw new r.ConfigurationError(`Secret is required for encrypted cookie storage`);o.cookieMaxAge??=2592e3,o.storage=e.createEncryptedCookieStorage(o.secret,{defaultCookieOptions:{maxAge:o.cookieMaxAge}})}let s=(0,a.createBaseServerSDK)({toRequest:e=>e,redirect:(e,t)=>i.NextResponse.redirect(e,t)},o);function c(e){return(n,r)=>n instanceof Request?t.apiAppRouteHandlerFactory(s)(e)(n,r??{}):t.apiPageRouteHandlerFactory(s)(e)(n,r)}function l(e,t){return typeof e==`function`?n.appRouteHandlerFactory(s)(e,t):n.pageRouteHandlerFactory(s)(e)}return{get options(){return s.options},withAuthGuard:l,withApiAuthRequired:c,getSession:e=>s.getSession(e),updateSession:(e,t)=>s.updateSession(e,t),refreshSession:e=>s.refreshSession(e),revokeSession:e=>s.revokeSession(e),getEntrySession:e=>s.getEntrySession(e),completeLogin:(e,t)=>s.completeLogin(e,t),logout:(e,t)=>s.logout(e,t),handleLogin:e=>s.handleLogin(e),handleRegister:e=>s.handleRegister(e),handleCallback:e=>s.handleCallback(e),handleRefresh:e=>s.handleRefresh(e),handleRevoke:e=>s.handleRevoke(e),handleEntry:e=>s.handleEntry(e),handleLogout:e=>s.handleLogout(e),handleBackChannelLogout:e=>s.handleBackChannelLogout(e),handler:async e=>await s.handler(e)??new i.NextResponse(`Not Found`,{status:404})}}exports.createServerSDK=o;
2
+ //# sourceMappingURL=sdk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.cjs","names":[],"sources":["../../src/server/sdk.ts"],"sourcesContent":["import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';\nimport type { ParsedUrlQuery } from 'node:querystring';\nimport type {\n\tNextServerSDK,\n\tNextServerSDKInitConfig,\n\tWithAuthGuardAppRouterOptions,\n\tWithAuthGuardPageRouterOptions,\n\tAppRouterPageRoute,\n\tAppRouterPageRouteOpts,\n\tPageRoute,\n\tAppRouteHandlerFn,\n\tAppRouteHandlerFnContext,\n\tPagesRouterRequest,\n} from './types';\nimport { NextResponse, type NextRequest } from 'next/server';\nimport { createBaseServerSDK } from '@strivacity/sdk-core/server';\nimport { ConfigurationError } from '@strivacity/sdk-core/utils/errors';\nimport { createEncryptedCookieStorage } from './storages';\nimport { apiAppRouteHandlerFactory, apiPageRouteHandlerFactory } from './handlers/api';\nimport { appRouteHandlerFactory, pageRouteHandlerFactory } from './handlers/route';\n\n/**\n * Creates a Next.js server SDK instance with the provided configuration.\n *\n * @param {NextServerSDKInitConfig} initConfig - The initialization configuration for the SDK.\n * @returns {NextServerSDK} The initialized Next.js server SDK instance.\n */\nexport function createServerSDK(initConfig: NextServerSDKInitConfig): NextServerSDK {\n\tif (!initConfig.storage) {\n\t\tif (!initConfig.secret) {\n\t\t\tthrow new ConfigurationError('Secret is required for encrypted cookie storage');\n\t\t}\n\n\t\tinitConfig.cookieMaxAge ??= 30 * 24 * 60 * 60;\n\t\tinitConfig.storage = createEncryptedCookieStorage(initConfig.secret, { defaultCookieOptions: { maxAge: initConfig.cookieMaxAge } });\n\t}\n\n\tconst base = createBaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>(\n\t\t{\n\t\t\ttoRequest: (req) => req as Request,\n\t\t\tredirect: (url, status) => NextResponse.redirect(url, status),\n\t\t},\n\t\tinitConfig,\n\t);\n\n\tfunction withApiAuthRequired(apiRoute: AppRouteHandlerFn): AppRouteHandlerFn;\n\tfunction withApiAuthRequired(apiRoute: NextApiHandler): NextApiHandler;\n\tfunction withApiAuthRequired(apiRoute: AppRouteHandlerFn | NextApiHandler): AppRouteHandlerFn | NextApiHandler {\n\t\treturn (req: NextRequest | Request | NextApiRequest, resOrCtx?: AppRouteHandlerFnContext | NextApiResponse) => {\n\t\t\tif (req instanceof Request) {\n\t\t\t\tconst appRouteHandler = apiAppRouteHandlerFactory(base);\n\t\t\t\tconst wrappedAppRoute = appRouteHandler(apiRoute as AppRouteHandlerFn);\n\t\t\t\treturn wrappedAppRoute(req, (resOrCtx ?? {}) as AppRouteHandlerFnContext);\n\t\t\t}\n\n\t\t\tconst pageRouteHandler = apiPageRouteHandlerFactory(base);\n\t\t\tconst wrappedPageRoute = pageRouteHandler(apiRoute as NextApiHandler);\n\t\t\treturn wrappedPageRoute(req, resOrCtx as NextApiResponse);\n\t\t};\n\t}\n\n\tfunction withAuthGuard(): PageRoute<Record<string, unknown>, ParsedUrlQuery>;\n\tfunction withAuthGuard<P extends Record<string, unknown> = Record<string, unknown>, Q extends ParsedUrlQuery = ParsedUrlQuery>(\n\t\topts: WithAuthGuardPageRouterOptions<P, Q>,\n\t): PageRoute<P, Q>;\n\tfunction withAuthGuard<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts>(\n\t\tfn: AppRouterPageRoute<P>,\n\t\topts?: WithAuthGuardAppRouterOptions<P>,\n\t): AppRouterPageRoute<P>;\n\tfunction withAuthGuard(\n\t\tfnOrOpts?: WithAuthGuardPageRouterOptions | AppRouterPageRoute,\n\t\topts?: WithAuthGuardAppRouterOptions,\n\t): PageRoute<Record<string, unknown>> | AppRouterPageRoute {\n\t\tif (typeof fnOrOpts === 'function') {\n\t\t\tconst appRouteHandler = appRouteHandlerFactory(base);\n\t\t\treturn appRouteHandler(fnOrOpts, opts);\n\t\t}\n\n\t\tconst pageRouteHandler = pageRouteHandlerFactory(base);\n\t\treturn pageRouteHandler(fnOrOpts);\n\t}\n\n\treturn {\n\t\tget options() {\n\t\t\treturn base.options;\n\t\t},\n\t\twithAuthGuard,\n\t\twithApiAuthRequired,\n\t\tgetSession: (req) => base.getSession(req),\n\t\tupdateSession: (event, session) => base.updateSession(event, session),\n\t\trefreshSession: (req) => base.refreshSession(req),\n\t\trevokeSession: (req) => base.revokeSession(req),\n\t\tgetEntrySession: (entryUrl) => base.getEntrySession(entryUrl),\n\t\tcompleteLogin: (params, req) => base.completeLogin(params, req),\n\t\tlogout: (postLogoutRedirectUri, req) => base.logout(postLogoutRedirectUri, req),\n\t\thandleLogin: (req) => base.handleLogin(req),\n\t\thandleRegister: (req) => base.handleRegister(req),\n\t\thandleCallback: (req) => base.handleCallback(req),\n\t\thandleRefresh: (req) => base.handleRefresh(req),\n\t\thandleRevoke: (req) => base.handleRevoke(req),\n\t\thandleEntry: (req) => base.handleEntry(req),\n\t\thandleLogout: (req) => base.handleLogout(req),\n\t\thandleBackChannelLogout: (req) => base.handleBackChannelLogout(req),\n\t\thandler: async (req) => (await base.handler(req)) ?? new NextResponse('Not Found', { status: 404 }),\n\t};\n}\n"],"mappings":"4RA2BA,SAAgB,EAAgB,EAAoD,CACnF,GAAI,CAAC,EAAW,QAAS,CACxB,GAAI,CAAC,EAAW,OACf,MAAM,IAAI,EAAA,mBAAmB,iDAAiD,EAG/E,EAAW,eAAiB,OAC5B,EAAW,QAAU,EAAA,6BAA6B,EAAW,OAAQ,CAAE,qBAAsB,CAAE,OAAQ,EAAW,YAAa,CAAE,CAAC,CACnI,CAEA,IAAM,GAAA,EAAO,EAAA,oBAAA,CACZ,CACC,UAAY,GAAQ,EACpB,UAAW,EAAK,IAAW,EAAA,aAAa,SAAS,EAAK,CAAM,CAC7D,EACA,CACD,EAIA,SAAS,EAAoB,EAAkF,CAC9G,OAAQ,EAA6C,IAChD,aAAe,QACM,EAAA,0BAA0B,CAC1B,CAAA,CAAgB,CACjC,CAAA,CAAgB,EAAM,GAAY,CAAC,CAA8B,EAGhD,EAAA,2BAA2B,CAC3B,CAAA,CAAiB,CACnC,CAAA,CAAiB,EAAK,CAA2B,CAE1D,CAUA,SAAS,EACR,EACA,EAC0D,CAO1D,OANI,OAAO,GAAa,WACC,EAAA,uBAAuB,CACxC,CAAA,CAAgB,EAAU,CAAI,EAGb,EAAA,wBAAwB,CAC1C,CAAA,CAAiB,CAAQ,CACjC,CAEA,MAAO,CACN,IAAI,SAAU,CACb,OAAO,EAAK,OACb,EACA,gBACA,sBACA,WAAa,GAAQ,EAAK,WAAW,CAAG,EACxC,eAAgB,EAAO,IAAY,EAAK,cAAc,EAAO,CAAO,EACpE,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,cAAgB,GAAQ,EAAK,cAAc,CAAG,EAC9C,gBAAkB,GAAa,EAAK,gBAAgB,CAAQ,EAC5D,eAAgB,EAAQ,IAAQ,EAAK,cAAc,EAAQ,CAAG,EAC9D,QAAS,EAAuB,IAAQ,EAAK,OAAO,EAAuB,CAAG,EAC9E,YAAc,GAAQ,EAAK,YAAY,CAAG,EAC1C,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,cAAgB,GAAQ,EAAK,cAAc,CAAG,EAC9C,aAAe,GAAQ,EAAK,aAAa,CAAG,EAC5C,YAAc,GAAQ,EAAK,YAAY,CAAG,EAC1C,aAAe,GAAQ,EAAK,aAAa,CAAG,EAC5C,wBAA0B,GAAQ,EAAK,wBAAwB,CAAG,EAClE,QAAS,KAAO,IAAS,MAAM,EAAK,QAAQ,CAAG,GAAM,IAAI,EAAA,aAAa,YAAa,CAAE,OAAQ,GAAI,CAAC,CACnG,CACD"}
@@ -0,0 +1,8 @@
1
+ import { NextServerSDK, NextServerSDKInitConfig } from './types';
2
+ /**
3
+ * Creates a Next.js server SDK instance with the provided configuration.
4
+ *
5
+ * @param {NextServerSDKInitConfig} initConfig - The initialization configuration for the SDK.
6
+ * @returns {NextServerSDK} The initialized Next.js server SDK instance.
7
+ */
8
+ export declare function createServerSDK(initConfig: NextServerSDKInitConfig): NextServerSDK;
@@ -0,0 +1,2 @@
1
+ import{createEncryptedCookieStorage as e}from"./storages.mjs";import{apiAppRouteHandlerFactory as t,apiPageRouteHandlerFactory as n}from"./handlers/api.mjs";import{appRouteHandlerFactory as r,pageRouteHandlerFactory as i}from"./handlers/route.mjs";import{ConfigurationError as a}from"@strivacity/sdk-core/utils/errors";import{NextResponse as o}from"next/server";import{createBaseServerSDK as s}from"@strivacity/sdk-core/server";function c(c){if(!c.storage){if(!c.secret)throw new a(`Secret is required for encrypted cookie storage`);c.cookieMaxAge??=2592e3,c.storage=e(c.secret,{defaultCookieOptions:{maxAge:c.cookieMaxAge}})}let l=s({toRequest:e=>e,redirect:(e,t)=>o.redirect(e,t)},c);function u(e){return(r,i)=>r instanceof Request?t(l)(e)(r,i??{}):n(l)(e)(r,i)}function d(e,t){return typeof e==`function`?r(l)(e,t):i(l)(e)}return{get options(){return l.options},withAuthGuard:d,withApiAuthRequired:u,getSession:e=>l.getSession(e),updateSession:(e,t)=>l.updateSession(e,t),refreshSession:e=>l.refreshSession(e),revokeSession:e=>l.revokeSession(e),getEntrySession:e=>l.getEntrySession(e),completeLogin:(e,t)=>l.completeLogin(e,t),logout:(e,t)=>l.logout(e,t),handleLogin:e=>l.handleLogin(e),handleRegister:e=>l.handleRegister(e),handleCallback:e=>l.handleCallback(e),handleRefresh:e=>l.handleRefresh(e),handleRevoke:e=>l.handleRevoke(e),handleEntry:e=>l.handleEntry(e),handleLogout:e=>l.handleLogout(e),handleBackChannelLogout:e=>l.handleBackChannelLogout(e),handler:async e=>await l.handler(e)??new o(`Not Found`,{status:404})}}export{c as createServerSDK};
2
+ //# sourceMappingURL=sdk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.mjs","names":[],"sources":["../../src/server/sdk.ts"],"sourcesContent":["import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';\nimport type { ParsedUrlQuery } from 'node:querystring';\nimport type {\n\tNextServerSDK,\n\tNextServerSDKInitConfig,\n\tWithAuthGuardAppRouterOptions,\n\tWithAuthGuardPageRouterOptions,\n\tAppRouterPageRoute,\n\tAppRouterPageRouteOpts,\n\tPageRoute,\n\tAppRouteHandlerFn,\n\tAppRouteHandlerFnContext,\n\tPagesRouterRequest,\n} from './types';\nimport { NextResponse, type NextRequest } from 'next/server';\nimport { createBaseServerSDK } from '@strivacity/sdk-core/server';\nimport { ConfigurationError } from '@strivacity/sdk-core/utils/errors';\nimport { createEncryptedCookieStorage } from './storages';\nimport { apiAppRouteHandlerFactory, apiPageRouteHandlerFactory } from './handlers/api';\nimport { appRouteHandlerFactory, pageRouteHandlerFactory } from './handlers/route';\n\n/**\n * Creates a Next.js server SDK instance with the provided configuration.\n *\n * @param {NextServerSDKInitConfig} initConfig - The initialization configuration for the SDK.\n * @returns {NextServerSDK} The initialized Next.js server SDK instance.\n */\nexport function createServerSDK(initConfig: NextServerSDKInitConfig): NextServerSDK {\n\tif (!initConfig.storage) {\n\t\tif (!initConfig.secret) {\n\t\t\tthrow new ConfigurationError('Secret is required for encrypted cookie storage');\n\t\t}\n\n\t\tinitConfig.cookieMaxAge ??= 30 * 24 * 60 * 60;\n\t\tinitConfig.storage = createEncryptedCookieStorage(initConfig.secret, { defaultCookieOptions: { maxAge: initConfig.cookieMaxAge } });\n\t}\n\n\tconst base = createBaseServerSDK<NextRequest | Request | PagesRouterRequest | undefined>(\n\t\t{\n\t\t\ttoRequest: (req) => req as Request,\n\t\t\tredirect: (url, status) => NextResponse.redirect(url, status),\n\t\t},\n\t\tinitConfig,\n\t);\n\n\tfunction withApiAuthRequired(apiRoute: AppRouteHandlerFn): AppRouteHandlerFn;\n\tfunction withApiAuthRequired(apiRoute: NextApiHandler): NextApiHandler;\n\tfunction withApiAuthRequired(apiRoute: AppRouteHandlerFn | NextApiHandler): AppRouteHandlerFn | NextApiHandler {\n\t\treturn (req: NextRequest | Request | NextApiRequest, resOrCtx?: AppRouteHandlerFnContext | NextApiResponse) => {\n\t\t\tif (req instanceof Request) {\n\t\t\t\tconst appRouteHandler = apiAppRouteHandlerFactory(base);\n\t\t\t\tconst wrappedAppRoute = appRouteHandler(apiRoute as AppRouteHandlerFn);\n\t\t\t\treturn wrappedAppRoute(req, (resOrCtx ?? {}) as AppRouteHandlerFnContext);\n\t\t\t}\n\n\t\t\tconst pageRouteHandler = apiPageRouteHandlerFactory(base);\n\t\t\tconst wrappedPageRoute = pageRouteHandler(apiRoute as NextApiHandler);\n\t\t\treturn wrappedPageRoute(req, resOrCtx as NextApiResponse);\n\t\t};\n\t}\n\n\tfunction withAuthGuard(): PageRoute<Record<string, unknown>, ParsedUrlQuery>;\n\tfunction withAuthGuard<P extends Record<string, unknown> = Record<string, unknown>, Q extends ParsedUrlQuery = ParsedUrlQuery>(\n\t\topts: WithAuthGuardPageRouterOptions<P, Q>,\n\t): PageRoute<P, Q>;\n\tfunction withAuthGuard<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts>(\n\t\tfn: AppRouterPageRoute<P>,\n\t\topts?: WithAuthGuardAppRouterOptions<P>,\n\t): AppRouterPageRoute<P>;\n\tfunction withAuthGuard(\n\t\tfnOrOpts?: WithAuthGuardPageRouterOptions | AppRouterPageRoute,\n\t\topts?: WithAuthGuardAppRouterOptions,\n\t): PageRoute<Record<string, unknown>> | AppRouterPageRoute {\n\t\tif (typeof fnOrOpts === 'function') {\n\t\t\tconst appRouteHandler = appRouteHandlerFactory(base);\n\t\t\treturn appRouteHandler(fnOrOpts, opts);\n\t\t}\n\n\t\tconst pageRouteHandler = pageRouteHandlerFactory(base);\n\t\treturn pageRouteHandler(fnOrOpts);\n\t}\n\n\treturn {\n\t\tget options() {\n\t\t\treturn base.options;\n\t\t},\n\t\twithAuthGuard,\n\t\twithApiAuthRequired,\n\t\tgetSession: (req) => base.getSession(req),\n\t\tupdateSession: (event, session) => base.updateSession(event, session),\n\t\trefreshSession: (req) => base.refreshSession(req),\n\t\trevokeSession: (req) => base.revokeSession(req),\n\t\tgetEntrySession: (entryUrl) => base.getEntrySession(entryUrl),\n\t\tcompleteLogin: (params, req) => base.completeLogin(params, req),\n\t\tlogout: (postLogoutRedirectUri, req) => base.logout(postLogoutRedirectUri, req),\n\t\thandleLogin: (req) => base.handleLogin(req),\n\t\thandleRegister: (req) => base.handleRegister(req),\n\t\thandleCallback: (req) => base.handleCallback(req),\n\t\thandleRefresh: (req) => base.handleRefresh(req),\n\t\thandleRevoke: (req) => base.handleRevoke(req),\n\t\thandleEntry: (req) => base.handleEntry(req),\n\t\thandleLogout: (req) => base.handleLogout(req),\n\t\thandleBackChannelLogout: (req) => base.handleBackChannelLogout(req),\n\t\thandler: async (req) => (await base.handler(req)) ?? new NextResponse('Not Found', { status: 404 }),\n\t};\n}\n"],"mappings":"4aA2BA,SAAgB,EAAgB,EAAoD,CACnF,GAAI,CAAC,EAAW,QAAS,CACxB,GAAI,CAAC,EAAW,OACf,MAAM,IAAI,EAAmB,iDAAiD,EAG/E,EAAW,eAAiB,OAC5B,EAAW,QAAU,EAA6B,EAAW,OAAQ,CAAE,qBAAsB,CAAE,OAAQ,EAAW,YAAa,CAAE,CAAC,CACnI,CAEA,IAAM,EAAO,EACZ,CACC,UAAY,GAAQ,EACpB,UAAW,EAAK,IAAW,EAAa,SAAS,EAAK,CAAM,CAC7D,EACA,CACD,EAIA,SAAS,EAAoB,EAAkF,CAC9G,OAAQ,EAA6C,IAChD,aAAe,QACM,EAA0B,CAC1B,CAAA,CAAgB,CACjC,CAAA,CAAgB,EAAM,GAAY,CAAC,CAA8B,EAGhD,EAA2B,CAC3B,CAAA,CAAiB,CACnC,CAAA,CAAiB,EAAK,CAA2B,CAE1D,CAUA,SAAS,EACR,EACA,EAC0D,CAO1D,OANI,OAAO,GAAa,WACC,EAAuB,CACxC,CAAA,CAAgB,EAAU,CAAI,EAGb,EAAwB,CAC1C,CAAA,CAAiB,CAAQ,CACjC,CAEA,MAAO,CACN,IAAI,SAAU,CACb,OAAO,EAAK,OACb,EACA,gBACA,sBACA,WAAa,GAAQ,EAAK,WAAW,CAAG,EACxC,eAAgB,EAAO,IAAY,EAAK,cAAc,EAAO,CAAO,EACpE,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,cAAgB,GAAQ,EAAK,cAAc,CAAG,EAC9C,gBAAkB,GAAa,EAAK,gBAAgB,CAAQ,EAC5D,eAAgB,EAAQ,IAAQ,EAAK,cAAc,EAAQ,CAAG,EAC9D,QAAS,EAAuB,IAAQ,EAAK,OAAO,EAAuB,CAAG,EAC9E,YAAc,GAAQ,EAAK,YAAY,CAAG,EAC1C,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,eAAiB,GAAQ,EAAK,eAAe,CAAG,EAChD,cAAgB,GAAQ,EAAK,cAAc,CAAG,EAC9C,aAAe,GAAQ,EAAK,aAAa,CAAG,EAC5C,YAAc,GAAQ,EAAK,YAAY,CAAG,EAC1C,aAAe,GAAQ,EAAK,aAAa,CAAG,EAC5C,wBAA0B,GAAQ,EAAK,wBAAwB,CAAG,EAClE,QAAS,KAAO,IAAS,MAAM,EAAK,QAAQ,CAAG,GAAM,IAAI,EAAa,YAAa,CAAE,OAAQ,GAAI,CAAC,CACnG,CACD"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("next/server"),t=require("@strivacity/sdk-core/server"),n=require("next/headers"),r=require("@strivacity/sdk-core/utils/common"),i=require("@strivacity/sdk-core/utils/crypto"),a=require("@strivacity/sdk-core/storages/server");function o(t,n){if(t instanceof e.NextRequest)return t.cookies.get(n)?.value??null;if(t instanceof Request){let e=(t.headers.get(`cookie`)??``).split(`;`).map(e=>e.trim()).find(e=>e.startsWith(`${n}=`));return e?decodeURIComponent(e.slice(n.length+1)):null}let r=(t.headers?.cookie??``).split(`;`).map(e=>e.trim()).find(e=>e.startsWith(`${n}=`));return r?decodeURIComponent(r.slice(n.length+1)):null}function s(t,r){return(0,a.createSessionIdCookieStorage)({toRequest:e=>e,redirect:(t,n)=>e.NextResponse.redirect(t,n),getSessionId:async(e,t)=>t?o(t,e)??null:(await(0,n.cookies)()).get(e)?.value},t,r)}function c(a,s){let c={httpOnly:!0,secure:!0,path:`/`,sameSite:`lax`,...s?.defaultCookieOptions},l={async get(e,r){if(r){let n=o(r,e);if(n)return await(0,i.decryptString)(n,a,t.COOKIE_CONTEXT);let s=[];for(let t=0;;t++){let n=o(r,`${e}.${t}`);if(!n)break;s.push(n)}return s.length===0?null:await(0,i.decryptString)(s.join(``),a,t.COOKIE_CONTEXT)}{let r=await(0,n.cookies)(),o=r.get(e)?.value;if(o)return await(0,i.decryptString)(o,a,t.COOKIE_CONTEXT);let s=[];for(let t=0;;t++){let n=r.get(`${e}.${t}`)?.value;if(!n)break;s.push(n)}return s.length===0?null:await(0,i.decryptString)(s.join(``),a,t.COOKIE_CONTEXT)}},async set(o,s,u,d,f){f={...c,...f},await l.delete(o,u,d);let p=await(0,i.encryptString)(s,a,t.COOKIE_CONTEXT);if(d instanceof e.NextResponse){if(p.length<=t.COOKIE_CHUNK_SIZE)d.cookies.set(o,p,f);else for(let e=0;e*t.COOKIE_CHUNK_SIZE<p.length;e++)d.cookies.set(`${o}.${e}`,p.slice(e*t.COOKIE_CHUNK_SIZE,(e+1)*t.COOKIE_CHUNK_SIZE),f)}else if(d){let e=[];if(p.length<=t.COOKIE_CHUNK_SIZE)e.push((0,r.buildCookieString)(o,p,f));else for(let n=0;n*t.COOKIE_CHUNK_SIZE<p.length;n++)e.push((0,r.buildCookieString)(`${o}.${n}`,p.slice(n*t.COOKIE_CHUNK_SIZE,(n+1)*t.COOKIE_CHUNK_SIZE),f));let n=d.getHeader(`set-cookie`),i=Array.isArray(n)?n:n?[String(n)]:[];d.setHeader(`set-cookie`,[...i,...e])}else{let e=await(0,n.cookies)();if(p.length<=t.COOKIE_CHUNK_SIZE)e.set(o,p,f);else for(let n=0;n*t.COOKIE_CHUNK_SIZE<p.length;n++)e.set(`${o}.${n}`,p.slice(n*t.COOKIE_CHUNK_SIZE,(n+1)*t.COOKIE_CHUNK_SIZE),f)}},async delete(t,i,a,s){if(s={...c,...s,maxAge:0},a instanceof e.NextResponse){a.cookies.delete(t);for(let e=0;a.cookies.get(`${t}.${e}`);e++)a.cookies.delete(`${t}.${e}`)}else if(a){let e=[];if(e.push((0,r.buildCookieString)(t,``,s)),i)for(let n=0;o(i,`${t}.${n}`)!==null;n++)e.push((0,r.buildCookieString)(`${t}.${n}`,``,s));let n=a.getHeader(`set-cookie`),c=Array.isArray(n)?n:n?[String(n)]:[];a.setHeader(`set-cookie`,[...c,...e])}else{let e=await(0,n.cookies)();e.delete(t);for(let n=0;e.get(`${t}.${n}`);n++)e.delete(`${t}.${n}`)}}};return l}exports.createEncryptedCookieStorage=c,exports.createSessionIdCookieStorage=s;var l=require("@strivacity/sdk-react/storages");Object.keys(l).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return l[e]}})});
2
+ //# sourceMappingURL=storages.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storages.cjs","names":[],"sources":["../../src/server/storages.ts"],"sourcesContent":["import type { NextServerStorage, PagesRouterRequest, SessionIdCookieStorageOptions, EncryptedCookieStorageOptions } from './types';\nimport { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { buildCookieString } from '@strivacity/sdk-core/utils/common';\nimport { encryptString, decryptString } from '@strivacity/sdk-core/utils/crypto';\nimport { COOKIE_CONTEXT, COOKIE_CHUNK_SIZE } from '@strivacity/sdk-core/server';\nimport { createSessionIdCookieStorage as createSessionIdCookieStorageBase } from '@strivacity/sdk-core/storages/server';\n\nexport * from '@strivacity/sdk-react/storages';\n\n/**\n * Reads cookie value(s) for a given key directly from a NextRequest or PagesRouterRequest, without calling `cookies()` from next/headers.\n * Used for Pages Router / middleware support.\n *\n * @param req - The NextRequest or PagesRouterRequest object from which to read the cookie.\n * @param key - The name of the cookie to read.\n * @returns The cookie value as a string, or null if the cookie is not found.\n */\nfunction getCookieFromRequest(req: NextRequest | Request | PagesRouterRequest, key: string): string | null {\n\tif (req instanceof NextRequest) {\n\t\treturn req.cookies.get(key)?.value ?? null;\n\t}\n\n\tif (req instanceof Request) {\n\t\tconst cookieHeader = req.headers.get('cookie') ?? '';\n\t\tconst match = cookieHeader\n\t\t\t.split(';')\n\t\t\t.map((c) => c.trim())\n\t\t\t.find((c) => c.startsWith(`${key}=`));\n\n\t\treturn match ? decodeURIComponent(match.slice(key.length + 1)) : null;\n\t}\n\n\tconst cookieHeader = req.headers?.cookie ?? '';\n\tconst match = cookieHeader\n\t\t.split(';')\n\t\t.map((c: string) => c.trim())\n\t\t.find((c: string) => c.startsWith(`${key}=`));\n\n\treturn match ? decodeURIComponent(match.slice(key.length + 1)) : null;\n}\n\n/**\n * Creates a session storage that puts a random unique id value cookie on the client and keeping the actual session data in the given `storage`.\n *\n * @param {NextServerStorage} storage - The storage used to persist session data, keyed by a randomly generated session id.\n * @param {SessionIdCookieStorageOptions} [options] - Options for configuring the session-id cookie storage.\n * @returns {NextServerStorage} An object implementing the ServerStorage interface for managing sessions indexed by a session-id cookie.\n */\nexport function createSessionIdCookieStorage(storage: NextServerStorage, options?: SessionIdCookieStorageOptions): NextServerStorage {\n\treturn createSessionIdCookieStorageBase<NextRequest | Request | PagesRouterRequest>(\n\t\t{\n\t\t\ttoRequest: (req) => req as Request,\n\t\t\tredirect: (url, status) => NextResponse.redirect(url, status),\n\t\t\tgetSessionId: async (key, req) => {\n\t\t\t\tif (req) {\n\t\t\t\t\treturn getCookieFromRequest(req, key) ?? null;\n\t\t\t\t}\n\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\treturn store.get(key)?.value;\n\t\t\t},\n\t\t},\n\t\tstorage,\n\t\toptions,\n\t);\n}\n\n/**\n * Creates an encrypted cookie session storage.\n * Only callable in server-side contexts (middleware, API routes, or server components).\n *\n * @param secret - The secret key used for encryption and decryption.\n * @param {EncryptedCookieStorageOptions} [options] - Options for configuring the encrypted cookie storage.\n * @param {Partial<ServerCookieOptions>} [options.defaultCookieOptions] - Default cookie attributes for the encrypted cookie.\n * @returns An object implementing the ServerStorage interface for managing encrypted cookies.\n */\nexport function createEncryptedCookieStorage(secret: string, options?: EncryptedCookieStorageOptions): NextServerStorage {\n\tconst defaultCookieOptions = {\n\t\thttpOnly: true,\n\t\tsecure: true,\n\t\tpath: '/',\n\t\tsameSite: 'lax' as const,\n\t\t...options?.defaultCookieOptions,\n\t};\n\n\tconst storage: NextServerStorage = {\n\t\tasync get(key, req) {\n\t\t\tif (req) {\n\t\t\t\tconst cookie = getCookieFromRequest(req, key);\n\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn await decryptString(cookie, secret, COOKIE_CONTEXT);\n\t\t\t\t}\n\n\t\t\t\tconst cookieChunks: Array<string> = [];\n\n\t\t\t\tfor (let i = 0; ; i++) {\n\t\t\t\t\tconst chunk = getCookieFromRequest(req, `${key}.${i}`);\n\n\t\t\t\t\tif (!chunk) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcookieChunks.push(chunk);\n\t\t\t\t}\n\n\t\t\t\tif (cookieChunks.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn await decryptString(cookieChunks.join(''), secret, COOKIE_CONTEXT);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\t\t\t\tconst cookie = store.get(key)?.value;\n\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn await decryptString(cookie, secret, COOKIE_CONTEXT);\n\t\t\t\t}\n\n\t\t\t\tconst cookieChunks: Array<string> = [];\n\n\t\t\t\tfor (let i = 0; ; i++) {\n\t\t\t\t\tconst chunk = store.get(`${key}.${i}`)?.value;\n\n\t\t\t\t\tif (!chunk) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcookieChunks.push(chunk);\n\t\t\t\t}\n\n\t\t\t\tif (cookieChunks.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn await decryptString(cookieChunks.join(''), secret, COOKIE_CONTEXT);\n\t\t\t}\n\t\t},\n\t\tasync set(key, value, req, res, cookieOptions) {\n\t\t\tcookieOptions = { ...defaultCookieOptions, ...cookieOptions };\n\n\t\t\t// NOTE: Delete existing cookie(s) first to avoid leaving old chunks behind\n\t\t\tawait storage.delete(key, req, res);\n\n\t\t\tconst encrypted = await encryptString(value, secret, COOKIE_CONTEXT);\n\n\t\t\tif (res instanceof NextResponse) {\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tres.cookies.set(key, encrypted, cookieOptions);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tres.cookies.set(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (res) {\n\t\t\t\tconst setCookies: Array<string> = [];\n\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tsetCookies.push(buildCookieString(key, encrypted, cookieOptions));\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tsetCookies.push(buildCookieString(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst existing = res.getHeader('set-cookie');\n\t\t\t\tconst existingArr = Array.isArray(existing) ? existing : existing ? [String(existing)] : [];\n\n\t\t\t\tres.setHeader('set-cookie', [...existingArr, ...setCookies]);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tstore.set(key, encrypted, cookieOptions);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tstore.set(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync delete(key, req, res, cookieOptions) {\n\t\t\tcookieOptions = { ...defaultCookieOptions, ...cookieOptions, maxAge: 0 };\n\n\t\t\tif (res instanceof NextResponse) {\n\t\t\t\tres.cookies.delete(key);\n\n\t\t\t\tfor (let i = 0; res.cookies.get(`${key}.${i}`); i++) {\n\t\t\t\t\tres.cookies.delete(`${key}.${i}`);\n\t\t\t\t}\n\t\t\t} else if (res) {\n\t\t\t\tconst setCookies: Array<string> = [];\n\n\t\t\t\tsetCookies.push(buildCookieString(key, '', cookieOptions));\n\n\t\t\t\tif (req) {\n\t\t\t\t\tfor (let i = 0; getCookieFromRequest(req, `${key}.${i}`) !== null; i++) {\n\t\t\t\t\t\tsetCookies.push(buildCookieString(`${key}.${i}`, '', cookieOptions));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst existing = res.getHeader('set-cookie');\n\t\t\t\tconst existingArr = Array.isArray(existing) ? existing : existing ? [String(existing)] : [];\n\n\t\t\t\tres.setHeader('set-cookie', [...existingArr, ...setCookies]);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\tstore.delete(key);\n\n\t\t\t\tfor (let i = 0; store.get(`${key}.${i}`); i++) {\n\t\t\t\t\tstore.delete(`${key}.${i}`);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n\n\treturn storage;\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { NextServerStorage, SessionIdCookieStorageOptions, EncryptedCookieStorageOptions } from './types';
2
+ export * from '@strivacity/sdk-react/storages';
3
+ /**
4
+ * Creates a session storage that puts a random unique id value cookie on the client and keeping the actual session data in the given `storage`.
5
+ *
6
+ * @param {NextServerStorage} storage - The storage used to persist session data, keyed by a randomly generated session id.
7
+ * @param {SessionIdCookieStorageOptions} [options] - Options for configuring the session-id cookie storage.
8
+ * @returns {NextServerStorage} An object implementing the ServerStorage interface for managing sessions indexed by a session-id cookie.
9
+ */
10
+ export declare function createSessionIdCookieStorage(storage: NextServerStorage, options?: SessionIdCookieStorageOptions): NextServerStorage;
11
+ /**
12
+ * Creates an encrypted cookie session storage.
13
+ * Only callable in server-side contexts (middleware, API routes, or server components).
14
+ *
15
+ * @param secret - The secret key used for encryption and decryption.
16
+ * @param {EncryptedCookieStorageOptions} [options] - Options for configuring the encrypted cookie storage.
17
+ * @param {Partial<ServerCookieOptions>} [options.defaultCookieOptions] - Default cookie attributes for the encrypted cookie.
18
+ * @returns An object implementing the ServerStorage interface for managing encrypted cookies.
19
+ */
20
+ export declare function createEncryptedCookieStorage(secret: string, options?: EncryptedCookieStorageOptions): NextServerStorage;
@@ -0,0 +1,2 @@
1
+ import{NextRequest as e,NextResponse as t}from"next/server";import{COOKIE_CHUNK_SIZE as n,COOKIE_CONTEXT as r}from"@strivacity/sdk-core/server";import{cookies as i}from"next/headers";import{buildCookieString as a}from"@strivacity/sdk-core/utils/common";import{decryptString as o,encryptString as s}from"@strivacity/sdk-core/utils/crypto";import{createSessionIdCookieStorage as c}from"@strivacity/sdk-core/storages/server";export*from"@strivacity/sdk-react/storages";function l(t,n){if(t instanceof e)return t.cookies.get(n)?.value??null;if(t instanceof Request){let e=(t.headers.get(`cookie`)??``).split(`;`).map(e=>e.trim()).find(e=>e.startsWith(`${n}=`));return e?decodeURIComponent(e.slice(n.length+1)):null}let r=(t.headers?.cookie??``).split(`;`).map(e=>e.trim()).find(e=>e.startsWith(`${n}=`));return r?decodeURIComponent(r.slice(n.length+1)):null}function u(e,n){return c({toRequest:e=>e,redirect:(e,n)=>t.redirect(e,n),getSessionId:async(e,t)=>t?l(t,e)??null:(await i()).get(e)?.value},e,n)}function d(e,c){let u={httpOnly:!0,secure:!0,path:`/`,sameSite:`lax`,...c?.defaultCookieOptions},d={async get(t,n){if(n){let i=l(n,t);if(i)return await o(i,e,r);let a=[];for(let e=0;;e++){let r=l(n,`${t}.${e}`);if(!r)break;a.push(r)}return a.length===0?null:await o(a.join(``),e,r)}{let n=await i(),a=n.get(t)?.value;if(a)return await o(a,e,r);let s=[];for(let e=0;;e++){let r=n.get(`${t}.${e}`)?.value;if(!r)break;s.push(r)}return s.length===0?null:await o(s.join(``),e,r)}},async set(o,c,l,f,p){p={...u,...p},await d.delete(o,l,f);let m=await s(c,e,r);if(f instanceof t){if(m.length<=n)f.cookies.set(o,m,p);else for(let e=0;e*n<m.length;e++)f.cookies.set(`${o}.${e}`,m.slice(e*n,(e+1)*n),p)}else if(f){let e=[];if(m.length<=n)e.push(a(o,m,p));else for(let t=0;t*n<m.length;t++)e.push(a(`${o}.${t}`,m.slice(t*n,(t+1)*n),p));let t=f.getHeader(`set-cookie`),r=Array.isArray(t)?t:t?[String(t)]:[];f.setHeader(`set-cookie`,[...r,...e])}else{let e=await i();if(m.length<=n)e.set(o,m,p);else for(let t=0;t*n<m.length;t++)e.set(`${o}.${t}`,m.slice(t*n,(t+1)*n),p)}},async delete(e,n,r,o){if(o={...u,...o,maxAge:0},r instanceof t){r.cookies.delete(e);for(let t=0;r.cookies.get(`${e}.${t}`);t++)r.cookies.delete(`${e}.${t}`)}else if(r){let t=[];if(t.push(a(e,``,o)),n)for(let r=0;l(n,`${e}.${r}`)!==null;r++)t.push(a(`${e}.${r}`,``,o));let i=r.getHeader(`set-cookie`),s=Array.isArray(i)?i:i?[String(i)]:[];r.setHeader(`set-cookie`,[...s,...t])}else{let t=await i();t.delete(e);for(let n=0;t.get(`${e}.${n}`);n++)t.delete(`${e}.${n}`)}}};return d}export{d as createEncryptedCookieStorage,u as createSessionIdCookieStorage};
2
+ //# sourceMappingURL=storages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storages.mjs","names":[],"sources":["../../src/server/storages.ts"],"sourcesContent":["import type { NextServerStorage, PagesRouterRequest, SessionIdCookieStorageOptions, EncryptedCookieStorageOptions } from './types';\nimport { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { buildCookieString } from '@strivacity/sdk-core/utils/common';\nimport { encryptString, decryptString } from '@strivacity/sdk-core/utils/crypto';\nimport { COOKIE_CONTEXT, COOKIE_CHUNK_SIZE } from '@strivacity/sdk-core/server';\nimport { createSessionIdCookieStorage as createSessionIdCookieStorageBase } from '@strivacity/sdk-core/storages/server';\n\nexport * from '@strivacity/sdk-react/storages';\n\n/**\n * Reads cookie value(s) for a given key directly from a NextRequest or PagesRouterRequest, without calling `cookies()` from next/headers.\n * Used for Pages Router / middleware support.\n *\n * @param req - The NextRequest or PagesRouterRequest object from which to read the cookie.\n * @param key - The name of the cookie to read.\n * @returns The cookie value as a string, or null if the cookie is not found.\n */\nfunction getCookieFromRequest(req: NextRequest | Request | PagesRouterRequest, key: string): string | null {\n\tif (req instanceof NextRequest) {\n\t\treturn req.cookies.get(key)?.value ?? null;\n\t}\n\n\tif (req instanceof Request) {\n\t\tconst cookieHeader = req.headers.get('cookie') ?? '';\n\t\tconst match = cookieHeader\n\t\t\t.split(';')\n\t\t\t.map((c) => c.trim())\n\t\t\t.find((c) => c.startsWith(`${key}=`));\n\n\t\treturn match ? decodeURIComponent(match.slice(key.length + 1)) : null;\n\t}\n\n\tconst cookieHeader = req.headers?.cookie ?? '';\n\tconst match = cookieHeader\n\t\t.split(';')\n\t\t.map((c: string) => c.trim())\n\t\t.find((c: string) => c.startsWith(`${key}=`));\n\n\treturn match ? decodeURIComponent(match.slice(key.length + 1)) : null;\n}\n\n/**\n * Creates a session storage that puts a random unique id value cookie on the client and keeping the actual session data in the given `storage`.\n *\n * @param {NextServerStorage} storage - The storage used to persist session data, keyed by a randomly generated session id.\n * @param {SessionIdCookieStorageOptions} [options] - Options for configuring the session-id cookie storage.\n * @returns {NextServerStorage} An object implementing the ServerStorage interface for managing sessions indexed by a session-id cookie.\n */\nexport function createSessionIdCookieStorage(storage: NextServerStorage, options?: SessionIdCookieStorageOptions): NextServerStorage {\n\treturn createSessionIdCookieStorageBase<NextRequest | Request | PagesRouterRequest>(\n\t\t{\n\t\t\ttoRequest: (req) => req as Request,\n\t\t\tredirect: (url, status) => NextResponse.redirect(url, status),\n\t\t\tgetSessionId: async (key, req) => {\n\t\t\t\tif (req) {\n\t\t\t\t\treturn getCookieFromRequest(req, key) ?? null;\n\t\t\t\t}\n\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\treturn store.get(key)?.value;\n\t\t\t},\n\t\t},\n\t\tstorage,\n\t\toptions,\n\t);\n}\n\n/**\n * Creates an encrypted cookie session storage.\n * Only callable in server-side contexts (middleware, API routes, or server components).\n *\n * @param secret - The secret key used for encryption and decryption.\n * @param {EncryptedCookieStorageOptions} [options] - Options for configuring the encrypted cookie storage.\n * @param {Partial<ServerCookieOptions>} [options.defaultCookieOptions] - Default cookie attributes for the encrypted cookie.\n * @returns An object implementing the ServerStorage interface for managing encrypted cookies.\n */\nexport function createEncryptedCookieStorage(secret: string, options?: EncryptedCookieStorageOptions): NextServerStorage {\n\tconst defaultCookieOptions = {\n\t\thttpOnly: true,\n\t\tsecure: true,\n\t\tpath: '/',\n\t\tsameSite: 'lax' as const,\n\t\t...options?.defaultCookieOptions,\n\t};\n\n\tconst storage: NextServerStorage = {\n\t\tasync get(key, req) {\n\t\t\tif (req) {\n\t\t\t\tconst cookie = getCookieFromRequest(req, key);\n\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn await decryptString(cookie, secret, COOKIE_CONTEXT);\n\t\t\t\t}\n\n\t\t\t\tconst cookieChunks: Array<string> = [];\n\n\t\t\t\tfor (let i = 0; ; i++) {\n\t\t\t\t\tconst chunk = getCookieFromRequest(req, `${key}.${i}`);\n\n\t\t\t\t\tif (!chunk) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcookieChunks.push(chunk);\n\t\t\t\t}\n\n\t\t\t\tif (cookieChunks.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn await decryptString(cookieChunks.join(''), secret, COOKIE_CONTEXT);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\t\t\t\tconst cookie = store.get(key)?.value;\n\n\t\t\t\tif (cookie) {\n\t\t\t\t\treturn await decryptString(cookie, secret, COOKIE_CONTEXT);\n\t\t\t\t}\n\n\t\t\t\tconst cookieChunks: Array<string> = [];\n\n\t\t\t\tfor (let i = 0; ; i++) {\n\t\t\t\t\tconst chunk = store.get(`${key}.${i}`)?.value;\n\n\t\t\t\t\tif (!chunk) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcookieChunks.push(chunk);\n\t\t\t\t}\n\n\t\t\t\tif (cookieChunks.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn await decryptString(cookieChunks.join(''), secret, COOKIE_CONTEXT);\n\t\t\t}\n\t\t},\n\t\tasync set(key, value, req, res, cookieOptions) {\n\t\t\tcookieOptions = { ...defaultCookieOptions, ...cookieOptions };\n\n\t\t\t// NOTE: Delete existing cookie(s) first to avoid leaving old chunks behind\n\t\t\tawait storage.delete(key, req, res);\n\n\t\t\tconst encrypted = await encryptString(value, secret, COOKIE_CONTEXT);\n\n\t\t\tif (res instanceof NextResponse) {\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tres.cookies.set(key, encrypted, cookieOptions);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tres.cookies.set(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (res) {\n\t\t\t\tconst setCookies: Array<string> = [];\n\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tsetCookies.push(buildCookieString(key, encrypted, cookieOptions));\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tsetCookies.push(buildCookieString(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst existing = res.getHeader('set-cookie');\n\t\t\t\tconst existingArr = Array.isArray(existing) ? existing : existing ? [String(existing)] : [];\n\n\t\t\t\tres.setHeader('set-cookie', [...existingArr, ...setCookies]);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\tif (encrypted.length <= COOKIE_CHUNK_SIZE) {\n\t\t\t\t\tstore.set(key, encrypted, cookieOptions);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i * COOKIE_CHUNK_SIZE < encrypted.length; i++) {\n\t\t\t\t\t\tstore.set(`${key}.${i}`, encrypted.slice(i * COOKIE_CHUNK_SIZE, (i + 1) * COOKIE_CHUNK_SIZE), cookieOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync delete(key, req, res, cookieOptions) {\n\t\t\tcookieOptions = { ...defaultCookieOptions, ...cookieOptions, maxAge: 0 };\n\n\t\t\tif (res instanceof NextResponse) {\n\t\t\t\tres.cookies.delete(key);\n\n\t\t\t\tfor (let i = 0; res.cookies.get(`${key}.${i}`); i++) {\n\t\t\t\t\tres.cookies.delete(`${key}.${i}`);\n\t\t\t\t}\n\t\t\t} else if (res) {\n\t\t\t\tconst setCookies: Array<string> = [];\n\n\t\t\t\tsetCookies.push(buildCookieString(key, '', cookieOptions));\n\n\t\t\t\tif (req) {\n\t\t\t\t\tfor (let i = 0; getCookieFromRequest(req, `${key}.${i}`) !== null; i++) {\n\t\t\t\t\t\tsetCookies.push(buildCookieString(`${key}.${i}`, '', cookieOptions));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst existing = res.getHeader('set-cookie');\n\t\t\t\tconst existingArr = Array.isArray(existing) ? existing : existing ? [String(existing)] : [];\n\n\t\t\t\tres.setHeader('set-cookie', [...existingArr, ...setCookies]);\n\t\t\t} else {\n\t\t\t\tconst store = await cookies();\n\n\t\t\t\tstore.delete(key);\n\n\t\t\t\tfor (let i = 0; store.get(`${key}.${i}`); i++) {\n\t\t\t\t\tstore.delete(`${key}.${i}`);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n\n\treturn storage;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ var e=require("@strivacity/sdk-core/types");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
@@ -0,0 +1,101 @@
1
+ import { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { ParsedUrlQuery } from 'node:querystring';
3
+ import { GetServerSideProps, GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler, NextApiRequest, NextApiResponse } from 'next';
4
+ import { NextRequest, NextResponse } from 'next/server';
5
+ import { ServerSDKOptions, ServerSDKInitConfig, SDKStorage, SessionData, CookieOptions, LogoutTokenClaims, BaseServerSDK } from './types';
6
+ export * from '@strivacity/sdk-core/types';
7
+ export type PagesRouterRequest = IncomingMessage | NextApiRequest;
8
+ export type PagesRouterResponse = ServerResponse<IncomingMessage> | NextApiResponse;
9
+ export type AppRouteHandlerFnContext = {
10
+ /**
11
+ * The parameters passed to the API route handler.
12
+ */
13
+ params?: Promise<Record<string, string | string[]>>;
14
+ };
15
+ export type AppRouteHandlerFn = (req: NextRequest | Request, ctx: AppRouteHandlerFnContext) => Promise<Response> | Response;
16
+ export type WithApiAuthRequiredAppRoute = (apiRoute: AppRouteHandlerFn) => AppRouteHandlerFn;
17
+ export type WithApiAuthRequiredPageRoute = (apiRoute: NextApiHandler) => NextApiHandler;
18
+ export type WithApiAuthRequired = WithApiAuthRequiredAppRoute & WithApiAuthRequiredPageRoute;
19
+ export type GetServerSidePropsResultWithSession<P = any> = GetServerSidePropsResult<P & {
20
+ session: SessionData;
21
+ }>;
22
+ export type PageRoute<P, Q extends ParsedUrlQuery = ParsedUrlQuery> = (ctx: GetServerSidePropsContext<Q>) => Promise<GetServerSidePropsResultWithSession<P>>;
23
+ export type AppRouterPageRouteOpts = {
24
+ /**
25
+ * The parameters passed to the page route.
26
+ */
27
+ params?: Promise<Record<string, string | string[]>>;
28
+ /**
29
+ * The search parameters passed to the page route.
30
+ */
31
+ searchParams?: Promise<{
32
+ [key: string]: string | string[] | undefined;
33
+ }>;
34
+ /**
35
+ * The session data for the authenticated user, if available.
36
+ */
37
+ session?: SessionData;
38
+ };
39
+ export type AppRouterPageRoute<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts> = (obj: P) => Promise<any> | any;
40
+ export type WithAuthGuardPageRouterOptions<P extends {
41
+ [key: string]: any;
42
+ } = {
43
+ [key: string]: any;
44
+ }, Q extends ParsedUrlQuery = ParsedUrlQuery> = {
45
+ /**
46
+ * Returns the result of the `getServerSideProps` function, which is used to fetch data for a page before rendering it.
47
+ * This function is executed on the server side and allows you to pass props to the page component.
48
+ *
49
+ * @param {GetServerSidePropsContext<Q>} ctx - The context object containing information about the request and response.
50
+ * @returns {Promise<GetServerSidePropsResultWithSession<P>>} The result of the `getServerSideProps` function, which includes the props to be passed to the page component.
51
+ */
52
+ getServerSideProps?: GetServerSideProps<P, Q>;
53
+ /**
54
+ * The URL to redirect the user to after a successful login.
55
+ */
56
+ returnTo?: string;
57
+ };
58
+ export type WithAuthGuardPageRouter = <P extends {
59
+ [key: string]: any;
60
+ } = {
61
+ [key: string]: any;
62
+ }, Q extends ParsedUrlQuery = ParsedUrlQuery>(opts?: WithAuthGuardPageRouterOptions<P, Q>) => PageRoute<P, Q>;
63
+ export type WithAuthGuardAppRouterOptions<P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts> = {
64
+ /**
65
+ * The URL to redirect the user to after a successful login.
66
+ */
67
+ returnTo?: string | ((obj: P) => Promise<string> | string);
68
+ };
69
+ export type WithAuthGuardAppRouter = <P extends AppRouterPageRouteOpts = AppRouterPageRouteOpts>(fn: AppRouterPageRoute<P>, opts?: WithAuthGuardAppRouterOptions<P>) => AppRouterPageRoute<P>;
70
+ export type WithAuthGuard = WithAuthGuardPageRouter & WithAuthGuardAppRouter;
71
+ export type NextServerStorage = SDKStorage<[
72
+ req?: NextRequest | Request | PagesRouterRequest
73
+ ], [
74
+ req?: NextRequest | Request | PagesRouterRequest,
75
+ res?: NextResponse | PagesRouterResponse,
76
+ cookieOptions?: CookieOptions
77
+ ], [
78
+ req?: NextRequest | Request | PagesRouterRequest,
79
+ res?: NextResponse | PagesRouterResponse,
80
+ cookieOptions?: CookieOptions
81
+ ]> & {
82
+ deleteByLogoutToken?(token: LogoutTokenClaims): Promise<void>;
83
+ };
84
+ export type NextServerSDKOptions<Storage extends NextServerStorage = NextServerStorage, StateStorage extends SDKStorage = SDKStorage> = ServerSDKOptions<Storage, StateStorage>;
85
+ export type NextServerSDKInitConfig<Storage extends NextServerStorage = NextServerStorage, StateStorage extends SDKStorage = SDKStorage> = ServerSDKInitConfig & Partial<NextServerSDKOptions<Storage, StateStorage>>;
86
+ export type NextServerSDK<TEvent extends NextRequest | Request | PagesRouterRequest | undefined = NextRequest | Request | PagesRouterRequest | undefined> = BaseServerSDK<TEvent> & {
87
+ /**
88
+ * Wraps a React component with an authentication guard. If the user is not authenticated, they will be redirected to the login page.
89
+ *
90
+ * @param {React.ComponentType<any>} Component - The React component to wrap with the authentication guard.
91
+ * @returns {React.ComponentType<any>} A new React component that includes the authentication guard.
92
+ */
93
+ withAuthGuard: WithAuthGuard;
94
+ /**
95
+ * Wraps an API route handler with an authentication guard. Returns 401 if the user is not authenticated.
96
+ *
97
+ * @param {AppRouteHandlerFn | NextApiHandler} apiRoute - The API route handler to wrap.
98
+ * @returns The wrapped handler that enforces authentication.
99
+ */
100
+ withApiAuthRequired: WithApiAuthRequired;
101
+ };
@@ -0,0 +1 @@
1
+ export*from"@strivacity/sdk-core/types";
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("next/server");function t(e){let t;try{let n=e?.nextUrl;if(n)typeof n.basePath==`string`&&n.basePath&&(t={basePath:n.basePath}),(typeof n.locale==`string`||typeof n.defaultLocale==`string`)&&(t={...t||{},i18n:{locales:n.locale?[n.locale]:[],defaultLocale:n.defaultLocale??``}}),typeof n.trailingSlash==`boolean`&&(t={...t||{},trailingSlash:n.trailingSlash});else{let n=e,r=n?.headers?.[`accept-language`],i=n?.cookies?.NEXT_LOCALE??(typeof r==`string`?r.trim():void 0);i&&(t={i18n:{locales:[i],defaultLocale:``}})}}catch{}return t&&Object.keys(t).length?t:void 0}function n(n){if(n instanceof e.NextRequest)return n;let r=t(n),i={method:n.method,headers:n.headers,body:n.body,duplex:n.duplex??`half`,signal:n.signal??void 0};return r&&(i.nextConfig=r),new e.NextRequest(n.url,i)}exports.collectFromNextUrl=t,exports.toNextRequest=n;var r=require("@strivacity/sdk-core/utils");Object.keys(r).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return r[e]}})});
2
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/server/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { NextConfig } from 'next';\nimport type { NextApiRequest } from 'next/types';\nimport { NextRequest } from 'next/server';\n\ninterface NextUrlShape {\n\tbasePath?: string;\n\tlocale?: string;\n\tdefaultLocale?: string;\n\ttrailingSlash?: boolean;\n}\n\ntype RequestWithNextUrl = Request & { nextUrl?: NextUrlShape };\ntype RequestWithDuplex = Request & { duplex?: 'half' };\ntype RequestInitWithNext = Omit<RequestInit, 'signal' | 'duplex'> & { nextConfig?: NextConfig; duplex?: 'half'; signal?: AbortSignal };\n\nexport * from '@strivacity/sdk-core/utils';\n\n/**\n * Collects Next.js configuration from a Request object, which can be a NextRequest, IncomingMessage, or NextApiRequest.\n *\n * @param input - The Request object from which to collect Next.js configuration.\n * @returns A NextConfig object containing the collected configuration, or undefined if no configuration could be collected.\n */\nexport function collectFromNextUrl(input?: RequestWithNextUrl | IncomingMessage | NextApiRequest): NextConfig | undefined {\n\tlet config: NextConfig | undefined;\n\n\ttry {\n\t\tconst nextUrl = (input as RequestWithNextUrl)?.nextUrl;\n\n\t\tif (nextUrl) {\n\t\t\t// App Router: NextRequest\n\t\t\tif (typeof nextUrl.basePath === 'string' && nextUrl.basePath) {\n\t\t\t\tconfig = { basePath: nextUrl.basePath };\n\t\t\t}\n\n\t\t\tif (typeof nextUrl.locale === 'string' || typeof nextUrl.defaultLocale === 'string') {\n\t\t\t\tconfig = {\n\t\t\t\t\t...(config || {}),\n\t\t\t\t\ti18n: {\n\t\t\t\t\t\tlocales: nextUrl.locale ? [nextUrl.locale] : [],\n\t\t\t\t\t\tdefaultLocale: nextUrl.defaultLocale ?? '',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (typeof nextUrl.trailingSlash === 'boolean') {\n\t\t\t\tconfig = { ...(config || {}), trailingSlash: nextUrl.trailingSlash };\n\t\t\t}\n\t\t} else {\n\t\t\t// Pages Router: IncomingMessage / NextApiRequest\n\t\t\tconst pagesReq = input as NextApiRequest;\n\t\t\tconst acceptLanguage = pagesReq?.headers?.['accept-language'];\n\t\t\tconst locale = pagesReq?.cookies?.['NEXT_LOCALE'] ?? (typeof acceptLanguage === 'string' ? acceptLanguage.trim() : undefined);\n\n\t\t\tif (locale) {\n\t\t\t\tconfig = { i18n: { locales: [locale], defaultLocale: '' } };\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// ignore inaccessible input\n\t}\n\n\treturn config && Object.keys(config).length ? config : undefined;\n}\n\n/**\n * Converts a Request or NextRequest to a NextRequest.\n *\n * @param input - The Request or NextRequest object to convert.\n * @returns A NextRequest object representing the input request.\n */\nexport function toNextRequest(input: Request | NextRequest): NextRequest {\n\tif (input instanceof NextRequest) {\n\t\treturn input;\n\t}\n\n\tconst nextConfig = collectFromNextUrl(input);\n\n\tconst init: RequestInitWithNext = {\n\t\tmethod: input.method,\n\t\theaders: input.headers,\n\t\tbody: input.body,\n\t\tduplex: (input as RequestWithDuplex).duplex ?? 'half',\n\t\tsignal: input.signal ?? undefined,\n\t};\n\n\tif (nextConfig) {\n\t\tinit.nextConfig = nextConfig;\n\t}\n\n\treturn new NextRequest(input.url, init);\n}\n"],"mappings":"gGAwBA,SAAgB,EAAmB,EAAuF,CACzH,IAAI,EAEJ,GAAI,CACH,IAAM,EAAW,GAA8B,QAE/C,GAAI,EAEC,OAAO,EAAQ,UAAa,UAAY,EAAQ,WACnD,EAAS,CAAE,SAAU,EAAQ,QAAS,IAGnC,OAAO,EAAQ,QAAW,UAAY,OAAO,EAAQ,eAAkB,YAC1E,EAAS,CACR,GAAI,GAAU,CAAC,EACf,KAAM,CACL,QAAS,EAAQ,OAAS,CAAC,EAAQ,MAAM,EAAI,CAAC,EAC9C,cAAe,EAAQ,eAAiB,EACzC,CACD,GAGG,OAAO,EAAQ,eAAkB,YACpC,EAAS,CAAE,GAAI,GAAU,CAAC,EAAI,cAAe,EAAQ,aAAc,OAE9D,CAEN,IAAM,EAAW,EACX,EAAiB,GAAU,UAAU,mBACrC,EAAS,GAAU,SAAU,cAAmB,OAAO,GAAmB,SAAW,EAAe,KAAK,EAAI,IAAA,IAE/G,IACH,EAAS,CAAE,KAAM,CAAE,QAAS,CAAC,CAAM,EAAG,cAAe,EAAG,CAAE,EAE5D,CACD,MAAQ,CAER,CAEA,OAAO,GAAU,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,EAAS,IAAA,EACxD,CAQA,SAAgB,EAAc,EAA2C,CACxE,GAAI,aAAiB,EAAA,YACpB,OAAO,EAGR,IAAM,EAAa,EAAmB,CAAK,EAErC,EAA4B,CACjC,OAAQ,EAAM,OACd,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,OAAS,EAA4B,QAAU,OAC/C,OAAQ,EAAM,QAAU,IAAA,EACzB,EAMA,OAJI,IACH,EAAK,WAAa,GAGZ,IAAI,EAAA,YAAY,EAAM,IAAK,CAAI,CACvC"}
@@ -0,0 +1,28 @@
1
+ import { IncomingMessage } from 'node:http';
2
+ import { NextConfig } from 'next';
3
+ import { NextApiRequest } from 'next/types';
4
+ import { NextRequest } from 'next/server';
5
+ interface NextUrlShape {
6
+ basePath?: string;
7
+ locale?: string;
8
+ defaultLocale?: string;
9
+ trailingSlash?: boolean;
10
+ }
11
+ type RequestWithNextUrl = Request & {
12
+ nextUrl?: NextUrlShape;
13
+ };
14
+ export * from '@strivacity/sdk-core/utils';
15
+ /**
16
+ * Collects Next.js configuration from a Request object, which can be a NextRequest, IncomingMessage, or NextApiRequest.
17
+ *
18
+ * @param input - The Request object from which to collect Next.js configuration.
19
+ * @returns A NextConfig object containing the collected configuration, or undefined if no configuration could be collected.
20
+ */
21
+ export declare function collectFromNextUrl(input?: RequestWithNextUrl | IncomingMessage | NextApiRequest): NextConfig | undefined;
22
+ /**
23
+ * Converts a Request or NextRequest to a NextRequest.
24
+ *
25
+ * @param input - The Request or NextRequest object to convert.
26
+ * @returns A NextRequest object representing the input request.
27
+ */
28
+ export declare function toNextRequest(input: Request | NextRequest): NextRequest;
@@ -0,0 +1,2 @@
1
+ import{NextRequest as e}from"next/server";export*from"@strivacity/sdk-core/utils";function t(e){let t;try{let n=e?.nextUrl;if(n)typeof n.basePath==`string`&&n.basePath&&(t={basePath:n.basePath}),(typeof n.locale==`string`||typeof n.defaultLocale==`string`)&&(t={...t||{},i18n:{locales:n.locale?[n.locale]:[],defaultLocale:n.defaultLocale??``}}),typeof n.trailingSlash==`boolean`&&(t={...t||{},trailingSlash:n.trailingSlash});else{let n=e,r=n?.headers?.[`accept-language`],i=n?.cookies?.NEXT_LOCALE??(typeof r==`string`?r.trim():void 0);i&&(t={i18n:{locales:[i],defaultLocale:``}})}}catch{}return t&&Object.keys(t).length?t:void 0}function n(n){if(n instanceof e)return n;let r=t(n),i={method:n.method,headers:n.headers,body:n.body,duplex:n.duplex??`half`,signal:n.signal??void 0};return r&&(i.nextConfig=r),new e(n.url,i)}export{t as collectFromNextUrl,n as toNextRequest};
2
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/server/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { NextConfig } from 'next';\nimport type { NextApiRequest } from 'next/types';\nimport { NextRequest } from 'next/server';\n\ninterface NextUrlShape {\n\tbasePath?: string;\n\tlocale?: string;\n\tdefaultLocale?: string;\n\ttrailingSlash?: boolean;\n}\n\ntype RequestWithNextUrl = Request & { nextUrl?: NextUrlShape };\ntype RequestWithDuplex = Request & { duplex?: 'half' };\ntype RequestInitWithNext = Omit<RequestInit, 'signal' | 'duplex'> & { nextConfig?: NextConfig; duplex?: 'half'; signal?: AbortSignal };\n\nexport * from '@strivacity/sdk-core/utils';\n\n/**\n * Collects Next.js configuration from a Request object, which can be a NextRequest, IncomingMessage, or NextApiRequest.\n *\n * @param input - The Request object from which to collect Next.js configuration.\n * @returns A NextConfig object containing the collected configuration, or undefined if no configuration could be collected.\n */\nexport function collectFromNextUrl(input?: RequestWithNextUrl | IncomingMessage | NextApiRequest): NextConfig | undefined {\n\tlet config: NextConfig | undefined;\n\n\ttry {\n\t\tconst nextUrl = (input as RequestWithNextUrl)?.nextUrl;\n\n\t\tif (nextUrl) {\n\t\t\t// App Router: NextRequest\n\t\t\tif (typeof nextUrl.basePath === 'string' && nextUrl.basePath) {\n\t\t\t\tconfig = { basePath: nextUrl.basePath };\n\t\t\t}\n\n\t\t\tif (typeof nextUrl.locale === 'string' || typeof nextUrl.defaultLocale === 'string') {\n\t\t\t\tconfig = {\n\t\t\t\t\t...(config || {}),\n\t\t\t\t\ti18n: {\n\t\t\t\t\t\tlocales: nextUrl.locale ? [nextUrl.locale] : [],\n\t\t\t\t\t\tdefaultLocale: nextUrl.defaultLocale ?? '',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (typeof nextUrl.trailingSlash === 'boolean') {\n\t\t\t\tconfig = { ...(config || {}), trailingSlash: nextUrl.trailingSlash };\n\t\t\t}\n\t\t} else {\n\t\t\t// Pages Router: IncomingMessage / NextApiRequest\n\t\t\tconst pagesReq = input as NextApiRequest;\n\t\t\tconst acceptLanguage = pagesReq?.headers?.['accept-language'];\n\t\t\tconst locale = pagesReq?.cookies?.['NEXT_LOCALE'] ?? (typeof acceptLanguage === 'string' ? acceptLanguage.trim() : undefined);\n\n\t\t\tif (locale) {\n\t\t\t\tconfig = { i18n: { locales: [locale], defaultLocale: '' } };\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// ignore inaccessible input\n\t}\n\n\treturn config && Object.keys(config).length ? config : undefined;\n}\n\n/**\n * Converts a Request or NextRequest to a NextRequest.\n *\n * @param input - The Request or NextRequest object to convert.\n * @returns A NextRequest object representing the input request.\n */\nexport function toNextRequest(input: Request | NextRequest): NextRequest {\n\tif (input instanceof NextRequest) {\n\t\treturn input;\n\t}\n\n\tconst nextConfig = collectFromNextUrl(input);\n\n\tconst init: RequestInitWithNext = {\n\t\tmethod: input.method,\n\t\theaders: input.headers,\n\t\tbody: input.body,\n\t\tduplex: (input as RequestWithDuplex).duplex ?? 'half',\n\t\tsignal: input.signal ?? undefined,\n\t};\n\n\tif (nextConfig) {\n\t\tinit.nextConfig = nextConfig;\n\t}\n\n\treturn new NextRequest(input.url, init);\n}\n"],"mappings":"kFAwBA,SAAgB,EAAmB,EAAuF,CACzH,IAAI,EAEJ,GAAI,CACH,IAAM,EAAW,GAA8B,QAE/C,GAAI,EAEC,OAAO,EAAQ,UAAa,UAAY,EAAQ,WACnD,EAAS,CAAE,SAAU,EAAQ,QAAS,IAGnC,OAAO,EAAQ,QAAW,UAAY,OAAO,EAAQ,eAAkB,YAC1E,EAAS,CACR,GAAI,GAAU,CAAC,EACf,KAAM,CACL,QAAS,EAAQ,OAAS,CAAC,EAAQ,MAAM,EAAI,CAAC,EAC9C,cAAe,EAAQ,eAAiB,EACzC,CACD,GAGG,OAAO,EAAQ,eAAkB,YACpC,EAAS,CAAE,GAAI,GAAU,CAAC,EAAI,cAAe,EAAQ,aAAc,OAE9D,CAEN,IAAM,EAAW,EACX,EAAiB,GAAU,UAAU,mBACrC,EAAS,GAAU,SAAU,cAAmB,OAAO,GAAmB,SAAW,EAAe,KAAK,EAAI,IAAA,IAE/G,IACH,EAAS,CAAE,KAAM,CAAE,QAAS,CAAC,CAAM,EAAG,cAAe,EAAG,CAAE,EAE5D,CACD,MAAQ,CAER,CAEA,OAAO,GAAU,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,EAAS,IAAA,EACxD,CAQA,SAAgB,EAAc,EAA2C,CACxE,GAAI,aAAiB,EACpB,OAAO,EAGR,IAAM,EAAa,EAAmB,CAAK,EAErC,EAA4B,CACjC,OAAQ,EAAM,OACd,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,OAAS,EAA4B,QAAU,OAC/C,OAAQ,EAAM,QAAU,IAAA,EACzB,EAMA,OAJI,IACH,EAAK,WAAa,GAGZ,IAAI,EAAY,EAAM,IAAK,CAAI,CACvC"}
package/dist/types.cjs CHANGED
@@ -1,2 +1 @@
1
- "use strict";
2
- //# sourceMappingURL=types.cjs.map
1
+ require("./client/types.cjs"),require("./server/types.cjs");var e=require("@strivacity/sdk-react/types");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});var t=require("@strivacity/sdk-core/types");Object.keys(t).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})});