@niledatabase/server 5.0.0-alpha.2 → 5.0.0-alpha.4

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/utils/routes/index.ts","../src/utils/Logger.ts","../src/utils/constants.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/api/routes/me/index.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/routes/auth/verify-email.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/index.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/lib/express.ts"],"names":["route","request","GET","PUT","key","matches","POST","DELETE"],"mappings":"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","file":"express.js","sourcesContent":["import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\nexport const DEFAULT_PREFIX = '/api';\n\nexport enum DefaultNileAuthRoutes {\n SIGNUP = '/signup',\n TENANTS = '/tenants',\n TENANT = '/tenants/{tenantId}',\n USER_TENANTS = '/users/{userId}/tenants',\n TENANT_USER = '/tenants/{tenantId}/users/{userId}',\n TENANT_USERS = '/tenants/{tenantId}/users',\n USER = '/users/{userId}',\n USERS = '/users',\n ME = '/me',\n}\n\nexport enum NileAuthRoutes {\n CSRF = '/auth/csrf',\n PROVIDERS = '/auth/providers',\n SESSION = '/auth/session',\n SIGNIN = '/auth/signin',\n CALLBACK = '/auth/callback',\n SIGNOUT = '/auth/signout',\n PASSWORD_RESET = '/auth/reset-password',\n VERIFY_EMAIL = '/auth/verify-email',\n}\n\n// these map to the developer app\nexport const appRoutes = (prefix = DEFAULT_PREFIX): Routes => ({\n SIGNIN: `${prefix}${NileAuthRoutes.SIGNIN}`,\n PROVIDERS: `${prefix}${NileAuthRoutes.PROVIDERS}`,\n SESSION: `${prefix}${NileAuthRoutes.SESSION}`,\n CSRF: `${prefix}${NileAuthRoutes.CSRF}`,\n CALLBACK: `${prefix}${NileAuthRoutes.CALLBACK}`,\n SIGNOUT: `${prefix}${NileAuthRoutes.SIGNOUT}`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n VERIFY_EMAIL: `${prefix}${NileAuthRoutes.VERIFY_EMAIL}`,\n PASSWORD_RESET: `${prefix}${NileAuthRoutes.PASSWORD_RESET}`,\n ME: `${prefix}${DefaultNileAuthRoutes.ME}`,\n USERS: `${prefix}${DefaultNileAuthRoutes.USERS}`,\n USER_TENANTS: `${prefix}${DefaultNileAuthRoutes.USER_TENANTS}`,\n TENANTS: `${prefix}${DefaultNileAuthRoutes.TENANTS}`,\n TENANT: `${prefix}${DefaultNileAuthRoutes.TENANT}`,\n TENANT_USER: `${prefix}${DefaultNileAuthRoutes.TENANT_USER}`,\n TENANT_USERS: `${prefix}${DefaultNileAuthRoutes.TENANT_USERS}`,\n SIGNUP: `${prefix}${DefaultNileAuthRoutes.SIGNUP}`,\n LOG: `${prefix}/_log`,\n});\n\n// these map to nile-auth\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(config, '/users', qp),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n TENANT_USER: makeRestUrl(\n config,\n `/tenants/${config.tenantId}/users/${config.userId}`\n ),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\n\n// these map to nile-auth\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, NileAuthRoutes.SIGNIN),\n PROVIDERS: makeRestUrl(config, NileAuthRoutes.PROVIDERS),\n SESSION: makeRestUrl(config, NileAuthRoutes.SESSION),\n CSRF: makeRestUrl(config, NileAuthRoutes.CSRF),\n CALLBACK: makeRestUrl(config, NileAuthRoutes.CALLBACK),\n SIGNOUT: makeRestUrl(config, NileAuthRoutes.SIGNOUT),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, NileAuthRoutes.PASSWORD_RESET),\n VERIFY_EMAIL: makeRestUrl(config, NileAuthRoutes.VERIFY_EMAIL),\n});\ntype ProxyKeys = keyof typeof proxyRoutes;\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = config.apiUrl || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n\nexport function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\nexport function prefixAppRoute(config: Config) {\n return `${config.serverOrigin}${config.routePrefix}`;\n}\n\nexport function isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport { urlMatches } from '../api/utils/routes';\nimport { NileConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | NileConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport type LogReturn = {\n info(message: string | unknown, meta?: Record<string, unknown>): void;\n debug(message: string | unknown, meta?: Record<string, unknown>): void;\n warn(message: string | unknown, meta?: Record<string, unknown>): void;\n error(message: string | unknown, meta?: Record<string, unknown>): void;\n};\nexport default function Logger(\n config?: Config | NileConfig,\n ...params: unknown[]\n): LogReturn {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","// these two are a pass though\nexport const X_NILE_TENANT = 'nile-tenant-id';\nexport const X_NILE_USER_ID = 'nile-user-id';\nexport const X_NILE_ORIGIN = 'nile-origin';\n// this one is not\nexport const X_NILE_SECURECOOKIES = 'nile-secure-cookies';\n","import {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport { DEFAULT_PREFIX } from './routes';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(X_NILE_TENANT)) {\n updatedHeaders.set(\n X_NILE_TENANT,\n String(request.headers.get(X_NILE_TENANT))\n );\n }\n // sets secure cookies for production\n if (config.secureCookies != null) {\n updatedHeaders.set(X_NILE_SECURECOOKIES, String(config.secureCookies));\n } else {\n updatedHeaders.set(\n X_NILE_SECURECOOKIES,\n process.env.NODE_ENV === 'production' ? 'true' : 'false'\n );\n }\n\n updatedHeaders.set('host', requestUrl.host);\n if (config.callbackUrl) {\n const cbUrl = new URL(config.callbackUrl);\n debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);\n updatedHeaders.set(X_NILE_ORIGIN, cbUrl.origin);\n // this origin may be overridden, but when SDK requests are made, we want to ignore it\n } else if (config.origin) {\n debug(`Obtained origin from config.origin ${config.origin}`);\n updatedHeaders.set(X_NILE_ORIGIN, config.origin);\n } else {\n const passedOrigin = request.headers.get(X_NILE_ORIGIN);\n if (passedOrigin) {\n updatedHeaders.set(X_NILE_ORIGIN, passedOrigin);\n } else {\n const reqOrigin =\n config.routePrefix !== DEFAULT_PREFIX\n ? `${requestUrl.origin}${config.routePrefix}`\n : requestUrl.origin;\n\n updatedHeaders.set(X_NILE_ORIGIN, reqOrigin);\n debug(`Obtained origin from request ${reqOrigin}`);\n }\n }\n const params = { ...init };\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n const initBody = await new Response(_init.request.clone().body).json();\n const requestBody = await new Response(request.clone().body).json();\n params.body = JSON.stringify(initBody ?? requestBody);\n } catch (e) {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n const initBody = await new Response(_init.request.clone().body).text();\n const requestBody = await new Response(request.clone().body).text();\n params.body = initBody ?? requestBody;\n }\n }\n\n params.headers = updatedHeaders;\n\n const fullUrl = `${url}${requestUrl.search}`;\n\n if (config.debug) {\n // something going on with `fetch` in nextjs, possibly other places\n // hot-reloading does not always give back `set-cookie` from fetchCSRF\n // cURL seems to always do it (and in a real app, you don't have hot reloading),\n // so add a cache bypass to stop the annoying failure reloads that actually work\n params.headers.set('request-id', crypto.randomUUID());\n params.cache = 'no-store';\n }\n try {\n const res: Response | void = await fetch(fullUrl, {\n ...params,\n }).catch((e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\nexport type ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email' // magic link\n | 'credentials' // email + password\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUrl: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<null | undefined | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.apiUrl}/auth/session`;\n info(`using session ${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n return undefined;\n }\n return session;\n } catch (e) {\n error(e);\n return undefined;\n }\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport {\n urlMatches,\n apiRoutes,\n DefaultNileAuthRoutes,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\n\nconst key = 'ME';\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n if (request.method === 'GET') {\n return await GET(url, { request }, config);\n }\n if (request.method === 'PUT') {\n return await PUT(url, { request }, config);\n }\n if (request.method === 'DELETE') {\n const session = await auth(request, config);\n if (!session) {\n return new Response(null, { status: 401 });\n }\n return await DELETE(url, { request }, config);\n }\n return new Response('method not allowed', { status: 405 });\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchMe(\n config: Config,\n method?: 'DELETE' | 'PUT',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.ME}`;\n const init: RequestInit = {\n headers: config.headers,\n method: method ?? 'GET',\n };\n if (method === 'PUT') {\n init.body = body;\n }\n\n const req = new Request(clientUrl, init);\n if (method === 'DELETE') {\n return (await config.handlers.DELETE(req)) as Response;\n }\n if (method === 'PUT') {\n return (await config.handlers.PUT(req)) as Response;\n }\n return (await config.handlers.GET(req)) as Response;\n}\n\n/**\n * @swagger\n * /api/me:\n * delete:\n * tags:\n * - users\n * summary: soft deletes a user\n * description: marks the current user for deletion. Can only be done by the current user for the current user\n * operationId: removeSelf\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function DELETE(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'DELETE';\n\n return await request(url, init, config);\n}\n/**\n * @swagger\n * /api/me:\n * put:\n * tags:\n * - users\n * summary: updates the current user\n * description: changes the data for the current user\n * operationId: updateSelf\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'PUT';\n\n return await request(url, init, config);\n}\n\n/**\n * @swagger\n * /api/me:\n * get:\n * tags:\n * - users\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: getSelf\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from './Config';\nimport { X_NILE_TENANT, X_NILE_USER_ID } from './constants';\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config?: Config) {\n const cookieTenant = getTokenFromCookie(headers, X_NILE_TENANT);\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config?.tenantId;\n}\n\n// do we do this any more?\nexport function getUserFromHttp(headers: Headers, config: Config) {\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config).USERS({ tenantId: tenant, newTenantName });\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `nile.tenant_id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes(config).TENANT_USERS(tenant);\n init.method = 'GET';\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n session: null | undefined | ActiveSession,\n init: RequestInit & { request: Request }\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n prefixAppRoute,\n urlMatches,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchUser(config: Config, method: 'PUT') {\n let clientUrl = `${prefixAppRoute(config)}${DefaultNileAuthRoutes.USERS}`;\n\n if (method === 'PUT')\n if (!config.userId) {\n throw new Error(\n 'Unable to update user, the userId context is missing. Call nile.setContext({ userId }), set nile.userId = \"userId\", or add it to the function call'\n );\n } else {\n clientUrl = `${prefixAppRoute(\n config\n )}${DefaultNileAuthRoutes.USER.replace('{userId}', config.userId)}`;\n }\n if (!isUUID(config.userId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n init.body = JSON.stringify({ email: session.email });\n init.method = 'POST';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUsers(\n config: Config,\n method: 'GET' | 'POST',\n payload?: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n) {\n const { body, params } = payload ?? {};\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USERS.replace(\n '{tenantId}',\n config.tenantId\n )}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n // I don't think post works\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\nimport { urlMatches, DefaultNileAuthRoutes, isUUID } from '../../utils/routes';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchTenants(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers.POST(req)) as Response;\n}\n\nexport async function fetchTenant(\n config: Config,\n method: 'GET' | 'DELETE' | 'PUT',\n body?: string\n) {\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT.replace('{tenantId}', config.tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n if (m === 'PUT') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n\nexport async function fetchTenantsByUser(config: Config) {\n if (config.logger?.warn) {\n if (!config.userId) {\n config.logger?.warn(\n 'nile.userId is not set. The call will still work for the API, but the database context is not set properly and may lead to unexpected behavior in your application.'\n );\n } else if (!isUUID(config.userId)) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.USER_TENANTS.replace(\n '{userId}',\n config.userId ?? 'WARN_NOT_SET'\n )}`;\n const req = new Request(clientUrl, { headers: config.headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\n// this is not for the the credential provider STILL NEED TO FIGURE THIS OUT I THINK? or remove.\nexport async function fetchSignIn(\n config: Config,\n provider: string,\n body: URLSearchParams\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNIN}/${provider}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n\nexport async function fetchSession(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SESSION}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n\nexport async function fetchProviders(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.PROVIDERS}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n\nexport async function fetchCsrf(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.CSRF}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\nimport { ProviderName } from '../../utils/auth';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n\n// this is for the the credential provider, among other things\nexport async function fetchCallback(\n config: Config,\n provider: ProviderName,\n body?: string,\n request?: Request,\n method: 'POST' | 'GET' = 'POST'\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.CALLBACK\n }/${provider}${request ? `?${new URL(request.url).searchParams}` : ''}`;\n const req = new Request(clientUrl, {\n method,\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport fetch from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignOut(\n config: Config,\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNOUT}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers: config.headers,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PASSWORD_RESET);\n}\n\nexport async function fetchResetPassword(\n config: Config,\n method: 'POST' | 'GET' | 'PUT',\n body: null | string,\n params?: URLSearchParams\n) {\n const authParams = new URLSearchParams(params ?? {});\n authParams?.set('json', 'true');\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }?${authParams?.toString()}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body && method !== 'GET') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_EMAIL';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchVerifyEmail(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.VERIFY_EMAIL}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body) {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn(`No GET routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User and session created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport { urlMatches, DefaultNileAuthRoutes } from '../../utils/routes';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignUp(\n config: Config,\n payload: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n): Promise<Response> {\n const { body, params } = payload ?? {};\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n DefaultNileAuthRoutes.SIGNUP\n }${q.size > 0 ? `?${q}` : ''}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import Logger, { matchesLog } from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn, error } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n try {\n const json = await req.clone().json();\n error(req.body && json);\n } catch {\n error(await req.text());\n }\n return new Response(null, { status: 200 });\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n warn(`No POST routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: leaveTenant \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport auth from '../../../../../utils/auth';\nimport Logger from '../../../../../../utils/Logger';\n\nimport { DELETE } from './DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USER';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, userId] = yurl.pathname.split('/').reverse();\n\n if (!userId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [, userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUser(\n config: Config,\n method: 'DELETE' | 'PUT'\n) {\n if (!config.tenantId) {\n throw new Error(\n 'The tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n\n if (!config.userId) {\n throw new Error(\n 'the userId context is missing. Call nile.setContext({ userId })'\n );\n }\n\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USER.replace(\n '{tenantId}',\n config.tenantId\n ).replace('{userId}', config.userId)}/link`;\n const req = new Request(clientUrl, {\n headers: config.headers,\n method,\n });\n\n return (await config.handlers[method](req)) as Response;\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import 'dotenv/config';\nimport { NileConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: NileConfig;\n};\n\nexport const getApiUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.apiUrl != null) {\n return config?.apiUrl;\n }\n if (stringCheck(process.env.NILEDB_API_URL)) {\n return process.env.NILEDB_API_URL;\n }\n\n throw new Error(\n 'A connection to nile-auth is required. Set NILEDB_API_URL as an environment variable.'\n );\n};\n\nexport const getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(config?.callbackUrl)) {\n return config?.callbackUrl;\n }\n return process.env.NILEDB_CALLBACK_URL;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.secureCookies != null) {\n return config?.secureCookies;\n }\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return undefined;\n};\n\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(`${logger}[config] ${config.user}`);\n return String(config?.user);\n }\n const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n logger && info(`${logger}[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n throw new Error(\n 'A database user is required. Set NILEDB_USER as an environment variable.'\n );\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (stringCheck(config?.password)) {\n log && info(`${logger}[config] ***`);\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger && info(`${logger}[NILEDB_PASSWORD] ***`);\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database password is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (stringCheck(config?.databaseName)) {\n logger && info(`${logger}[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n logger && info(`${logger}[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database name is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (stringCheck(config?.tenantId)) {\n logger && info(`${logger}[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n logger && info(`${logger}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n logger && info(`${logger}[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n logger && info(`${logger}[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\n }\n\n logger && info(`${logger}[default] db.thenile.dev`);\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(`${logger}[config] ${config?.db.port}`);\n return Number(config.db?.port);\n }\n\n if (stringCheck(process.env.NILEDB_PORT)) {\n logger && info(`${logger}[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\n }\n logger && info(`${logger}[default] 5432`);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import Handlers from '../../api/handlers';\nimport { appRoutes } from '../../api/utils/routes';\nimport { Routes } from '../../api/types';\nimport { LoggerType, NilePoolConfig, NileConfig } from '../../types';\n\nimport {\n EnvConfig,\n getDatabaseName,\n getDbHost,\n getDbPort,\n getPassword,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getApiUrl,\n} from './envVars';\n\nexport class Config {\n routes: Routes;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n logger?: LoggerType;\n /**\n * Stores the set tenant id from Server for use in sub classes\n */\n tenantId: string | null | undefined;\n /**\n * Stores the set user id from Server for use in sub classes\n */\n userId: string | null | undefined;\n\n /**\n * Stores the headers to be used in `fetch` calls\n */\n headers: Headers;\n\n /**\n * The nile-auth url\n */\n apiUrl: string;\n\n origin?: string | undefined | null;\n\n /**\n * important for separating the `origin` config value from a default in order to make requests\n */\n serverOrigin: string;\n\n debug?: boolean;\n /**\n * To use secure cookies or not in the fetch\n */\n secureCookies?: boolean;\n\n callbackUrl?: string;\n /**\n * change the starting route\n */\n routePrefix: string;\n\n db: NilePoolConfig;\n\n // api: ApiConfig;\n\n constructor(config?: NileConfig, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.routePrefix = config?.routePrefix ?? '/api';\n this.secureCookies = getSecureCookies(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n this.debug = config?.debug;\n this.origin = config?.origin;\n\n this.serverOrigin = config?.origin ?? 'http://localhost:3000';\n\n // this four throw because its the only way to get it\n this.apiUrl = getApiUrl(envVarConfig) as string;\n const user = getUsername(envVarConfig) as string;\n const password = getPassword(envVarConfig) as string;\n const databaseName = getDatabaseName(envVarConfig) as string;\n\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.db = {\n user,\n password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (databaseName) {\n this.db.database = databaseName;\n }\n\n // we need these values no matter what, so break if they are missing\n\n if (config?.headers) {\n this.headers = config?.headers as Headers;\n } else {\n this.headers = new Headers();\n }\n\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n\n this.handlers = Handlers(this.routes as Routes, this);\n // this.handlersWithContext = handlersWithContext(this.routes, this);\n\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n this.tenantId = config?.tenantId;\n this.userId = config?.userId;\n this.logger = config?.logger;\n }\n}\n","import { Server } from '../Server';\nimport { NileConfig } from '../types';\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\nexport function cleaner(val: string) {\n return val.replaceAll(/\\{([^}]+)\\}/g, ':$1');\n}\n\nexport function expressPaths(nile: Server) {\n const nilePaths = nile.getPaths();\n const paths = {\n get: nilePaths.get.map(cleaner),\n post: nilePaths.post.map(cleaner),\n put: nilePaths.put.map(cleaner),\n delete: nilePaths.delete.map(cleaner),\n };\n return {\n paths,\n };\n}\n\ntype HandlerConfig = { muteResponse?: boolean; init?: RequestInit };\nexport async function NileExpressHandler(\n nile: Server,\n config?: HandlerConfig & NileConfig\n) {\n const { error } = Logger(\n config ? new Config(config) : undefined,\n 'nile-express'\n );\n async function handler(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res?: any\n ): Promise<\n | {\n body: string;\n status: number;\n headers: Record<string, string | string[]>;\n response: Response;\n }\n | null\n | undefined\n > {\n const headers = new Headers();\n if (!req || typeof req !== 'object') {\n return null;\n }\n if (!('url' in req) || typeof req?.url !== 'string') {\n error('A url is necessary for the nile express handler');\n return null;\n }\n const method =\n 'method' in req && typeof req.method === 'string' ? req.method : 'GET';\n\n if (\n 'headers' in req &&\n typeof req.headers === 'object' &&\n req.headers &&\n 'cookie' in req.headers &&\n typeof req.headers.cookie === 'string'\n ) {\n headers.set('cookie', req.headers.cookie);\n }\n const _init: RequestInit = { method, ...config?.init };\n\n if ('body' in req) {\n if (method === 'POST' || method === 'PUT') {\n headers.set('content-type', 'application/json');\n _init.body = JSON.stringify(req.body);\n }\n }\n\n _init.headers = headers;\n\n const reqUrl = req.protocol + '://' + req.get('host') + req.originalUrl;\n\n // be sure its a valid url\n try {\n new URL(reqUrl);\n } catch (e) {\n error('Invalid URL', {\n url: reqUrl,\n error: e,\n });\n return null;\n }\n const proxyRequest = new Request(reqUrl, _init);\n let response;\n try {\n response = await nile.handlers[\n method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n ](proxyRequest);\n } catch (e) {\n error(e);\n }\n\n let body;\n\n if (response instanceof Response) {\n try {\n const tryJson = await response.clone();\n body = await tryJson.json();\n } catch (e) {\n body = await response.text();\n }\n const newHeaders: Record<string, string | string[]> = {};\n response.headers.forEach((value, key) => {\n if (\n !['content-length', 'transfer-encoding'].includes(key.toLowerCase())\n ) {\n if (newHeaders[key]) {\n const prev = newHeaders[key];\n if (Array.isArray(prev)) {\n newHeaders[key] = [...prev, value];\n } else {\n newHeaders[key] = [prev, value];\n }\n } else {\n newHeaders[key] = value;\n }\n }\n });\n\n if (config?.muteResponse !== true) {\n if (res) {\n res.status(response.status).set(newHeaders);\n if (typeof body === 'string') {\n res.send(body);\n } else {\n res.json(body ?? {});\n }\n }\n return;\n }\n\n return {\n body,\n status: response.status,\n headers: newHeaders,\n response,\n };\n } else {\n error('Bad response', { response });\n return;\n }\n }\n const { paths } = expressPaths(nile);\n return { handler, paths };\n}\n"]}