{"id":24511728,"url":"https://github.com/devnax/naxauth","last_synced_at":"2025-03-15T09:44:23.867Z","repository":{"id":255012723,"uuid":"844526438","full_name":"devnax/naxauth","owner":"devnax","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-11T05:53:20.000Z","size":112,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T00:41:21.690Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devnax.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-19T12:49:25.000Z","updated_at":"2024-12-11T05:53:24.000Z","dependencies_parsed_at":"2024-12-11T06:27:20.709Z","dependency_job_id":"31eb68ec-fe77-44bd-ad0f-4b3a548476fc","html_url":"https://github.com/devnax/naxauth","commit_stats":null,"previous_names":["devnax/naxauth"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devnax%2Fnaxauth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devnax%2Fnaxauth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devnax%2Fnaxauth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devnax%2Fnaxauth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devnax","download_url":"https://codeload.github.com/devnax/naxauth/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243713387,"owners_count":20335566,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-22T00:41:05.590Z","updated_at":"2025-03-15T09:44:23.845Z","avatar_url":"https://github.com/devnax.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n## Server callbacks\n\n```js\n\nimport Auth from 'naxauth/server'\n\nAuth.AuthConfig({\n    secret: process.env.APP_SECRET,\n    brandName: \"Your Brand Name\",\n    mailConfig: {\n        service: 'gmail',\n        host: 'smtp.gmail.com',\n        auth: {\n            user: '',\n            pass: ''\n        },\n        defaultTemplateData: {\n            logo: \"url\"\n        }\n    },\n    async getRequestData(req) {\n        return {\n            authToken: req.cookies['authorization'],\n            userAgent: \"\",\n            body: req.body\n        }\n    },\n    async getUserData(email) {\n        return await User.find({email})\n    },\n    actions: {\n        signin: {\n            emailNotification: false,\n        },\n        signup: {\n            action: {\n                url: \"http://localhost:3000\",\n            },\n            async createUser({\n                requestData,\n                hashPassword\n            }) {\n                const body = requestData.body\n                const created = await User.create({\n                    ...body,\n                    email: body.email,\n                    password: hashPassword,\n                    \"firstname\": body.firstname,\n                    \"status\": \"active\",\n                    \"role\": \"admin\"\n                })\n                return {\n                    ...created,\n                    name: `${created.firstname} ${created.lastname}`,\n                    email: created.email,\n                    photo: created.photo\n                }\n            }\n        },\n        verify: {\n            async updateUser({\n                user,\n                requestData\n            }) {\n                await User.update({status: \"active\"}, {email: user.email})\n            },\n        },\n        forgotPassword: {\n            action: {\n                url: \"http://localhost:3000\"\n            }\n        },\n        resetPassword: {\n            async updateUser({\n                user,\n                hashPassword\n            }) {\n                await User.update({password: hashPassword}, {email: user.email})\n            },\n        }\n    }\n})\n\napp.post(\"/auth\", async (req, res)=\u003e {\n    const {data, message, status} = await Auth.getAuth(req)\n    const {data, message, status} = await Auth.signin(req)\n    const {data, message, status} = await Auth.signup(req)\n    const {data, message, status} = await Auth.verify(req)\n    const {data, message, status} = await Auth.forgotPassword(req)\n    const {data, message, status} = await Auth.resetPassword(req)\n    const {data, message, status} = await Auth.useAuth(req)\n\n    const type = req.headers['request-type']\n    const {data, message, status} = await  Auth.AuthHandler(type, req)\n\n    res.status(status).json({data, message})\n})\n\n```\n\n\n\n## Server configs reference\n\n```js\nimport { SignOptions } from \"jsonwebtoken\";\nimport { MailOptions } from \"nodemailer/lib/json-transport\";\nimport SMTPTransport from \"nodemailer/lib/smtp-transport\";\nimport { EmailTemplateData } from \"./emailTemplate\";\n\nexport type TO = { [key: string]: any }\nexport type UserData\u003cUser\u003e = Omit\u003cUser, \"name\" | \"email\" | \"password\" | \"photo\"\u003e \u0026 {\n    name: string;\n    email: string;\n    password: string;\n    photo?: string;\n}\nexport type RequestData\u003cUser\u003e = {\n    authToken: string;\n    userAgent: string;\n    body: Partial\u003cOmit\u003cUser, \"email\" | \"password\" | \"token\"\u003e\u003e \u0026 {\n        email?: string;\n        password?: string;\n        token?: string;\n    };\n}\n\ntype UserAndReqData\u003cUser\u003e = { user: User, requestData: RequestData\u003cUser\u003e }\n\nimport { SignOptions } from \"jsonwebtoken\";\nimport { MailOptions } from \"nodemailer/lib/json-transport\";\nimport SMTPTransport from \"nodemailer/lib/smtp-transport\";\nimport { EmailTemplateData } from \"./emailTemplate\";\n\nexport type TO = { [key: string]: any }\nexport type UserData\u003cUser\u003e = Omit\u003cUser, \"name\" | \"email\" | \"password\" | \"photo\"\u003e \u0026 {\n    name: string;\n    email: string;\n    password: string;\n    photo?: string;\n}\nexport type RequestData\u003cUser\u003e = {\n    authToken: string;\n    userAgent: string;\n    body: Partial\u003cOmit\u003cUser, \"email\" | \"password\" | \"token\"\u003e\u003e \u0026 {\n        email?: string;\n        password?: string;\n        token?: string;\n    };\n}\n\ntype UserAndReqData\u003cUser\u003e = { user: User, requestData: RequestData\u003cUser\u003e }\n\nexport interface NaxAuthConfigProps\u003cUser, Req\u003e {\n    brandName: string;\n    secret?: string;\n    jwtConfig?: SignOptions \u0026 {\n        expiresIn?: number\n    };\n    mailConfig?: {\n        defaultOptions?: MailOptions,\n        defaultTemplateData?: EmailTemplateData\n    } \u0026 SMTPTransport.Options;\n\n    getRequestData: (req: Req) =\u003e Promise\u003cRequestData\u003cUser\u003e\u003e;\n    getUserData: (email: string) =\u003e Promise\u003cUserData\u003cUser\u003e\u003e;\n    getAuthData?: (ctx: UserAndReqData\u003cUser\u003e) =\u003e Promise\u003cPartial\u003cUserData\u003cUser\u003e\u003e\u003e;\n\n    actions?: {\n        signin?: {\n            emailNotification?: boolean;\n            expiresIn?: number;\n            messages?: { [type in \"wrongEmail\" | \"wrongPassword\" | \"success\"]: string };\n            checkUser?: (ctx: UserAndReqData\u003cUser\u003e) =\u003e Promise\u003cvoid\u003e;\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        },\n        signup?: {\n            mailType?: \"verificaion\" | \"normal\",\n            expiresLinkIn?: number;\n            messages?: { [type in \"exists\" | \"invalidPassword\" | \"success\"]: string };\n            action?: {\n                url: string;\n                text?: string;\n            };\n            isVerified?: (ctx: UserAndReqData\u003cUser\u003e) =\u003e Promise\u003cboolean\u003e;\n            createUser: (ctx: { requestData: RequestData\u003cUser\u003e, hashPassword: string }) =\u003e Promise\u003cUserData\u003cUser\u003e\u003e;\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        },\n        update?: {\n            emailNotification?: boolean,\n            messages?: { [type in \"notFound\" | \"success\"]: string };\n            updateUser: (ctx: UserAndReqData\u003cUser\u003e \u0026 { hashPassword: string | null }) =\u003e Promise\u003cUserData\u003cUser\u003e\u003e;\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        },\n        verify?: {\n            emailNotification?: boolean;\n            messages?: { [type in \"exists\" | \"invalid\" | \"success\"]: string };\n            updateUser: (ctx: { user: User, requestData: RequestData\u003cUser\u003e }) =\u003e Promise\u003cvoid\u003e;\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        },\n        forgotPassword?: {\n            expiresLinkIn?: number;\n            messages?: { [type in \"sent\" | \"invalidUser\" | \"success\"]: string };\n            action: {\n                url: string;\n                text?: string;\n            };\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        },\n        resetPassword?: {\n            emailNotification?: boolean;\n            messages?: { [type in \"expired\" | \"invalid\" | \"success\"]: string };\n            updateUser: (ctx: UserAndReqData\u003cUser\u003e \u0026 { hashPassword: string }) =\u003e Promise\u003cvoid\u003e;\n            mail?: (ctx: UserAndReqData\u003cUser\u003e \u0026 { templateData: EmailTemplateData }) =\u003e Promise\u003c{\n                data?: Partial\u003cEmailTemplateData\u003e,\n                options?: MailOptions;\n            }\u003e\n        }\n    }\n}\n\n```\n\n\n\n## Client Config\n```js\nimport Auth from 'naxauth/client'\n\nAuth.NaxAuthConfig({\n baseUrl: \"http://localhost:3000/api/auth\",\n  fetch: {\n    method: \"POST\"\n  },\n  actions: {\n    getAuth: {\n        path: \"/\"\n    },\n    signin: {\n        path: \"/signin\"\n    },\n    signup: {\n    },\n    forgotPassword: {\n    },\n    resetPassword: {\n    }\n  }\n})\n\n```\n\n## Client callbacks\n\n```js\nimport Auth from 'naxauth/client'\n\nawait Auth.signin({\n    email: \"\",\n    password: \"\"\n})\n\nconst auth = await Auth.getAuth()\n\nawait Auth.signout()\n\nawait Auth.signup({})\n\nawait Auth.forgotPassword(email)\nawait Auth.resetPassword({token: \"\", password: \"\"})\n\nconst isLogin = await Auth.getAuthToken()\n\n\n```\n\n\n## Client configs reference\n\n```js\n\nexport type TO = { [key: string]: any }\n\nexport type ActionCallbacks = {\n    onRequestStart?: () =\u003e string;\n    onRequestEnd?: (res: Response) =\u003e string;\n    onError?: (message: string) =\u003e void;\n    onSuccess?: (message: string) =\u003e void;\n}\n\nexport type ActionType = ActionCallbacks \u0026 {\n    path?: string;\n    fetch?: RequestInit;\n}\n\nexport interface AUTH_CONFIG_TYPE {\n    baseUrl: string;\n    fetch?: RequestInit;\n    tokenName?: string;\n    tokenPlacement?: \"cookie\" | \"header\",\n\n    actions?: {\n        getAuth?: ActionType,\n        signin?: ActionType,\n        signup?: ActionType,\n        verify?: ActionType,\n        forgotPassword?: ActionType,\n        resetPassword?: ActionType\n    }\n}\n\n```\n\n\n## Client Event\n```ts\nimport Auth from 'naxauth/client'\nexport type EventNames =\n    \"getAuth\" |\n    \"signin\" |\n    \"signup\" |\n    \"signout\" |\n    \"verify\" |\n    \"forgotPassword\" |\n    \"resetPassword\" |\n    \"signout\" |\n    \"success\" |\n    \"error\" |\n    \"requestStart\" |\n    \"requestEnd\"\n\nAuth.on(eventName, callback)\nAuth.off(eventName, callback)\nAuth.emit(eventName)\n\n```\n\n\n\n## React\n```jsx\nimport {AuthProvider, useAuth} from 'naxauth/react'\n\n\nconst AuthView = () =\u003e {\n    const auth = useAuth()\n\n    if(auth.loading) return \"loading...\"\n    return \u003cdiv\u003e\n        {auth.name}\n        {auth.email}\n        {auth.photo}\n    \u003c/div\u003e\n}\n\nconst App = () =\u003e {\n    return (\n        \u003cAuthProvider\u003e\n            \u003cAuthView /\u003e\n        \u003c/AuthProvider\u003e\n    )\n}\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevnax%2Fnaxauth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevnax%2Fnaxauth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevnax%2Fnaxauth/lists"}