UNPKG

blade

Version:
1,508 lines (1,493 loc) • 141 kB
import { n as __export$8, r as __toESM, t as __commonJS } from "./chunk-DUEDWNxO.js"; import { c as usePopulatePathname, f as getSerializableContext, u as usePrivateLocation } from "./hooks-BCUm8YC_.js"; import { l as DEFAULT_PAGE_PATH, n as getCookieSetter, o as CLIENT_ASSET_PREFIX, r as getOutputFile, s as CUSTOM_HEADERS } from "./utils-BIjILkWh.js"; import { t as RootServerContext } from "./context-BBeH3CVO.js"; import { t as History } from "./history-BUMLb0yy.js"; import { b as runQueries, g as createSyntaxFactory, h as TriggerError, n as ClientError, r as CompilerError } from "./utils-BeDKhSpT.js"; import { n as DML_QUERY_TYPES_WRITE, t as DDL_QUERY_TYPES } from "./dist-C7NzDGd9.js"; import { n as serializeError } from "./serialize-error-CkyRja0C.js"; import { i as UnsupportedPathError, r as METHOD_NAME_ALL, t as Hono$1 } from "./hono-base-CcsMHh-r.js"; import { t as ResponseStream } from "./utils-FoLYJor_.js"; import { i as getCookie } from "./encode-CtR4F3wv.js"; import React from "react"; import { Fragment, jsx, jsxs } from "react/jsx-runtime"; import { pages, router, schema, triggers } from "server-list"; import { renderToReadableStream } from "react-dom/server.edge"; //#region ../../node_modules/radash/dist/esm/async.mjs const sleep = (milliseconds) => { return new Promise((res) => setTimeout(res, milliseconds)); }; //#endregion //#region ../../node_modules/hono/dist/middleware/secure-headers/secure-headers.js var HEADERS_MAP = { crossOriginEmbedderPolicy: ["Cross-Origin-Embedder-Policy", "require-corp"], crossOriginResourcePolicy: ["Cross-Origin-Resource-Policy", "same-origin"], crossOriginOpenerPolicy: ["Cross-Origin-Opener-Policy", "same-origin"], originAgentCluster: ["Origin-Agent-Cluster", "?1"], referrerPolicy: ["Referrer-Policy", "no-referrer"], strictTransportSecurity: ["Strict-Transport-Security", "max-age=15552000; includeSubDomains"], xContentTypeOptions: ["X-Content-Type-Options", "nosniff"], xDnsPrefetchControl: ["X-DNS-Prefetch-Control", "off"], xDownloadOptions: ["X-Download-Options", "noopen"], xFrameOptions: ["X-Frame-Options", "SAMEORIGIN"], xPermittedCrossDomainPolicies: ["X-Permitted-Cross-Domain-Policies", "none"], xXssProtection: ["X-XSS-Protection", "0"] }; var DEFAULT_OPTIONS = { crossOriginEmbedderPolicy: false, crossOriginResourcePolicy: true, crossOriginOpenerPolicy: true, originAgentCluster: true, referrerPolicy: true, strictTransportSecurity: true, xContentTypeOptions: true, xDnsPrefetchControl: true, xDownloadOptions: true, xFrameOptions: true, xPermittedCrossDomainPolicies: true, xXssProtection: true, removePoweredBy: true, permissionsPolicy: {} }; var secureHeaders = (customOptions) => { const options = { ...DEFAULT_OPTIONS, ...customOptions }; const headersToSet = getFilteredHeaders(options); const callbacks = []; if (options.contentSecurityPolicy) { const [callback, value] = getCSPDirectives(options.contentSecurityPolicy); if (callback) callbacks.push(callback); headersToSet.push(["Content-Security-Policy", value]); } if (options.contentSecurityPolicyReportOnly) { const [callback, value] = getCSPDirectives(options.contentSecurityPolicyReportOnly); if (callback) callbacks.push(callback); headersToSet.push(["Content-Security-Policy-Report-Only", value]); } if (options.permissionsPolicy && Object.keys(options.permissionsPolicy).length > 0) headersToSet.push(["Permissions-Policy", getPermissionsPolicyDirectives(options.permissionsPolicy)]); if (options.reportingEndpoints) headersToSet.push(["Reporting-Endpoints", getReportingEndpoints(options.reportingEndpoints)]); if (options.reportTo) headersToSet.push(["Report-To", getReportToOptions(options.reportTo)]); return async function secureHeaders2(ctx, next$1) { const headersToSetForReq = callbacks.length === 0 ? headersToSet : callbacks.reduce((acc, cb) => cb(ctx, acc), headersToSet); await next$1(); setHeaders(ctx, headersToSetForReq); if (options?.removePoweredBy) ctx.res.headers.delete("X-Powered-By"); }; }; function getFilteredHeaders(options) { return Object.entries(HEADERS_MAP).filter(([key]) => options[key]).map(([key, defaultValue]) => { const overrideValue = options[key]; return typeof overrideValue === "string" ? [defaultValue[0], overrideValue] : defaultValue; }); } function getCSPDirectives(contentSecurityPolicy) { const callbacks = []; const resultValues = []; for (const [directive, value] of Object.entries(contentSecurityPolicy)) { const valueArray = Array.isArray(value) ? value : [value]; valueArray.forEach((value2, i) => { if (typeof value2 === "function") { const index = i * 2 + 2 + resultValues.length; callbacks.push((ctx, values) => { values[index] = value2(ctx, directive); }); } }); resultValues.push(directive.replace(/[A-Z]+(?![a-z])|[A-Z]/g, (match, offset) => offset ? "-" + match.toLowerCase() : match.toLowerCase()), ...valueArray.flatMap((value2) => [" ", value2]), "; "); } resultValues.pop(); return callbacks.length === 0 ? [void 0, resultValues.join("")] : [(ctx, headersToSet) => headersToSet.map((values) => { if (values[0] === "Content-Security-Policy" || values[0] === "Content-Security-Policy-Report-Only") { const clone = values[1].slice(); callbacks.forEach((cb) => { cb(ctx, clone); }); return [values[0], clone.join("")]; } else return values; }), resultValues]; } function getPermissionsPolicyDirectives(policy) { return Object.entries(policy).map(([directive, value]) => { const kebabDirective = camelToKebab(directive); if (typeof value === "boolean") return `${kebabDirective}=${value ? "*" : "none"}`; if (Array.isArray(value)) { if (value.length === 0) return `${kebabDirective}=()`; if (value.length === 1 && (value[0] === "*" || value[0] === "none")) return `${kebabDirective}=${value[0]}`; return `${kebabDirective}=(${value.map((item) => ["self", "src"].includes(item) ? item : `"${item}"`).join(" ")})`; } return ""; }).filter(Boolean).join(", "); } function camelToKebab(str) { return str.replace(/([a-z\d])([A-Z])/g, "$1-$2").toLowerCase(); } function getReportingEndpoints(reportingEndpoints = []) { return reportingEndpoints.map((endpoint) => `${endpoint.name}="${endpoint.url}"`).join(", "); } function getReportToOptions(reportTo = []) { return reportTo.map((option) => JSON.stringify(option)).join(", "); } function setHeaders(ctx, headersToSet) { headersToSet.forEach(([header, value]) => { ctx.res.headers.set(header, value); }); } //#endregion //#region ../../node_modules/hono/dist/router/pattern-router/router.js var emptyParams = /* @__PURE__ */ Object.create(null); var PatternRouter = class { name = "PatternRouter"; #routes = []; add(method, path, handler) { const endsWithWildcard = path.at(-1) === "*"; if (endsWithWildcard) path = path.slice(0, -2); if (path.at(-1) === "?") { path = path.slice(0, -1); this.add(method, path.replace(/\/[^/]+$/, ""), handler); } const parts = (path.match(/\/?(:\w+(?:{(?:(?:{[\d,]+})|[^}])+})?)|\/?[^\/\?]+/g) || []).map((part) => { const match = part.match(/^\/:([^{]+)(?:{(.*)})?/); return match ? `/(?<${match[1]}>${match[2] || "[^/]+"})` : part === "/*" ? "/[^/]+" : part.replace(/[.\\+*[^\]$()]/g, "\\$&"); }); try { this.#routes.push([ /* @__PURE__ */ new RegExp(`^${parts.join("")}${endsWithWildcard ? "" : "/?$"}`), method, handler ]); } catch { throw new UnsupportedPathError(); } } match(method, path) { const handlers = []; for (let i = 0, len = this.#routes.length; i < len; i++) { const [pattern, routeMethod, handler] = this.#routes[i]; if (routeMethod === method || routeMethod === METHOD_NAME_ALL) { const match = pattern.exec(path); if (match) handlers.push([handler, match.groups || emptyParams]); } } return [handlers]; } }; //#endregion //#region ../../node_modules/hono/dist/preset/tiny.js var Hono = class extends Hono$1 { constructor(options = {}) { super(options); this.router = new PatternRouter(); } }; //#endregion //#region ../../node_modules/@vercel/functions/headers.js var require_headers = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/headers.js": ((exports, module) => { var __defProp$7 = Object.defineProperty; var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$7 = Object.getOwnPropertyNames; var __hasOwnProp$7 = Object.prototype.hasOwnProperty; var __export$7 = (target, all) => { for (var name in all) __defProp$7(target, name, { get: all[name], enumerable: true }); }; var __copyProps$7 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$7(from)) if (!__hasOwnProp$7.call(to, key) && key !== except) __defProp$7(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$7(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$7 = (mod) => __copyProps$7(__defProp$7({}, "__esModule", { value: true }), mod); var headers_exports = {}; __export$7(headers_exports, { CITY_HEADER_NAME: () => CITY_HEADER_NAME, COUNTRY_HEADER_NAME: () => COUNTRY_HEADER_NAME, EMOJI_FLAG_UNICODE_STARTING_POSITION: () => EMOJI_FLAG_UNICODE_STARTING_POSITION, IP_HEADER_NAME: () => IP_HEADER_NAME, LATITUDE_HEADER_NAME: () => LATITUDE_HEADER_NAME, LONGITUDE_HEADER_NAME: () => LONGITUDE_HEADER_NAME, POSTAL_CODE_HEADER_NAME: () => POSTAL_CODE_HEADER_NAME, REGION_HEADER_NAME: () => REGION_HEADER_NAME, REQUEST_ID_HEADER_NAME: () => REQUEST_ID_HEADER_NAME, geolocation: () => geolocation, ipAddress: () => ipAddress }); module.exports = __toCommonJS$7(headers_exports); const CITY_HEADER_NAME = "x-vercel-ip-city"; const COUNTRY_HEADER_NAME = "x-vercel-ip-country"; const IP_HEADER_NAME = "x-real-ip"; const LATITUDE_HEADER_NAME = "x-vercel-ip-latitude"; const LONGITUDE_HEADER_NAME = "x-vercel-ip-longitude"; const REGION_HEADER_NAME = "x-vercel-ip-country-region"; const POSTAL_CODE_HEADER_NAME = "x-vercel-ip-postal-code"; const REQUEST_ID_HEADER_NAME = "x-vercel-id"; const EMOJI_FLAG_UNICODE_STARTING_POSITION = 127397; function getHeader(headers, key) { return headers.get(key) ?? void 0; } function getHeaderWithDecode(request, key) { const header = getHeader(request.headers, key); return header ? decodeURIComponent(header) : void 0; } function getFlag(countryCode) { const regex = (/* @__PURE__ */ new RegExp("^[A-Z]{2}$")).test(countryCode); if (!countryCode || !regex) return void 0; return String.fromCodePoint(...countryCode.split("").map((char) => EMOJI_FLAG_UNICODE_STARTING_POSITION + char.charCodeAt(0))); } function ipAddress(input) { return getHeader("headers" in input ? input.headers : input, IP_HEADER_NAME); } function getRegionFromRequestId(requestId) { if (!requestId) return "dev1"; return requestId.split(":")[0]; } function geolocation(request) { return { city: getHeaderWithDecode(request, CITY_HEADER_NAME), country: getHeader(request.headers, COUNTRY_HEADER_NAME), flag: getFlag(getHeader(request.headers, COUNTRY_HEADER_NAME)), countryRegion: getHeader(request.headers, REGION_HEADER_NAME), region: getRegionFromRequestId(getHeader(request.headers, REQUEST_ID_HEADER_NAME)), latitude: getHeader(request.headers, LATITUDE_HEADER_NAME), longitude: getHeader(request.headers, LONGITUDE_HEADER_NAME), postalCode: getHeader(request.headers, POSTAL_CODE_HEADER_NAME) }; } }) }); //#endregion //#region ../../node_modules/@vercel/functions/get-env.js var require_get_env = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/get-env.js": ((exports, module) => { var __defProp$6 = Object.defineProperty; var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$6 = Object.getOwnPropertyNames; var __hasOwnProp$6 = Object.prototype.hasOwnProperty; var __export$6 = (target, all) => { for (var name in all) __defProp$6(target, name, { get: all[name], enumerable: true }); }; var __copyProps$6 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$6(from)) if (!__hasOwnProp$6.call(to, key) && key !== except) __defProp$6(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$6(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$6 = (mod) => __copyProps$6(__defProp$6({}, "__esModule", { value: true }), mod); var get_env_exports = {}; __export$6(get_env_exports, { getEnv: () => getEnv }); module.exports = __toCommonJS$6(get_env_exports); const getEnv = (env = process.env) => ({ VERCEL: get(env, "VERCEL"), CI: get(env, "CI"), VERCEL_ENV: get(env, "VERCEL_ENV"), VERCEL_URL: get(env, "VERCEL_URL"), VERCEL_BRANCH_URL: get(env, "VERCEL_BRANCH_URL"), VERCEL_PROJECT_PRODUCTION_URL: get(env, "VERCEL_PROJECT_PRODUCTION_URL"), VERCEL_REGION: get(env, "VERCEL_REGION"), VERCEL_DEPLOYMENT_ID: get(env, "VERCEL_DEPLOYMENT_ID"), VERCEL_SKEW_PROTECTION_ENABLED: get(env, "VERCEL_SKEW_PROTECTION_ENABLED"), VERCEL_AUTOMATION_BYPASS_SECRET: get(env, "VERCEL_AUTOMATION_BYPASS_SECRET"), VERCEL_GIT_PROVIDER: get(env, "VERCEL_GIT_PROVIDER"), VERCEL_GIT_REPO_SLUG: get(env, "VERCEL_GIT_REPO_SLUG"), VERCEL_GIT_REPO_OWNER: get(env, "VERCEL_GIT_REPO_OWNER"), VERCEL_GIT_REPO_ID: get(env, "VERCEL_GIT_REPO_ID"), VERCEL_GIT_COMMIT_REF: get(env, "VERCEL_GIT_COMMIT_REF"), VERCEL_GIT_COMMIT_SHA: get(env, "VERCEL_GIT_COMMIT_SHA"), VERCEL_GIT_COMMIT_MESSAGE: get(env, "VERCEL_GIT_COMMIT_MESSAGE"), VERCEL_GIT_COMMIT_AUTHOR_LOGIN: get(env, "VERCEL_GIT_COMMIT_AUTHOR_LOGIN"), VERCEL_GIT_COMMIT_AUTHOR_NAME: get(env, "VERCEL_GIT_COMMIT_AUTHOR_NAME"), VERCEL_GIT_PREVIOUS_SHA: get(env, "VERCEL_GIT_PREVIOUS_SHA"), VERCEL_GIT_PULL_REQUEST_ID: get(env, "VERCEL_GIT_PULL_REQUEST_ID") }); const get = (env, key) => { const value = env[key]; return value === "" ? void 0 : value; }; }) }); //#endregion //#region ../../node_modules/@vercel/functions/get-context.js var require_get_context = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/get-context.js": ((exports, module) => { var __defProp$5 = Object.defineProperty; var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$5 = Object.getOwnPropertyNames; var __hasOwnProp$5 = Object.prototype.hasOwnProperty; var __export$5 = (target, all) => { for (var name in all) __defProp$5(target, name, { get: all[name], enumerable: true }); }; var __copyProps$5 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$5(from)) if (!__hasOwnProp$5.call(to, key) && key !== except) __defProp$5(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$5(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$5 = (mod) => __copyProps$5(__defProp$5({}, "__esModule", { value: true }), mod); var get_context_exports = {}; __export$5(get_context_exports, { SYMBOL_FOR_REQ_CONTEXT: () => SYMBOL_FOR_REQ_CONTEXT, getContext: () => getContext }); module.exports = __toCommonJS$5(get_context_exports); const SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context"); function getContext() { return globalThis[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {}; } }) }); //#endregion //#region ../../node_modules/@vercel/functions/wait-until.js var require_wait_until = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/wait-until.js": ((exports, module) => { var __defProp$4 = Object.defineProperty; var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$4 = Object.getOwnPropertyNames; var __hasOwnProp$4 = Object.prototype.hasOwnProperty; var __export$4 = (target, all) => { for (var name in all) __defProp$4(target, name, { get: all[name], enumerable: true }); }; var __copyProps$4 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$4(from)) if (!__hasOwnProp$4.call(to, key) && key !== except) __defProp$4(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$4(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$4 = (mod) => __copyProps$4(__defProp$4({}, "__esModule", { value: true }), mod); var wait_until_exports = {}; __export$4(wait_until_exports, { waitUntil: () => waitUntil }); module.exports = __toCommonJS$4(wait_until_exports); var import_get_context$1 = require_get_context(); const waitUntil = (promise) => { if (promise === null || typeof promise !== "object" || typeof promise.then !== "function") throw new TypeError(`waitUntil can only be called with a Promise, got ${typeof promise}`); return (0, import_get_context$1.getContext)().waitUntil?.(promise); }; }) }); //#endregion //#region ../../node_modules/@vercel/functions/middleware.js var require_middleware = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/middleware.js": ((exports, module) => { var __defProp$3 = Object.defineProperty; var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$3 = Object.getOwnPropertyNames; var __hasOwnProp$3 = Object.prototype.hasOwnProperty; var __export$3 = (target, all) => { for (var name in all) __defProp$3(target, name, { get: all[name], enumerable: true }); }; var __copyProps$3 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$3(from)) if (!__hasOwnProp$3.call(to, key) && key !== except) __defProp$3(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$3(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$3 = (mod) => __copyProps$3(__defProp$3({}, "__esModule", { value: true }), mod); var middleware_exports = {}; __export$3(middleware_exports, { next: () => next, rewrite: () => rewrite }); module.exports = __toCommonJS$3(middleware_exports); function handleMiddlewareField(init, headers) { if (init?.request?.headers) { if (!(init.request.headers instanceof Headers)) throw new Error("request.headers must be an instance of Headers"); const keys = []; for (const [key, value] of init.request.headers) { headers.set("x-middleware-request-" + key, value); keys.push(key); } headers.set("x-middleware-override-headers", keys.join(",")); } } function rewrite(destination, init) { const headers = new Headers(init?.headers ?? {}); headers.set("x-middleware-rewrite", String(destination)); handleMiddlewareField(init, headers); return new Response(null, { ...init, headers }); } function next(init) { const headers = new Headers(init?.headers ?? {}); headers.set("x-middleware-next", "1"); handleMiddlewareField(init, headers); return new Response(null, { ...init, headers }); } }) }); //#endregion //#region ../../node_modules/@vercel/functions/cache/in-memory-cache.js var require_in_memory_cache = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/cache/in-memory-cache.js": ((exports, module) => { var __defProp$2 = Object.defineProperty; var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$2 = Object.getOwnPropertyNames; var __hasOwnProp$2 = Object.prototype.hasOwnProperty; var __export$2 = (target, all) => { for (var name in all) __defProp$2(target, name, { get: all[name], enumerable: true }); }; var __copyProps$2 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$2(from)) if (!__hasOwnProp$2.call(to, key) && key !== except) __defProp$2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$2(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$2 = (mod) => __copyProps$2(__defProp$2({}, "__esModule", { value: true }), mod); var in_memory_cache_exports = {}; __export$2(in_memory_cache_exports, { InMemoryCache: () => InMemoryCache }); module.exports = __toCommonJS$2(in_memory_cache_exports); var InMemoryCache = class { constructor() { this.cache = {}; } async get(key, options) { const entry = this.cache[key]; if (entry) { if (entry.ttl && entry.lastModified + entry.ttl * 1e3 < Date.now()) { await this.delete(key); return null; } if (options?.tags) for (const tag of options.tags) entry.tags.add(tag); return entry.value; } return null; } async set(key, value, options) { this.cache[key] = { value, lastModified: Date.now(), ttl: options?.ttl, tags: new Set(options?.tags || []) }; } async delete(key) { delete this.cache[key]; } async expireTag(tag) { const tags = Array.isArray(tag) ? tag : [tag]; for (const key in this.cache) if (Object.prototype.hasOwnProperty.call(this.cache, key)) { const entry = this.cache[key]; if (tags.some((t) => entry.tags.has(t))) delete this.cache[key]; } } }; }) }); //#endregion //#region ../../node_modules/@vercel/functions/cache/index.js var require_cache = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/cache/index.js": ((exports, module) => { var __defProp$1 = Object.defineProperty; var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor; var __getOwnPropNames$1 = Object.getOwnPropertyNames; var __hasOwnProp$1 = Object.prototype.hasOwnProperty; var __export$1 = (target, all) => { for (var name in all) __defProp$1(target, name, { get: all[name], enumerable: true }); }; var __copyProps$1 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames$1(from)) if (!__hasOwnProp$1.call(to, key) && key !== except) __defProp$1(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc$1(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS$1 = (mod) => __copyProps$1(__defProp$1({}, "__esModule", { value: true }), mod); var cache_exports = {}; __export$1(cache_exports, { getFunctionCache: () => getFunctionCache }); module.exports = __toCommonJS$1(cache_exports); var import_get_context = require_get_context(); var import_in_memory_cache = require_in_memory_cache(); const defaultKeyHashFunction = (key) => { let hash = 5381; for (let i = 0; i < key.length; i++) hash = hash * 33 ^ key.charCodeAt(i); return (hash >>> 0).toString(16); }; const defaultNamespaceSeparator = "$"; let inMemoryCacheInstance = null; const getFunctionCache = (cacheOptions) => { let cache; if ((0, import_get_context.getContext)().cache) cache = (0, import_get_context.getContext)().cache; else { if (!inMemoryCacheInstance) inMemoryCacheInstance = new import_in_memory_cache.InMemoryCache(); cache = inMemoryCacheInstance; } const hashFunction = cacheOptions?.keyHashFunction || defaultKeyHashFunction; const makeKey = (key) => { let prefix = ""; if (cacheOptions?.namespace) { const namespaceSeparator = cacheOptions.namespaceSeparator || defaultNamespaceSeparator; prefix = `${cacheOptions.namespace}${namespaceSeparator}`; } return `${prefix}${hashFunction(key)}`; }; return { get: (key, options) => { return cache.get(makeKey(key), options); }, set: (key, value, options) => { return cache.set(makeKey(key), value, options); }, delete: (key) => { return cache.delete(makeKey(key)); }, expireTag: (tag) => { return cache.expireTag(tag); } }; }; }) }); //#endregion //#region ../../node_modules/@vercel/functions/index.js var require_functions = /* @__PURE__ */ __commonJS({ "../../node_modules/@vercel/functions/index.js": ((exports, module) => { var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var src_exports = {}; __export(src_exports, { geolocation: () => import_headers.geolocation, getEnv: () => import_get_env.getEnv, getFunctionCache: () => import_cache.getFunctionCache, ipAddress: () => import_headers.ipAddress, next: () => import_middleware.next, rewrite: () => import_middleware.rewrite, waitUntil: () => import_wait_until.waitUntil }); module.exports = __toCommonJS(src_exports); var import_headers = require_headers(); var import_get_env = require_get_env(); var import_wait_until = require_wait_until(); var import_middleware = require_middleware(); var import_cache = require_cache(); }) }); //#endregion //#region private/server/utils/constants.ts const VERBOSE_LOGGING = import.meta.env.__BLADE_DEBUG_LEVEL === "verbose"; const IS_SERVER_DEV = import.meta.env.BLADE_ENV === "development"; /** A list of all query types that update the database. */ const WRITE_QUERY_TYPES = [...DML_QUERY_TYPES_WRITE, ...DDL_QUERY_TYPES.filter((item) => item !== "list")]; /** How long the server waits after every page revalidation before starting a new one. */ const REVALIDATION_INTERVAL = 5e3; //#endregion //#region private/server/utils/data.ts var import_functions = /* @__PURE__ */ __toESM(require_functions(), 1); /** * A minimal mock implementation of the `ExecutionContext` interface. */ const MOCK_EXECUTION_CONTEXT = { passThroughOnException: () => {}, waitUntil: async (func) => { try { await func; } catch (err) { if (!VERBOSE_LOGGING) return; console.error("An error occurred while executing a `waitUntil` callback."); console.error(err); } } }; /** * Get the `waitUntil` function from the current context. If the context does not * provide a `waitUntil` function, we use a mock implementation. * * @param context - The context of the current request. * * @returns A function that takes a promise and waits for it to resolve. */ const getWaitUntil = (context) => { if (import.meta.env.__BLADE_PROVIDER === "vercel") return import_functions.waitUntil; let dataFetcherWaitUntil = MOCK_EXECUTION_CONTEXT.waitUntil; if (!context) return dataFetcherWaitUntil; try { dataFetcherWaitUntil = context.executionCtx.waitUntil?.bind(context.executionCtx); } catch (_err) { if (VERBOSE_LOGGING) console.warn("No execution context provided, using default implementation."); } return dataFetcherWaitUntil; }; /** * Turn the given string into "dash-case", which we use for slugs. * * @param string - String to turn into dash-case. * * @returns String compatible with "dash-case". * * Originally from https://github.com/rayepps/radash/blob/7c6b986d19c68f19ccf5863d518eb19ec9aa4ab8/src/string.ts#L60-L71. */ const toDashCase = (string) => { const capitalize$1 = (str) => { const lower = str.toLowerCase(); return lower.substring(0, 1).toUpperCase() + lower.substring(1, lower.length); }; const parts = string?.replace(/([A-Z])+/g, capitalize$1)?.split(/(?=[A-Z])|[.\-\s_]/).map((x) => x.toLowerCase()) ?? []; if (parts.length === 0) return ""; if (parts.length === 1) return parts[0]; return parts.reduce((acc, part) => `${acc}-${part.toLowerCase()}`); }; const models = Object.values(schema["index.ts"] || {}); /** * Generate the options passed to the query client. * * @param serverContext - A server context object. * @param headless - Whether the request came in from outside Blade. * * @returns Options that can be passed to the query client. */ const getClientConfig = (serverContext, headless) => { const options = { cookies: serverContext.cookies, setCookie: getCookieSetter(serverContext), navigator: { userAgent: serverContext.userAgent, geoLocation: serverContext.geoLocation, languages: serverContext.languages }, location: new URL(serverContext.url) }; const list$1 = Object.entries(triggers || {}).map(([fileName, { default: triggerList }]) => { const extendedTriggerEntries = Object.entries(triggerList).map(([triggerName, triggerFunction]) => [triggerName, (...args) => { const clientOptions = args[0]; const newOptions = { ...options }; if (headless) newOptions.headless = true; else { const triggerNameSlug = triggerName.toLowerCase(); if (clientOptions.parentTrigger) newOptions.headless = false; else newOptions.headless = WRITE_QUERY_TYPES.some((queryType) => { return triggerNameSlug.endsWith(queryType); }); } return triggerFunction({ ...clientOptions, ...newOptions }); }]); return [fileName.replace(".ts", ""), Object.fromEntries(extendedTriggerEntries)]; }); const finalTriggers = Object.fromEntries(list$1); const flush = serverContext.flushSession; let syntaxCallback; if (flush) syntaxCallback = async (queries, nestedOptions) => { if (queries.some((query) => { const queryType = Object.keys(query)[0]; return WRITE_QUERY_TYPES.includes(queryType); }) && "stream" in nestedOptions) { const { results } = await flush(queries, nestedOptions.stream); return results.filter(({ type }) => type === "write").map(({ result }) => result); } return runQueries(queries, nestedOptions); }; return { triggers: finalTriggers, waitUntil: serverContext.waitUntil, models, defaultRecordLimit: 20, debug: VERBOSE_LOGGING, syntaxCallback }; }; //#endregion //#region ../../node_modules/ua-parser-js/src/ua-parser.js var require_ua_parser = /* @__PURE__ */ __commonJS({ "../../node_modules/ua-parser-js/src/ua-parser.js": ((exports, module) => { (function(window$1, undefined$1) { var LIBVERSION = "1.0.39", EMPTY = "", UNKNOWN = "?", FUNC_TYPE = "function", UNDEF_TYPE = "undefined", OBJ_TYPE = "object", STR_TYPE = "string", MAJOR = "major", MODEL = "model", NAME = "name", TYPE = "type", VENDOR = "vendor", VERSION = "version", ARCHITECTURE = "architecture", CONSOLE = "console", MOBILE = "mobile", TABLET = "tablet", SMARTTV = "smarttv", WEARABLE = "wearable", EMBEDDED = "embedded", UA_MAX_LENGTH = 500; var AMAZON = "Amazon", APPLE = "Apple", ASUS = "ASUS", BLACKBERRY = "BlackBerry", BROWSER = "Browser", CHROME = "Chrome", EDGE = "Edge", FIREFOX = "Firefox", GOOGLE = "Google", HUAWEI = "Huawei", LG = "LG", MICROSOFT = "Microsoft", MOTOROLA = "Motorola", OPERA = "Opera", SAMSUNG = "Samsung", SHARP = "Sharp", SONY = "Sony", XIAOMI = "Xiaomi", ZEBRA = "Zebra", FACEBOOK = "Facebook", CHROMIUM_OS = "Chromium OS", MAC_OS = "Mac OS", SUFFIX_BROWSER = " Browser"; var extend = function(regexes$1, extensions) { var mergedRegexes = {}; for (var i in regexes$1) if (extensions[i] && extensions[i].length % 2 === 0) mergedRegexes[i] = extensions[i].concat(regexes$1[i]); else mergedRegexes[i] = regexes$1[i]; return mergedRegexes; }, enumerize = function(arr) { var enums = {}; for (var i = 0; i < arr.length; i++) enums[arr[i].toUpperCase()] = arr[i]; return enums; }, has = function(str1, str2) { return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false; }, lowerize = function(str) { return str.toLowerCase(); }, majorize = function(version) { return typeof version === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split(".")[0] : undefined$1; }, trim = function(str, len) { if (typeof str === STR_TYPE) { str = str.replace(/^\s\s*/, EMPTY); return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH); } }; var rgxMapper = function(ua, arrays) { var i = 0, j, k, p, q, matches, match; while (i < arrays.length && !matches) { var regex = arrays[i], props = arrays[i + 1]; j = k = 0; while (j < regex.length && !matches) { if (!regex[j]) break; matches = regex[j++].exec(ua); if (!!matches) for (p = 0; p < props.length; p++) { match = matches[++k]; q = props[p]; if (typeof q === OBJ_TYPE && q.length > 0) { if (q.length === 2) if (typeof q[1] == FUNC_TYPE) this[q[0]] = q[1].call(this, match); else this[q[0]] = q[1]; else if (q.length === 3) if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined$1; else this[q[0]] = match ? match.replace(q[1], q[2]) : undefined$1; else if (q.length === 4) this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined$1; } else this[q] = match ? match : undefined$1; } } i += 2; } }, strMapper = function(str, map) { for (var i in map) if (typeof map[i] === OBJ_TYPE && map[i].length > 0) { for (var j = 0; j < map[i].length; j++) if (has(map[i][j], str)) return i === UNKNOWN ? undefined$1 : i; } else if (has(map[i], str)) return i === UNKNOWN ? undefined$1 : i; return map.hasOwnProperty("*") ? map["*"] : str; }; var oldSafariMap = { "1.0": "/8", "1.2": "/1", "1.3": "/3", "2.0": "/412", "2.0.2": "/416", "2.0.3": "/417", "2.0.4": "/419", "?": "/" }, windowsVersionMap = { "ME": "4.90", "NT 3.11": "NT3.51", "NT 4.0": "NT4.0", "2000": "NT 5.0", "XP": ["NT 5.1", "NT 5.2"], "Vista": "NT 6.0", "7": "NT 6.1", "8": "NT 6.2", "8.1": "NT 6.3", "10": ["NT 6.4", "NT 10.0"], "RT": "ARM" }; var regexes = { browser: [ [/\b(?:crmo|crios)\/([\w\.]+)/i], [VERSION, [NAME, "Chrome"]], [/edg(?:e|ios|a)?\/([\w\.]+)/i], [VERSION, [NAME, "Edge"]], [ /(opera mini)\/([-\w\.]+)/i, /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i ], [NAME, VERSION], [/opios[\/ ]+([\w\.]+)/i], [VERSION, [NAME, OPERA + " Mini"]], [/\bop(?:rg)?x\/([\w\.]+)/i], [VERSION, [NAME, OPERA + " GX"]], [/\bopr\/([\w\.]+)/i], [VERSION, [NAME, OPERA]], [/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i], [VERSION, [NAME, "Baidu"]], [ /(kindle)\/([\w\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i, /(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i, /(?:ms|\()(ie) ([\w\.]+)/i, /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio)\/([-\w\.]+)/i, /(heytap|ovi)browser\/([\d\.]+)/i, /(weibo)__([\d\.]+)/i ], [NAME, VERSION], [/quark(?:pc)?\/([-\w\.]+)/i], [VERSION, [NAME, "Quark"]], [/\bddg\/([\w\.]+)/i], [VERSION, [NAME, "DuckDuckGo"]], [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i], [VERSION, [NAME, "UC" + BROWSER]], [ /microm.+\bqbcore\/([\w\.]+)/i, /\bqbcore\/([\w\.]+).+microm/i, /micromessenger\/([\w\.]+)/i ], [VERSION, [NAME, "WeChat"]], [/konqueror\/([\w\.]+)/i], [VERSION, [NAME, "Konqueror"]], [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i], [VERSION, [NAME, "IE"]], [/ya(?:search)?browser\/([\w\.]+)/i], [VERSION, [NAME, "Yandex"]], [/slbrowser\/([\w\.]+)/i], [VERSION, [NAME, "Smart Lenovo " + BROWSER]], [/(avast|avg)\/([\w\.]+)/i], [[ NAME, /(.+)/, "$1 Secure " + BROWSER ], VERSION], [/\bfocus\/([\w\.]+)/i], [VERSION, [NAME, FIREFOX + " Focus"]], [/\bopt\/([\w\.]+)/i], [VERSION, [NAME, OPERA + " Touch"]], [/coc_coc\w+\/([\w\.]+)/i], [VERSION, [NAME, "Coc Coc"]], [/dolfin\/([\w\.]+)/i], [VERSION, [NAME, "Dolphin"]], [/coast\/([\w\.]+)/i], [VERSION, [NAME, OPERA + " Coast"]], [/miuibrowser\/([\w\.]+)/i], [VERSION, [NAME, "MIUI " + BROWSER]], [/fxios\/([-\w\.]+)/i], [VERSION, [NAME, FIREFOX]], [/\bqihu|(qi?ho?o?|360)browser/i], [[NAME, "360" + SUFFIX_BROWSER]], [/\b(qq)\/([\w\.]+)/i], [[ NAME, /(.+)/, "$1Browser" ], VERSION], [/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i], [[ NAME, /(.+)/, "$1" + SUFFIX_BROWSER ], VERSION], [/samsungbrowser\/([\w\.]+)/i], [VERSION, [NAME, SAMSUNG + " Internet"]], [/(comodo_dragon)\/([\w\.]+)/i], [[ NAME, /_/g, " " ], VERSION], [/metasr[\/ ]?([\d\.]+)/i], [VERSION, [NAME, "Sogou Explorer"]], [/(sogou)mo\w+\/([\d\.]+)/i], [[NAME, "Sogou Mobile"], VERSION], [ /(electron)\/([\w\.]+) safari/i, /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, /m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i ], [NAME, VERSION], [/(lbbrowser|rekonq)/i, /\[(linkedin)app\]/i], [NAME], [/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i], [[NAME, FACEBOOK], VERSION], [ /(Klarna)\/([\w\.]+)/i, /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, /safari (line)\/([\w\.]+)/i, /\b(line)\/([\w\.]+)\/iab/i, /(alipay)client\/([\w\.]+)/i, /(twitter)(?:and| f.+e\/([\w\.]+))/i, /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i ], [NAME, VERSION], [/\bgsa\/([\w\.]+) .*safari\//i], [VERSION, [NAME, "GSA"]], [/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i], [VERSION, [NAME, "TikTok"]], [/headlesschrome(?:\/([\w\.]+)| )/i], [VERSION, [NAME, CHROME + " Headless"]], [/ wv\).+(chrome)\/([\w\.]+)/i], [[NAME, CHROME + " WebView"], VERSION], [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i], [VERSION, [NAME, "Android " + BROWSER]], [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i], [NAME, VERSION], [/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i], [VERSION, [NAME, "Mobile Safari"]], [/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i], [VERSION, NAME], [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i], [NAME, [ VERSION, strMapper, oldSafariMap ]], [/(webkit|khtml)\/([\w\.]+)/i], [NAME, VERSION], [/(navigator|netscape\d?)\/([-\w\.]+)/i], [[NAME, "Netscape"], VERSION], [/(wolvic)\/([\w\.]+)/i], [NAME, VERSION], [/mobile vr; rv:([\w\.]+)\).+firefox/i], [VERSION, [NAME, FIREFOX + " Reality"]], [ /ekiohf.+(flow)\/([\w\.]+)/i, /(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i, /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i, /(firefox)\/([\w\.]+)/i, /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, /(links) \(([\w\.]+)/i ], [NAME, [ VERSION, /_/g, "." ]], [/(cobalt)\/([\w\.]+)/i], [NAME, [ VERSION, /master.|lts./, "" ]] ], cpu: [ [/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i], [[ARCHITECTURE, "amd64"]], [/(ia32(?=;))/i], [[ARCHITECTURE, lowerize]], [/((?:i[346]|x)86)[;\)]/i], [[ARCHITECTURE, "ia32"]], [/\b(aarch64|arm(v?8e?l?|_?64))\b/i], [[ARCHITECTURE, "arm64"]], [/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i], [[ARCHITECTURE, "armhf"]], [/windows (ce|mobile); ppc;/i], [[ARCHITECTURE, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i], [[ ARCHITECTURE, /ower/, EMPTY, lowerize ]], [/(sun4\w)[;\)]/i], [[ARCHITECTURE, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i], [[ARCHITECTURE, lowerize]] ], device: [ [/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i], [ MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET] ], [ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i, /samsung[- ]((?!sm-[lr])[-\w]+)/i, /sec-(sgh\w+)/i ], [ MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE] ], [/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i], [ MODEL, [VENDOR, APPLE], [TYPE, MOBILE] ], [ /\((ipad);[-\w\),; ]+apple/i, /applecoremedia\/[\w\.]+ \((ipad)/i, /\b(ipad)\d\d?,\d\d?[;\]].+ios/i ], [ MODEL, [VENDOR, APPLE], [TYPE, TABLET] ], [/(macintosh);/i], [MODEL, [VENDOR, APPLE]], [/\b(sh-?[altvz]?\d\d[a-ekm]?)/i], [ MODEL, [VENDOR, SHARP], [TYPE, MOBILE] ], [/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i], [ MODEL, [VENDOR, HUAWEI], [TYPE, TABLET] ], [/(?:huawei|honor)([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i], [ MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE] ], [ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, /\b; (\w+) build\/hm\1/i, /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i ], [ [ MODEL, /_/g, " " ], [VENDOR, XIAOMI], [TYPE, MOBILE] ], [/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i], [ [ MODEL, /_/g, " " ], [VENDOR, XIAOMI], [TYPE, TABLET] ], [/; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i], [ MODEL, [VENDOR, "OPPO"], [TYPE, MOBILE] ], [/\b(opd2\d{3}a?) bui/i], [ MODEL, [VENDOR, "OPPO"], [TYPE, TABLET] ], [/vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i], [ MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE] ], [/\b(rmx[1-3]\d{3})(?: bui|;|\))/i], [ MODEL, [VENDOR, "Realme"], [TYPE, MOBILE] ], [ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i, /\bmot(?:orola)?[- ](\w*)/i, /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i ], [ MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE] ], [/\b(mz60\d|xoom[2 ]{0,2}) build\//i], [ MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET] ], [/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i], [ MODEL, [VENDOR, LG], [TYPE, TABLET] ], [ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i, /\blg-?([\d\w]+) bui/i ], [ MODEL, [VENDOR, LG], [TYPE, MOBILE] ], [/(ideatab[-\w ]+)/i, /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i], [ MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET] ], [/(?:maemo|nokia).*(n900|lumia \d+)/i, /nokia[-_ ]?([-\w\.]*)/i], [ [ MODEL, /_/g, " " ], [VENDOR, "Nokia"], [TYPE, MOBILE] ], [/(pixel c)\b/i], [ MODEL, [VENDOR, GOOGLE], [TYPE, TABLET] ], [/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i], [ MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE] ], [/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i], [ MODEL, [VENDOR, SONY], [TYPE, MOBILE] ], [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i], [ [MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET] ], [/ (kb2005|in20[12]5|be20[12][59])\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i], [ MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE] ], [ /(alexa)webm/i, /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, /(kf[a-z]+)( bui|\)).+silk\//i ], [ MODEL, [VENDOR, AMAZON], [TYPE, TABLET] ], [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i], [ [ MODEL, /(.+)/g, "Fire Phone $1" ], [VENDOR, AMAZON], [TYPE, MOBILE] ], [/(playbook);[-\w\),; ]+(rim)/i], [ MODEL, VENDOR, [TYPE, TABLET] ], [/\b((?:bb[a-f]|st[hv])100-\d)/i, /\(bb10; (\w+)/i], [ MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE] ], [/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i], [ MODEL, [VENDOR, ASUS], [TYPE, TABLET] ], [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i], [ MODEL, [VENDOR, ASUS], [TYPE, MOBILE] ], [/(nexus 9)/i], [ MODEL, [VENDOR, "HTC"], [TYPE, TABLET] ], [ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i ], [ VENDOR, [ MODEL, /_/g, " " ], [TYPE, MOBILE] ], [/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])\w*(\)| bui)/i], [ MODEL, [VENDOR, "TCL"], [TYPE, TABLET] ], [/(itel) ((\w+))/i], [ [VENDOR, lowerize], MODEL, [ TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" } ] ], [/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i], [ MODEL, [VENDOR, "Acer"], [TYPE, TABLET] ], [/droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i], [ MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE] ], [/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i], [ MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE] ], [/droid.+; (a(?:015|06[35]|142p?))/i], [ MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE] ], [ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i, /(hp) ([\w ]+\w)/i, /(asus)-?(\w+)/i, /(microsoft); (lumia[\w ]+)/i, /(lenovo)[-_ ]?([-\w]+)/i, /(jolla)/i, /(oppo) ?([\w ]+) bui/i ], [ VENDOR, MODEL, [TYPE, MOBILE] ], [ /(kobo)\s(ereader|touch)/i, /(archos) (gamepad2?)/i, /(hp).+(touchpad(?!.+tablet)|tablet)/i, /(kindle)\/([\w\.]+)/i, /(nook)[\w ]+build\/(\w+)/i, /(dell) (strea[kpr\d ]*[\dko])/i, /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, /(trinity)[- ]*(t\d{3}) bui/i, /(gigaset)[- ]+(q\w{1,9}) bui/i, /(vodafone) ([\w ]+)(?:\)| bui)/i ], [ VENDOR, MODEL, [TYPE, TABLET] ], [/(surface duo)/i], [ MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET] ], [/droid [\d\.]+; (fp\du?)(?: b|\))/i], [ MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE] ], [/(u304aa)/i], [ MODEL, [VENDOR, "AT&T"], [TYPE, MOBILE] ], [/\bsie-(\w*)/i], [ MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE] ], [/\b(rct\w+) b/i], [ MODEL, [VENDOR, "RCA"], [TYPE, TABLET] ], [/\b(venue[\d ]{2,7}) b/i], [ MODEL, [VENDOR, "Dell"], [TYPE, TABLET] ], [/\b(q(?:mv|ta)\w+) b/i], [ MODEL, [VENDOR, "Verizon"], [TYPE, TABLET] ], [/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i], [ MODEL, [VENDOR, "Barnes & Noble"], [TYPE, TABLET] ], [/\b(tm\d{3}\w+) b/i], [ MODEL, [VENDOR, "NuVision"], [TYPE, TABLET] ], [/\b(k88) b/i], [ MODEL, [VENDOR, "ZTE"], [TYPE, TABLET] ], [/\b(nx\d{3}j) b/i], [ MODEL, [VENDOR, "ZTE"], [TYPE, MOBILE] ], [/\b(gen\d{3}) b.+49h/i], [ MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE] ], [/\b(zur\d{3}) b/i], [ MODEL, [VENDOR, "Swiss"], [TYPE, TABLET] ], [/\b((zeki)?tb.*\b) b/i], [ MODEL, [VENDOR, "Zeki"], [TYPE, TABLET] ], [/\b([yr]\d{2}) b/i, /\b(dragon[- ]+touch |dt)(\w{5}) b/i], [ [VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET] ], [/\b(ns-?\w{0,9}) b/i], [ MODEL, [VENDOR, "Insignia"], [TYPE, TABLET] ], [/\b((nxa|next)-?\w{0,9}) b/i], [ MODEL, [VENDOR, "NextBook"], [TYPE, TABLET] ], [/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i], [ [VENDOR, "Voice"], MODEL, [TYPE, MOBILE] ], [/\b(lvtel\-)?(v1[12]) b/i], [ [VENDOR, "LvTel"], MODEL, [TYPE, MOBILE] ], [/\b(ph-1) /i], [ MODEL, [VENDOR, "Essential"], [TYPE, MOBILE] ], [/\b(v(100md|700na|7011|917g).*\b) b/i], [ MODEL, [VENDOR, "Envizen"], [TYPE, TABLET] ], [/\b(trio[-\w\. ]+) b/i], [ MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET] ], [/\btu_(1491) b/i], [ MODEL, [VENDOR, "Rotor"], [TYPE, TABLET] ], [/(shield[\w ]+) b/i], [ MODEL, [VENDOR, "Nvidia"], [TYPE, TABLET] ], [/(sprint) (\w+)/i], [ VENDOR, MODEL, [TYPE, MOBILE] ], [/(kin\.[onetw]{3})/i], [ [ MODEL, /\./g, " " ], [VENDOR, MICROSOFT], [TYPE, MOBILE] ], [/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i], [ MODEL, [VENDOR, ZEBRA], [TYPE, TABLET] ], [/droid.+; (ec30|ps20|tc[2-8]