blade
Version:
React at the edge.
1,508 lines (1,493 loc) • 141 kB
JavaScript
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]