@sqrzro/server 2.0.0-bz.5 → 2.0.0-bz.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +25 -1
- package/auth.d.ts +1 -0
- package/auth.js +1 -0
- package/cache.d.ts +1 -0
- package/cache.js +1 -0
- package/dist/auth/index.cjs +63 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +106 -0
- package/dist/auth/index.d.ts +106 -0
- package/dist/auth/index.js +21 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/index.cjs +10 -0
- package/dist/cache/index.cjs.map +1 -0
- package/dist/cache/index.d.cts +4 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.js +7 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/database/schema.cjs +16 -0
- package/dist/database/schema.cjs.map +1 -0
- package/dist/database/schema.d.cts +288 -0
- package/dist/database/schema.d.ts +288 -0
- package/dist/database/schema.js +7 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/forms/index.cjs +22 -0
- package/dist/forms/index.cjs.map +1 -0
- package/dist/forms/index.d.cts +50 -0
- package/dist/forms/index.d.ts +50 -0
- package/dist/forms/index.js +8 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/lists/index.cjs +9 -0
- package/dist/lists/index.cjs.map +1 -0
- package/dist/lists/index.d.cts +18 -0
- package/dist/lists/index.d.ts +18 -0
- package/dist/lists/index.js +7 -0
- package/dist/lists/index.js.map +1 -0
- package/dist/mail/index.cjs +9 -0
- package/dist/mail/index.cjs.map +1 -0
- package/dist/mail/index.d.cts +20 -0
- package/dist/mail/index.d.ts +20 -0
- package/dist/mail/index.js +5 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/middleware.cjs +9 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.cts +5 -0
- package/dist/middleware.d.ts +5 -4
- package/dist/middleware.js +7 -36
- package/dist/middleware.js.map +1 -0
- package/dist/url/index.cjs +12 -0
- package/dist/url/index.cjs.map +1 -0
- package/dist/url/index.d.cts +33 -0
- package/dist/url/index.d.ts +33 -0
- package/dist/url/index.js +7 -0
- package/dist/url/index.js.map +1 -0
- package/forms.d.ts +1 -0
- package/forms.js +1 -0
- package/jest.config.js +7 -0
- package/lists.d.ts +1 -0
- package/lists.js +1 -0
- package/mail.d.ts +1 -0
- package/mail.js +1 -0
- package/middleware.js +1 -1
- package/next-env.d.ts +5 -0
- package/package.json +77 -20
- package/schema.d.ts +1 -0
- package/schema.js +1 -0
- package/url.d.ts +1 -0
- package/url.js +1 -0
- package/dist/AuthService.d.ts +0 -10
- package/dist/AuthService.js +0 -36
- package/dist/DataService.d.ts +0 -29
- package/dist/DataService.js +0 -64
- package/dist/ImageService.d.ts +0 -7
- package/dist/ImageService.js +0 -23
- package/dist/LoginRequest.d.ts +0 -4
- package/dist/LoginRequest.js +0 -11
- package/dist/PasswordService.d.ts +0 -6
- package/dist/PasswordService.js +0 -63
- package/dist/RequestService.d.ts +0 -21
- package/dist/RequestService.js +0 -71
- package/dist/SessionService.d.ts +0 -5
- package/dist/SessionService.js +0 -56
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -11
- package/dist/interfaces.d.ts +0 -11
- package/dist/interfaces.js +0 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
async function g(e,t){return Promise.resolve(async()=>Promise.resolve({subject:e,template:t}))}async function m(e,t){let{subject:s,template:r}=await e(),n=(await import('react-dom/server')).default;return {subject:s,html:n.renderToString(r(t))}}function l(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let e=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!e?.groups?.name||!e?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:e.groups.email.trim(),name:e.groups.name.trim()}}async function p(e){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[t,s]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(e.to)?e.to.map(n=>({email:n})):[{email:e.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${t}`,{method:"POST",headers:{"Api-Token":s,"Content-Type":"application/json"},body:JSON.stringify({attachments:e.attachments,bcc:e.bcc?.map(a=>({email:a})),cc:e.cc?.map(a=>({email:a})),from:e.from,html:e.html,subject:e.subject,to:r})})).json()).success}catch{return !1}}async function u(e,t,s,r,n){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let i=l(),{subject:a,html:o}=await m(await e,t),c={attachments:n,bcc:r?.bcc,cc:r?.cc,from:i,html:o,subject:a,to:s};return p(c)}
|
|
4
|
+
|
|
5
|
+
exports.createMail = g;
|
|
6
|
+
exports.getMail = m;
|
|
7
|
+
exports.sendMail = u;
|
|
8
|
+
//# sourceMappingURL=out.js.map
|
|
9
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["createMail","subject","template","getMail","mail","data","ReactDOMServer","getSenderDetails","matches","sendDevelopmentMail","sendObject","id","key","to","email","sendMail","options","attachments","from","html"],"mappings":"AASA,eAAsBA,EAClBC,EACAC,EACkB,CAClB,OAAO,QAAQ,QAAQ,SAAY,QAAQ,QAAQ,CAAE,QAAAD,EAAS,SAAAC,CAAS,CAAC,CAAC,CAC7E,CAEA,eAAsBC,EAClBC,EACAC,EAC0C,CAC1C,GAAM,CAAE,QAAAJ,EAAS,SAAAC,CAAS,EAAI,MAAME,EAAK,EACnCE,GAAkB,KAAM,QAAO,kBAAkB,GAAG,QAE1D,MAAO,CACH,QAAAL,EACA,KAAMK,EAAe,eAAeJ,EAASG,CAAI,CAAC,CACtD,CACJ,CAEA,SAASE,GAAoD,CACzD,GAAI,CAAC,QAAQ,IAAI,UACb,MAAM,IAAI,MAAM,oCAAoC,EAGxD,IAAMC,EAAU,qCAAqC,KAAK,QAAQ,IAAI,SAAS,EAE/E,GAAI,CAACA,GAAS,QAAQ,MAAQ,CAACA,GAAS,QAAQ,MAC5C,MAAM,IAAI,MACN,2EACJ,EAGJ,MAAO,CACH,MAAOA,EAAQ,OAAO,MAAM,KAAK,EACjC,KAAMA,EAAQ,OAAO,KAAK,KAAK,CACnC,CACJ,CAYA,eAAeC,EAAoBC,EAA8C,CAC7E,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAQnD,GAAM,CAACC,EAAIC,CAAG,EAAI,QAAQ,IAAI,aAAa,MAAM,GAAG,EAE9CC,EAAK,MAAM,QAAQH,EAAW,EAAE,EAChCA,EAAW,GAAG,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EACxC,CAAC,CAAE,MAAOJ,EAAW,EAAG,CAAC,EAE/B,GAAI,CAeA,OADc,MAbG,MAAM,MAAM,4CAA4CC,CAAE,GAAI,CAC3E,OAAQ,OACR,QAAS,CAAE,YAAaC,EAAK,eAAgB,kBAAmB,EAChE,KAAM,KAAK,UAAU,CACjB,YAAaF,EAAW,YACxB,IAAKA,EAAW,KAAK,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC/C,GAAIJ,EAAW,IAAI,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC7C,KAAMJ,EAAW,KACjB,KAAMA,EAAW,KACjB,QAASA,EAAW,QACpB,GAAAG,CACJ,CAAC,CACL,CAAC,GAC4B,KAAK,GACtB,OAChB,MAAc,CACV,MAAO,EACX,CACJ,CAuCA,eAAsBE,EAClBX,EACAC,EACAQ,EACAG,EACAC,EACgB,CAChB,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAGnD,IAAMC,EAAOX,EAAiB,EACxB,CAAE,QAAAN,EAAS,KAAAkB,CAAK,EAAI,MAAMhB,EAAQ,MAAMC,EAAMC,CAAI,EAElDK,EAA6B,CAC/B,YAAAO,EACA,IAAKD,GAAS,IACd,GAAIA,GAAS,GACb,KAAAE,EACA,KAAAC,EACA,QAAAlB,EACA,GAAAY,CACJ,EAKA,OAAOJ,EAAoBC,CAAU,CACzC","sourcesContent":["// import sgMail from '@sendgrid/mail';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\ntype MailFn<T extends object> = () => Promise<MailObject<T>>;\n\nexport async function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): Promise<MailFn<T>> {\n return Promise.resolve(async () => Promise.resolve({ subject, template }));\n}\n\nexport async function getMail<T extends object>(\n mail: MailFn<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = await mail();\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return {\n subject,\n html: ReactDOMServer.renderToString(template(data)),\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[];\n cc?: string[];\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: sendObject.bcc?.map((email) => ({ email })),\n cc: sendObject.cc?.map((email) => ({ email })),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\n// async function sendProductionMail<T extends object>(\n// mail: Promise<MailFn<T>>,\n// data: T,\n// to: string\n// ): Promise<boolean> {\n// if (process.env.NODE_ENV === 'production') {\n// throw new Error('Trying to run production mail in a development environment');\n// }\n\n// if (!process.env.MAIL_ENABLE_PRODUCTION) {\n// throw new Error(\n// 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n// );\n// }\n\n// if (!process.env.MAIL_API_KEY) {\n// throw new Error('Mail API key has not been set');\n// }\n\n// sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n// try {\n// const response = await sgMail.send({\n// to,\n// from,\n// subject,\n// html,\n// });\n// console.log(response);\n\n// return true;\n// } catch (err) {\n// console.log('err', err);\n// return false;\n// }\n// }\n\nexport async function sendMail<T extends object>(\n mail: Promise<MailFn<T>>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(await mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n // For now, just send the email in development.\n // @TODO: Implement the production email sending.\n\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface MailObject<T extends object> {
|
|
2
|
+
subject: string;
|
|
3
|
+
template: (data: T) => Promise<React.ReactElement> | React.ReactElement;
|
|
4
|
+
}
|
|
5
|
+
type MailFn<T extends object> = () => Promise<MailObject<T>>;
|
|
6
|
+
declare function createMail<T extends object>(subject: string, template: (data: T) => Promise<React.ReactElement> | React.ReactElement): Promise<MailFn<T>>;
|
|
7
|
+
declare function getMail<T extends object>(mail: MailFn<T>, data: T): Promise<{
|
|
8
|
+
subject: string;
|
|
9
|
+
html: string;
|
|
10
|
+
}>;
|
|
11
|
+
declare function sendMail<T extends object>(mail: Promise<MailFn<T>>, data: T, to: string[] | string, options?: {
|
|
12
|
+
cc?: string[];
|
|
13
|
+
bcc?: string[];
|
|
14
|
+
}, attachments?: {
|
|
15
|
+
content: string;
|
|
16
|
+
filename: string;
|
|
17
|
+
type: string;
|
|
18
|
+
}[]): Promise<boolean>;
|
|
19
|
+
|
|
20
|
+
export { type MailObject, createMail, getMail, sendMail };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface MailObject<T extends object> {
|
|
2
|
+
subject: string;
|
|
3
|
+
template: (data: T) => Promise<React.ReactElement> | React.ReactElement;
|
|
4
|
+
}
|
|
5
|
+
type MailFn<T extends object> = () => Promise<MailObject<T>>;
|
|
6
|
+
declare function createMail<T extends object>(subject: string, template: (data: T) => Promise<React.ReactElement> | React.ReactElement): Promise<MailFn<T>>;
|
|
7
|
+
declare function getMail<T extends object>(mail: MailFn<T>, data: T): Promise<{
|
|
8
|
+
subject: string;
|
|
9
|
+
html: string;
|
|
10
|
+
}>;
|
|
11
|
+
declare function sendMail<T extends object>(mail: Promise<MailFn<T>>, data: T, to: string[] | string, options?: {
|
|
12
|
+
cc?: string[];
|
|
13
|
+
bcc?: string[];
|
|
14
|
+
}, attachments?: {
|
|
15
|
+
content: string;
|
|
16
|
+
filename: string;
|
|
17
|
+
type: string;
|
|
18
|
+
}[]): Promise<boolean>;
|
|
19
|
+
|
|
20
|
+
export { type MailObject, createMail, getMail, sendMail };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
async function g(e,t){return Promise.resolve(async()=>Promise.resolve({subject:e,template:t}))}async function m(e,t){let{subject:s,template:r}=await e(),n=(await import('react-dom/server')).default;return {subject:s,html:n.renderToString(r(t))}}function l(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let e=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!e?.groups?.name||!e?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:e.groups.email.trim(),name:e.groups.name.trim()}}async function p(e){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[t,s]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(e.to)?e.to.map(n=>({email:n})):[{email:e.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${t}`,{method:"POST",headers:{"Api-Token":s,"Content-Type":"application/json"},body:JSON.stringify({attachments:e.attachments,bcc:e.bcc?.map(a=>({email:a})),cc:e.cc?.map(a=>({email:a})),from:e.from,html:e.html,subject:e.subject,to:r})})).json()).success}catch{return !1}}async function u(e,t,s,r,n){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let i=l(),{subject:a,html:o}=await m(await e,t),c={attachments:n,bcc:r?.bcc,cc:r?.cc,from:i,html:o,subject:a,to:s};return p(c)}
|
|
2
|
+
|
|
3
|
+
export { g as createMail, m as getMail, u as sendMail };
|
|
4
|
+
//# sourceMappingURL=out.js.map
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["createMail","subject","template","getMail","mail","data","ReactDOMServer","getSenderDetails","matches","sendDevelopmentMail","sendObject","id","key","to","email","sendMail","options","attachments","from","html"],"mappings":"AASA,eAAsBA,EAClBC,EACAC,EACkB,CAClB,OAAO,QAAQ,QAAQ,SAAY,QAAQ,QAAQ,CAAE,QAAAD,EAAS,SAAAC,CAAS,CAAC,CAAC,CAC7E,CAEA,eAAsBC,EAClBC,EACAC,EAC0C,CAC1C,GAAM,CAAE,QAAAJ,EAAS,SAAAC,CAAS,EAAI,MAAME,EAAK,EACnCE,GAAkB,KAAM,QAAO,kBAAkB,GAAG,QAE1D,MAAO,CACH,QAAAL,EACA,KAAMK,EAAe,eAAeJ,EAASG,CAAI,CAAC,CACtD,CACJ,CAEA,SAASE,GAAoD,CACzD,GAAI,CAAC,QAAQ,IAAI,UACb,MAAM,IAAI,MAAM,oCAAoC,EAGxD,IAAMC,EAAU,qCAAqC,KAAK,QAAQ,IAAI,SAAS,EAE/E,GAAI,CAACA,GAAS,QAAQ,MAAQ,CAACA,GAAS,QAAQ,MAC5C,MAAM,IAAI,MACN,2EACJ,EAGJ,MAAO,CACH,MAAOA,EAAQ,OAAO,MAAM,KAAK,EACjC,KAAMA,EAAQ,OAAO,KAAK,KAAK,CACnC,CACJ,CAYA,eAAeC,EAAoBC,EAA8C,CAC7E,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAQnD,GAAM,CAACC,EAAIC,CAAG,EAAI,QAAQ,IAAI,aAAa,MAAM,GAAG,EAE9CC,EAAK,MAAM,QAAQH,EAAW,EAAE,EAChCA,EAAW,GAAG,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EACxC,CAAC,CAAE,MAAOJ,EAAW,EAAG,CAAC,EAE/B,GAAI,CAeA,OADc,MAbG,MAAM,MAAM,4CAA4CC,CAAE,GAAI,CAC3E,OAAQ,OACR,QAAS,CAAE,YAAaC,EAAK,eAAgB,kBAAmB,EAChE,KAAM,KAAK,UAAU,CACjB,YAAaF,EAAW,YACxB,IAAKA,EAAW,KAAK,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC/C,GAAIJ,EAAW,IAAI,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC7C,KAAMJ,EAAW,KACjB,KAAMA,EAAW,KACjB,QAASA,EAAW,QACpB,GAAAG,CACJ,CAAC,CACL,CAAC,GAC4B,KAAK,GACtB,OAChB,MAAc,CACV,MAAO,EACX,CACJ,CAuCA,eAAsBE,EAClBX,EACAC,EACAQ,EACAG,EACAC,EACgB,CAChB,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAGnD,IAAMC,EAAOX,EAAiB,EACxB,CAAE,QAAAN,EAAS,KAAAkB,CAAK,EAAI,MAAMhB,EAAQ,MAAMC,EAAMC,CAAI,EAElDK,EAA6B,CAC/B,YAAAO,EACA,IAAKD,GAAS,IACd,GAAIA,GAAS,GACb,KAAAE,EACA,KAAAC,EACA,QAAAlB,EACA,GAAAY,CACJ,EAKA,OAAOJ,EAAoBC,CAAU,CACzC","sourcesContent":["// import sgMail from '@sendgrid/mail';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\ntype MailFn<T extends object> = () => Promise<MailObject<T>>;\n\nexport async function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): Promise<MailFn<T>> {\n return Promise.resolve(async () => Promise.resolve({ subject, template }));\n}\n\nexport async function getMail<T extends object>(\n mail: MailFn<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = await mail();\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return {\n subject,\n html: ReactDOMServer.renderToString(template(data)),\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[];\n cc?: string[];\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: sendObject.bcc?.map((email) => ({ email })),\n cc: sendObject.cc?.map((email) => ({ email })),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\n// async function sendProductionMail<T extends object>(\n// mail: Promise<MailFn<T>>,\n// data: T,\n// to: string\n// ): Promise<boolean> {\n// if (process.env.NODE_ENV === 'production') {\n// throw new Error('Trying to run production mail in a development environment');\n// }\n\n// if (!process.env.MAIL_ENABLE_PRODUCTION) {\n// throw new Error(\n// 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n// );\n// }\n\n// if (!process.env.MAIL_API_KEY) {\n// throw new Error('Mail API key has not been set');\n// }\n\n// sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n// try {\n// const response = await sgMail.send({\n// to,\n// from,\n// subject,\n// html,\n// });\n// console.log(response);\n\n// return true;\n// } catch (err) {\n// console.log('err', err);\n// return false;\n// }\n// }\n\nexport async function sendMail<T extends object>(\n mail: Promise<MailFn<T>>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(await mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n // For now, just send the email in development.\n // @TODO: Implement the production email sending.\n\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
|
|
5
|
+
var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,server.NextResponse.next()):r(e,p(e)?server.NextResponse.json({error:"Unauthorized"},{status:401}):server.NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_PROTECTION_BYPASS&&e.append("x-vercel-protection-bypass",process.env.VERCEL_PROTECTION_BYPASS),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():server.NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():server.NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}
|
|
6
|
+
|
|
7
|
+
exports.handleMiddleware = d;
|
|
8
|
+
//# sourceMappingURL=out.js.map
|
|
9
|
+
//# sourceMappingURL=middleware.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"names":["NextResponse","DEFAULT_REDIRECT","isJsonRequest","request","applyHeaders","response","getRelativeUrl","url","redirect","pathname","bypassProtection","headers","handleMiddleware","nextFn","sessionID","json"],"mappings":"AAAA,OAAS,gBAAAA,MAAoB,cAG7B,IAAMC,EAAmB,cAEzB,SAASC,EAAcC,EAA+B,CAClD,OAAOA,EAAQ,QAAQ,IAAI,QAAQ,IAAM,kBAC7C,CAEA,SAASC,EAAaD,EAAsBE,EAAsC,CAC9E,OAAAA,EAAS,QAAQ,IAAI,WAAYF,EAAQ,QAAQ,MAAM,EACvDE,EAAS,QAAQ,IAAI,aAAcF,EAAQ,QAAQ,QAAQ,EAC3DE,EAAS,QAAQ,IAAI,kBAAmBF,EAAQ,QAAQ,aAAa,SAAS,CAAC,EACxEE,CACX,CAEA,SAASC,EAAeC,EAAqC,CACzD,OAAOA,EAAI,SAAS,EAAE,QAAQA,EAAI,OAAQ,EAAE,CAChD,CAEA,SAASC,EAASL,EAAsBM,EAAWR,EAAgC,CAC/E,OAAIE,EAAQ,QAAQ,WAAaM,EACtBL,EAAaD,EAASH,EAAa,KAAK,CAAC,EAG7CI,EACHD,EACAD,EAAcC,CAAO,EACfH,EAAa,KAAK,CAAE,MAAO,cAAe,EAAG,CAAE,OAAQ,GAAI,CAAC,EAC5DA,EAAa,SACT,GAAGG,EAAQ,QAAQ,MAAM,GAAGM,CAAQ,MAAM,mBACtCH,EAAeH,EAAQ,OAAO,CAClC,CAAC,EACL,CACV,CACJ,CAMA,SAASO,GAAgC,CACrC,IAAMC,EAAU,IAAI,QAEpB,OAAI,QAAQ,IAAI,0BACZA,EAAQ,OAAO,6BAA8B,QAAQ,IAAI,wBAAwB,EAG9E,CAAE,QAAAA,CAAQ,CACrB,CAEA,eAAsBC,EAClBT,EACAU,EACqB,CAErB,GAAIV,EAAQ,QAAQ,WAAa,eAC7B,OAAOC,EAAaD,EAASU,EAASA,EAAO,EAAIb,EAAa,KAAK,CAAC,EAGxE,IAAMc,EACFX,EAAQ,QAAQ,IAAI,QAAQ,IAAI,kBAAoB,cAAc,GAAG,OAAS,GAElF,GAAI,CAKA,IAAMY,EAAQ,MAJE,MAAM,MAClB,GAAGZ,EAAQ,QAAQ,MAAM,mBAAmBW,CAAS,aAAaX,EAAQ,QAAQ,QAAQ,GAC1FO,EAAiB,CACrB,GAC4B,KAAK,EAEjC,OAAIK,EAAK,WAAa,KACXX,EAAaD,EAASU,EAASA,EAAO,EAAIb,EAAa,KAAK,CAAC,EAGjEQ,EAASL,EAASY,EAAK,QAAQ,CAC1C,MAAc,CACV,OAAOP,EAASL,CAAO,CAC3B,CACJ","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nconst DEFAULT_REDIRECT = '/auth/login';\n\nfunction isJsonRequest(request: NextRequest): boolean {\n return request.headers.get('accept') === 'application/json';\n}\n\nfunction applyHeaders(request: NextRequest, response: NextResponse): NextResponse {\n response.headers.set('x-origin', request.nextUrl.origin);\n response.headers.set('x-pathname', request.nextUrl.pathname);\n response.headers.set('x-search-params', request.nextUrl.searchParams.toString());\n return response;\n}\n\nfunction getRelativeUrl(url: NextRequest['nextUrl']): string {\n return url.toString().replace(url.origin, '');\n}\n\nfunction redirect(request: NextRequest, pathname = DEFAULT_REDIRECT): NextResponse {\n if (request.nextUrl.pathname === pathname) {\n return applyHeaders(request, NextResponse.next());\n }\n\n return applyHeaders(\n request,\n isJsonRequest(request)\n ? NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n : NextResponse.redirect(\n `${request.nextUrl.origin}${pathname}?r=${encodeURIComponent(\n getRelativeUrl(request.nextUrl)\n )}`\n )\n );\n}\n\n/*\n * When deployed to Vercel in a preview environment, we need to bypass the protection when fetching\n * the session from the API.\n */\nfunction bypassProtection(): RequestInit {\n const headers = new Headers();\n\n if (process.env.VERCEL_PROTECTION_BYPASS) {\n headers.append('x-vercel-protection-bypass', process.env.VERCEL_PROTECTION_BYPASS);\n }\n\n return { headers };\n}\n\nexport async function handleMiddleware(\n request: NextRequest,\n nextFn?: () => NextResponse\n): Promise<NextResponse> {\n // If the URL is /api/session, we should just return the response, otherwise we end up in a loop\n if (request.nextUrl.pathname === '/api/session') {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n const sessionID =\n request.cookies.get(process.env.AUTH_COOKIE_NAME || 'auth_session')?.value || '';\n\n try {\n const session = await fetch(\n `${request.nextUrl.origin}/api/session?id=${sessionID}&pathname=${request.nextUrl.pathname}`,\n bypassProtection()\n );\n const json = (await session.json()) as { redirect: string | null };\n\n if (json.redirect === null) {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n return redirect(request, json.redirect);\n } catch (err) {\n return redirect(request);\n }\n}\n"]}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { NextResponse } from 'next/server';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
declare function handleMiddleware(request: NextRequest, nextFn?: () => NextResponse): Promise<NextResponse>;
|
|
4
|
+
|
|
5
|
+
export { handleMiddleware };
|
package/dist/middleware.js
CHANGED
|
@@ -1,36 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return 0;
|
|
9
|
-
}
|
|
10
|
-
try {
|
|
11
|
-
const verified = await (0, jose_1.jwtVerify)(token, new TextEncoder().encode(process.env.APP_KEY));
|
|
12
|
-
return verified.payload.sub ? parseInt(verified.payload.sub, 10) : 0;
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
return 0;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
exports.getIdFromToken = getIdFromToken;
|
|
19
|
-
function getRelativeUrl(url) {
|
|
20
|
-
return url.replace(new URL(url).origin, '');
|
|
21
|
-
}
|
|
22
|
-
function redirectToLogin(request, url) {
|
|
23
|
-
if (new URL(request.url).pathname === '/login') {
|
|
24
|
-
return server_1.NextResponse.next();
|
|
25
|
-
}
|
|
26
|
-
return server_1.NextResponse.redirect(`${url}login?r=${encodeURIComponent(getRelativeUrl(request.url))}`);
|
|
27
|
-
}
|
|
28
|
-
async function handleMiddleware(request, url) {
|
|
29
|
-
const token = request.cookies.get('token')?.value;
|
|
30
|
-
const userId = await getIdFromToken(token || null);
|
|
31
|
-
if (!userId) {
|
|
32
|
-
return redirectToLogin(request, url);
|
|
33
|
-
}
|
|
34
|
-
return server_1.NextResponse.next();
|
|
35
|
-
}
|
|
36
|
-
exports.handleMiddleware = handleMiddleware;
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,NextResponse.next()):r(e,p(e)?NextResponse.json({error:"Unauthorized"},{status:401}):NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_PROTECTION_BYPASS&&e.append("x-vercel-protection-bypass",process.env.VERCEL_PROTECTION_BYPASS),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}
|
|
4
|
+
|
|
5
|
+
export { d as handleMiddleware };
|
|
6
|
+
//# sourceMappingURL=out.js.map
|
|
7
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"names":["NextResponse","DEFAULT_REDIRECT","isJsonRequest","request","applyHeaders","response","getRelativeUrl","url","redirect","pathname","bypassProtection","headers","handleMiddleware","nextFn","sessionID","json"],"mappings":"AAAA,OAAS,gBAAAA,MAAoB,cAG7B,IAAMC,EAAmB,cAEzB,SAASC,EAAcC,EAA+B,CAClD,OAAOA,EAAQ,QAAQ,IAAI,QAAQ,IAAM,kBAC7C,CAEA,SAASC,EAAaD,EAAsBE,EAAsC,CAC9E,OAAAA,EAAS,QAAQ,IAAI,WAAYF,EAAQ,QAAQ,MAAM,EACvDE,EAAS,QAAQ,IAAI,aAAcF,EAAQ,QAAQ,QAAQ,EAC3DE,EAAS,QAAQ,IAAI,kBAAmBF,EAAQ,QAAQ,aAAa,SAAS,CAAC,EACxEE,CACX,CAEA,SAASC,EAAeC,EAAqC,CACzD,OAAOA,EAAI,SAAS,EAAE,QAAQA,EAAI,OAAQ,EAAE,CAChD,CAEA,SAASC,EAASL,EAAsBM,EAAWR,EAAgC,CAC/E,OAAIE,EAAQ,QAAQ,WAAaM,EACtBL,EAAaD,EAASH,EAAa,KAAK,CAAC,EAG7CI,EACHD,EACAD,EAAcC,CAAO,EACfH,EAAa,KAAK,CAAE,MAAO,cAAe,EAAG,CAAE,OAAQ,GAAI,CAAC,EAC5DA,EAAa,SACT,GAAGG,EAAQ,QAAQ,MAAM,GAAGM,CAAQ,MAAM,mBACtCH,EAAeH,EAAQ,OAAO,CAClC,CAAC,EACL,CACV,CACJ,CAMA,SAASO,GAAgC,CACrC,IAAMC,EAAU,IAAI,QAEpB,OAAI,QAAQ,IAAI,0BACZA,EAAQ,OAAO,6BAA8B,QAAQ,IAAI,wBAAwB,EAG9E,CAAE,QAAAA,CAAQ,CACrB,CAEA,eAAsBC,EAClBT,EACAU,EACqB,CAErB,GAAIV,EAAQ,QAAQ,WAAa,eAC7B,OAAOC,EAAaD,EAASU,EAASA,EAAO,EAAIb,EAAa,KAAK,CAAC,EAGxE,IAAMc,EACFX,EAAQ,QAAQ,IAAI,QAAQ,IAAI,kBAAoB,cAAc,GAAG,OAAS,GAElF,GAAI,CAKA,IAAMY,EAAQ,MAJE,MAAM,MAClB,GAAGZ,EAAQ,QAAQ,MAAM,mBAAmBW,CAAS,aAAaX,EAAQ,QAAQ,QAAQ,GAC1FO,EAAiB,CACrB,GAC4B,KAAK,EAEjC,OAAIK,EAAK,WAAa,KACXX,EAAaD,EAASU,EAASA,EAAO,EAAIb,EAAa,KAAK,CAAC,EAGjEQ,EAASL,EAASY,EAAK,QAAQ,CAC1C,MAAc,CACV,OAAOP,EAASL,CAAO,CAC3B,CACJ","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nconst DEFAULT_REDIRECT = '/auth/login';\n\nfunction isJsonRequest(request: NextRequest): boolean {\n return request.headers.get('accept') === 'application/json';\n}\n\nfunction applyHeaders(request: NextRequest, response: NextResponse): NextResponse {\n response.headers.set('x-origin', request.nextUrl.origin);\n response.headers.set('x-pathname', request.nextUrl.pathname);\n response.headers.set('x-search-params', request.nextUrl.searchParams.toString());\n return response;\n}\n\nfunction getRelativeUrl(url: NextRequest['nextUrl']): string {\n return url.toString().replace(url.origin, '');\n}\n\nfunction redirect(request: NextRequest, pathname = DEFAULT_REDIRECT): NextResponse {\n if (request.nextUrl.pathname === pathname) {\n return applyHeaders(request, NextResponse.next());\n }\n\n return applyHeaders(\n request,\n isJsonRequest(request)\n ? NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n : NextResponse.redirect(\n `${request.nextUrl.origin}${pathname}?r=${encodeURIComponent(\n getRelativeUrl(request.nextUrl)\n )}`\n )\n );\n}\n\n/*\n * When deployed to Vercel in a preview environment, we need to bypass the protection when fetching\n * the session from the API.\n */\nfunction bypassProtection(): RequestInit {\n const headers = new Headers();\n\n if (process.env.VERCEL_PROTECTION_BYPASS) {\n headers.append('x-vercel-protection-bypass', process.env.VERCEL_PROTECTION_BYPASS);\n }\n\n return { headers };\n}\n\nexport async function handleMiddleware(\n request: NextRequest,\n nextFn?: () => NextResponse\n): Promise<NextResponse> {\n // If the URL is /api/session, we should just return the response, otherwise we end up in a loop\n if (request.nextUrl.pathname === '/api/session') {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n const sessionID =\n request.cookies.get(process.env.AUTH_COOKIE_NAME || 'auth_session')?.value || '';\n\n try {\n const session = await fetch(\n `${request.nextUrl.origin}/api/session?id=${sessionID}&pathname=${request.nextUrl.pathname}`,\n bypassProtection()\n );\n const json = (await session.json()) as { redirect: string | null };\n\n if (json.redirect === null) {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n return redirect(request, json.redirect);\n } catch (err) {\n return redirect(request);\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var headers = require('next/headers');
|
|
4
|
+
|
|
5
|
+
async function s(){let t=process.env.SZ_ORIGIN;if(t)return t;let r=(await headers.headers()).get("x-origin");if(r)return r;let n=(await headers.headers()).get("x-forwarded-proto"),e=(await headers.headers()).get("x-forwarded-host");if(n&&e)return `${n}://${e}`;throw new Error("No origin could be determined")}async function u(){let t=(await headers.headers()).get("x-pathname");if(t)return t;throw new Error("No pathname could be determined. Please make sure middleware is being applied to the current request.")}async function a(t){let r=await s();if(!t)return r;let e=r.startsWith("https://")?"https://":"http://",i=`${r.replace(/^https?:\/\//u,"")}/${t}`.replace(/\/+/gu,"/");return `${e}${i}`}async function p(t){return a(t)}
|
|
6
|
+
|
|
7
|
+
exports.getOrigin = s;
|
|
8
|
+
exports.getPathname = u;
|
|
9
|
+
exports.getURL = p;
|
|
10
|
+
exports.makeURL = a;
|
|
11
|
+
//# sourceMappingURL=out.js.map
|
|
12
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/url/URLService.ts"],"names":["headers","getOrigin","envOrigin","origin","proto","host","getPathname","pathname","makeURL","protocol","cleanURL","getURL"],"mappings":"AAAA,OAAS,WAAAA,MAAe,eAkBxB,eAAsBC,GAA6B,CAC/C,IAAMC,EAAY,QAAQ,IAAI,UAE9B,GAAIA,EACA,OAAOA,EAGX,IAAMC,GAAU,MAAMH,EAAQ,GAAG,IAAI,UAAU,EAE/C,GAAIG,EACA,OAAOA,EAGX,IAAMC,GAAS,MAAMJ,EAAQ,GAAG,IAAI,mBAAmB,EACjDK,GAAQ,MAAML,EAAQ,GAAG,IAAI,kBAAkB,EAErD,GAAII,GAASC,EACT,MAAO,GAAGD,CAAK,MAAMC,CAAI,GAG7B,MAAM,IAAI,MAAM,+BAA+B,CACnD,CAEA,eAAsBC,GAA+B,CACjD,IAAMC,GAAY,MAAMP,EAAQ,GAAG,IAAI,YAAY,EAEnD,GAAIO,EACA,OAAOA,EAGX,MAAM,IAAI,MACN,uGACJ,CACJ,CAUA,eAAsBC,EAAQD,EAAoC,CAC9D,IAAMJ,EAAS,MAAMF,EAAU,EAE/B,GAAI,CAACM,EACD,OAAOJ,EAKX,IAAMM,EAFWN,EAAO,WAAW,UAAU,EAEjB,WAAa,UAGnCO,EAAW,GAFaP,EAAO,QAAQ,gBAAiB,EAAE,CAEvB,IAAII,CAAQ,GAAG,QAAQ,QAAS,GAAG,EAC5E,MAAO,GAAGE,CAAQ,GAAGC,CAAQ,EACjC,CAKA,eAAsBC,EAAOJ,EAAoC,CAC7D,OAAOC,EAAQD,CAAQ,CAC3B","sourcesContent":["import { headers } from 'next/headers';\n\n/**\n * Uses a number of methods to determine the current origin.\n *\n * First, it checks if an `x-origin` header. This will have been set by the `handleMiddleware`\n * function, further up the chain. For more information on how it is being set, see the\n * `middleware` documentation.\n *\n * There are some situations where middleware is not being applied, such as API routes (because the\n * redirection is not necessary, and API routes handle their own authentication). In these cases,\n * this function tries to piece together the origin from the `x-forwarded-proto` and\n * `x-forwarded-host` headers.\n *\n * Finally, if the origin cannot be determined, an error is thrown.\n *\n * @returns The origin of the current request.\n */\nexport async function getOrigin(): Promise<string> {\n const envOrigin = process.env.SZ_ORIGIN;\n\n if (envOrigin) {\n return envOrigin;\n }\n\n const origin = (await headers()).get('x-origin');\n\n if (origin) {\n return origin;\n }\n\n const proto = (await headers()).get('x-forwarded-proto');\n const host = (await headers()).get('x-forwarded-host');\n\n if (proto && host) {\n return `${proto}://${host}`;\n }\n\n throw new Error('No origin could be determined');\n}\n\nexport async function getPathname(): Promise<string> {\n const pathname = (await headers()).get('x-pathname');\n\n if (pathname) {\n return pathname;\n }\n\n throw new Error(\n 'No pathname could be determined. Please make sure middleware is being applied to the current request.'\n );\n}\n\n/**\n * Builds a URL from the current origin and a given pathname. For more information on how the origin\n * is determined, see the `getOrigin` function. This function then just concatenates the origin and\n * the pathname, and performs some cleanup to ensure the URL is valid.\n *\n * @param pathname\n * @returns The URL, with the origin and pathname combined.\n */\nexport async function makeURL(pathname?: string): Promise<string> {\n const origin = await getOrigin();\n\n if (!pathname) {\n return origin;\n }\n\n const isSecure = origin.startsWith('https://');\n\n const protocol = isSecure ? 'https://' : 'http://';\n const originWithoutProtocol = origin.replace(/^https?:\\/\\//u, '');\n\n const cleanURL = `${originWithoutProtocol}/${pathname}`.replace(/\\/+/gu, '/');\n return `${protocol}${cleanURL}`;\n}\n\n/**\n * @deprecated Use `makeURL` instead.\n */\nexport async function getURL(pathname?: string): Promise<string> {\n return makeURL(pathname);\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uses a number of methods to determine the current origin.
|
|
3
|
+
*
|
|
4
|
+
* First, it checks if an `x-origin` header. This will have been set by the `handleMiddleware`
|
|
5
|
+
* function, further up the chain. For more information on how it is being set, see the
|
|
6
|
+
* `middleware` documentation.
|
|
7
|
+
*
|
|
8
|
+
* There are some situations where middleware is not being applied, such as API routes (because the
|
|
9
|
+
* redirection is not necessary, and API routes handle their own authentication). In these cases,
|
|
10
|
+
* this function tries to piece together the origin from the `x-forwarded-proto` and
|
|
11
|
+
* `x-forwarded-host` headers.
|
|
12
|
+
*
|
|
13
|
+
* Finally, if the origin cannot be determined, an error is thrown.
|
|
14
|
+
*
|
|
15
|
+
* @returns The origin of the current request.
|
|
16
|
+
*/
|
|
17
|
+
declare function getOrigin(): Promise<string>;
|
|
18
|
+
declare function getPathname(): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Builds a URL from the current origin and a given pathname. For more information on how the origin
|
|
21
|
+
* is determined, see the `getOrigin` function. This function then just concatenates the origin and
|
|
22
|
+
* the pathname, and performs some cleanup to ensure the URL is valid.
|
|
23
|
+
*
|
|
24
|
+
* @param pathname
|
|
25
|
+
* @returns The URL, with the origin and pathname combined.
|
|
26
|
+
*/
|
|
27
|
+
declare function makeURL(pathname?: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* @deprecated Use `makeURL` instead.
|
|
30
|
+
*/
|
|
31
|
+
declare function getURL(pathname?: string): Promise<string>;
|
|
32
|
+
|
|
33
|
+
export { getOrigin, getPathname, getURL, makeURL };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uses a number of methods to determine the current origin.
|
|
3
|
+
*
|
|
4
|
+
* First, it checks if an `x-origin` header. This will have been set by the `handleMiddleware`
|
|
5
|
+
* function, further up the chain. For more information on how it is being set, see the
|
|
6
|
+
* `middleware` documentation.
|
|
7
|
+
*
|
|
8
|
+
* There are some situations where middleware is not being applied, such as API routes (because the
|
|
9
|
+
* redirection is not necessary, and API routes handle their own authentication). In these cases,
|
|
10
|
+
* this function tries to piece together the origin from the `x-forwarded-proto` and
|
|
11
|
+
* `x-forwarded-host` headers.
|
|
12
|
+
*
|
|
13
|
+
* Finally, if the origin cannot be determined, an error is thrown.
|
|
14
|
+
*
|
|
15
|
+
* @returns The origin of the current request.
|
|
16
|
+
*/
|
|
17
|
+
declare function getOrigin(): Promise<string>;
|
|
18
|
+
declare function getPathname(): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Builds a URL from the current origin and a given pathname. For more information on how the origin
|
|
21
|
+
* is determined, see the `getOrigin` function. This function then just concatenates the origin and
|
|
22
|
+
* the pathname, and performs some cleanup to ensure the URL is valid.
|
|
23
|
+
*
|
|
24
|
+
* @param pathname
|
|
25
|
+
* @returns The URL, with the origin and pathname combined.
|
|
26
|
+
*/
|
|
27
|
+
declare function makeURL(pathname?: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* @deprecated Use `makeURL` instead.
|
|
30
|
+
*/
|
|
31
|
+
declare function getURL(pathname?: string): Promise<string>;
|
|
32
|
+
|
|
33
|
+
export { getOrigin, getPathname, getURL, makeURL };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { headers } from 'next/headers';
|
|
2
|
+
|
|
3
|
+
async function s(){let t=process.env.SZ_ORIGIN;if(t)return t;let r=(await headers()).get("x-origin");if(r)return r;let n=(await headers()).get("x-forwarded-proto"),e=(await headers()).get("x-forwarded-host");if(n&&e)return `${n}://${e}`;throw new Error("No origin could be determined")}async function u(){let t=(await headers()).get("x-pathname");if(t)return t;throw new Error("No pathname could be determined. Please make sure middleware is being applied to the current request.")}async function a(t){let r=await s();if(!t)return r;let e=r.startsWith("https://")?"https://":"http://",i=`${r.replace(/^https?:\/\//u,"")}/${t}`.replace(/\/+/gu,"/");return `${e}${i}`}async function p(t){return a(t)}
|
|
4
|
+
|
|
5
|
+
export { s as getOrigin, u as getPathname, p as getURL, a as makeURL };
|
|
6
|
+
//# sourceMappingURL=out.js.map
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/url/URLService.ts"],"names":["headers","getOrigin","envOrigin","origin","proto","host","getPathname","pathname","makeURL","protocol","cleanURL","getURL"],"mappings":"AAAA,OAAS,WAAAA,MAAe,eAkBxB,eAAsBC,GAA6B,CAC/C,IAAMC,EAAY,QAAQ,IAAI,UAE9B,GAAIA,EACA,OAAOA,EAGX,IAAMC,GAAU,MAAMH,EAAQ,GAAG,IAAI,UAAU,EAE/C,GAAIG,EACA,OAAOA,EAGX,IAAMC,GAAS,MAAMJ,EAAQ,GAAG,IAAI,mBAAmB,EACjDK,GAAQ,MAAML,EAAQ,GAAG,IAAI,kBAAkB,EAErD,GAAII,GAASC,EACT,MAAO,GAAGD,CAAK,MAAMC,CAAI,GAG7B,MAAM,IAAI,MAAM,+BAA+B,CACnD,CAEA,eAAsBC,GAA+B,CACjD,IAAMC,GAAY,MAAMP,EAAQ,GAAG,IAAI,YAAY,EAEnD,GAAIO,EACA,OAAOA,EAGX,MAAM,IAAI,MACN,uGACJ,CACJ,CAUA,eAAsBC,EAAQD,EAAoC,CAC9D,IAAMJ,EAAS,MAAMF,EAAU,EAE/B,GAAI,CAACM,EACD,OAAOJ,EAKX,IAAMM,EAFWN,EAAO,WAAW,UAAU,EAEjB,WAAa,UAGnCO,EAAW,GAFaP,EAAO,QAAQ,gBAAiB,EAAE,CAEvB,IAAII,CAAQ,GAAG,QAAQ,QAAS,GAAG,EAC5E,MAAO,GAAGE,CAAQ,GAAGC,CAAQ,EACjC,CAKA,eAAsBC,EAAOJ,EAAoC,CAC7D,OAAOC,EAAQD,CAAQ,CAC3B","sourcesContent":["import { headers } from 'next/headers';\n\n/**\n * Uses a number of methods to determine the current origin.\n *\n * First, it checks if an `x-origin` header. This will have been set by the `handleMiddleware`\n * function, further up the chain. For more information on how it is being set, see the\n * `middleware` documentation.\n *\n * There are some situations where middleware is not being applied, such as API routes (because the\n * redirection is not necessary, and API routes handle their own authentication). In these cases,\n * this function tries to piece together the origin from the `x-forwarded-proto` and\n * `x-forwarded-host` headers.\n *\n * Finally, if the origin cannot be determined, an error is thrown.\n *\n * @returns The origin of the current request.\n */\nexport async function getOrigin(): Promise<string> {\n const envOrigin = process.env.SZ_ORIGIN;\n\n if (envOrigin) {\n return envOrigin;\n }\n\n const origin = (await headers()).get('x-origin');\n\n if (origin) {\n return origin;\n }\n\n const proto = (await headers()).get('x-forwarded-proto');\n const host = (await headers()).get('x-forwarded-host');\n\n if (proto && host) {\n return `${proto}://${host}`;\n }\n\n throw new Error('No origin could be determined');\n}\n\nexport async function getPathname(): Promise<string> {\n const pathname = (await headers()).get('x-pathname');\n\n if (pathname) {\n return pathname;\n }\n\n throw new Error(\n 'No pathname could be determined. Please make sure middleware is being applied to the current request.'\n );\n}\n\n/**\n * Builds a URL from the current origin and a given pathname. For more information on how the origin\n * is determined, see the `getOrigin` function. This function then just concatenates the origin and\n * the pathname, and performs some cleanup to ensure the URL is valid.\n *\n * @param pathname\n * @returns The URL, with the origin and pathname combined.\n */\nexport async function makeURL(pathname?: string): Promise<string> {\n const origin = await getOrigin();\n\n if (!pathname) {\n return origin;\n }\n\n const isSecure = origin.startsWith('https://');\n\n const protocol = isSecure ? 'https://' : 'http://';\n const originWithoutProtocol = origin.replace(/^https?:\\/\\//u, '');\n\n const cleanURL = `${originWithoutProtocol}/${pathname}`.replace(/\\/+/gu, '/');\n return `${protocol}${cleanURL}`;\n}\n\n/**\n * @deprecated Use `makeURL` instead.\n */\nexport async function getURL(pathname?: string): Promise<string> {\n return makeURL(pathname);\n}\n"]}
|
package/forms.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/forms/index';
|
package/forms.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/forms/index';
|
package/jest.config.js
ADDED
package/lists.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/lists/index';
|
package/lists.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/lists/index';
|
package/mail.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/mail/index';
|
package/mail.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/mail/index';
|
package/middleware.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export * from './dist/middleware';
|
package/next-env.d.ts
ADDED
package/package.json
CHANGED
|
@@ -1,43 +1,100 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqrzro/server",
|
|
3
|
-
"version": "2.0.0-bz.
|
|
3
|
+
"version": "2.0.0-bz.51",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"main": "dist/index.js",
|
|
5
6
|
"types": "dist/index.d.ts",
|
|
6
7
|
"license": "ISC",
|
|
8
|
+
"exports": {
|
|
9
|
+
"./auth": {
|
|
10
|
+
"import": "./dist/auth/index.js",
|
|
11
|
+
"require": "./dist/auth/index.cjs",
|
|
12
|
+
"types": "./dist/auth/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./cache": {
|
|
15
|
+
"import": "./dist/cache/index.js",
|
|
16
|
+
"require": "./dist/cache/index.cjs",
|
|
17
|
+
"types": "./dist/cache/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./forms": {
|
|
20
|
+
"import": "./dist/forms/index.js",
|
|
21
|
+
"require": "./dist/forms/index.cjs",
|
|
22
|
+
"types": "./dist/forms/index.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./lists": {
|
|
25
|
+
"import": "./dist/lists/index.js",
|
|
26
|
+
"require": "./dist/lists/index.cjs",
|
|
27
|
+
"types": "./dist/lists/index.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./mail": {
|
|
30
|
+
"import": "./dist/mail/index.js",
|
|
31
|
+
"require": "./dist/mail/index.cjs",
|
|
32
|
+
"types": "./dist/mail/index.d.ts"
|
|
33
|
+
},
|
|
34
|
+
"./middleware": {
|
|
35
|
+
"import": "./dist/middleware.js",
|
|
36
|
+
"require": "./dist/middleware.cjs",
|
|
37
|
+
"types": "./dist/middleware.d.ts"
|
|
38
|
+
},
|
|
39
|
+
"./schema": {
|
|
40
|
+
"import": "./dist/database/schema.js",
|
|
41
|
+
"require": "./dist/database/schema.cjs",
|
|
42
|
+
"types": "./dist/database/schema.d.ts"
|
|
43
|
+
},
|
|
44
|
+
"./url": {
|
|
45
|
+
"import": "./dist/url/index.js",
|
|
46
|
+
"require": "./dist/url/index.cjs",
|
|
47
|
+
"types": "./dist/url/index.d.ts"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
7
50
|
"files": [
|
|
8
|
-
"dist",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
51
|
+
"dist/**/*",
|
|
52
|
+
"*.js",
|
|
53
|
+
"*.d.ts"
|
|
11
54
|
],
|
|
12
55
|
"dependencies": {
|
|
56
|
+
"@lucia-auth/adapter-drizzle": "^1.0.7",
|
|
57
|
+
"@sendgrid/mail": "^8.1.3",
|
|
58
|
+
"@sqrzro/interfaces": "bz",
|
|
13
59
|
"@sqrzro/utility": "bz",
|
|
14
60
|
"bcryptjs": "^2.4.3",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
61
|
+
"drizzle-orm": "^0.29.5",
|
|
62
|
+
"joi": "^17.12.3",
|
|
63
|
+
"lucia": "^3.1.1",
|
|
64
|
+
"next": "15.0.2",
|
|
65
|
+
"otplib": "^12.0.1",
|
|
66
|
+
"path-to-regexp": "^6.2.1",
|
|
67
|
+
"postgres": "^3.4.4",
|
|
68
|
+
"qrcode": "^1.5.3",
|
|
69
|
+
"react": "rc",
|
|
70
|
+
"react-dom": "rc",
|
|
71
|
+
"redis": "^4.6.13"
|
|
21
72
|
},
|
|
22
73
|
"devDependencies": {
|
|
23
74
|
"@sqrzro/eslint-plugin": "bz",
|
|
24
75
|
"@sqrzro/prettier-config": "bz",
|
|
25
76
|
"@types/bcryptjs": "^2.4.6",
|
|
26
|
-
"@types/
|
|
27
|
-
"@types/
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
77
|
+
"@types/jest": "^29.5.12",
|
|
78
|
+
"@types/node": "^22.6.1",
|
|
79
|
+
"@types/qrcode": "^1.5.5",
|
|
80
|
+
"@types/react": "npm:types-react@rc",
|
|
81
|
+
"@types/react-dom": "^18.2.24",
|
|
82
|
+
"eslint": "^8.57.0",
|
|
83
|
+
"jest": "^29.7.0",
|
|
84
|
+
"prettier": "^3.2.5",
|
|
85
|
+
"rimraf": "^4.4.1",
|
|
86
|
+
"ts-jest": "^29.1.2",
|
|
32
87
|
"tslib": "^2.6.2",
|
|
33
|
-
"
|
|
88
|
+
"tsup": "^8.0.2",
|
|
89
|
+
"typescript": "^5.4.4"
|
|
34
90
|
},
|
|
35
91
|
"scripts": {
|
|
36
|
-
"build": "pnpm clean &&
|
|
92
|
+
"build": "pnpm clean && tsup",
|
|
37
93
|
"clean": "rimraf ./dist",
|
|
38
|
-
"dev": "
|
|
94
|
+
"dev": "tsup --watch",
|
|
39
95
|
"lint": "tsc --noEmit && eslint \"./src/**/*.ts\"",
|
|
40
96
|
"prettier": "prettier --write \"./src/**/*.ts\"",
|
|
41
|
-
"start": "pnpm dev"
|
|
97
|
+
"start": "pnpm dev",
|
|
98
|
+
"test": "jest"
|
|
42
99
|
}
|
|
43
100
|
}
|
package/schema.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/database/schema';
|
package/schema.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/database/schema';
|
package/url.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/url/index';
|
package/url.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/url/index';
|
package/dist/AuthService.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { NextRequest } from 'next/server';
|
|
2
|
-
import { NextResponse } from 'next/server';
|
|
3
|
-
import type { Errorable, LoginFormFields, UserObject } from './interfaces';
|
|
4
|
-
export declare function handleLogin(formData: LoginFormFields, lookupFn: (email: string) => Promise<UserObject | null>): Promise<Errorable<UserObject>>;
|
|
5
|
-
interface MeObject {
|
|
6
|
-
name: string;
|
|
7
|
-
email: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function handleMe(request: NextRequest, lookupFn: (id: number) => Promise<MeObject | null>): Promise<NextResponse>;
|
|
10
|
-
export {};
|
package/dist/AuthService.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleMe = exports.handleLogin = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const server_1 = require("next/server");
|
|
6
|
-
const DataService_1 = require("./DataService");
|
|
7
|
-
const PasswordService_1 = require("./PasswordService");
|
|
8
|
-
const SessionService_1 = require("./SessionService");
|
|
9
|
-
const LoginRequest_1 = tslib_1.__importDefault(require("./LoginRequest"));
|
|
10
|
-
async function handleLogin(formData, lookupFn) {
|
|
11
|
-
async function mutateFn(data) {
|
|
12
|
-
const user = await lookupFn(data.email);
|
|
13
|
-
const isUserValid = await (0, PasswordService_1.verifyPassword)(data.password, user?.password);
|
|
14
|
-
return user && isUserValid ? user : null;
|
|
15
|
-
}
|
|
16
|
-
const response = await (0, DataService_1.mutate)({
|
|
17
|
-
fn: mutateFn,
|
|
18
|
-
formData,
|
|
19
|
-
request: LoginRequest_1.default,
|
|
20
|
-
onSuccess: async (user) => {
|
|
21
|
-
await (0, SessionService_1.createSessionForId)(user.id);
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
return response;
|
|
25
|
-
}
|
|
26
|
-
exports.handleLogin = handleLogin;
|
|
27
|
-
async function handleMe(request, lookupFn) {
|
|
28
|
-
const token = new URL(request.url).searchParams.get('token');
|
|
29
|
-
const userId = await (0, SessionService_1.getIdFromToken)(token);
|
|
30
|
-
const me = await lookupFn(userId);
|
|
31
|
-
if (!me) {
|
|
32
|
-
return server_1.NextResponse.json({ valid: false }, { status: 401 });
|
|
33
|
-
}
|
|
34
|
-
return server_1.NextResponse.json({ name: me.name, email: me.email, valid: true });
|
|
35
|
-
}
|
|
36
|
-
exports.handleMe = handleMe;
|
package/dist/DataService.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type Joi from 'joi';
|
|
2
|
-
import type { Errorable } from './interfaces';
|
|
3
|
-
interface MutateArgs<F extends object> {
|
|
4
|
-
formData: F;
|
|
5
|
-
onSuccess?: (model: F) => Promise<void> | void;
|
|
6
|
-
onValidationError?: (errors: Record<string, string>) => void;
|
|
7
|
-
request: Promise<Joi.ObjectSchema<F>>;
|
|
8
|
-
}
|
|
9
|
-
interface MutateArgsWithFn<F extends object, M> extends Omit<MutateArgs<F>, 'onSuccess'> {
|
|
10
|
-
fn: (data: F) => Promise<M | null>;
|
|
11
|
-
onSuccess?: (model: M) => Promise<void> | void;
|
|
12
|
-
}
|
|
13
|
-
export declare function mutate<F extends object>(args: MutateArgs<F>): Promise<Errorable<F>>;
|
|
14
|
-
export declare function mutate<F extends object, M>(args: MutateArgsWithFn<F, M>): Promise<Errorable<M>>;
|
|
15
|
-
interface PaginationArgs {
|
|
16
|
-
skip: number;
|
|
17
|
-
take: number;
|
|
18
|
-
}
|
|
19
|
-
interface FindManyArgs extends PaginationArgs {
|
|
20
|
-
orderBy: Record<string, string>;
|
|
21
|
-
where: Record<string, string>;
|
|
22
|
-
}
|
|
23
|
-
interface GetListArgs<T> {
|
|
24
|
-
allowedFilters?: string[];
|
|
25
|
-
fn: (args: FindManyArgs) => Promise<T[]>;
|
|
26
|
-
searchParams?: Record<string, string>;
|
|
27
|
-
}
|
|
28
|
-
export declare function getList<T>({ allowedFilters, fn, searchParams, }: GetListArgs<T>): Promise<Errorable<T[]>>;
|
|
29
|
-
export {};
|