From b9ab0d4567dbfbd55dffef8bf0ae54f6e0c9426e Mon Sep 17 00:00:00 2001 From: Alex Liu Date: Tue, 10 Oct 2023 18:16:52 +0800 Subject: [PATCH 1/4] fix(resolvers): ensure resolvers can perform asynchronous validation (#38) * fix(resolvers): ensure correct async validation for zod * fix(resolvers): ensure correct async validation for valibot --- packages/resolvers/valibot/src/valibot.ts | 4 ++-- packages/resolvers/zod/src/zod.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/resolvers/valibot/src/valibot.ts b/packages/resolvers/valibot/src/valibot.ts index 3ea7496..7103fe4 100644 --- a/packages/resolvers/valibot/src/valibot.ts +++ b/packages/resolvers/valibot/src/valibot.ts @@ -1,5 +1,5 @@ import { toNestError } from '@vorms/resolvers'; -import { parse } from 'valibot'; +import { parseAsync } from 'valibot'; import type { Resolver } from './types'; import type { Issues } from 'valibot'; @@ -26,7 +26,7 @@ const parseErrorSchema = (valibotIssues: Issues) => { export const valibotResolver: Resolver = (schema) => async (values) => { try { - parse(schema, values); + await parseAsync(schema, values); return {}; } catch (error: any) { if (error.name !== 'ValiError') throw error; diff --git a/packages/resolvers/zod/src/zod.ts b/packages/resolvers/zod/src/zod.ts index 51d6b8f..fe4a912 100644 --- a/packages/resolvers/zod/src/zod.ts +++ b/packages/resolvers/zod/src/zod.ts @@ -28,7 +28,7 @@ const parseErrorSchema = (zodErrors: z.ZodIssue[]) => { export const zodResolver: Resolver = (schema) => async (values) => { try { - await schema.parse(values); + await schema.parseAsync(values); return {}; } catch (error: any) { From 009ff62c84a6959343505f3e4ea9b63d71f3f2ee Mon Sep 17 00:00:00 2001 From: Uhiko Chen <61863471+UhikoChen@users.noreply.github.com> Date: Fri, 15 Dec 2023 10:01:31 +0800 Subject: [PATCH 2/4] feat: added traditional Chinese documents (#39) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Added traditional Chinese documents * feat: change Chinese tags from tw to zh-tw * fix: resolve Traditional Chinese navigation links * docs: Refactor label to '繁體中文' for consistency with other localized labels --- docs/.vitepress/cache/deps/@stackblitz_sdk.js | 521 + .../cache/deps/@stackblitz_sdk.js.map | 7 + docs/.vitepress/cache/deps/_metadata.json | 19 + docs/.vitepress/cache/deps/package.json | 3 + docs/.vitepress/cache/deps/vue.js | 9516 +++++++++++++++++ docs/.vitepress/cache/deps/vue.js.map | 7 + docs/.vitepress/config.ts | 69 +- docs/.vitepress/theme/config/en.ts | 55 + docs/.vitepress/theme/config/zh-tw.ts | 55 + docs/zh-tw/advanced/smart-form-component.md | 134 + docs/zh-tw/api/use-field-array.md | 279 + docs/zh-tw/api/use-field.md | 125 + docs/zh-tw/api/use-form-context.md | 64 + docs/zh-tw/api/use-form.md | 460 + docs/zh-tw/examples/index.md | 45 + docs/zh-tw/guide/index.md | 58 + docs/zh-tw/index.md | 31 + 17 files changed, 11395 insertions(+), 53 deletions(-) create mode 100644 docs/.vitepress/cache/deps/@stackblitz_sdk.js create mode 100644 docs/.vitepress/cache/deps/@stackblitz_sdk.js.map create mode 100644 docs/.vitepress/cache/deps/_metadata.json create mode 100644 docs/.vitepress/cache/deps/package.json create mode 100644 docs/.vitepress/cache/deps/vue.js create mode 100644 docs/.vitepress/cache/deps/vue.js.map create mode 100644 docs/.vitepress/theme/config/en.ts create mode 100644 docs/.vitepress/theme/config/zh-tw.ts create mode 100644 docs/zh-tw/advanced/smart-form-component.md create mode 100644 docs/zh-tw/api/use-field-array.md create mode 100644 docs/zh-tw/api/use-field.md create mode 100644 docs/zh-tw/api/use-form-context.md create mode 100644 docs/zh-tw/api/use-form.md create mode 100644 docs/zh-tw/examples/index.md create mode 100644 docs/zh-tw/guide/index.md create mode 100644 docs/zh-tw/index.md diff --git a/docs/.vitepress/cache/deps/@stackblitz_sdk.js b/docs/.vitepress/cache/deps/@stackblitz_sdk.js new file mode 100644 index 0000000..4b21f5b --- /dev/null +++ b/docs/.vitepress/cache/deps/@stackblitz_sdk.js @@ -0,0 +1,521 @@ +// node_modules/.pnpm/@stackblitz+sdk@1.9.0/node_modules/@stackblitz/sdk/bundles/sdk.m.js +var CONNECT_INTERVAL = 500; +var CONNECT_MAX_ATTEMPTS = 20; +var DEFAULT_FRAME_HEIGHT = 300; +var DEFAULT_ORIGIN = "https://stackblitz.com"; +var PROJECT_TEMPLATES = [ + "angular-cli", + "create-react-app", + "html", + "javascript", + "node", + "polymer", + "typescript", + "vue" +]; +var UI_SIDEBAR_VIEWS = ["project", "search", "ports", "settings"]; +var UI_THEMES = ["light", "dark"]; +var UI_VIEWS = ["editor", "preview"]; +var generators = { + clickToLoad: (value) => trueParam("ctl", value), + devToolsHeight: (value) => percentParam("devtoolsheight", value), + forceEmbedLayout: (value) => trueParam("embed", value), + hideDevTools: (value) => trueParam("hidedevtools", value), + hideExplorer: (value) => trueParam("hideExplorer", value), + hideNavigation: (value) => trueParam("hideNavigation", value), + openFile: (value) => stringParams("file", value), + showSidebar: (value) => booleanParam("showSidebar", value), + sidebarView: (value) => enumParam("sidebarView", value, UI_SIDEBAR_VIEWS), + startScript: (value) => stringParams("startScript", value), + terminalHeight: (value) => percentParam("terminalHeight", value), + theme: (value) => enumParam("theme", value, UI_THEMES), + view: (value) => enumParam("view", value, UI_VIEWS), + zenMode: (value) => trueParam("zenMode", value) +}; +function buildParams(options = {}) { + const params = Object.entries(options).map(([key, value]) => { + if (value != null && generators.hasOwnProperty(key)) { + return generators[key](value); + } + return ""; + }).filter(Boolean); + return params.length ? `?${params.join("&")}` : ""; +} +function trueParam(name, value) { + if (value === true) { + return `${name}=1`; + } + return ""; +} +function booleanParam(name, value) { + if (typeof value === "boolean") { + return `${name}=${value ? "1" : "0"}`; + } + return ""; +} +function percentParam(name, value) { + if (typeof value === "number" && !Number.isNaN(value)) { + const clamped = Math.min(100, Math.max(0, value)); + return `${name}=${encodeURIComponent(Math.round(clamped))}`; + } + return ""; +} +function enumParam(name, value = "", allowList = []) { + if (allowList.includes(value)) { + return `${name}=${encodeURIComponent(value)}`; + } + return ""; +} +function stringParams(name, value) { + const values = Array.isArray(value) ? value : [value]; + return values.filter((val) => typeof val === "string" && val.trim() !== "").map((val) => `${name}=${encodeURIComponent(val)}`).join("&"); +} +function genID() { + return Math.random().toString(36).slice(2, 6) + Math.random().toString(36).slice(2, 6); +} +function openUrl(route, options) { + return `${getOrigin(options)}${route}${buildParams(options)}`; +} +function embedUrl(route, options) { + const config = { + forceEmbedLayout: true + }; + if (options && typeof options === "object") { + Object.assign(config, options); + } + return `${getOrigin(config)}${route}${buildParams(config)}`; +} +function getOrigin(options = {}) { + const origin = typeof options.origin === "string" ? options.origin : DEFAULT_ORIGIN; + return origin.replace(/\/$/, ""); +} +function replaceAndEmbed(target, frame, options) { + if (!frame || !target || !target.parentNode) { + throw new Error("Invalid Element"); + } + if (target.id) { + frame.id = target.id; + } + if (target.className) { + frame.className = target.className; + } + setFrameDimensions(frame, options); + target.replaceWith(frame); +} +function findElement(elementOrId) { + if (typeof elementOrId === "string") { + const element = document.getElementById(elementOrId); + if (!element) { + throw new Error(`Could not find element with id '${elementOrId}'`); + } + return element; + } else if (elementOrId instanceof HTMLElement) { + return elementOrId; + } + throw new Error(`Invalid element: ${elementOrId}`); +} +function openTarget(options) { + return options && options.newWindow === false ? "_self" : "_blank"; +} +function setFrameDimensions(frame, options = {}) { + const height = Object.hasOwnProperty.call(options, "height") ? `${options.height}` : `${DEFAULT_FRAME_HEIGHT}`; + const width = Object.hasOwnProperty.call(options, "width") ? `${options.width}` : void 0; + frame.setAttribute("height", height); + if (width) { + frame.setAttribute("width", width); + } else { + frame.setAttribute("style", "width:100%;"); + } +} +var RDC = class { + constructor(port) { + this.pending = {}; + this.port = port; + this.port.onmessage = this.messageListener.bind(this); + } + request({ type, payload }) { + return new Promise((resolve, reject) => { + const id = genID(); + this.pending[id] = { resolve, reject }; + this.port.postMessage({ + type, + payload: { + ...payload, + // Ensure the payload object includes the request ID + __reqid: id + } + }); + }); + } + messageListener(event) { + var _a; + if (typeof ((_a = event.data.payload) == null ? void 0 : _a.__reqid) !== "string") { + return; + } + const { type, payload } = event.data; + const { __reqid: id, __success: success, __error: error } = payload; + if (this.pending[id]) { + if (success) { + this.pending[id].resolve(this.cleanResult(payload)); + } else { + this.pending[id].reject(error ? `${type}: ${error}` : type); + } + delete this.pending[id]; + } + } + cleanResult(payload) { + const result = { ...payload }; + delete result.__reqid; + delete result.__success; + delete result.__error; + return Object.keys(result).length ? result : null; + } +}; +var VM = class { + constructor(port, config) { + this.editor = { + /** + * Open one of several files in tabs and/or split panes. + * + * @since 1.7.0 Added support for opening multiple files + */ + openFile: (path) => { + return this._rdc.request({ + type: "SDK_OPEN_FILE", + payload: { path } + }); + }, + /** + * Set a project file as the currently selected file. + * + * - This may update the highlighted file in the file explorer, + * and the currently open and/or focused editor tab. + * - It will _not_ open a new editor tab if the provided path does not + * match a currently open tab. See `vm.editor.openFile` to open files. + * + * @since 1.7.0 + * @experimental + */ + setCurrentFile: (path) => { + return this._rdc.request({ + type: "SDK_SET_CURRENT_FILE", + payload: { path } + }); + }, + /** + * Change the color theme + * + * @since 1.7.0 + */ + setTheme: (theme) => { + return this._rdc.request({ + type: "SDK_SET_UI_THEME", + payload: { theme } + }); + }, + /** + * Change the display mode of the project: + * + * - `default`: show the editor and preview pane + * - `editor`: show the editor pane only + * - `preview`: show the preview pane only + * + * @since 1.7.0 + */ + setView: (view) => { + return this._rdc.request({ + type: "SDK_SET_UI_VIEW", + payload: { view } + }); + }, + /** + * Change the display mode of the sidebar: + * + * - `true`: show the sidebar + * - `false`: hide the sidebar + * + * @since 1.7.0 + */ + showSidebar: (visible = true) => { + return this._rdc.request({ + type: "SDK_TOGGLE_SIDEBAR", + payload: { visible } + }); + } + }; + this.preview = { + /** + * The origin (protocol and domain) of the preview iframe. + * + * In WebContainers-based projects, the origin will always be `null`; + * try using `vm.preview.getUrl` instead. + * + * @see https://developer.stackblitz.com/guides/user-guide/available-environments + */ + origin: "", + /** + * Get the current preview URL. + * + * In both and EngineBlock and WebContainers-based projects, the preview URL + * may not reflect the exact path of the current page, after user navigation. + * + * In WebContainers-based projects, the preview URL will be `null` initially, + * and until the project starts a web server. + * + * @since 1.7.0 + * @experimental + */ + getUrl: () => { + return this._rdc.request({ + type: "SDK_GET_PREVIEW_URL", + payload: {} + }).then((data) => (data == null ? void 0 : data.url) ?? null); + }, + /** + * Change the path of the preview URL. + * + * In WebContainers-based projects, this will be ignored if there is no + * currently running web server. + * + * @since 1.7.0 + * @experimental + */ + setUrl: (path = "/") => { + if (typeof path !== "string" || !path.startsWith("/")) { + throw new Error(`Invalid argument: expected a path starting with '/', got '${path}'`); + } + return this._rdc.request({ + type: "SDK_SET_PREVIEW_URL", + payload: { path } + }); + } + }; + this._rdc = new RDC(port); + Object.defineProperty(this.preview, "origin", { + value: typeof config.previewOrigin === "string" ? config.previewOrigin : null, + writable: false + }); + } + /** + * Apply batch updates to the project files in one call. + */ + applyFsDiff(diff) { + const isObject = (val) => val !== null && typeof val === "object"; + if (!isObject(diff) || !isObject(diff.create)) { + throw new Error("Invalid diff object: expected diff.create to be an object."); + } else if (!Array.isArray(diff.destroy)) { + throw new Error("Invalid diff object: expected diff.destroy to be an array."); + } + return this._rdc.request({ + type: "SDK_APPLY_FS_DIFF", + payload: diff + }); + } + /** + * Get the project’s defined dependencies. + * + * In EngineBlock projects, version numbers represent the resolved dependency versions. + * In WebContainers-based projects, returns data from the project’s `package.json` without resolving installed version numbers. + */ + getDependencies() { + return this._rdc.request({ + type: "SDK_GET_DEPS_SNAPSHOT", + payload: {} + }); + } + /** + * Get a snapshot of the project files and their content. + */ + getFsSnapshot() { + return this._rdc.request({ + type: "SDK_GET_FS_SNAPSHOT", + payload: {} + }); + } +}; +var connections = []; +var Connection = class { + constructor(element) { + this.id = genID(); + this.element = element; + this.pending = new Promise((resolve, reject) => { + const listenForSuccess = ({ data, ports }) => { + if ((data == null ? void 0 : data.action) === "SDK_INIT_SUCCESS" && data.id === this.id) { + this.vm = new VM(ports[0], data.payload); + resolve(this.vm); + cleanup(); + } + }; + const pingFrame = () => { + var _a; + (_a = this.element.contentWindow) == null ? void 0 : _a.postMessage( + { + action: "SDK_INIT", + id: this.id + }, + "*" + ); + }; + function cleanup() { + window.clearInterval(interval); + window.removeEventListener("message", listenForSuccess); + } + window.addEventListener("message", listenForSuccess); + pingFrame(); + let attempts = 0; + const interval = window.setInterval(() => { + if (this.vm) { + cleanup(); + return; + } + if (attempts >= CONNECT_MAX_ATTEMPTS) { + cleanup(); + reject("Timeout: Unable to establish a connection with the StackBlitz VM"); + connections.forEach((connection, index) => { + if (connection.id === this.id) { + connections.splice(index, 1); + } + }); + return; + } + attempts++; + pingFrame(); + }, CONNECT_INTERVAL); + }); + connections.push(this); + } +}; +var getConnection = (identifier) => { + const key = identifier instanceof Element ? "element" : "id"; + return connections.find((c) => c[key] === identifier) ?? null; +}; +function createHiddenInput(name, value) { + const input = document.createElement("input"); + input.type = "hidden"; + input.name = name; + input.value = value; + return input; +} +function encodeFilePath(path) { + return path.replace(/\[/g, "%5B").replace(/\]/g, "%5D"); +} +function createProjectForm({ + template, + title, + description, + dependencies, + files, + settings +}) { + if (!PROJECT_TEMPLATES.includes(template)) { + const names = PROJECT_TEMPLATES.map((t) => `'${t}'`).join(", "); + console.warn(`Unsupported project.template: must be one of ${names}`); + } + const inputs = []; + const addInput = (name, value, defaultValue = "") => { + inputs.push(createHiddenInput(name, typeof value === "string" ? value : defaultValue)); + }; + addInput("project[title]", title); + if (typeof description === "string" && description.length > 0) { + addInput("project[description]", description); + } + addInput("project[template]", template, "javascript"); + if (dependencies) { + if (template === "node") { + console.warn( + `Invalid project.dependencies: dependencies must be provided as a 'package.json' file when using the 'node' template.` + ); + } else { + addInput("project[dependencies]", JSON.stringify(dependencies)); + } + } + if (settings) { + addInput("project[settings]", JSON.stringify(settings)); + } + Object.entries(files).forEach(([path, contents]) => { + addInput(`project[files][${encodeFilePath(path)}]`, contents); + }); + const form = document.createElement("form"); + form.method = "POST"; + form.setAttribute("style", "display:none!important;"); + form.append(...inputs); + return form; +} +function createProjectFrameHTML(project, options) { + const form = createProjectForm(project); + form.action = embedUrl("/run", options); + form.id = "sb_run"; + const html = ` + + + + ${form.outerHTML} + \n\n`;\n\n return html;\n}\n\nexport function openNewProject(project: Project, options?: OpenOptions) {\n const form = createProjectForm(project);\n form.action = openUrl('/run', options);\n form.target = openTarget(options);\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n", "import type { Project, OpenOptions, EmbedOptions } from './interfaces';\nimport type { VM } from './vm';\nimport { Connection, getConnection } from './connection';\nimport { openNewProject, createProjectFrameHTML } from './generate';\nimport { embedUrl, findElement, openTarget, openUrl, replaceAndEmbed } from './helpers';\n\n/**\n * Get a VM instance for an existing StackBlitz project iframe.\n */\nexport function connect(frameEl: HTMLIFrameElement): Promise {\n if (!frameEl?.contentWindow) {\n return Promise.reject('Provided element is not an iframe.');\n }\n const connection = getConnection(frameEl) ?? new Connection(frameEl);\n return connection.pending;\n}\n\n/**\n * Open an existing StackBlitz project in a new tab (or in the current window).\n */\nexport function openProject(project: Project, options?: OpenOptions) {\n openNewProject(project, options);\n}\n\n/**\n * Open an existing StackBlitz project in a new tab (or in the current window).\n */\nexport function openProjectId(projectId: string, options?: OpenOptions) {\n const url = openUrl(`/edit/${projectId}`, options);\n const target = openTarget(options);\n window.open(url, target);\n}\n\n/**\n * Open a project from Github and open it in a new tab (or in the current window).\n *\n * Example usage:\n *\n * sdk.openGithubProject('some/repository');\n * sdk.openGithubProject('some/repository/tree/some-branch');\n */\nexport function openGithubProject(repoSlug: string, options?: OpenOptions) {\n const url = openUrl(`/github/${repoSlug}`, options);\n const target = openTarget(options);\n window.open(url, target);\n}\n\n/**\n * Create a new project and embed it on the current page.\n *\n * Returns a promise resolving to a VM instance.\n */\nexport function embedProject(\n elementOrId: string | HTMLElement,\n project: Project,\n options?: EmbedOptions\n): Promise {\n const element = findElement(elementOrId);\n const html = createProjectFrameHTML(project, options);\n const frame = document.createElement('iframe');\n\n replaceAndEmbed(element, frame, options);\n\n // HTML needs to be written after iframe is embedded\n frame.contentDocument?.write(html);\n\n return connect(frame);\n}\n\n/**\n * Embeds an existing StackBlitz project on the current page.\n *\n * Returns a promise resolving to a VM instance.\n */\nexport function embedProjectId(\n elementOrId: string | HTMLElement,\n projectId: string,\n options?: EmbedOptions\n): Promise {\n const element = findElement(elementOrId);\n const frame = document.createElement('iframe');\n frame.src = embedUrl(`/edit/${projectId}`, options);\n\n replaceAndEmbed(element, frame, options);\n\n return connect(frame);\n}\n\n/**\n * Embeds a project from Github on the current page.\n *\n * Returns a promise resolving to a VM instance.\n */\nexport function embedGithubProject(\n elementOrId: string | HTMLElement,\n repoSlug: string,\n options?: EmbedOptions\n): Promise {\n const element = findElement(elementOrId);\n const frame = document.createElement('iframe');\n frame.src = embedUrl(`/github/${repoSlug}`, options);\n\n replaceAndEmbed(element, frame, options);\n\n return connect(frame);\n}\n", "import {\n connect,\n embedGithubProject,\n embedProject,\n embedProjectId,\n openGithubProject,\n openProject,\n openProjectId,\n} from './lib';\n\n// Explicitly export public types (vs using `export * from './interfaces'`),\n// so that additions to interfaces don't become a part of our public API by mistake.\nexport type {\n Project,\n ProjectDependencies,\n ProjectFiles,\n ProjectSettings,\n ProjectTemplate,\n ProjectOptions,\n EmbedOptions,\n OpenOptions,\n OpenFileOption,\n UiThemeOption,\n UiViewOption,\n} from './interfaces';\nexport type { FsDiff, VM } from './vm';\n\nconst StackBlitzSDK = {\n connect,\n embedGithubProject,\n embedProject,\n embedProjectId,\n openGithubProject,\n openProject,\n openProjectId,\n};\n\n// Export a single object with methods, for compatibility with UMD and CommonJS.\n// Ideally we would also have named exports, but that can create incompatibilities\n// with some bundlers. To revisit in v2?\nexport default StackBlitzSDK;\n"], + "mappings": "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", + "names": [] +} diff --git a/docs/.vitepress/cache/deps/_metadata.json b/docs/.vitepress/cache/deps/_metadata.json new file mode 100644 index 0000000..9b7f67f --- /dev/null +++ b/docs/.vitepress/cache/deps/_metadata.json @@ -0,0 +1,19 @@ +{ + "hash": "b98aed0b", + "browserHash": "3662c0c2", + "optimized": { + "vue": { + "src": "../../../../node_modules/.pnpm/vue@3.2.47/node_modules/vue/dist/vue.runtime.esm-bundler.js", + "file": "vue.js", + "fileHash": "566a3dd0", + "needsInterop": false + }, + "@stackblitz/sdk": { + "src": "../../../../node_modules/.pnpm/@stackblitz+sdk@1.9.0/node_modules/@stackblitz/sdk/bundles/sdk.m.js", + "file": "@stackblitz_sdk.js", + "fileHash": "55c10195", + "needsInterop": false + } + }, + "chunks": {} +} \ No newline at end of file diff --git a/docs/.vitepress/cache/deps/package.json b/docs/.vitepress/cache/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/docs/.vitepress/cache/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/docs/.vitepress/cache/deps/vue.js b/docs/.vitepress/cache/deps/vue.js new file mode 100644 index 0000000..c115735 --- /dev/null +++ b/docs/.vitepress/cache/deps/vue.js @@ -0,0 +1,9516 @@ +// node_modules/.pnpm/@vue+shared@3.2.47/node_modules/@vue/shared/dist/shared.esm-bundler.js +function makeMap(str, expectsLowerCase) { + const map2 = /* @__PURE__ */ Object.create(null); + const list = str.split(","); + for (let i = 0; i < list.length; i++) { + map2[list[i]] = true; + } + return expectsLowerCase ? (val) => !!map2[val.toLowerCase()] : (val) => !!map2[val]; +} +var GLOBALS_WHITE_LISTED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"; +var isGloballyWhitelisted = makeMap(GLOBALS_WHITE_LISTED); +function normalizeStyle(value) { + if (isArray(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString(value)) { + return value; + } else if (isObject(value)) { + return value; + } +} +var listDelimiterRE = /;(?![^(]*\))/g; +var propertyDelimiterRE = /:([^]+)/; +var styleCommentRE = /\/\*.*?\*\//gs; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString(value)) { + res = value; + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) + return null; + let { class: klass, style } = props; + if (klass && !isString(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; +var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; +var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; +var isHTMLTag = makeMap(HTML_TAGS); +var isSVGTag = makeMap(SVG_TAGS); +var isVoidTag = makeMap(VOID_TAGS); +var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +var isSpecialBooleanAttr = makeMap(specialBooleanAttrs); +var isBooleanAttr = makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +var isKnownHtmlAttr = makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`); +var isKnownSvgAttr = makeMap(`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`); +function looseCompareArrays(a, b) { + if (a.length !== b.length) + return false; + let equal = true; + for (let i = 0; equal && i < a.length; i++) { + equal = looseEqual(a[i], b[i]); + } + return equal; +} +function looseEqual(a, b) { + if (a === b) + return true; + let aValidType = isDate(a); + let bValidType = isDate(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol(a); + bValidType = isSymbol(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray(a); + bValidType = isArray(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject(a); + bValidType = isObject(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; + } + } + } + return String(a) === String(b); +} +function looseIndexOf(arr, val) { + return arr.findIndex((item) => looseEqual(item, val)); +} +var toDisplayString = (val) => { + return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val); +}; +var replacer = (_key, val) => { + if (val && val.__v_isRef) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => { + entries[`${key} =>`] = val2; + return entries; + }, {}) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()] + }; + } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { + return String(val); + } + return val; +}; +var EMPTY_OBJ = true ? Object.freeze({}) : {}; +var EMPTY_ARR = true ? Object.freeze([]) : []; +var NOOP = () => { +}; +var NO = () => false; +var onRE = /^on[^a-z]/; +var isOn = (key) => onRE.test(key); +var isModelListener = (key) => key.startsWith("onUpdate:"); +var extend = Object.assign; +var remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var hasOwn = (val, key) => hasOwnProperty.call(val, key); +var isArray = Array.isArray; +var isMap = (val) => toTypeString(val) === "[object Map]"; +var isSet = (val) => toTypeString(val) === "[object Set]"; +var isDate = (val) => toTypeString(val) === "[object Date]"; +var isRegExp = (val) => toTypeString(val) === "[object RegExp]"; +var isFunction = (val) => typeof val === "function"; +var isString = (val) => typeof val === "string"; +var isSymbol = (val) => typeof val === "symbol"; +var isObject = (val) => val !== null && typeof val === "object"; +var isPromise = (val) => { + return isObject(val) && isFunction(val.then) && isFunction(val.catch); +}; +var objectToString = Object.prototype.toString; +var toTypeString = (value) => objectToString.call(value); +var toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +var isPlainObject = (val) => toTypeString(val) === "[object Object]"; +var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +var isReservedProp = makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +var isBuiltInDirective = makeMap("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"); +var cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +var camelizeRE = /-(\w)/g; +var camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +var hyphenateRE = /\B([A-Z])/g; +var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase()); +var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1)); +var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``); +var hasChanged = (value, oldValue) => !Object.is(value, oldValue); +var invokeArrayFns = (fns, arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](arg); + } +}; +var def = (obj, key, value) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + value + }); +}; +var looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +var toNumber = (val) => { + const n = isString(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +var _globalThis; +var getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; + +// node_modules/.pnpm/@vue+reactivity@3.2.47/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js +function warn(msg, ...args) { + console.warn(`[Vue warn] ${msg}`, ...args); +} +var activeEffectScope; +var EffectScope = class { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1; + } + } + get active() { + return this._active; + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } else if (true) { + warn(`cannot run an inactive effect scope.`); + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } + } +}; +function effectScope(detached) { + return new EffectScope(detached); +} +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } else if (true) { + warn(`onScopeDispose() is called when there is no active effect scope to be associated with.`); + } +} +var createDep = (effects) => { + const dep = new Set(effects); + dep.w = 0; + dep.n = 0; + return dep; +}; +var wasTracked = (dep) => (dep.w & trackOpBit) > 0; +var newTracked = (dep) => (dep.n & trackOpBit) > 0; +var initDepMarkers = ({ deps }) => { + if (deps.length) { + for (let i = 0; i < deps.length; i++) { + deps[i].w |= trackOpBit; + } + } +}; +var finalizeDepMarkers = (effect2) => { + const { deps } = effect2; + if (deps.length) { + let ptr = 0; + for (let i = 0; i < deps.length; i++) { + const dep = deps[i]; + if (wasTracked(dep) && !newTracked(dep)) { + dep.delete(effect2); + } else { + deps[ptr++] = dep; + } + dep.w &= ~trackOpBit; + dep.n &= ~trackOpBit; + } + deps.length = ptr; + } +}; +var targetMap = /* @__PURE__ */ new WeakMap(); +var effectTrackDepth = 0; +var trackOpBit = 1; +var maxMarkerBits = 30; +var activeEffect; +var ITERATE_KEY = Symbol(true ? "iterate" : ""); +var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : ""); +var ReactiveEffect = class { + constructor(fn, scheduler = null, scope) { + this.fn = fn; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this.parent = void 0; + recordEffectScope(this, scope); + } + run() { + if (!this.active) { + return this.fn(); + } + let parent = activeEffect; + let lastShouldTrack = shouldTrack; + while (parent) { + if (parent === this) { + return; + } + parent = parent.parent; + } + try { + this.parent = activeEffect; + activeEffect = this; + shouldTrack = true; + trackOpBit = 1 << ++effectTrackDepth; + if (effectTrackDepth <= maxMarkerBits) { + initDepMarkers(this); + } else { + cleanupEffect(this); + } + return this.fn(); + } finally { + if (effectTrackDepth <= maxMarkerBits) { + finalizeDepMarkers(this); + } + trackOpBit = 1 << --effectTrackDepth; + activeEffect = this.parent; + shouldTrack = lastShouldTrack; + this.parent = void 0; + if (this.deferStop) { + this.stop(); + } + } + } + stop() { + if (activeEffect === this) { + this.deferStop = true; + } else if (this.active) { + cleanupEffect(this); + if (this.onStop) { + this.onStop(); + } + this.active = false; + } + } +}; +function cleanupEffect(effect2) { + const { deps } = effect2; + if (deps.length) { + for (let i = 0; i < deps.length; i++) { + deps[i].delete(effect2); + } + deps.length = 0; + } +} +function effect(fn, options) { + if (fn.effect) { + fn = fn.effect.fn; + } + const _effect = new ReactiveEffect(fn); + if (options) { + extend(_effect, options); + if (options.scope) + recordEffectScope(_effect, options.scope); + } + if (!options || !options.lazy) { + _effect.run(); + } + const runner = _effect.run.bind(_effect); + runner.effect = _effect; + return runner; +} +function stop(runner) { + runner.effect.stop(); +} +var shouldTrack = true; +var trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep()); + } + const eventInfo = true ? { effect: activeEffect, target, type, key } : void 0; + trackEffects(dep, eventInfo); + } +} +function trackEffects(dep, debuggerEventExtraInfo) { + let shouldTrack2 = false; + if (effectTrackDepth <= maxMarkerBits) { + if (!newTracked(dep)) { + dep.n |= trackOpBit; + shouldTrack2 = !wasTracked(dep); + } + } else { + shouldTrack2 = !dep.has(activeEffect); + } + if (shouldTrack2) { + dep.add(activeEffect); + activeEffect.deps.push(dep); + if (activeEffect.onTrack) { + activeEffect.onTrack(Object.assign({ effect: activeEffect }, debuggerEventExtraInfo)); + } + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray(target)) { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); + } + break; + case "delete": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + } + break; + } + } + const eventInfo = true ? { target, type, key, newValue, oldValue, oldTarget } : void 0; + if (deps.length === 1) { + if (deps[0]) { + if (true) { + triggerEffects(deps[0], eventInfo); + } else { + triggerEffects(deps[0]); + } + } + } else { + const effects = []; + for (const dep of deps) { + if (dep) { + effects.push(...dep); + } + } + if (true) { + triggerEffects(createDep(effects), eventInfo); + } else { + triggerEffects(createDep(effects)); + } + } +} +function triggerEffects(dep, debuggerEventExtraInfo) { + const effects = isArray(dep) ? dep : [...dep]; + for (const effect2 of effects) { + if (effect2.computed) { + triggerEffect(effect2, debuggerEventExtraInfo); + } + } + for (const effect2 of effects) { + if (!effect2.computed) { + triggerEffect(effect2, debuggerEventExtraInfo); + } + } +} +function triggerEffect(effect2, debuggerEventExtraInfo) { + if (effect2 !== activeEffect || effect2.allowRecurse) { + if (effect2.onTrigger) { + effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + if (effect2.scheduler) { + effect2.scheduler(); + } else { + effect2.run(); + } + } +} +function getDepFromReactive(object, key) { + var _a2; + return (_a2 = targetMap.get(object)) === null || _a2 === void 0 ? void 0 : _a2.get(key); +} +var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); +var builtInSymbols = new Set( + Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +var get$1 = createGetter(); +var shallowGet = createGetter(false, true); +var readonlyGet = createGetter(true); +var shallowReadonlyGet = createGetter(true, true); +var arrayInstrumentations = createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i = 0, l = this.length; i < l; i++) { + track(arr, "get", i + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + const res = toRaw(this)[key].apply(this, args); + resetTracking(); + return res; + }; + }); + return instrumentations; +} +function hasOwnProperty2(key) { + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +function createGetter(isReadonly2 = false, shallow = false) { + return function get2(target, key, receiver) { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return shallow; + } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { + return target; + } + const targetIsArray = isArray(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + if (key === "hasOwnProperty") { + return hasOwnProperty2; + } + } + const res = Reflect.get(target, key, receiver); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (shallow) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + }; +} +var set$1 = createSetter(); +var shallowSet = createSetter(true); +function createSetter(shallow = false) { + return function set2(target, key, value, receiver) { + let oldValue = target[key]; + if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) { + return false; + } + if (!shallow) { + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray(target) && isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } + } + const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set(target, key, value, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + } + return result; + }; +} +function deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + const oldValue = target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function has$1(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; +} +function ownKeys(target) { + track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY); + return Reflect.ownKeys(target); +} +var mutableHandlers = { + get: get$1, + set: set$1, + deleteProperty, + has: has$1, + ownKeys +}; +var readonlyHandlers = { + get: readonlyGet, + set(target, key) { + if (true) { + warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target); + } + return true; + }, + deleteProperty(target, key) { + if (true) { + warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target); + } + return true; + } +}; +var shallowReactiveHandlers = extend({}, mutableHandlers, { + get: shallowGet, + set: shallowSet +}); +var shallowReadonlyHandlers = extend({}, readonlyHandlers, { + get: shallowReadonlyGet +}); +var toShallow = (value) => value; +var getProto = (v) => Reflect.getPrototypeOf(v); +function get(target, key, isReadonly2 = false, isShallow3 = false) { + target = target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (key !== rawKey) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } +} +function has(key, isReadonly2 = false) { + const target = this[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (key !== rawKey) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); +} +function size(target, isReadonly2 = false) { + target = target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); +} +function add(value) { + value = toRaw(value); + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; +} +function set(key, value) { + value = toRaw(value); + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + return this; +} +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2 ? get2.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0, oldTarget); + } + return result; +} +function createForEach(isReadonly2, isShallow3) { + return function forEach(callback, thisArg) { + const observed = this; + const target = observed[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + }; +} +function createIterableMethod(method, isReadonly2, isShallow3) { + return function(...args) { + const target = this[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + if (true) { + const key = args[0] ? `on key "${args[0]}" ` : ``; + console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this)); + } + return type === "delete" ? false : this; + }; +} +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get(this, key); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get(this, key, false, true); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get(this, key, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod( + "add" + /* TriggerOpTypes.ADD */ + ), + set: createReadonlyMethod( + "set" + /* TriggerOpTypes.SET */ + ), + delete: createReadonlyMethod( + "delete" + /* TriggerOpTypes.DELETE */ + ), + clear: createReadonlyMethod( + "clear" + /* TriggerOpTypes.CLEAR */ + ), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod( + "add" + /* TriggerOpTypes.ADD */ + ), + set: createReadonlyMethod( + "set" + /* TriggerOpTypes.SET */ + ), + delete: createReadonlyMethod( + "delete" + /* TriggerOpTypes.DELETE */ + ), + clear: createReadonlyMethod( + "clear" + /* TriggerOpTypes.CLEAR */ + ), + forEach: createForEach(true, true) + }; + const iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod(method, false, false); + readonlyInstrumentations2[method] = createIterableMethod(method, true, false); + shallowInstrumentations2[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); + }; +} +var mutableCollectionHandlers = { + get: createInstrumentationGetter(false, false) +}; +var shallowCollectionHandlers = { + get: createInstrumentationGetter(false, true) +}; +var readonlyCollectionHandlers = { + get: createInstrumentationGetter(true, false) +}; +var shallowReadonlyCollectionHandlers = { + get: createInstrumentationGetter(true, true) +}; +function checkIdentityKeys(target, has2, key) { + const rawKey = toRaw(key); + if (rawKey !== key && has2.call(target, rawKey)) { + const type = toRawType(target); + console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`); + } +} +var reactiveMap = /* @__PURE__ */ new WeakMap(); +var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +var readonlyMap = /* @__PURE__ */ new WeakMap(); +var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value[ + "__v_skip" + /* ReactiveFlags.SKIP */ + ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); +} +function shallowReactive(target) { + return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap); +} +function readonly(target) { + return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); +} +function shallowReadonly(target) { + return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject(target)) { + if (true) { + console.warn(`value cannot be made reactive: ${String(target)}`); + } + return target; + } + if (target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ] && !(isReadonly2 && target[ + "__v_isReactive" + /* ReactiveFlags.IS_REACTIVE */ + ])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]); + } + return !!(value && value[ + "__v_isReactive" + /* ReactiveFlags.IS_REACTIVE */ + ]); +} +function isReadonly(value) { + return !!(value && value[ + "__v_isReadonly" + /* ReactiveFlags.IS_READONLY */ + ]); +} +function isShallow(value) { + return !!(value && value[ + "__v_isShallow" + /* ReactiveFlags.IS_SHALLOW */ + ]); +} +function isProxy(value) { + return isReactive(value) || isReadonly(value); +} +function toRaw(observed) { + const raw = observed && observed[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + def(value, "__v_skip", true); + return value; +} +var toReactive = (value) => isObject(value) ? reactive(value) : value; +var toReadonly = (value) => isObject(value) ? readonly(value) : value; +function trackRefValue(ref2) { + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + if (true) { + trackEffects(ref2.dep || (ref2.dep = createDep()), { + target: ref2, + type: "get", + key: "value" + }); + } else { + trackEffects(ref2.dep || (ref2.dep = createDep())); + } + } +} +function triggerRefValue(ref2, newVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + if (true) { + triggerEffects(dep, { + target: ref2, + type: "set", + key: "value", + newValue: newVal + }); + } else { + triggerEffects(dep); + } + } +} +function isRef(r) { + return !!(r && r.__v_isRef === true); +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +var RefImpl = class { + constructor(value, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value : toRaw(value); + this._value = __v_isShallow ? value : toReactive(value); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive(newVal); + triggerRefValue(this, newVal); + } + } +}; +function triggerRef(ref2) { + triggerRefValue(ref2, true ? ref2.value : void 0); +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +var shallowUnwrapHandlers = { + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +var CustomRefImpl = class { + constructor(factory) { + this.dep = void 0; + this.__v_isRef = true; + const { get: get2, set: set2 } = factory(() => trackRefValue(this), () => triggerRefValue(this)); + this._get = get2; + this._set = set2; + } + get value() { + return this._get(); + } + set value(newVal) { + this._set(newVal); + } +}; +function customRef(factory) { + return new CustomRefImpl(factory); +} +function toRefs(object) { + if (!isProxy(object)) { + console.warn(`toRefs() expects a reactive object but received a plain one.`); + } + const ret = isArray(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = toRef(object, key); + } + return ret; +} +var ObjectRefImpl = class { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this.__v_isRef = true; + } + get value() { + const val = this._object[this._key]; + return val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +}; +function toRef(object, key, defaultValue) { + const val = object[key]; + return isRef(val) ? val : new ObjectRefImpl(object, key, defaultValue); +} +var _a$1; +var ComputedRefImpl = class { + constructor(getter, _setter, isReadonly2, isSSR) { + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this[_a$1] = false; + this._dirty = true; + this.effect = new ReactiveEffect(getter, () => { + if (!this._dirty) { + this._dirty = true; + triggerRefValue(this); + } + }); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this[ + "__v_isReadonly" + /* ReactiveFlags.IS_READONLY */ + ] = isReadonly2; + } + get value() { + const self2 = toRaw(this); + trackRefValue(self2); + if (self2._dirty || !self2._cacheable) { + self2._dirty = false; + self2._value = self2.effect.run(); + } + return self2._value; + } + set value(newValue) { + this._setter(newValue); + } +}; +_a$1 = "__v_isReadonly"; +function computed(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = true ? () => { + console.warn("Write operation failed: computed value is readonly"); + } : NOOP; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + if (debugOptions && !isSSR) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + return cRef; +} +var _a; +var tick = Promise.resolve(); +_a = "__v_isReadonly"; + +// node_modules/.pnpm/@vue+runtime-core@3.2.47/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +var stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +function popWarningContext() { + stack.pop(); +} +function warn2(msg, ...args) { + if (false) + return; + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling(appWarnHandler, instance, 11, [ + msg + args.join(""), + instance && instance.proxy, + trace.map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`).join("\n"), + trace + ]); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function assertNumber(val, type) { + if (false) + return; + if (val === void 0) { + return; + } else if (typeof val !== "number") { + warn2(`${type} is not a valid number - got ${JSON.stringify(val)}.`); + } else if (isNaN(val)) { + warn2(`${type} is NaN - the duration expression might be incorrect.`); + } +} +var ErrorTypeStrings = { + [ + "sp" + /* LifecycleHooks.SERVER_PREFETCH */ + ]: "serverPrefetch hook", + [ + "bc" + /* LifecycleHooks.BEFORE_CREATE */ + ]: "beforeCreate hook", + [ + "c" + /* LifecycleHooks.CREATED */ + ]: "created hook", + [ + "bm" + /* LifecycleHooks.BEFORE_MOUNT */ + ]: "beforeMount hook", + [ + "m" + /* LifecycleHooks.MOUNTED */ + ]: "mounted hook", + [ + "bu" + /* LifecycleHooks.BEFORE_UPDATE */ + ]: "beforeUpdate hook", + [ + "u" + /* LifecycleHooks.UPDATED */ + ]: "updated", + [ + "bum" + /* LifecycleHooks.BEFORE_UNMOUNT */ + ]: "beforeUnmount hook", + [ + "um" + /* LifecycleHooks.UNMOUNTED */ + ]: "unmounted hook", + [ + "a" + /* LifecycleHooks.ACTIVATED */ + ]: "activated hook", + [ + "da" + /* LifecycleHooks.DEACTIVATED */ + ]: "deactivated hook", + [ + "ec" + /* LifecycleHooks.ERROR_CAPTURED */ + ]: "errorCaptured hook", + [ + "rtc" + /* LifecycleHooks.RENDER_TRACKED */ + ]: "renderTracked hook", + [ + "rtg" + /* LifecycleHooks.RENDER_TRIGGERED */ + ]: "renderTriggered hook", + [ + 0 + /* ErrorCodes.SETUP_FUNCTION */ + ]: "setup function", + [ + 1 + /* ErrorCodes.RENDER_FUNCTION */ + ]: "render function", + [ + 2 + /* ErrorCodes.WATCH_GETTER */ + ]: "watcher getter", + [ + 3 + /* ErrorCodes.WATCH_CALLBACK */ + ]: "watcher callback", + [ + 4 + /* ErrorCodes.WATCH_CLEANUP */ + ]: "watcher cleanup function", + [ + 5 + /* ErrorCodes.NATIVE_EVENT_HANDLER */ + ]: "native event handler", + [ + 6 + /* ErrorCodes.COMPONENT_EVENT_HANDLER */ + ]: "component event handler", + [ + 7 + /* ErrorCodes.VNODE_HOOK */ + ]: "vnode hook", + [ + 8 + /* ErrorCodes.DIRECTIVE_HOOK */ + ]: "directive hook", + [ + 9 + /* ErrorCodes.TRANSITION_HOOK */ + ]: "transition hook", + [ + 10 + /* ErrorCodes.APP_ERROR_HANDLER */ + ]: "app errorHandler", + [ + 11 + /* ErrorCodes.APP_WARN_HANDLER */ + ]: "app warnHandler", + [ + 12 + /* ErrorCodes.FUNCTION_REF */ + ]: "ref function", + [ + 13 + /* ErrorCodes.ASYNC_COMPONENT_LOADER */ + ]: "async component loader", + [ + 14 + /* ErrorCodes.SCHEDULER */ + ]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core" +}; +function callWithErrorHandling(fn, instance, type, args) { + let res; + try { + res = args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } + return res; +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = true ? ErrorTypeStrings[type] : type; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + callWithErrorHandling(appErrorHandler, null, 10, [err, exposedInstance, errorInfo]); + return; + } + } + logError(err, type, contextVNode, throwInDev); +} +function logError(err, type, contextVNode, throwInDev = true) { + if (true) { + const info = ErrorTypeStrings[type]; + if (contextVNode) { + pushWarningContext(contextVNode); + } + warn2(`Unhandled error${info ? ` during execution of ${info}` : ``}`); + if (contextVNode) { + popWarningContext(); + } + if (throwInDev) { + throw err; + } else { + console.error(err); + } + } else { + console.error(err); + } +} +var isFlushing = false; +var isFlushPending = false; +var queue = []; +var flushIndex = 0; +var pendingPostFlushCbs = []; +var activePostFlushCbs = null; +var postFlushIndex = 0; +var resolvedPromise = Promise.resolve(); +var currentFlushPromise = null; +var RECURSION_LIMIT = 100; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex(id) { + let start = flushIndex + 1; + let end = queue.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJobId = getId(queue[middle]); + middleJobId < id ? start = middle + 1 : end = middle; + } + return start; +} +function queueJob(job) { + if (!queue.length || !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) { + if (job.id == null) { + queue.push(job); + } else { + queue.splice(findInsertionIndex(job.id), 0, job); + } + queueFlush(); + } +} +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function invalidateJob(job) { + const i = queue.indexOf(job); + if (i > flushIndex) { + queue.splice(i, 1); + } +} +function queuePostFlushCb(cb) { + if (!isArray(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes(cb, cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex)) { + pendingPostFlushCbs.push(cb); + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) { + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.pre) { + if (checkRecursiveUpdates(seen, cb)) { + continue; + } + queue.splice(i, 1); + i--; + cb(); + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)]; + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + activePostFlushCbs.sort((a, b) => getId(a) - getId(b)); + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) { + continue; + } + activePostFlushCbs[postFlushIndex](); + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +var getId = (job) => job.id == null ? Infinity : job.id; +var comparator = (a, b) => { + const diff = getId(a) - getId(b); + if (diff === 0) { + if (a.pre && !b.pre) + return -1; + if (b.pre && !a.pre) + return 1; + } + return diff; +}; +function flushJobs(seen) { + isFlushPending = false; + isFlushing = true; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + queue.sort(comparator); + const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP; + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && job.active !== false) { + if (check(job)) { + continue; + } + callWithErrorHandling( + job, + null, + 14 + /* ErrorCodes.SCHEDULER */ + ); + } + } + } finally { + flushIndex = 0; + queue.length = 0; + flushPostFlushCbs(seen); + isFlushing = false; + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(seen); + } + } +} +function checkRecursiveUpdates(seen, fn) { + if (!seen.has(fn)) { + seen.set(fn, 1); + } else { + const count = seen.get(fn); + if (count > RECURSION_LIMIT) { + const instance = fn.ownerInstance; + const componentName = instance && getComponentName(instance.type); + warn2(`Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`); + return true; + } else { + seen.set(fn, count + 1); + } + } +} +var isHmrUpdating = false; +var hmrDirtyComponents = /* @__PURE__ */ new Set(); +if (true) { + getGlobalThis().__VUE_HMR_RUNTIME__ = { + createRecord: tryWrap(createRecord), + rerender: tryWrap(rerender), + reload: tryWrap(reload) + }; +} +var map = /* @__PURE__ */ new Map(); +function registerHMR(instance) { + const id = instance.type.__hmrId; + let record = map.get(id); + if (!record) { + createRecord(id, instance.type); + record = map.get(id); + } + record.instances.add(instance); +} +function unregisterHMR(instance) { + map.get(instance.type.__hmrId).instances.delete(instance); +} +function createRecord(id, initialDef) { + if (map.has(id)) { + return false; + } + map.set(id, { + initialDef: normalizeClassComponent(initialDef), + instances: /* @__PURE__ */ new Set() + }); + return true; +} +function normalizeClassComponent(component) { + return isClassComponent(component) ? component.__vccOpts : component; +} +function rerender(id, newRender) { + const record = map.get(id); + if (!record) { + return; + } + record.initialDef.render = newRender; + [...record.instances].forEach((instance) => { + if (newRender) { + instance.render = newRender; + normalizeClassComponent(instance.type).render = newRender; + } + instance.renderCache = []; + isHmrUpdating = true; + instance.update(); + isHmrUpdating = false; + }); +} +function reload(id, newComp) { + const record = map.get(id); + if (!record) + return; + newComp = normalizeClassComponent(newComp); + updateComponentDef(record.initialDef, newComp); + const instances = [...record.instances]; + for (const instance of instances) { + const oldComp = normalizeClassComponent(instance.type); + if (!hmrDirtyComponents.has(oldComp)) { + if (oldComp !== record.initialDef) { + updateComponentDef(oldComp, newComp); + } + hmrDirtyComponents.add(oldComp); + } + instance.appContext.optionsCache.delete(instance.type); + if (instance.ceReload) { + hmrDirtyComponents.add(oldComp); + instance.ceReload(newComp.styles); + hmrDirtyComponents.delete(oldComp); + } else if (instance.parent) { + queueJob(instance.parent.update); + } else if (instance.appContext.reload) { + instance.appContext.reload(); + } else if (typeof window !== "undefined") { + window.location.reload(); + } else { + console.warn("[HMR] Root or manually mounted instance modified. Full reload required."); + } + } + queuePostFlushCb(() => { + for (const instance of instances) { + hmrDirtyComponents.delete(normalizeClassComponent(instance.type)); + } + }); +} +function updateComponentDef(oldComp, newComp) { + extend(oldComp, newComp); + for (const key in oldComp) { + if (key !== "__file" && !(key in newComp)) { + delete oldComp[key]; + } + } +} +function tryWrap(fn) { + return (id, arg) => { + try { + return fn(id, arg); + } catch (e) { + console.error(e); + console.warn(`[HMR] Something went wrong during Vue component hot-reload. Full reload required.`); + } + }; +} +var devtools; +var buffer = []; +var devtoolsNotInstalled = false; +function emit$1(event, ...args) { + if (devtools) { + devtools.emit(event, ...args); + } else if (!devtoolsNotInstalled) { + buffer.push({ event, args }); + } +} +function setDevtoolsHook(hook, target) { + var _a2, _b; + devtools = hook; + if (devtools) { + devtools.enabled = true; + buffer.forEach(({ event, args }) => devtools.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + !((_b = (_a2 = window.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent) === null || _b === void 0 ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook(newHook, target); + }); + setTimeout(() => { + if (!devtools) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + devtoolsNotInstalled = true; + buffer = []; + } + }, 3e3); + } else { + devtoolsNotInstalled = true; + buffer = []; + } +} +function devtoolsInitApp(app, version2) { + emit$1("app:init", app, version2, { + Fragment, + Text, + Comment, + Static + }); +} +function devtoolsUnmountApp(app) { + emit$1("app:unmount", app); +} +var devtoolsComponentAdded = createDevtoolsComponentHook( + "component:added" + /* DevtoolsHooks.COMPONENT_ADDED */ +); +var devtoolsComponentUpdated = createDevtoolsComponentHook( + "component:updated" + /* DevtoolsHooks.COMPONENT_UPDATED */ +); +var _devtoolsComponentRemoved = createDevtoolsComponentHook( + "component:removed" + /* DevtoolsHooks.COMPONENT_REMOVED */ +); +var devtoolsComponentRemoved = (component) => { + if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered + !devtools.cleanupBuffer(component)) { + _devtoolsComponentRemoved(component); + } +}; +function createDevtoolsComponentHook(hook) { + return (component) => { + emit$1(hook, component.appContext.app, component.uid, component.parent ? component.parent.uid : void 0, component); + }; +} +var devtoolsPerfStart = createDevtoolsPerformanceHook( + "perf:start" + /* DevtoolsHooks.PERFORMANCE_START */ +); +var devtoolsPerfEnd = createDevtoolsPerformanceHook( + "perf:end" + /* DevtoolsHooks.PERFORMANCE_END */ +); +function createDevtoolsPerformanceHook(hook) { + return (component, type, time) => { + emit$1(hook, component.appContext.app, component.uid, component, type, time); + }; +} +function devtoolsComponentEmit(component, event, params) { + emit$1("component:emit", component.appContext.app, component, event, params); +} +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) + return; + const props = instance.vnode.props || EMPTY_OBJ; + if (true) { + const { emitsOptions, propsOptions: [propsOptions] } = instance; + if (emitsOptions) { + if (!(event in emitsOptions) && true) { + if (!propsOptions || !(toHandlerKey(event) in propsOptions)) { + warn2(`Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`); + } + } else { + const validator = emitsOptions[event]; + if (isFunction(validator)) { + const isValid = validator(...rawArgs); + if (!isValid) { + warn2(`Invalid event arguments: event validation failed for event "${event}".`); + } + } + } + } + } + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modelArg = isModelListener2 && event.slice(7); + if (modelArg && modelArg in props) { + const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; + const { number, trim } = props[modifiersKey] || EMPTY_OBJ; + if (trim) { + args = rawArgs.map((a) => isString(a) ? a.trim() : a); + } + if (number) { + args = rawArgs.map(looseToNumber); + } + } + if (true) { + devtoolsComponentEmit(instance, event, args); + } + if (true) { + const lowerCaseEvent = event.toLowerCase(); + if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { + warn2(`Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(instance, instance.type)} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`); + } + } + let handlerName; + let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize(event))]; + if (!handler && isModelListener2) { + handler = props[handlerName = toHandlerKey(hyphenate(event))]; + } + if (handler) { + callWithAsyncErrorHandling(handler, instance, 6, args); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; + } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling(onceHandler, instance, 6, args); + } +} +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache = appContext.emitsCache; + const cached = cache.get(comp); + if (cached !== void 0) { + return cached; + } + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (__VUE_OPTIONS_API__ && !isFunction(comp)) { + const extendEmits = (raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend(normalized, normalizedFromExtend); + } + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); + } + if (comp.extends) { + extendEmits(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendEmits); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, null); + } + return null; + } + if (isArray(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend(normalized, raw); + } + if (isObject(comp)) { + cache.set(comp, normalized); + } + return normalized; +} +function isEmitListener(options, key) { + if (!options || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); +} +var currentRenderingInstance = null; +var currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function pushScopeId(id) { + currentScopeId = id; +} +function popScopeId() { + currentScopeId = null; +} +var withScopeId = (_id) => withCtx; +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) + return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + if (true) { + devtoolsComponentUpdated(ctx); + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +var accessedAttrs = false; +function markAttrsAccessed() { + accessedAttrs = true; +} +function renderComponentRoot(instance) { + const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit: emit2, render: render2, renderCache, data, setupState, ctx, inheritAttrs } = instance; + let result; + let fallthroughAttrs; + const prev = setCurrentRenderingInstance(instance); + if (true) { + accessedAttrs = false; + } + try { + if (vnode.shapeFlag & 4) { + const proxyToUse = withProxy || proxy; + result = normalizeVNode(render2.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx)); + fallthroughAttrs = attrs; + } else { + const render3 = Component; + if (attrs === props) { + markAttrsAccessed(); + } + result = normalizeVNode(render3.length > 1 ? render3(props, true ? { + get attrs() { + markAttrsAccessed(); + return attrs; + }, + slots, + emit: emit2 + } : { attrs, slots, emit: emit2 }) : render3( + props, + null + /* we know it doesn't need it */ + )); + fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); + } + } catch (err) { + blockStack.length = 0; + handleError( + err, + instance, + 1 + /* ErrorCodes.RENDER_FUNCTION */ + ); + result = createVNode(Comment); + } + let root = result; + let setRoot = void 0; + if (result.patchFlag > 0 && result.patchFlag & 2048) { + [root, setRoot] = getChildRoot(result); + } + if (fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs); + const { shapeFlag } = root; + if (keys.length) { + if (shapeFlag & (1 | 6)) { + if (propsOptions && keys.some(isModelListener)) { + fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions); + } + root = cloneVNode(root, fallthroughAttrs); + } else if (!accessedAttrs && root.type !== Comment) { + const allAttrs = Object.keys(attrs); + const eventAttrs = []; + const extraAttrs = []; + for (let i = 0, l = allAttrs.length; i < l; i++) { + const key = allAttrs[i]; + if (isOn(key)) { + if (!isModelListener(key)) { + eventAttrs.push(key[2].toLowerCase() + key.slice(3)); + } + } else { + extraAttrs.push(key); + } + } + if (extraAttrs.length) { + warn2(`Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`); + } + if (eventAttrs.length) { + warn2(`Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`); + } + } + } + } + if (vnode.dirs) { + if (!isElementRoot(root)) { + warn2(`Runtime directive used on component with non-element root node. The directives will not function as intended.`); + } + root = cloneVNode(root); + root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; + } + if (vnode.transition) { + if (!isElementRoot(root)) { + warn2(`Component inside renders non-element root node that cannot be animated.`); + } + root.transition = vnode.transition; + } + if (setRoot) { + setRoot(root); + } else { + result = root; + } + setCurrentRenderingInstance(prev); + return result; +} +var getChildRoot = (vnode) => { + const rawChildren = vnode.children; + const dynamicChildren = vnode.dynamicChildren; + const childRoot = filterSingleRoot(rawChildren); + if (!childRoot) { + return [vnode, void 0]; + } + const index = rawChildren.indexOf(childRoot); + const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; + const setRoot = (updatedRoot) => { + rawChildren[index] = updatedRoot; + if (dynamicChildren) { + if (dynamicIndex > -1) { + dynamicChildren[dynamicIndex] = updatedRoot; + } else if (updatedRoot.patchFlag > 0) { + vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; + } + } + }; + return [normalizeVNode(childRoot), setRoot]; +}; +function filterSingleRoot(children) { + let singleRoot; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (isVNode(child)) { + if (child.type !== Comment || child.children === "v-if") { + if (singleRoot) { + return; + } else { + singleRoot = child; + } + } + } else { + return; + } + } + return singleRoot; +} +var getFunctionalFallthrough = (attrs) => { + let res; + for (const key in attrs) { + if (key === "class" || key === "style" || isOn(key)) { + (res || (res = {}))[key] = attrs[key]; + } + } + return res; +}; +var filterModelListeners = (attrs, props) => { + const res = {}; + for (const key in attrs) { + if (!isModelListener(key) || !(key.slice(9) in props)) { + res[key] = attrs[key]; + } + } + return res; +}; +var isElementRoot = (vnode) => { + return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; +}; +function shouldUpdateComponent(prevVNode, nextVNode, optimized) { + const { props: prevProps, children: prevChildren, component } = prevVNode; + const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; + const emits = component.emitsOptions; + if ((prevChildren || nextChildren) && isHmrUpdating) { + return true; + } + if (nextVNode.dirs || nextVNode.transition) { + return true; + } + if (optimized && patchFlag >= 0) { + if (patchFlag & 1024) { + return true; + } + if (patchFlag & 16) { + if (!prevProps) { + return !!nextProps; + } + return hasPropsChanged(prevProps, nextProps, emits); + } else if (patchFlag & 8) { + const dynamicProps = nextVNode.dynamicProps; + for (let i = 0; i < dynamicProps.length; i++) { + const key = dynamicProps[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { + return true; + } + } + } + } else { + if (prevChildren || nextChildren) { + if (!nextChildren || !nextChildren.$stable) { + return true; + } + } + if (prevProps === nextProps) { + return false; + } + if (!prevProps) { + return !!nextProps; + } + if (!nextProps) { + return true; + } + return hasPropsChanged(prevProps, nextProps, emits); + } + return false; +} +function hasPropsChanged(prevProps, nextProps, emitsOptions) { + const nextKeys = Object.keys(nextProps); + if (nextKeys.length !== Object.keys(prevProps).length) { + return true; + } + for (let i = 0; i < nextKeys.length; i++) { + const key = nextKeys[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { + return true; + } + } + return false; +} +function updateHOCHostEl({ vnode, parent }, el) { + while (parent && parent.subTree === vnode) { + (vnode = parent.vnode).el = el; + parent = parent.parent; + } +} +var isSuspense = (type) => type.__isSuspense; +var SuspenseImpl = { + name: "Suspense", + // In order to make Suspense tree-shakable, we need to avoid importing it + // directly in the renderer. The renderer checks for the __isSuspense flag + // on a vnode's type and calls the `process` method, passing in renderer + // internals. + __isSuspense: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { + if (n1 == null) { + mountSuspense(n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals); + } else { + patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, rendererInternals); + } + }, + hydrate: hydrateSuspense, + create: createSuspenseBoundary, + normalize: normalizeSuspenseChildren +}; +var Suspense = SuspenseImpl; +function triggerEvent(vnode, name) { + const eventListener = vnode.props && vnode.props[name]; + if (isFunction(eventListener)) { + eventListener(); + } +} +function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { + const { p: patch, o: { createElement } } = rendererInternals; + const hiddenContainer = createElement("div"); + const suspense = vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals); + patch(null, suspense.pendingBranch = vnode.ssContent, hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds); + if (suspense.deps > 0) { + triggerEvent(vnode, "onPending"); + triggerEvent(vnode, "onFallback"); + patch( + null, + vnode.ssFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds + ); + setActiveBranch(suspense, vnode.ssFallback); + } else { + suspense.resolve(); + } +} +function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) { + const suspense = n2.suspense = n1.suspense; + suspense.vnode = n2; + n2.el = n1.el; + const newBranch = n2.ssContent; + const newFallback = n2.ssFallback; + const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; + if (pendingBranch) { + suspense.pendingBranch = newBranch; + if (isSameVNodeType(newBranch, pendingBranch)) { + patch(pendingBranch, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else if (isInFallback) { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else { + suspense.pendingId++; + if (isHydrating) { + suspense.isHydrating = false; + suspense.activeBranch = pendingBranch; + } else { + unmount(pendingBranch, parentComponent, suspense); + } + suspense.deps = 0; + suspense.effects.length = 0; + suspense.hiddenContainer = createElement("div"); + if (isInFallback) { + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized); + suspense.resolve(true); + } else { + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } + } + } + } else { + if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized); + setActiveBranch(suspense, newBranch); + } else { + triggerEvent(n2, "onPending"); + suspense.pendingBranch = newBranch; + suspense.pendingId++; + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + const { timeout, pendingId } = suspense; + if (timeout > 0) { + setTimeout(() => { + if (suspense.pendingId === pendingId) { + suspense.fallback(newFallback); + } + }, timeout); + } else if (timeout === 0) { + suspense.fallback(newFallback); + } + } + } + } +} +var hasWarned = false; +function createSuspenseBoundary(vnode, parent, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) { + if (!hasWarned) { + hasWarned = true; + console[console.info ? "info" : "log"](` is an experimental feature and its API will likely change.`); + } + const { p: patch, m: move, um: unmount, n: next, o: { parentNode, remove: remove2 } } = rendererInternals; + const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0; + if (true) { + assertNumber(timeout, `Suspense timeout`); + } + const suspense = { + vnode, + parent, + parentComponent, + isSVG, + container, + hiddenContainer, + anchor, + deps: 0, + pendingId: 0, + timeout: typeof timeout === "number" ? timeout : -1, + activeBranch: null, + pendingBranch: null, + isInFallback: true, + isHydrating, + isUnmounted: false, + effects: [], + resolve(resume = false) { + if (true) { + if (!resume && !suspense.pendingBranch) { + throw new Error(`suspense.resolve() is called without a pending branch.`); + } + if (suspense.isUnmounted) { + throw new Error(`suspense.resolve() is called on an already unmounted suspense boundary.`); + } + } + const { vnode: vnode2, activeBranch, pendingBranch, pendingId, effects, parentComponent: parentComponent2, container: container2 } = suspense; + if (suspense.isHydrating) { + suspense.isHydrating = false; + } else if (!resume) { + const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = () => { + if (pendingId === suspense.pendingId) { + move( + pendingBranch, + container2, + anchor2, + 0 + /* MoveType.ENTER */ + ); + } + }; + } + let { anchor: anchor2 } = suspense; + if (activeBranch) { + anchor2 = next(activeBranch); + unmount(activeBranch, parentComponent2, suspense, true); + } + if (!delayEnter) { + move( + pendingBranch, + container2, + anchor2, + 0 + /* MoveType.ENTER */ + ); + } + } + setActiveBranch(suspense, pendingBranch); + suspense.pendingBranch = null; + suspense.isInFallback = false; + let parent2 = suspense.parent; + let hasUnresolvedAncestor = false; + while (parent2) { + if (parent2.pendingBranch) { + parent2.effects.push(...effects); + hasUnresolvedAncestor = true; + break; + } + parent2 = parent2.parent; + } + if (!hasUnresolvedAncestor) { + queuePostFlushCb(effects); + } + suspense.effects = []; + triggerEvent(vnode2, "onResolve"); + }, + fallback(fallbackVNode) { + if (!suspense.pendingBranch) { + return; + } + const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense; + triggerEvent(vnode2, "onFallback"); + const anchor2 = next(activeBranch); + const mountFallback = () => { + if (!suspense.isInFallback) { + return; + } + patch( + null, + fallbackVNode, + container2, + anchor2, + parentComponent2, + null, + // fallback tree will not have suspense context + isSVG2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, fallbackVNode); + }; + const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = mountFallback; + } + suspense.isInFallback = true; + unmount( + activeBranch, + parentComponent2, + null, + // no suspense so unmount hooks fire now + true + // shouldRemove + ); + if (!delayEnter) { + mountFallback(); + } + }, + move(container2, anchor2, type) { + suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); + suspense.container = container2; + }, + next() { + return suspense.activeBranch && next(suspense.activeBranch); + }, + registerDep(instance, setupRenderEffect) { + const isInPendingSuspense = !!suspense.pendingBranch; + if (isInPendingSuspense) { + suspense.deps++; + } + const hydratedEl = instance.vnode.el; + instance.asyncDep.catch((err) => { + handleError( + err, + instance, + 0 + /* ErrorCodes.SETUP_FUNCTION */ + ); + }).then((asyncSetupResult) => { + if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { + return; + } + instance.asyncResolved = true; + const { vnode: vnode2 } = instance; + if (true) { + pushWarningContext(vnode2); + } + handleSetupResult(instance, asyncSetupResult, false); + if (hydratedEl) { + vnode2.el = hydratedEl; + } + const placeholder = !hydratedEl && instance.subTree.el; + setupRenderEffect( + instance, + vnode2, + // component may have been moved before resolve. + // if this is not a hydration, instance.subTree will be the comment + // placeholder. + parentNode(hydratedEl || instance.subTree.el), + // anchor will not be used if this is hydration, so only need to + // consider the comment placeholder case. + hydratedEl ? null : next(instance.subTree), + suspense, + isSVG, + optimized + ); + if (placeholder) { + remove2(placeholder); + } + updateHOCHostEl(instance, vnode2.el); + if (true) { + popWarningContext(); + } + if (isInPendingSuspense && --suspense.deps === 0) { + suspense.resolve(); + } + }); + }, + unmount(parentSuspense, doRemove) { + suspense.isUnmounted = true; + if (suspense.activeBranch) { + unmount(suspense.activeBranch, parentComponent, parentSuspense, doRemove); + } + if (suspense.pendingBranch) { + unmount(suspense.pendingBranch, parentComponent, parentSuspense, doRemove); + } + } + }; + return suspense; +} +function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) { + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + node.parentNode, + document.createElement("div"), + null, + isSVG, + slotScopeIds, + optimized, + rendererInternals, + true + /* hydrating */ + ); + const result = hydrateNode(node, suspense.pendingBranch = vnode.ssContent, parentComponent, suspense, slotScopeIds, optimized); + if (suspense.deps === 0) { + suspense.resolve(); + } + return result; +} +function normalizeSuspenseChildren(vnode) { + const { shapeFlag, children } = vnode; + const isSlotChildren = shapeFlag & 32; + vnode.ssContent = normalizeSuspenseSlot(isSlotChildren ? children.default : children); + vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); +} +function normalizeSuspenseSlot(s) { + let block; + if (isFunction(s)) { + const trackBlock = isBlockTreeEnabled && s._c; + if (trackBlock) { + s._d = false; + openBlock(); + } + s = s(); + if (trackBlock) { + s._d = true; + block = currentBlock; + closeBlock(); + } + } + if (isArray(s)) { + const singleChild = filterSingleRoot(s); + if (!singleChild) { + warn2(` slots expect a single root node.`); + } + s = singleChild; + } + s = normalizeVNode(s); + if (block && !s.dynamicChildren) { + s.dynamicChildren = block.filter((c) => c !== s); + } + return s; +} +function queueEffectWithSuspense(fn, suspense) { + if (suspense && suspense.pendingBranch) { + if (isArray(fn)) { + suspense.effects.push(...fn); + } else { + suspense.effects.push(fn); + } + } else { + queuePostFlushCb(fn); + } +} +function setActiveBranch(suspense, branch) { + suspense.activeBranch = branch; + const { vnode, parentComponent } = suspense; + const el = vnode.el = branch.el; + if (parentComponent && parentComponent.subTree === vnode) { + parentComponent.vnode.el = el; + updateHOCHostEl(parentComponent, el); + } +} +function provide(key, value) { + if (!currentInstance) { + if (true) { + warn2(`provide() can only be used inside setup().`); + } + } else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance) { + const provides = instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance.proxy) : defaultValue; + } else if (true) { + warn2(`injection "${String(key)}" not found.`); + } + } else if (true) { + warn2(`inject() can only be used inside setup() or functional components.`); + } +} +function watchEffect(effect2, options) { + return doWatch(effect2, null, options); +} +function watchPostEffect(effect2, options) { + return doWatch(effect2, null, true ? Object.assign(Object.assign({}, options), { flush: "post" }) : { flush: "post" }); +} +function watchSyncEffect(effect2, options) { + return doWatch(effect2, null, true ? Object.assign(Object.assign({}, options), { flush: "sync" }) : { flush: "sync" }); +} +var INITIAL_WATCHER_VALUE = {}; +function watch(source, cb, options) { + if (!isFunction(cb)) { + warn2(`\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`); + } + return doWatch(source, cb, options); +} +function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) { + if (!cb) { + if (immediate !== void 0) { + warn2(`watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`); + } + if (deep !== void 0) { + warn2(`watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`); + } + } + const warnInvalidSource = (s) => { + warn2(`Invalid watch source: `, s, `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`); + }; + const instance = getCurrentScope() === (currentInstance === null || currentInstance === void 0 ? void 0 : currentInstance.scope) ? currentInstance : null; + let getter; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => source; + deep = true; + } else if (isArray(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return traverse(s); + } else if (isFunction(s)) { + return callWithErrorHandling( + s, + instance, + 2 + /* ErrorCodes.WATCH_GETTER */ + ); + } else { + warnInvalidSource(s); + } + }); + } else if (isFunction(source)) { + if (cb) { + getter = () => callWithErrorHandling( + source, + instance, + 2 + /* ErrorCodes.WATCH_GETTER */ + ); + } else { + getter = () => { + if (instance && instance.isUnmounted) { + return; + } + if (cleanup) { + cleanup(); + } + return callWithAsyncErrorHandling(source, instance, 3, [onCleanup]); + }; + } + } else { + getter = NOOP; + warnInvalidSource(source); + } + if (cb && deep) { + const baseGetter = getter; + getter = () => traverse(baseGetter()); + } + let cleanup; + let onCleanup = (fn) => { + cleanup = effect2.onStop = () => { + callWithErrorHandling( + fn, + instance, + 4 + /* ErrorCodes.WATCH_CLEANUP */ + ); + }; + }; + let ssrCleanup; + if (isInSSRComponentSetup) { + onCleanup = NOOP; + if (!cb) { + getter(); + } else if (immediate) { + callWithAsyncErrorHandling(cb, instance, 3, [ + getter(), + isMultiSource ? [] : void 0, + onCleanup + ]); + } + if (flush === "sync") { + const ctx = useSSRContext(); + ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); + } else { + return NOOP; + } + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = () => { + if (!effect2.active) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) { + if (cleanup) { + cleanup(); + } + callWithAsyncErrorHandling(cb, instance, 3, [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + onCleanup + ]); + oldValue = newValue; + } + } else { + effect2.run(); + } + }; + job.allowRecurse = !!cb; + let scheduler; + if (flush === "sync") { + scheduler = job; + } else if (flush === "post") { + scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); + } else { + job.pre = true; + if (instance) + job.id = instance.uid; + scheduler = () => queueJob(job); + } + const effect2 = new ReactiveEffect(getter, scheduler); + if (true) { + effect2.onTrack = onTrack; + effect2.onTrigger = onTrigger; + } + if (cb) { + if (immediate) { + job(); + } else { + oldValue = effect2.run(); + } + } else if (flush === "post") { + queuePostRenderEffect(effect2.run.bind(effect2), instance && instance.suspense); + } else { + effect2.run(); + } + const unwatch = () => { + effect2.stop(); + if (instance && instance.scope) { + remove(instance.scope.effects, effect2); + } + }; + if (ssrCleanup) + ssrCleanup.push(unwatch); + return unwatch; +} +function instanceWatch(source, value, options) { + const publicThis = this.proxy; + const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); + let cb; + if (isFunction(value)) { + cb = value; + } else { + cb = value.handler; + options = value; + } + const cur = currentInstance; + setCurrentInstance(this); + const res = doWatch(getter, cb.bind(publicThis), options); + if (cur) { + setCurrentInstance(cur); + } else { + unsetCurrentInstance(); + } + return res; +} +function createPathGetter(ctx, path) { + const segments = path.split("."); + return () => { + let cur = ctx; + for (let i = 0; i < segments.length && cur; i++) { + cur = cur[segments[i]]; + } + return cur; + }; +} +function traverse(value, seen) { + if (!isObject(value) || value[ + "__v_skip" + /* ReactiveFlags.SKIP */ + ]) { + return value; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + if (isRef(value)) { + traverse(value.value, seen); + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, seen); + }); + } else if (isPlainObject(value)) { + for (const key in value) { + traverse(value[key], seen); + } + } + return value; +} +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +var TransitionHookValidator = [Function, Array]; +var BaseTransitionImpl = { + name: `BaseTransition`, + props: { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + let prevTransitionKey; + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + let child = children[0]; + if (children.length > 1) { + let hasFound = false; + for (const c of children) { + if (c.type !== Comment) { + if (hasFound) { + warn2(" can only be used on a single element or component. Use for lists."); + break; + } + child = c; + hasFound = true; + if (false) + break; + } + } + } + const rawProps = toRaw(props); + const { mode } = rawProps; + if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { + warn2(`invalid mode: ${mode}`); + } + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getKeepAliveChild(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + const enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance); + setTransitionHooks(innerChild, enterHooks); + const oldChild = instance.subTree; + const oldInnerChild = oldChild && getKeepAliveChild(oldChild); + let transitionKeyChanged = false; + const { getTransitionKey } = innerChild.type; + if (getTransitionKey) { + const key = getTransitionKey(); + if (prevTransitionKey === void 0) { + prevTransitionKey = key; + } else if (key !== prevTransitionKey) { + prevTransitionKey = key; + transitionKeyChanged = true; + } + } + if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) { + const leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in") { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (instance.update.active !== false) { + instance.update(); + } + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el._leaveCb = () => { + earlyRemove(); + el._leaveCb = void 0; + delete enterHooks.delayedLeave; + }; + enterHooks.delayedLeave = delayedLeave; + }; + } + } + return child; + }; + } +}; +var BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance) { + const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook3 = (hook, args) => { + hook && callWithAsyncErrorHandling(hook, instance, 9, args); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook3(hook, args); + if (isArray(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) + done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el._leaveCb) { + el._leaveCb( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el._leaveCb) { + leavingVNode.el._leaveCb(); + } + callHook3(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el._enterCb = (cancelled) => { + if (called) + return; + called = true; + if (cancelled) { + callHook3(cancelHook, [el]); + } else { + callHook3(afterHook, [el]); + } + if (hooks.delayedLeave) { + hooks.delayedLeave(); + } + el._enterCb = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el._enterCb) { + el._enterCb( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook3(onBeforeLeave, [el]); + let called = false; + const done = el._leaveCb = (cancelled) => { + if (called) + return; + called = true; + remove2(); + if (cancelled) { + callHook3(onLeaveCancelled, [el]); + } else { + callHook3(onAfterLeave, [el]); + } + el._leaveCb = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + return resolveTransitionHooks(vnode2, props, state, instance); + } + }; + return hooks; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getKeepAliveChild(vnode) { + return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode; +} +function setTransitionHooks(vnode, hooks) { + if (vnode.shapeFlag & 6 && vnode.component) { + setTransitionHooks(vnode.component.subTree, hooks); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); + } else { + vnode.transition = hooks; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) + keyedFragmentCount++; + ret = ret.concat(getTransitionRawChildren(child.children, keepComment, key)); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +function defineComponent(options) { + return isFunction(options) ? { setup: options, name: options.name } : options; +} +var isAsyncWrapper = (i) => !!i.type.__asyncLoader; +function defineAsyncComponent(source) { + if (isFunction(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay = 200, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = () => { + retries++; + pendingRequest = null; + return load(); + }; + const load = () => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject) => { + const userRetry = () => resolve2(retry()); + const userFail = () => reject(err); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (!comp) { + warn2(`Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`); + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; + } + if (comp && !isObject(comp) && !isFunction(comp)) { + throw new Error(`Invalid async component load result: ${comp}`); + } + resolvedComp = comp; + return comp; + })); + }; + return defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load, + get __asyncResolved() { + return resolvedComp; + }, + setup() { + const instance = currentInstance; + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = (err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + /* do not throw in dev if user provided error component */ + ); + }; + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded = ref(false); + const error = ref(); + const delayed = ref(!!delay); + if (delay) { + setTimeout(() => { + delayed.value = false; + }, delay); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded.value && !error.value) { + const err = new Error(`Async component timed out after ${timeout}ms.`); + onError(err); + error.value = err; + } + }, timeout); + } + load().then(() => { + loaded.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + queueJob(instance.parent.update); + } + }).catch((err) => { + onError(err); + error.value = err; + }); + return () => { + if (loaded.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error.value && errorComponent) { + return createVNode(errorComponent, { + error: error.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; + } + }); +} +function createInnerComp(comp, parent) { + const { ref: ref2, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref2; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +var isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +var KeepAliveImpl = { + name: `KeepAlive`, + // Marker for special handling inside the renderer. We are not using a === + // check directly on KeepAlive in the renderer, because importing it directly + // would prevent it from being tree-shaken. + __isKeepAlive: true, + props: { + include: [String, RegExp, Array], + exclude: [String, RegExp, Array], + max: [String, Number] + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const sharedContext = instance.ctx; + if (!sharedContext.renderer) { + return () => { + const children = slots.default && slots.default(); + return children && children.length === 1 ? children[0] : children; + }; + } + const cache = /* @__PURE__ */ new Map(); + const keys = /* @__PURE__ */ new Set(); + let current = null; + if (true) { + instance.__v_cache = cache; + } + const parentSuspense = instance.suspense; + const { renderer: { p: patch, m: move, um: _unmount, o: { createElement } } } = sharedContext; + const storageContainer = createElement("div"); + sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => { + const instance2 = vnode.component; + move(vnode, container, anchor, 0, parentSuspense); + patch(instance2.vnode, vnode, container, anchor, instance2, parentSuspense, isSVG, vnode.slotScopeIds, optimized); + queuePostRenderEffect(() => { + instance2.isDeactivated = false; + if (instance2.a) { + invokeArrayFns(instance2.a); + } + const vnodeHook = vnode.props && vnode.props.onVnodeMounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + sharedContext.deactivate = (vnode) => { + const instance2 = vnode.component; + move(vnode, storageContainer, null, 1, parentSuspense); + queuePostRenderEffect(() => { + if (instance2.da) { + invokeArrayFns(instance2.da); + } + const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + instance2.isDeactivated = true; + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + function unmount(vnode) { + resetShapeFlag(vnode); + _unmount(vnode, instance, parentSuspense, true); + } + function pruneCache(filter) { + cache.forEach((vnode, key) => { + const name = getComponentName(vnode.type); + if (name && (!filter || !filter(name))) { + pruneCacheEntry(key); + } + }); + } + function pruneCacheEntry(key) { + const cached = cache.get(key); + if (!current || !isSameVNodeType(cached, current)) { + unmount(cached); + } else if (current) { + resetShapeFlag(current); + } + cache.delete(key); + keys.delete(key); + } + watch( + () => [props.include, props.exclude], + ([include, exclude]) => { + include && pruneCache((name) => matches(include, name)); + exclude && pruneCache((name) => !matches(exclude, name)); + }, + // prune post-render after `current` has been updated + { flush: "post", deep: true } + ); + let pendingCacheKey = null; + const cacheSubtree = () => { + if (pendingCacheKey != null) { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + } + }; + onMounted(cacheSubtree); + onUpdated(cacheSubtree); + onBeforeUnmount(() => { + cache.forEach((cached) => { + const { subTree, suspense } = instance; + const vnode = getInnerChild(subTree); + if (cached.type === vnode.type && cached.key === vnode.key) { + resetShapeFlag(vnode); + const da = vnode.component.da; + da && queuePostRenderEffect(da, suspense); + return; + } + unmount(cached); + }); + }); + return () => { + pendingCacheKey = null; + if (!slots.default) { + return null; + } + const children = slots.default(); + const rawVNode = children[0]; + if (children.length > 1) { + if (true) { + warn2(`KeepAlive should contain exactly one component child.`); + } + current = null; + return children; + } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { + current = null; + return rawVNode; + } + let vnode = getInnerChild(rawVNode); + const comp = vnode.type; + const name = getComponentName(isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp); + const { include, exclude, max } = props; + if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { + current = vnode; + return rawVNode; + } + const key = vnode.key == null ? comp : vnode.key; + const cachedVNode = cache.get(key); + if (vnode.el) { + vnode = cloneVNode(vnode); + if (rawVNode.shapeFlag & 128) { + rawVNode.ssContent = vnode; + } + } + pendingCacheKey = key; + if (cachedVNode) { + vnode.el = cachedVNode.el; + vnode.component = cachedVNode.component; + if (vnode.transition) { + setTransitionHooks(vnode, vnode.transition); + } + vnode.shapeFlag |= 512; + keys.delete(key); + keys.add(key); + } else { + keys.add(key); + if (max && keys.size > parseInt(max, 10)) { + pruneCacheEntry(keys.values().next().value); + } + } + vnode.shapeFlag |= 256; + current = vnode; + return isSuspense(rawVNode.type) ? rawVNode : vnode; + }; + } +}; +var KeepAlive = KeepAliveImpl; +function matches(pattern, name) { + if (isArray(pattern)) { + return pattern.some((p2) => matches(p2, name)); + } else if (isString(pattern)) { + return pattern.split(",").includes(name); + } else if (isRegExp(pattern)) { + return pattern.test(name); + } + return false; +} +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function resetShapeFlag(vnode) { + vnode.shapeFlag &= ~256; + vnode.shapeFlag &= ~512; +} +function getInnerChild(vnode) { + return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + if (target.isUnmounted) { + return; + } + pauseTracking(); + setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + unsetCurrentInstance(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } else if (true) { + const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, "")); + warn2(`${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`); + } +} +var createHook = (lifecycle) => (hook, target = currentInstance) => ( + // post-create lifecycle registrations are noops during SSR (except for serverPrefetch) + (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target) +); +var onBeforeMount = createHook( + "bm" + /* LifecycleHooks.BEFORE_MOUNT */ +); +var onMounted = createHook( + "m" + /* LifecycleHooks.MOUNTED */ +); +var onBeforeUpdate = createHook( + "bu" + /* LifecycleHooks.BEFORE_UPDATE */ +); +var onUpdated = createHook( + "u" + /* LifecycleHooks.UPDATED */ +); +var onBeforeUnmount = createHook( + "bum" + /* LifecycleHooks.BEFORE_UNMOUNT */ +); +var onUnmounted = createHook( + "um" + /* LifecycleHooks.UNMOUNTED */ +); +var onServerPrefetch = createHook( + "sp" + /* LifecycleHooks.SERVER_PREFETCH */ +); +var onRenderTriggered = createHook( + "rtg" + /* LifecycleHooks.RENDER_TRIGGERED */ +); +var onRenderTracked = createHook( + "rtc" + /* LifecycleHooks.RENDER_TRACKED */ +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +function validateDirectiveName(name) { + if (isBuiltInDirective(name)) { + warn2("Do not use built-in directive ids as custom directive id: " + name); + } +} +function withDirectives(vnode, directives) { + const internalInstance = currentRenderingInstance; + if (internalInstance === null) { + warn2(`withDirectives can only be used inside render functions.`); + return vnode; + } + const instance = getExposeProxy(internalInstance) || internalInstance.proxy; + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; + if (dir) { + if (isFunction(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +var COMPONENTS = "components"; +var DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +var NULL_DYNAMIC_COMPONENT = Symbol(); +function resolveDynamicComponent(component) { + if (isString(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + /* do not include inferred name to avoid breaking existing code */ + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + if (warnMissing && !res) { + const extra = type === COMPONENTS ? ` +If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; + warn2(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); + } + return res; + } else if (true) { + warn2(`resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`); + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache && cache[index]; + if (isArray(source) || isString(source)) { + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); + } + } else if (typeof source === "number") { + if (!Number.isInteger(source)) { + warn2(`The v-for range expect an integer value but got ${source}.`); + } + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); + } + } else if (isObject(source)) { + if (source[Symbol.iterator]) { + ret = Array.from(source, (item, i) => renderItem(item, i, void 0, cached && cached[i])); + } else { + const keys = Object.keys(source); + ret = new Array(keys.length); + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i]; + ret[i] = renderItem(source[key], key, i, cached && cached[i]); + } + } + } else { + ret = []; + } + if (cache) { + cache[index] = ret; + } + return ret; +} +function createSlots(slots, dynamicSlots) { + for (let i = 0; i < dynamicSlots.length; i++) { + const slot = dynamicSlots[i]; + if (isArray(slot)) { + for (let j = 0; j < slot.length; j++) { + slots[slot[j].name] = slot[j].fn; + } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) + res.key = slot.key; + return res; + } : slot.fn; + } + } + return slots; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { + if (name !== "default") + props.name = name; + return createVNode("slot", props, fallback && fallback()); + } + let slot = slots[name]; + if (slot && slot.length > 1) { + warn2(`SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`); + slot = () => []; + } + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const rendered = createBlock( + Fragment, + { + key: props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key || `_${name}` + }, + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + /* PatchFlags.BAIL */ + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) + return true; + if (child.type === Comment) + return false; + if (child.type === Fragment && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + if (!isObject(obj)) { + warn2(`v-on with no argument expects an object value.`); + return ret; + } + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +var getPublicInstance = (i) => { + if (!i) + return null; + if (isStatefulComponent(i)) + return getExposeProxy(i) || i.proxy; + return getPublicInstance(i.parent); +}; +var publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + extend(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => true ? shallowReadonly(i.props) : i.props, + $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs, + $slots: (i) => true ? shallowReadonly(i.slots) : i.slots, + $refs: (i) => true ? shallowReadonly(i.refs) : i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $emit: (i) => i.emit, + $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type, + $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP + }) +); +var isReservedPrefix = (key) => key === "_" || key === "$"; +var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +var PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + if (key === "__isVue") { + return true; + } + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance, "get", key); + markAttrsAccessed(); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading + // to infinite warning loop + key.indexOf("__v") !== 0)) { + if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { + warn2(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`); + } else if (instance === currentRenderingInstance) { + warn2(`Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`); + } + } + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { + warn2(`Cannot mutate + + +``` + +讓我們看看如何編寫這些元件。 + +## SmartForm + +SmartForm 元件將為元件的後代提供 vorms 的狀態和方法。 + +```vue + + + +``` + +## SmartTextField 和 SmartSelect + +這些輸入元件將注入 SmartForm 元件提供的狀態和方法,並在背景處理表單輸入綁定。 + +**SmartTextField** + +```vue + + + +``` + +**SmartSelect** + +```vue + + + +``` + +現在,您可以在專案中創建和組合複雜的內容,而無縫接軌。 +這個理想的靈感來自 [React Hook Form](https://react-hook-form.com/advanced-usage#SmartFormComponent) diff --git a/docs/zh-tw/api/use-field-array.md b/docs/zh-tw/api/use-field-array.md new file mode 100644 index 0000000..9d2d6a7 --- /dev/null +++ b/docs/zh-tw/api/use-field-array.md @@ -0,0 +1,279 @@ +# useFieldArray + +`useFieldArray()` 是一個自訂的 Vue Composition API,它將傳回值(values)、狀態(state)、特定欄位的屬性(attributes)並提供通用操作幫助器,您還可以新增驗證來驗證其中的值。 + +## Usage + +```vue + + + +``` + +## 參數 + +### name (必填) + +欄位陣列的名稱。 + +- Type `MaybeRefOrGetter` + +### options + +- Type + +```ts +interface UseFieldArrayOptions { + // 此方法允許您編寫邏輯來驗證您的欄位, + // 這是可選的。 + validate?: FieldArrayValidator; +} + +type FieldArrayValidator> = (value: Value) => FormErrors | void | Promise | void>; +``` + +`validate` 是 **欄位級別(field level)** 驗證。此屬性接受該欄位的值(`values`)作為參數。 您可以傳回一個陣列(array)或一個 undefined 來決定其中的值是否有效。 + +## 回傳 + +### fields + +此陣列包含每個 key、value、meta 和 attrs 的欄位輸入。 + +- Type `Ref[]>` + + ```ts + interface FieldEntry { + key: number; + value: Value; + name: string; + error: FormErrors; + touched: Value extends Primitive ? boolean : FormTouched | undefined; + dirty: boolean; + attrs: Omit; + } + ``` + +`useFieldArray` 會自動產生一個名為 `key` 的唯一標識,用於 key prop。 + +關於為什麼需要這樣做,可以參考以下資訊:[Maintaining State with key](https://vuejs.org/guide/essentials/list.html#maintaining-state-with-key) + +必須加入 `field.key` 作為元件的 key,以防止欄位因重新渲染而被破壞。 + +```vue + +``` + +### append + +將 item 附加到欄位陣列(field array)。 +Append an item to the field array. + +- Type `(value: Value) => void;` + +```ts +const { fields, append } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Bubble Tea'] + +append('Stinky Tofu') +console.log(fields.value.map(field => field.value)) +// output: ['Bubble Tea', 'Stinky Tofu'] +``` + +### prepend + +將一個 item 加入到欄位陣列的前面。 + +- Type `(value: Value) => void;` + +```ts +const { fields, prepend } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Bubble Tea'] + +prepend('Fried Chicken') +console.log(fields.value.map(field => field.value)) +// output: ['Fried Chicken', 'Bubble Tea'] +``` + +### swap + +交換 item 的位置 + +- Type `(indexA: number, indexB: number) => void` + +```ts +const { fields, swap } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Aiyu Jelly', 'Shaved Ice', 'Bubble Tea'] + +swap(0, 2) +console.log(fields.value.map(field => field.value)) +// output: ['Bubble Tea', 'Shaved Ice', 'Aiyu Jelly'] +``` + +### remove + +按索引(index)刪除 item,或在未提供索引(index)時刪除所有項目。 + +- Type `(index?: number) => void` + +```ts +const { fields, remove } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Century Egg', 'Stinky Tofu', 'Oyster Vermicelli Noodles'] + +remove(2) +console.log(fields.value.map(field => field.value)) +// output: ['Century Egg', 'Stinky Tofu'] + +remove() +console.log(fields.value.map(field => field.value)) +// output: [] +``` + +### move + +將 item 移動到另一個位置 + +- Type `(from: number, to: number) => void` + +```ts +const { fields, move } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Avocado', 'Shaved Ice', 'Bubble Tea'] + +move(0, 2) +console.log(fields.value.map(field => field.value)) +// output: ['Shaved Ice', 'Bubble Tea', 'Avocado'] +``` + +### insert + +在指定位置插入 item。 + +- Type `(index: number, value: Value) => void` + +```ts +const { fields, insert } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Chicken Chop', 'Bubble Tea'] + +insert(1, 'Bubble Tea') +console.log(fields.value.map(field => field.value)) +// output: ['Chicken Chop', 'Bubble Tea', 'Bubble Tea'] +``` + +### update + +更新指定位置的 item。 + +- Type `(index: number, value: Value) => void` + +```ts +const { fields, update } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Fried Chicken', 'Bubble Tea'] + +insert(0, 'Soup Dumplings') +console.log(fields.value.map(field => field.value)) +// output: ['Soup Dumplings', 'Bubble Tea'] +``` + +### replace + +替換整個欄位陣列的值。 + +- Type `(values: Value[]) => void` + +```ts +const { fields, update } = useFieldArray('food') + +console.log(fields.value.map(field => field.value)) +// output: ['Fried Chicken', 'Bubble Tea'] + +insert(['Soup Dumplings', 'Three-Cup Chicken']) +console.log(fields.value.map(field => field.value)) +// output: ['Soup Dumplings', 'Three-Cup Chicken'] +``` + +## 類型聲明 + +
+ Show Type Declarations + + ```ts + function useFieldArray (name: MaybeRef, options?: UseFieldArrayOptions): UseFieldArrayReturn + + interface UseFieldArrayOptions { + validate?: FieldArrayValidator; + } + + type FieldArrayValidator> = (value: Value) => FormErrors | void | Promise | void>; + + type UseFieldArrayReturn = { + fields: Ref[]>; + append: (value: Value) => void; + prepend: (value: Value) => void; + swap: (indexA: number, indexB: number) => void; + remove: (index?: number) => void; + move: (from: number, to: number) => void; + insert: (index: number, value: Value) => void; + update: (index: number, value: Value) => void; + replace: (values: Value[]) => void; + }; + + interface FieldEntry { + key: number; + value: Value; + name: string; + error: FormErrors; + touched: Value extends Primitive ? boolean : FormTouched | undefined; + dirty: boolean; + attrs: Omit; + } + ``` + +
diff --git a/docs/zh-tw/api/use-field.md b/docs/zh-tw/api/use-field.md new file mode 100644 index 0000000..7a9aa37 --- /dev/null +++ b/docs/zh-tw/api/use-field.md @@ -0,0 +1,125 @@ +# useField + +`useField(name: MaybeRef, options?: UseFieldOptions)` 是一個自訂的 Vue Composition API,它將傳回特定欄位的值(value)、狀態(state)和屬性(attributes),當然 您也可以為其新增驗證。 + +## Usage + +```vue + + + +``` + +## 參數 + +### name (必填) + +特定欄位的名稱。 它的型別可以是 `string`、`Ref` 或 `() => string` + +- Type `MaybeRefOrGetter` + +如果您想在應用程式中建立自訂元件,例如 ``,則應該使用 `Ref` 來保留 `props.name` 的響應性。 如下: + +```vue + +``` + +當您有動態欄位名稱時,這非常有用。 例如 `name` 是使用 `v-for` 循環產生的。 + +```vue + +``` + +### options + +- Type + +```ts +interface UseFieldOptions { + // 此方法允許您編寫邏輯來驗證您的欄位, + // 這是可選的。 + validate?: FieldValidator; +}; + +type FieldValidator = (value: Value) => string | void | Promise; +``` + +`validate` 是 **欄位級別驗證(field level)**。此屬性接受欄位的值(`value`)作為參數。 +您可以傳回一個字串(string)或一個 undefined 的值來確定該值是否有效,您傳回的字串將是該欄位的錯誤訊息。 + +## 回傳 + +### value + +當前欄位的值。 + +- Type `Ref` + +### error + +當前欄位的錯誤訊息 + +- Type `ComputedRef` + +### touched + +字段第一次模糊(blurred)後回傳`true`。 + +- Type `ComputedRef` + +### dirty + +如果目前欄位的值不等於初始值,則傳回`true`。 + +- Type `ComputedRef` + +### attrs + +`attrs` 是需要綁定到欄位的屬性。 + +- Type `ComputedRef` + + ```ts + interface FieldAttrs { + // 您之前通過的欄位名稱。 + name: string; + onBlur(event: Event): void; + onChange(): void; + onInput(): void + }; + ``` + +- Example + + ```html + + ``` diff --git a/docs/zh-tw/api/use-form-context.md b/docs/zh-tw/api/use-form-context.md new file mode 100644 index 0000000..3b1f1e9 --- /dev/null +++ b/docs/zh-tw/api/use-form-context.md @@ -0,0 +1,64 @@ +# useFormContext + +`useFormContext()` 是一個自訂的 Vue Composition API,可讓您存取表單上下文。這對於深層結構中的嵌套元件很有用。 + +## Usage + +```vue + + + +``` + +```vue + + + +``` diff --git a/docs/zh-tw/api/use-form.md b/docs/zh-tw/api/use-form.md new file mode 100644 index 0000000..5a2de34 --- /dev/null +++ b/docs/zh-tw/api/use-form.md @@ -0,0 +1,460 @@ +# useForm + +`useForm()` 是一個自訂的 Vue Composition API,讓您輕鬆管理表單的值和狀態。 + +## 用法 + +以下程式碼展示了一個基本的使用範例: + +```vue + + + +``` + +## 參數 + +### initialValues (必填) + +這是表單的初始值,將用 dirty comparison(骯髒比較)為基礎。 + +- Type + + ```ts + type Values = Record + ``` + +### initialErrors + +這是表單的初始錯誤訊息。 + +- Type `FormErrors` +- Default: `undefined` + +### initialTouched + +這是表單的初始觸摸(touched)狀態。 + +- Type `FormTouched` +- Default: `undefined` + +### validateMode + +這個選項允許您在首次提交**之前**,配置驗證模式。 + +- Type `'blur' | 'input' | 'change' | 'submit'` +- Default `'submit'` + +### reValidateMode + +這個選項允許您在首次提交**之後**配置驗證模式。 + +默認情況下,驗證是在輸入事件變更(input change event)時觸發的。 + +:::info +即使您的 `reValidationMode` 沒有設置為 `submit`,Vorms 仍然會在提交之前重新驗證。 +::: + +- Type `'blur' | 'input' | 'change' | 'submit'` +- Default `'change'` + +### validateOnMounted + +這個選項允許您配置當元件被掛載(mounted)時,是否應該進行驗證。 + +- Type `boolean` +- Default `false` + +### validate + +`validate` 是一個**表單級別**的驗證方法。此屬性接受表單的 `values` 作為參數。 + +您可以返回 `error` 物件(errors object)或 undefined 來確定這些值是否有效。 + +- Type + + ```ts + function validate(values: Values): void | object | Promise> + ``` + +validate 可以是以下其中一種: + +1. 同步方法,返回 `errors` 物件。 + + ```ts + import { useForm } from '@vorms/core' + + const { values } = useForm({ + initialValues: { + name: '', + age: 10 + }, + validate(values) { + const errors = {} + + if(!values.name) { + errors.name = 'name is required.' + } + + if(typeof values.age !== 'number') { + errors.age = 'age should be a number.' + } + + return errors + }, + onSubmit(values) { + console.log(values) + } + }) + ``` + +2. 非同步方法,返回一個 Promise,該 Promise 解析為包含 `errors` 的物件。 + + ```ts + import { useForm } from '@vorms/core' + + const { values } = useForm({ + initialValues: { + name: '', + age: 10 + }, + validate() { + return new Promise((resolve) => { + setTimeout(() => { + const errors = {} + + if(!values.name) { + errors.name = 'name is required.' + } + + if(typeof values.age !== 'number') { + errors.age = 'age should be a number.' + } + + resolve(errors) + }, 300) + }) + }, + onSubmit(values) { + console.log(values) + } + }) + ``` + +3. 您可以使用 `@vorms/resolvers` 來整合其他外部驗證庫,如 [Yup](https://github.com/jquense/yup) 或 [Zod](https://github.com/vriad/zod)。 + + ```bash + npm install @vorms/resolvers + ``` + + ```ts + import { useForm } from '@vorms/core' + import { yupResolver } from '@vorms/resolvers/yup'; + import * as yup from 'yup'; + + const schema = yup.object().shape({ + name: yup.string().required('Name is required!!'), + age: yup.number().required('Age is required!!') + }) + + const { values } = useForm({ + initialValues: { + name: '', + age: 10 + }, + validate: yupResolver(schema), + onSubmit(values) { + console.log(values) + } + }) + ``` + +### onSubmit (必填) + +這是您的表單提交處理程序,它將傳遞您表單的值(`values`)。但如果驗證失敗,則不會調用此處理程序。 + +- Type + + ```ts + function onSubmit (values: Values, helper: FormSubmitHelper): void | Promise + ``` + + ```ts + interface FormSubmitHelper { + setSubmitting: (isSubmitting: boolean) => void; + initialValues: Values; + } + ``` + +#### 參數 + +- `values`: 需驗證的值(`values`)。 +- `helper`: 一些在提交表單時可能有幫助的狀態或方法。 + + | Name | Description | + |---------------|-------------------------------| + |`setSubmitting`| 強制設定 isSubmitting | + |`initialValues`| 表單的初始值 | + +::: warning Important +當 `onSubmit()` 方法是非同步的時候,`isSubmitting` 變數會在完成之後自動設置為 `false`。 + +相反地,如果 `onSubmit()` 是同步的,你必須手動呼叫 `setSubmitting(false)` 來重置 `isSubmitting`。 +::: + +### onInvalid + +這是您的無效處理程序,當使用無效值提交表單時會被呼叫。 + +## 回傳 + +### values + +目前表單的值。 + +- Type `Values` + +:::warning Note + +如果您直接使用 v-model 來綁定表單的值(`values`),驗證將只在提交之前被調用。 + +::: + +### errors + +這是一個包含所有當前驗證錯誤的物件。其形狀會與表單值的形狀匹配。 + +- Type `ComputedRef>` + +### touched + +這是一個包含所有曾經被觸摸(touched)過的欄位對象。其形狀將與表單的值的形狀相匹配 + +- Type `ComputedRef>` + +### dirty + +如果現在的值沒有 `initialValues` 與深度相等(deeply equal),回傳 `true` 。 + +- Type `ComputedRef` + +### setValues + +這個方法允許你手動更新表單的值。 + +- Type `(values: Values, shouldValidate?: boolean)` + +### setFieldValue + +這個方法允許你手動設置欄位的值 + +- Type `(name: string, value: unknown, shouldValidate?: boolean)` + +### setErrors + +這個方法允許您手動設置表單的錯誤訊息。 + +- Type `(errors: FormErrors)` + +### setFieldError + +這個方法允許您手動設置欄位的錯誤訊息。 + +- Type `(name: string, error: string | string[] | Record | undefined)` + +### submitCount + +用戶嘗試提交表單的次數。 + +- Type `ComputedRef` + +### isSubmitting + +當表單正在提交時(submitting),這個方法將回傳 `true`。 +如果 `onSubmit()` 是一個同步方法,那麼您需要手動呼叫 `setSubmitting(false)` 來將狀態設置為 `false`。 + +- Type `Ref` + +### isValidating + +當正在進行驗證時,這個方法將回傳 `true`。 + +- Type `ComputedRef` + +### resetForm + +重置整個表單的狀態。您可以選擇性地傳遞參數來設置表單的狀態為您想要的值。 + +- Type + + ```ts + function resetForm(nextState?: Partial>): void + + interface FormResetState { + // 表單的值。 + values: Values; + // 一個包含已觸摸(touched)過的欄位名稱的物件 + touched: FormTouched; + // 一個包含有錯誤的欄位名稱的物件。 + errors: FormErrors; + // 用戶嘗試提交的次數 + submitCount: number; + } + ``` + +### register + +此方法可讓您取得特定欄位值(value)、狀態(state)和屬性(attribute),您也可以為該欄位新增驗證。 + +- Type + + ```ts + function register(name: MaybeRefOrGetter, options?: FieldRegisterOptions): UseFormRegisterReturn + ``` + +
+ + Show Type Detail + + + ```ts + interface FieldRegisterOptions { + validate?: FieldValidator; + } + + type FieldValidator = (value: Value) => string | void | Promise + + type UseFormRegisterReturn = { + value: WritableComputedRef; + dirty: ComputedRef; + error: ComputedRef; + touched: ComputedRef; + attrs: ComputedRef; + } + + interface FieldAttrs { + name: string; + onBlur(event: Event): void; + onChange(): void; + onInput(): void + } + + ``` + +
+ +- Example + + ```vue + + + + ``` + +### handleSubmit + +提交處理程序。如果事件(`event`)被傳遞,它將在內部呼叫 `event.preventDefault()`。 + +- Type + + ```ts + function handleSubmit(event?: Event): void + ``` + +### handleReset + +重置處理程序。如果事件(`event`)被傳遞,它將在內部呼叫 `event.preventDefault()`。 + +- Type + + ```ts + function handleReset(event?: Event): void + ``` + +### validateForm + +表單的驗證器。 它將運行 **表單級別(form level)** 驗證。 + +- Type + + ```ts + function validateForm(values?: Values): Promise> + ``` + +### validateField + +特定欄位的驗證器,如果該欄位的驗證已註冊。 + +- Type + + ```ts + function validateField(name: string): Promise + ``` diff --git a/docs/zh-tw/examples/index.md b/docs/zh-tw/examples/index.md new file mode 100644 index 0000000..8803810 --- /dev/null +++ b/docs/zh-tw/examples/index.md @@ -0,0 +1,45 @@ +# 範例 + +Vorms 是一個最簡單、最靈活的表單驗證庫。 本頁將示範 Vorms 的一些用法。 + +## 登入 + +以下程式碼摘錄示範了一個基本用法範例。 + + + +## 陣列欄位 + +以下程式碼摘錄示範如何在 Vorms 中處理陣列欄位。 + + + +## 跨欄位驗證 + +以下程式碼摘錄示範如何在 Vorms 中實現跨欄位驗證。 + + + +## Wizard 表單 + +下面的程式碼摘錄示範如何在Vorms中實作多步驟表單(Wizard Form)。 + + + +## 客製化元件 + +以下程式碼摘錄示範如何在 Vorms 中建立自訂欄位元件。 + + + +## 使用 Yup 驗證 + +以下程式碼摘錄示範如何在 Vorms 中驗證表單,並無縫整合第三部分驗證庫:Yup。 + + + +## 使用 Zod 驗證 + +以下程式碼摘錄示範如何在 Vorms 中驗證表單,並無縫整合第三部分驗證庫:Zod. + + diff --git a/docs/zh-tw/guide/index.md b/docs/zh-tw/guide/index.md new file mode 100644 index 0000000..6ac6532 --- /dev/null +++ b/docs/zh-tw/guide/index.md @@ -0,0 +1,58 @@ +# 開始 + +Vorms 是一個強型別、輕量、簡單且靈活,基於 [Composition API](https://vuejs.org/guide/extras/composition-api-faq.html) 的表單驗證和狀態管理工具。 + +## 安裝 + +```bash +npm install @vorms/core +``` + +## CDN + +```html + +``` +這將會被公開為全域變數 `window.Vorms`。 + +## 使用範例 + +```vue + + + +``` + +請參考 [範例](/zh-tw/examples/) 部分以獲得更多使用範例。 \ No newline at end of file diff --git a/docs/zh-tw/index.md b/docs/zh-tw/index.md new file mode 100644 index 0000000..02ff203 --- /dev/null +++ b/docs/zh-tw/index.md @@ -0,0 +1,31 @@ +--- +layout: home + +title: Vorms +titleTemplate: Vue form validation with Composition API + +hero: + name: Vorms + text: 基於 Composition API 的表單驗證工具 + tagline: 強型別、輕量、簡單且靈活 + image: + src: /logo.svg + alt: Vorms + actions: + - theme: brand + text: 開始 + link: /zh-tw/guide/ + - theme: alt + text: 在GitHub上查看 + link: https://github.com/Mini-ghost/vorms + +features: + - title: 強型別 + details: 使用 TypeScript 編寫,並採用 TSDoc 標註,即使您在項目中更喜歡使用 JavaScript,Vorms 仍有為開發人員提供豐富的智能提示(Intellisense)。 + - title: 輕量 + details: 極小的打包大小,僅有 12KB(4KB壓縮 + gzip壓縮),並且完全支持搖樹(tree-shaking)功能。 + - title: 簡單 + details: Vorms 使用 Composition API 能夠為您提供非常流暢的開發體驗,尤其在處理複雜的表單時。 + - title: 靈活 + details: Vorms 支援 Yup、Zod 和自定義驗證。您可以選擇您喜歡的驗證庫,或者自行建立您的驗證機制。 +--- From 015883a93a18e27a00493a93238c9202ce999c39 Mon Sep 17 00:00:00 2001 From: Alex Liu Date: Tue, 19 Dec 2023 21:41:14 +0800 Subject: [PATCH 3/4] fix(core): resolve 'Excessive stack depth comparing types' error (#52) --- packages/core/src/composables/useForm.ts | 2 +- packages/core/src/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/composables/useForm.ts b/packages/core/src/composables/useForm.ts index 529b746..9757a13 100644 --- a/packages/core/src/composables/useForm.ts +++ b/packages/core/src/composables/useForm.ts @@ -103,7 +103,7 @@ type FormMessage = type: ACTION_TYPE.SET_FIELD_ERROR; payload: { path: string; - error: FormErrors>> | string | string[]; + error: FieldError>> | string | string[]; }; } | { type: ACTION_TYPE.SET_ISSUBMITTING; payload: boolean } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index ed62175..badb30e 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -111,7 +111,7 @@ export type UseFormSetFieldError = < Name extends Path, >( name: Name, - error: FormErrors> | string | string[], + error: FieldError> | string | string[], ) => void; export interface FormResetState { From 83cb5fef6e12edfb2dbb8febe86f1a026c7f4731 Mon Sep 17 00:00:00 2001 From: reslear Date: Wed, 3 Jan 2024 20:01:46 +0100 Subject: [PATCH 4/4] feat(core): add `setFieldTouched` method (#50) * refactor: expose `setFieldTouched` * fix: types * fix: correct name * types: collating type definitions --------- Co-authored-by: Alex Liu --- packages/core/src/composables/useForm.ts | 24 ++++++++++++------- .../src/composables/useInternalContext.ts | 2 ++ packages/core/src/types.ts | 16 ++++++++----- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/core/src/composables/useForm.ts b/packages/core/src/composables/useForm.ts index 9757a13..639ed00 100644 --- a/packages/core/src/composables/useForm.ts +++ b/packages/core/src/composables/useForm.ts @@ -34,6 +34,7 @@ import type { UseFormRegister, UseFormReturn, UseFormSetFieldError, + UseFormSetFieldTouched, ValidateField, } from '../types'; @@ -252,7 +253,10 @@ export function useForm< }; }; - const setFieldTouched = (name: string, touched = true) => { + const setFieldTouched: UseFormSetFieldTouched = ( + name, + touched = true, + ) => { dispatch({ type: ACTION_TYPE.SET_TOUCHED, payload: { @@ -365,19 +369,21 @@ export function useForm< }); }; - const handleBlur: FormEventHandler['handleBlur'] = ( - eventOrName: Event | string, - path?: string, - ): void | (() => void) => { - if (isString(eventOrName)) { + const handleBlur: FormEventHandler>['handleBlur'] = ( + eventOrName, + path, + ) => { + const isPath = (value: any): value is Path => isString(value); + + if (isPath(eventOrName)) { return () => setFieldTouched(eventOrName, true); } const { name, id } = eventOrName.target as HTMLInputElement; - const field = path ?? (name || id); + const field = path ?? ((name || id) as Path); if (field) { - setFieldTouched(field, true); + return setFieldTouched(field, true); } }; @@ -631,6 +637,7 @@ export function useForm< setFieldValue, setErrors, setFieldError, + setFieldTouched, handleSubmit, handleReset, resetForm, @@ -647,6 +654,7 @@ export function useForm< getFieldAttrs, registerFieldArray, setFieldArrayValue, + setFieldTouched, register, }); diff --git a/packages/core/src/composables/useInternalContext.ts b/packages/core/src/composables/useInternalContext.ts index 85512f1..54338be 100644 --- a/packages/core/src/composables/useInternalContext.ts +++ b/packages/core/src/composables/useInternalContext.ts @@ -17,6 +17,7 @@ import { PathValue, SetFieldArrayValue, UseFormRegister, + UseFormSetFieldTouched, UseFormSetFieldValue, } from '../types'; @@ -52,6 +53,7 @@ export interface InternalContextValues { getFieldAttrs: (name: MaybeRefOrGetter) => ComputedRef; setFieldArrayValue: SetFieldArrayValue; + setFieldTouched: UseFormSetFieldTouched; register: UseFormRegister; } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index badb30e..7b4989c 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -47,12 +47,8 @@ export interface FormState { isValidating: Ref; } -export interface FormEventHandler { - handleBlur: { - (event: Event, name?: string): void; - (name: T): T extends string ? () => void : void; - }; - +export interface FormEventHandler { + handleBlur: (event: Event | S, name?: S) => void; handleChange: () => void; handleInput: () => void; } @@ -114,6 +110,13 @@ export type UseFormSetFieldError = < error: FieldError> | string | string[], ) => void; +export type UseFormSetFieldTouched = < + Name extends Path, +>( + name: Name, + touched: boolean, +) => void; + export interface FormResetState { values: Values; touched: FormTouched; @@ -138,6 +141,7 @@ export interface UseFormReturn { setFieldValue: UseFormSetFieldValue; setErrors: (errors: FormErrors) => void; setFieldError: UseFormSetFieldError; + setFieldTouched: UseFormSetFieldTouched; handleSubmit: (event?: Event) => void; handleReset: (event?: Event) => void; resetForm: ResetForm;